Files
portal/docs/observer
Дмитрий f976de52d7
Accessibility (Pa11y live) / a11y (push) Has been cancelled
docs: починены 92 битые ссылки — сторож ссылок снова что-то значит
Проверка ссылок падала на девяноста двух ошибках, поэтому любая отправка в main
шла через обход. Смысл починки не в красоте: пока ошибок девяносто две, новая
битая ссылка тонет среди них и никто её не замечает. Теперь ноль, и пуш проходит
обычным порядком.

Что было внутри девяноста двух:

  68 — ссылка написана от корня хранилища, а документ лежит на две-три папки
       вглубь. Приписаны шаги вверх. Файлы всё это время лежали на месте.
   8 — файл существует, но переехал: Jobs/Billing, Jobs/Supplier, Services.
       Адреса переписаны на нынешние места.
   8 — файла нет и не будет: ProcessWebhookJob снят при уходе от старого
       биллинга, SupplierCsvParser удалён 09.07 как мёртвый, каталог memory
       уехал в claude-brain, а HANDOFF прогрева от 25.07 не существует ни
       в одном коммите. Ссылки сняты, текст оставлен.
   3 — неверное число шагов вверх: две точки вместо трёх.
   3 — это вообще не ссылки, а примеры в тексте: http:// как образец мусорного
       ввода, https://ваш-сайт.ru из подсказки формы. Обёрнуты в кавычки-код.
   1 — адрес с приписанными номерами строк, которых проверятель не понимает.
   1 — Россвязь. Сайт мёртв по-настоящему: сервер 194.226.91.2 отдаёт nginx-ову
       404 на любой адрес, включая корень, а сертификат выписан не на это имя;
       ведомство расформировано. Замену проверить не удалось — преемник
       с этой машины не отвечает вовсе. Ссылка снята, адрес читается текстом.
       Вопрос «где реестр нумерации живёт теперь» остаётся открытым.

Исключения проверятеля не тронуты ни на строку. Ноль получен починкой, а не
глушением сторожа — иначе вся работа теряет смысл.

Отдельным прибором проверено, что видимый читателю текст не изменился ни в одной
из 81 правленой строки: правились только адреса ссылок. Разметка линтером чистая.

Вместе с починкой ложится промт смены, по которому работа делалась.

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

Observer infrastructure

Passive evidence-loop for the Лидерра «brain» per ADR-011.

Files

  • episodes-YYYY-MM.jsonl — append-only JSONL, one line per Stop-event. Schema v2 (schema_version: 2): the 5 mandatory fields + decision_provenance (who chose the node), environment (economy_level / model / post_compaction / session_turn / parallel_session), task_size, task_ref, prompt_signal, and an outcome that is unknown at write time (refined by /brain-retro). On an internal hook failure a minimal observer_error marker line is written instead of a silent skip. Written by tools/observer-stop-hook.mjs via tools/observer-transcript-parser.mjs.
  • notes/YYYY-MM-DD-<slug>.md — optional MD notes for sessions with qualitative history.
  • STATUS.md — auto-generated dashboard. Regenerated per-commit by tools/status-md-generator.mjs.
  • .read-counter.json — C3 observer-of-observer counter. Updated on Read of observer files.
  • dashboard.html + dashboard.js + dashboard-core.js — Brain Dashboard: visualises the episode log over the automation-graph topology (4 views — Карта / Разбор / Лента / Агрегат). Run npm run brain:dashboard, open the printed localhost URL. dashboard-core.js is pure logic, unit-tested in tools/brain-dashboard-core.test.mjs.

Lifecycle

  1. Write: every Stop-event appends one JSONL line, parsed from the session transcript (Stop-hook).
  2. Aggregate: /brain-retro skill reads JSONL each sprint, proposes regulatory candidates.
  3. Surface: STATUS.md shows controllers + monthly stats.
  4. Self-prune: C3 warns if 54 weeks pass without any read of observer files.

Routing-tag discipline

When the user dictates a specific method/node (e.g. «запусти discovery-interview»), Claude must emit one line in its response:

<!-- routing: provenance=user_directed_method node=<chosen> counterfactual=<node Claude would have chosen autonomously> -->

The Stop-hook routing-gate (tools/observer-routing-detector.mjs + routingGateDecision) detects a dictated method; if the tag is missing it returns decision: block, so the turn cannot end without the tag. The gate fires at most once per turn (stop_hook_active guard). This makes decision_provenance reliable — factor analysis can separate a router error from a user-dictated one.

Privacy

PII filter (phone numbers, emails, tokens) is applied before every write — see tools/observer-pii-filter.mjs. gitleaks pre-push also scans observer files as part of full-history sweep.

Don't

  • Don't edit episodes-*.jsonl manually — it's append-only.
  • Don't write outside docs/observer/notes/ for hand-curated notes.
  • Don't change .read-counter.json manually — it's maintained by hooks.

HK1 pre-check (Pravila ADR-010) — verified 2026-05-19

Before registering tools/observer-stop-hook.mjs on Stop event (Task B5), verified collision against 6-component economy/skill-discipline architecture:

  • User-level ~/.claude/settings.json already has Stop hook: agent-type Sonnet-4.6 economy compliance verifier (analyzes transcript for claim-without-evidence violations).
  • Project-level .claude/settings.json — Stop slot empty.

Result: no overwrite. observer-stop-hook will be added as command-type entry in project-level Stop array. Project + user scopes are independent slots in Claude Code 2.x — both run on the same Stop event without conflict. The agent verifier (user scope) and the JSONL appender (project scope) have non-overlapping responsibilities.