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.
Замечания (не блокирующие):
- Правило перестало быть исполняемой командой. Оно даёт
git log --format="%h %s"и шаблон «filtered on», оставляя пайп и инструмент читателю — а они разные по оболочкам (grep -E/Select-String). Конкретные вызовы есть только вbaseline_recovery.txt§13–14, внутри папки одной задачи. AC-15 буллетом 5 маршрутизирует это в/tfw-knowledge— если проход KNW это потеряет, запускаемой формы не останется нигде findable. - EV строка E15 говорит «162 → 57» и «958 → 853», собственный блок FINAL COUNTS в том же файле — «56» и «852». Факт: 56 и 852. Третий случай, когда сводное число отстаёт от перемера.
- Не воспроизвёл негативный тест независимо: ветка фикстуры удалена, моя реконструкция вышла некорректной. Транскрипт исполнителя детален и внутренне согласован — принимаю, но не проверил.
- Всё перечисленное не закоммичено на момент ревью.
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.py — Phase{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-131…TD-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 thespecreview-mode preference, which TFW-56 deleted.fact-candidates: processedmarkers 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, три прохода