# Brain-retro #2 — весь май 2026 (полный срез)

**Дата:** 2026-05-20 (вечер, ~17:55 MSK)
**Период:** весь май 2026 — 2026-05-19T05:18Z .. 2026-05-20T08:58Z (28 строк JSONL; 23 v2-эпизода + 5 v1 пропущено).
**Источник:** `docs/observer/episodes-2026-05.jsonl` (28 строк) + `docs/observer/.read-counter.json`.
**Анализатор:** `node tools/brain-retro-analyzer.mjs docs/observer/episodes-2026-05.jsonl`.
**Отношение к предыдущему ретро:** надстройка над [2026-05-20-brain-retro.md](2026-05-20-brain-retro.md) (то — 17 v2-эпизодов, 12:25 MSK); здесь — те же 17 + дельта в 6 новых.
**Уровень анализа:** верхнеуровневый по запросу заказчика; экономия 100%.

> Анализатор: `episodeCount=23`, `v1SkippedCount=5`, `observerErrorCount=0`. Все цифры по 23 v2-эпизодам, если не отмечено иное.

---

## Period

2026-05-19T05:18:16Z .. 2026-05-20T08:58:44Z. **7 уникальных task_id (сессий)**, 23 v2-анализируемых эпизода.

Дельта vs прошлое ретро (6 новых эпизодов после 2026-05-20T08:12:29Z):

| task_id | turn | start..end (Z) | path_type | provenance | node_chosen | econ | tool_calls | files | events примечательное | inferred outcome |
|---|---|---|---|---|---|---|---|---|---|---|
| `98298ec2` | 5 | 08:13..08:19 | improvised | autonomous | direct | 100 | 19 | 4 | 2× error tool_result + 2× retry | success (continuation) |
| `35fc31da` | 1 | 08:16..08:24 | improvised | autonomous | **brain-retro** | 0 | 20 | 6 | skill_invoked brain-retro | **rework** (следующий ход — correction) |
| `35fc31da` | 2 | 08:30..08:36 | improvised | autonomous | direct | 5 | 17 | 4 | 1× error + retry; prompt_signal=**correction** | success |
| `35fc31da` | 3 | 08:36..08:37 | improvised | user_directed_method (`claude_would_have_chosen=brain-retro`) | direct | null | 0 | 0 | — | unknown (no-op ход) |
| `35fc31da` | 4 | 08:39..08:46 | improvised | autonomous | direct | 0 | 15 | 14 | 14× Read mass | success |
| `286dd904` | 2 | 07:52..08:58 | **regulated** | **user_chose_from_options** ("На Plan 3 (экспорт)") | **superpowers:verification-before-completion** | 5 | 133 | 25 | skill_invoked verification; 1× error; **time_burn 66 мин** | unknown (нет следующего эпизода) |

---

## Path-type distribution (v2, n=23)

| path_type | count | % |
|---|---|---|
| improvised | 20 | 87.0% |
| regulated | 3 | 13.0% |
| alternative | 0 | 0% |
| mixed | 0 | 0% |

Доля regulated на 4.6 п.п. ниже прошлого ретро (17.6% → 13.0%) — три новых improvised-эпизода без skill в дельте сдвинули долю.

## Outcome distribution

| outcome | count | % |
|---|---|---|
| success (inferred) | 9 | 39.1% |
| rework (inferred) | 1 | 4.3% |
| unknown (последние/нет следующего) | 13 | 56.5% |

«Unknown» здесь — это эпизоды, после которых нет хода с positive/correction-сигналом (хвост сессий) — не provenance-bug.

## Skill invocations (events `skill_invoked`, n=6)

| skill | times | sessions |
|---|---|---|
| superpowers:verification-before-completion | 2 | `553717ec`, `286dd904` |
| superpowers:systematic-debugging | 1 | `553717ec` |
| superpowers:test-driven-development | 1 | `553717ec` |
| claude-md-management:claude-md-improver | 1 | `553717ec` |
| brain-retro | 1 | `35fc31da` |

## Factor analysis matrix (analyzer `factorMatrix`)

### decision_provenance — «rework мой или роутера?»

| provenance | success | rework | unknown |
|---|---|---|---|
| autonomous | 6 | 1 | 10 |
| user_directed_method | 2 | 0 | 2 |
| user_chose_from_options | 0 | 0 | 2 |

Единственный rework (`brain-retro` turn 1) — autonomous-выбор узла brain-retro заказчиком (это сам skill, инвокированный по `/brain-retro`); коррекция — про точность аналитики прошлого ретро, не про routing. **«Rework мой, не роутера.»**

### economy_level

