# migration Specification ## Purpose Переход с CSV-пакета `admin/jira-sync` на мост: начальные настройки хаба из `config.example.json`, разовый импорт служебных заметок и сверочного набора связей из CSV, и что остаётся в `admin/` как история. ## Requirements ### Requirement: Инициализация настроек `sdlc-hub init --config ` SHALL перенести в `setting`: `project_key`, типы задач, `epic_name_field_id`, `fields`, `epic_link`, `priority_map`, `labels`, `kind_labels`, `comment_marker`, `pacing` (в новую форму по типам команд), `link_types`; сгенерировать два токена; завести проект `AWPCA` «АРМ КА» с `board_id` из `sprints.board_id` конфига (если проекта `AWPCA` ещё нет). Поля `auth`, `base_url`, `verify_ssl`, `ca_bundle` MUST NOT переноситься (они у агента); `status_labels` и `transitions` MUST NOT переноситься (статуса по факту в хабе нет). #### Scenario: Повторный init - **WHEN** `init` вызван на уже инициализированной базе - **THEN** настройки не перезаписываются без `--force`, токены сохраняются; проект `AWPCA` не дублируется #### Scenario: Первый init - **WHEN** `init --config` на пустой базе, в конфиге `sprints.board_id = 4216` - **THEN** есть проект `AWPCA` «АРМ КА» с `board_id = 4216`; в `setting` нет `base_jql`, `board_id`, `status_labels` и `transitions_map` ### Requirement: Импорт CSV-пакета `sdlc-hub import <папка admin/jira-sync>` SHALL прочитать `tasks.csv`, `new_tasks.csv`, `epics.csv` и заполнить `issue_note` по ключу Jira: вид работы, что сделано, что осталось, внутренние колонки; колонку «Статус по факту» импорт SHALL пропускать. Строки `new_tasks.csv` без ключа SHALL получать временный ключ `new:<номер строки>`; строки `tasks.csv` и `epics.csv` без ключа SHALL пропускаться. `links.csv` SHALL импортироваться как сверочный набор в отчёт импорта (ожидаемые связи против зеркала после первого `refresh`), не как команды. Связь, которой в зеркале нет как `source→target` того же типа, но есть как `target→source` того же типа, SHALL попадать в `reversed_links`, а не в `missing_links`. Импорт идемпотентен: повтор обновляет заметки, не дублирует. #### Scenario: Импорт и первая синхронизация - **WHEN** выполнены `init`, `import`, запущены хаб и агент, `refresh full` завершён - **THEN** число задач зеркала ≥ числа строк `tasks.csv` + созданных из `new_tasks.csv`; отчёт импорта перечисляет ключи из CSV, которых нет в зеркале, связи из `links.csv`, которых нет в `issue_link`, и связи, которые есть в обратную сторону #### Scenario: Связь в обратную сторону - **WHEN** в `links.csv` строка «AURORA-1445 → AURORA-1446, связанные», а в зеркале есть только «ASUPR_Связанные» 1446→1445 - **THEN** связь в `reversed_links`, в `missing_links` её нет #### Scenario: Эпик без ключа - **WHEN** в `epics.csv` строка без значения в колонке «Ключ» - **THEN** строка пропущена, заметка `new:*` для неё не создаётся ### Requirement: Что остаётся в admin/ После ввода моста `admin/jira-sync/README.md` SHALL получить в начале пометку «заменено мостом jira-hub/jira-agent, CSV заморожены <дата>»; `jira_sync.py`, CSV, `runs/`, `summary.md`, `_generator/` остаются как история без изменений. Артефакт просмотрщика на claude.ai MUST NOT переопубликовываться. #### Scenario: Пометка в README - **WHEN** мост запущен и первая синхронизация сверена с CSV - **THEN** README пакета начинается с пометки и ссылки на репозитории моста