Files
portal/docs/observer/STATUS.md
T
Дмитрий 8769245ed5
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
feat реклама: портал сам проверяет готовность аудитории и минимальную смету до запуска
Живой бой 30.07.2026. Сегмент дозрел за 15 часов — Яндекс опознал 1644 человека
из 1693, охват 3379. Портал нажал «Запустить» и получил отказ Директа:
   Budget for this period cannot be less than 600 rub.

Стена оказалась не одна, а две. Обе — молчаливые: портал о них не знал.

Первая — аудитория. Сегмент в Аудиториях существует и при этом НЕГОДЕН, пока
Яндекс сводит загруженные номера с людьми. Портал этого не спрашивал вообще:
ни один файл не читал can_create_dependent. Он просто шёл в Директ строить
условие ретаргетинга и получал «объект не найден» — тот же отказ, что и на
несуществующий сегмент. Судить о готовности можно ТОЛЬКО по can_create_dependent:
статус is_processed означает «обрабатывается», а не «готов».

Вторая — деньги. Директ не берёт кампанию, у которой бюджет за период ниже
шестисот рублей. Приёмочная кампания на 1693 показа давала около 146 рублей.
Проверки минимума в портале не было тоже.

В обоих случаях клиент видел сырую ошибку Яндекса на английском и не понимал,
виноват ли он и что делать дальше.

Что сделано. Обе проверки выполняются ДО первого обращения к Яндексу: в кабинете
ничего не создаётся, деньги не морозятся, кампания остаётся черновиком.
   аудитория ещё готовится → 202 и «подождите, обычно несколько часов»
   смета мала              → 422 и «нужно 6945 показов, это 833.40 рублей»

Наружу уходят ТОЛЬКО клиентские числа. Ни минимума площадки, ни нашей наценки:
по паре «минимум площадки — цена клиенту» долю Яндекса можно вычислить делением.
Минимум вынесен в настройку YANDEX_DIRECT_MIN_SPEND_RUB, Яндекс может его менять.

Тестом вперёд, в живой Яндекс из тестов не ходили. Четыре новых теста на запуск
и два на ответы портала. Реклама целиком: 342 теста зелёные.

Заодно приведён в порядок список исключений статанализа. Он был красным ЗАДОЛГО
до этой правки и не пускал ни одну правку кода: 629 замечаний до моих изменений,
638 после. Проверено в обеих папках работы — не артефакт подпапки.

Разбор 637 замечаний по составу:
   611 — статанализ не понимает устройство тестов Pest и ругается на
         обращения вида this->postJson и this->tenant. Таких записей в списке
         исключений уже было 671 — просто новые тестовые файлы туда не дописали.
    26 — придирки к типам, из них 7 в боевом коде.

Все семь в боевом коде разобраны поимённо и оказались ложной тревогой. Доказано
не рассуждением, а зелёными тестами, которые упали бы при настоящей поломке:
   shows_until, три замечания — три теста прямо проверяют закрытие кампании по
      истечении срока показа и разморозку остатка. Будь там строка вместо даты,
      первый тест упал бы, а деньги клиента остались бы заперты навсегда.
   snapshot_from и snapshot_to, два замечания — тесты ручного режима строят
      аудиторию по этим датам, на строке они бы рухнули.
   SetTenantContext строка 56 и CampaignMessageService строка 168 — лишние
      подстраховки, вреда нет.

Корень ложных срабатываний: Larastan ищет приведения типов в старом виде —
свойством casts, а у нас метод casts. Код правильный, инструмент отстал.

После обновления списка статанализ зелёный: 0 замечаний. Теперь сторож снова
ловит НОВОЕ, а не молчит красным.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 15:07:49 +03:00

