Brain-retro #3 за весь май 2026 — 116 v2-эпизодов / 61 task_ref. Здоровье: 0 observer_error, 1.7% correction-rate, 19 skill-инвокаций (vs 6 в ретро #2 — рост в 3×). Применены 4 кандидата по явному «делай» от заказчика: A1. observer-classification-map.json: question → [] (был ["#60"]) Разговорные RU-вопросы давали 17/40 false-positive промахов против context7. A2. observer-classification-map.json: memory-sync → [] (был ["#33"]) #33 claude-md-management — канал ТОЛЬКО для CLAUDE.md (Pravila §5 п.10), не для memory/*.md. Давало 8/40 false-positive. B1. Tooling §4.8 #34 Sentry MCP — boundaries +DEFERRED Sentry instance не задеплоен (pending Б-1). Двойной сигнал extractor'а → .node-dormancy.json[#34] = true. D1. memory/feedback_feature_via_writing_plans.md (user-memory вне git). Effect: missed-activations 40 → 15 после очистки шума. Из 15 реально значимы 2 эпизода (audit-journaling closure 116 tools без writing-plans; SyncSupplierProjectJobTest planning без skill). Остальные 13 — шум классификатора на правках своих документов. +cspell-words.txt: 20 слов (9 секций Tooling + 11 из retro-note). NB: docs/observer/episodes-2026-05.jsonl снят со staging — gitleaks обнаружил 3× RU-phone leak (`ru-phone-unmasked` rule). Это сигнал что observer PII-фильтр пропустил телефон в free-text record — отдельный follow-up (PII фильтр Stop-хука). Retro-отчёт: docs/observer/notes/2026-05-23-brain-retro.md. STATUS.md перегенерирован. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
14 KiB
Brain-retro #3 — весь май 2026 (полный срез)
Дата: 2026-05-23 (~11:50 MSK).
Период: весь май 2026 — 2026-05-19T05:18Z .. 2026-05-23T08:47Z (121 строк JSONL; 116 v2 + 5 v1 пропущено).
Анализатор: node tools/brain-retro-analyzer.mjs docs/observer/episodes-2026-05.jsonl + tools/missed-activations.mjs.
Уровень анализа: обзорный по запросу заказчика; экономия 100%.
Отношение к предыдущему ретро: надстройка над 2026-05-20-brain-retro-v2.md (23 v2-эпизода, 2026-05-20T17:55 MSK). Здесь — дельта в 105 v2-эпизодов (22 task_id) после cutoff 2026-05-20T08:58:44Z, итого 116 v2 + 61 task_ref.
episodeCount=116,v1SkippedCount=5,observerErrorCount=0. Цифры по 116 v2-эпизодам, если не отмечено иное.
Period & context
19.05–23.05.2026 (5 дней) — самый плотный 5-дневный спринт мая. Параллельно шли:
- A8 infosec-tooling (21.05): #68 ZAP + #70 Ward установлены портативно; push
3fc5501. Открытые эндпоинты закрыты2a34ee8+ SSRF-гард6933ddc. - C1 marketing-tooling (22.05): 10 узлов #74-83, push
a0e47bc6; нормативка v1.39/v2.27/v2.23/v3.22. - pg_audit#28 + pg_anonymizer#29 на проде liderra.ru (22.05): push
527a779. - Audit journaling closure (22.05, 9+ дыр): P0+P1 done, push
3f7c1e40, 22 коммита, выкачено на прод. - Серверный hardening (22.05 по SSH): HTTPS+HSTS, fail2ban, бэкапы cron, ModSecurity CRS DetectionOnly. SEC-3/SEC-5 ждут YC-консоль.
- Регистрация email+phone (22.05): фича в feat/test-deploy
0e31783, на проде Yandex 360 SMTP. - 7 дыр аудита follow-up (23.05): #7 (RLS dev↔prod) + #1 (hash-chain validator) DONE+на проде; lefthook починен.
- QA-прогон чек-листа (23.05): 5 qa-tenants 11-15, B-01 by-design, два деплоя.
Macro метрики дельты (vs ретро #2)
| метрика | ретро #2 | ретро #3 | дельта |
|---|---|---|---|
| v2-эпизоды (накопл.) | 23 | 116 | +93 |
| уникальных task_id | 7 | 61 | +54 |
| skill-инвокации | 6 | 19 | +13 |
| observer_error | 0 | 0 | — |
| schema_version v1 skipped | 5 | 5 | — |
Сильный рост скил-инвокаций в дельте (+13: writing-plans×3, systematic-debugging×3, TDD×3, regression×1, verify×1, security-go-live×1, brainstorming×1, dispatching-parallel-agents×1, executing-plans×1, process-analysis×1, verification-before-completion×1). Дисциплина выросла — спринты A8/C1/audit-journaling шли через структурированные skills.
Path-type distribution (n=116)
| path_type | count | % |
|---|---|---|
| improvised | 95 | 81.9% |
| regulated | 16 | 13.8% |
| mixed | 4 | 3.4% |
| alternative | 1 | 0.9% |
Regulated +0.8 п.п. vs ретро #2 (13.0 → 13.8%) — рост в абсолютных числах в 5×.
Outcome (inferred) distribution
| outcome | count | % |
|---|---|---|
| soft_success | 53 | 45.7% |
| success | 38 | 32.8% |
| unknown (хвост сессий) | 23 | 19.8% |
| blocked | 2 | 1.7% |
prompt_signal сигналов: 42 new_task / 65 neutral / 7 approval / 2 correction (1.7% rework rate — здоровый низкий уровень).
Factor matrix highlights
decision_provenance — кто решает?
| provenance | count | success | soft_success | blocked |
|---|---|---|---|---|
| autonomous | 86 | 27 | 36 | 2 |
| user_directed_method | 3 | 1 | 2 | — |
| user_chose_from_options | 27 | 10 | 15 | — |
user_chose_from_options=27 — сильный паттерн collaborative-choice (A/B/C → выбор заказчика). user_directed_method остаётся редким (3, healthy — заказчик НЕ навязывает методы).
economy_level
| economy_level | success | soft_success | blocked |
|---|---|---|---|
| null | 4 | 2 | — |
| 0 | 1 | — | 1 |
| 5 | 4 | 1 | — |
| 100 | 29 | 50 | 1 |
Доминирует уровень 100 (стандарт); 0 дал единственный blocked. Никаких аномалий.
post_compaction × session_segment
Post-compaction эпизодов 43, исходов нормально (14 success / 22 soft_success). Late-segment всего 11 — длинные сессии редки.
Missed activations (Pravila §16.4 v1.36 conditional rule)
Total: 40 (из 44 v2-эпизодов с непустым классификационным мэппингом, node_chosen='direct'; экспект-узлы все non-dormant).
By classification
| classification | episodes | bypassed nodes |
|---|---|---|
| question | 17 | #60 context7 |
| memory-sync | 8 | #33 claude-md-management |
| feature | 5 | #19 Superpowers |
| bugfix | 4 | #18 Pest, #34 Sentry |
| planning | 2 | #19, #41 CCPM, #42 product-management |
| refactor | 1 | #11/#12/#43/#64/#65 |
| cleanup | 1 | #11/#12 |
| monitoring | 1 | #34/#35 Redis |
| analysis | 1 | #25/#39/#53 |
Анализ — ЧТО ИЗ ЭТОГО реально промах vs шум классификатора
- #60 context7 (17 question) — большая часть «question» в логах это разговорные уточнения с заказчиком («что выбираем», «а ты пробовал», «делай»), не library-docs-вопросы. Текущий маппинг
question → [#60]слишком широкий. Кандидат: сузить — либо разделить классификатор (question_lib_docsvsquestion_conversational), либо снять#60из маппинга и оставить пустой массив до появления узкого классификатора. Сейчас 17 «промахов» — шум. - #33 claude-md-management (8 memory-sync) —
memory-syncв эпизодах = правкиmemory/*.md(auto-memory system), а не правки CLAUDE.md.#33относится кCLAUDE.md(§5 п.10 hard-rule), не к memory-файлам. Кандидат: очистить маппингmemory-sync → []ИЛИ переименовать вclaude-md-editи оставить только для правок CLAUDE.md. - #19 Superpowers (5 feature + 2 planning) — это реальные промахи: feature-задачи без
brainstorming/writing-plans. Сверка по дельте: новых features в дельте было ~5 (A8 install, C1 plugin enable, pg_audit setup и т.д.) — большинство шли autonomous direct. Возможно стоит фиксировать, особенно после Pravila §12 hard-rule. Кандидат: мягкий сигнал в STATUS.md (не дальше), решение за заказчиком. - #18 Pest / #34 Sentry (4 bugfix) — Pest для bugfix очевиден, но Sentry на проде ещё не деплоен (Б-1). #34 в DEFERRED не записан, но фактически бесполезен. Кандидат: проверить
tools/.node-dormancy.json— должен ли #34 бытьdormant: trueдо Sentry-деплоя?
Кандидаты на пересмотр observer-classification-map.json
| key | текущее значение | предлагаемая правка | обоснование |
|---|---|---|---|
question |
["#60"] |
[] |
разговорные вопросы ≠ library-docs-lookup; ложноположительных 17×, прав один-два максимум |
memory-sync |
["#33"] |
[] |
#33 канал ТОЛЬКО для CLAUDE.md (§5 п.10), а не memory/*.md (auto-memory не пинует через #33) |
bugfix |
["#18","#34"] |
оставить или ["#18"] пока Sentry не работает |
проверить, не стоит ли пометить #34 dormant до Б-1 |
Causal chains
23 цепочки shared-files обнаружено (≥5 минутный интервал, общие файлы в task_size). Ключевые:
ЭТАЛОН.md— 6+ цепочек 20.05 (правки эталона за день). Ожидаемо — день большого обновления эталона.SyncSupplierProjectJob.php/SyncSupplierProjectsJob.php— цепочка 20→22.05 (Plan 5 supplier-sync fix → retry-storm fix0c9357a).AppLayout.vue— 20.05 две правки.
Нет «error→fix loop» цепочек, которые бы указывали на повторяющийся баг.
Skill invocations (delta, n=13)
| skill | times |
|---|---|
| superpowers:writing-plans | 3 |
| superpowers:systematic-debugging | 3 |
| superpowers:test-driven-development | 3 |
| superpowers:verification-before-completion | 1 |
| superpowers:brainstorming | 1 |
| superpowers:dispatching-parallel-agents | 1 |
| superpowers:executing-plans | 1 |
| regression | 1 |
| verify | 1 |
| security-go-live | 1 |
| process-analysis | 1 |
| brain-retro | 0 (сейчас 1, после записи) |
Покрытие L1-L15 chain'ов: L1=4, L8=4, L15=1, L3=1 (security-go-live). Большая часть — direct.
Errors / retries / time_burn (delta)
133 errors / 116 retries / 17 time_burn events. Кажется много, но распределено по 105 эпизодов — в среднем ~1.3 error/episode. Спринты A8 install (curl/tar quirks), pg_audit build (Rust/pgrx), audit journaling (миграции), 7-дыр follow-up (lefthook quirks) генерировали много retry в Bash без скрытых проблем.
Candidates for owner review
Все ниже — кандидаты, не правки. Применять только по явному «делай» от заказчика.
A. observer-classification-map.json (tools/observer-classification-map.json)
A1. question → [] (сейчас ["#60"]). Сузить классификатор или снять #60.
- Why: 17 разговорных question-эпизодов ловятся как missed-activation к context7. Шум.
- Rejection-option: оставить как есть и считать missed-activations информационным шумом, не сигналом.
A2. memory-sync → [] (сейчас ["#33"]).
- Why: #33 claude-md-management — канал ТОЛЬКО для CLAUDE.md (Pravila §5 п.10), а не memory/*.md. Auto-memory system пинует напрямую.
- Rejection-option: переименовать классификатор в
claude-md-editи сохранить #33.
B. node-dormancy.json (tools/.node-dormancy.json)
B1. Проверить #34 Sentry MCP — должен ли быть dormant: true до Б-1 (Sentry instance не задеплоен на проде, использовать нельзя).
- Why: missed-activation для bugfix включает #34, но #34 фактически нерабочий до Б-1.
- Rejection-option: оставить — Sentry MCP установлен в Claude и теоретически доступен; «прод не задеплоен» не равно «инструмент dormant».
C. STATUS.md C5 missed-activations
C1. Surface 40 missed activations с разбивкой по классификации в STATUS.md (текущий статус-генератор уже это умеет — после обновления маппинга цифра упадёт до ~15).
- Why: наглядная метрика «промахов роутинга» в дашборде.
- Rejection-option: не surface, оставить только в brain-retro заметках.
D. Pravila §12 — feature без Superpowers
D1. Зафиксировать в feedback-memory правило «feature/planning-задачи ИДУТ через Superpowers writing-plans, даже если задача кажется простой» — сейчас 7 feature/planning-эпизодов в дельте прошли direct.
- Why: Pravila §12 hard-rule предписывает skill-инвокацию первой для 14 типов; feature/planning в списке.
- Rejection-option: считать «autonomous direct для маленьких feature нормой», не фиксировать.
E. Авто-обновление observer-classification-map после прочтения этого retro
- Маппинг живёт в
tools/observer-classification-map.json. Кандидаты A1/A2 — однострочные правки. - НЕ автоматизирую — жду явного «делай A1 / делай A2 / делай оба».
Behavioral rule check (Pravila §16.4)
- «Не использован ≠ проблема» — соблюдено: я различаю capability-readiness (
otherбез рекомендаций, 69 эпизодов) от missed activation (40 эпизодов с маппингом + direct + non-dormant). Только последние сурфейсятся как сигнал.
Что НЕ меняется этим retro
- НЕ редактирую
tools/observer-classification-map.json,tools/.node-dormancy.json, STATUS.md политики, нормативку, code. - НЕ пишу в episodes-*.jsonl (read-only).
- НЕ trigger'у auto-memory.
- STATUS.md перегенерируется через
node tools/status-md-generator.mjs(см. шаг 8a процедуры — выполняется ниже).