Пакет D хаба: публикация агента, статус, настройки, тесты без утечек (#32) #36
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/32-hub-hygiene"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Пакет D хаба: follow-ups #25, #16, #4 одним PR. Change
openspec/changes/hub-hygiene-d/.Closes #32
Что сделано
_write_atomicделаетfsyncи удаляет.tmpпри сбое. Перед записью прежнийagent.pyпереименовывается вagent.py.prev; если запись не удалась, он возвращается на место, аcliвыводит «не удалось записать публикацию: …» с кодом 1 без трейсбека. Манифест проверяется строго:version— целое, не bool, ≥ 1;sha256— 64 hex-символа. Предупреждение о битом манифесте выводится один раз на каждый новый текст ошибки.agent.pyне в UTF-8 → 404no_release.agent_reportedвGET /agent. До первогоclaimпосле перезапуска хаба MCP пишет «запускатель: неизвестно (агент ещё не выходил на связь после перезапуска хаба)», а подсказки «без run.py» нет.PUT /settings(#16 O-11) отвечает всеми настройками, какGET /settings.ensure_fieldsсравниваются без различия\r\nи\n.resolve()._type_error(#16 T3.1) переписан отдельными ветками по типу значения.[]в параметрах, журнал при пределе выдач, 501 на DELETE/PATCH, эпик без ключа, «подготовлена заново», предупреждение «обновите агента» и офлайн-агент, эффектtick.filterwarningsстоятerror::ResourceWarningиerror::pytest.PytestUnraisableExceptionWarning.Проверки
uv run pytest: 318 passed, 0 warnings (после слияния main с #29; до слияния — 309).openspec validate hub-hygiene-d --strict: valid.Rulings I made
filterwarningsдва фильтра. Утечка соединения рождается в__del__, поэтому одногоResourceWarningpytest не ловит.open_dbв conftest). Autouse-подменуdb.connectне использовали: она спрятала ��ы будущие утечки вsrc/.agent.pyудаляется иrelease/остаётся без публикации.agent.py.prevудаляется после любой успешной публикации.secure_dirвызывается внутриtry.release.hint(..., reported=True)есть значение по умолчанию._warnedзащищенаthreading.Lock.CLAUDE.mdне меняли, чтобы не конфликтовать с #29. После слияния #29 этот абзац общий, при архивации переписывать его не нужно.pyproject.tomlразрешён, оставлены обе секции:filterwarningsи[tool.uv].agent.pyудаляется только при первой публикации, прежний не теряется.Находки
close()в теле теста, а не в фикстуре7d3f6487d3f648agent.pyпри сбое до переименования в.prev5793438GET /agent/releaseво время публикацииagent.pyнет,.prevесть) неудачная следующая публикация не возвращает.prev7d3f648fsyncкаталога послеos.replacebc377edreported/launcher_versionвnote_agent_update7d3f648agent_statusпрямым UPDATEsummary7d3f648_norm_textчерезvalue or Noneсхлопывает falsy-значения(x or None); для строковых полей безвредноnew:*напрямуюissue_notepyproject.tomlс main после #290cf71e7(R-14).prevнаloadbc377edbc377edbc377ed.prevне удался, следующая сбойная публикация перезапишет.prevновым содержимымmake check— pytest и lint фронта; фронт не менялся)Deferred (уйдут в follow-up при закрытии)
GET /agent/releaseво время публикации. Агент повторит запрос через 5 минут; на main окно то же.publishесть.prev, аagent.pyнет, стоит восстанавливать.prev.fsyncкаталога послеos.replace..prev.🤖 Generated with Claude Code