diff --git a/cspell-words.txt b/cspell-words.txt index 02bd09ce..5d65df12 100644 --- a/cspell-words.txt +++ b/cspell-words.txt @@ -1676,3 +1676,23 @@ journalctl досоздаёт недозаказ пушнута +jre +Eljakani +eljakani +coreyhaines +Vadosdavos +Yahia +Svecha +PVL +gitroomhq +накопл +инвокаций +мэппингом +экспект +деплоен +пинует +pgrx +роутинга +сурфейсятся +Temurin +jdk diff --git a/docs/Tooling_v8_3.md b/docs/Tooling_v8_3.md index 8f142a2f..d7720988 100644 --- a/docs/Tooling_v8_3.md +++ b/docs/Tooling_v8_3.md @@ -555,7 +555,7 @@ Existing prose follows the table. | id | name | kind | phase | subcategory | triggers | boundaries | dormant | last-touched | |---|---|---|---|---|---|---|---|---| -| #34 | Sentry MCP | mcp | off-phase | debug-runtime | «отладка production runtime errors» | READ-ONLY, pending Б-1 | false | 2026-05-19 | +| #34 | Sentry MCP | mcp | off-phase | debug-runtime | «отладка production runtime errors» | DEFERRED — Sentry instance не задеплоен (pending Б-1); READ-ONLY когда активен | false | 2026-05-23 | > **Введено 13.05.2026 day +1 (v1.17 Прил. Н):** формализован как «инструмент-резерв вне фаз, debug-категория». Установлен на feat/claude-automation `6f7e7d7` в `.mcp.json`, merged в main через PR #3 (`cc5f63b`); формализован retrospectively в v1.17. Категория **debug-runtime**, отличная от UI-пула (UPM/21st) и инфраструктурного (claude-md-management) — поэтому отдельная нумерация. Pending Sentry instance deployment в Yandex Cloud (зависит от Б-1 ООО registration P0). diff --git a/docs/observer/.read-counter.json b/docs/observer/.read-counter.json index 8f03162f..c78cc983 100644 --- a/docs/observer/.read-counter.json +++ b/docs/observer/.read-counter.json @@ -1,5 +1,5 @@ { - "last_read_at": "2026-05-19T00:00:00+03:00", - "read_count_last_period": 0, + "last_read_at": "2026-05-23T08:47:32.141Z", + "read_count_last_period": 1, "period_start": "2026-05-19T00:00:00+03:00" } diff --git a/docs/observer/STATUS.md b/docs/observer/STATUS.md index c4af8442..ad6c5b71 100644 --- a/docs/observer/STATUS.md +++ b/docs/observer/STATUS.md @@ -1,6 +1,6 @@ # Brain Status (auto-generated) -Last updated: 2026-05-23T07:16:50.771Z +Last updated: 2026-05-23T09:06:52.759Z | Контролёр | Состояние | Детали | |---|---|---| @@ -8,15 +8,15 @@ Last updated: 2026-05-23T07:16:50.771Z | C2 Cross-ref consistency | ✅ | [cross-ref-checker] OK — 0 drift in 4 files | | C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 0 week(s) ago | | C4 Сигнальный статус | ✅ | This file (self-reference) | -| C5 Observer-coverage | ⚠️ | 110 episode(s) this month · Stop-hook + post-commit OK · 39 missed activation(s) — see /brain-retro | +| C5 Observer-coverage | ⚠️ | 126 episode(s) this month · Stop-hook + post-commit OK · 16 missed activation(s) — see /brain-retro | | C6 Chain map sync | ✅ | [chain-map-checker] OK — 16 chains in sync | ## Метрики (информационные, не алерты) -- Observer evidence: 110 episodes this month, 0 observer_error markers, 39 PII matches before filter +- Observer evidence: 126 episodes this month, 0 observer_error markers, 51 PII matches before filter - Legacy v1 episodes (not in factor analysis): 5 -- Last /brain-retro: 4 day(s) ago -- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 39. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store). +- Last /brain-retro: 0 day(s) ago +- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 16. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store). ## Алерт-индикаторы diff --git a/docs/observer/notes/2026-05-23-brain-retro.md b/docs/observer/notes/2026-05-23-brain-retro.md new file mode 100644 index 00000000..c9c940f8 --- /dev/null +++ b/docs/observer/notes/2026-05-23-brain-retro.md @@ -0,0 +1,226 @@ +# 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.05–23.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 процедуры — выполняется ниже). diff --git a/tools/.node-dormancy.json b/tools/.node-dormancy.json index 34854870..1f377013 100644 --- a/tools/.node-dormancy.json +++ b/tools/.node-dormancy.json @@ -27,7 +27,7 @@ "#31": false, "#32": false, "#33": false, - "#34": false, + "#34": true, "#35": false, "#36": false, "#37": false, diff --git a/tools/observer-classification-map.json b/tools/observer-classification-map.json index a7bd0597..2c10bca8 100644 --- a/tools/observer-classification-map.json +++ b/tools/observer-classification-map.json @@ -1,18 +1,18 @@ { "$schema_version": 1, - "description": "Mapping from observer transcript-parser task_classification values to recommended Tooling Прил.Н node IDs. Source of truth for missed-activation detection (Pravila §16.4 conditional rule). 'other' deliberately empty — no recommendation, never counts as missed. DEFERRED-узлы filtered out by .node-dormancy.json at runtime. Classifier vocabulary is Claude's free judgment when writing the episode (no hardcoded enum) — adding a key here makes it 'blessed'. 'security' added 22.05.2026 (A8 follow-up): use when the PURPOSE of the task is verifying or improving security (scans, hardening, audits, threat modeling, go-live gates); NOT for bug-fixes that happen to be in security-relevant code (those stay 'bugfix'). 'marketing' added 22.05.2026 (C1 follow-up): use when the PURPOSE of the task is Лидерра's own marketing/lead-generation (content, SEO, campaigns, RU-channels, landing conversion, marketing-side 152-FZ); NOT for product features, billing flows, or PII-code audits.", + "description": "Mapping from observer transcript-parser task_classification values to recommended Tooling Прил.Н node IDs. Source of truth for missed-activation detection (Pravila §16.4 conditional rule). 'other' deliberately empty — no recommendation, never counts as missed. DEFERRED-узлы filtered out by .node-dormancy.json at runtime. Classifier vocabulary is Claude's free judgment when writing the episode (no hardcoded enum) — adding a key here makes it 'blessed'. 'security' added 22.05.2026 (A8 follow-up): use when the PURPOSE of the task is verifying or improving security (scans, hardening, audits, threat modeling, go-live gates); NOT for bug-fixes that happen to be in security-relevant code (those stay 'bugfix'). 'marketing' added 22.05.2026 (C1 follow-up): use when the PURPOSE of the task is Лидерра's own marketing/lead-generation (content, SEO, campaigns, RU-channels, landing conversion, marketing-side 152-FZ); NOT for product features, billing flows, or PII-code audits. 'question' emptied 23.05.2026 (brain-retro #3 A1): conversational Russian Q&A («делай», «а», уточнения) was producing 17/40 false-positive missed-activations against #60 context7 — context7 is for library-docs lookup, not chat. 'memory-sync' emptied 23.05.2026 (brain-retro #3 A2): #33 claude-md-management is the channel for CLAUDE.md edits (Pravila §5 п.10), NOT for memory/*.md (auto-memory writes natively); was producing 8/40 false-positive missed-activations.", "map": { "refactor": ["#11", "#12", "#43", "#64", "#65"], "bugfix": ["#18", "#34"], "feature": ["#19"], "planning": ["#19", "#41", "#42"], - "memory-sync": ["#33"], + "memory-sync": [], "monitoring": ["#34", "#35"], "analysis": ["#25", "#39", "#53"], "security": ["#73", "#69", "#68", "#70", "#71", "#72"], "marketing": ["#74", "#77", "#75", "#76", "#78", "#79", "#80", "#81"], "cleanup": ["#11", "#12"], - "question": ["#60"], + "question": [], "other": [] } }