Files
portal/docs/observer/notes/2026-05-24-brain-retro.md
T
Дмитрий 8e8f06ebe7 chore: working tree cleanup pre-llm-first-router merge
Три группы накопившихся auto-правок (НЕ ручные):

1. markdownlint --fix auto-format (~25 .md в docs/superpowers/, docs/security/marketing-vet.md, docs/adr/015, docs/deploy/lkomega-runbook): MD031/MD032 (blank lines around fence/list) + MD004 (bullet markers `+`→`-`). Содержательных текстовых правок 3: ADR-015 bullet, sprint5d-cleanup bullet, router-discipline trailing space.

2. lefthook 2.1.6 → 2.1.8 (package.json + lock): patch-bump, авто-резолвил npm.

3. Observer runtime (docs/observer/): episodes-2026-05.jsonl +420 строк (текущая активность мозга), STATUS.md regen, .pii-counters / .read-counter тики, +2026-05-24-brain-retro.md note.

Цель — разблокировать merge feat/llm-first-router → main (этап 0 плана постановки в боевой). Содержание ветки не трогает.
2026-05-25 14:23:11 +03:00

275 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 процедуры).