# 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 процедуры).
