Files
portal/docs/observer/notes/2026-05-24-brain-retro.md
T
Дмитрий 26999ca597 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

18 KiB
Raw Blame History

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