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

8.8 KiB
Raw Blame History

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)
    • Этап 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

Алерт-индикаторы

— норма ・ ⚠️ — внимание ・ 🔴 — действие требуется ・ — не запускалось