# brain-retro #8 — 2026-05-27 13:00 UTC

**Период:** 2026-05-27 03:55 UTC (после retro #7) → 2026-05-27 12:38 UTC (≈8.7 ч).
**Эпизодов:** 67 (после dedupe + observer-errors filter; observerErrors=0).
**Задач (grouping):** 33.
**Reviewer:** batch mode (67 ≥ 20), Opus 4.7 / ProxyAPI, 67/67 reviewed, 0 errors, wall-clock 140.7с.

---

## 1. Семь обязательных цифровых срезов

### [1] Path-type breakdown

| path_type | count | % |
|---|---:|---:|
| improvised | 65 | 97.0% |
| regulated | 2 | 3.0% |

65 из 67 — improvised. На уровне retro #7 (95.7%), второй день подряд почти без skill-invocation.

### [2] node_chosen distribution (top-15)

| node | count | % |
|---|---:|---:|
| direct | 64 | 95.5% |
| superpowers:using-git-worktrees | 1 | 1.5% |
| superpowers:brainstorming | 1 | 1.5% |
| subagent-driven-development | 1 | 1.5% |

64 из 67 — direct. Только 3 явных skill-вызова за 8.7 часов работы.

### [3] recommended_node distribution

| recommended | count | % |
|---|---:|---:|
| null (нет рекомендации) | 60 | 89.6% |
| #37 (mermaid-skill) | 4 | 6.0% |
| #18 (Pest) | 1 | 1.5% |
| #25 (Semgrep) | 1 | 1.5% |
| #11 (Pint) | 1 | 1.5% |

60 эпизодов классификатор оставил без рекомендации (типично для коротких вопросов и notification'ов). 7 эпизодов получили конкретную рекомендацию.

### [4] GAP «рекомендован, но выбран direct»

| recommended | count | rework | rework_rate |
|---|---:|---:|---:|
| #37 | 4 | 1 | 25.0% |
| #18 | 1 | 1 | 100.0% |
| #25 | 1 | 1 | 100.0% |
| #11 | 1 | 0 | 0.0% |
| **итого GAP** | **6** | **3** | **50.0%** |

Из 6 GAP-эпизодов половина (3) переоценена reviewer как rework. См. §5 «Расследование 6 GAP».

### [5] outcome × node_chosen group (после Opus-review)

| group | count | success | soft_success | rework | blocked | rework_rate |
|---|---:|---:|---:|---:|---:|---:|
| skill_used | 3 | 1 | 1 | 0 | 1 | 0.0% |
| direct_no_rec | 58 | 15 | 29 | 10 | 4 | 17.2% |
| direct_ignored_rec | 6 | 0 | 3 | 3 | 0 | **50.0%** |
| **итого** | **67** | **16** | **33** | **13** | **5** | **19.4%** |

**Ключевой разрыв:** deterministic analyzer показывал 0 rework (см. §3), Opus-reviewer нашёл **13 переделок + 5 блокировок** (27% не-успешных). Inference из `prompt_signal` не ловит rework в коротких рабочих днях (мало эпизодов подряд, signal-кадр не пересекается). **Полагаться только на анализатор без reviewer — слепо за 13 rework.**

### [6] classifier_output presence by source

| source | count | % |
|---|---:|---:|
| llm | 29 | 43.3% |
| prefilter | 23 | 34.3% |
| regex | 10 | 14.9% |
| prefilter_inherited | 3 | 4.5% |
| cache | 2 | 3.0% |
| **null** | **0** | **0%** |

**Классификатор живой и здоровый** — 0 NULL за весь день, ни одного парс-фейла или таймаута. LLM-source 43% — typical после `feedback_windows_tls_handshake.md` фикса (timeout 60s).

### [7] Per-classification: trigger-match + via-skill

| classification | total | trigger_matched | via_skill |
|---|---:|---:|---:|
| other | 37 | 4 | 3 |
| question | 13 | 0 | 0 |
| release | 7 | 0 | 0 |
| monitoring | 7 | 0 | 0 |
| bugfix | 1 | 0 | 0 |
| planning | 1 | 0 | 0 |
| cleanup | 1 | 0 | 0 |

`other` доминирует (55%), как обычно. `question`+`release`+`monitoring` (40%) — это reactive-режим (отвечать/смотреть/наблюдать), navigation-skills там не уместны. Зато **0 via_skill в `bugfix`/`planning`** — нетипично, мини-задача, требует наблюдения.

---

## 2. Состояние классификатора

Здоровый: 0 NULL, source distribution распределена (llm 43% / prefilter 34% / regex 15%). Сравнение с retro #7: тогда был аналогичный паттерн (LLM работает, prefilter ловит короткие).

**Стоимость классификатора:** 3 373 input + 23 382 output токенов за 67 эпизодов ≈ \$0.10-0.15 (грубо, по ProxyAPI rate). Дешёво.

---

## 3. Reviewer-судьи: распределение вердиктов

### Node quality (выбор узла)

| verdict | count | % |
|---|---:|---:|
| correct | 25 | 37.3% |
| disputable | 31 | 46.3% |
| wrong_node | 11 | 16.4% |

**46.3% disputable** — половина выборов спорные. **16.4% wrong_node** — каждый шестой эпизод узел выбран неправильно. Высокая доля «спорных» в день вопросов — нормально (нет однозначного правильного ответа), но 11 wrong_node не нормально.

### Agent self-assessment accuracy

| verdict | count | % |
|---|---:|---:|
| accurate | 38 | 56.7% |
| no_self_assessment | 29 | 43.3% |

**43.3% эпизодов БЕЗ self-assessment вообще.** Хук `self-assessment` не отрабатывает на каждом ходе. Когда self-assessment есть — он accurate в 100% (38/38).

---

## 4. Sanity check (заказчик)

Три вопроса, заданы простым языком:

| вопрос | ответ |
|---|---|
| Direct ignored 6 рекомендаций — ложные или реальные промахи? | «Не помню — проверь сам» |
| 97% direct — день вопросов или procedure bypass? | «Сложно сказать» |
| 0 rework в analyzer — реально чисто или наблюдатель пропустил? | «Не помню» |

Ответы записаны в `docs/observer/sanity-checks/2026-05-27.json` (PII-фильтр прогнан).

Заказчик делегировал расследование (Q1: «проверь сам») — см. §5.

---

## 5. Расследование 6 GAP (по запросу заказчика)

| # | время | task | recommended | reviewer node_quality | outcome | вердикт |
|---|---|---|---:|---|---|---|
| 1 | 04:05 | b11f6b8d | #37 | disputable | soft_success | защитимо |
| 2 | 04:09 | b11f6b8d | #37 | wrong_node | **rework** | **промах** |
| 3 | 05:32 | b11f6b8d | #18 | wrong_node | **rework** | **промах** |
| 4 | 07:16 | 0ade4c82 | #25 | wrong_node | **rework** | **промах** |
| 5 | 08:14 | 0ade4c82 | #37 | disputable | soft_success | защитимо |
| 6 | 12:31 | 0ade4c82 | #11 | disputable | soft_success | защитимо |

**3 защитимых, 3 промаха.**

Все 3 промаха — короткие task-notification'ы от background-команд (Bash run_in_background → завершение фоновой задачи → router-вход с trigger'ом). Pattern:

- Notification приходит как обычная user-задача
- Классификатор смотрит триггеры (release/Pest/Semgrep) → рекомендует узел
- Я отвечаю direct, потому что «это просто notification, реальной работы нет»
- Override не объявляю — Pravila §17 этого не предусматривает для bg-notification
- Reviewer Opus справедливо говорит: «или зови узел, или явно override»

**Это не «лень не вызывать узел» — это разрыв в Pravila §17 + ADR-016 (universal skill-coverage):** правила не описывают bg-notification как отдельный класс, поэтому я либо нарушаю их direct'ом, либо вынужденно зову неуместный узел.

---

## 6. Missed activations

`analyzer.missedActivations.totalMissed`: 0 за период (типичный show-stopper для день-вопросов).

---

## 7. Causal chains

`analyzer.causalChains.length`: 0. Анализатор не нашёл явных «error → fix» пар. Reviewer нашёл 13 rework, но они без явной коррекции в этом же ходе (исправление вынесено в следующий ход или вообще не происходит).

---

## 8. Self-retrospect trigger

Counter `docs/observer/.self-retrospect-counter.json`:

- `episodes_since_last`: **609** (после +67 за этот retro)
- `last_run_at`: **null** (никогда не запускали)
- Порог: 50 эпизодов

**Сильно превышен.** Опт-ин предложение заказчику — см. §11.

---

## 9. Cost report

| метрика | значение |
|---|---:|
| input_tokens (main loop) | 1 313 |
| output_tokens (main loop) | 453 422 |
| cache_read | 159 238 917 |
| cache_create | 8 548 887 |
| classifier_in | 3 373 |
| classifier_out | 23 382 |
| reviewer (batch direct API) | ~\$0.10-0.20 (грубо, 67 × Opus-call) |
| self_assessment | 0 (хук молчит) |
| total tool_calls | 181 |
| total iterations | 505 |

Cache-hit-rate ≈ 95% (159M read / 8.5M create). `cost-daily.json` файла нет (`~/.claude/runtime/cost-daily.json` не существует — отдельный TODO для cost-tracker).

---

## 10. Candidates for owner review

### C1 — Override pattern для bg-notification

**Что:** Pravila §17 + ADR-016 не описывают `background task-notification` как класс. Сейчас 100% таких эпизодов идут через router, классификатор рекомендует release/Pest/Semgrep по триггерам в Bash-команде, я выбираю direct, reviewer ловит как wrong_node + rework.

**Где источник:** `tools/observer-routing-detector.mjs` (router treats notifications as regular tasks), Pravila §17.

**Предлагаемая правка:**

- Вариант А: добавить `prompt_signal: "bg_notification"` детектируемый по pattern `<task-notification>` в prompt; routing-gate пропускает direct без override
- Вариант Б: формализовать override-фразу «bg-notification ack» как разрешённый short-circuit

**Rationale:** 3 из 3 wrong_node в GAP — это bg-notification. Снижение rework на ≈8 эпизодов в день (по экстраполяции на reactive-дни).

**Альтернатива:** отклонить — оставить как есть, считать что reviewer-Opus просто consistently недооценивает defaulting direct в bg-кейсах.

---

### C2 — Self-assessment hook молчит в 43% эпизодов

**Что:** 29 из 67 эпизодов вообще без self-assessment (`agent_self_assessment_accuracy: no_self_assessment`). Когда self-assessment есть — 100% accurate.

**Где источник:** хук self-assessment, скорее всего в `.claude/settings.json` Stop-hook chain.

**Предлагаемая правка:**

- Расследовать почему 43% пропусков (timeout? exception? early-return?)
- Если хук работает условно (например только при `tool_calls > 0`) — пересмотреть условие или формализовать exception

**Rationale:** без self-assessment reviewer теряет доступ к моей собственной оценке низкой уверенности → менее точные verdicts. Self-assessment накладные 80-200 токенов, удешевляет downstream review.

**Альтернатива:** отклонить — оставить как фичу (self-assessment только когда я уверен что он нужен).

---

### C3 — self-retrospect долг (609 эпизодов)

**Что:** `episodes_since_last: 609`, `last_run_at: null`. Порог 50. Skill `self-retrospect` существует в `.claude/skills/`, ни разу не запускался.

**Где источник:** `docs/observer/.self-retrospect-counter.json` + spec §4.8.

**Предлагаемая правка:** заказчик запускает `/self-retrospect` (опт-ин) для разовой self-review.

**Rationale:** контроллер 12+ дней роутит без рефлексии собственного паттерна → паттерны wrong_node могут быть систематическими, self-retrospect выделит их раньше следующего retro.

**Альтернатива:** счётчик не показатель — отключить пороговое предложение из /brain-retro.

---

### C4 — Reviewer как обязательный шаг каждого retro

**Что:** Без Opus-reviewer этот retro показал бы «0 rework, всё чисто» (deterministic inference из prompt_signal не сработал). С reviewer — 13 rework, 5 blocked.

**Где источник:** brain-retro skill, §5b — сейчас «batch mode default». Возможно усилить как mandatory.

**Предлагаемая правка:** в SKILL.md §5b ужесточить: для retro с ≥20 эпизодами batch reviewer обязателен, текущий fallback `direct_api_batch` — единственный mode.

**Rationale:** статический inference из prompt_signal требует плотности эпизодов (соседство в JSONL), на reactive-днях не работает. Reviewer — единственный достоверный источник outcome.

**Альтернатива:** оставить batch как default, не повышать формального обязательства.

---

## 11. Эскалации заказчику

1. **C3:** self-retrospect долг 609 эпизодов — запустить `/self-retrospect` (опт-ин). При нежелании — отключить пороговое предложение в /brain-retro skill.
2. **C1 vs C4:** выбор как покрывать bg-notification GAP — нормативно (C1) или процедурно (C4 reviewer fishes их каждый retro).
3. **C2:** разобраться с self-assessment-хуком (43% пропуск) или формализовать exception.

---

## 12. Сравнение с retro #7 (тренд)

| метрика | retro #7 (11.5ч) | retro #8 (8.7ч) | тренд |
|---|---:|---:|---|
| эпизодов | 23 | 67 | +191% |
| improvised | 95.7% | 97.0% | стабильно |
| via_skill | 1/23 = 4.3% | 3/67 = 4.5% | стабильно |
| classifier NULL | 0 | 0 | стабильно |
| reviewer rework | (нет данных в #7 отчёте) | 19.4% | новая точка |
| wrong_node | (нет данных) | 16.4% | новая точка |

Retro #8 первый, где встроенные digital tables дают плотный срез по reviewer-вердиктам. Следующий retro будет иметь точку сравнения.

---

## Запись завершена

Никакой автоматической правки нормативки не выполнено. Все §10 кандидаты ждут решения заказчика.
