architect(ET): auto-commit from architect run_id=466

This commit is contained in:
2026-06-09 15:31:37 +03:00
committed by orchestrator-deployer
parent 8064ae2c5d
commit 14f037a8a9
3 changed files with 337 additions and 0 deletions

View File

@@ -0,0 +1,106 @@
---
work_item: ORCH-078
stage: architecture
author_agent: architect
status: proposed
created_at: 2026-06-09
model_used: claude-opus-4-8
---
# adr-0022: Стандарт маркеров-трассировки `ORCH-NNN` + правило чтения ADR перед правкой
- **Статус:** proposed
- **Дата:** 2026-06-09
- **Источник:** ORCH-078 (эпик ORCH-52, слой 52e — трассировка, слой 4)
- **Связи:** продолжает цепочку стандартов эпика 52 — adr-0019 (52b, `PIPELINE_DOCS.md`),
adr-0020 (52c, frontmatter-контракт), adr-0021 (52d, канон промптов). Детально —
`docs/work-items/ORCH-078/06-adr/ADR-001-traceability-marker-standard.md`.
## Контекст
Эпик ORCH-52 строит сквозной контракт документации конвейера: **52b** (adr-0019) — описательный
стандарт документов + скелеты; **52c** (adr-0020) — машинный frontmatter-контракт + `HANDOFF_PROTOCOL.md`;
**52d** (adr-0021) — 6 промптов в каноне Anthropic + добровольная эмиссия 52c-схемы. Закрыты слои
структуры (52b), машинного вердикта (52c) и формы промптов (52d), но **слой трассировки кода к
решениям не формализован**.
Факты, сверенные с кодом `main`:
- В `src/` живёт **51 уникальный** маркер `ORCH-NNN` (`grep -rhoE 'ORCH-[0-9]+' src/ | sort -u | wc -l`),
привязывающий нетривиальные инварианты к породившему их work item — **сложившаяся практика без
формального стандарта** (`docs/_standards/` несёт лишь `PIPELINE_DOCS.md`/`HANDOFF_PROTOCOL.md`).
- Высокая плотность: `config.py`=63, `stage_engine.py`=55, `agents/launcher.py`=50, `plane_sync.py`=48,
`merge_gate.py`=26 вхождений.
Три незакрытые проблемы:
1. **Нет правила чтения.** Агент, правя маркированную строку, не обязан прочитать ADR, который её
ввёл → риск молча сломать инвариант. Это класс «фантомного merge»
(`docs/history/LESSONS_2026-06-08_phantom-merge.md`), породившего ORCH-071/073.
2. **Reviewer не контролирует соблюдение** — ось «Соответствие ADR» проверяет ADR текущей задачи, не
сверку правки чужого маркированного кода с его ADR.
3. **Анти-археология** — блок с 50+ маркерами = раскопки по 4+ work item.
## Решение
Ввести **нормативный стандарт маркеров-трассировки** `docs/_standards/TRACEABILITY.md` (слой 4 эпика
52) и точечно дополнить промпты правилом чтения / контролем соблюдения **со ссылкой на единый
источник**. Это **docs + prompts-only**, нулевое касание кода; стандарт — описательно-нормативный
документ + анти-регресс-тест промптов, **не машинный гейт конвейера**.
1. **`TRACEABILITY.md`** кодифицирует существующий контракт (не вводит новый синтаксис): определение
маркера, формат (inline-комментарий, рекомендуется ссылка на решение), правило размещения (рядом с
нетривиальным инвариантом), чтение истории **с реальным проверяемым примером**
(`src/serial_gate.py` → ORCH-088 → `ADR-001-serial-gate.md`), fallback-доступ, анти-археология,
каноничный текст правила чтения.
2. **Единый источник истины правила.** Каноничная формулировка живёт только в `TRACEABILITY.md`;
промпты несут короткую врезку-**ссылку**, не копию → нет дрейфа между файлами (анти-дубль 52d).
3. **Точечные врезки (аддитивно, 52d-канон не переписывается):** `developer.md` — правило чтения +
fallback-доступ («❌ X → ✅ Y»); `architect.md` — правило чтения + анти-археология; `reviewer.md`
усиление оси «Соответствие ADR» под-пунктом «правка маркированного кода сверена с его ADR; слом →
finding ≥P1».
4. **Анти-археология:** блок с **≥3** маркерами → одна сводная ссылка на сквозной ADR
(`docs/architecture/adr/`) вместо перечисления всех work item. Пример: `src/merge_gate.py`
`adr-0006/0013/0014/0016`.
5. **Fallback-доступ:** `git show origin/main:docs/work-items/ORCH-NNN/06-adr/ADR-001-<slug>.md`
когда папки нет в текущей ветке.
6. **Анти-регресс машинно:** расширение `tests/test_agent_prompts_canon.py` (tests-only) — утверждает
присутствие reading-rule/`TRACEABILITY`-маркеров; существующие проверки 52d и
`test_agent_frontmatter_no_model.py` остаются зелёными.
**Границы:** `src/**`, `STAGE_TRANSITIONS`, `QG_CHECKS`, `check_*`, `_parse_*`, `src/frontmatter.py`,
схема БД — **не трогаются**. `frontmatter_validation_strict` остаётся `False`; новый QG не вводится.
Массовый ретро-фит 51 существующего маркера **вне объёма** — стандарт действует «на будущее».
**Норматив на будущее:** новый/правимый значимый инвариант → ставь маркер своей задачи рядом; блок с
3+ маркерами → сводный сквозной ADR; правка чужого маркера → читай его `06-adr` до изменения.
## Альтернативы
- **Машинный гейт/CI-lint маркеров.** Отвергнуто: правка `src/`/CI вне scope; для self-hosting
рискованно (ложный fail валит конвейер всех проектов); премэйчур до описательного стандарта.
Enforcement — потенциальная будущая задача (как hard-fail схемы в adr-0021).
- **Массовый ретро-фит 51 маркера.** Отвергнуто: огромный диф, риск регресса смысла, вне объёма.
- **Копировать правило в каждый промпт.** Отвергнуто: дрейф между файлами, нарушение анти-дубль.
- **Только per-work-item ADR без глобального.** Отвергнуто: рвёт цепочку эпика 52 (52b/c/d имеют
глобальный ADR); нет точки входа для будущих агентов.
## Последствия
- **+** Замкнут слой 4 эпика 52: практика маркеров формализована, правило чтения защищает от слома
инвариантов; reviewer получает ось контроля.
- **+** Единый источник правила → нет дрейфа; обновление в одном файле.
- **+** Self-hosting без рестарта: промпт `cat`-ается из worktree → правило действует на следующем
worktree от `main` без рестарта 8500.
- **+** Полная обратимость: чисто текстовое изменение, нет миграций/состояния/kill-switch.
- **** Рост объёма 3 промптов (митигейшн: короткие врезки-ссылки).
- **** Стандарт нормативен, но не enforced машинно → соблюдение на дисциплине + ревью (осознанный
компромисс).
- **Откат:** `git revert` PR — стандарт удаляется, врезки исчезают, поведение кода/гейтов идентично.
## Связи
- Продолжает: adr-0019 (52b), adr-0020 (52c), adr-0021 (52d).
- Per-work-item: `docs/work-items/ORCH-078/06-adr/ADR-001-traceability-marker-standard.md`.
- Стандарты-соседи: `docs/_standards/PIPELINE_DOCS.md`, `docs/_standards/HANDOFF_PROTOCOL.md`,
будущий `docs/_standards/TRACEABILITY.md` (создаёт стадия development).
- Сверено по коду: `src/serial_gate.py:241,269` (ORCH-088), `src/merge_gate.py` (26 маркеров),
`tests/test_agent_prompts_canon.py`, `.openclaw/agents/{developer,architect,reviewer}.md`.
- Прецедент класса ошибки: `docs/history/LESSONS_2026-06-08_phantom-merge.md`.

