LeadRouter SQL переписан на JOIN с project_routing_snapshots по active_slepok_date:
до 21:00 МСК = today, после 21:00 МСК = today+1. is_active / delivery_days_mask /
daily_limit / regions / signal_type / signal_identifier берутся из snapshot.
Из live projects — только delivered_today (счётчик остатка лимита). Из tenants —
balance_rub (live auto-pause при нулевом балансе).
Active snapshot date вычисляется в PHP (метод activeSnapshotDate()) и
передаётся в SQL как параметр — тестируемо через Carbon::setTestNow,
исключает дрейф между PHP- и DB-часами.
Fail-loud: Log::error('lead_router.no_snapshot_for_active_date', ...) если
по активной дате слепка вообще нет ни одной строки snapshot'а (cron не отработал).
Closes R-01, R-04, R-06, R-07, R-08, R-15.
Partial: R-02 (через шеринг), R-09 (race), R-10 (editable identifier) — закрываются Task 2.6+.
Plan: docs/superpowers/plans/2026-05-26-slepok-routing-protection.md §Task 2.5
Spec: docs/superpowers/specs/2026-05-26-slepok-routing-protection-design.md §4.2.3
Tests added:
- tests/Feature/LeadRouter/SnapshotRoutingTest.php (4 tests, all GREEN locally)
Tests patched (downstream — добавлен createRoutingSnapshotFromProject() helper):
- tests/Pest.php — global helper createRoutingSnapshotFromProject()
- tests/Feature/LeadRouter/BalanceFilterTest.php (2/2 GREEN)
- tests/Feature/Services/LeadRouterTest.php (10/10 GREEN)
- tests/Feature/Jobs/RouteSupplierLeadJobTest.php (14/14 GREEN)
- tests/Feature/Supplier/DirectPlatformTest.php (6/6 GREEN)
- tests/Feature/Supplier/RouteSupplierLeadJobBillingTest.php (3/3 GREEN)
- tests/Feature/Supplier/SupplierConnectionTest.php (5/5 GREEN)
- tests/Feature/Integration/SupplierLeadFlowTest.php (2/2 GREEN)
- tests/Feature/Pd/DealCreatePdLogTest.php (2/2 GREEN)
Each test file isolated regression: GREEN. Combined run 49/50 with 1 flake on
quirk #77 (Faker unique domainName + cross-connection pgsql/pgsql_supplier
DatabaseTransactions scope mismatch) — pre-existing, NOT regression от Task 2.5.
Patched via 7 parallel Sonnet subagents per Pravila §15.1; controller-verified
isolated + combined regression (latter caught 1 subagent over-application:
paused project in SupplierLeadFlowTest получил snapshot, что нарушило логику
теста — fixed inline, по semantic match with SnapshotBackfillCommand SQL
WHERE p.is_active = true).
7.1 KiB
Brain Status (auto-generated)
Last updated: 2026-05-27T12:24:24.132Z
| Контролёр | Состояние | Детали |
|---|---|---|
| C1 L1-watcher | ✅ | [l1-watcher] OK — 0 drift |
| 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 | ⚠️ | 600 episode(s) this month · .git/hooks/post-commit not installed (run: npx lefthook install --force) · 21 missed activation(s) — see /brain-retro |
| C6 Chain map sync | ✅ | [chain-map-checker] OK — 16 chains in sync |
Метрики (информационные, не алерты)
- Observer evidence: 600 episodes this month, 0 observer_error markers, 117 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 461
- Last /brain-retro: 0 day(s) ago
- Использование узлов: см.
/brain-retro(раз в спринт). missed_activations: 21. Неиспользованные узлы — не алерт, если профильной задачи не было (Pravila §16.4 v1.36; capability-readiness; см. memoryfeedback_brain_unused_tools_not_problem— outside-repo memory store).
Метрики дисциплины
Baseline дисциплины роутера (этап 2 router discipline overhaul, spec 2026-05-23). Цель — увидеть «точку До» перед enforcement-хуком этапа 3.
| Тип задачи | Эпизодов | % с триггер-матчем | % через скил |
|---|---|---|---|
| analysis | 26 | 30.8% | 15.4% |
| monitoring | 25 | 0.0% | 0.0% |
| bugfix | 18 | 22.2% | 27.8% |
| planning | 16 | 18.8% | 18.8% |
| feature | 15 | 13.3% | 0.0% |
| cleanup | 6 | 0.0% | 0.0% |
| refactor | 1 | 0.0% | 0.0% |
Router step distribution: 1: 255, 2: 223, 3: 58, 5: 57
Boundaries applied (ADR / границы): 70 of 593 эпизодов (11.8%).
Активные многоэтапные проекты
- Router discipline overhaul (spec)
- Этап 1 (машиночитаемый реестр) ✅ закрыт 2026-05-23 —
docs/registry/nodes.yaml(83 узла + 16 chains L1-L16),tools/registry-load.mjs+tools/registry-render.mjs(16 тестов), auto-render Tooling §4.0 + routing-off-phase, lefthook job 17 (warn-only). - Этап 2 (измерения + классификатор-парсер) ✅ закрыт 2026-05-24 + влит в main 2026-05-24 — discipline-metrics (3 среза), brain-retro-analyzer переключён на реестр, STATUS.md блок «Метрики дисциплины», baseline snapshot
docs/observer/baselines/2026-05-24-pre-enforcement.md. Plan:docs/superpowers/plans/2026-05-24-router-overhaul-stage-2-measurements.md. - Этап 3 (принуждение — хук на routing) — Phase A+B (классификатор + 3 хука: router-prehook/tool-gate/stop-gate в
.claude/settings.json) ✅ + влит в main 2026-05-24. Гейт работает в режимеwarn-only(только stderr-предупреждения, никакой блокировки). Bug-fixbec69aa5:deriveRouterStepвtools/discipline-metrics.mjs— шаг роутера теперь выводится из наблюдаемых признаков (был захардкоженной константой 1). Follow-up 3 fixes 2026-05-24 (после ANTHROPIC_API_KEY + рестарта CC выявлены при инспекции state): (a) UTF-8 stdin helpertools/router-stdin-helper.mjsчерезStringDecoder+ подключение к 3 хукам (русский в state-файл и Anthropic API без mojibake); (b)tools/observer-state-enricher.mjs— pure helper для чтенияrouter-state-<session>.json; (c)parseTranscriptобогащениеprimary_rationale4 полями (recommended_nodeoverride +recommended_chain+chain_progress+chain_completed). 538 tools-тестов GREEN. Plan:docs/superpowers/plans/2026-05-24-router-stage3-three-fixes.md. CHECKPOINT B: дать warn-only накопить реальные наблюдения с починенным сторожем (план говорит «минимум 24 часа»), затем Task 9 — переключение вenforce+ 2 новых метрики (domain-hit-rate / chain-completion). Plan:docs/superpowers/plans/2026-05-24-router-overhaul-stage-3-enforcement.md. - Этап 4 (уборка устаревших правил, deprecation
observer-classification-map.json→ удаление) — не начат.
- Этап 1 (машиночитаемый реестр) ✅ закрыт 2026-05-23 —
Длинные сессии
⚠️ Сегодня (2026-05-27 UTC) есть сессии с ≥50 ходов — корреляция с падением дисциплины роутинга (retro #5 candidate B).
| session_id | макс. ход | % regulated | последний эпизод |
|---|---|---|---|
b11f6b8d |
50 | 7% | 2026-05-27T08:06:24.677Z |
Long sessions correlate with discipline drift. Если % regulated просел в текущей сессии — рассмотри перезапуск.
Стоимость месяца
| Компонент | Токены (in/out) | USD |
|---|---|---|
| Classifier (Sonnet 4.6) | 2134/27284 | $0.42 |
| Self-assessment (Sonnet 4.6) | 0/0 | $0.00 |
| Reviewer (Opus 4.7 + fallback) | 0/0 | $0.00 |
| Итого | $0.42 |
Аномалии классификатора
Аномалий нет.
Авто-ретроспектива
Last self-retrospect: never ⚠️ (542 эпизодов с последнего запуска, порог 10) Episodes since last run: 542 / threshold: 10
Reviewer: субагент vs fallback
0 эпизодов проверено из 600.
Reviewer findings
Проверено: 339 эпизодов. 51 actionable (wrong_skill + wrong_chain_order).
error_root_cause
| cause | count |
|---|---|
| n/a | 261 |
| wrong_skill | 41 |
| external_failure | 23 |
| wrong_chain_order | 10 |
| wrong_tool | 4 |
Топ alternative_better
| recommended | count |
|---|---|
| #19 | 16 |
| #25 | 15 |
| #34 | 8 |
| #18 | 6 |
| #33 | 3 |
node_quality
| judgment | count |
|---|---|
| disputable | 191 |
| correct | 113 |
| wrong_node | 31 |
| underkill | 2 |
| overkill | 2 |
Использование override-фраз
⚠️ Превышен порог override-использования сегодня (≥5/день)
| Фраза | За всё время | За сегодня |
|---|---|---|
recovery |
172 | 78 ⚠️ |
ремонт инфраструктуры |
152 | 81 ⚠️ |
срочно |
82 | 39 ⚠️ |
без скилов |
52 | 26 ⚠️ |
memory dump |
7 | 5 ⚠️ |
direct ok |
6 | 2 |
быстрый коммит |
3 | 2 |
Алерт-индикаторы
✅ — норма ・ ⚠️ — внимание ・ 🔴 — действие требуется ・ ⚪ — не запускалось