Skip to content

REVIEW — TFW-53 / Phase A: Contract in Artifacts

Date: 2026-08-13 · три прохода Author: Reviewer (Claude Code) Verdict: ✅ APPROVE Review Mode: spec RF: RF Phase A · TS: TS Phase A Stage files: review/map.md · review/verify.md · review/judge.md — сырые логи, здесь синтез


1. Map

Фаза A превращает HL-контракт в состояние артефакта: три framework-файла, ноль новых. templates/HL.md — шапка Contract, маркеры состояния на каждом заголовке, §12 Amendment Log с 10-колоночной грамматикой, гейт-блок в §3.1. templates/RES.md — разделение на Refinements и Amendment Proposals, удалена строка 32 Coordinator applies these. conventions.md — 21 нумерованное правило в #### HL Contract, переопределение ветки (a) REJECT в §5, 7 антипаттернов в §14. Итог: +167 / −16.

Два решения сверх буквы TS, оба объявлены в RF §2: 🚫 WITHDRAWN в словарь вердиктов и привязка триггера правила 6 ко времени классификации. Оба — refinements по той же грамматике, что фаза отгружает. Ничего не исполняется: workflow-файлы не тронуты, Phase B заставит их подчиняться.

2. Verify

# Что проверено Результат
1 Диффстат от baseline ffe6c6a 167 / 16, 3 файла, 0 новых framework-файлов
2–5 Гейты AC-3 / AC-11 / AC-2 (старый токен) / AC-12 0 · 0 · 0 · 28 → 35 (+7 −0)
6 AC-6 — команда восстановления, обе оболочки, перезапущена мной Git Bash 5 / /freeze/0; PowerShell 5 / 5
7 AC-8 — дельта слов conventions.md 3 952 → 5 068 (+28.2%)
8 AC-9 — git show 721ca15:… все 6 номеров строк, 10 DoD / 9 DoF
9 AC-4 — совпадение frozen/free в трёх местах идентично
10 Build: pytest / mkdocs 68 passed / exit 0
11 Evidence (RF §5 / EV) 12/12, пропусков 0
12 Цитаты знаний (HL §7.2 ×26, ONB §7 N1–N3) 29/29 резолвятся, галлюцинаций 0
13 Role Lock HL/TS/workflow не тронуты

Проверка эскалирована до 100% (6 из 6 файлов при норме 3). Каждый гейт RF перезапущен независимо; все воспроизводятся до цифры. Сырой лог — review/verify.md.

3. Judge

# Проверка Статус Основание
1 DoD выполнен 12/12 AC против артефактов, не против отчёта
2 Философия 9 связанных принципов, 9 выполнены, 0 нарушений — judge.md
3 Tech debt задокументирован RF §6 — 6 типизированных наблюдений с файлом и строкой
4 Стиль и стандарты нумерованные правила и строки таблиц; §14 только дополнен (−0)
5 Наблюдения собраны все 6 прошли фильтр качества
6 Полнота RF (§7–9) FC с источниками, инсайты с Implication, §9 — правило как дерево решений
7 Полнота evidence 7 «N/A» дословно цитируют TS — проверено пословно
8 Аналитика (spec) см. §4
9 Атрибуция источников (spec) 29/29; каждое измерение отгружено с командой

4. Verdict — ✅ APPROVE

12/12 AC выполнены против артефактов. Все гейты воспроизведены независимо. Role Lock соблюдён.

Что весит больше формального соответствия: три отгруженных пункта существуют только потому, что правило прогнали по реальности, а не рассудили. Форма восстановления без слеша — задокументированная команда возвращала ноль строк. Правило 14 про первую заморозку — собственный baseline TFW-53 оказался несоответствующим. 🚫 WITHDRAWN — в живом §12 нашлась диспозиция, которой словарь не мог дать имя. Под гейтом «прочитать» все три уехали бы сломанными.

Упражнение AC-8 честнее, чем требовал AC: предел цикличности стоит первой секцией, до счёта 5/5. Два блокирующих вопроса ONB нашли реальные противоречия внутри замороженного контракта — оба дали поправки владельца.