| economy_level | success | rework | unknown |
|---|---|---|---|
| null | 3 | 0 | 2 |
| 0 | 0 | 1 | 2 |
| 5 | 4 | 0 | 6 |
| 100 | 1 | 0 | 4 |

Слишком маленькая выборка для выводов; единственный rework на 0% — это brain-retro turn 1 (для самого ретро economy=0% это норма, заказчик так попросил).

### model · post_compaction · task_size

| factor value | success | rework | unknown |
|---|---|---|---|
| model: claude-opus-4-7 | 8 | 1 | 14 |
| post_compaction=true | 6 | 0 | 5 |
| post_compaction=false | 2 | 1 | 9 |
| session_turn late (≥10) | 6 | 0 | 5 |
| session_turn early (<10) | 2 | 1 | 9 |
| task_size small | 8 | 0 | 11 |
| task_size medium | 0 | 1 | 2 |
| task_size large | 0 | 0 | 1 |

Все эпизоды на одной модели → строка про model — не сигнал. Post_compaction=true и late session_turn — это одна и та же длинная brain-governance сессия `553717ec` (turn 82+); концентрация success там — артефакт сессии, не закономерность.

### node_chosen · task_classification

| node_chosen | success | rework | unknown |
|---|---|---|---|
| direct | 8 | 0 | 11 |
| superpowers:verification-before-completion | 0 | 0 | 1 |
| superpowers:systematic-debugging | 0 | 0 | 1 |
| superpowers:test-driven-development | 0 | 0 | 1 |
| brain-retro | 0 | 1 | 0 |

| task_classification | success | rework | unknown |
|---|---|---|---|
| bugfix | 2 | 0 | 1 |
| feature | 2 | 0 | 2 |
| other | 3 | 0 | 9 |
| refactor | 1 | 0 | 0 |
| question | 0 | 1 | 2 |

«direct» — 8/0/11 — основная масса задач без skill-маршрутизации, всё работает. superpowers-узлы (3 эпизода, все unknown) сидят в хвостах своих сессий — нет следующего хода с явным signal.

## Episodes → tasks (analyzer `tasks`, 15 task-групп)

| task_ref | episodes | rework turns |
|---|---|---|
| `553717ec#1..#10` | 10 | turn 82 (rework — improvised CLAUDE.md edit, retry-recovered) |
| `24acfa10#1` | 1 | — |
| `a42e4ba5#1` | 1 | — |
| `dd905ea0#1` | 1 | — |
| `98298ec2#1..#3` | 3 (continuation across 5 turns) | — |
| `35fc31da#1..#4` | 4 | turn 1 (brain-retro) — correction в turn 2 |
| `286dd904#1` | 1 (66-min verification) | — |

## Causal-chain candidates (analyzer `causalChains`)

| from | to | shared files |
|---|---|---|
| — | — | — |

Анализатор не нашёл «errored episode → fix episode на тех же файлах». 7 событий error (`tool_result reported is_error`) — это transient-сбои тулов внутри одного эпизода с retry-recovery, не межэпизодные.

## Observer health

- `observerErrorCount = 0` — за весь май **ни одного** `observer_error`-маркера. Парсер ни разу не сломался тихо.
- `interrupts = 0` — заказчик ни разу не прерывал ход.
- `errors = 7` (внутри 5 эпизодов) — все transient, retry-recovered.
- `retries = 6` — корреспондируют ошибкам один-в-один (один retry бесплатный после restart-tooling).
- `time_burn_total = 86 мин` — из них 66 мин — один эпизод `286dd904#2` (длинная verification-сессия Plan 2 экспорт).

## Canonical chains L1–L12 hit rate

Не считаем за май — нет атрибуции `chain_ref`; routing-таблица `docs/routing-off-phase.md` v1.2 ещё не интегрирована в primary_rationale. Кандидат на доработку парсера — см. ниже.

## Improvised chains (повторённые ≥2)

| node-set | times | candidate L13+? |
|---|---|---|
| direct → direct (continuation в одной сессии) | 14 | нет — это норма, не цепочка |

Других повторов нет.

## chain_divergence cases

Нет атрибуции — пропуск.

## Top error classes

| error class | count | recovery pattern |
|---|---|---|
| `tool_result reported is_error` (transient) | 7 | retry в том же эпизоде, без user-intervention |

## confusion_marker hot-spots

Нет таких маркеров в схеме v2 — пропуск.

---

## Candidates for owner review

### Candidate 1: уточнить analyzer для дельта-сравнения с предыдущим ретро