144 lines
8.8 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 Status (auto-generated)
Last updated: 2026-07-30T09:36:32.961Z
| Контролёр | Состояние | Детали |
|---|---|---|
| C1 L1-watcher | 🔴 | If the plugin is referenced in Tooling under a group/human name, add an alias to tools/.l1-watcher-aliases.txt. |
| C2 Cross-ref consistency | ✅ | [cross-ref-checker] OK — 0 drift in 4 files |
| C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 9 week(s) ago |
| C4 Сигнальный статус | ✅ | This file (self-reference) |
| C5 Observer-coverage | ⚠️ | 0 episode(s) this month · observer-stop-hook NOT registered in .claude/settings.json Stop hook; .git/hooks/post-commit not installed (run: npx lefthook install --force) |
| C6 Chain map sync | ✅ | [chain-map-checker] OK — 17 chains in sync |
## Кто на посту (оборона М1–М6)
⚠️ **ПОСТ ПУСТОЙ** — не зарегистрированы: enforce-floor.mjs, enforce-supreme-gate.mjs, enforce-normative-content-rules.mjs, enforce-read-path-deny.mjs, enforce-mcp-classification.mjs, enforce-judge-gate.mjs, enforce-snapshot.mjs, enforce-floor-escape-consume.mjs, enforce-skill-journaler.mjs, enforce-verify-gate.mjs, enforce-criterion-gate.mjs, enforce-coverage-verify.mjs, enforce-todowrite-skill-verifier.mjs (оборона НЕ подтверждена; SE-B/Δ8)
Судья М4: **live-block** (inert $0 / shadow / floor-only / live-block)
| Машина / страж | Хук | Зарегистрирован |
|---|---|---|
| М5 Пол (вето-до-плана / content-floor) | `enforce-floor.mjs` | 🔴 |
| М2 Стена (действие = шаг плана) | `enforce-supreme-gate.mjs` | 🔴 |
| М1/М5 Нормативный страж (КАРТА/ЗАКОН) | `enforce-normative-content-rules.mjs` | 🔴 |
| М5 Read-exfil страж | `enforce-read-path-deny.mjs` | 🔴 |
| М5 Egress-exfil страж | `enforce-mcp-classification.mjs` | 🔴 |
| М4 Судья (приёмка + надзор) | `enforce-judge-gate.mjs` | 🔴 |
| М6 Снимок (точка отката) | `enforce-snapshot.mjs` | 🔴 |
| М6 Escape владельца (законная дверь) | `enforce-floor-escape-consume.mjs` | 🔴 |
| М1 Журналер навыков | `enforce-skill-journaler.mjs` | 🔴 |
| enforce-verify-gate.mjs | `enforce-verify-gate.mjs` | 🔴 |
| enforce-criterion-gate.mjs | `enforce-criterion-gate.mjs` | 🔴 |
| enforce-coverage-verify.mjs | `enforce-coverage-verify.mjs` | 🔴 |
| enforce-todowrite-skill-verifier.mjs | `enforce-todowrite-skill-verifier.mjs` | 🔴 |
Недавние escape владельца: 0 · Недавние блоки: 0
## Метрики (информационные, не алерты)
- Observer evidence: 0 episodes this month, 0 observer_error markers, 0 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 0
- Last /brain-retro: 64 day(s) ago
- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 0. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store).
## Метрики дисциплины
Baseline дисциплины роутера (этап 2 router discipline overhaul, spec 2026-05-23). Цель — увидеть «точку До» перед enforcement-хуком этапа 3.
| Тип задачи | Эпизодов | % с триггер-матчем | % через скил |
|---|---|---|---|
| (no data) | 0 | 0% | 0% |
Router step distribution: (empty)
Boundaries applied (ADR / границы): 0 of 0 эпизодов (0.0%).
## Активные многоэтапные проекты
- **Router discipline overhaul** ([spec](../superpowers/specs/2026-05-23-router-discipline-overhaul-design.md))
- Этап 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-fix `bec69aa5`: `deriveRouterStep` в `tools/discipline-metrics.mjs` — шаг роутера теперь выводится из наблюдаемых признаков (был захардкоженной константой 1). **Follow-up 3 fixes 2026-05-24** (после ANTHROPIC_API_KEY + рестарта CC выявлены при инспекции state): (a) UTF-8 stdin helper `tools/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_rationale` 4 полями (`recommended_node` override + `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` → удаление) — не начат.
## Длинные сессии
(нет данных)
## Стоимость месяца
| Компонент | Токены (in/out) | USD |
|---|---|---|
| Classifier (Sonnet 4.6) | 0/0 | $0.00 |
| Self-assessment (Sonnet 4.6) | 0/0 | $0.00 |
| Reviewer (Opus 4.7 + fallback) | 0/0 | $0.00 |
| **Итого** | | **$0.00** |
## Аномалии классификатора
Аномалий нет.
## Авто-ретроспектива
Last self-retrospect: never ⚠️ (542 эпизодов с последнего запуска, порог 10)
Episodes since last run: 542 / threshold: 10
## Reviewer: субагент vs fallback
0 эпизодов проверено из 0.
## Reviewer findings
(нет проверенных эпизодов в текущем периоде)
## Использование override-фраз
| Фраза | За всё время | За сегодня |
|---|---|---|
| `recovery` | 2302 | 0 |
| `без скилов` | 507 | 0 |
| `ремонт инфраструктуры` | 331 | 0 |
| `срочно` | 225 | 0 |
| `memory dump` | 46 | 0 |
| `direct ok` | 6 | 0 |
| `быстрый коммит` | 3 | 0 |
## System Health
Топ-3 процессов с CPU > 1ч:
| PID | Имя | CPU-время | Возраст |
|---|---|---|---|
| 3544 | MsMpEng | 8.05ч | 0.0ч |
| 23936 | Code | 2.15ч | NaNч |
| 4 | System | 1.33ч | 0.0ч |
⚠️ Проверь, не «осиротевшие» ли это процессы от завершённых Claude-сессий.
## Очередь обучения роутера
Очередь пуста — нет кандидатов на одобрение.
## Покрытие дверей
⚠️ Есть забытые двери (matcher: (хук НЕ зарегистрирован)).
Непокрытые мутирующие инструменты: Edit, Write, MultiEdit, NotebookEdit, Bash, Task, Skill
## Целостность журналов действий
🔴 Битые цепочки (3 из 120):
| session | broken at seq |
|---|---|
| `03437265-6d58-4622-aeed-c0eeac0f2c32` | 1 |
| `54594686-843c-4ea8-bcd3-5ae6a7244e30` | 14 |
| `9c02276d-dabb-40e4-9c04-44c18d47485a` | 14 |
## Алерт-индикаторы
✅ — норма ・ ⚠️ — внимание ・ 🔴 — действие требуется ・ ⚪ — не запускалось