107 lines
11 KiB
Markdown
107 lines
11 KiB
Markdown
## Context
|
||
|
||
Основа — `main` после sdlc-rename (#97) и web-modules (#98), `5a21825`. Схема базы — v7 (`core/db.py`,
|
||
`SCHEMA_VERSION = 7`). Issue #104, ветка `feat/104-fact-status-removal`.
|
||
|
||
Где живёт статус по факту (разведка 24.10.2026):
|
||
- база: `issue_note.fact_status` (`modules/jira/schema.py`); `mirror.NOTE_FIELDS`, фильтр `fact_status` в
|
||
`mirror.list_issues`, колонка в выборках `list_issues` и `board_snapshot` (`modules/jira/mirror.py`);
|
||
- API: `ISSUE_FILTERS` (`modules/jira/api.py`); `PUT /issues/{key}/note` принимает поле через `NOTE_FIELDS`;
|
||
- MCP: `issues` (параметр и колонка таблицы), `notes_set` (параметр), `issue` (строка заметок) — `modules/jira/mcp.py`;
|
||
- настройки: `status_labels`, `transitions_map` в `DEFAULTS` и `AGENT_KEYS` (`modules/jira/settings.py`), перенос из
|
||
конфига в `init --config` (там же);
|
||
- импорт: колонка «Статус по факту» в `tasks.csv`/`new_tasks.csv` (`modules/jira/importer.py`);
|
||
- веб: типов с `fact_status` уже нет (#57); остались фикстуры (`board/__fixtures__/hub-basic.board.json`,
|
||
`settings.json`), тест-страж терминов (`boundary.test.ts`), тест «параметр из адреса не уходит в запрос»
|
||
(`IssuesPage.test.tsx`) и сидер тестового хаба `web/scripts/seed-hub.py` — он пишет `fact_status` в заметки
|
||
через `PUT /issues/{key}/note` и после change получит 422;
|
||
- тесты хаба и эталоны: `tests/fixtures/baseline/{mcp_tools,settings,schema}.expected.json`, `test_db`, `test_mirror`,
|
||
`test_api`, `test_mcp`, `test_importer`, `test_settings`, `test_e2e_hub`, `test_cli`, `test_queue`, `test_agents`;
|
||
`tests/fixtures/{settings_v6,schema_v6,config.example}.json` — входы миграционных тестов, исторические.
|
||
|
||
jira-agent (`../jira-agent/src/agent.py`) ни `status_labels`, ни `transitions_map` не читает: `ensure_status` получает
|
||
путь статусов в параметре `target`. Потребители MCP в `~/projects` поле не упоминают.
|
||
|
||
## Goals / Non-Goals
|
||
|
||
**Goals:** в хабе нет ни поля, ни настроек, ни параметров статуса по факту; живая база v7 мигрирует при старте без
|
||
ручных шагов; прочие заметки целы.
|
||
|
||
**Non-Goals и Anti-Goals:** см. proposal.md.
|
||
|
||
## Decisions
|
||
|
||
1. **Колонка удаляется, а не обнуляется** (решение владельца 24.10.2026: «удаляй безвозвратно»). Шаг миграции v7 → v8
|
||
— `ALTER TABLE issue_note DROP COLUMN fact_status`, только если колонка есть (новая база v8 собирается схемой без
|
||
неё). Сам шаг живёт в модуле jira (функция в `modules/jira/`, ядро вызывает её ленивым импортом из `MIGRATIONS[7]`,
|
||
как `_project_fields_v7` вызывает `projects.migrate_v6`): термины jira в ядро не попадают (`test_core_has_no_jira_terms`).
|
||
SQLite хаба — 3.50 (Python 3.13 от uv), `DROP COLUMN` поддерживается с 3.35. Копию базы делает общий механизм
|
||
миграции (`backups/<дата>-schema-v7.sqlite`), отдельной выгрузки нет.
|
||
2. **Ключи `status_labels` и `transitions_map` удаляются из `setting` той же миграцией** и уходят из `DEFAULTS` и
|
||
`AGENT_KEYS`, иначе `ensure_defaults` создаст их снова. Если удалён хотя бы один ключ — `settings_version` + 1:
|
||
набор ключей агента изменился, агент перечитает настройки (на работу агента это не влияет). Строки
|
||
`settings_version` может не быть (база без `ensure_defaults`) — тогда версия не поднимается и не создаётся.
|
||
3. **`PUT /issues/{key}/note` с `fact_status` — 422** «неизвестные поля заметки: fact_status» — общее правило
|
||
`mirror.set_note` для полей вне `NOTE_FIELDS`, отдельного кода нет.
|
||
4. **`GET /issues?fact_status=…` — параметр игнорируется**, как любой неизвестный: `h_issues` читает только
|
||
`ISSUE_FILTERS`. Веб его уже не шлёт, а старые закладки с параметром не ломаются.
|
||
5. **`init --config` не переносит `status_labels` и `transitions`**, даже если они есть в конфиге.
|
||
6. **Импорт пропускает колонку «Статус по факту»**; остальные колонки — как раньше.
|
||
7. **Веб: только тесты, фикстуры и сидер.** `seed-hub.py` перестаёт писать `fact_status` в заметки. Из
|
||
`hub-basic.board.json` и `settings.json` поле и ключ убираются; golden-эталоны доски (`*.expected.json`) MUST NOT
|
||
измениться — доска поле не читает. `fact_status` в `MODULE_TERMS` теста-стража остаётся: ядро веба по-прежнему не
|
||
должно его содержать. Тест `IssuesPage.test.tsx` про параметр из адреса остаётся (поведение то же).
|
||
8. **Исторические фикстуры (`*_v6.json`, `config.example.json`) не правятся**: это входы миграций и `init`, на них
|
||
проверяется, что поле и ключи пропадают.
|
||
9. **Спека `data-model`: «текущая — 8»**, сценарии миграций v1–v5 вместо числа говорят «текущая» — число «6» в них
|
||
отстало от кода ещё в wiki-module (v7) и ломалось бы при каждой новой версии.
|
||
|
||
10. **Документация и тексты в коде правятся вместе с кодом:** README (описание `import`, строки `GET /issues` и
|
||
`GET /board`), docstring `mirror.board_snapshot`, `mcp.issues`, `mcp.notes_set`, обе строки чтения CSV в
|
||
`importer.py`. Исторические планы `docs/superpowers/plans/*.md` и архив `openspec/changes/archive/` не правятся;
|
||
итоговая проверка — `grep -rn "fact_status\|status_labels\|transitions_map\|по факту" src web/src web/scripts README.md
|
||
ARCHITECTURE.md openspec/specs` даёт только намеренные остатки (страж `MODULE_TERMS`, тест параметра из адреса,
|
||
текст спек «статуса по факту нет»).
|
||
|
||
## Справка: пути переходов из `transitions_map`
|
||
|
||
Значение настройки на живом хабе 24.10.2026 — пути по workflow AURORA (статус Jira, в который переводили задачу,
|
||
по виду работы; `default` — для видов, которых нет в строке; «—» — пути нет). Ключи — статусы по факту, сами пути пригодятся для спринтов/бэклога.
|
||
|
||
| Статус по факту | default | аналитика / решение / актуализация | организационная |
|
||
|---|---|---|---|
|
||
| Готово — закрыть | Разработка → Готово к тестированию | Разработка → Готово | Разработка → Готово |
|
||
| В работе | Разработка | Ожидает анализа → Анализ | Разработка (default) |
|
||
| Ожидает решения владельца/заказчика | Ожидает анализа | Ожидает анализа | Ожидает анализа |
|
||
| К актуализации аналитики | Ожидает анализа | Ожидает анализа | Ожидает анализа |
|
||
| Ожидание разработки | — | Ожидает анализа | — |
|
||
| Частично — переформулировать | — | Ожидает анализа | — |
|
||
| Снято | Снято | Снято | Снято |
|
||
|
||
`status_labels` сопоставлял статусам по факту служебные метки `fact-*` (`fact-done`, `fact-partial`,
|
||
`fact-in-progress`, `fact-decision`, `fact-docs`, `fact-open`, `fact-roadmap`, `fact-cancelled`).
|
||
|
||
## Risks / Trade-offs
|
||
|
||
- **Значения статуса по факту теряются** — решение владельца; восстановить можно только из `backups/`.
|
||
- **Старый процесс хаба на базе v8.** Если хаб старой версии откроет базу после миграции, его `ensure_defaults` снова
|
||
создаст `status_labels`/`transitions_map` с пустыми значениями, а запись заметки упадёт на отсутствующей колонке.
|
||
Окно — только между `git pull` и `kickstart`; MCP-процессы старой версии ходят через HTTP и базу не открывают.
|
||
Принимается.
|
||
- **Сессии MCP со старым кодом** до `/mcp` → reconnect показывают параметр `fact_status`; вызов с ним вернёт пустой
|
||
фильтр (хаб параметр игнорирует), `notes_set` с ним — 422.
|
||
|
||
## Decisions made without discussion
|
||
|
||
- 24.10.2026 — R-1 (design #2): `transitions_map` и `status_labels` удаляются вместе с полем; пути переходов сохранены
|
||
в разделе «Справка» этого документа. Обоснование: ключи карты — статусы по факту, читателей нет. Цена ошибки —
|
||
вернуть настройку из справки одной правкой `PUT /settings`.
|
||
- 24.10.2026 — R-2: jira-agent не меняется, design-only change в агенте не заводится (агент ключи не читает). Цена
|
||
ошибки — отдельный PR в агенте.
|
||
- 24.10.2026 — R-3 (design #2): `settings_version` поднимается, если миграция удалила ключ. Цена ошибки — один лишний
|
||
перечит настроек агентом.
|
||
- 24.10.2026 — R-4 (design #3, #4): запись поля в заметку — 422, фильтр в `GET /issues` — игнорируется. Обоснование:
|
||
общие правила хаба для неизвестных полей тела и параметров. Цена ошибки — правка одного обработчика.
|
||
- 24.10.2026 — R-5: M-3, M-4, M-5 из #60 в change не входят и остаются в #60. Цена ошибки — отдельная мелкая задача.
|
||
- 24.10.2026 — R-6 (design #9): в `data-model` исправлено отставание номера версии схемы. Цена ошибки — нет.
|