Andrey Epifancev 0bb43431b8 docs(openspec): hub-hygiene-d — публикация, статус агента, CRLF, тесты (#32)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 01:33:07 +04:00

58 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Why
У хаба накопились отложенные находки трёх change'ей: самообновления (#25), пакета C (#16) и первого change'а (#4,
«на потом»). Разбор против `main` 8229bba (15.10.2026) показал, что актуальны все пункты, кроме M-4 #25, который исправило
слияние web-app. Вред у одного пользователя небольшой, но заметный:
- при полном диске `jira-hub agent publish` падает с трейсбеком и оставляет публикацию в состоянии «404 до следующей
публикации»;
- после перезапуска хаба `agent_status` пишет «без запускателя», хотя агент под `run.py`;
- потерянный отчёт `ensure_fields` по задаче, у которой описание с `\r\n` (71 из 180 правлены в UI), закрывается
довыдачей вместо подтверждения по состоянию;
- в тестах 87 незакрытых соединений sqlite и пробелы в покрытии.
Решения владельца 15.10.2026: всё актуальное — одним пакетом; M-4 #25 закрыть, minor-2 #16 отклонить; агентский
#26 в пакет не входит; работать параллельно с #29 (web-app follow-ups), она трогает только `h_app`.
## What Changes
- **Публикация агента** (`release.py`, `cli.py`): запись с `fsync`; прежний `agent.py` переименовывается в
`agent.py.prev`, при сбое записи манифеста возвращается; `OSError` → «не удалось записать публикацию: <ошибка>»,
код 1, временные файлы удалены; манифест годен, только если `version` — целое (не bool) и `sha256` — 64 hex-символа;
не-UTF-8 файл при совпавшем sha — 404, а не 500; предупреждение о битом манифесте — один раз на каждую новую ошибку.
- **`GET /agent`**: поле `agent_reported` (был ли `claim` с момента запуска хаба); пока его нет — подсказки про `run.py`
нет; MCP `agent_status` пишет «запускатель: неизвестно (агент ещё не выходил на связь после перезапуска хаба)».
- **`PUT /settings`**: ответ — все настройки, как `GET /settings` (включая `settings_version`).
- **Очередь**: зависимая команда, пропущенная из-за force-отменённой `ensure_issue`, получает
«создание задачи new:N отменено».
- **Подтверждение по состоянию**: строки `ensure_fields` сравниваются без различия `\r\n` и `\n`.
- **Реле**: обработанные папки сравниваются по `resolve()`.
- **Тесты**: bool в строковом параметре и пустой список; `finished_at` у `sync_run` только для `refresh`; 501 на прочие
методы; `epics.csv` без ключа; «подготовлена заново» в реле; предупреждение `min_agent_version`; офлайн-агент; `tick` с
проверками; ноль `ResourceWarning`; читаемый `commands._type_error`.
## Capabilities
### New Capabilities
<!-- нет -->
### Modified Capabilities
- `hub-api`: ответ `PUT /settings`; публикация версии агента (сбой записи, проверка манифеста, `agent_reported`).
- `mcp`: строка запускателя в `agent_status`.
- `commands`: текст `skipped` при отменённом создании; подтверждение `ensure_fields` без различия перевода строки.
## Non-Goals
- сохранение `launcher_version` в БД (запись на каждый claim; «неизвестно» честнее устаревшего значения);
- агент (aep/jira-agent#26) — в следующий change агента;
- minor-2 #16 (дубль предупреждения при неудачном `chmod`) — отклонено;
- раздача веб-приложения (`h_app`) — в #29.
## Impact
- jira-hub (issue aep/jira-hub#32): `src/jira_hub/release.py`, `cli.py`, `api.py` (`Hub`, `h_agent_get`,
`h_settings_put`), `queue.py` (`_next`), `commands.py` (`check_confirmed`, `_type_error`), `relay.py` (`_cleaned`),
`mcp_server.py` (`fmt_agent`), `tests/`, ARCHITECTURE.md при необходимости.
- Пересечение с `feat/29-web-app-followups`: `api.py` (другие функции) и одна строка `tests/test_api.py`; дельты спек
трогают разные требования (`hub-api` «Раздача веб-приложения» у #29).
- Выкатка: после merge — pull на Mac mini, перезапуск хаба (владелец), `/mcp` → reconnect в сессиях Claude.