Удалить «статус по факту» полностью (#104) #105

Merged
aep merged 7 commits from feat/104-fact-status-removal into main 2026-10-24 16:27:15 +03:00
Owner

Closes #104. Закрывает пункт «Статус по факту — удалить совсем» из #60 (M-3, M-4, M-5 остаются в #60).

Что сделано

  • Схема v8: миграция v7 → v8 удаляет колонку issue_note.fact_status и ключи status_labels, transitions_map из setting, поднимает settings_version; копия базы — backups/*-schema-v7.sqlite.
  • Настройки: ключи ушли из умолчаний модуля jira, из ключей агента и из init --config. Модуль объявляет их устаревшими (Module.settings_obsolete), ensure_defaults удаляет их при каждом вызове — старые MCP-сессии до reconnect вернули бы их (I-1).
  • API: GET /issues и GET /board без fact_status; параметр fact_status игнорируется; PUT /issues/{key}/note с fact_status — 422 «неизвестные поля заметки».
  • MCP sdlc-jira: issues без колонки и параметра, notes_set без параметра, issue без строки.
  • Импорт пропускает колонку CSV «Статус по факту».
  • Веб: сидер тестового хаба и фикстуры; поведение страниц не меняется.
  • Спеки (openspec/changes/fact-status-removal): data-model, hub-api, mcp, migration, modules, web-app; README и ARCHITECTURE — выкатка схемы v8.
  • jira-agent не меняется: ключи не читает, ensure_status берёт путь из target.

Пути переходов из прежнего transitions_map сохранены справкой в design.md.

Проверки

  • uv run pytest -q — 1008 passed
  • cd web && npm run lint && npm test — ok, 572 passed
  • cd web && npm run e2e — 45 passed (52 skipped — снимки, только по SCREENS=1)
  • Финальное ревью ветки (opus): Ready to merge with fixes → I-1, I-2 исправлены (9aaf3ce); миграция проверена ревьюером на базе v7, собранной кодом 5a21825.

Выкатка (владелец)

  1. После merge: git pull в sdlc-hub → сразу launchctl kickstart -k gui/$(id -u)/ru.aepif.sdlc-hub (миграция v8 при старте). До kickstart не запускать MCP/CLI — они смигрируют базу, и старый хаб отдаст 500.
  2. make web (фикстуры; сборка не обязательна сразу).
  3. /mcp → reconnect в сессиях с sdlc-jira (awp-ca и др.).

Rulings I made

  • R-1 (design #2): transitions_map и status_labels удаляются вместе с полем; пути — справкой в design.md. Цена ошибки — вернуть настройку из справки.
  • R-2: jira-agent не меняется. Цена ошибки — отдельный PR в агенте.
  • R-3 (design #2): settings_version + 1, только если миграция удалила ключ. Цена ошибки — один лишний перечит настроек агентом.
  • R-4 (design #3, #4): запись поля в заметку — 422, фильтр GET /issues — игнорируется. Цена ошибки — правка обработчика.
  • R-5: M-3, M-4, M-5 из #60 — не здесь, остаются в #60. Цена ошибки — отдельная задача.
  • R-6 (design #9): исправлено отставание номера схемы в data-model. Цена ошибки — нет.
  • R-7 (design #11): устаревшие ключи удаляет каждый ensure_defaults, без подъёма settings_version. Цена ошибки — убрать поле контракта модуля.
  • R-8: Task 1 — проверки «нет fact_status» временно ослаблены, в Task 2 возвращены. Цена ошибки — нет.
  • R-9: тест v6-агента вычитает удалённые ключи из исторической фикстуры. Цена ошибки — строка теста.
  • R-10: migrate_v7 в modules/jira/settings.py, ядро вызывает лениво. Цена ошибки — перенос функции.
  • R-11: M-1 и M-4 исправлены вместе с I-2 (те же документы). Цена ошибки — нет.

Находки

Маркер Суть Статус
I-1 старые MCP-сессии возвращают удалённые ключи после миграции fixed 9aaf3ce
I-2 окно выкатки v8 не описано, Risks неверны fixed 9aaf3ce
M-1 ARCHITECTURE: «v7» в строке db fixed 9aaf3ce
M-2 migrate_v7 поднимает settings_version своей SQL-арифметикой, а не через core.settings deferred
M-3 _v7_database: колонка в конце таблицы, нет заметки с NULL и временного ключа new:* deferred
M-4 неточности proposal/design fixed 9aaf3ce
R-5 M-3/M-4/M-5 из #60 deferred (остаются в #60)
O-1 флейк test_cli::test_mcp_module_required под нагрузкой (один раз, в частичном прогоне) deferred

🤖 Generated with Claude Code

Closes #104. Закрывает пункт «Статус по факту — удалить совсем» из #60 (M-3, M-4, M-5 остаются в #60). ## Что сделано - **Схема v8:** миграция v7 → v8 удаляет колонку `issue_note.fact_status` и ключи `status_labels`, `transitions_map` из `setting`, поднимает `settings_version`; копия базы — `backups/*-schema-v7.sqlite`. - **Настройки:** ключи ушли из умолчаний модуля jira, из ключей агента и из `init --config`. Модуль объявляет их устаревшими (`Module.settings_obsolete`), `ensure_defaults` удаляет их при каждом вызове — старые MCP-сессии до reconnect вернули бы их (I-1). - **API:** `GET /issues` и `GET /board` без `fact_status`; параметр `fact_status` игнорируется; `PUT /issues/{key}/note` с `fact_status` — 422 «неизвестные поля заметки». - **MCP `sdlc-jira`:** `issues` без колонки и параметра, `notes_set` без параметра, `issue` без строки. - **Импорт** пропускает колонку CSV «Статус по факту». - **Веб:** сидер тестового хаба и фикстуры; поведение страниц не меняется. - **Спеки** (`openspec/changes/fact-status-removal`): data-model, hub-api, mcp, migration, modules, web-app; README и ARCHITECTURE — выкатка схемы v8. - jira-agent не меняется: ключи не читает, `ensure_status` берёт путь из `target`. Пути переходов из прежнего `transitions_map` сохранены справкой в design.md. ## Проверки - `uv run pytest -q` — 1008 passed - `cd web && npm run lint && npm test` — ok, 572 passed - `cd web && npm run e2e` — 45 passed (52 skipped — снимки, только по `SCREENS=1`) - Финальное ревью ветки (opus): Ready to merge with fixes → I-1, I-2 исправлены (9aaf3ce); миграция проверена ревьюером на базе v7, собранной кодом 5a21825. ## Выкатка (владелец) 1. После merge: `git pull` в `sdlc-hub` → **сразу** `launchctl kickstart -k gui/$(id -u)/ru.aepif.sdlc-hub` (миграция v8 при старте). До kickstart не запускать MCP/CLI — они смигрируют базу, и старый хаб отдаст 500. 2. `make web` (фикстуры; сборка не обязательна сразу). 3. `/mcp` → reconnect в сессиях с `sdlc-jira` (awp-ca и др.). ## Rulings I made - R-1 (design #2): `transitions_map` и `status_labels` удаляются вместе с полем; пути — справкой в design.md. Цена ошибки — вернуть настройку из справки. - R-2: jira-agent не меняется. Цена ошибки — отдельный PR в агенте. - R-3 (design #2): `settings_version` + 1, только если миграция удалила ключ. Цена ошибки — один лишний перечит настроек агентом. - R-4 (design #3, #4): запись поля в заметку — 422, фильтр `GET /issues` — игнорируется. Цена ошибки — правка обработчика. - R-5: M-3, M-4, M-5 из #60 — не здесь, остаются в #60. Цена ошибки — отдельная задача. - R-6 (design #9): исправлено отставание номера схемы в data-model. Цена ошибки — нет. - R-7 (design #11): устаревшие ключи удаляет каждый `ensure_defaults`, без подъёма `settings_version`. Цена ошибки — убрать поле контракта модуля. - R-8: Task 1 — проверки «нет fact_status» временно ослаблены, в Task 2 возвращены. Цена ошибки — нет. - R-9: тест v6-агента вычитает удалённые ключи из исторической фикстуры. Цена ошибки — строка теста. - R-10: `migrate_v7` в `modules/jira/settings.py`, ядро вызывает лениво. Цена ошибки — перенос функции. - R-11: M-1 и M-4 исправлены вместе с I-2 (те же документы). Цена ошибки — нет. ## Находки | Маркер | Суть | Статус | |---|---|---| | I-1 | старые MCP-сессии возвращают удалённые ключи после миграции | fixed 9aaf3ce | | I-2 | окно выкатки v8 не описано, Risks неверны | fixed 9aaf3ce | | M-1 | ARCHITECTURE: «v7» в строке db | fixed 9aaf3ce | | M-2 | `migrate_v7` поднимает `settings_version` своей SQL-арифметикой, а не через `core.settings` | deferred | | M-3 | `_v7_database`: колонка в конце таблицы, нет заметки с NULL и временного ключа `new:*` | deferred | | M-4 | неточности proposal/design | fixed 9aaf3ce | | R-5 | M-3/M-4/M-5 из #60 | deferred (остаются в #60) | | O-1 | флейк `test_cli::test_mcp_module_required` под нагрузкой (один раз, в частичном прогоне) | deferred | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 7 commits 2026-10-24 16:23:37 +03:00
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>
I-1, I-2 финального ревью: старые MCP-сессии возвращали status_labels/transitions_map
после миграции; окно до kickstart описано для v8.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 31434aa8cd into main 2026-10-24 16:27: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#105
No description provided.