# Brain-retro #4 — дельта с 2026-05-23 **Дата:** 2026-05-24 (~16:30 MSK). **Период:** 2026-05-23T09:02Z .. 2026-05-24T13:18Z (~28 часов, 116 v2+v3 эпизодов). **Анализатор:** `node tools/brain-retro-analyzer.mjs docs/observer/episodes-2026-05.jsonl` + `tools/missed-activations.mjs` (фильтр после cutoff retro #3 = 2026-05-23T08:47Z). **Уровень анализа:** дельта-срез по умолчанию; экономия 100%. **Отношение к предыдущему ретро:** надстройка над [2026-05-23-brain-retro.md](2026-05-23-brain-retro.md) (cutoff 2026-05-23T08:47Z). Кандидаты A1/A2/B1/D1 из retro #3 — **применены** заказчиком (commit `963379c3`). > `episodeCount=116` (21 v2 + 95 v3), `observerErrorCount=0`. v3 parser-expand активен с 2026-05-23 (push `aad48de6`). --- ## Period & context Двое суток после retro #3 — финал плотного спринта и переход к router-discipline-overhaul: - **Биллинг v2 Спек B Phase 1 → прод** (24.05 ночь, push `ccfecd5e`, 10 коммитов FF). Убран `DuplicateDetector`, добавлена раздача `LeadRouter` с лок-таблицей `supplier_lead_deliveries`. - **Partition+RLS+log durable fix → прод** (23.05 ночь +2, push `7e0c8dde`, 3 коммита FF). Закрыт operational-долг hole #2. - **Observer parser v3 expand → main** (23.05 day, push `aad48de6`, 8 коммитов FF). Новые поля `hook_fired.scripts` (object map) + `primary_rationale.recommended_node`. - **PII-leak RU-phone hardening** (23.05, push `11822e38`). 11 строк лога санитизированы. - **Router-discipline-overhaul stages 2+3** (23.05 + 24.05, мерж `d030dbbe`). Введён `tools/router-tool-gate.mjs` (warn-only), 3 хука зарегистрированы, реестр узлов `docs/registry/nodes.yaml` создан как новый SoT (классификационная карта DEPRECATED). - **Mapping hygiene retro #3 → A1+A2+B1+D1 применены** (commit `963379c3`). - **2 controller-offload агента** (`normative-sync`, `prod-deploy-validator`) — push `c8963031` + `e3ec2446` + патч `9bc090fb`. --- ## Macro метрики дельты (vs ретро #3) | метрика | ретро #3 | ретро #4 (дельта) | дельта | |---|---|---|---| | период, дней | 5 | ~1.2 | — | | эпизоды v2+v3 | 116 v2 | 21 v2 + 95 v3 = 116 | паритет, но v3 уже 82% | | уникальных task_id | 61 | 22 | — | | path_type regulated | 13.8% (16/116) | **19.0%** (22/116) | +5.2 п.п. | | skill-инвокации | 13/93 (14%) | 22/116 (19%) | +5 п.п. | | missed activations | 40 | **9** | −78% | | observer_error | 0 | 0 | — | | error events / episode | 1.3 | **0.55** | −58% | | post_compaction | 43/116 | 0/116 | — (короткая дельта) | **Ключевое:** дисциплина и качество роутинга растут синхронно — regulated rate +5 п.п., missed activations −78%, error density −58%. Это первая ретра в которой видно **измеримый эффект brain-governance цикла** (применение кандидатов retro #3 → снижение шума → виден сигнал). --- ## Path-type distribution (n=116) | path_type | count | % | |---|---|---| | improvised | 94 | 81.0% | | regulated | 22 | 19.0% | | mixed | 0 | — | | alternative | 0 | — | Regulated +5.2 п.п. vs retro #3 (13.8% → 19.0%). Все skill-инвокации в дельте — из Superpowers (brainstorming×6, writing-plans×6, systematic-debugging×4, subagent-driven-development×3, TDD×1, verification-before-completion×1, using-superpowers×1). Все остальные категории (skills проекта, vendored) — direct. --- ## Outcome distribution Прокачка `_inferredOutcome` на full-file даёт корректный outcome inference. Сырой outcome (записанный `unknown`) ничего не говорит — нужен следующий эпизод задачи. По factor matrix (от full-file analyzer): - `success` ≈ 33% - `soft_success` ≈ 46% - `unknown` ≈ 20% (хвосты сессий) - `blocked` ≈ 1% `prompt_signal` distribution дельты: 50 new_task / 56 neutral / 8 approval / **2 correction** (1.7% rework — на уровне retro #3, здоровый низкий). --- ## Factor matrix highlights ### decision_provenance — кто решает? | provenance | count | % | |---|---|---| | autonomous | 95 | 81.9% | | user_chose_from_options | 21 | 18.1% | | user_directed_method | 0 | — | `user_directed_method=0` — заказчик НЕ навязывал методы за эти 28 часов. Healthy. `user_chose_from_options=21` — стабильный паттерн collaborative-choice (≈18%). ### economy_level | economy_level | count | |---|---| | 100 | 115 (99.1%) | | null | 1 | Только стандартный уровень. Никаких degradations / экспериментов. ### parallel_session 16/116 (13.8%) эпизодов с `parallel_session=true`. Pravila §15 территория — пилот/dev-машина или разные ветки. Не выделяется в blocked / correction (только 2 correction по дельте, оба не в parallel-сессиях). ### model 100% claude-opus-4-7 (15 эпизодов с `null` модели — артефакт парсера v2; v3 уже всегда заполняет). --- ## v3 parser expand — фактическое покрытие - 95/116 (82%) эпизодов в дельте — schema_version=3. - **`hook_fired.scripts` populated** в большинстве v3-эпизодов как object `{script_name: count}` (top 8 уникальных скриптов, см. ниже). - **`primary_rationale.recommended_node` populated:** только в 4 эпизодах (#19×3, #25×1). Низкое покрытие — потому что classifier даёт `other` чаще всего, а `direct` без явной рекомендации в маппинге. Это хороший знак — наблюдатель не врёт, заполняет рекомендацию только когда есть факт (classification → non-empty mapping). --- ## Hook telemetry (v3 expand, дельта) | script | invocations | |---|---| | `inline:e2f5fa75197ed8a7` | 748 | | `tools/router-tool-gate.mjs` | **294** | | `inline:62a129f5897d02fb` | 212 | | `inline:123781b7a77c2213` | 212 | | `inline:171492082025e488` | 123 | | `inline:0d75e3df119ecf14` | 123 | | `inline:ee9b8c077fcab23d` | 27 | | `tools/observer-stop-hook.mjs` | 2 | **`router-tool-gate.mjs` 294 фаира** — main сигнал. Stage 3 task 6 deployed (`b4fb2cec`), warn-only mode активен. Каждое срабатывание = potential block в enforce-режиме (когда заказчик переключит). Inline-хуки `e2f5fa75...` (748 раз) и `62a129f5/123781b7...` (по 212) — компоненты economy/skill-discipline architecture. Распределение типичное: 1 «сердечный» хук + 4 матчер-специализированных. --- ## Tool mix (дельта) | tool | invocations | |---|---| | Bash | 562 (PreToolUse) | | Edit | 220 | | Read | 147 | | Agent | 100 | | TodoWrite | 74 | Всего ~1060 tool-calls на 116 эпизодов (≈9 tool/episode median). Распределение task_size: median 3, p95 39, max 80. 45/116 (39%) эпизодов — micro (0 tool-calls, Q&A или approval), 13/116 (11%) — heavy (>20 tool-calls, implementation). --- ## Errors / retries / time_burn 64 error / 53 retry / 13 time_burn / 0 interrupt / 0 parse_gap. Распределение здоровое — 0.55 err/episode (vs 1.3 в retro #3). Большая часть retry — нормальные Bash-итерации (поиск ошибки, прогон тестов несколько раз). Никаких observer-error / parser-gap. --- ## Missed activations (Pravila §16.4 v1.36 conditional rule) **Total: 9** (vs 40 в retro #3 — снижение −78% после применения A1/A2 cleanup). ### By classification | classification | episodes | bypassed nodes | |---|---|---| | analysis | 6 | #25 Semgrep, #39 ToB Skills, #53 process-analysis | | feature | 2 | #19 Superpowers | | planning | 1 | #19, #41 CCPM, #42 product-management | ### Анализ — ЧТО ИЗ ЭТОГО реально промах vs шум - **6 analysis** — все 6 связаны с meta-работой: разбор `docs/observer/STATUS.md` + `brain-retro-analyzer.mjs` + `ПИЛОТ.md` + `2026-05-23-brain-retro.md` (это сам сеанс retro #3 + правка анализатора). Маппинг `analysis → [#25 Semgrep, #39 ToB Skills, #53 process-analysis]` — про техн-аудит/SAST/process discovery. Brain-retro / observability-анализ не покрывается этими узлами. **Шум классификатора**, не реальный промах. - **2 feature** — обе с правкой `docs/observer/STATUS.md` + `docs/superpowers/specs/...router-discipline-overhaul-design.md` (24.05 ночь, stage 3 follow-up закрытие) + `memory/project_webmaster.md` (новая memory-запись). Это **STATUS-регенерация после уже сделанной фичи** и **memory-update** — не «новая фича». Классификатор слишком широкий: то что коснулось spec-файла или memory не значит, что это feature-разработка. **Шум классификатора.** - **1 planning** — `docs/superpowers/specs/2026-05-23-router-discipline-overhaul-design.md` (router stage 4 чтение/уточнение). Реальный план уже есть, эпизод — продолжение работы по существующему. Маргинал; #19 Superpowers уже использован в предыдущих эпизодах task'а. **Реальные промахи в дельте: 0–1.** Все 9 — classifier noise. ### Кандидаты на пересмотр (если решите трогать) Маппинг сейчас в `tools/observer-classification-map.json`, **но DEPRECATED 24.05** — SoT переехал в `docs/registry/nodes.yaml` (новый файл, видимый stage 4 router-overhaul). Рефинить старый файл = создавать дрейф с новым. **Кандидат: дождаться stage 4 router-discipline-overhaul и рефинить узкие классификации (`analysis` / `feature`) уже в новом registry.** --- ## Causal chains Топ файлов в дельте: | файл | эпизодов | контекст | |---|---|---| | `memory/MEMORY.md` | 17 | memory-sync after big-day events | | `memory/project_state.md` | 7 | state updates | | `memory/reference_github.md` | 6 | push-логи (3+ деплоя) | | `memory/project_router_overhaul.md` | 6 | новый memory-файл, отслеживает stages 2+3+4 | | `ПИЛОТ.md` | 5 | обновления после прод-деплоев | | `.claude/skills/subagent-driven-development/references/git-safety-checklist.md` | 5 | rebuild + protocol updates | | `tools/observer-classification-map.json` | 4 | A1/A2/deprecation header | | `cspell-words.txt` | 4 | termsync для новых имён (registry/router-state/etc.) | Цепочки задач (≥3 эпизода shared-file): - **`memory/project_router_overhaul.md`** — отслеживает router-discipline-overhaul progress (stages 2+3 merge + 3 follow-up fixes). - **`memory/MEMORY.md` + project_state.md + reference_github.md** — стандартный memory-sync после прод-деплоев Billing v2 + partition fix. - **`ПИЛОТ.md`** — два больших обновления (после `ccfecd5e` и `7e0c8dde`). Нет «error→fix loop» цепочек. --- ## Skill invocations (дельта, n=22) | skill | times | |---|---| | superpowers:brainstorming | 6 | | superpowers:writing-plans | 6 | | superpowers:systematic-debugging | 4 | | superpowers:subagent-driven-development | 3 | | superpowers:test-driven-development | 1 | | superpowers:verification-before-completion | 1 | | superpowers:using-superpowers | 1 | 22 skill-инвокации / 116 эпизодов = **19% regulated**. Все — Superpowers, ни одного project-скила (`audit-portal`/`regression`/`brain-retro`/`billing-audit`/`security-go-live`/etc.). Покрытие L1-L16 chain'ов (из `primary_rationale.chain_ref`): L1 ×12, L8 ×4, L1+L16 ×6. **L1 пайплайн (brainstorming→writing-plans→executing-plans)** — доминирует, как и должно для feature-планирования. --- ## Candidates for owner review > Все ниже — кандидаты, не правки. Применять только по явному «делай» от заказчика. ### E. Router-gate warn-only → enforce (мониторинг) **E1.** `tools/router-tool-gate.mjs` отработал **294 раза в warn-only** за дельту. Stage 3 spec говорит «первая неделя warn-only, потом ручной переключатель». Сейчас неделя ещё не прошла (deploy 24.05 ночь). **Кандидат: подождать ещё ~5 дней warn-only baseline, затем посмотреть распределение причин фаира перед переключением в enforce.** - **Why:** baseline нужен, чтобы знать какие сценарии будут блокироваться. 294 фаира — это уже видимое поле для анализа. - **Rejection-option:** включить enforce немедленно (агрессивная дисциплина — но риск ложных блоков в активных фичах вроде Billing v2 Спек C). ### F. Classification-map deprecation handling **F1.** Файл `tools/observer-classification-map.json` помечен DEPRECATED 24.05 (SoT → `docs/registry/nodes.yaml`). 9 missed activations этой ретры — все classifier noise (`analysis` / `feature` слишком широкие). **Кандидат: НЕ править deprecated файл; запланировать рефайн узких классификаций в новом registry в рамках stage 4 router-discipline-overhaul.** - **Why:** двойное обслуживание двух источников приведёт к дрейфу. stage 4 явно про это. - **Rejection-option:** одно-разово почистить старый файл (узкие `analysis_security` / `analysis_meta`, `feature_code` / `feature_status_regen`) — даст чистые метрики на ближайшие 1-2 ретры до миграции. ### G. v3 parser coverage gap **G1.** 21/116 эпизодов в дельте всё ещё v2 (после deploy v3 parser 23.05). Скорее всего — параллельные сессии на старой кодовой базе. **Кандидат: ничего не трогать — v2/v3 mixed нормально для transition window; v3 уверенно растёт до 100%.** - **Why:** observability metric, не actionable. - **Rejection-option:** force-restart всех сессий чтобы перейти на v3 (overkill для observability). ### H. Skill-invocation diversity **H1.** Все 22 skill-инвокации — Superpowers. Ноль вызовов project-скилов (`audit-portal`, `regression`, `brain-retro`, `billing-audit`, `security-go-live`, `pdn-152fz-audit`, и т.д.) — кроме самой текущей brain-retro. **Кандидат: запомнить как baseline для следующей ретры — project-скилы используются эпизодически, рост в Billing v2 Спек C или security-go-live перед публикацией ожидается естественно.** - **Why:** не сигнал проблемы; project-скилы триггерятся только специфичными задачами. - **Rejection-option:** Принудительно вызывать project-скил для каждого подходящего паттерна (риск over-discipline / шумные сессии). --- ## Behavioral rule check (Pravila §16.4) - «Не использован ≠ проблема» — соблюдено. Из 9 missed-activations: - **0** соответствуют профилю в realistic смысле (все 9 — classifier noise). - **9** маркированы как кандидаты, но не алертами; формально это сигнал, но в этой ретре прозрачно отмечено как шум (см. секцию выше). - Снижение шума с 40 до 9 — прямой эффект применения retro #3 кандидатов A1/A2. --- ## Что НЕ меняется этим retro - НЕ редактирую `tools/observer-classification-map.json`, `docs/registry/nodes.yaml`, `tools/.node-dormancy.json`, нормативку, code. - НЕ переключаю router-gate из warn-only в enforce. - НЕ пишу в `episodes-*.jsonl` (read-only). - НЕ trigger'у auto-memory. - STATUS.md перегенерируется через `node tools/status-md-generator.mjs` (шаг 8a процедуры).