4.1 Проход 2 — исправления приняты

Пять находок первого прохода закрыты (f379c5e координатор, 267bd06 исполнитель), проверено по артефактам: формулировка «two fields» → «three fields» с объяснением #; RF §4 честно признаёт собственный новый mkdocs-warning; раскрыта правка ONB/README с мотивом; Decision 3 переписан и с лучшей причиной, чем дал я (§7.1 — ##-заголовок, брат §7 по разметке, не потомок); 🚫 WITHDRAWN внесён в HL §12.

Ключевое: замороженный контракт не тронутgit diff по HL.md и conventions.md пуст, правка HL это +9 / −0 внутри §12. Регрессий нет.

Новое, найденное во втором проходе:

  • R3, Medium → TD-139. git log --grep ищет по всему телу коммита. Коммит f379c5e процитировал в теле чинимый паттерн — и сам попал в выдачу: 6 вместо 5, в обеих оболочках, причём мусорный идёт первым. Тот же класс отказа, что правило 15 уже пережило: проходит по букве, деградирует по назначению. Не вина исполнителя — коммита не существовало на момент RF.
  • R1/R2, Low. Третье вхождение «two fields» уцелело в RF §1 L33; счётчики в §1 устарели после прохода (+34/−4 → фактически +36/−4). На артефакты не влияет.
  • R4 закрыт координатором в b75acbf. R5: TD-132 заработал вживую — сборка сыплет Unresolved phase reference: RF TFW-53/A. R6: мой verify.md добавил второй экземпляр TD-138.

4.2 Проход 3 — AC-13 и AC-14 приняты

Коммиты b75acbf (координатор, спека) и 7030b2d (исполнитель).

AC-13 — правило 15 привязано к теме коммита. ✅ Форма git log -E --grep="^\[[^]]*/{TASK-ID}/freeze/" перезапущена мной: 5 в Git Bash, 5 в PowerShell, мусорный f379c5e ушёл. Исполнитель не взял мою готовую команду на веру, а перепроверил и сам нашёл её предел^ цепляется к началу любой строки, не только темы (проба ^[TD-137](../../../reference/tech-debt.md)267bd06). Предел отгружен третьим буллетом правила, а не умолчан. Это ровно та дисциплина, которую фаза декларирует.

AC-14 — RF §1 приведён в согласие. ✅ «two fields» в рабочей ячейке больше нет (три, поимённо); счётчики перемерены: 170 / 16, воспроизводится у меня точно. Попутно исполнитель поймал мою ошибку: git diff --stat печатает изменённые строки (вставки + удаления), и мой R2 назвал +36 / −4 там, где --numstat даёт +33 / −3. Претензия была верной, замена — нет.

4.3 Плотность артефактов исполнителей — здесь фаза не проходит

Измерено по всему репозиторию — 64 TS, 64 RF, 58 ONB. Все три артефакта фазы A одновременно поставили рекорд репозитория:

Артефакт Слов Медиана проекта Максимум проекта
TS фазы A 4 107 1 277 4 107 — это он
RF фазы A 5 112 773 5 112 — это он
ONB фазы A 4 483 712 4 483 — это он
templates/HL.md 1 888 (было 1 073, +76%) шаблоны: TS 533 · RF 593 · RES 924 больше любого workflow (plan 1 205)

Это не оттенок. Дальше — где именно вес и какого термина не хватило.

V1 — TS §5 весит 2 503 слова из 4 107 (61%), потому что у TS нет журнала изменений. У HL есть §12 для своих правок. У TS нет ничего — и пять ревизий вписались внутрь критериев приёмки. AC-11 несёт целый ⚠️-абзац, пересказывающий поправку A12, которая дословно уже лежит в HL §12. Отсутствует не краткость, отсутствует артефакт: запись ревизий TS. Проза — симптом.

V2 — RF §3 весит 1 260 слов, пересказывая критерии из TS. Каждый AC переписан буллетами и затем отмечен галочкой. Таблица «AC │ гейт │ результат» — это ~250 слов. Около тысячи слов структурного дублирования между TS и RF.

