Files
portal/docs/observer/notes/2026-05-28-self-retrospect-2.md
T
Дмитрий 9704c539b4 docs(observer): brain-retro #10 + self-retrospect #2 notes from 28.05
Brain-retro #10 (10:47 МСК → ~16:30 МСК period, 27 episodes after retro #9):
- All 11 mandatory cuts including chain-hook effectiveness
- Batch reviewer pass on 27 episodes (~$2 Opus 4.7)
- Found 4 rework cases, all on ambiguous short prompts
- 4 candidates for owner review (self-retrospect counter quirk,
  enforce-clarify-short-prompts hook, cost-aggregator reviewer
  cost gap, factor-matrix low-signal marker)

Self-retrospect #2 (evening, after retro #10):
- 67 episodes since previous self-retrospect (~07:30 UTC)
- 88 override events in 6 hours (recovery 31, без скилов 57)
- 5 commitments from morning self-retrospect: 2 of 5 broken
- Conclusion: habits without enforcement do not hold
- 3 hook proposals documented for future work

Sanity-check answers persisted for retro #10 audit trail.

cspell-words.txt += триггернулась / triggerов / флагнутые /
ambig / deplo / обнулился / Ревьюер (Russian/English mixed
project terminology from observer notes).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 06:50:19 +03:00

10 KiB
Raw Blame History

date, kind, sequence, window, trigger, predecessor
date kind sequence window trigger predecessor
2026-05-28 self-retrospect 2
episodes_since_last_run episodes_in_file last_run_at
569 (counter reading) / 67 (since previous self-retrospect ~07:30 UTC) 752 null (counter never updated by previous skill invocation — quirk)
explicit «1. запустить снова» from owner after /brain-retro docs/observer/notes/2026-05-28-self-retrospect.md (same day ~07:30)

Self-retrospect #2 — 2026-05-28 (вечер)

Второй прогон скила за день. Триггер — Candidate 1 brain-retro #10 («counter показывает 569, last_run_at=null»). Окно для интроспекции — 67 эпизодов с предыдущего self-retrospect, плюс прямая проверка 5 commitments, которые я зафиксировал утром.

Метод

Утренний self-retrospect выдал 5 «привычек» (override-дисциплина / feature→план / Sentry-first / Semgrep на security-edit / coder-agent на массовое). Заметка прямо предупреждала: «если за 50-100 эпизодов паттерны не изменятся — повод для нового хука». 67 эпизодов прошли — проверяю.

Снимаю фактические цифры за окно, формулирую 3 наблюдения, спрашиваю заказчика — симптом или нет.

Наблюдения и вердикт заказчика

1. Override-дисциплина — 27+ событий в одной Phase 4 Task A сессии за 6 часов после обещания

Source: ~/.claude/runtime/override-usage.jsonl. Сессия 4a8b327e (Phase 4 Task A subagent crash → controller handoff) выжгла 27+ override-events за ~3 минуты — recovery + без скилов повторяющимся паттерном на каждый TDD-gate пропуск. Сессия b9f91f37 (Phase 5 inline) — ещё ~5 events.

Утренний commitment #1: «Прежде чем впечатать recovery или ремонт инфраструктуры — спросить себя „это правда инфра-фикс или я ленюсь дать verify?"».

Вердикт заказчика: сломана в обоих направлениях. И привычка не держится, и инфра (TDD-gate subagent handoff quirk) действительно сломана.

Что это значит:

  • Honest read: я знал утром что без enforcement привычка не удержится — и не удержалась. Доверять чистой self-discipline нельзя на этом классе действий, нужен хук.
  • Но в этой конкретной сессии часть override была объективно нужна: subagent (Sonnet) рухнул mid-Task с API socket error, controller подобрал работу, TDD-gate не видит subagent test-edit в моём transcript'е → каждый prod-edit упирается в gate. Это уже задокументировано в feedback_tdd_gate_subagent_handoff.md, но я этой памяти на момент Task A не дёрнул — снова игнорировал собственный опыт.
  • Конкретное действие: пушить Candidate 2 brain-retro #10 — хук enforce-clarify-short-prompts.mjs ИЛИ аналогичный override-counter (Phase 2 already done enforce-override-limit.mjs с порогом 5). Текущий лимит 5/день per phrase — но 27 событий в 3 минуты в одной phrase обходят его (счёт ведётся по дню, не по rate). Возможно нужно дополнить per-session или per-minute лимит.

2. 90% direct за 67 эпизодов — Phase 5 inline TDD вместо subagent

