Files
portal/docs/observer/notes/2026-05-23-brain-retro.md
T
Дмитрий 963379c3d9 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

14 KiB
Raw Blame History

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