# 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](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_docs` vs `question_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 fix `0c9357a`). - **`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 процедуры — выполняется ниже).