Source: 60/67 эпизодов node_chosen=direct. 3 brainstorming / 1 writing-plans (hard_floor) / 1 systematic-debugging / 1 graphify. Утренний commitment #2: «Любой запрос на „добавь X" / „сделай Y" требующий ≥3 шагов — сначала superpowers:writing-plans или superpowers:brainstorming, не сразу Edit/Write».

Phase 5 = 5 файлов (cost-pricing.mjs + cost-aggregator.mjs + cost-stop-hook.mjs + их .test.mjs) — это classic «массовое кодирование по шаблону», утренний commitment #5 явно говорит «суб-агент». Я делал inline за 4 turn'а контроллера.

Вердикт заказчика: план был (Phase 4/5 планы существуют, brainstorming-chain проходил ранее в день), но исполнение надо было делегировать. И то и другое.

Что это значит:

  • Commitment #2 (план-first) формально соблюдён — план был утром.
  • Commitment #5 (coder-agent на массовое) сломан — я сделал Phase 5 inline «для скорости», но reviewer (batch-mode на 27 эпизодах) фактически подтвердил: «Phase 5 можно было через subagent-driven».
  • Reflex: «я уже залип в этой задаче, быстрее самому сделать» — ровно та же лень, что утром констатировал.
  • Конкретное действие: при размере правки ≥4 файлов с одинаковым паттерном — обязан перед первым Edit вызвать Task() с coder-agent. Никаких «для скорости».

3. Reviewer-флагнутые «direct вместо clarify» — это симптом #1+#2, не новый паттерн

Source: brain-retro #10 §13 — 5 эпизодов где reviewer пометил wrong_node / underkill / mistake_should_not_start на коротких промптах («пробуй готово» / «делай дальше» / «да давай» / «deplo» / «подбери все хвосты»).

Я предположил что это новая привычка, не покрытая утренним списком.

Вердикт заказчика: не было явно в commitments, но входит в #1 (override) и #2 (plan-first).

Что это значит:

  • Reflex chain: короткий ambiguous prompt → не вижу очевидного skill match → use direct → если потом классификатор/хук возражает → override через без скилов/recovery. То есть «прыжок в direct» и «реакция override» — две стороны одного паттерна.
  • Это переоткрывает утренний commitment #1 более широко: дисциплина не только в написании override, но в первичном решении идти direct без clarify.
  • Конкретное действие: на коротких промптах (≤25 chars) с classifier source prefilter/regex (= не дотянулись до LLM-этапа) обязательная AskUserQuestion clarify перед mutating tool. Это новый порядок, который я хочу пройти через Pravila §17 или хук.

Сравнение с утренним прогоном

Утренний self-retrospect зафиксировал 5 «привычек». Этот вечерний прогон проверил факт-trail:

Commitment Status за 67 эпизодов
#1 Override-дисциплина Сломан (27+ events за одну сессию, заказчик согласен)
#2 Feature → план first Формально OK (планы Phase 4/5 утром были)
#3 Симптом с боевого → Sentry first Не было профильных задач за период
#4 Security-edit → Semgrep Не было профильных задач (но именно для этого был выкачен Phase 4 хук Semgrep — сам теперь enforce'ит)
#5 Объёмное → coder-agent Сломан (Phase 5 inline вместо subagent, заказчик согласен)

Сломанные 2 из 5 на 67-эпизодном окне.

Что меняю с этого момента

В заметку утреннюю было записано: «Не правила — привычки». 6 часов показали — на этом классе привычек enforcement обязателен. Меняю не привычки, а запрос на хуки:

  1. Enforce-clarify-short-prompts (brain-retro #10 Candidate 2 B) — ставлю в шорт-лист на ближайшую сессию.
  2. Enforce-override-rate-limit (расширение существующего enforce-override-limit.mjs) — добавить per-minute или per-session порог поверх per-day. Например: ≥10 same-phrase в окне 5 минут = блок.
  3. Coder-agent auto-suggest — рекомендация при правке ≥4 файлов с похожим паттерном в одном turn'е. Не хук-блок, а уведомление в response.

Метаданные

  • Sanitize: ответы заказчика — pre-defined options, PII-фильтр не применялся (нет свободного текста).
  • Counter: сброс в docs/observer/.self-retrospect-counter.jsonlast_run_at: <now>, episodes_since_last: 0.
  • Этот скил не пишет episode JSONL — наблюдатель его собственное действие фиксирует через events of the parent turn (как и любую другую skill-инвокацию).
  • Quirk выявлен: утренний прогон не обновил counter (last_run_at остался null, episodes_since_last не сбросился — отсюда чтение 569 в этом прогоне). См. brain-retro #10 Candidate 1 — отдельная инфра-правка. Этот прогон делает явный reset через node -e.