Перейти к основному содержимому

ADR 0212 — Архивированная история: колонка, а не состояние машины

Статус​

Accepted. 2026-10-03 (AT-406; решение владельца от 03.10: "PO e usuário" — PO и вкладка Backlog редактируют и архивируют историю draft без задачи в выполнении). Правило в RN-727.

Контекст​

В TP-01 от 03.10 PO создал две дублирующиеся истории и не мог их удалить: его инструментами были create_epic, create_story, create_task и complete_story, а вкладка Backlog была только для чтения. Дубликаты получили задачи, вошли в план Dev Lead и запутали Arquiteto. Решение — разрешить АРХИВИРОВАТЬ (и исправлять заголовок), ничего не удаляя из журнала.

Были взвешены три способа представить "архивирована":

  1. Новое значение в story_status. Отвергнуто: status = 'ready' — это ворота доступности для claim (claimNext), а машина состояний (story-state-machine.ts) — о ходе истории. Архивирование происходит лишь из draft, не имеет возврата в этой поставке и не является шагом хода — его помещение в enum заставило бы каждый переход знать о нём.
  2. Удалить строку. Отвергнуто решением владельца и соглашением продукта: сделанное остаётся, а задачи и события, ссылающиеся на историю, продолжали бы указывать на исчезнувшее.
  3. Колонка archived_at (и archived_reason) в stories. Выбрано.

Решение​

  • stories получает archived_at timestamptz NULL и archived_reason text NULL (миграция 0069) в файле агрегата backlog (ADR 0121). NULL — это история в игре.
  • Каждое РЕШАЮЩЕЕ чтение фильтрует archived_at IS NULL: backlog и покрытие (findByProject), очередь продвижения (listProposedReady), план Dev Lead (findInProjectByIds) и claim и подсчёт доступных (claimNext, countClaimableByModule). ЗАДАЧИ выходят из игры через историю — никакой новой колонки в tasks. findById по-прежнему находит архивированную, для названного отказа и аудита.
  • Архивирование выключает proposed_ready той же записью (история никогда не остаётся "aguardando você" после архивирования).
  • Факт идёт в журнал НОВЫМИ и неизменяемыми событиями: backlog.story_archived (storyId, title, reason, taskIds) и backlog.story_updated (storyId, previousTitle, title, descriptionChanged). Префикс backlog. следует уже существующим событиям агрегата (backlog.story_created, backlog.story_promotion_returned).
  • Одно мерило (recusaDeCorrecaoDeHistoria) для двух дверей — инструмента PO и маршрута пользователя — с названным 409.

Последствия​

  • Разархивирования в этой поставке нет: колонка это позволяет, но это отдельное продуктовое решение, здесь не принятое.
  • Архивированная история исчезает из listar_backlog (PO её не видит, чтобы не завершить её снова); тот, кому нужно о ней знать, читает событие в журнале сессии.
  • Минимальная роль пользователя — developer, та же, что для продвижения и возврата (RN-048), — никакой новой роли.