- **Type:** doc/skill enhancement, не нормативная правка.
- **Evidence:** прошлое ретро (35fc31da#1) → `prompt_signal=correction` следующего хода (35fc31da#2). Анализатор корректно пометил `outcome=rework`, но в выводе нет указателя на номер прошлого ретро или diff vs предыдущий.
- **Suggested action:** в `tools/brain-retro-analyzer.mjs` добавить опциональный аргумент `--since <ISO>` (срез по `started_at >= since`), чтобы можно было дёшево считать только дельту между ретро. Альтернатива: в шаблоне `.claude/skills/brain-retro/references/aggregation-template.md` добавить секцию «Delta vs prior retro» с явным diff'ом.
- **Cost / risk:** низкий; чистый node-скрипт без побочек на JSONL. Сейчас процесс ручной (этот ретро diff делался руками).
- **Rejection option:** заказчик может сказать «всегда срез — полный месяц», и тогда диффы не нужны.

### Candidate 2: атрибуция canonical chains L1–L12 в primary_rationale

- **Type:** observer schema extension (потребует amend ADR-011 / spec factor-analysis).
- **Evidence:** ни один из 23 эпизодов не несёт ссылки на L1–L12 chain из `docs/routing-off-phase.md` v1.2 (а с finance-tooling — там уже L1–L13). «Canonical chains hit rate» — пустая таблица.
- **Suggested action:** в `tools/observer-routing-detector.mjs` (или новый детектор) маппить выбранные узлы в L-цепочку и писать `primary_rationale.chain_ref: "L7"` (например). Только тогда можно отслеживать чистоту следования цепочкам.
- **Cost / risk:** средний — нужен маппинг «node_chosen → L-chain», который сейчас живёт только в человеческом тексте routing-off-phase.md. Риск: дрейф маппинга между парсером и документом.
- **Rejection option:** оставить L1–L13 как нормативное «чтение для человека», не пытаться формализовать.

### Candidate 3: проверить корректность аналитики прошлого ретро

- **Type:** ad-hoc review (не нормативка).
- **Evidence:** rework-flag на 35fc31da#1 — единственный rework в выборке. Я (текущее ретро) дельту посчитал и нашёл, что предыдущее ретро отчиталось «17 эпизодов, 5 v1 пропущено» — это совпадает с записанным; коррекция была про что-то другое (содержание ретро, не структура). Без доступа к самой формулировке коррекции (`35fc31da#2` body) можно только сказать: коррекция структурно не была про observability, а про текст ретро.
- **Suggested action:** заказчик при желании может прокомментировать «что именно правил после ретро 12:25», и записать урок в notes. **Не блокирующее.**
- **Rejection option:** игнорировать — мелкая коррекция текста, не системный сигнал.

(Других кандидатов нет. Никаких removals/zombie nodes per memory `feedback_brain_unused_tools_not_problem`.)

---

## Informational metrics (NOT alerts)

- Узлов, использованных хотя бы раз за период (явно через `skill_invoked`): **5 / 63+** (superpowers TDD/debug/verify, claude-md-improver, brain-retro). Узел `direct` (=прямое исполнение) — отдельная категория, 19 эпизодов.
- Узлов, ни разу не использованных с начала наблюдения: **большинство (≥55 из 63+)** — **не проблема** per [feedback_brain_unused_tools_not_problem](../../../../C:/Users/Administrator/.claude/projects/c---------------------crm-------------/memory/feedback_brain_unused_tools_not_problem.md). Capability-readiness — осознанная стратегия заказчика.
- Параллельные сессии: 12 эпизодов из 23 (52%) с `parallel_session=true` — норма для текущего рабочего режима с §15 Pravila.
- Длинные эпизоды (`time_burn` событие): 1 — `286dd904#2` 66 мин (Plan 2 экспорт verification). Все остальные — без time_burn-маркера (под 60 мин).

---

## Дельта vs прошлое ретро 2026-05-20 12:25 — итог

- Картина устойчива: improvised-доминанта, opus-4-7-only, 0 observer_error, rework на autonomous-выборах единичный.
- Новый класс события: **`prompt_signal=correction` после skill-инвокации** (35fc31da#1 → #2). Раньше correction наблюдался только на autonomous direct-выборах; теперь видно, что brain-retro skill тоже не неприкосновенен — это здоровый сигнал.
- Новый успешный кейс гибридной модели: **`user_chose_from_options` → regulated path** (286dd904#2, 66 мин, 133 tool_calls, через superpowers:verification-before-completion). Это первое подтверждение, что collaborative-choice + skill-маршрутизация даёт длинные продуктивные эпизоды без interruptions.
- Никаких рекомендаций править Pravila / PSR_v1 / Tooling / CLAUDE.md — выборка (23 эпизода / 2 дня) слишком мала.
