Andrey Epifancev c1b8abada9 Архив OpenSpec: fact-status-removal (#104)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 17:31:28 +04:00

4.8 KiB
Raw Blame History

migration Specification

Purpose

Переход с CSV-пакета admin/jira-sync на мост: начальные настройки хаба из config.example.json, разовый импорт служебных заметок и сверочного набора связей из CSV, и что остаётся в admin/ как история.

Requirements

Requirement: Инициализация настроек

sdlc-hub init --config <admin/jira-sync/config.example.json> 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 пакета начинается с пометки и ссылки на репозитории моста