# 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 процедуры — выполняется ниже).
