Пакет C: гигиена хаба моста (bridge-hygiene, #13) #14

Merged
aep merged 13 commits from feat/13-bridge-hygiene into main 2026-10-14 12:22:15 +03:00
Owner

Пакет C моста: мелкие исправления и гигиена хаба, change bridge-hygiene (спека и дизайн — openspec/changes/bridge-hygiene/). Closes #13. Закрывает пункты hub#8, hub#12 и часть hub#4 (по разбору пакета D 14.10.2026). Агентская часть — aep/jira-agent PR (feat/15-bridge-hygiene).

Что изменено

  • Каталог данных и backups/ — права 0700 (M-7 hub#4); копия базы перед миграцией и миграция — под одной блокировкой записи, копия одна (M-2 hub#12).
  • rename_note сливает заметки вместо удаления заметки под настоящим ключом (M-3 hub#4).
  • Проверка типов параметров команд: 422 вместо 500 (M-3 hub#12).
  • Очередь: error обрезается до 1500; поздний done с ключом по ensure_issue, ставшей failed по пределу выдач, сохраняет ключ и переносит заметку (M-4 hub#12); отменённый пакет показывается cancelled (T5.6); пустой полный прогон не помечает соседей (M-12); довыдача refresh обнуляет счётчики, предел выдач ставит sync_run.finished_at (M-4, M-5 hub#12).
  • Отмена пакета возвращает still_claimed, MCP подсказывает force-отмену (M-11 hub#12); описание batch_create — про базовую метку AWPCA (T3.7).
  • Реле: 502 на HTTPException, work/ чистится один раз на папку, тест serve --host (M-1, M-3, M-4 hub#8).
  • Спеки приведены к коду (разбор D: sprint_names, коды ответов, page/last_page, GET /issues, автообновление, MCP refresh, new:<строка>); Purpose во всех шести спеках (O-4 hub#8); ARCHITECTURE.md, CLAUDE.md, .wt/ в .gitignore.

Проверки

  • uv run pytest -q — 206 passed (было 169).
  • openspec validate bridge-hygiene --strict — valid; openspec validate --specs --strict — 6 passed.
  • Исполнение: SDD (sonnet-контроллер, haiku/sonnet-исполнители), финальное ревью opus, ре-ревью fix-волны sonnet.

Находки

Маркер Суть Статус
T1.1 = M-7 (финальное) connect("hub.sqlite") без каталога делал chmod 0700 на cwd fixed 8e82b31
T1.2 secure_dir не закрывает созданные родительские каталоги rejected: достаточно закрытого каталога данных (design #1)
T1.3 красная фаза TDD в Task 1 не прогонялась rejected: процесс, поведение проверено ревьюером
T2.1 не покрыта ветка «заметка под ключом свежее временной» fixed 8e82b31
T3.1 тяжёлая строка в _type_error deferred
T3.2 нет теста на bool в строковом параметре и пустой список deferred
T4.1 = M-6 (финальное) устаревший комментарий в report_result fixed 8e82b31
T4.2 при позднем done по failed finished_at/error остаются от закрытия по пределу rejected: осознанно (design #5), покрыто тестом
T5.1 нет теста «довыдача refresh + полный прогон → соседи по started_at первой выдачи» fixed 8e82b31
T5.2 тест предела не проверяет, что finished_at не ставится для не-refresh deferred
T6.1 нет API-теста still_claimed fixed 8e82b31
T7.1 = M-1 (финальное) relay._cleaned — одна папка, A→B→A чистит A повторно fixed 8e82b31
T7.2 нет тестов на смену relay_dir и исчезновение папки fixed 8e82b31
T8.1 «Цепочки» в ARCHITECTURE.md без db/backup → paths fixed 8e82b31
I-1 (финальное) backups/ не получает 0700 при каждом старте fixed 8e82b31
M-2 (финальное) validate принимает null у любого необязательного параметра, спека — «где можно очистить» fixed 72b0914 (спека приведена к коду, R-15)
M-3 (финальное) отмена завершённого пакета ставила cancelled_at fixed 8e82b31
M-4 (финальное) проверка «перезапуск реле» not in out ничего не проверяла fixed 8e82b31
M-5 (финальное) migrate работает только вне транзакции — не документировано fixed 8e82b31
M-8 (финальное) нет тестов: 501 у HTTP API, epics.csv без ключа deferred
ре-ревью minor-1 _cleaned сравнивает пути по написанию deferred
ре-ревью minor-2 двойное предупреждение secure_dir deferred
ре-ревью minor-3 нет положительной проверки «подготовлена заново» в test_vanished_tree_keeps_work deferred
O-9 check_confirmed сравнивает description без нормализации CRLF (найдено ревью агента) — потерянный отчёт по ensure_fields на тексте с \r\n закроется довыдачей, а не подтверждением deferred
O-1, O-4 исполнители haiku ставили Co-Authored-By Haiku — исправлено amend контроллером fixed 7a2f2e6, bd8c769
O-2, O-3 codegraph не вызван исполнителем Task 4 / пустой ответ по queue.py rejected: наблюдение об инструментах
O-5…O-8 Task 8 проверен просмотром диффа; тест serve --host закрепляет поведение; ruff не установлен; хуки не блокировали rejected: наблюдения

Rulings I made

  • R-1…R-11 (design #1–#21) — рулинги спеки, таблица в design.md («Decisions made without discussion»): права только на каталоги; слияние заметок — побеждает непустое поле временной; статус «отменён» при cancelled_at; довыдача refresh не сдвигает started_at; соседи только при issues_count > 0; проверка типов всех параметров; копия при миграции под BEGIN IMMEDIATE отдельным соединением-читателем; work/ чистится один раз на папку; still_claimed без MCP-инструмента отмены; расхождения спеки закрыты правкой спеки; агент v4 без подъёма min_agent_version.
  • R-14 (design #22) — строка MCP о команде у агента без типа команды; цена: тип виден только в JSON.
  • R-15 (design #8) — null допустим у любого необязательного параметра; цена: null в необязательном параметре ensure_issue равен его пропуску.
  • R-13 (агент) — ответ папки с body: null — пустое тело; уточнена спе��а agent.

Deferred

T3.1, T3.2, T5.2, M-8 (финальное), ре-ревью minor-1…3, O-9 — в follow-up issue при закрытии. «На потом» из разбора D: M-9/O-4 (ResourceWarning), M-10 (тесты) hub#4.

🤖 Generated with Claude Code

Пакет C моста: мелкие исправления и гигиена хаба, change `bridge-hygiene` (спека и дизайн — `openspec/changes/bridge-hygiene/`). Closes #13. Закрывает пункты hub#8, hub#12 и часть hub#4 (по разбору пакета D 14.10.2026). Агентская часть — aep/jira-agent PR (feat/15-bridge-hygiene). ## Что изменено - Каталог данных и `backups/` — права 0700 (M-7 hub#4); копия базы перед миграцией и миграция — под одной блокировкой записи, копия одна (M-2 hub#12). - `rename_note` сливает заметки вместо удаления заметки под настоящим ключом (M-3 hub#4). - Проверка типов параметров команд: 422 вместо 500 (M-3 hub#12). - Очередь: `error` обрезается до 1500; поздний `done` с ключом по `ensure_issue`, ставшей `failed` по пределу выдач, сохраняет ключ и переносит заметку (M-4 hub#12); отменённый пакет показывается `cancelled` (T5.6); пустой полный прогон не помечает соседей (M-12); довыдача `refresh` обнуляет счётчики, предел выдач ставит `sync_run.finished_at` (M-4, M-5 hub#12). - Отмена пакета возвращает `still_claimed`, MCP подсказывает force-отмену (M-11 hub#12); описание `batch_create` — про базовую метку `AWPCA` (T3.7). - Реле: 502 на `HTTPException`, `work/` чистится один раз на папку, тест `serve --host` (M-1, M-3, M-4 hub#8). - Спеки приведены к коду (разбор D: `sprint_names`, коды ответов, `page/last_page`, `GET /issues`, автообновление, MCP `refresh`, `new:<строка>`); Purpose во всех шести спеках (O-4 hub#8); `ARCHITECTURE.md`, `CLAUDE.md`, `.wt/` в `.gitignore`. ## Проверки - `uv run pytest -q` — 206 passed (было 169). - `openspec validate bridge-hygiene --strict` — valid; `openspec validate --specs --strict` — 6 passed. - Исполнение: SDD (sonnet-контроллер, haiku/sonnet-исполнители), финальное ревью opus, ре-ревью fix-волны sonnet. ## Находки | Маркер | Суть | Статус | |---|---|---| | T1.1 = M-7 (финальное) | `connect("hub.sqlite")` без каталога делал chmod 0700 на cwd | fixed 8e82b31 | | T1.2 | `secure_dir` не закрывает созданные родительские каталоги | rejected: достаточно закрытого каталога данных (design #1) | | T1.3 | красная фаза TDD в Task 1 не прогонялась | rejected: процесс, поведение проверено ревьюером | | T2.1 | не покрыта ветка «заметка под ключом свежее временной» | fixed 8e82b31 | | T3.1 | тяжёлая строка в `_type_error` | deferred | | T3.2 | нет теста на bool в строковом параметре и пустой список | deferred | | T4.1 = M-6 (финальное) | устаревший комментарий в `report_result` | fixed 8e82b31 | | T4.2 | при позднем `done` по `failed` `finished_at`/`error` остаются от закрытия по пределу | rejected: осознанно (design #5), покрыто тестом | | T5.1 | нет теста «довыдача refresh + полный прогон → соседи по started_at первой выдачи» | fixed 8e82b31 | | T5.2 | тест предела не проверяет, что `finished_at` не ставится для не-refresh | deferred | | T6.1 | нет API-теста `still_claimed` | fixed 8e82b31 | | T7.1 = M-1 (финальное) | `relay._cleaned` — одна папка, A→B→A чистит A повторно | fixed 8e82b31 | | T7.2 | нет тестов на смену `relay_dir` и исчезновение папки | fixed 8e82b31 | | T8.1 | «Цепочки» в ARCHITECTURE.md без `db/backup → paths` | fixed 8e82b31 | | I-1 (финальное) | `backups/` не получает 0700 при каждом старте | fixed 8e82b31 | | M-2 (финальное) | `validate` принимает `null` у любого необязательного параметра, спека — «где можно очистить» | fixed 72b0914 (спека приведена к коду, R-15) | | M-3 (финальное) | отмена завершённого пакета ставила `cancelled_at` | fixed 8e82b31 | | M-4 (финальное) | проверка «перезапуск реле» not in out ничего не проверяла | fixed 8e82b31 | | M-5 (финальное) | `migrate` работает только вне транзакции — не документировано | fixed 8e82b31 | | M-8 (финальное) | нет тестов: 501 у HTTP API, `epics.csv` без ключа | deferred | | ре-ревью minor-1 | `_cleaned` сравнивает пути по написанию | deferred | | ре-ревью minor-2 | двойное предупреждение `secure_dir` | deferred | | ре-ревью minor-3 | нет положительной проверки «подготовлена заново» в `test_vanished_tree_keeps_work` | deferred | | O-9 | `check_confirmed` сравнивает `description` без нормализации CRLF (найдено ревью агента) — потерянный отчёт по `ensure_fields` на тексте с `\r\n` закроется довыдачей, а не подтверждением | deferred | | O-1, O-4 | исполнители haiku ставили Co-Authored-By Haiku — исправлено amend контроллером | fixed 7a2f2e6, bd8c769 | | O-2, O-3 | codegraph не вызван исполнителем Task 4 / пустой ответ по `queue.py` | rejected: наблюдение об инструментах | | O-5…O-8 | Task 8 проверен просмотром диффа; тест `serve --host` закрепляет поведение; ruff не установлен; хуки не блокировали | rejected: наблюдения | ## Rulings I made - R-1…R-11 (design #1–#21) — рулинги спеки, таблица в `design.md` («Decisions made without discussion»): права только на каталоги; слияние заметок — побеждает непустое поле временной; статус «отменён» при `cancelled_at`; довыдача `refresh` не сдвигает `started_at`; соседи только при `issues_count > 0`; проверка типов всех параметров; копия при миграции под `BEGIN IMMEDIATE` отдельным соединением-читателем; `work/` чистится один раз на папку; `still_claimed` без MCP-инструмента отмены; расхождения спеки закрыты правкой спеки; агент v4 без подъёма `min_agent_version`. - R-14 (design #22) — строка MCP о команде у агента без типа команды; цена: тип виден только в JSON. - R-15 (design #8) — `null` допустим у любого необязательного параметра; цена: `null` в необязательном параметре `ensure_issue` равен его пропуску. - R-13 (агент) — ответ папки с `body: null` — пустое тело; уточнена спе��а agent. ## Deferred T3.1, T3.2, T5.2, M-8 (финальное), ре-ревью minor-1…3, O-9 — в follow-up issue при закрытии. «На потом» из разбора D: M-9/O-4 (ResourceWarning), M-10 (тесты) hub#4. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 13 commits 2026-10-14 12:15:34 +03:00
Proposal, design и дельты спек hub-api, data-model, commands, agent, mcp, migration;
Purpose во всех шести спеках (O-4 #8).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M-7 (hub#4), M-2 и M-10 (hub#12).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M-3 (hub#4, PR #2).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M-3 (hub#12).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M-4 (hub#12), T5.6 и M-12 (hub#4).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M-4, M-5, M-10 (hub#12).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
cancel_batch возвращает still_claimed — команды пакета в статусе claimed,
которые отмена не останавливает. MCP batch_cancel выводит строку на каждую
такую команду с подсказкой про POST /commands/N/cancel с force. Описание
batch_create предупреждает, что ensure_issue нужны labels с базовой меткой
AWPCA, иначе задача выпадет из базовой JQL и из зеркала.

M-11 (hub#12), T3.7 (agent#4).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M-1, M-3, M-4 (hub#8).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 01fd588a09 into main 2026-10-14 12:22:15 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/sdlc-hub#14
No description provided.