Files
portal/docs/observer/notes/2026-05-23-brain-retro.md
T
Дмитрий 65ce222fe9 chore(brain-retro): #3 retro + map/dormancy hygiene (A1/A2/B1/D1)
Brain-retro #3 за весь май 2026 — 116 v2-эпизодов / 61 task_ref.
Здоровье: 0 observer_error, 1.7% correction-rate, 19 skill-инвокаций
(vs 6 в ретро #2 — рост в 3×).

Применены 4 кандидата по явному «делай» от заказчика:

A1. observer-classification-map.json: question → [] (был ["#60"])
    Разговорные RU-вопросы давали 17/40 false-positive промахов против context7.

A2. observer-classification-map.json: memory-sync → [] (был ["#33"])
    #33 claude-md-management — канал ТОЛЬКО для CLAUDE.md (Pravila §5 п.10),
    не для memory/*.md. Давало 8/40 false-positive.

B1. Tooling §4.8 #34 Sentry MCP — boundaries +DEFERRED
    Sentry instance не задеплоен (pending Б-1). Двойной сигнал
    extractor'а → .node-dormancy.json[#34] = true.

D1. memory/feedback_feature_via_writing_plans.md (user-memory вне git).

Effect: missed-activations 40 → 15 после очистки шума. Из 15 реально
значимы 2 эпизода (audit-journaling closure 116 tools без writing-plans;
SyncSupplierProjectJobTest planning без skill). Остальные 13 — шум
классификатора на правках своих документов.

+cspell-words.txt: 20 слов (9 секций Tooling + 11 из retro-note).

NB: docs/observer/episodes-2026-05.jsonl снят со staging — gitleaks
обнаружил 3× RU-phone leak (`ru-phone-unmasked` rule). Это сигнал что
observer PII-фильтр пропустил телефон в free-text record — отдельный
follow-up (PII фильтр Stop-хука).

Retro-отчёт: docs/observer/notes/2026-05-23-brain-retro.md.
STATUS.md перегенерирован.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 12:09:55 +03:00

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