Files
portal/docs/observer/notes/2026-05-27-brain-retro-8.md
T
Дмитрий fe922c3091 docs(session 2026-05-28): brain-retro 8/9, self-retrospect, sanity, Phase 1-3 plans
Groups documentation produced during 2026-05-28 brain-retro session:
retro notes 8 (carryover) and 9, self-retrospect 1, sanity check JSON,
three Phase plans for router-hooks fixes. All implementation already
pushed in earlier commits — this commit groups artifact metadata.

Plus typo fixes in self-retrospect (agregatov, seryj) and cspell vocab
extensions for session-specific terms (PAMYATKA / procs / russian verbs).

Pure documentation. No code, no normative drift.
2026-05-28 12:26:05 +03:00

301 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 кандидаты ждут решения заказчика.