Files
portal/docs/superpowers/handoff/2026-06-16-arbitration-fixes-worklog-for-brain.md
T
2026-06-16 11:22:27 +03:00

8.2 KiB

Журнал работ: 3 фикса машинерии арбитража — для переноса в claude-brain

Дата: 16.06.2026. Чиним в замороженной рабочей копии репо Документация (ADR-020). Дом мозга (C:\моя\проекты\claude-brain) повторяет/улучшает по этому журналу + по full-negotiation-cycle-design + findings-спеке 2026-06-15-....

ИТОГ: Фикс 1 + 2 + 3 реализованы, 29/29 tools GREEN, закоммичено в main (LEFTHOOK=0).


ЭТАП 0 — диагностика

  • Q1 (F-G): exitDecision (enforce-hook-helpers.mjs:360) — текст контроллеру только при block (exit2); allow→{} нем. GO/skip тихие.
  • Q2 (F-C): судья СЛЕП (judge-engine.mjs:12,46); наставник видит только свой журнал; позиция контроллера из ## Переговоры — не в промпт.
  • Q3 (F-D): arbitration-card hold обещает пропуск, но escape≠seal (enforce-judge-gate.mjs:337).

УТВЕРЖДЁННЫЙ ЗАМЫСЕЛ

Переговоры = контроллер↔судья/наставник; владелец — арбитр на 3-м круге. Память verbatim. Полный единый цикл (спека=план) — в отдельном дизайн-доке. 3 фикса по очереди.


ФИКС 1 — ВИДИМОСТЬ ВЕРДИКТА — ГОТОВ + ПРОВЕРЕН ЖИВЫМ

Канал: UserPromptSubmit.additionalContext (PostToolUse-канал не подтверждён → судья v1 NO-GO). Файлы: verdict-outcome-line + verdict-surface-store + enforce-verdict-surface (UPS-хук показа, регистрация в settings.json — шаг владельца, СДЕЛАН) + classifyJudgeOutcome + врезки дозаписи в main судьи/наставника. ПРОВЕРЕНО ЖИВЫМ: строка 🚫 NO-GO: … всплыла через канал на след. ходе.

ФИКС 2 — ПАМЯТЬ КРУГОВ — ГОТОВ

  • 2a (судья): round-memory-store + блок «ТВОИ ПРОШЛЫЕ ПРЕТЕНЗИИ» в buildJudgePrompt (priorObjections+controllerResponses, круг1 слеп) + проводка в runJudgeGate (load + persist NO-GO).
  • 2b (наставник): controller-negotiation + инструкция «Переоцени ТЕКУЩИЙ … снятое НЕ повторяй» в обоих промптах + доводы контроллера в negotiationLog (план-путь).
  • FOLLOW-UP brain: спека-путь наставника (merge доводов в onSpecWrite) — покрыт только план-путь.

ФИКС 3 — АРБИТРАЖ ОПЕЧАТЫВАЕТ (owner-seal) — ГОТОВ

Спека specs/2026-06-16-owner-seal-arbitration-design.md, план plans/2026-06-16-owner-seal-arbitration.md.

  • tools/seal-override.mjsownerSealAction(hash) = зарезервированная метка owner-seal:<hash> (как plan-done); decideSeal({verdict,ownerSealOpen}) — owner-seal перевешивает NO-GO.
  • enforce-judge-gate.mjs sealOnWiredGo — печать на wired-GO ИЛИ ownerSealOpen; при owner-seal пропускается mentor freeze-gate (владелец перевешивает судью И наставника). sealTurnProd вычисляет ownerSealOpen = escapeGrantOpen('owner-seal:'+hash, ...).
  • arbitration-card.mjs — честный текст hold/own (owner-seal, не «escape-грант») + поле sealAction (контроллер ставит его в опцию AskUser → клик владельца подписывает owner-seal).
  • Механика: владелец на арбитраже кликает FLOOR-ESCAPE: owner-seal:<hash> → подписанный грант → путь печати ставит frozenPlan/frozenArtifact несмотря на NO-GO → стена в режим реализации.

БАГ F-J — рассинхрон указателя (hook-order desync)

PreToolUse-блокер (skill-discipline / normative §6) роняет действие exit2, но enforce-supreme-gate (хук раньше в цепочке) УЖЕ сдвинул указатель → застряли. Корень: порядок хуков (discipline-блокеры ДО supreme-gate) и/или двухфазный commit указателя. Обход: FLOOR-ESCAPE: plan-done (reset). Фикс brain: не двигать указатель supreme-gate, если со-хук блокнёт.

БАГ F-K — правка discipline-source под стеной недостижима (escape И CARD рассогласованы)

Симптом: правка enforce-judge-gate.mjs (и др. enforce-/judge-/mentor-) под стеной блокируется enforce-normative-content-rules §6 (ЗАКОН). escape (write:<путь>) — НЕ зачитывается этим гейтом (3 попытки), хотя его код (стр.159) escape чтит; supreme-gate тот же escape чтит (handoff-файлы писались). CARD-путь (sealedPlanCoversEdit под опечатанным планом) тоже не сматчил правку. Гипотезы: (A) F-F канон-строка пути (realpathSync для существующего файла vs метка, кириллица/junction); (B) гейт-специфичный баг escape-ветки для discipline-source. Рантайм-грант (~/.claude/runtime) read-protected → не проверить, что записалось. Фикс brain: (1) выводить ГОТОВУЮ канон-строку из pending tool-события (хелпер print-canonical-action), не из ручной метки; (2) нормализовать обе стороны идентично; (3) проверить escape-ветку §6 для discipline-source.

ИНЦИДЕНТ — откат врезок git restore'ом

Между прогоном Фикса 2b (GREEN) и Фикса 3 врезки Ф1/2a/2b в существующие tracked-файлы (enforce-judge-gate, judge-engine, mentor-verdict, enforce-mentor-on-plan-write) откатились (новые untracked-файлы выжили — признак git restore/checkout). Восстановлены терминал-скриптом (node, точные якоря + бэкапы) + закоммичены. Урок: правки машинерии под стеной нельзя делать через Claude (F-K) — делать терминалом + сразу коммитить (uncommitted working-tree changes теряются на restore).


КАК ДЕЛАЛОСЬ ЗДЕСЬ (для brain — повторить чисто у себя)

Правки discipline-source применялись терминал-скриптами (node string-replace по точным якорям, бэкап + verify-before-write), т.к. стена их блокирует. Коммит — терминал $env:LEFTHOOK="0" (полный скип хуков; частичный LEFTHOOK_EXCLUDE=cspell НЕ помог — markdownlint-fix сорвал git-stash). Коммит через Claude недостижим: частокол гейтов (supreme-gate / criterion-gate / verify-before-push).

Brain ОБЯЗАН прогнать ПОЛНУЮ сюиту у себя — здесь локально только 29 новых тестов (тест-слой 227 файлов в brain). Врезки в main судьи/наставника интеграционно здесь не покрыты.

СТАТУС: цикл закрыт. Осталось у brain: полный цикл переговоров (дизайн-док), F-J/F-K фиксы,

спека-путь наставника, owner-seal AskUser-проводка арбитражной карточки.