View File

@@ -0,0 +1,190 @@
---
work_item: ORCH-078
stage: architecture
author_agent: architect
status: proposed
created_at: 2026-06-09
model_used: claude-opus-4-8
---
# ADR-001: Стандарт маркеров-трассировки `ORCH-NNN` + правило чтения ADR перед правкой
Work Item: **ORCH-078** — ORCH-52e: трассировка `ORCH-NNN` (слой 4 эпика ORCH-52)
Стадия: **architecture**
Сквозная регистрация: **`docs/architecture/adr/adr-0022-traceability-marker-standard.md`**
(решение кросс-каттинговое — вводит нормативный стандарт разработки и ось ревью для ВСЕХ
агентов/проектов; продолжает цепочку adr-0019/0020/0021 эпика 52).
## Статус
Proposed
## Контекст
Эпик **ORCH-52** строит сквозной «golden source» документации конвейера слоями: **52b** (ORCH-075,
adr-0019) — стандарт структуры документов `PIPELINE_DOCS.md` + скелеты; **52c** (ORCH-076, adr-0020) —
машинный frontmatter-контракт `src/frontmatter.py` + `HANDOFF_PROTOCOL.md`; **52d** (ORCH-077,
adr-0021) — 6 промптов в каноне Anthropic + эмиссия 52c-схемы. **52e — слой 4 (трассировка)**.
**Факты, сверенные с кодом `main` (на 2026-06-09):**
- В `src/` де-факто живёт **51 уникальный** маркер `ORCH-NNN`
(`grep -rhoE 'ORCH-[0-9]+' src/ | sort -u | wc -l` → 51), привязывающий нетривиальные строки/
инварианты к work item, который их ввёл. Это **сложившаяся практика без формального стандарта**:
`docs/_standards/` содержит только `PIPELINE_DOCS.md` и `HANDOFF_PROTOCOL.md`.
- Проверяемый одиночный пример: `src/serial_gate.py:241,269` несёт условие сериализации
`t2.id < jobs.task_id` с маркером **ORCH-088** и явной отсылкой `ADR-001 D1 / FR-2`
`docs/work-items/ORCH-088/06-adr/ADR-001-serial-gate.md` существует.
- Проверяемый пример высокой плотности: `src/merge_gate.py` несёт **26** вхождений маркеров
(ORCH-043/065/067/069/071/073/074/082) — раскопки по 8 work item; сквозные
`adr-0006/0013/0014/0016` существуют и агрегируют эволюцию.
- Плотность маркеров по файлам (сверено): `config.py`=63, `stage_engine.py`=55,
`agents/launcher.py`=50, `plane_sync.py`=48, `merge_gate.py`=26.
**Почему «как есть» не годится (боль):**
1. **Нет правила чтения.** Агент (developer/architect), правя маркированную строку, не обязан
прочитать ADR, который её ввёл, → риск молча сломать зафиксированный инвариант. Это ровно класс
«фантомного merge» (`docs/history/LESSONS_2026-06-08_phantom-merge.md`), породившего ORCH-071/073.
2. **Reviewer не контролирует соблюдение.** Reviewer-ось «Соответствие ADR» (`reviewer.md:37`)
проверяет ADR *текущей* задачи, но не сверку правки *чужого* маркированного кода с его ADR.
3. **Анти-археология.** Файлы с плотностью 50+ маркеров превращают понимание блока в раскопки.
4. **Доступ к чужому work item.** Папки `docs/work-items/ORCH-NNN/06-adr/` может не быть в текущей
ветке (срезана от `main` без неё) — нужен задокументированный fallback.
**Что УЖЕ покрыто 52d (анти-дубль, сверено `grep -nE 'ORCH-NNN|06-adr'`):** `developer.md:65`
говорит «реализуй по `06-adr/`» — но только про ADR *текущей* задачи; `architect.md:41`/`reviewer.md:37`
— аналогично. **Правила «правишь чужой маркированный код → прочти его ADR перед правкой» среди них
НЕТ.** Поэтому 52e не переписывает промпты — добавляет именно отсутствующее правило.
## Решение
### Сводка
Кодифицировать сложившуюся практику маркеров как **нормативный документ-стандарт**
`docs/_standards/TRACEABILITY.md` (слой 4 эпика 52, рядом с `PIPELINE_DOCS.md`/`HANDOFF_PROTOCOL.md`),
и **точечно** дополнить 3 промпта правилом чтения / контролем соблюдения **со ссылкой на единый
источник** (не копируя текст). Это **docs + prompts-only** изменение с нулевым касанием кода:
стандарт — описательно-нормативный документ + анти-регресс-тест промптов, **не машинный гейт
конвейера**. Никакого ретро-фита 51 существующего маркера — стандарт действует «на будущее».
### D1 — `TRACEABILITY.md` как нормативный документ, НЕ машинный гейт (FR-1, AC-1)
Стандарт фиксирует **существующий контракт**, а не вводит новый синтаксис. Обязательные смысловые
блоки (7 шт., по FR-1): (1) назначение и определение маркера `ORCH-NNN`/`ET-NNN`; (2) формат —
inline-комментарий, рекомендуется ссылка на решение (`ORCH-088, ADR-001 D1`); (3) где ставится —
рядом с **нетривиальным инвариантом** (fail-open/-closed, точное условие сериализации,
идемпотентность, обходимая дыра конвейера), не на тривиальном коде; (4) как читать историю **с
реальным проверяемым примером** (`src/serial_gate.py` → ORCH-088 → `ADR-001-serial-gate.md`);
(5) fallback-доступ (D3); (6) анти-археология (D4); (7) каноничный текст правила чтения (D2).
**Архитектурное решение:** стандарт остаётся **слоем 1 (описательным)** в терминологии 52b —
источник истины о *поведении* остаётся код (`src/stages.py`, `src/qg/checks.py`); enforcement
маркеров в CI/гейт **не вводится** (см. «Альтернативы»). Реальный пример обязан ссылаться на
существующие в `main` файл+ADR (проверяемость трассировки — иначе стандарт сам себя опровергает).
### D2 — Единый источник истины правила чтения; промпты ссылаются, не дублируют (BR-6, AC-6)
Каноничная формулировка правила живёт **только** в `TRACEABILITY.md` §7:
> «Правишь код с маркером `ORCH-NNN` → прочитай его `docs/work-items/ORCH-NNN/06-adr/` ПЕРЕД
> изменением; не сломай зафиксированный инвариант; не можешь сохранить — эскалируй / верни в анализ.»
Промпты несут **короткую врезку со ссылкой** на этот текст, а не его копию. Это структурно гасит
риск дрейфа формулировок между 4 файлами и удовлетворяет анти-дубль BR-6: 52d-канон (5 XML-секций +
52c-эмиссия) **не переписывается**, врезки **аддитивны**.
### D3 — Точные точки врезок в промпты (FR-2..FR-6)
Сверено по фактической структуре промптов; врезки минимальны и не трогают machine-verdict ключи:
| Промпт | Точка врезки | Содержание | Формат |
|--------|--------------|------------|--------|
| `developer.md` | `<constraints>` (рядом с пунктом `06-adr/` строка 65) + строка списка «что прочесть» в `<context>` | правило чтения чужого маркера + **fallback-доступ** (D5) | пункт «❌ X → ✅ Y» (AC-2) |
| `architect.md` | `<constraints>` | правило чтения + **анти-археология** (D4): блок с 3+ маркерами → сводный сквозной ADR | пункт + ссылка на стандарт |
| `reviewer.md` | усиление оси «Соответствие ADR» (`<task>` п.2, строка 37) под-пунктом | проверка: правка маркированного кода **сверена** с его `06-adr`; слом/несверка → finding | под-пункт оси, не новая ось |
Во всех трёх — **ссылка** на `docs/_standards/TRACEABILITY.md` (D2). Существующие 52d-упоминания
ADR *текущей* задачи не удаляются и не дублируются — рядом добавляется правило для *чужих* маркеров.
### D4 — Анти-археология: порог 3+ маркеров → сводный сквозной ADR (FR-6, AC-5)
Нормативная конвенция: если функция/блок несёт **≥3** маркеров `ORCH-NNN`, вместо перечисления всех
work item ставится **одна сводная ссылка на сквозной ADR** (`docs/architecture/adr/adr-NNNN-*`),
агрегирующий эволюцию. Числовой порог `3` выбран как граница, за которой inline-перечисление
перестаёт быть читаемым (один-два маркера ещё информативны, три и больше — уже раскопки). Пример из
кода: `src/merge_gate.py` (ORCH-043/065/071/073…) → сводные `adr-0006/0013/0014/0016`. Это конвенция
для **нового/правимого** блока — массовая переразметка существующих файлов вне объёма (NFR-3).
### D5 — Fallback-доступ к чужому ADR (FR-5, AC-4)
Когда папки `docs/work-items/ORCH-NNN/` нет в текущей ветке (срезана от `main` без неё) —
задокументированный штатный способ чтения из `origin/main`:
```
git show origin/main:docs/work-items/ORCH-NNN/06-adr/ADR-001-<slug>.md
git ls-tree origin/main:docs/work-items/ORCH-NNN/06-adr/ # листинг
git fetch origin # при необходимости заранее
```
Присутствует и в `TRACEABILITY.md` §5, и в `developer.md` (рядом с правилом чтения) — агент без
папки в ветке знает штатный путь к чужому ADR.
### D6 — Сквозная регистрация adr-0022 (BR-7)
Решение кросс-каттинговое: вводит нормативный стандарт разработки и ось ревью, действующие на ВСЕХ
агентов и ВСЕ проекты из общего инстанса (self-hosting). По прецеденту цепочки эпика 52
(52b→adr-0019, 52c→adr-0020, 52d→adr-0021) заводится **adr-0022** (следующий 4-значный номер).
Per-work-item ADR (этот файл) — детальное решение; глобальный — точка входа для будущих агентов.
### D7 — Нулевое касание кода и QG (NFR-1, FR раздела «Изменения схемы/QG»)
`src/**`, `STAGE_TRANSITIONS`, `QG_CHECKS`, `check_*`, `_parse_*`, `src/frontmatter.py`, схема БД —
**не трогаются**. `frontmatter_validation_strict` остаётся `False` — enforcement не вводится. Новый
QG не регистрируется. Анти-регресс — расширение `tests/test_agent_prompts_canon.py` (tests-only):
утверждение присутствия reading-rule/`TRACEABILITY`-маркеров в developer/architect/reviewer, по
образцу `_ANTI_REGRESS`. Существующие проверки 52d (5 секций, 6 полей, точный регистр verdict-ключей,
self-hosting-маркеры deployer) и `test_agent_frontmatter_no_model.py` остаются зелёными.
## Альтернативы
- **Машинный гейт маркеров** (CI-lint: «правка маркированной строки без касания соответствующего
ADR → fail», или enforcement через frontmatter) — **отвергнуто**: требует правки `src/`/CI вне
scope (NFR-1); для self-hosting рискованно (ложный fail валит конвейер всех проектов); премэйчур
при отсутствии даже описательного стандарта. Сначала норматив + анти-регресс промптов; машинный
enforcement — потенциальная будущая задача (как hard-fail схемы в adr-0021).
- **Массовый ретро-фит 51 маркера** (привести все к формату «маркер + ссылка на ADR») —
**отвергнуто**: огромный диф, риск регресса смысла, вне объёма; стандарт нормативен «на будущее»
(NFR-3).
- **Копировать текст правила в каждый промпт** (без `TRACEABILITY.md` как источника) —
**отвергнуто**: дрейф формулировок между 4 файлами, нарушение анти-дубль BR-6; теряется единая
точка обновления.
- **Не заводить сквозной ADR (только per-work-item)** — **отвергнуто**: рвёт цепочку эпика 52
(52b/c/d все имеют глобальный ADR); будущий агент не найдёт точку входа в стандарт трассировки.
## Последствия
- **+** Замыкается слой 4 эпика 52: сложившаяся практика маркеров получает формальный контракт +
правило чтения, защищающее от слома инвариантов (класс «фантомного merge»).
- **+** Reviewer получает явную ось контроля → правка чужого маркированного кода без сверки с ADR
ловится в ревью (finding ≥P1).
- **+** Единый источник правила (D2) → нет дрейфа между промптами; обновление — в одном файле.
- **+** Self-hosting без рестарта: промпт `cat`-ается из worktree при запуске → правило вступает в
силу на следующем worktree от `main` без рестарта прод-контейнера 8500 (NFR-4).
- **+** Полная обратимость: чисто текстовое изменение, нет миграций/состояния/kill-switch.
- **** Рост объёма 3 промптов (митигейшн: короткие врезки-ссылки вместо инлайна — D2).
- **** Риск регресса инструкции при точечной правке (митигейшн: расширенный
`test_agent_prompts_canon.py` — D7; см. `10-tech-risks.md` TR-2).
- **** Стандарт нормативен, но не enforced машинно → соблюдение держится на дисциплине агентов +
ревью (осознанный компромисс; машинный gate — отдельная будущая задача).
- **Откат:** `git revert` PR полностью возвращает прежнее состояние — стандарт удаляется, врезки
исчезают, поведение кода и гейтов идентично (нечего гейтить, NFR-5).
## Ссылки
- BRD: `docs/work-items/ORCH-078/01-brd.md`
- TRZ: `docs/work-items/ORCH-078/02-trz.md`
- Acceptance: `docs/work-items/ORCH-078/03-acceptance-criteria.md`
- Технические риски: `docs/work-items/ORCH-078/10-tech-risks.md`
- Сквозной ADR: `docs/architecture/adr/adr-0022-traceability-marker-standard.md`
- Цепочка эпика 52: `adr-0019` (52b), `adr-0020` (52c), `adr-0021` (52d)
- Сверено по коду: `src/serial_gate.py:241,269` (ORCH-088, `t2.id < jobs.task_id`),
`src/merge_gate.py` (26 маркеров), `tests/test_agent_prompts_canon.py` (`_ANTI_REGRESS`),
`.openclaw/agents/{developer,architect,reviewer}.md`
- Прецедент класса ошибки: `docs/history/LESSONS_2026-06-08_phantom-merge.md`