V3 — оспоренное решение стоит в 3.3 раза больше прозы, чем неоспоренное. Механизм измерен. RF §2: решения 2, 4, 5, 6, 8 (никем не оспаривались) — в среднем 46 слов. Решения 1, 3, 7, 9, 10 (каждое родилось из возражения) — 152. Два самых новых, 9 и 10, они же два самых длинных (210 и 166). Каждый раунд возражений дописывает защиту, защиты не удаляются. Это и есть то, что владелец чувствует как раздувание.

V4 — правило 15: самый острый случай. 30 → 162 слова, и лишние 132 защищают более слабый механизм. Правка корректна, но отгружается с «known limit» и с указанием людям менять способ письма коммитов («indent or inline example subjects when quoting them»), чтобы уберечь регэксп. Форма без предела существует, я перезапустил её — 5/5 в обеих оболочках:

git log --format="%h %s" | grep "/{TASK-ID}/freeze/"

%s — только тема, поэтому строка тела не совпадёт по построению: предел не документируется, а исчезает. Оговорка: якорный регэксп дал им я, так что это моя ошибка, размноженная дальше — и они поступили правильно, перепроверив и найдя его предел. Пайплайн-форму стоит так же перепроверить самим, а не брать на веру.

V5 — рост пришёлся туда, где у проекта нет числа. F2 (700–900 рабочий, 1 200 предел) измеряет только workflow. У шаблонов — F22 «минимализм» без числа, у conventions.md и у артефактов задачи — ничего. Три самых выросших артефакта — ровно те, у которых нет числа. Плюс: plan.md уже 1 205 слов при пороге 1 200, до того как Phase B что-либо добавит, а DoD-17 требует остаться в бюджете.

Почему вердикт не меняется. Ни один AC не требует краткости. Руководство TS §6 («нумерованное правило или строка таблицы») исполнено — §3 conventions.md это 21 правило, не проза. Рулинг координатора по ONB Risk 5 прямо запретил ужимать правила ниже пригодности, и исполнитель честно вынес +28.2% в RF §4 вместо того, чтобы подогнать цифру. Планка материальности (P14) для блокировки не пройдена. Но долг структурный → TD-140, TD-141, TD-142.

4.4 AC-15 — ✅ принят. Лучший AC фазы

Правило 15: 162 → 56 слов (потолок AC-15 — 60), блок §3 958 → 852. Изменилось только оно (диффом: одна строка правила). Сокращение усилило механизм, а не подстригло текст: старая версия требовала буллет «Known limit» и указание людям отступать примеры в теле коммита, чтобы не обмануть регэксп. У новой предела нет по построению%s это и есть тема.

Исполнитель не залатал --grep, а закрыл подход: проверил -E ^ и PCRE \A и установил причину — git грепает сообщение построчно, поэтому никакой --grep не может быть subject-only. Это корневой результат, а не обход. Оба выученных ограничения выжили в одном предложении: фильтровать тему, не начинать шаблон со слеша.

Спека тоже хорошая: гейт требует и счёт слов, и поведенческий негативный тест, прямо говоря, что «сжатие, сохранившее слабый механизм, пройдёт счёт и провалит тест». Косметическое соответствие исключено конструкцией AC.

Замечания (не блокирующие):

  1. Правило перестало быть исполняемой командой. Оно даёт git log --format="%h %s" и шаблон «filtered on», оставляя пайп и инструмент читателю — а они разные по оболочкам (grep -E / Select-String). Конкретные вызовы есть только в baseline_recovery.txt §13–14, внутри папки одной задачи. AC-15 буллетом 5 маршрутизирует это в /tfw-knowledgeесли проход KNW это потеряет, запускаемой формы не останется нигде findable.
  2. EV строка E15 говорит «162 → 57» и «958 → 853», собственный блок FINAL COUNTS в том же файле — «56» и «852». Факт: 56 и 852. Третий случай, когда сводное число отстаёт от перемера.
  3. Не воспроизвёл негативный тест независимо: ветка фикстуры удалена, моя реконструкция вышла некорректной. Транскрипт исполнителя детален и внутренне согласован — принимаю, но не проверил.
  4. Всё перечисленное не закоммичено на момент ревью.

