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. Решение — разрешить АРХИВИРОВАТЬ (и исправлять заголовок), ничего не удаляя
из журнала.
Были взвешены три способа представить "архивирована":
- Новое значение в
story_status. Отвергнуто:status = 'ready'— это ворота доступности для claim (claimNext), а машина состояний (story-state-machine.ts) — о ходе истории. Архивирование происходит лишь изdraft, не имеет возврата в этой поставке и не является шагом хода — его помещение в enum заставило бы каждый переход знать о нём. - Удалить строку. Отвергнуто решением владельца и соглашением продукта: сделанное остаётся, а задачи и события, ссылающиеся на историю, продолжали бы указывать на исчезнувшее.
- Колонка
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), — никакой новой роли.