View File

@@ -0,0 +1,41 @@
---
work_item: ORCH-078
stage: architecture
author_agent: architect
status: proposed
created_at: 2026-06-09
model_used: claude-opus-4-8
---
# 10 — Технические риски: ORCH-078 — ORCH-52e: трассировка `ORCH-NNN`
Work Item: **ORCH-078** · Repo: **orchestrator** (self-hosting) · Стадия: architecture
> Информационный документ (гейтом не парсится). Перечисляет риски реализации и митигейшн.
> Класс задачи — **docs + prompts-only**, нулевое касание кода (NFR-1) → доминируют риски
> регресса промптов и дублирования 52d, а не функциональные.
## Реестр рисков
| ID | Риск | Вер. | Влия. | Митигейшн |
|----|------|------|-------|-----------|
| TR-1 | **Дублирование 52d.** Правило чтения частично смежно с 52d-упоминаниями ADR текущей задачи → соблазн скопировать текст в каждый промпт (нарушение BR-6/AC-6). | Сред. | Низ. | D2: единый источник правила в `TRACEABILITY.md`; промпты несут короткую врезку-**ссылку**, не копию. Reviewer проверяет AC-6 (нет дословного повтора, 52d-канон цел). |
| TR-2 | **Регресс промптов.** Точечная врезка случайно сдвигает/ломает 5 XML-секций, 6 полей 52c-схемы или machine-verdict ключ (`verdict:`/`result:`/`staging_status:`/`deploy_status:`/`security_status:`) → ложное падение гейта на следующей задаче. | Низ. | Выс. | NFR-2: расширенный `test_agent_prompts_canon.py` (5 секций, 6 полей, точный регистр verdict-ключей) + `test_agent_frontmatter_no_model.py` остаются зелёными; полный `pytest tests/ -q` зелёный перед merge. |
| TR-3 | **Расползание в ретро-фит.** Соблазн расставить/переразметить маркеры по 51 существующему вхождению → большой диф, риск регресса смысла, выход за scope. | Сред. | Сред. | Жёсткая граница «вне объёма» (NFR-3, ADR D4); стандарт нормативен «на будущее»; reviewer заворачивает любой `src/**`-диф (AC-7). |
| TR-4 | **Устаревший пример в стандарте.** Реальный пример (`src/serial_gate.py` → ORCH-088) ссылается на строку/ADR, которые позже переименуют/удалят → нерабочая трассировка (FAIL AC-1). | Низ. | Низ. | Пример выбран по стабильному инварианту (условие сериализации serial-gate, ORCH-088 — недавний и активный); сверено существование файла+ADR на 2026-06-09; ссылка на ADR-файл (стабилен), не на номер строки в тексте стандарта. |
| TR-5 | **Касание `src/**` по ошибке.** Реализатор тронет код/`STAGE_TRANSITIONS`/`QG_CHECKS`/схему БД вопреки NFR-1. | Низ. | Выс. | AC-7: `git diff --name-only origin/main` показывает только `docs/**`, `.openclaw/agents/*.md`, `tests/test_agent_prompts_canon.py`, `CLAUDE.md`, `CHANGELOG.md`; reviewer заворачивает любой `src/**`. |
| TR-6 | **Self-hosting раскат.** Новые промпты вступают в силу на следующем worktree от `main` без рестарта — на текущей задаче reviewer/tester уже исполнятся под новыми промптами (in-vivo). Дефектная врезка повлияла бы на конвейер всех проектов. | Низ. | Сред. | NFR-4: изменение чисто текстовое и аддитивное; обратимо `git revert` (NFR-5); анти-регресс-тест ловит структурный слом до merge; нет машинного поведения/состояния. |
| TR-7 | **Dangling-ссылка в README/CLAUDE.md.** Если ссылку на `TRACEABILITY.md` добавить раньше создания файла → битая ссылка в `main`. | Низ. | Низ. | Архитектор НЕ создаёт `TRACEABILITY.md` и НЕ правит README на стадии architecture; FR-7 (`CLAUDE.md`/`README.md`/`CHANGELOG.md`) выполняется на development в **одном** PR вместе с созданием файла. |
## Сводный вывод
Доминирующий класс — **риски документации/промптов** (TR-1, TR-2, TR-3), не функциональные:
поведение `src/` идентично (NFR-1), enduro-trails не затронут. Самый высокий по влиянию — **TR-2**
(регресс machine-verdict ключа мог бы ложно валить гейт всех проектов), но вероятность низкая и
полностью покрывается машинным анти-регресс-тестом промптов. Остаточный риск для прод-конвейера
(self-hosting) — **низкий**: изменение аддитивно, обратимо `git revert`, без миграций/состояния/
kill-switch.
**Эскалация не требуется:** `arch:major-change` не нужен (нет новой стадии/компонента/смены БД —
сквозной adr-0022 регистрирует нормативный стандарт, а не архитектурный компонент); возврат в анализ
(`back-to:analysis`) не нужен (ТЗ реализуемо без нарушения принципов архитектуры).