5. Tech Debt Collected

Полный текст — в TECH_DEBT.md один раз. Здесь только реестр прохода.

# Источник Sev Что Статус
TD-131 RF obs. #1 Low templates/HL.md — уровень заголовка §7.1 → Phase D
TD-132 RF obs. #2 High gen_docs.pyPhase{X}/ после D50; молча ломает все phase-ссылки → отдельная задача
TD-133 RF obs. #3 Med P{N} резолвится в удалённый KNOWLEDGE.md §0 → Phase C
TD-134 RF obs. #4 Med build.* — заглушки; рабочего build-гейта из конфига не было ни у одной задачи → backlog
TD-135 RF obs. #5 Low conventions.md §3 — 21 правило одним блоком → Phase B
TD-136 RF obs. #6 Low сломанный --grep в шапке TS ✅ Closed f379c5e
TD-137 REVIEW п.1 Low RES.md — «two fields» при четырёх ✅ Closed 267bd06
TD-138 REVIEW п.2 Low mkdocs не резолвит не-.md вложения evidence → backlog
TD-139 §4.1 R3 Med --grep по телу коммита → мусор первым в выдаче baseline ✅ Closed 7030b2d (AC-13)
TD-140 §4.3 Med templates/HL.md +76%; §3.1 дублирует требование, §12 пересказывает правила ⬜ Backlog
TD-141 §4.3 V5 Med бюджет внимания только у workflow; plan.md уже вне порога F2 до Phase B
TD-142 §4.3 V1/V2/V3 Med у TS нет журнала правок → ревизии внутри AC; RF §3 пересказывает TS; оспоренное решение = 3.3× прозы ⬜ Backlog
TD-143 §4.3 V4 Low правило 15: 30 → 162 слова; форма без предела существует (--format="%h %s" \| grep) ⬜ Backlog

6. Traces Updated

  • [x] Task Board — 📚 KNW (A), колонка REVIEW связана
  • [x] TECH_DEBT.md — TD-131TD-141; TD-136/137 закрыты
  • [ ] HL status — не менялся: фаза A из пяти
  • [x] tfw-docs: Applied 2026-08-18 — one pass across Phases A–E. KNOWLEDGE.md §1 Adapters row (drift check), D63 contract · D64 purpose defence · D65 rejected trace; §2 three artifact rows; §3 six new legacy entries plus the TFW-48/49 row re-pointed at the post-mortems. TECH_DEBT.md: TD-176/177/178 added, TD-156 closed, TD-169(a) closed.
  • [x] tfw-knowledge: Applied 2026-08-18 — one pass across Phases A–E. 25 facts written (105 → 130): philosophy +8, process +5, stakeholder +4, constraint +3, environment +2, convention +2, and a new knowledge/risk.md +1. Six candidates rejected, the stalest being the spec review-mode preference, which TFW-56 deleted. fact-candidates: processed markers set on HL §11 and on all ten RF/REVIEW §7 sections.

    ✅ DONE — только когда обе отметки проставлены.

7. Fact Candidates

fact-candidates: processed 2026-08-18 (/tfw-knowledge, TFW-53 A–E)

# Категория Кандидат Источник Уверенность
1 convention Для фаз, где поставка — framework-текст (шаблоны, conventions.md, правила), владелец ревьюит в режиме spec, а не в сконфигурированном code. Дефолт откалиброван под проект, отгружающий код; этот репозиторий отгружает правила Владелец, выбор режима 2026-08-13 High
2 philosophy Владелец читает раздувание артефакта как отказ терминологии, а не как избыток слов: «вместо правильных терминов целей и ценностей». Диагностика — не «сократи», а «какой термин отсутствует, раз его заменяет абзац». Измеримый след: RF фазы 5 112 слов при медиане проекта 641; REVIEW 4 356 при историческом коридоре 413–990 Владелец, 2026-08-13 High

REVIEW — TFW-53 / Phase A: Contract in Artifacts | 2026-08-13, три прохода