Compare commits

..

273 Commits

Author SHA1 Message Date
Дмитрий d1ad4e8559 feat(m7-phase8): sealedPlanCoversEdit live-wiring + matcher extension to discipline sources
planCoversAction (signed-plan + tree-valid + leaf-match, fail-CLOSED) wires the §6
build-loop differentiator live. main() matcher now fires for tools/enforce-*.mjs
(ad-hoc → LAW/escape; under sealed plan → CARD). decide() skips doc-malice prose
layers for code and allows build-loop CARD (M2/content-floor/TDD govern). Hook inert
until Phase 8 registration. +10 tests; regression tools-only 3397 passed / 2 skip.

Plan: docs/superpowers/plans/2026-06-08-router-mentor-machine-7-phase-5.md (Deferred Ф8).
2026-06-12 08:45:17 +03:00
Дмитрий 440fd71bbf fix(content-floor): quote-aware redirect in matchBashHardBlacklist (port b0cd18d7 after --ours merge) 2026-06-09 13:35:24 +03:00
Дмитрий d59b9177d4 Merge branch 'main' into worktree-brainrepo
# Conflicts:
#	tools/enforce-coverage-verify.mjs
#	tools/enforce-coverage-verify.test.mjs
#	tools/enforce-router-gate.mjs
#	tools/enforce-router-gate.test.mjs
2026-06-09 13:26:12 +03:00
Дмитрий cc77a5817e docs(phase8): owner deployment runbook for M7 zoo dissolution + activation 2026-06-09 13:03:56 +03:00
Дмитрий c8639f2fd1 feat(manifest): register coverage-verify + todowrite-skill-verifier (G2 phase8 manifest 11to13) 2026-06-09 12:56:40 +03:00
Дмитрий 5fa17070a9 docs(router-mentor): Level B closure + phase 8 handoff 3 2026-06-09 12:46:13 +03:00
Дмитрий 068b03d946 feat(criterion-gate): register enforce-criterion-gate in manifest (Level B task6) 2026-06-09 12:30:06 +03:00
Дмитрий 4e54331ef4 feat(criterion-gate): consumer enforce-criterion-gate fail-CLOSE (Level B task5) 2026-06-09 12:26:33 +03:00
Дмитрий e229cf0706 feat(criterion-gate): per-criterion green producer (Level B task4) 2026-06-09 12:24:30 +03:00
Дмитрий caa41e6cac feat(criterion-gate): mutation runner in-place + restore (Level B task3) 2026-06-09 12:22:40 +03:00
Дмитрий 9414699ad9 feat(criterion-gate): vitest json run + test-count guard (Level B task2) 2026-06-09 12:21:21 +03:00
Дмитрий 67a46df978 feat(criterion-gate): JS mutation operators pure (Level B task1) 2026-06-09 12:19:50 +03:00
Дмитрий 2c41971d88 docs(router-mentor): G1 closure + phase 8 handoff 2 2026-06-09 10:32:47 +03:00
Дмитрий b92afad96c feat(verify-gate): register enforce-verify-gate in manifest (G1 task7) 2026-06-09 10:22:36 +03:00
Дмитрий 2bd7efbebd feat(verify-gate): consumer enforce-verify-gate fail-CLOSE (G1 task6) 2026-06-09 10:19:44 +03:00
Дмитрий 9ce6041be4 feat(verify-gate): producer staged-fingerprint + io main (G1 task5) 2026-06-09 10:18:11 +03:00
Дмитрий 93e516e680 feat(verify-gate): producer pure buildVerifyReceipt (G1 task4) 2026-06-09 10:16:22 +03:00
Дмитрий 0f20c944ca feat(verify-gate): rubilnik verify-gate-config (G1 task3) 2026-06-09 10:15:16 +03:00
Дмитрий 1088599023 feat(verify-gate): verify-receipt pure core sign/accept (G1 task2) 2026-06-09 10:13:57 +03:00
Дмитрий 1857773f89 feat(verify-gate): VERIFY_PASS receipt domain (G1 task1) 2026-06-09 10:12:41 +03:00
Дмитрий 1478f56b51 docs(router-mentor): phase 8 readiness audit findings 2026-06-09 09:54:07 +03:00
Дмитрий 4ea4806f71 docs(router-mentor): phase 8 migration handoff (audit tails then configure-test-deploy) 2026-06-09 09:20:20 +03:00
Дмитрий 487a6f1db9 docs(router-mentor): A1 judge gate2 activation note (implementation-specific) 2026-06-09 08:55:33 +03:00
Дмитрий e8958155c4 feat(judge-gate): runJudgeTurn three-mode wiring + main (shadow runs+logs, live-block fail-close) 2026-06-09 08:46:28 +03:00
Дмитрий b48fd86152 feat(judge-gate): shadow verdict log + judge-unavailable warn (J8) 2026-06-09 08:43:00 +03:00
Дмитрий 50550f311e feat(judge-gate): async runJudgeGate orchestration + degraded-allow on unavailable 2026-06-09 08:40:36 +03:00
Дмитрий 36545b636f feat(judge-gate): callJudgeModel async transport + spend-gate (unavailable vs malformed) 2026-06-09 08:38:38 +03:00
Дмитрий 0af6610b77 feat(judge-gate): extractGate2Product Write-only plan detector 2026-06-09 08:36:03 +03:00
Дмитрий 0c6f084f0e feat(judge-gate): parseJudgeResponse fail-closed parser 2026-06-09 08:33:46 +03:00
Дмитрий cfca7ecfaa docs(router-mentor): A1 pre-code chain amendments (Write-only, judge-unavailable degraded-allow) 2026-06-09 08:30:43 +03:00
Дмитрий 843097c0d6 docs(router-mentor): A1 judge gate2 wiring implementation plan 2026-06-09 08:19:54 +03:00
Дмитрий 44c194bc0f docs(router-mentor): A1 judge gate2 wiring design spec 2026-06-09 08:11:13 +03:00
Дмитрий 8ec7969551 docs(router-mentor): stage3 and m3 handoff 2026-06-09 07:55:03 +03:00
Дмитрий 681c2b8abc docs(router-mentor): activation runbook A1 A6 A7 2026-06-09 07:50:42 +03:00
Дмитрий 4c1ad03705 docs(shadow-replay): clean stage 3 report all walls green 2026-06-09 07:27:29 +03:00
Дмитрий a630053714 fix(shadow-replay): exclude runtime writes and scope M6 to bash 2026-06-09 07:20:48 +03:00
Дмитрий 647879adc6 feat(shadow-replay): main cli and runAll 2026-06-09 06:30:17 +03:00
Дмитрий dd63f950e2 feat(shadow-replay): buildCorpus runMachine report 2026-06-09 06:26:57 +03:00
Дмитрий ff8f14d8d2 feat(shadow-replay): M4 adapter and M3 divergence 2026-06-09 06:24:33 +03:00
Дмитрий a7f3ebd971 feat(shadow-replay): M2 adapter signed plan 2026-06-09 06:22:40 +03:00
Дмитрий d5feca2672 feat(shadow-replay): M5 M6 adapters 2026-06-09 06:21:01 +03:00
Дмитрий f139ad5320 feat(shadow-replay): classifyOutcome 2026-06-09 06:19:10 +03:00
Дмитрий 8228703320 feat(shadow-replay): fixtures 2026-06-09 06:17:38 +03:00
Дмитрий 2ba34dc0e2 docs(router-mentor): stage 3 replay plan 2026-06-09 06:12:55 +03:00
Дмитрий 45905432f8 docs(router-mentor): stage 3 replay spec data-source fix 2026-06-09 06:07:55 +03:00
Дмитрий 987feb2e40 docs(router-mentor): stage 3 replay spec 2026-06-09 06:00:15 +03:00
Дмитрий 7e5db3ef91 docs(router-mentor): self-consistent git anchor in handoff prompt 2026-06-09 05:31:03 +03:00
Дмитрий ad6fd73ec9 docs(router-mentor): handoff for next session (Block B plus R-08 closed, autonomous front exhausted) 2026-06-09 05:30:35 +03:00
Дмитрий fa07472dd0 docs(router-mentor): mark Block B closed, M1 pinned, fix stale notes in loose-ends registry 2026-06-09 05:25:26 +03:00
Дмитрий 5782ede3eb test(action-journal): pin M1 fail-closed on torn append (entry without head update) 2026-06-09 05:23:51 +03:00
Дмитрий 2b0c28e59f feat(supreme-gate): tree leaf resolution plus advance flag for R-08 waves 2026-06-09 05:12:38 +03:00
Дмитрий 16e0c1db09 feat(supreme-gate): pointer state accepts tree position as index array 2026-06-09 05:10:45 +03:00
Дмитрий 51f718ea07 feat(plan-lock): tree leaves, leaf resolver, validate, recursive criterion ids, hierarchical consumers 2026-06-09 05:09:21 +03:00
Дмитрий 1a3ccc2178 feat(step-pointer): serialize plus tree navigation for R-08 waves 2026-06-09 05:06:49 +03:00
Дмитрий 1651fdfb50 docs(router-mentor): R-08 implementation plan (6 tasks TDD) 2026-06-09 05:04:45 +03:00
Дмитрий 4a0c3a98d9 docs(router-mentor): R-08 spec hardened by adversarial pass (7 SE + 2 flat variants) 2026-06-09 04:59:10 +03:00
Дмитрий 93fcb5e141 docs(router-mentor): R-08 hierarchical waves design spec 2026-06-09 04:51:39 +03:00
Дмитрий 0e995970f9 feat(reconcile): wire reconcileEvent reader in main (inert, WARN-only) 2026-06-09 04:08:22 +03:00
Дмитрий 752512d3cd feat(status): R-30 journal integrity block via live verifyChain (read-only) 2026-06-09 04:06:53 +03:00
Дмитрий 1000abc7fc feat(status): R-24 door coverage block (read-only) 2026-06-09 04:05:15 +03:00
Дмитрий 0eef670e54 feat(door-coverage): door matcher reader and canonical mutating tools list 2026-06-09 04:02:27 +03:00
Дмитрий 2e6a6c0a7a feat(status): R-09 learning queue block (read-only) 2026-06-09 03:59:32 +03:00
Дмитрий 6c8918dff4 docs(router-mentor): plan blockB classes 1+2 (R-09/R-24/R-30/reconcile) 2026-06-09 03:57:03 +03:00
Дмитрий eb4b38f481 docs(router-mentor): handoff k novoy sessii (E/G zakryt, Blok B otbreynstormlen) 2026-06-09 03:46:59 +03:00
Дмитрий 2900554d5f docs(router-mentor): E/G warm-up batch zakryt v reestre hvostov (P1-P6) 2026-06-09 03:25:43 +03:00
Дмитрий a85d7f9d5f docs(router-mentor): DOC-1 escape-awareness callout pered aktivaciey M6 (P6 E/G) 2026-06-09 03:24:22 +03:00
Дмитрий 553ddea464 docs(tools): utochnit docstring node-graph + pinning-invarianty (P5 E/G) 2026-06-09 03:23:39 +03:00
Дмитрий cf9f803d36 feat(status): detail-render doski oborony + escapeCell anti-injection (P4 E/G) 2026-06-09 03:21:29 +03:00
Дмитрий 5ae0b1359f fix(observer): routing-detector ignorit PASTED-citaty /node (P1 E/G, 4-y FP-klass)
Novyy uzkiy stripPastedContext (fenced+blockquote only) pered detekciey. NE reuse stripQuotedContext (tot stripaet inline - FN). Sohraneno FP-smeshchenie routingGate (SE-1). Regressiya 3185 passed.
2026-06-09 03:18:55 +03:00
Дмитрий 84f75abb14 fix(observer): PII count via sanitize pipeline, overlap once (P2 E/G)
Edinyy PIPELINE: count ravno chislu redakciy sanitize (SE-2). sanitize byte-identical. Regressiya 3177 passed.
2026-06-09 03:16:49 +03:00
Дмитрий cfc4e0a853 fix(observer): release-класс не ловит голый commit (P3 E/G)
classifyTask: убран commit из release-регекса (коммит != релиз). push/merge/deploy/release/релиз/тегни остаются. Аналитика-only, гейтов-потребителей нет. Регрессия 3175 passed.
2026-06-09 03:14:24 +03:00
Дмитрий f801593987 docs(router-mentor): план E/G warm-up batch (7 тасков, bite-sized TDD)
Инлайн-исполнение (субагенты запрещены). Порядок простое-первым P3/P2/P1/P4/P5/P6 + закрытие реестра. Точный код тестов и правок, 4 правки безопасности учтены. Также факт-правка примеров P3 в спеке (first-match порядок classifyTask).
2026-06-08 19:47:30 +03:00
Дмитрий 0774a41f13 docs(router-mentor): E/G spec — 4 правки безопасности после adversarial-анализа
Цепочка audit-context-building/sharp-edges/variant-analysis. P1 узкий stripPastedContext (fenced+blockquote only, не reuse stripQuotedContext — сохранить FP-смещение гейта). P2 counting-replacers по конвейеру sanitize (count==редакции). P4 escapeCell anti-injection в STATUS.md. P5 пиннинг документируемого инварианта. Жёсткие стены М2/М5/М4/М6 не затронуты.
2026-06-08 19:40:34 +03:00
Дмитрий 62d3352d3e docs(router-mentor): spec для E/G warm-up batch (6 пунктов)
Дизайн утверждён владельцем. Точность наблюдателя (4-й FP-класс quoted /node, PII double-count, release-class commit) + детальный рендер доски обороны + косметика node-graph/reviewer + DOC-1 escape-awareness. Всё инлайн, TDD, commit-not-push, регрессия tools-only не ниже baseline 3174. Live-вшивка источников доски — граница B-блока.
2026-06-08 19:26:31 +03:00
Дмитрий acf1d90209 docs(router-mentor): handoff к следующей сессии (после закрытия H)
Ready-to-copy промт + карта оставшихся хвостов (B/A/C/E/F/G/H3) + квирки
(vitest --root, git PowerShell, node -e блок, память-гейт) + цепочка скилов
+ жёсткие правила (commit-not-push, CLAUDE.md off-limits). commit-not-push.

coverage: direct:session-handoff
2026-06-08 19:12:01 +03:00
Дмитрий 64fb063a22 docs(router-mentor): H закрыт — реестр хвостов + handoff обновлены
Блок H помечен ЗАКРЫТЫМ в реестре хвостов (H1/H2 + критический путь этап 1) и
handoff (финальная сводка решений + 5 находок аудита + квирк vitest --root для
worktree под .claude). commit-not-push.

coverage: direct:h-housekeeping
2026-06-08 19:07:37 +03:00
Дмитрий 65b3c57515 feat(nodes): конфликт-рёбра R-12 (Tooling §6 + R14.5, двусторонние)
4 пары attributes.conflicts_with из канона (mutual exclusion / replaces):
postgres-mcp↔boost (§6.1 «не оба активными»/replaces) + треугольник UI-генераторов
frontend-design↔ui-ux-pro-max↔21st-magic (R14.5 «один генератор на задачу,
не параллельно и не друг с другом»). ADR-границы — комплементарные различения,
не конфликты; §9.1-отвергнутые не узлы реестра. m3e: резолв+симметрия GREEN.

coverage: skill:executing-plans
2026-06-08 18:59:46 +03:00
Дмитрий 3dbd8a5cd9 test(m3e): живой инвариант покрытия реестра карточками + конфликт-целостность
Новый tools/m3e-card-coverage-invariants.test.mjs на реальном реестре:
(1) у каждого узла nodes.yaml есть карточка skill===slug (missingContracts пуст);
(2) нет пустых карточек (G-B); (3) конфликт-рёбра резолвятся и симметричны (G-H);
(4) реестр контрактов без формальных ошибок/дублей/дрейфа. GREEN — покрытие 86/86.
Конфликт-проверки пока тривиальны (0 рёбер), наполнятся в Task 4.

coverage: skill:test-driven-development
2026-06-08 18:56:10 +03:00
Дмитрий caadc92be0 feat(contracts): карточки marketing/project-agent/kg/historic (#74-#86 + #1) — все 86 готовы
14 финальных карточек: marketing (#74-#83: marketing-plugin, marketingskills,
brand-voice, marketing-ru[own], yandex-metrika-mcp, yandex-wordstat-mcp, telegram-mcp,
postiz, dataforseo-mcp[deferred], unisender-go-mcp[deferred]) + project-agent
(normative-sync[own], prod-deploy-validator[own]) + kg (graphifyy) + historic
(postgres-mcp #1). m3a GREEN. ВСЕ 86 узлов имеют карточку.

coverage: skill:executing-plans
2026-06-08 18:54:55 +03:00
Дмитрий 083095174c feat(contracts): карточки discovery/authoring/dev-support/finance/backend/infosec (#55-#73)
19 карточек. own (self-authored): discovery-interview, billing-audit, ru-tax-accounting,
laravel-backend-patterns, pdn-152fz-audit, threat-model, security-go-live. external:
skill-creator, plugin-dev, hookify, claude-code-setup, context7, finance-plugin, rector,
php-insights, nightowl[deferred], owasp-zap, nuclei, ward. m3a GREEN. 72/86 готово.

coverage: skill:executing-plans
2026-06-08 18:52:28 +03:00
Дмитрий d48365de5e feat(contracts): карточки design/integration/ml-ai/business-process (#44-#54)
11 карточек: design (figma-mcp[deferred], universal-icons-mcp, design-plugin) +
integration (openapi-mcp) + ml-ai (promptfoo, data-scientist, jupyter-mcp[deferred])
+ business-process (operations[зонтик], process-modeling[own], process-analysis[own],
n8n-mcp[deferred]). process-* = own (self-authored); остальные external. m3a GREEN.
53/86 карточек готово.

coverage: skill:executing-plans
2026-06-08 18:49:18 +03:00
Дмитрий 078e829b38 feat(contracts): карточки phase-3 + off-phase (UI-pool/debug/architecture/audit/PM)
18 карточек (все external): phase-3 (semgrep, trivy, dependabot, pg-audit,
pg-anonymizer) + UI-pool (ui-ux-pro-max, 21st-magic, claude-md-management) +
debug-runtime (sentry-mcp, redis-mcp) + architecture-tooling (adr-kit, mermaid,
architecture-patterns, deptrac) + audit-security (trail-of-bits, security-guidance)
+ project-management (ccpm, product-management). zero-hash + path"" → G4 инертен.
m3a 3/3 GREEN. 42/86 карточек готово.

coverage: skill:executing-plans
2026-06-08 18:47:19 +03:00
Дмитрий 9dc6bb55fd feat(contracts): карточки phase-1 + phase-2 (#10-#30)
16 карточек: phase-1 (boost, pint, larastan, roave-security, ide-helper, squawk,
pg-formatter, pg-partman[dormant], pest) + phase-2 (superpowers[own,зонтик], volar,
vue-tsc, eslint-prettier, vitest, histoire, frontend-design). superpowers = own
(без source); остальные external (zero-hash + path"" → G4 инертен). m3a 3/3 GREEN.

coverage: skill:executing-plans
2026-06-08 18:44:20 +03:00
Дмитрий 52cea07fee feat(contracts): карточки phase-0 (#2-#9) + m3a form-инвариант всех карточек
8 карточек-контрактов phase-0: playwright-mcp, github-mcp, markdownlint, cspell,
lychee, stylelint, gitleaks, pa11y (все external, zero-hash + path"" → G4 инертен).
m3a расширен: «ВСЕ файлы contracts/ form-валидны + нет дрейфа» (loadRegistry errors
+ driftFlags пусты) — per-батч валидация прогоном vitest. m3a 3/3 GREEN.

coverage: skill:executing-plans
2026-06-08 18:38:24 +03:00
Дмитрий f1c245f8f6 feat(card-coverage): чистый чекер покрытия узел↔карточка + конфликт-рёбра
Новый tools/card-coverage.mjs (H, R-11/R-12): missingContracts (узел без
карточки skill===slug), emptyCards (needs∪produces пусто — G-B), unresolvedConflicts
(висячая ссылка — G-H), asymmetricConflicts (A→B без B→A — G-H). Чистые функции,
данные инъектируются. TDD на фикстурах: RED→GREEN, 5/5.

coverage: skill:test-driven-development
2026-06-08 18:34:46 +03:00
Дмитрий d1a767867a fix(skill-contract): G-E — страж дрейфа инертен при пустом source.path без содержания
checkContractDrift: external без локального source.path И без поданного
currentContent (== null) → не сторожим (G4 инертен). Это прод-случай зеро-хеша
(Р5 MCP/marketplace): loadRegistry при пустом path не читает content. Прямой
вызов с поданным currentContent — drift сверяется как раньше. TDD: RED→GREEN,
48/48 skill-contract + registry. Дисциплина doubt→drift на реальных источниках
не понижена.

coverage: skill:test-driven-development
2026-06-08 18:33:05 +03:00
Дмитрий 4d257a1c44 docs(router-mentor): план реализации блока H (карточки + конфликт-рёбра)
Bite-sized TDD-план: Task1 G-E мех-правка, Task2 чистый чекер card-coverage,
Tasks 3.1-3.20 авторинг 86 карточек по батчам, Task4 конфликт-рёбра (§9+ADR),
Task5 живой инвариант m3e (последним → GREEN), Task6 гейт закрытия.
Исполнение инлайн (субагенты запрещены). commit-not-push.

coverage: skill:writing-plans
2026-06-08 18:07:22 +03:00
Дмитрий 1aacb2fe66 docs(router-mentor): H-design — вложены находки аудита достаточности (G-A/B/E/G/H)
Аудит «достаточно ли паспорта для роутера и судьи» (audit-context →
variant-analysis → sharp-edges → verification). Вердикт: схема достаточна,
новое поле не нужно. Вложены 5 находок: G-E (страж дрейфа инертен при
path=="" — точечная мех-правка), G-A (разделитель близнецов в capabilities),
G-B (инвариант «минимум содержания»), G-G (норма вход/выход), G-H (инвариант
резолв+симметрия). G-F/G-C/G-D отложены. commit-not-push.

coverage: direct:brainstorming-author
2026-06-08 18:03:17 +03:00
Дмитрий e2f5ba0406 docs(router-mentor): H-block design — node cards (R-11) + conflict edges (R-12)
Дизайн блока H реестра хвостов эпика «роутер-наставник»: наполнение графа
скилов данными — 86 карточек-контрактов (per-node, skill=slug) + явные
конфликт-рёбра (Tooling §9 + ADR, двусторонние) + инвариант покрытия (TDD).
Механику 3-A/3-B/3-C/3-D не трогаем. commit-not-push.

coverage: skill:brainstorming
2026-06-08 17:43:03 +03:00
Дмитрий 85ffb25e2d docs(router-mentor): сводный реестр хвостов эпика до боевого режима
Свод всех отложенных пунктов «роутер-наставник / реинжиниринг мозга»
(7 машин + router-discipline + периферия мозга + граф скилов): блоки
H/A/B/C/E/F/G, критический путь к продакшену, колонка «кто закрывает»
(Claude / владелец). Read-only сбор, ничего не чинится. Главный
недостающий кусок — карточки узлов (2 из ~86) + конфликт-рёбра (0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:40:40 +03:00
Дмитрий 7c3a495e5c docs(m7): build-handoff #5 — Фазы 4/5/6/7-код СОБРАНЫ, остались шаги владельца + переезд Ф8
Сменяет handoff #4. Готовый промт для новой сессии + полное состояние: 15 коммитов
02e3ff73..ee9e3123 (Ф4 8 / Ф5 2 / Ф6 2 / Ф7 3), регрессия 3090→3163+2 без регрессий,
commit-not-push. Детальные шаги ВЛАДЕЛЬЦА: (А) завершить ИИ-проводку судьи (реальный
транспорт runJudgeGate + ключ/флаг/обкатка shadow→block), (Б) Фаза 8 переезд (регистрация
М1–М6 в settings.json + увольнение v4-зоопарка + тест-гейт §9.2 + откат). Цепочка скилов,
квирки, якоря коммитов — для подхвата следующей сессией.
2026-06-08 15:07:01 +03:00
Дмитрий ee9e312300 feat(m7-phase7): доска Ф6 — judgeMode ← judgeGateMode() (реальный режим судьи: inert до активации)
CLI status-md-generator передаёт в доску «кто на посту» реальный режим судьи через
judgeGateMode() вместо хардкода 'inert'. До активации владельцем (флаг+ключ) → 'inert'
(видимое поведение не меняется); после активации доска покажет shadow/live-block.
Структурный тест фиксирует проводку (импорт + judgeMode: judgeGateMode(), не хардкод). 51/51 GREEN.
2026-06-08 14:46:12 +03:00
Дмитрий 1bc8b30563 feat(m7-phase7): enforce-judge-gate mode-aware + finalGate + runJudgeGate seam + live fail-CLOSE (§8)
Обёртка судьи переписана с {active}-shadow-заглушки на mode-aware: decide({mode,verdict,
floorBlocked}) — inert/shadow → allow ($0/D28 тихий); live-block → finalGate (судья GO И пол
чист → allow; иначе block; битый вердикт → NO-GO, сомнение→блок). runJudgeGate — owner-seam
(§8 последняя фаза: реальный llmCall-транспорт + извлечение продукта подключает владелец; до
этого нейтральный GO wired:false — flip mode=block без транспорта НЕ кирпичит). main:
inert/shadow → allow fail-open ($0); live-block → exitDisciplineDecision (fail-CLOSE, судья жив).
7/7 GREEN. Инертно до активации владельцем.
2026-06-08 14:44:35 +03:00
Дмитрий 84de110fee feat(m7-phase7): judgeGateMode — inert/shadow/live-block (§8, default shadow D28; рубильник важнее режима)
Новый резолвер режима судьи М4 в judge-gate-config: inert ($0, нет флага/ключа) / shadow
(active, логирует не блокирует — D28 «сперва тихо») / live-block (active + ROUTER_MENTOR_JUDGE_
MODE=block, блокирует на NO-GO). Рубильник judgeActive важнее режима: MODE=block без флага/ключа
→ всё равно inert. Default при активации — shadow (рекомендуемая обкатка §11). 9/9 GREEN.
2026-06-08 14:42:52 +03:00
Дмитрий 942f9bb8a1 feat(m7-phase6): доска «кто на посту» (computeGuardBoardBlock) — манифест М1–М6 + режим судьи + ПОСТ ПУСТОЙ (§7)
Новый чистый computeGuardBoardBlock в status-md-generator: read-only снимок обороны М1–М6 из
checkManifest (registered/missing) — missing → «⚠️ ПОСТ ПУСТОЙ» (нельзя ложно объявить protected,
SE-B), + режим судьи М4 (пока inert; live — Ф7) + счётчики недавних escape/блоков. Врезан в
renderStatus сразу после таблицы контролёров C1–C6; CLI читает .claude/settings.json (fail-quiet
→ {}). GUARD_LABELS маппит хуки на машины М1–М6. Read-only, ничего не блокирует. 49/49 GREEN.
2026-06-08 14:28:56 +03:00
Дмитрий 6c53fe998a feat(m7-phase6): SE-B — DEFAULT_REQUIRED_HOOKS до полного М1–М6 (+М4 judge-gate, М6 snapshot/escape, М1 журналер)
floor-manifest-check.DEFAULT_REQUIRED_HOOKS расширен с 5 (пол+стена+3 exfil-стража) до 9 —
+enforce-judge-gate (М4), +enforce-snapshot и +enforce-floor-escape-consume (М6), +enforce-
skill-journaler (М1). Раньше доска рапортовала бы «protected» при незарегистрированных М4/М6
(SE-B). Теперь «ПОСТ ПОЛНЫЙ» = весь контур М1–М6. WARN-only (сигнал, не блок, Δ8). 13/13 GREEN.
2026-06-08 14:26:57 +03:00
Дмитрий 3ef853695b feat(m7-phase5): decide §6 — ЗАКОН требует escape владельца, КАРТА — claude-md-management (build-loop SE-D)
decide переорганизован: escape-allow → контент-слои (recovery/suspicious/fake-rule, defense
для всей нормативки, сохраняют reason) → §6 classification (LAW non-escaped → block «требует
escape владельца, скил недостаточен») → CARD-поток (skillActive + judge + H3-degradation).
ЗАКОН (Pravila/PSR/Tooling + ad-hoc дисциплинарный исходник + контент-правка правил) больше НЕ
проходит по одному claude-md-management-скилу — только escape. КАРТА (CLAUDE.md/memory) —
прежний скил-канал. build-loop sealedPlanCoversEdit (Ф8 live через plan-lock). Tooling-тест
обновлён под §6; +4 §6-теста. 48/48 GREEN.
2026-06-08 12:49:01 +03:00
Дмитрий 2d2f3fc591 feat(m7-phase5): classifyNormative — детерминированный КАРТА/ЗАКОН + build-loop SE-D (§6)
Новые чистые экспорты в enforce-normative-content-rules: isDisciplineSourcePath (исходники
машин М1–М6 по префиксам enforce-/judge-/floor-/escape-grant/action-journal/receipt-/
shell-content-rules/plan-lock/classify-destructive/path-normalization), contentTouchesLaw
(контент правит правила/дисциплину), classifyNormative → {kind:'CARD'|'LAW'}. КАРТА =
CLAUDE.md/MEMORY.md/memory; ЗАКОН = Pravila/PSR/Tooling + дисциплинарный исходник ВНЕ плана +
контент-правка правил; build-loop: дисциплинарный исходник ПОД sealed-планом → КАРТА; сомнение
→ ЗАКОН. Тотален (null guard). Интеграция в decide — Task 2. 44/44 GREEN.
2026-06-08 12:46:46 +03:00
Дмитрий f9a4b10d1f test(m7-phase4): §12 whole-phase инвариант-гейт — анти-регресс поглощённой дисциплины
Lock-in тест над поглощённой дисциплиной Фазы 4a/4b (coverage/todowrite/rationalization +
self-debrief в манифесте): fail-CLOSE (exitDisciplineDecision, нет fail-open catch→block:false),
escape≠override (нет findOverride-вокабуляра), нет controller-text→allow (text-bypass вырезан,
Класс 1), манифест-членство (Ф6 self-check). Scope только поглощённые 4a/4b — не ещё-не-
поглощённые (memory-coverage/branch-switch/verify-* retire Ф8). 16/16 GREEN. Закрывает Фазу 4.
2026-06-08 12:28:31 +03:00
Дмитрий 9763025621 feat(m7-phase4c): Гейт-2 planGateSteps/runPlanGate (sealed план-требование) + Гейт-3 verify absorption proof (§4.2)
Гейт-2 combiner (зеркало criterionGateSteps): runPlanGate = specToPlanCoverage + k5CriterionCheck
через runGateLadder. Поглощает tdd-gate Rule #6 «план перед prod-кодом» в ЗАПЕЧАТАННОЙ форме
(покрытие sealed-плана + критерий значимого шага), без Класс-1 text-mention hasPlanIndicator.
Синергия с М2-стеной. Гейт-3 absorption-proof: runCriterionGate засчитывает только ПОДПИСАННЫЙ
зелёный по критерию (расписка М5), отвергает само-написанный sentinel. Live-wiring обоих — Ф7;
retire tdd-gate/verify-* — Ф8. 43/43 GREEN.
2026-06-08 12:26:34 +03:00
Дмитрий f3f3a70aa5 test(m7-phase4b): decomposition покрыт existenceCheck Гейт-1 через журнал (§5 coverage-map)
Proof покрытия: обещанный планировочный навык, не вызванный по журналу (extractSkillCalls),
→ existenceCheck.missingSkills непуст → NO-GO. Доказывает, что Гейт-1 М4 ловит скрытое
дробление через журнал-факт ДО retire no-op enforce-decomposition-detector (Ф8). Live-wiring
«обещанные навыки ← журнал» в judge-gate — Фаза 7. 39/39 GREEN (примитивы уже построены).
2026-06-08 12:21:12 +03:00
Дмитрий e791d33c78 feat(m7-phase4b): enforce-rationalization-audit fail-OPEN → fail-CLOSE (exitDisciplineDecision, §2.1 Класс 2)
main конвертирован с fail-OPEN (catch→block:false) на fail-CLOSE через exitDisciplineDecision
(throw/малформ → блок, анти-SE2). decide/audit/паттерны/halt-counter (priorFlagCount≥2) —
без изменений; язык-детектор остаётся мягким сигналом (flags), блок только halt-counter'ом.
Структурный тест сверяет наличие exitDisciplineDecision + отсутствие fail-open catch. 37/37 GREEN.
2026-06-08 12:20:10 +03:00
Дмитрий 2f39286ddf feat(m7-phase4b): rationalization + self-debrief в FAIL_CLOSE_DISCIPLINE_HOOKS (манифест Ф6)
Обе Stop-дисциплины Фазы 4b зарегистрированы в манифесте fail-CLOSE. self-debrief уже
fail-CLOSE поведенчески; rationalization конвертируется отдельным коммитом (Task 2).
Манифест-тест (for-of) сверяет наличие обоих. 89/89 тестов хелперов GREEN.
2026-06-08 12:18:51 +03:00
Дмитрий a630c994db feat(m7-phase4a): coverage-verify + todowrite-skill-verifier в FAIL_CLOSE_DISCIPLINE_HOOKS (манифест Ф6)
Оба поглощённых дисциплинарных стража Фазы 4a добавлены в FAIL_CLOSE_DISCIPLINE_HOOKS —
манифест-самопроверка Фазы 6 потребует их регистрации. Манифест-тест (for-of) сверяет
наличие обоих. 87/87 тестов хелперов GREEN.
2026-06-08 11:10:41 +03:00
Дмитрий a29fa9caa9 feat(m7-phase4a): todowrite-skill-verifier — журнал-факт session-scope + fail-CLOSE + PreToolUse (§4.2)
Выполненный todo, claim'ящий Skill, теперь сверяется с ЖУРНАЛОМ вызовов (extractSkillCalls,
канал М1) вместо transcript-извлечения. Session-scope осознанно (выполненный todo мог
закрыться в прошлом ходе — отличие от coverage, которое turn-scoped). decide получает
journalSkillCalls; main грузит журнал через loadJournal+extractSkillCalls, обёрнут
exitDisciplineDecision (fail-CLOSE Фазы 0). Переориентирован на PreToolUse-семантику
(предотвращение, §4.2 [Pre]; регистрация matcher — шаг владельца Ф8). 5/5 тестов GREEN.
2026-06-08 11:08:56 +03:00
Дмитрий 02e3ff7379 feat(m7-phase4a): coverage-verify — журнал-факт K2 (turn∩journal) + fail-CLOSE + снят override (§4.2)
coverage skill:X теперь требует X в ПЕРЕСЕЧЕНИИ «Skill-tool_use этого хода ∩ журнал
вызовов» (turn-scope от границы хода transcript, факт от журнала М1 через skillTakenByJournal
K2). Не по строке coverage: — Класс 1 закрыт; turn-scoping без false-pass (X из прошлого хода
в журнале, но не в transcript этого хода → block). direct/node/chain/hook/agent приняты на
этом слое (журналом не верифицируемы, §4.2). main обёрнут exitDisciplineDecision (fail-CLOSE
Фазы 0). Override-вокабуляр снят (§12 escape≠override). 9/9 тестов GREEN.
2026-06-08 11:07:35 +03:00
Дмитрий 3bd3caee40 docs(m7): build-handoff #4 — Фазы 0/2/3 собраны + Фаза 4 SCOPED, промт для новой сессии 2026-06-08 10:47:41 +03:00
Дмитрий 1d8457e671 docs(m7): SCOPED план Фазы 4 — поглощение дисциплины в М4 (§4.2, под-фазы 4a/4b/4c) 2026-06-08 10:42:15 +03:00
Дмитрий 521a64ed05 docs(m7): план Фазы 3 — skill-журналер + seed-allow реактивных навыков (SE-K, §4.2/§12) 2026-06-08 10:37:32 +03:00
Дмитрий 5320de8371 feat(m7-phase3): enforce-skill-journaler в FAIL_CLOSE_DISCIPLINE_HOOKS (P-7, манифест Фазы 6) 2026-06-08 10:36:42 +03:00
Дмитрий 3fad5e0401 feat(m7-phase3): SEED_SKILLS +реактивные дисциплинарные навыки (SE-K — стена не рубит вне плана) 2026-06-08 10:35:33 +03:00
Дмитрий 576e9c6079 feat(m7-phase3): enforce-skill-journaler — PostToolUse(Skill) журнал op:Skill + мост K2 (SE-K) 2026-06-08 10:34:19 +03:00
Дмитрий db3224992c docs(m7): план Фазы 2 — escape-survivability полная (правило 7б,в + §6 escape-honor) 2026-06-08 10:30:00 +03:00
Дмитрий 317f8cb6fb feat(m7-phase2): supreme-gate panicEscapeDecision — escape переживает сбой сетапа main (правило 7б) 2026-06-08 10:28:43 +03:00
Дмитрий b6fe66e34c feat(m7-phase2): normative-content-rules чтит escape — §6 канал правки ЗАКОНА (правило 7в) 2026-06-08 10:25:00 +03:00
Дмитрий 73fa2d61ff feat(m7-phase2): read-path-deny чтит escape владельца (правило 7в) 2026-06-08 10:21:34 +03:00
Дмитрий 9148c8c6bd feat(m7-phase2): enforce-floor panic-ветка — escape переживает throw floorDecide (правило 7б) 2026-06-08 10:19:48 +03:00
Дмитрий f71f1abef8 feat(m7-phase2): escapeAllowsEvent — panic-предикат escape-survivability (правило 7б) 2026-06-08 10:17:43 +03:00
Дмитрий 8a9e21c280 docs(m7): план Фазы 0 — fail-CLOSE-карвут + escape-survivability примитивы 2026-06-08 10:08:09 +03:00
Дмитрий 91a5acc4bf fix(m7-phase0): disciplineOutcome строгий fail-CLOSE на малформ-возврат (sharp-edges) 2026-06-08 10:07:52 +03:00
Дмитрий dc30c5daee feat(m7-phase0): disciplineOutcome fail-CLOSE + P-7 списки + контракт helpers:7 (правило 1) 2026-06-08 10:02:43 +03:00
Дмитрий bbd66c9b61 feat(m7-phase0): canonicalAction тотальна — внешний try + pathNormalizeSafe (правило 7а) 2026-06-08 09:59:29 +03:00
Дмитрий 06ad12cd94 feat(m7-phase0): pathNormalizeSafe — тотальный normalize (правило 7а) 2026-06-08 09:57:41 +03:00
Дмитрий 8153f96aff docs(m7): build-handoff #3 — Фаза 1 content-floor собрана + PS single-source (HEAD 8e56df38)
Сменяет build-handoff #2. Фиксирует: Фаза 1 (content-floor V1/V1-PS) реализована
полностью (11 коммитов 1c251d25..8e56df38), регрессия 3044+2 GREEN 0 регрессий,
commit-not-push. Готовый промт новой сессии + цепочка скилов (executing-plans драйвер,
per-Task audit→TDD→systematic-debugging→verification, строгий sharp-edges после опасных
Task, гейт закрытия audit→sharp-edges→variant-analysis→regression→verification) +
квирки (vitest фильтры раздельно, гейты блокируют rm/git rm, tdd-real-test-verifier diff
требует expect, for-of не it.each) + отложенное в Фазу 8 (удаление powershell-destructive,
полная PS enumeration). Следующий шаг — Фаза 0 через writing-plans по команде владельца.
2026-06-08 09:40:25 +03:00
Дмитрий 8e56df3842 refactor(m7-floor): PS-content единый источник — matchPsHardBlacklist в shell-content-rules (variant-analysis)
Закрывающий variant-analysis-гейт Фазы 1 вскрыл класс P-1 для PowerShell: у
powershell-gate был СВОЙ PS_HARD_BLACKLIST (29 паттернов), а пол использовал
отдельный узкий psContentBlock (7) — подмножество, которое дрейфовало бы (та же
проблема, что P-1 для Bash). После Фазы 8 (увольнение powershell-gate) пол оказался
бы слабее гейта, который он заменяет. Решение владельца: исправить сейчас.

Зеркало P-1:
- PS_HARD_BLACKLIST + matchPsHardBlacklist перенесены в единый дом shell-content-rules;
  powershell-gate ре-экспортирует (тест single-source-identity: ссылка gate === SCR).
- +bare-egress (Invoke-WebRequest/iwr/irm/curl/wget bare — floor НЕ default-deny, нужен
  в blacklist, не только в whitelist гейта) +rmdir +rm (алиасы Remove-Item, которые гейт
  ловил whitelist'ом default-deny — полу нужны явно).
- psContentBlock стал ТОНКИМ делегатом над matchPsHardBlacklist (симметрия с
  bashIsContentBlock); пол через него видит ТОТ ЖЕ набор, что гейт. Дрейф невозможен.
- Следствие (осознанно): floor теперь блокирует все Set-Content/sc/$env/Az/… как гейт
  (симметрия с Bash-полом, блокирующим все cp/mv/redirect). Escapable. FP-толерантность
  унаследована от гейта (например `sc query`/`del.txt` — gate-aligned, fail-safe).

powershell-destructive.mjs физически не удалён (живые gate'ы блокируют rm/git rm) —
оставлен тонким делегатом (НЕ второй источник). Удаление — follow-up по git-approval.

Регрессия tools-only: 3044 passed + 2 skip (baseline 2843+2, 0 регрессий).
2026-06-08 09:34:23 +03:00
Дмитрий 473fd21136 feat(m7-floor): §12 content-floor инвариант — весь BASH_HARD_BLACKLIST floored (P-6)
Task 1.6 Фазы 1 М7. Тест-генератор: КАЖДАЯ запись BASH_HARD_BLACKLIST рубится полом
даже как валидный шаг плана. Итерация по экспортированному списку → полнота порта ПО
КОНСТРУКЦИИ: новый паттерн без сэмпла → красный (drift-детектор), floor не рубит →
красный. Анти-регресс «непробиваемости» закреплён за Фазой 1 (P-6), не за §9.2-smokes.
+C16 stderr-redirect + #34 injection (отдельные ветки matchBashHardBlacklist).

Полная регрессия tools-only: 2997 passed + 2 skip (baseline 2843+2, +154 Фазы 1,
0 регрессий). 99 floor-decide GREEN.
2026-06-08 09:16:04 +03:00
Дмитрий 6556f5ca0a test(m7-floor): инвариант escape снимает content-block (Bash+PS) + специфичность P-2
Task 1.5 Фазы 1 М7. Код уже escapable (1.3/1.4) — тесты фиксируют инвариант против
регресса. Покрыто: Bash node -e + PS Remove-Item + PS forge-write снимаются точным
грантом; P-2 специфичность (грант A не открывает команду B) для PS И Bash; кросс-shell
изоляция (Bash-грант не открывает PS-команду — разные canonicalAction-префиксы). 72 GREEN.
2026-06-08 09:13:55 +03:00
Дмитрий 183733835f harden(m7-floor): PS-алиасы forge+delete (sharp-edges после 1.4)
Строгий sharp-edges-гейт после Task 1.4 вскрыл обход через PowerShell-алиасы:
- forge P-3: `sc`/`cpi`/`ni` (алиасы Set-Content/Copy-Item/New-Item) писали в
  ~/.claude/runtime/.env мимо литеральных глаголов → подделка escape-гранта.
  Закрытие: PS_WRITE_VERB_RE += sc/ac/cpi/copy/mi/move/ni/tee (path-gated, FP только
  с протектед-путём; контроль `sc query` не over-блокируется).
- delete: `del`/`ri`/`rd`/`rmdir`/`erase` -Recurse -Force обходили литеральный
  Remove-Item. Закрытие: PS_CONTENT_BLOCK_RE алиасы для long+short флагов.

154 GREEN (floor + powershell-destructive + enforce-floor + supreme-gate).
Отложено в Фазу 8 §5 (карты покрытия): `&` call-operator, Invoke-Command (icm),
PS sub-expression $(), полная enumeration алиасов — coverage, не структурный класс.
2026-06-08 09:12:38 +03:00
Дмитрий ea83a714e4 feat(m7-floor): floor-decide ветка PowerShell content-block + forge-страж (V1-PS, P-3)
Task 1.4 Фазы 1 М7. Ветка PowerShell пола (после Bash, до OBSERVE_TOOLS): psContentBlock
(Remove-Item/-Recurse/iwr/iex/Start-Process/Out-File/redirect) ИЛИ psProtectedWrite
(P-3 forge-страж: PS-запись в ~/.claude/runtime / .env / секрет — иначе Set-Content
подделывает escape-грант). Escapable owner-санкцией. Реоткрытие v3.8 F1. 60 GREEN.

НАХОДКА РЕАЛИЗАЦИИ: plan-версия psProtectedWrite тестила whole-string SECRET_PATH_RE
с $-якорем → `.env` в позиции аргумента (-Path app/.env -Value …) терялся. Робастнее:
проверяем каждый токен (без кавычек, \→/) против anchored RUNTIME_RE/SECRET_PATH_RE —
runtime (forge-вектор) И secret-write закрыты, обычная запись не over-блокируется.
2026-06-08 09:09:18 +03:00
Дмитрий 7277584eaf harden(m7-floor): bashIsContentBlock рубит sub-shell как класс (sharp-edges после 1.3)
Строгий sharp-edges-гейт после Task 1.3 вскрыл класс обхода: подстрочный
matchBashHardBlacklist не де-обфусцирует command-substitution. Split-assembly
`$(echo no)$(echo de) -e x` и backtick `echo node` собирают интерпретатор только
при shell-eval → в сырой строке 'node' нет → content-block FALSE → пол пропускал.
router-gate ловит сейчас, но Фаза 8 (увольнение router-gate) открыла бы класс.

Закрытие: bashIsContentBlock проверяет detectSubshell(raw).found ($()/backtick/
process-subst/heredoc) → любой sub-shell = произвольное исполнение → content-block.
Независимо от parse-успеха. Escapable; router-gate тоже блокирует все sub-shell →
0 новых FP. Подтверждено: per-segment токенайзер де-обфусцирует n''ode/no\de.
114 GREEN (floor + enforce-floor + supreme-gate).
2026-06-08 09:06:23 +03:00
Дмитрий 89e9ca159e feat(m7-floor): floor-decide content-block ветка Bash (V1, escapable)
Task 1.3 Фазы 1 М7. bashIsContentBlock (whole+per-segment, паритет с bashIsFloor, P-4)
через единый matchBashHardBlacklist (P-1). floorDecide Bash-ветка зовёт content-block
ПЕРВЫМ (до bashIsFloor); escape снимает (owner-санкция). 44 GREEN.

НАХОДКА АУДИТА (задокументирована в коде+тесте): NB плана «echo "node -e foo" НЕ
over-блокируется» недостижим при подстрочном matchBashHardBlacklist (не отличает
опасную строку-аргумент echo от команды-интерпретатора). Решение — принять FP:
floor УЖЕ принял этот класс для `git push "--force"` (fail-safe, escapable);
under-block в полу страшнее over-block. Парсинг командной позиции НЕ вводим.
2026-06-08 09:01:04 +03:00
Дмитрий a5b62fbfad fix(m7-floor): canonicalAction +PowerShell — escape-привязка специфична (P-2)
Task 1.2b Фазы 1 М7 (КРИТ). canonicalAction получил ветку PowerShell:
`powershell:${normalizeCommand(command)}`. Без неё PS уходил в write-fallback,
пустой путь резолвился в cwd → один escape-грант разблокировал ЛЮБУЮ PS-команду
в окне (тест специфичности был зелёным ложно: a===b==='write:<cwd>').

Сквозной фикс: тот же canonicalAction зовут пол (Task 1.4), стена (enforce-supreme-gate)
и консьюмер. Bash/Write/mcp-ветки не задеты. 118 GREEN (escape-grant + 4 потребителя).
2026-06-08 08:56:44 +03:00
Дмитрий 91af38ca11 feat(m7-floor): powershell-destructive psContentBlock (V1-PS)
Task 1.2 Фазы 1 М7. Новый модуль tools/powershell-destructive.mjs — psContentBlock
для PowerShell-tool (PS-нативные глаголы Remove-Item/-Recurse/iwr/iex/Start-Process/
Out-File/redirect НЕ матчат unix-regex classify-destructive). Реоткрытие v3.8 F1:
PowerShell-tool был полностью вне scope content-floor. 16 GREEN.
2026-06-08 08:55:30 +03:00
Дмитрий 3847c863ca feat(m7-floor): classify-destructive +contentBlock (правило 8, V1 Bash)
Task 1.1 Фазы 1 М7. Поле contentBlock = matchBashHardBlacklist(cmd) !== null
(единый источник P-1, whole-string) рядом с floor/suspicious. suspicious ||=
contentBlock (P-5: голоса судьи М4 видят content-опасное). reason расширен.

Поле для видимости судьи; фактический блок пола — bashIsContentBlock
(whole+per-segment, Task 1.3). 71 GREEN (+38 content-block кейсов, incl.
P-1-пробелы env-prefix/--watch/2>file/cp/mv).
2026-06-08 08:53:53 +03:00
Дмитрий 1c251d2592 refactor(m7-floor): matchBashHardBlacklist -> shell-content-rules (единый дом content-правил, P-1)
Task 1.0.5 Фазы 1 М7. Перенос BASH_HARD_BLACKLIST + stderrRedirectBlock +
matchBashHardBlacklist из enforce-router-gate.mjs в постоянный дом
shell-content-rules.mjs (там уже живут hasInjection + matchAny). router-gate
ре-экспортирует их для обратной совместимости (тесты + тело гейта).

Единый источник правды устраняет port-дрейф content-floor (М5) по конструкции:
content-block пола (Task 1.1/1.3) импортирует ТОТ ЖЕ матчер, а не ручную копию.

Тесты: +describe single-source identity (router-gate BASH_HARD_BLACKLIST ===
shell-content-rules ссылка) + matchBashHardBlacklist hosted-in-SCR. 233 GREEN.
Чистый рефактор-перенос, 0 изменений семантики.
2026-06-08 08:51:31 +03:00
Дмитрий 15af97adae docs(m7): build-handoff #2 — состояние после фолжа разбора плана (HEAD 475d381e)
Готовый промт для новой сессии: подтвердить HEAD 475d381e, прочитать
handoff#2 + спеку §13 addendum + план Фазу 1 (Task 1.0.5-1.6), спросить
владельца, НИЧЕГО не делать самому. Заменяет handoff#1 (stale HEAD 8ba9a21c).
Карта правок P-1..P-8 (план↔спека). Код НЕ строили. commit-not-push.
2026-06-08 08:24:17 +03:00
Дмитрий 475d381e0c docs(m7): fold plan-critique findings P-1..P-8 into plan + spec
Independent critical review of the implementation plan (audit-context ->
sharp-edges -> variant-analysis -> systematic-debugging, grounded against
real M1-M6 code). 8 findings, all code-grounded, no ghosts:

- P-1 (CRIT): content-floor "full port" was a SUBSET of BASH_HARD_BLACKLIST
  (lost #21 env-prefix / #22 --watch / #34 echo-inj / C16 2>file /
  cp-mv-chmod-chown-chgrp; cp X ~/.claude/runtime = escape-grant forge)
  -> single source matchBashHardBlacklist relocated to shell-content-rules
  (Task 1.0.5) + §12 content-floor invariant proves completeness.
- P-2 (CRIT): canonicalAction has no PowerShell branch -> every PS command
  collapses to 'write:' -> one escape unlocks ALL PS commands; Task 1.5 test
  was spuriously green (both sides equally broken) -> Task 1.2b + specificity.
- P-3 (HIGH): PS floor branch returned block:false skipping runtime/secret
  guard (command field not parsed) -> Set-Content ~/.claude/runtime forge
  -> psProtectedWrite guard (Task 1.4).
- P-4 (MED): content-block whole-string only -> bashIsContentBlock whole+per
  -segment parity with bashIsFloor (Task 1.3).
- P-5 (MED): suspicious blind to content-danger -> suspicious |= contentBlock.
- P-6 (MED): §12 CI-invariants ownerless -> assigned per phase (phase rule).
- P-7 (LOW): Phase 0 fail-CLOSE "subset" unlisted -> explicit hook list.
- P-8 (LOW): plan = detailed Phase 1 + scoped skeleton -> honest framing.

Plan: Tasks 1.0.5/1.1/1.2b/1.3/1.4/1.5/1.6 + phase-transition rule + self-review.
Spec: §5 PowerShell row, §12 M5 line, §13 addendum.
No code built. commit-not-push.
2026-06-08 08:20:40 +03:00
Дмитрий eac1c45bbb docs(m7): build-handoff в новую сессию — состояние после критразбора + плана
Готовый промт для подхвата: HEAD 8ba9a21c, дизайн закрыт + критразбор/поправки
(b98b1885) + план (8ba9a21c). Next = сборка Фазы 1 (content-floor) инлайн TDD
по команде владельца. Квирки (vitest/git/junction/escape/грязь дерева) + жёсткие
правила (commit-not-push, субагенты запрещены, ничего не делать самому).
2026-06-08 07:56:45 +03:00
Дмитрий 8ba9a21c9c docs(m7): план реализации — мастер (фазы 0-8) + Фаза 1 (content-floor) детально
writing-plans по поправленной спеке М7. Scope-check: 9 подсистем →
dependency-ordered фазы 0-8. Фаза 1 (content-floor V1/V1-PS — критический
корень переезда, §10 запрещает увольнять router-gate до неё) в полной
bite-sized TDD-детализации (Task 1.0-1.6 с кодом); фазы 0,2-8 scoped,
разворачиваются в bite-sized при подходе. Self-review: spec coverage полон,
type-consistency проверена. Исполнение — инлайн (субагенты запрещены владельцем).
2026-06-08 07:53:03 +03:00
Дмитрий b98b18850a docs(m7): критический разбор спеки — поправки V1/V1-PS/SE-I/SE-C/SE-K/SE-D/SE-A/SE-B
Независимый критический разбор дизайна М7 (цепочка audit-context-building →
sharp-edges → variant-analysis → systematic-debugging). Фактология §2
подтверждена реальным кодом 8/8; sweep Класса 1 полон. Закрытия:

- V1/V1-PS (КРИТИЧНО): полный port BASH_HARD_BLACKLIST + PowerShell-набор в
  content-floor М5 (правило 8), блок независимо от плана. Иначе in-plan
  node -e / curl-exfil / npm install проскальзывали как шаг плана; node -e
  мог подделать escape-грант и подорвать машины изнутри.
- SE-I/L6: escape-survivability (правило 7) — тотальные canonicalAction/
  normalize, panic-ветка до per-tool-логики, чтение escape всеми остающимися
  fail-CLOSE-стражами (read-path-deny/mcp-classification/normative-content-rules).
- SE-C/SE-K: журнал-K2 честно ограничен skill:-каналом; +PostToolUse
  skill-журналер + seed-allow реактивных навыков (иначе seed/ad-hoc навыки
  в журнал не попадают).
- SE-D: граница КАРТА/ЗАКОН для .mjs через "покрыт ли правкой план-шаг"
  (build-loop не клинит, ad-hoc самомодификация требует escape).
- SE-A: §4.2 метки [Pre]/[Stop]. SE-B: манифест до полного набора М1-М6.
- §1 промис снабжён предпосылками П1/П2/П3 + 4-е структурное условие; §13 changelog.

Verify-item прошлого handoff закрыт фактом: enforce-parallel-session-lock = no-op.
Только спека (.md), код не трогался.
2026-06-08 07:48:13 +03:00
Дмитрий 9e7ca7ef19 docs(m7): дизайн Машины 7 — растворение зоопарка + непробиваемая дисциплина + полный переезд М1–М6
Design-doc (12 секций + само-аудит) + DONE-handoff дизайн-фазы.
Цепочка: audit-context-building + sharp-edges + variant-analysis + brainstorming.
Карта обходов дисциплины (6 классов + корень enforce-hook-helpers:7) → поглощение
в М1–М6 по 6 правилам (fail-CLOSE / PreToolUse / журнал-факт / escape-only / манифест / громко).
3 куска М7: зоопарк+дисциплина / normative-канал (карта свободно, закон — escape) / доска «кто на посту».
Реализация НЕ начата — ждёт ревью владельца → writing-plans. commit-not-push.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 07:06:00 +03:00
Дмитрий a0b98d227f docs(m6): DONE-handoff промт-блок — sync HEAD 8bfef418 + планка 2843+2 после пост-аудит фиксов
Промт для новой сессии теперь указывает актуальный HEAD и регрессионную планку; детали 4 фиксов — в разделе «Пост-аудит правки» + памяти.
2026-06-07 19:49:28 +03:00
Дмитрий 8bfef418c2 docs(m6): DONE-handoff — пост-аудит правки FIX-1..4 + DOC-1 (escape не сквозной через зоопарк)
Зафиксированы 4 аудит-фикса и caveat DOC-1: escape чтут только стена М2/пол М5/egress; router-gate / runtime-write-deny / судья М4 escape не знают → реальные разрушительные не пройдут до М7 (растворение зоопарка). Ожидаемо по §7.
2026-06-07 19:43:18 +03:00
Дмитрий d221ba499d fix(m6): аудит-правки — G-5 egress токен, единый findOpenGrant, escape-журнал, уникальный id снимка
Аудит М6 (audit-context-building + sharp-edges + корректность; комплекс М1–М6), 4 практичных фикса (TDD):
- FIX-1: enforce-mcp-classification печатает точный FLOOR-ESCAPE токен в egress/verdict-блоке (G-5 для egress).
- FIX-2: escape-grant.findOpenGrant — единый предикат свежести для open и consume (гасит ИМЕННО открывший грант; чинит утечку one-shot при дублях/future-ts).
- FIX-3: enforce-supreme-gate.runGate — best-effort журнал escape (escape:true), указатель не двигается, сбой журнала не блокирует.
- FIX-4: enforce-snapshot — уникальный дефолтный id снимка (ts-pid-счётчик) против ms-коллизии refs/floor-snapshots.

Регрессия tools-only 2843 passed + 2 skip (+9, 0 регрессий). FIX-5 (подпись гранта) сознательно не делали (нулевая защита без ключа; protected-path уже гарантирует).
2026-06-07 19:43:05 +03:00
Дмитрий 3ea34d42dd docs(router-mentor): M6 DONE-handoff — промт для новой сессии (пуш/активация/М7) 2026-06-07 19:14:43 +03:00
Дмитрий d0e0bd18c9 test(m6): сквозные инварианты escape + snapshot; регрессия зелёная (2834+2) 2026-06-07 19:04:57 +03:00
Дмитрий 28b92d90e6 feat(m6): enforce-snapshot — git-точка возврата перед разрушительным (fail-close) 2026-06-07 19:03:36 +03:00
Дмитрий a5b99eaa7e feat(m6): snapshot-decide — триггер снимка + чистое-дерево vs ошибка 2026-06-07 19:02:21 +03:00
Дмитрий 6e2d485f44 feat(m6): egress-escape — снятие egress-блока совпавшим floor_escape 2026-06-07 19:01:04 +03:00
Дмитрий b83cfc65b9 feat(m6): floor-escape-consume — одноразовое погашение пропуска (PostToolUse) 2026-06-07 18:58:32 +03:00
Дмитрий 4a10932cb6 feat(m6): G-1 сквозной escape в верховной стене М2 (allow без продвижения указателя) 2026-06-07 18:55:56 +03:00
Дмитрий d2109ac1dc feat(m6): пол — escape во всех ветках, замена approvalOpen 2026-06-07 18:52:34 +03:00
Дмитрий a9e8585767 feat(m6): писать floor_escape-пропуск из AskUser-ответа 2026-06-07 18:46:13 +03:00
Дмитрий 6b44e7afd8 feat(m6): toFloorEscapeRecord — распознавание escape-одобрения 2026-06-07 18:44:09 +03:00
Дмитрий 87d84a2e3f feat(m6): escape-grant pure core — canonicalAction + escapeGrantOpen + readers 2026-06-07 18:41:42 +03:00
Дмитрий 4f7b1fab09 docs(router-mentor): M6 build-handoff — промт для сессии реализации
Готовый промт для новой сессии: дерево/ветка, состояние (дизайн+план+аудит закрыты,
HEAD 20c85ede, регрессия 2789+2 skip, не запушено), что строим (escape сквозной
override + авто-снимок), порядок пакетов 1-9+4b, HARD-RULE скилов (executing-plans
инлайн, audit-context перед патчами, TDD, review, verification, regression),
жёсткие правила (commit-not-push), квирки (vitest/git-PowerShell/гейт/git restore не
в whitelist/tdd-gate/память-два-охранника/судья-нейтрально/coverage-verify/baseline 2789),
аудит уже сделан (G-1 α / G-2 / G-5 / G-6 / G-8 — не повторять), старт с Пакета 1.

Только handoff-артефакт, кода нет. Без push (commit-not-push).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 18:33:14 +03:00
Дмитрий 20c85ede09 docs(router-mentor): M6 аудит плана — G-1 α (escape сквозь стену М2) + G-2/G-5/G-6/G-8
Аудит плана реализации (writing-plans self-review + audit-context-building сквозь
М1–М5 + sharp-edges). Главная находка G-1: верховная стена М2 (enforce-supreme-gate
Δ7 + разговорный режим) блокирует разрушительное/мутаторы независимо от пола → floor_escape
(только пол) был no-op сквозь стену. Вариант α (решение владельца): escape — сквозной
override, чтимый стеной (allow без продвижения указателя), полом, egress.

Спек: §3 +enforce-supreme-gate, §4 блок G-1 (сквозной escape) + G-5/G-6/G-8, §9 +патч,
§11 аудит-таблица. План: новый Пакет 4b (стена М2, TDD), Пакет 4 +G-2 (переписать блок
двери) +G-5 (точный токен) +G-6 (запрет override), активация +supreme-gate, self-review.

Проверено ОК: экспорты совпадают, М1/М3/М4 не ломаются, общий канал askuser-decisions
фильтр по type. Только дизайн-артефакты, кода нет. Без push (commit-not-push).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 18:18:59 +03:00
Дмитрий 3fb7a0517f docs(router-mentor): M6 spec — синк floor-escape-consume из плана (one-shot PostToolUse)
При написании плана выяснилось: строгая одноразовость «погашение после реального
исполнения» (§4 F-S1) требует отдельного PostToolUse-консьюмера. Добавлены модули
floor-escape-consume.mjs (ядро) + enforce-floor-escape-consume.mjs (обёртка) в §3/§9,
уточнён §4 (погашение после исполнения → сбой снимка пропуск не тратит), §9 активация
+ PostToolUse, §11 поправка план→спек. Спек и план теперь совпадают.

Только дизайн-артефакт, кода нет. Без push (commit-not-push).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 18:01:05 +03:00
Дмитрий 719648cd08 docs(router-mentor): M6 implementation plan — escape + auto-snapshot (TDD пакеты 1-9)
План реализации Машины 6 по спеку 2026-06-07-router-mentor-machine-6-design.md.
9 пакетов, bite-sized TDD (RED→GREEN→commit), весь код в шагах, конвенции
(vitest абс-команда / commit через PowerShell / TDD-гейт / audit-context перед патчами).

Пакеты: 1 escape-grant ядро · 2 toFloorEscapeRecord · 3 писатель floor_escape ·
4 пол escape во всех ветках · 5 floor-escape-consume (one-shot, PostToolUse) ·
6 egress-escape · 7 snapshot-decide · 8 enforce-snapshot · 9 интеграция+регрессия.

NB: Пакет 5 вводит модуль floor-escape-consume, которого нет в инвентаре §9 спека —
операционализация одноразовости «погашение после исполнения»; отмечено в self-review,
к согласованию на ревью плана. Планка регрессии ≥ 2789 passed + 2 skip.

Только план-артефакт, кода нет. Без push (commit-not-push).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 17:57:01 +03:00
Дмитрий 47de8447dd docs(router-mentor): M6 design — факт-аудит кода, правки F1-F4/F-S1/F-S2/I1-I4
Аудит спека М6 тремя линзами (audit-context-building сверка с реальным кодом М5 +
sharp-edges; agentic-actions-auditor неприменим — CI-scope). Внесены правки:

F1  настоящий §4.5-парсер = askuser-answer-parser + enforce-askuser-answer-parser
    (не enforce-branch-switch).
F2  floor-набор разнесён на 3 локуса (Bash / Write-ветка / egress); escape на все три (B).
F3  binding = точное совпадение канонической строки (normalizeCommand / tool:pathNormalize
    / egress), не хеш над classifyDestructive (тот даёт булевы).
F4  toApprovalRecord git-only → migrate:fresh/db:wipe/.env были не одобряемы; floor_escape
    закрывает.
F-S1 escape = отдельный kind floor_escape + отдельный reader + one-shot консум
     (не переиспользование 5-мин approve_git_operation).
F-S2 снимок: чистое дерево → ref=HEAD (успех); fail-close только на реальную ошибку git.
I1-I4 переиспользование helper'ов / честный scope снимка / ясность runtime-записи хуком /
     фиксация неприменимости agentic-actions-auditor.

§11 — карта находка→правка. Только дизайн-артефакт, кода нет. Без push (commit-not-push).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 17:40:32 +03:00
Дмитрий d02932b053 docs(router-mentor): M6 design — escape + auto-snapshot (brainstorming)
Машина 6 (новая фаза дизайна эпика «роутер-наставник»): аварийный выход (escape)
+ авто-снимок (git-точка возврата). Достраивает безопасность пола М5.

Решения с владельцем: Р-М6-1 scope = escape + снимок (М7 = normative-канал /
растворение зоопарка / доска); Р-М6-2 escape = всплывающий вопрос (side-channel,
отпечаток-binding); Р-М6-3 escape на весь floor-список (B); Р-М6-4 снимок = git-
состояние (A); Р-М6-5 подход A (escape в floor-decide + отдельный enforce-snapshot).

Spec: docs/superpowers/specs/2026-06-07-router-mentor-machine-6-design.md.
Только дизайн-артефакт, кода нет. Без push (commit-not-push).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 17:15:20 +03:00
Дмитрий 32ffab621d docs(m6): handoff в новую сессию — М5 закрыта+переаудичена, М6 = новая фаза дизайна
Готовый промт: дерево/состояние (HEAD 849723bc, аудит М5 F-1/F-3/F-6 + F-2 память + F-4=C,
регрессия 2789+2 skip, не запушено) + шов М5<->М6 (spec §5 экспорт) + scope М6 (spec §6 YAGNI:
авто-снимок / портативный normative-канал / escape / растворение старых хуков; доска = М7) +
HARD-RULE скилов (brainstorming->writing-plans, инлайн, без суб-агентов) + квирки (vitest/git/
гейт/tdd/запись-в-память-два-охранника/судья-нейтральные-слова/baseline 2789) + хвосты М5.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:48:45 +03:00
Дмитрий 849723bc04 fix(m5): F-6 — нижняя граница времени в floor-decide approvalOpen
approvalOpen считал свежим одобрение с будущим ts (now - ts < 0 <= window) — часовой
сдвиг/подлог открывал дверь владельца. Добавлена нижняя граница now - ts >= 0: свежесть =
ts в прошлом И в пределах окна.

Аудит Машины 5 (объектив корректность). TDD RED->GREEN. Регрессия tools-only 2789 + 2 skip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:18:44 +03:00
Дмитрий 7dd3a16531 fix(m5): F-3 — манифест floor-manifest-check проверяет весь защитный контур
DEFAULT_REQUIRED_HOOKS проверял только enforce-floor — owner мог зарегистрировать пол,
забыть верховную стену / exfil-стражей и получить зелёный «protected». Расширено до
security-load-bearing набора: enforce-floor + enforce-supreme-gate + normative-content
+ read-path-deny + mcp-classification. «Пол подтверждён» теперь = весь контур. WARN-only
(Δ8 — сигнал, не блок); owner может передать иной requiredHooks.

Аудит Машины 5 (объектив sharp-edges). TDD RED->GREEN. Регрессия tools-only 2789 + 2 skip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:18:26 +03:00
Дмитрий 9c3205ad7c fix(m5): F-1 — убрать мёртвый контент-скан в enforce-read-path-deny
decide() гейтил по content в ветке, недостижимой в проде: enforce-read-path-deny —
PreToolUse(Read)-хук, main() не передавал content, а контента до чтения нет. Ветка
+ импорт scanSecrets убраны — decide() гейтит строго по пути (path-deny). Реальный
exfil (исходящий payload) закрыт живым enforce-mcp-classification.scanEgress; чтение
секрета само по себе не вынос.

Аудит Машины 5 (объектив sharp-edges + agentic-actions-auditor). TDD RED->GREEN.
Регрессия tools-only 2789 passed + 2 skip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:18:05 +03:00
Дмитрий 2925d063fb docs(m5): handoff session-final — Машина 5 закрыта, финализация + продолжение эпика
Готовый промт для новой сессии: дерево + состояние (Пакеты 5-8 закрыты, 14 коммитов
24ce7b39..5d350b69, регрессия 2788+2skip, не запушено) + что осталось (finishing-branch под
«пуш» / память direct:memory-sync / активация владельцем) + HARD-RULE алгоритма скилов (запрет
нарушения, суб-агенты запрещены) + квирки (vitest/git/гейт/tdd-хуки/baseline 2788).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:35:17 +03:00
Дмитрий 5d350b6997 feat(m5): Пакет 8 — Δ3 честный двухтакт reconcile (8.1 пред-запись + 8.2 реконсилер)
Δ3: убрано обещание «атомарно на исполнении» (PreToolUse не видит факт). Достижимый максимум —
два такта:
- 8.1 (runGate): пред-запись НАМЕРЕНИЯ в журнал ДО allow. Журнал вернул false ИЛИ бросил →
  стена НЕ разрешает (block), указатель не двигается («нет записи → нет действия», явно).
  Backward-compat: push → length (truthy) = успех; только явный false/throw → block.
- 8.2 (enforce-reconcile.mjs, новый): PostToolUse-сверка. reconcileAction — исполненное
  действие без пред-записи → action-without-record (возможен обход). findOrphanIntents —
  пред-записи без исполнения → record-without-action. WARN-уровень (не блок: PreToolUse-пол
  уже отработал, PostToolUse не отменяет исполненное). Чистые функции + fail-quiet I/O main.

+2 (supreme-gate runGate) +5 (reconcile) тестов. Полная tools-only регрессия 2788 + 2 skip
(0 регрессий). Машина 5 (Пакеты 5-8) собрана полностью.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:29:48 +03:00
Дмитрий 7b2a3d32aa feat(m5): 7.6 инвариант разделения дисциплина/защита (Пакет 7, Блок 4.6)
Структурный guard-инвариант: модули защиты-пола GREEN (criterion-green, floor-signer)
не несут override-вокабуляра — мутация P18 + неподделываемый по-критерийный GREEN (Пакет 5)
это ЗАЩИТА (без override). tdd-gate остаётся ДИСЦИПЛИНОЙ (fail-open + override) в ОТДЕЛЬНОМ
хуке. Перенос мутации/GREEN-пола под override упадёт здесь. +positive control (не вакуумен).
7.7 (неподделываемый GREEN/RED) — закрыт Пакетами 3+5.

Guard-тест (prod-код не пишется; концепт реализован Пакетом 5). +3 теста.
Полная tools-only регрессия 2781 passed + 2 skip (0 регрессий). Пакет 7 завершён.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:24:52 +03:00
Дмитрий a88a80ed0b feat(m5): 7.5 parallel-session-lock pid-liveness (Пакет 7, дыра 5, Блок 4.5)
Закрыта дыра 5: свежий (не-stale) лок МЁРТВОГО держателя блокировал на весь TTL.
- isProcessAlive(pid): process.kill(pid,0) — ESRCH→мёртв, EPERM→жив; невалидный pid→мёртв.
- acquire +isPidAlive (инъектируемый): перехват, если держатель не жив (помимо stale/same-session).
  Без isPidAlive — backward-compat (старое поведение).
- runAcquireDecision +isPidAlive (default isProcessAlive) → acquire. Живой держатель → блок;
  мёртвый → перехват. Хук остаётся fail-open (availability, не защитный пол).

+5 (pure) +1 (wrapper) тестов; существующий «fresh lock» тест уточнён на живого держателя.
parallel-session-lock + enforce 27/27.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:23:15 +03:00
Дмитрий 4cfca9cc55 feat(m5): 7.4 workflow-gate inline-script + keychain-паттерны (Пакет 7, C5, Блок 4.4)
Закрыта дыра C5 (inline `script` был вне охвата → полный обход workflow-гейта):
- decide: inline `script` гейтится как scriptPath — скан DANGEROUS_PATTERNS + одобрение по
  sha256 контента (approve_workflow_script, 5-мин окно). Без одобрения → block.
- DANGEROUS_PATTERNS +keytar +get/set/delete/findPassword|Credentials(Sync) — контроллер
  не напишет workflow, читающий ключ подписанта/судьи из OS-keychain (действует и для scriptPath).
- main: при inline берёт content/sha256 из tool_input.script напрямую.
NB: regex-детектор eval()/child_process — паттерн-матчер, не вызов (header-коммент L19-21).

+5 тестов. enforce-workflow-gate 10/10.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:18:46 +03:00
Дмитрий ecca24f451 feat(m5): 7.3 mcp-classification +egress-скан исходящего (Пакет 7, Блок 4.3)
scanEgress(toolInput): даже разрешённый классификатором MCP-вызов не должен выносить
наружу — block при: секрет в аргументах (общий secret-scan, анти-дрейф с 7.1), data:base64
URI / file:// схема / IP-литерал URL (обход DNS/allowlist), раздутый payload (> maxBytes).
exfil-схемы узко-таргетированы (data:...;base64, и file://) — обычный текст не ловят.
decide: после allow-классификации запускает scanEgress → block с reason «egress: …».

+8 тестов. enforce-mcp-classification 10/10. Дыра «что уходит наружу» закрыта.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:15:49 +03:00
Дмитрий 7e61b9c367 feat(m5): 7.2 normative-content детерм-only + fail-CLOSE (Пакет 7, H3, Блок 4.2)
Закрыта дыра H3 (LLM fail-open / wrapper fail-quiet как escape):
- isProtectiveNormativePath: защитное подмножество CLAUDE.md/память/Pravila.
- decide +protectiveSubset: деградация судьи, который БЫЛ активен (budget_exhausted —
  вектор обхода: исчерпать бюджет чтобы пройти), → fail-CLOSE для защитного подмножества.
  Деградация no_api_key (судья выключен — дефолт) → детерм-only флор (fail-open), БЕЗ
  over-block легитимного claude-md-management в обычном режиме (reason-based различение).
- main() catch → fail-CLOSE (block) вместо fail-quiet; передаёт protectiveSubset.
- «Память = совет, НИКОГДА не разрешение» — детерм-слои (recovery/fake-rule/suspicious)
  держат всегда, до судьи.

Backward-compat: существующий fail-open-degraded тест (без protectiveSubset) сохранён.
+9 тестов. enforce-normative-content-rules 25/25.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:13:02 +03:00
Дмитрий acc9045016 feat(m5): 7.1 read-path-deny +контент-скан секретов + общий secret-scan (Пакет 7, Блок 4)
Новый общий secret-scan.mjs (анти-дрейф — один источник секрет-паттернов на 7.1 read-выдачу
и 7.3 egress): scanSecrets(text) → {found, hits}. Секрет-подмножество (не PII): PEM private
keys, токены провайдеров (AWS/GitHub/OpenAI/Slack/Sentry/Yandex/JWT/Bearer, regex согласованы
с observer-pii-filter), строки подключения с кредами (scheme://user:pass@). Чистая, без /g.

enforce-read-path-deny.decide расширен опциональным content: путь-деналист — грубый пре-фильтр;
если выдача Read содержит секрет (даже из не-protected пути) → block (fail-CLOSE). Активируется
PostToolUse-обёрткой (content); PreToolUse path-слой backward-compat не тронут.

+9 (secret-scan) +4 (read-path-deny) тестов. Дыра 6 (read без контента) закрыта.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:06:53 +03:00
Дмитрий 32b688e091 feat(m5): Блок 5 — сквозные инварианты N5/Δ9 + манифест-WARN Δ8 (Пакет 6)
Guard/инвариант-тесты над существующим кодом (новый prod-код только в 6.5) +
SessionStart-самопроверка регистрации. Все non-vacuous (positive controls).

6.1 (N5) — строгая проверка пола: поведенческие инварианты запирают фиксы аудита
  M1-M4 (finalGate снимает вето ТОЛЬКО на floorBlocked===false; runGateLadder не
  проходит на ok!==true / undefined / throw) + структурный grep по judge-orchestrator
  (центр «по всем полам разом»). Scope grep'а сужен до orchestrator — токенайзерные
  .ok в floor-decide НЕ floor-вердикты (избегаем ложного срабатывания).
6.2 (Δ9-а) — анти-усыхание floor-набора: снимок 11 команд, обязанных оставаться
  floor:true; удаление строки FLOOR_RE без ADR флипнёт одну → CI краснеет. +control.
6.3 (Δ9-б) — единственный источник DESTRUCTIVE_RE: уже в seed Пакета 1 (подтверждено).
6.4 (escape≠protection) — floor-хуки (enforce-floor/floor-decide) не ссылаются на
  override-вокабуляр; перенос защиты под override падает здесь. +control.
6.5 (Δ8) — floor-manifest-check.mjs (новый): SessionStart читает settings.json,
  cry-WARN при отсутствии регистрации пол-хука. НЕ блок (проблема черепах: «пол стоит»
  = сигнал, не гарантия). Чистое ядро collectHookCommands/checkManifest (settings
  инъектируется, битые секции не бросают) + fail-quiet I/O main (exit 0).

+27 тестов (21 инвариант + 6 манифест). Полная tools-only регрессия 2741 + 2 skip
(0 регрессий). Активация манифест-хука в settings.json — шаг владельца.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:01:25 +03:00
Дмитрий 0875cd24ab feat(m5): criterion-green — по-критерийный производитель GREEN + мутация P18 (Пакет 5, 5.6)
Новый чистый модуль criterion-green.mjs. produceGreen эмитит подписанный подписантом
green ТОЛЬКО при настоящем зелёном прогоне: оба условия обязательны —
- testPassed (тест шага реально прошёл);
- mutationKilled (P18: сломали код → тест обязан покраснеть; выжил → не проверяет → не green).
Иначе green:false с причиной (test-not-passed / mutation-survived / no-signer-key) — fail-CLOSE.
Подпись — над тройкой {criterion_id, code_fingerprint, occurrence}; green/coverage — поля.
codeFingerprint(fileContents) — Δ2 детерминированный отпечаток изменённых файлов+тестов
(canonicalJson сортит ключи; правка файла → другой отпечаток → green аннулируется).
Чистый: факты прогона + ключ инъектируются (fs/исполнение тестов — живая обёртка владельца).

+7 тестов (вкл. интеграцию: произведённый green проходит весь критерий-гейт 5.5).
Полная tools-only регрессия 2714 passed + 2 skip (0 регрессий).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:54:22 +03:00
Дмитрий f0f7128cc3 feat(m5): критерий-гейт = лесенка из 4 шагов (Пакет 5, 5.5, Δ6)
Δ6: НЕ плодим criterionFullyProven — критерий-гейт = РОВНО 4 проверки поверх
существующей runGateLadder. criterionGateSteps(input) → [criteria-from-sealed-plan,
criteria-green-matched, fingerprint-fresh, green-signatures-valid] (И-семантика:
id ∈ печать → green-присутствие → свежесть отпечатка Δ2 → подпись подписанта Δ5).
runCriterionGate гоняет их через runGateLadder (короткое замыкание на первом провале).
Структурный тест «ровно эти 4 шага в порядке» — лекарство «забыл шаг». End-to-end:
валидный сценарий (signGreen) проходит; по одному провалу на каждый шаг.

+7 тестов (2 структура + 5 И-семантика). Полная tools-only регрессия 2707 + 2 skip
(0 регрессий; import judge-gate-floor, цикла нет).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:51:11 +03:00
Дмитрий 7110d0fa37 feat(m5): greenSignaturesValid — подпись подписанта на green (Пакет 5, 5.4, Δ5)
Δ5: подлинность green = подпись ПОДПИСАНТА, не совпадение id (id = целостность).
greenSignaturesValid реконструирует подписанную тройку {criterion_id,
code_fingerprint, occurrence} из green-run и проверяет verifyGreen (floor-signer).
Синергия с 5.3: подмена отпечатка для прохода свежести ломает подпись здесь
(отпечаток входит в подписанную тройку). Чистая, fail-CLOSE (нет ключа/sig →
unsigned). Красные прогоны подписи не требуют (их ловит criteriaGreenMatched).

По авторитетному Δ6 — ОТДЕЛЬНЫЙ шаг 4 лесенки критерий-гейта.

+5 тестов. judge-gate-floor 37/37 (аддитивно; import floor-signer, цикла нет).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:48:13 +03:00
Дмитрий ea0dee23e2 feat(m5): fingerprintFresh — свежесть отпечатка green (Пакет 5, 5.3, Δ2)
Δ2: зелёный прогон засчитывается только если его code_fingerprint совпадает с
текущим (изменённые файлы шага + тесты; currentFingerprints инъектируется живым
гейтом). Правка файла после прогона → расхождение → green аннулирован (stale).
Чистая функция, fail-CLOSE (нет текущего отпечатка ≠ записанному → stale). Красные
прогоны не проверяются (их «не-зелёность» ловит criteriaGreenMatched).

По авторитетному Δ6 — ОТДЕЛЬНЫЙ шаг лесенки критерий-гейта (не внутрь
criteriaGreenMatched, которая остаётся «green-присутствием», Δ6 шаг 2).

+5 тестов. judge-gate-floor 32/32 (чисто аддитивно).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:45:12 +03:00
Дмитрий cab7ffc3cf feat(m5): механическая значимость шага в k5CriterionCheck (Пакет 5, 5.2, C3/F18)
Значимость шага больше НЕ из контроллер-флагов trivial/significant (их подделка
разжаловала значимый шаг и обнуляла K5). Новый isSignificantStep(step):
- object разрушителен (classifyDestructive.suspicious) → значим, перевешивает op
  (анти-обход «op:Read, object: rm -rf»);
- op НЕ из READONLY_OPS (Read/Grep/Glob/LS/NotebookRead) → значим (мутирующий/
  неизвестный/пустой op → сомнение → значим, fail-CLOSE);
- чистое чтение → не значим, критерий не требуется.
k5CriterionCheck вызывает isSignificantStep вместо trivial/significant-скипов.

+7 тестов. Полная tools-only регрессия 2690 passed + 2 skip (0 регрессий).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:42:36 +03:00
Дмитрий 54f0974ba5 feat(m5): sealed criterion_id в plan-lock.freezePlan (Пакет 5, 5.1, Δ5)
Каждый шаг получает детерминированный criterion_id = sha256(canonicalJson
содержимого шага без criterion_id) ДО planId/печати → id запечатан подписью плана.
- stepCriterionId (чистая, идемпотентная: criterion_id исключён из хеша).
- sealedCriterionIds(frozenPlan) — вход для criteriaFromSealedPlan (Гейт-2, F3/F9).
- id = ЦЕЛОСТНОСТЬ, не подлинность (Δ5): подмена object/op меняет id; подмена id
  после печати ломает verifyFrozenPlan; подлинность зелёного даёт подпись подписанта (5.4).

+7 тестов. Полная tools-only регрессия 2683 passed + 2 skip (0 регрессий).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:38:59 +03:00
Дмитрий 24ce7b39f1 feat(m5): запрет env-fallback ключа + сужение node-whitelist (Пакет 4, Блок 2 RISK, Δ4)
4.1 env-fallback УБРАН (receipt-key-config + judge-key-config):
- resolveReceiptKey/resolveJudgeKey читают ТОЛЬКО keychain; ROUTER_MENTOR_*_KEY env
  больше не читается (анти-казуальная утечка через env/логи; шов под HSM). `env` убран
  из сигнатуры (extra-проп игнорируется); KEY_ENV сохранён в _internals (domain-тест R-31).
- Критерий: env задан, keychain пуст → null.

4.2 node-whitelist сужен (enforce-router-gate, RISK):
- широкое `node <любой-файл>` правило удалено из SAFE_EXACT; новая ветвь classifyWhitelist
  через nodeScriptAllowed: allow только плоский tools/<file>.{mjs,cjs,js} + vitest-runner
  + node --version/-v; иначе default-deny. Инспекция ТОКЕНА пути (shell-quote сохраняет
  бэкслеши Windows-пути — инвариант запиннен тестом), нормализация \\ → /.
- verify (живой): после правки `node vitest.mjs` отработал по всем 147 тест-файлам —
  тул-чейн не сломан (canary). Гейт жив в сессии (powershell+router фаеры подтвердили).

Δ4 честно (§7): сужение — анти-казуальная мера, НЕ полный close. Остаток «контроллер
commit'ит разрешённый tools-скрипт и запускает» принят; file-watcher блокирует
session-edited до commit. Полная изоляция ключа — только HSM/YubiKey (v4.2).

TDD RED-GREEN per задача; tools-only регрессия 2677 passed + 2 skip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:19:02 +03:00
Дмитрий 8a754e9a19 feat(m5): floor-signer + RECEIPT_DOMAINS.M5_GREEN + occurrence (Пакет 3, Блок 2)
- receipt-sign.mjs: +домен M5_GREEN (отдельный, не default; cross-domain тест)
- floor-signer.mjs (новый): signGreen/verifyGreen/acceptGreen — подпись по-критерийного
  GREEN в домене M5_GREEN, occurrence монотонный (анти-пере-зачёт одного green на 2
  критерия), подмена criterion_id/occurrence ломает HMAC → bad-signature.
- Δ4 честно: подписант = анти-казуальная утечка ключа + шов под HSM, НЕ защита ключа
  от мотивированного контроллера (node tools/X.mjs до Пакета 4); см. spec §7/§10.
- Чистые функции (ключ-аргумент), как receipt-sign.mjs; процесс-обёртка/резолв ключа —
  Пакет 4+; потребитель держит lastOccurrence — Пакет 5.
- TDD RED-GREEN; tools-only регрессия 2666 passed + 2 skip (+17).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:59:56 +03:00
Дмитрий 5d96e89d5c docs(m5): handoff в новую сессию после Пакетов 1-2
Готовый промт-эстафета для продолжения Машины 5 с Пакета 3: дерево (worktree+ветка),
источники (spec §3/§10 + план R1 + этот handoff), план использования скилов с
HARD-запретом на нарушение алгоритма (audit-context только 4/5/7; net-new 3/6/8 skip;
TDD RED-first; focus-линза; systematic-debugging на непредвиденный красный; инлайн без
суб-агентов; commit-not-push), квирки (vitest absolute / git PowerShell / tdd-real-test-
verifier не принимает it.each + coverage-ссылка в Edit), состояние (Пакет 1 22b84fbb +
Пакет 2 b6d06ede, baseline 2649+2), вскрытые аудитом расхождения план↔код (writer
unsigned / F5 мнимая / force-push door мут / router-gate default-deny).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:49:37 +03:00
Дмитрий b6d06ede87 feat(m5): Пакет 2 — несущий пол (floor-decide + enforce-floor + дверь Δ1 + Δ7 + C4)
Блок 1 Машины 5: вето-до-плана на необратимое, независимо от членства в плане.

- tools/floor-decide.mjs — чистое ядро: Bash floor (classifyDestructive whole-string +
  посегментно tokenizeBash — кавычки/chaining нейтрализованы) + tool-agnostic запись
  (P10-a: .env/ключ/cert + ~/.claude/runtime, fail-CLOSED на normalize-throw).
- Дверь владельца Δ1 — read-only approve_git_operation (exact+5мин окно, НЕ consume).
- tools/enforce-floor.mjs — обёртка matcher '*' (регистрация — шаг владельца, ОТДЕЛЬНО
  от стены М2), loadApprovedGitOps read-only, fail-CLOSED, НЕ импортирует plan-lock.
- C4: migrate:fresh/refresh/reset убраны из router-gate whitelist → default-deny даже
  без floor-хука (SPOF-защита); bare migrate + migrate:rollback остаются.
- Δ7: enforce-supreme-gate.decide на allow-пути зовёт classifyDestructive(...).floor —
  разрушительный in-plan шаг НЕ продвигает указатель (стена не благословляет снос).
- Атака-линза: закрыт P10-a-пробел (MCP-writer в .env floor бы пропустил).

Audit-context вскрыл расхождения план↔код (задокументированы в floor-decide JSDoc):
writer approval НЕ подписывает (интегрити = protected-path side-channel, не HMAC);
F5-гонка мнимая (loadApprovedGitOps read-only+window, не consume); force-push доп-блок
shell-content GIT_HARD (дверь для него мут — защита-в-глубину). Дверь = шов под М6.

Регрессия tools-only: 2649 passed + 2 skip (+41). Residual: node-whitelist hole
для записи в runtime (Пакет 4 сужает); base64-обфускация floor (~0.5%, М6).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:42:58 +03:00
Дмитрий 22b84fbb2e feat(m5): classifyDestructive двухуровневый + rewire a2CaseSelect/detectHighRisk (§4, N1)
Пакет 1 Машины 5 (роутер-наставник, пол). Единый источник разрушительности
classify-destructive.mjs: floor (точный необратимый набор, hard-block) + suspicious
(грубый набор для голосов судьи), инвариант floor => suspicious.

- N1: голый migrate/migrate:rollback/migrate --force => suspicious, НЕ floor (деплой не ломается).
- rewire a2CaseSelect (M4) и detectHighRisk (M3) на classifyDestructive.suspicious;
  оба локальных DESTRUCTIVE_RE удалены (Δ9-б — единственный источник).
- Δ9(б) seed CI-инвариант m5-floor-invariants.test.mjs (positive-control, не вакуумный).
- sharp-edges (Step 1.9): floor force-push выровнен с каноном shell-content — закрыт
  обход кавычками git push "--force" (длинные флаги без обязательного \s; -f/+ с \s).
- parity к двум прежним regex сохранён (format/db:wipe/force-push-литерал).

Регрессия tools-only: 2608 passed + 2 skip (+48). Residuals (chaining/reset-quote)
переданы Пакету 2 (tokenizeBash посегментно).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:21:38 +03:00
Дмитрий 23f5936d0d docs(m5): handoff-промт для переезда в новую сессию
Готовый промт: дерево (worktree+ветка), источники (spec §3/§10 +
план R1), план использования скилов с hard-запретом на нарушение
алгоритма (audit-context-building только 1/2/4/5/7; TDD RED-first;
focus-линза; systematic-debugging на непредвиденный красный; инлайн
без суб-агентов; commit-not-push), квирки окружения, старт с Пакета 1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:57:32 +03:00
Дмитрий 15829b8eb7 docs(m5): план R1 — 7 правок факт-аудита по реальному коду
F1 (+format в suspicious — терял rewire detectHighRisk),
F2 (длинно-флаговый rm --recursive --force теперь floor),
F3 (Step 1.7 — только строка router-engine:21),
F4 (удалить router-engine:12 DESTRUCTIVE_RE — иначе Δ9-б падёт),
F5 (floor читает одобрение read-only, не consume — гонка с
existing enforce-branch-switch),
§2-точность (floor инспектирует и Write file_path),
скил-правки (audit-context-building не на net-new 3/6;
+systematic-debugging; линзы focus+по риску).

Все находки проверены по коду M1-M5 (3 разных DESTRUCTIVE_RE,
6 файлов хуков Пакета 7 подтверждены). Без призраков.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:53:24 +03:00
Дмитрий 89bc392ef4 docs(m5): план реализации — 8 пакетов TDD + цепочка скилов
Master-план М5: фундамент (Пакет 1 classifyDestructive двухуровневый)
расписан бит-сайз с реальным кодом; пакеты 2-8 — задачи+критерии+
линзы (бит-сайз just-in-time, RED-first — без пред-написания призраков).
Покрывает §3 блоки + §10 амендмент (Δ1-9, N1, N5). Self-review поймал
GAP по Δ3 reconcile → добавлен Пакет 8. Инлайн-исполнение (без суб-
агентов), commit-not-push, node-whitelist как отдельный risk-пакет 4.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:39:35 +03:00
Дмитрий 89f4d1a011 docs(m5): self-review — явная пометка о замене §3 Блок 2
Δ4 опровергает фразу §3 Блок 2 «нельзя прочесть ключ в своём
процессе» (читается через node tools/X.mjs) — добавлен явный
маркер замены, чтобы спек не противоречил сам себе.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:30:48 +03:00
Дмитрий 930630955e docs(m5): амендмент 2026-06-07 — фаза 4 brainstorming + факт-аудит
3 развилки (дверь владельца в М5 / отпечаток «по делу»+мутация /
честный двухтакт reconcile) + переписаны призраки: Δ4 (подписант =
анти-казуальная утечка + шов под HSM, НЕ защита ключа от контроллера)
и Δ6 (используем существующую runGateLadder, не новую функцию) +
N1 (classifyDestructive двухуровневый — голый migrate не блокировать,
иначе пол ломает деплой) + N5 (тест-инвариант строгой проверки пола).
Каждый claim проверен по реальному коду M1-M5 (audit-context-building).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:29:46 +03:00
Дмитрий 5dc6785940 docs(router-mentor): Machine 5 floor — design spec (audit-driven)
М5 «укрепление защиты-пола» — дизайн после корреляционного аудита
М5 ↔ М1/М2/М3/М4 (Фазы 1-2: построчный контекст audit-context-building
+ 3 адверсариальные линзы — грабли/корректность/атака — по всему периметру).

Главная находка: стена М2 = соответствие плану, НЕ пол → легитимно
запечатанный необратимый шаг (force-push/migrate:fresh/секрет/runtime)
проходит, пол не вызывается. 5 блоков: вето-до-плана / изоляция ключа
(отдельный процесс-подписант) / критерий-носитель / 7 усилений /
сквозные fail-close инварианты. Карта закрытия W1/C1-C5/H1/H3/F-серия.

Решения: полный объём; отдельный процесс-подписант; граница М5↔М6 =
только шов. Design-only — не построено.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 09:53:43 +03:00
Дмитрий 622ac4df28 fix(router-mentor): third audit (correctness lens) — close 3 M4 fail-open/crash holes
Третий построчный аудит машин 1-4 свежим объективом (корректность логики /
реальные баги — НЕ понимание, НЕ грабли; это были два прошлых прохода).
4 читающих под-агента code-analyzer. M1/M2/M3 — багов ядра нет (подтверждено).
M4 (судья, инертен; код должен быть верен и при включении): 3 реальные дыры по TDD.

M4:
- judge-engine.mjs runJudge: (raw.objections||[]).filter((o)=>o.verdict) падал на
  objections=[null] (o.verdict на null) и на не-массиве (.filter is not a function).
  || гасит только falsy. Краш ломал вердикт; в инертной обёртке выброс уходил в
  catch→block:false = fail-open. Fix: Array.isArray(...)?...:[] + (o && o.verdict).
- judge-verdict-slots.mjs: String(raw).trim().length скрывал не-строки — слот {}
  давал '[object Object]' (длина 15) и проходил как содержательный (мусорный
  объект/массив штамповал форму вердикта). Fix: слот обязан быть строкой
  (typeof raw !== 'string' → trivial). Мягкий fail-open формы закрыт.
- judge-orchestrator.mjs runGateLadder: step.run() без try/catch пробрасывал
  исключение упавшего шага пола вместо «пол не пройден» → решение неопределённо
  (в обёртке catch→block:false = fail-open). Fix: бросок шага = passed:false
  (fail-closed → блок), последующие не запускаются. Чистый модуль теперь сам
  гарантирует безопасную сторону, не полагаясь на обёртку.

Регрессия tools-only 2560 passed + 2 skip (+5 TDD-тестов, 0 регрессий).

Осознанно НЕ менялось (без призраков):
- M1 verifyChain без 3-го арг = нарушение контракта вызова, не валидный вход.
- M2 node-в-цепочке = то же разрешение, что одиночный node (контракт, тест L53);
  readonly-git-в-цепочке блок = осознанный default-deny (fail-safe).
- M3 defer уже защищён G-фиксом (if e.status!=='pending' return e — ДО defer);
  N3 stale-комментарий (код строже докстринга).
- M4-C DESTRUCTIVE_RE иллюстративен (divergence всё равно судится; разрушительный
  bash режется полом M2/M5 до судьи); M4-D slop-counter↔logVerdict — live-wiring.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 08:11:12 +03:00
Дмитрий 69e20099db fix(router-mentor): sharp-edges audit M1-M4 — close 8 misuse-resistance holes
Второй аудит машин 1-4 другим объективом (sharp-edges: устойчивость к
неправильному применению / мягкие умолчания / совпадение по пустоте-подстроке).
Криптоядра здоровы (подтверждено). 8 реальных дыр закрыты по TDD:

M3:
- coverage-machine F-1: покрытие считалось по двусторонней ПОДСТРОКЕ — produces
  "a" покрывал запрос "audit-rls-policy" (ложное «всё покрыто»). Новый tokensCover:
  точное равенство ИЛИ подмножество слов по границам. coveringSkill + coverageRegistry.
- router-engine F-8: confidence не проверялся на диапазон — 5/Infinity проходили как
  «уверен» (обход воздержания 5.2), -3 как принуд. abstain. validateTrace: [0,1] finite.
- round-control C: пустой roundKey="" активировал managed-режим (!= null) → все сессии
  делили один счётчик-бакет. Теперь managed требует непустую строку.
- router-learning-queue G: повторное approve уже-решённого id повторно клало запись в
  фонд (дубль). applyApprovalBatch: переводит только status==='pending'.

M2:
- plan-lock F5: шаг с пустым object был джокером (object:'' матчил действие, чей путь
  не извлёкся → object''). actionMatchesStep: пустой object шага не матчит ничего.

M4 (инертна; чистые fail-closed правки кода, корректны и при включении):
- judge-slop-counter H: битый/null вердикт в списке ронял счёт (v.missing на null).
  Теперь не крашит, считается халтурой (безопасная сторона).
- judge-engine J: consensusDecision на пустом/битом списке дрейфовал к GO. Теперь GO
  только если есть голоса И каждый чистый GO; иначе NO-GO (fail-closed для hard-risk).
- judge-orchestrator K: finalGate снимал вето пола на любой falsy floorBlocked
  (undefined от упавшей проверки = fail-open). Теперь снять может только явный false.

Регрессия tools-only 2555 passed + 2 skip (+15 TDD-тестов, 0 регрессий).

Осознанно НЕ менялось (без призраков):
- M1 receipt-sign domain default '' / разделитель пробел — backward-compat контракт
  (тест 18-19), инъективен на enum-доменах без пробелов.
- M1 action-journal атомарность записи головы + битая .jsonl строка — fail-closed
  (битьё → verifyChain ok:false → стена блокирует); чистого behavioral-теста нет.
- M3 round-control requiredSkills=[] — контракт вызывающего (пустой = не требуется).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 06:24:21 +03:00
Дмитрий e1a6f26c06 fix(router-mentor): close sessionId path-traversal class across M1-M4
Аудит M1-M4 (audit-context-building) нашёл непоследовательность guard формы
sessionId: N3-фикс защитил только action-journal.paths() (M1), а 4 sibling-
строителя пути из event.session_id (недоверенный источник) остались без проверки.

Единый экспорт assertSafeSessionId (action-journal.mjs, переиспользует SESSION_ID_RE
N3) применён во всех точках машин:
- M1 action-journal.paths() — рефактор на общий guard (поведение N3 сохранено)
- M4 judge-subrun-journal.paths() — guard добавлен (канал прилежности судьи F1)
- M2 plan-lock.planPath + artifactPath — guard добавлен
- M2 enforce-supreme-gate — экспортируемый guarded stepStatePath, применён в main()

TDD RED-GREEN на каждом файле. Регрессия tools-only 2540 passed + 2 skip (+10).
Серьёзность класса — низкая / защита-в-глубину (sessionId harness-controlled),
закрыт ради консистентности (был 1 из 5).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:41:07 +03:00
Дмитрий 2b8ad760be fix(m1-foundation): verifyChain fail-closed на битой записи + sessionId path-guard
Аудит Машины 1 (audit-context-building), 2 находки low/defense-in-depth:
N2 — verifyChain больше не бросает TypeError на структурно-битой записи
(null / не-объект / массив, приходит из порченого .jsonl через loadJournal):
guard !e||typeof!=='object'||Array → {ok:false, brokenAt:null}.
N3 — paths() валидирует sessionId (/^[A-Za-z0-9_-]+/) до склейки пути
журнала → throw на ../ / \ . : закрывает path-traversal (fail-closed,
supreme-gate ловит внешним try/catch → block).

N1 (keytar getPasswordSync inert) и N4 (verifyChain/анти-откат — контракт M4)
не трогались: N1 — верное зеркало judge-key-config/llm-judge-config (env —
рабочий путь, fail-closed цел); N4 — deferred межмашинный дизайн.

TDD RED→GREEN, +7 тестов. Регрессия tools-only 2530 passed + 2 skip, 0 регрессий.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 05:03:08 +03:00
Дмитрий 1881501b81 fix(m2): close supreme-wall holes F-A/F-B/F-C (audit 2026-06-07)
F-A (HIGH): Bash green-pass via reading-chain reason collapse — chain
  <reader> && <whitelisted-mutator> (composer pint / php artisan migrate:fresh
  / pest / npm test / node <script>) bypassed the wall. isObserveOnly now
  re-tokenizes and requires EVERY segment be a true reader (READING_CMDS) or
  a single readonly-git, not trusting the collapsed 'reading' reason.
F-B (minor): observe-only no longer choked when plan present but artifact
  missing/invalid (decideMode honors isObserveOnly; finding-9 invariant).
F-C (low): closed-door (C-5) ref-check moved out of the artifact_id guard —
  a step with ref must resolve in a sealed artifact even if plan has no
  artifact_id. TDD: RED proven per fix; full tools regression 2523 GREEN.
2026-06-07 04:33:17 +03:00
Дмитрий 0220ca5802 feat(m2): export READING_CMDS as single source of true readers (F-A prep) 2026-06-07 04:32:56 +03:00
Дмитрий 119ff1f230 fix(m3): learning-queue — reject > approve при конфликте id (hard-rule без явного да НИКАК)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:00:06 +03:00
Дмитрий c47155ec91 fix(m3): skill-contract — neutrality сканирует все строковые поля inherent+skill (аудит F4)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:56:16 +03:00
Дмитрий b39431d661 fix(m3): coverage-machine — пустой токен не покрывает запрос (аудит F3)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:56:10 +03:00
Дмитрий fd61515d20 fix(m3): round-control — managed-терминатор по roundKey, авто-инкремент круга (аудит F2)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:56:03 +03:00
Дмитрий 02ff19d08b fix(m3): router-engine — chosen обязан быть среди candidates (аудит F1)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:55:52 +03:00
Дмитрий b6e59353c1 fix(m4): audit closures — goal anchor + card guard + gate-1 coverage gate + sealed criteria + A2 router/packaging + reversibility doubt-blocks 2026-06-07 03:15:56 +03:00
Дмитрий d925c61651 docs(m4): Machine 4 judge — implementation record (4-A..4-G) 2026-06-06 04:36:38 +03:00
Дмитрий 079adfd184 feat(m4): judge — discipline floor + seal channel + gate floor + engine + orchestration + postfactum evaluator + inert hook wrapper 2026-06-06 03:07:38 +03:00
Дмитрий afb01219cb docs(router-mentor): Машина 4 (судья) — полный дизайн + само-аудит F1-F10 + проверка 26 хуков
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 17:53:22 +03:00
Дмитрий 06a37cb486 fix(m3): закрытие находок аудита — гард R4 + терминатор + footguns; F2/F3 как честный остаток 2026-06-05 17:32:45 +03:00
Дмитрий a9208a9393 feat(m3): граф зависимостей решений (#2) + дисциплина доменного навыка (#3) 2026-06-05 17:10:21 +03:00
Дмитрий c2d6e6e130 feat(m3): разговорная фаза 2026-06-05 — вход роутера + контроль + выходная верность + честные контракты 2026-06-05 14:52:45 +03:00
Дмитрий 0ee7874c88 docs(router-mentor): conversational-phase router design (M3) + K7 pre-mortem contract (M4) + P16-e revision
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 10:39:24 +03:00
Дмитрий 923e8ff825 docs: реестр — R-19/R-28/R-31 закрыты, исправлено 13, кодовых задач в открытых нет 2026-06-05 06:25:05 +03:00
Дмитрий 6dbe4374de fix(m2): указатель шага подписан (HMAC step-ptr) — подмена ptr → сброс (R-19) 2026-06-05 06:23:35 +03:00
Дмитрий fe5cf99fc9 fix(brain): доменное разделение подписи — план/артефакт/журнал/расписка не взаимозаменяемы (R-31/J6) 2026-06-05 06:21:19 +03:00
Дмитрий 2ef5504710 fix(m2): session_id из stdin-события, не из env — сессии больше не слипаются (R-28/J3) 2026-06-05 06:09:45 +03:00
Дмитрий 7947569f38 docs: реестр — R-27 закрыт (указатель ↔ план), исправлено 10, открытых багов кода нет 2026-06-05 04:22:11 +03:00
Дмитрий 522531bbd2 fix(m2): указатель шага привязан к plan_id — перепечать сбрасывает указатель (R-27/J2) 2026-06-05 04:21:05 +03:00
Дмитрий 3addf4353b docs: единый реестр замечаний по реинжинирингу мозга v2 (R-01..R-31) 2026-06-05 04:18:07 +03:00
Дмитрий 4963c1187f fix(m2): decide самодостаточно проверяет печать артефакта (защита-в-глубину) (F2) 2026-06-05 04:05:22 +03:00
Дмитрий 133b29df58 fix(m2): actionOf — поля объекта выровнены с B4 (ловит MCP filename/uri/destination) (F1) 2026-06-05 04:04:09 +03:00
Дмитрий 200b5b2da7 docs(m2): аудит Машины 2 — куча (T1-T9 хвосты + F1-F3 замечания + фикс-сет) 2026-06-05 04:03:03 +03:00
Дмитрий e991027793 docs(m4): K6 анти-откат high-water-mark — несрываемый контракт судьи (B3 переадресован M2→M4) 2026-06-05 03:59:19 +03:00
Дмитрий 2907e3f25f fix(m1): extractPath — расширены path-поля (ловит MCP filename/uri/destination) (B4) 2026-06-05 03:42:40 +03:00
Дмитрий 7b578cd391 fix(m1): seq+ts входят в chain_hash журнала — подмена метаданных ломает цепь (B2) 2026-06-05 03:41:38 +03:00
Дмитрий 35a569d370 docs(m1): аудит Машины 1 — хвосты (A1-A4) + замечания (B1-B4) + фикс-сет 2026-06-05 03:40:13 +03:00
Дмитрий 1d676a5616 docs(m3): итоговая сводка отложенного по Машине 3 (9 пунктов, ждут Машину 4/шаг владельца) 2026-06-05 03:29:44 +03:00
Дмитрий b94f7d244c feat(m3-d): контракты + look-ahead в промпт роутера + проброс runRouter (фикс-2) 2026-06-05 03:24:49 +03:00
Дмитрий 92ba55bc0f feat(m3-d): нюх 5.3 + интервьюер 4.4 в промпт роутера (фикс-3) 2026-06-05 03:23:11 +03:00
Дмитрий 58f3a65800 feat(m3-a): checkContractNeutrality — G1 страж нейтральности этикетки (фикс-5, опц.) 2026-06-05 03:22:07 +03:00
Дмитрий eb3f4c4ed1 feat(m3-a): dispatchContract — G3 детерминированная диспетчеризация точно|мягко (фикс-4) 2026-06-05 03:20:55 +03:00
Дмитрий 003bd3d86b fix(m3-b): resolveNode заземляет skill-ref по префиксу (superpowers:X -> #19) — фикс-1 2026-06-05 03:18:26 +03:00
Дмитрий 14230814b0 docs(m3): аудит-сверка 2026-06-05 + фикс-сет 1-5 (G1-G6 расклад, заземление, look-ahead, нюх/интервьюер) 2026-06-05 03:17:20 +03:00
Дмитрий 0f198b6e33 docs(m3): build summary + follow-up list in questions log (Машина 3 complete) 2026-06-04 19:52:30 +03:00
Дмитрий a27a848d7c test(m3-e): learning hard-rule invariants + plan — Машина 3 собрана
Машина 3-E «Очередь одобрений + ручка разведки» собрана (TDD): router-learning-queue.mjs
(propose-only + owner batch approval + render/signal/persist; hard-rule «без да — никак»)
+ router-exploration.mjs (ручка %разведки=0 default, проба=вопрос владельцу, риск-гард).
19 новых тестов. Финальная регрессия tools-only 2212 GREEN.

МАШИНА 3 (Роутер-наставник) собрана целиком: 3-A контракты / 3-B граф узлов /
3-C машина охвата / 3-D движок роутера / 3-E очередь обучения. Доставка в живую
инфру (STATUS/brain-retro), K4-поправка, live-wiring, перенос волн — follow-up
после Машины 4 (журнал вопросов).
2026-06-04 19:51:45 +03:00
Дмитрий dcf772bac5 feat(m3-e): exploration knob (#3) — probe = owner question, off by default + risk-guard 2026-06-04 19:50:31 +03:00
Дмитрий 4cb17fc4d5 feat(m3-e): learning queue — propose-only + owner batch approval + render/signal/persist (hard-rule no auto-fill) 2026-06-04 19:49:32 +03:00
Дмитрий ed89028b1d test(m3-d): router-engine invariants on real graph + plan + questions log
Машина 3-D «Движок роутера» собрана (TDD): router-engine.mjs (detectHighRisk 6.1
детерминированный / validateLevelSkip 6.2 / cheaperOf / validateTrace 5.1 /
groundTrace ОВ-Д2 / buildRouterPrompt+parse+runRouter, llmCall мокается как
router-classifier) + step-pointer.mjs (дерево-указатель волн D6/OQ1, стендово).
35 новых тестов, регрессия tools-only 2193 GREEN. K4-поправка к стене + live-wiring
+ перенос волн в живой main — ОТЛОЖЕНО до Машины 4 (журнал вопросов).
2026-06-04 19:46:09 +03:00
Дмитрий 28b129ed9c feat(m3-d): step-pointer tree (waves D6/OQ1) — standalone, not yet wired into M2 2026-06-04 19:45:04 +03:00
Дмитрий 3a80bdde5c feat(m3-d): router-engine — risk(6.1)/skip(6.2)/price + trace 5.1 + grounding(ОВ-Д2) + buildRouterPrompt/parse/runRouter (llmCall injected, mocked) 2026-06-04 19:43:57 +03:00
Дмитрий 80ebec9e82 test(m3-c): coverage-machine invariants on 3-A contracts + plan
Машина 3-C «Машина охвата A/B/C/D» собрана (TDD): coverage-machine.mjs —
A граф зависимостей (buildDependencyGraph/topoOrder/findHoles/decompositionGroups),
B реестр нужды↔решения (coverageRegistry: дыры+сироты), C requestsChecklist,
D ограничения как нужды (effectiveNeeds), хребет readinessChecklist (4 галочки + §).
Независимый верификатор охвата (рычаг E §6.3). 19 новых тестов, регрессия 2158 GREEN.
2026-06-04 19:26:21 +03:00
Дмитрий 8df8d05612 feat(m3-c): coverage-machine A/B/C/D + readinessChecklist (C-14, set/graph ops) 2026-06-04 19:23:02 +03:00
Дмитрий 699da97dc2 test(m3-b): node-graph invariants on real registry + plan
Машина 3-B «Граф узлов из реестра» собрана (TDD): node-graph.mjs поверх
loadRegistry — buildNodeGraph/resolveNode (ОВ-Д2 заземление) + twinsOf
(subcategory) / hintLinksOf (chains) / conflictsOf (явные) + checkGraphFreshness
(3.6). 20 новых тестов, регрессия tools-only 2139 GREEN.
2026-06-04 19:19:00 +03:00
Дмитрий 750f406cbd feat(m3-b): node-graph from registry — buildNodeGraph/resolveNode (ОВ-Д2) + twins/hints/conflicts + freshness 3.6 2026-06-04 19:17:50 +03:00
Дмитрий 53db0ee2b3 test(m3-a): contract fixtures (own+external) + 3-A invariants + plan + questions log
Машина 3-A «Контракты скилов» собрана (TDD): skill-contract.mjs (схема C-13/L
+ form validator + normalize/accessors + G4 drift-guard) + skill-contract-registry.mjs
(buildRegistry/loadRegistry). 28 новых тестов, регрессия tools-only 2119 GREEN.
Образцы own (writing-plans) + external (operations:process-doc). Журнал вопросов заведён.
2026-06-04 19:12:47 +03:00
Дмитрий a905abd1b4 feat(m3-a): skill-contract-registry — buildRegistry (validate/dedupe/drift) + loadRegistry (disk) 2026-06-04 19:11:28 +03:00
Дмитрий f82cefaead feat(m3-a): skill-contract schema + form validator + normalize/accessors + G4 drift-guard (C-13/L) 2026-06-04 19:10:24 +03:00
Дмитрий 77d2b9be16 docs(router-mentor): sync 26-point coverage map with M2 build + M3 canon
Сверка 2026-06-04: все 26 назначений «пункт → машина» актуальны и
непротиворечивы (собранное в M2 подтверждено по коду). Внесены 6 пометок
дельты, назначения по машинам не менялись:
- п.15: default-deny уточнён зелёным проходом (finding 9) + узкое Write-
  исключение K4 (Вариант А, реализуется в 3-D)
- п.23: D29 как отдельный сверщик растворён → роль у артефакта + закрытой
  двери (C-7); якорь «сырая просьба» сохранён в P16-e (M3)
- п.24: добавлен контракт K5 (судья судит план как будущее, «проверено» за
  факт не берёт; реальное проверено = рантайм-сентинел M5)
- п.26: routing-tag ещё живой, редизайн escape отложен в M6
- мастер-карта: K5 добавлен в аварийный блок Машины 4 (рядом с K1/K2)
- чертёж M2: условие В синхронизировано с каноном K4 (читаемый .md через
  узкое исключение; печать seal — только каналом одобрения)
2026-06-04 18:59:52 +03:00
Дмитрий 8e342be430 docs(router-mentor-m3): M3 shape + K4 resolution (Variant A) + router discipline (§6) + K5 judge-rule-2 contract
Brainstorm 2026-06-04: K4 artifact-write narrow exemption; 5 sub-plans (3-A..3-E); router-discipline levers A-G; 3-layer=triage+delegate-to-real-nodes; skill-imitation closure (234/236); criterion-not-verified judge rule (K5, loud block for Machine 4). All 6 review findings closed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 18:43:43 +03:00
Дмитрий ec4733f77a test(m2): supreme-wall invariants — default-deny/seal/seed/step-match (Task 9)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 16:49:29 +03:00
Дмитрий cfbfd9c6b4 feat(m2): door-coverage — auditDoors (forgotten-channel) + auditExempt (green-pass safety) (Tasks 7,14)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 16:49:10 +03:00
Дмитрий 8d9ca65cf3 feat(m2): supreme-gate — seeds/decide/runGate/decideMode/observe-only/closed-door (Tasks 4-6,10,13,12)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 16:48:49 +03:00
Дмитрий 599dca15ec feat(m2): plan-lock — freeze/verify/match/persist/reconcile/2nd-seal/closed-door (Tasks 1-3,8,11,12)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 16:48:30 +03:00
Дмитрий 8a790e6f14 docs(router-mentor-m2): actualize blueprint with C/L + fresh-eyes revision + cross-machine contracts
- Машина 2 чертёж: вшита C/L-надстройка (два плана, две печати, закрытая дверь, контракт скила), решения A-K
- Fresh-eyes ревизия 2026-06-04: findings 1-5 (закрытая дверь починена: ref+artifact_id+версия+persist+who-seals), 6-7 (D29 поглощена слоем, D33 → два режима), 8 (растворён призмой нет-болтовни), 9 (зелёный проход = нет долговременного/исходящего эффекта + условия А/Б/В), мелочи 10-12
- Аварийный блок межмашинных контрактов K1-K4 (М4/М5/М3) — без них зелёный проход и снятие D29 = дыры
- Мастер-карта: НАДСТРОЙКА C/L, Машина 1 собрана, красные маркеры K1-K4 в разделах М3/М4/М5
- Дизайн-спека: D33 ревизия (нет болтовни → два режима) + баннер секции

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 15:37:26 +03:00
Дмитрий de530a130d docs(router-mentor): M2 review 2026-06-04 — C-1..C-14, L-series, M1 confirmed no-rework
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 12:27:12 +03:00
Дмитрий 1cc5431b23 docs(router-mentor): handoff для новой сессии — решения Машины 2 A/B/заморозка + остаток C-G 2026-06-04 06:02:32 +03:00
Дмитрий b83cea2e73 test(m1): foundation cross-invariants (journal tamper / unsigned receipt / runtime deny) 2026-06-04 04:05:10 +03:00
Дмитрий 7af68d62c8 feat(m1): runtime-write-deny — block any path-bearing tool (P10-a all channels) 2026-06-04 04:04:25 +03:00
Дмитрий 56da7faba9 feat(m1): pathNormalize NFC normalization (P10-b unicode evasion) 2026-06-04 04:01:17 +03:00
Дмитрий 3af57e180a feat(m1): signed askuser approval records (P10-c HMAC receipts) 2026-06-04 03:59:38 +03:00
Дмитрий 325c1f4984 plan: детальный TDD-чертёж Машины 2 (Замок плана + Верховный хук)
Стоит на фундаменте Машины 1. 9 задач: freeze/seal плана (HMAC), детерминированный
матч действие-шаг (op+object, без LLM), персист, семена D12/D13, default-deny decide,
runGate+fail-CLOSED, авто-аудит дверей P15-b, сверка план-след P25-d, инварианты.
Проектные решения A-G помечены явно для ревью владельцем.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 19:43:56 +03:00
Дмитрий e3da14a7fc feat(m1): action-journal — append-only hash chain + HMAC head anchor + JSONL persist 2026-06-03 19:18:08 +03:00
Дмитрий 9bd45ce510 feat(m1): receipt-sign — canonicalJson + HMAC signPayload/verifyReceipt (fail-closed) 2026-06-03 19:16:28 +03:00
Дмитрий d7dc03271a feat(m1): receipt-key-config — HMAC key resolution (keychain -> env -> null) 2026-06-03 19:15:25 +03:00
Дмитрий 9309b3590e plan: детальный TDD-чертёж Машины 1 (Фундамент) — журнал S1, подпись расписок, защита-пол
10 задач TDD: receipt-key-config (keychain) + receipt-sign (HMAC) + action-journal
(хеш-цепочка + подпись головы) + усиление runtime-write-deny/path-norm/read-path-deny
+ подписанные askuser-расписки + сквозной self-verify. Заземлён в реальный код.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 19:10:16 +03:00
Дмитрий d612ef2e90 plan: проход правок мастер-карты (счёт несущих, покрытие D/OQ, зависимости, теневой режим) 2026-06-03 18:39:05 +03:00
Дмитрий 9a090bfdac plan: мастер-карта стройки роутер-наставник (7 машин, порядок, покрытие)
Master coordination roadmap из готового дизайна (судья A-I + роутер-наставник +
пред-спека хуков). 7 машин с порядком сборки, инвариантами, точками стыковки и
коверидж-таблицей (26 пунктов хуков + 12 to-build + 7 несущих усилителей).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:43:28 +03:00
Дмитрий 6a8c8494a6 docs(router-mentor): 3.4/3.5 закрыты — обучение роутера только по одобрению владельца 2026-06-03 17:10:20 +03:00
Дмитрий 940070685a docs(router-mentor): аудит хуков, 26-пунктная карта, два прохода усилений, чистовой список 2026-06-03 17:02:39 +03:00
Дмитрий 3b2ffecab4 docs(router-mentor): судья пройден полностью A-I + полный граф узлов + риск-фильтр роутера
Дизайн «роутер-наставник» (brainstorm-стадия, не канон):
- Полный граф+каталог узлов 100% роутеру и судье (отменено код-сужение; кэш, обновление на добавление узла в 4 местах)
- Риск-фильтр у роутера (бывш. W1+W2): тройка где-сломается/больно/откатимо, чинит сам, без блока
- Судья B (вход) / C (граница по обратимости) / D (Sonnet на воротах + код-сверка на исполнении)
- Качество плана и скилов = мерило + совет; дисциплина судьи; H (реакция владельца)
- Дыры I-1..I-4 + 3 призрака разобраны (I-2 закрыт, остальное аут/остаток)

Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
2026-06-02 12:56:11 +03:00
Дмитрий 97a0490be1 docs(router-discipline): critical review - 7 holes + pre-spec discipline question
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
2026-06-01 19:20:11 +03:00
Дмитрий 9c82cb0218 docs(router-discipline): D29-D36 + router equipment catalog (6 groups)
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
2026-06-01 16:28:09 +03:00
Дмитрий 9689a6e5b8 feat(router): max_tokens 1500->15000 + task_type rasinhron fix + design notes (router-mentor)
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
2026-06-01 11:50:17 +03:00
Дмитрий c55e14b626 feat(brain): surface router-gate v4 signals into episode + factor axes
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
2026-05-31 19:05:20 +03:00
Дмитрий 2f59541d4b docs(observer): add brain data catalog
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
2026-05-31 18:18:47 +03:00
381 changed files with 35632 additions and 2110 deletions
+15 -140
View File
@@ -38,42 +38,12 @@
},
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write|MultiEdit|NotebookEdit|Bash|PowerShell|Skill|Task",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-llm-judge-per-tool.mjs",
"timeout": 30
}
]
},
{
"matcher": "Read|Grep|Glob|LS|TodoWrite|AskUserQuestion|Edit|Write|MultiEdit|NotebookEdit|Bash|Skill|Task|EnterPlanMode",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-safe-baseline-metering.mjs",
"timeout": 10
}
]
},
{
"matcher": "Edit|Write|MultiEdit|NotebookEdit",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-runtime-write-deny.mjs",
"timeout": 5
}
]
},
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; const pd=process.env.CLAUDE_PROJECT_DIR||''; const path=require('path'); if (f && pd && path.resolve(f) === path.resolve(pd, 'CLAUDE.md')) { process.stderr.write('\\n[hook] WARNING: Direct edit of root CLAUDE.md detected. Per CLAUDE.md Р’В§5 Р С—.10, prefer /claude-md-management:revise-claude-md or /claude-md-management:claude-md-improver. If invoked via that skill, this warning is informational.\\n'); }\""
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; const pd=process.env.CLAUDE_PROJECT_DIR||''; const path=require('path'); if (f && pd && path.resolve(f) === path.resolve(pd, 'CLAUDE.md')) { process.stderr.write('\\n[hook] WARNING: Direct edit of root CLAUDE.md detected. Per CLAUDE.md §5 п.10, prefer /claude-md-management:revise-claude-md or /claude-md-management:claude-md-improver. If invoked via that skill, this warning is informational.\\n'); }\""
}
]
},
@@ -82,7 +52,7 @@
"hooks": [
{
"type": "command",
"command": "node \"C:/моя/проекты/портал crm/Документация/tools/subagent-prompt-prefix.mjs\""
"command": "node \"C:/моя/проекты/портал crm/Документация/tools/subagent-prompt-prefix.mjs\""
}
]
},
@@ -176,6 +146,16 @@
}
]
},
{
"matcher": "AskUserQuestion",
"hooks": [
{
"type": "command",
"command": "node tools/askuser-cosmetic-detector.mjs",
"timeout": 5
}
]
},
{
"matcher": "mcp__.*",
"hooks": [
@@ -195,71 +175,6 @@
"timeout": 5
}
]
},
{
"matcher": "Workflow",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-workflow-gate.mjs",
"timeout": 5
}
]
},
{
"matcher": "Edit|Write|MultiEdit|NotebookEdit|Bash|Task",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-decomposition-detector.mjs",
"timeout": 8
},
{
"type": "command",
"command": "node tools/enforce-parallel-session-lock.mjs",
"timeout": 3
}
]
},
{
"matcher": "AskUserQuestion",
"hooks": [
{
"type": "command",
"command": "node tools/askuser-cosmetic-detector.mjs",
"timeout": 5
}
]
},
{
"matcher": "Read|Grep|Glob|LS|TodoWrite|AskUserQuestion|Edit|Write|MultiEdit|NotebookEdit|Bash|Skill|Task|EnterPlanMode",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-safe-baseline-metering.mjs",
"timeout": 10
}
]
},
{
"matcher": "Edit|Write|MultiEdit|NotebookEdit",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-runtime-write-deny.mjs",
"timeout": 5
}
]
},
{
"matcher": "Edit|Write|MultiEdit|NotebookEdit|Bash|Task",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-parallel-session-lock.mjs",
"timeout": 3
}
]
}
],
"PostToolUse": [
@@ -277,7 +192,7 @@
"hooks": [
{
"type": "command",
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; const n=f.replace(/\\\\\\\\/g,'/'); if (/(^|\\\\/)db\\\\/schema\\\\.sql$/i.test(n)) { process.stdout.write('\\n[hook] REMINDER: You modified db/schema.sql. Per CLAUDE.md Р’В§5 Р С—.8, add a corresponding entry to db/CHANGELOG_schema.md before committing.\\n'); }\""
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; const n=f.replace(/\\\\\\\\/g,'/'); if (/(^|\\\\/)db\\\\/schema\\\\.sql$/i.test(n)) { process.stdout.write('\\n[hook] REMINDER: You modified db/schema.sql. Per CLAUDE.md §5 п.8, add a corresponding entry to db/CHANGELOG_schema.md before committing.\\n'); }\""
}
]
},
@@ -291,7 +206,7 @@
},
{
"type": "command",
"command": "echo ok",
"command": "node tools/enforce-rationalization-audit.mjs",
"timeout": 5
}
]
@@ -301,7 +216,7 @@
"hooks": [
{
"type": "command",
"command": "echo ok",
"command": "node tools/enforce-rationalization-audit.mjs",
"timeout": 5
}
]
@@ -315,29 +230,9 @@
"timeout": 10
}
]
},
{
"matcher": "AskUserQuestion",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-askuser-answer-parser.mjs",
"timeout": 2
}
]
}
],
"Stop": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "node tools/enforce-llm-judge-response-scan.mjs",
"timeout": 30
}
]
},
{
"hooks": [
{
@@ -382,15 +277,6 @@
"timeout": 10
}
]
},
{
"hooks": [
{
"type": "command",
"command": "node tools/enforce-parallel-session-lock.mjs",
"timeout": 3
}
]
}
],
"UserPromptSubmit": [
@@ -423,17 +309,6 @@
}
]
}
],
"SessionEnd": [
{
"hooks": [
{
"type": "command",
"command": "node tools/enforce-parallel-session-lock.mjs",
"timeout": 3
}
]
}
]
}
}
+1 -1
View File
@@ -292,7 +292,7 @@ trivy image liderra:latest
## 6. Текущая фаза проекта
**2026-06-02 lead region resolution — ВЫКАЧЕНА на прод liderra.ru (флаг ON, 100%):** Определение настоящего региона лида по телефону (DaData → реестр Россвязи → tag-fallback) + каскадная маршрутизация по региону (exact→all-RF→fallback) со взвешенным жребием по остатку дневного лимита (вариант В, вес ≥ 1 — мелкие клиенты не отрезаются). Состав: `LeadRegionResolver` (каскад по qc-кодам DaData) + `DaData/*` (клиент / страж бюджета / enum кодов качества / исключения) + `DaDataRegionMap` + `RossvyazPrefixLookup` + `RossvyazRecord`/`RegionResolution` DTO + команда `phone-ranges:import` (parse/map/dry-run/idempotency, atomic RENAME-swap в транзакции) + `LeadRouter` переписан (`matchEligibleProjects` + region-фильтр + `weightedPick` + инъекция `Randomizer`) + интеграция в `RouteSupplierLeadJob` (резолв ДО tx / persist 4 колонки / fail-safe аудит-лог `lead_region_resolution_log` / подмена subject_code на шаге 3 / CSV-merge по рангу источника `dadata/rossvyaz > CSV-tag`) + `phone-region:smoke`. Миграция `2026_05_31_100000` (`phone_ranges` / `phone_ranges_imports` / `lead_region_resolution_log` партиц. по месяцам + колонки на supplier_leads/deals) + регистрация в `MonthlyPartitionManager`; `db/schema.sql` синхронизирован заголовком (v8.40), DDL — в дельта-миграции (иначе двойной CREATE TABLE сломал бы migrate). **Решения заказчика/проекта:** резолвер через `app()` внутри `handle()` (не 7-й параметр — сохраняет сигнатуру + 3 существующих теста джобы); `deals.region_source` не добавляли (источник на supplier_leads + в журнале, CSV-merge по эвристике); запуск сразу на 100% без долевого гейта. **14 атомарных коммитов** `ec219718..11079791` на ветке `worktree-feat+lead-region-resolution`, запушено в origin (`CoralMinister/lidpotok`), **PR в main открывается вручную** по ссылке из `git push` output (MCP `create_pull_request` + `gh pr create` оба заблокированы router-гейтом). Тесты **101 pest GREEN / 509 assertions**; tools-vitest **1989 GREEN**. Code-review subagent (вердикт «с правками») → починены `atomicSwap()`→транзакция (spec §6.2) + убран stray comment; minor/deferred задокументированы (метрики §8.1 / `phone-ranges:rollback` / pg_anonymizer-маски / калибровка `DADATA_CALL_COST_KOPECKS`). **ВЫКАЧЕНО на прод liderra.ru 01.06.2026 ~16:01 МСК** (по команде «запускаем»): ключи DaData в боевом `.env`, флаг `LEAD_REGION_RESOLVER_ENABLED=true` на **100%** потока, реестр Россвязи **453080 диапазонов** (atomic swap). Smoke на реальном номере ✓ (Источник=dadata, Субъект=29 Красноярский край, qc=0). Инструмент выкатки — `.github/workflows/lead-region-ops.yml` (на origin/main, локально untracked). Откат: op=set-env flag=false. Операционные уроки и хвосты (unmapped-регионы → код+TDD, косметика счётчика, мониторинг region_source, калибровка DADATA_CALL_COST_KOPECKS) — память [[project-lead-region-resolution-live]]; runbook `docs/superpowers/runbooks/2026-05-31-lead-region-resolution-rollout.md`. Пре-существующий долг (НЕ из фичи, отдельная задача): 3 чужих console-теста (`BillingMigrateLeadsToRub` / `IncidentsWatchFailures` / `SnapshotBackfillCommand`) взаимно загрязняются в одном процессе (накопление счётчиков), в CI `pest --parallel` (файл=процесс) проходят. **Lefthook в worktree-shell не в PATH** → cspell/larastan/squawk/deptrac не гонялись на коммитах; deptrac проверен инспекцией (Service→Service разрешён), новые cspell-термины (Rossvyaz/DaData/kopecks) добавлены в `cspell-words.txt`, остальное — CI на push. **§0 cross-refs НЕ меняются** — app-фича (сервисы/джоба/миграция), не tooling-канон #1-#86 / не ADR / не off-phase. Через `claude-md-management:revise-claude-md`.
**2026-06-01 lead region resolution — фича реализована TDD + запушена (PR в main):** Определение настоящего региона лида по телефону (DaData → реестр Россвязи → tag-fallback) + каскадная маршрутизация по региону (exact→all-RF→fallback) со взвешенным жребием по остатку дневного лимита (вариант В, вес ≥ 1 — мелкие клиенты не отрезаются). Состав: `LeadRegionResolver` (каскад по qc-кодам DaData) + `DaData/*` (клиент / страж бюджета / enum кодов качества / исключения) + `DaDataRegionMap` + `RossvyazPrefixLookup` + `RossvyazRecord`/`RegionResolution` DTO + команда `phone-ranges:import` (parse/map/dry-run/idempotency, atomic RENAME-swap в транзакции) + `LeadRouter` переписан (`matchEligibleProjects` + region-фильтр + `weightedPick` + инъекция `Randomizer`) + интеграция в `RouteSupplierLeadJob` (резолв ДО tx / persist 4 колонки / fail-safe аудит-лог `lead_region_resolution_log` / подмена subject_code на шаге 3 / CSV-merge по рангу источника `dadata/rossvyaz > CSV-tag`) + `phone-region:smoke`. Миграция `2026_05_31_100000` (`phone_ranges` / `phone_ranges_imports` / `lead_region_resolution_log` партиц. по месяцам + колонки на supplier_leads/deals) + регистрация в `MonthlyPartitionManager`; `db/schema.sql` синхронизирован заголовком (v8.40), DDL — в дельта-миграции (иначе двойной CREATE TABLE сломал бы migrate). **Решения заказчика/проекта:** резолвер через `app()` внутри `handle()` (не 7-й параметр — сохраняет сигнатуру + 3 существующих теста джобы); `deals.region_source` не добавляли (источник на supplier_leads + в журнале, CSV-merge по эвристике); запуск сразу на 100% без долевого гейта. **14 атомарных коммитов** `ec219718..11079791` на ветке `worktree-feat+lead-region-resolution`, запушено в origin (`CoralMinister/lidpotok`), **PR в main открывается вручную** по ссылке из `git push` output (MCP `create_pull_request` + `gh pr create` оба заблокированы router-гейтом). Тесты **101 pest GREEN / 509 assertions**; tools-vitest **1989 GREEN**. Code-review subagent (вердикт «с правками») → починены `atomicSwap()`→транзакция (spec §6.2) + убран stray comment; minor/deferred задокументированы (метрики §8.1 / `phone-ranges:rollback` / pg_anonymizer-маски / калибровка `DADATA_CALL_COST_KOPECKS`). Прод-выкатка отложена (нужны `DADATA_API_KEY`/`DADATA_SECRET` в YC Lockbox + команда «запускаем»; runbook `docs/superpowers/runbooks/2026-05-31-lead-region-resolution-rollout.md`). Пре-существующий долг (НЕ из фичи, отдельная задача): 3 чужих console-теста (`BillingMigrateLeadsToRub` / `IncidentsWatchFailures` / `SnapshotBackfillCommand`) взаимно загрязняются в одном процессе (накопление счётчиков), в CI `pest --parallel` (файл=процесс) проходят. **Lefthook в worktree-shell не в PATH** → cspell/larastan/squawk/deptrac не гонялись на коммитах; deptrac проверен инспекцией (Service→Service разрешён), новые cspell-термины (Rossvyaz/DaData/kopecks) добавлены в `cspell-words.txt`, остальное — CI на push. **§0 cross-refs НЕ меняются** — app-фича (сервисы/джоба/миграция), не tooling-канон #1-#86 / не ADR / не off-phase. Через `claude-md-management:revise-claude-md`.
**2026-05-31 (продолжение) router-gate v4 Layer 4 LLM-judge — item 2b live wiring + активация владельцем + readonly-калибровка:** `tools/enforce-llm-judge-per-tool.mjs` (PreToolUse) и `tools/enforce-llm-judge-response-scan.mjs` (Stop) получили живой `main()` (TDD, чистые `runPerTool`/`runResponseScan`; commit `dfae9f76`). Spend строго гейтится `resolveJudgeConfig()` (флаг `ROUTER_LLM_JUDGE_ENABLED` И ключ); без флага/ключа `decide()` короткозамыкается → $0. **Архитектурный нюанс:** регистрировать надо именно **обёртки** `enforce-llm-judge-*`, не движки `llm-judge-{per-tool,response-scan}.mjs`у движков `main()` зовёт `llmJudgeCall` по наличию ОДНОГО ключа, игнорируя флаг (т.е. движок начал бы тратить деньги без рубильника). **Владелец активировал Layer 4** (env `ROUTER_LLM_JUDGE_ENABLED=1` через `rundll32 sysdm.cpl,EditEnvironmentVariables` + ключ `ROUTER_LLM_KEY` уже был в user env, как у классификатора + регистрация обоих хуков в `.claude/settings.json` + перезапуск) → судья ожил в **hard-block** (подтверждено: тот же `git log`, что при выключенном флаге проходил мгновенно, после активации заблокирован реальным вызовом — verdict ≠ YES → block). **Операционная находка / over-block:** `MUTATING_TOOLS` в `llm-judge-per-tool.mjs` включает `Bash` целиком, а правило вопроса — «Сомнения → NO» + код «не-YES → block», поэтому живой судья блокировал даже readonly-просмотры (`git status`/`git log`/`grep`) — и тем самым полностью клинил рабочий цикл (commit/push/правки тоже под судьёй). **Калибровка** (commit `c9b9efd6`, TDD, судья на время выключался владельцем — правка кода тоже под судьёй): новый экспортируемый `isReadonlyBashEvent(event)` — если tool=Bash и `classifyBashCommand(command, {})` даёт `result==='allow'` с reason `readonly|reading`, `runPerTool` возвращает allow **до** обращения к судье (без LLM-вызова, без budget-bump). Это **scope-fix к собственной декларации судьи** («judge on mutating tools»), а **не понижение дисциплины**: правило doubt→block и полная проверка всего, что реально меняет состояние (Edit/Write/MultiEdit/git commit/push/Skill/Task), — без изменений. Регрессия vitest tools-only **1927 GREEN** (+13 калибровочных тестов; verify через `npx vitest run --root app --config vitest.config.tools.mjs`, т.к. `npm run test:tools` падает из-за параллельной keytar-установки в `app/node_modules`). Коммиты `dfae9f76` (live wiring) + `c9b9efd6` (калибровка); push `a8996896..c9b9efd6 main`. План `docs/superpowers/plans/2026-05-31-llm-judge-live-wiring.md`. **§0 cross-refs НЕ меняются** — инфраструктура `tools/enforce-*.mjs`, не tooling-канон #1-#86 / не ADR / не off-phase. Через `claude-md-management:revise-claude-md`.
+5 -439
View File
@@ -5,7 +5,6 @@
"packages": {
"": {
"dependencies": {
"keytar": "*",
"lucide-vue-next": "^1.0.0"
},
"devDependencies": {
@@ -40,9 +39,6 @@
"vue-tsc": "^3.2.8",
"vuedraggable": "^4.1.0",
"vuetify": "^3.12.5"
},
"optionalDependencies": {
"keytar": "^7.9.0"
}
},
"node_modules/@acemir/cssom": {
@@ -4226,27 +4222,6 @@
"node": "18 || 20 || >=22"
}
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"optional": true
},
"node_modules/bidi-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz",
@@ -4267,18 +4242,6 @@
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/bl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"license": "MIT",
"optional": true,
"dependencies": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
"readable-stream": "^3.4.0"
}
},
"node_modules/boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@@ -4312,31 +4275,6 @@
"node": ">=8"
}
},
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"optional": true,
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
},
"node_modules/bundle-name": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
@@ -4443,13 +4381,6 @@
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/chownr": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"license": "ISC",
"optional": true
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -4721,32 +4652,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/decompress-response": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"license": "MIT",
"optional": true,
"dependencies": {
"mimic-response": "^3.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"license": "MIT",
"optional": true,
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -4828,7 +4733,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"devOptional": true,
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=8"
@@ -4953,16 +4858,6 @@
"node": ">= 0.8"
}
},
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"license": "MIT",
"optional": true,
"dependencies": {
"once": "^1.4.0"
}
},
"node_modules/entities": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
@@ -5375,16 +5270,6 @@
"node": ">=0.10.0"
}
},
"node_modules/expand-template": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
"license": "(MIT OR WTFPL)",
"optional": true,
"engines": {
"node": ">=6"
}
},
"node_modules/expect-type": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
@@ -5685,13 +5570,6 @@
"node": ">=18.3.0"
}
},
"node_modules/fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"license": "MIT",
"optional": true
},
"node_modules/fs-extra": {
"version": "11.3.5",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz",
@@ -5821,13 +5699,6 @@
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
}
},
"node_modules/github-from-package": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
"license": "MIT",
"optional": true
},
"node_modules/glob": {
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
@@ -6296,27 +6167,6 @@
"node": ">= 14"
}
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause",
"optional": true
},
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -6344,18 +6194,11 @@
"node": ">=0.8.19"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC",
"optional": true
},
"node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"devOptional": true,
"dev": true,
"license": "ISC"
},
"node_modules/is-docker": {
@@ -6717,25 +6560,6 @@
"graceful-fs": "^4.1.6"
}
},
"node_modules/keytar": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz",
"integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"dependencies": {
"node-addon-api": "^4.3.0",
"prebuild-install": "^7.0.1"
}
},
"node_modules/keytar/node_modules/node-addon-api": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
"integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
"license": "MIT",
"optional": true
},
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -7466,19 +7290,6 @@
"node": ">= 0.6"
}
},
"node_modules/mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"license": "MIT",
"optional": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/minimatch": {
"version": "10.2.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
@@ -7499,7 +7310,7 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"devOptional": true,
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -7522,13 +7333,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
"license": "MIT",
"optional": true
},
"node_modules/mri": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
@@ -7582,13 +7386,6 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/napi-build-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
"integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
"license": "MIT",
"optional": true
},
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -7596,19 +7393,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/node-abi": {
"version": "3.92.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz",
"integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==",
"license": "MIT",
"optional": true,
"dependencies": {
"semver": "^7.3.5"
},
"engines": {
"node": ">=10"
}
},
"node_modules/node-addon-api": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
@@ -7670,16 +7454,6 @@
"node": ">= 0.8"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"license": "ISC",
"optional": true,
"dependencies": {
"wrappy": "1"
}
},
"node_modules/oniguruma-parser": {
"version": "0.12.2",
"resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
@@ -8069,34 +7843,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/prebuild-install": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
"integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
"deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.",
"license": "MIT",
"optional": true,
"dependencies": {
"detect-libc": "^2.0.0",
"expand-template": "^2.0.3",
"github-from-package": "0.0.0",
"minimist": "^1.2.3",
"mkdirp-classic": "^0.5.3",
"napi-build-utils": "^2.0.0",
"node-abi": "^3.3.0",
"pump": "^3.0.0",
"rc": "^1.2.7",
"simple-get": "^4.0.0",
"tar-fs": "^2.0.0",
"tunnel-agent": "^0.6.0"
},
"bin": {
"prebuild-install": "bin.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -8151,17 +7897,6 @@
"node": ">=10"
}
},
"node_modules/pump": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
"integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"license": "MIT",
"optional": true,
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -8203,47 +7938,6 @@
],
"license": "MIT"
},
"node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
"optional": true,
"dependencies": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
},
"bin": {
"rc": "cli.js"
}
},
"node_modules/rc/node_modules/strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
"license": "MIT",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"license": "MIT",
"optional": true,
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/readdirp": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
@@ -8628,27 +8322,6 @@
"node": ">=6"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"optional": true
},
"node_modules/sass": {
"version": "1.99.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz",
@@ -9058,7 +8731,7 @@
"version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"devOptional": true,
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -9140,53 +8813,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/simple-concat": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"optional": true
},
"node_modules/simple-get": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"optional": true,
"dependencies": {
"decompress-response": "^6.0.0",
"once": "^1.3.1",
"simple-concat": "^1.0.0"
}
},
"node_modules/sirv": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
@@ -9307,16 +8933,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"license": "MIT",
"optional": true,
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -9479,36 +9095,6 @@
"node": ">=16.0.0"
}
},
"node_modules/tar-fs": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
"integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
"license": "MIT",
"optional": true,
"dependencies": {
"chownr": "^1.1.1",
"mkdirp-classic": "^0.5.2",
"pump": "^3.0.0",
"tar-stream": "^2.1.4"
}
},
"node_modules/tar-stream": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"license": "MIT",
"optional": true,
"dependencies": {
"bl": "^4.0.3",
"end-of-stream": "^1.4.1",
"fs-constants": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.1.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/tinybench": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
@@ -9653,19 +9239,6 @@
"dev": true,
"license": "0BSD"
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"safe-buffer": "^5.0.1"
},
"engines": {
"node": "*"
}
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -9882,7 +9455,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"devOptional": true,
"dev": true,
"license": "MIT"
},
"node_modules/utils-merge": {
@@ -10533,13 +10106,6 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC",
"optional": true
},
"node_modules/ws": {
"version": "8.20.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
-3
View File
@@ -51,8 +51,5 @@
},
"dependencies": {
"lucide-vue-next": "^1.0.0"
},
"optionalDependencies": {
"keytar": "^7.9.0"
}
}
-7
View File
@@ -38,11 +38,4 @@ describe('DealsFilters', () => {
});
expect(w.find('[data-testid="clear-filters-btn"]').exists()).toBe(true);
});
it('поле поиска имеет доступное имя (label) для скринридера', () => {
const w = mount(DealsFilters, { props: baseProps, global: { plugins: [vuetify] } });
const label = w.find('[data-testid="filter-search-phone"] label');
expect(label.exists()).toBe(true);
expect(label.text()).toContain('Поиск по телефону');
});
});
-7
View File
@@ -47,11 +47,4 @@ describe('KanbanColumn.vue', () => {
expect(wrapper.emitted('openDeal')).toBeTruthy();
expect(wrapper.emitted('openDeal')?.[0]).toEqual([dealsForNew[0].id]);
});
// Контраст column-total на ивори чинится в scoped CSS (var(--accent) → нейтральный #4a463f),
// jsdom scoped-стили не вычисляет → числовую проверку контраста делает Pa11y. Здесь — структурный якорь.
it('column-total отрисован для пустой колонки', () => {
const wrapper = factory({ status, deals: [] });
expect(wrapper.find('.column-total').exists()).toBe(true);
});
});
-10
View File
@@ -49,14 +49,4 @@ describe('ProjectCard', () => {
});
expect(wrapper.text()).toContain('На паузе');
});
it('чип типа сигнала — flat-вариант с классом signal-chip (a11y контраст)', () => {
const wrapper = mount(ProjectCard, {
global: { plugins: [vuetify] },
props: { project: baseProject, selected: false },
});
const chip = wrapper.find('.signal-chip');
expect(chip.exists()).toBe(true);
expect(chip.classes()).toContain('v-chip--variant-flat');
});
});
-20
View File
@@ -4,26 +4,6 @@
# A4 design-tooling integration (v2.8 / v3.8 / v1.22)
iconify
# lead-region-resolution spec/plan (DaData + Россвязь, 2026-05-29)
dadata
rossvyaz
unmappable
mnp
incrby
deyatelnost
resurs
numeracii
vypiska
reestra
sistemy
plana
маппингах
реконсиляция
сетап
хелперы
регэкспом
резолвом
# Бренд и термины проекта
лидерра
liderra
+1 -4
View File
@@ -1,10 +1,7 @@
{
"2026-05": {
"WIN_USER_PATH": 206,
"WIN_USER_PATH": 123,
"IPV4": 1,
"RU_PHONE": 1
},
"2026-06": {
"WIN_USER_PATH": 91
}
}
+2 -2
View File
@@ -1,5 +1,5 @@
{
"last_read_at": "2026-05-30T12:32:49.927Z",
"read_count_last_period": 6,
"last_read_at": "2026-05-27T00:53:33.490Z",
"read_count_last_period": 5,
"period_start": "2026-05-19T00:00:00+03:00"
}
+60 -29
View File
@@ -1,22 +1,22 @@
# Brain Status (auto-generated)
Last updated: 2026-06-08T14:07:33.978Z
Last updated: 2026-05-30T13:11:39.164Z
| Контролёр | Состояние | Детали |
|---|---|---|
| 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 1 week(s) ago |
| C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 0 week(s) ago |
| C4 Сигнальный статус | ✅ | This file (self-reference) |
| C5 Observer-coverage | | 666 episode(s) this month · Stop-hook + post-commit OK |
| C5 Observer-coverage | ⚠️ | 752 episode(s) this month · Stop-hook + post-commit OK · 20 missed activation(s) — see /brain-retro |
| C6 Chain map sync | ✅ | [chain-map-checker] OK — 16 chains in sync |
## Метрики (информационные, не алерты)
- Observer evidence: 666 episodes this month, 0 observer_error markers, 88 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 666
- Last /brain-retro: 9 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).
- Observer evidence: 752 episodes this month, 0 observer_error markers, 186 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 613
- Last /brain-retro: 0 day(s) ago
- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 20. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store).
## Метрики дисциплины
@@ -24,14 +24,16 @@ Baseline дисциплины роутера (этап 2 router discipline overh
| Тип задачи | Эпизодов | % с триггер-матчем | % через скил |
|---|---|---|---|
| planning | 96 | 10.4% | 13.5% |
| analysis | 33 | 6.1% | 0.0% |
| bugfix | 26 | 15.4% | 19.2% |
| feature | 24 | 12.5% | 4.2% |
| analysis | 34 | 23.5% | 14.7% |
| planning | 25 | 12.0% | 16.0% |
| bugfix | 25 | 24.0% | 20.0% |
| feature | 19 | 10.5% | 0.0% |
| cleanup | 6 | 0.0% | 0.0% |
| refactor | 1 | 0.0% | 0.0% |
Router step distribution: 1: 321, 2: 261, 3: 18, 5: 55
Router step distribution: 1: 330, 2: 279, 3: 67, 5: 67
Boundaries applied (ADR / границы): 7 of 655 эпизодов (1.1%).
Boundaries applied (ADR / границы): 76 of 743 эпизодов (10.2%).
## Активные многоэтапные проекты
@@ -43,16 +45,22 @@ Boundaries applied (ADR / границы): 7 of 655 эпизодов (1.1%).
## Длинные сессии
Ни одной сессии с >50 ходов сегодня (UTC). ✅
⚠️ Сегодня (2026-05-30 UTC) есть сессии с 50 ходов — корреляция с падением дисциплины роутинга (retro #5 candidate B).
| session_id | макс. ход | % regulated | последний эпизод |
|---|---|---|---|
| `52b2b52d` | 75 | 3% | 2026-05-30T11:45:39.213Z |
Long sessions correlate with discipline drift. Если % regulated просел в текущей сессии — рассмотри перезапуск.
## Стоимость месяца
| Компонент | Токены (in/out) | USD |
|---|---|---|
| Classifier (Sonnet 4.6) | 41653/183234 | $2.87 |
| Classifier (Sonnet 4.6) | 12550/86494 | $1.34 |
| Self-assessment (Sonnet 4.6) | 0/0 | $0.00 |
| Reviewer (Opus 4.7 + fallback) | 0/0 | $0.00 |
| **Итого** | | **$2.87** |
| **Итого** | | **$1.34** |
## Аномалии классификатора
@@ -65,20 +73,50 @@ Episodes since last run: 542 / threshold: 10
## Reviewer: субагент vs fallback
0 эпизодов проверено из 666.
0 эпизодов проверено из 752.
## Reviewer findings
(нет проверенных эпизодов в текущем периоде)
Проверено: 372 эпизодов. **69 actionable** (wrong_skill + wrong_chain_order).
### error_root_cause
| cause | count |
|---|---:|
| n/a | 271 |
| wrong_skill | 55 |
| external_failure | 28 |
| wrong_chain_order | 14 |
| wrong_tool | 4 |
### Топ alternative_better
| recommended | count |
|---|---:|
| #19 | 18 |
| #25 | 15 |
| #34 | 8 |
| #18 | 8 |
| #33 | 3 |
### node_quality
| judgment | count |
|---|---:|
| disputable | 207 |
| correct | 120 |
| wrong_node | 40 |
| underkill | 3 |
| overkill | 2 |
## Использование override-фраз
⚠️ Превышен порог override-использования сегодня (≥5/день)
| Фраза | За всё время | За сегодня |
|---|---|---|
| `recovery` | 2302 | 0 |
| `без скилов` | 507 | 0 |
| `recovery` | 2302 | 23 ⚠️ |
| `без скилов` | 507 | 40 ⚠️ |
| `ремонт инфраструктуры` | 331 | 0 |
| `срочно` | 225 | 0 |
| `memory dump` | 46 | 0 |
@@ -87,14 +125,7 @@ Episodes since last run: 542 / threshold: 10
## System Health
Топ-3 процессов с CPU > 1ч:
| PID | Имя | CPU-время | Возраст |
|---|---|---|---|
| 3916 | MsMpEng | 1.99ч | NaNч |
| 15260 | Code | 1.71ч | 0.0ч |
⚠️ Проверь, не «осиротевшие» ли это процессы от завершённых Claude-сессий.
Долго работающих процессов нет (порог CPU > 1ч).
## Алерт-индикаторы
+168
View File
@@ -0,0 +1,168 @@
# Каталог данных «мозга» Лидерры
Полный перечень всего, что новый «мозг» (наблюдатель + защиты router-gate v4) **способен фиксировать**: журнал эпизодов, числовые параметры/счётчики и все оси для факторного анализа.
**Статус проверки:** разделы A–E сверены по исходному коду `tools/` (31.05.2026). Раздел F сверен по коду хуков. Все цитаты — `file:line` от корня репозитория.
---
## A. Эпизод журнала — `docs/observer/episodes-YYYY-MM.jsonl` (схема v4.4, schema_minor 4)
Один эпизод = один цикл «промпт заказчика → ответ Claude». Append-only, по строке на эпизод. ПДн вырезаются до записи (`observer-pii-filter.mjs`). Сборка — `observer-transcript-parser.mjs:888` (`parseTranscript`).
### A.1. Идентификация и время
| Поле | Тип / значения | Смысл |
|---|---|---|
| `schema_version` | `4` | версия схемы |
| `schema_minor` | `3` | подверсия |
| `task_id` / `task_ref` | string (sessionId) | привязка к сессии |
| `timestamps.started_at` / `ended_at` | ISO | начало/конец хода |
### A.2. Кто и что выбрал
| Поле | Значения | Смысл |
|---|---|---|
| `path_type` | `regulated` / `improvised` | был ли вызван навык superpowers |
| `decision_provenance.kind` | `autonomous` / `user_directed_method` / `user_chose_from_options` | кто выбрал маршрут — Claude сам / навязан заказчиком / заказчик выбрал из предложенного |
| `decision_provenance.claude_would_have_chosen` | string / null | контрфактуал — что выбрал бы Claude сам |
### A.3. Исход
| Поле | Значения | Смысл |
|---|---|---|
| `outcome` | при записи `unknown` | исход (выводится позже, см. C) |
| `outcome_reviewed` | null → метка | исход по ревью /brain-retro |
| `outcome_reviewed_source` | null / source | кто проставил ревью |
### A.4. Сигнал заказчика
| Поле | Значения | Смысл |
|---|---|---|
| `prompt_signal` | `correction` / `approval` / `new_task` / `neutral` | тон следующего/текущего промпта |
| `prompt_embedding_base64` | null → вектор | смысловой вектор первого промпта (дозаполняется асинхронно) |
### A.5. Обстановка (`environment`)
| Поле | Значения | Смысл |
|---|---|---|
| `economy_level` | 0 / 5 / 100 / null | режим экономии |
| `model` | имя модели | модель контроллера |
| `post_compaction` | bool | был ли сжат контекст до хода |
| `session_turn` | int | номер хода после последнего сжатия |
| `parallel_session` | bool | признак второй активной сессии |
| `classifier_model` | имя / null | модель LLM-классификатора |
### A.6. Размер (`task_size`)
`tool_calls` (всего вызовов инструментов) · `files_touched` (уникальных файлов) · `files[]` (список путей). — `observer-transcript-parser.mjs:423`.
### A.7. Стоимость и токены (`task_cost`)
`observer-transcript-parser.mjs:472`. Базовые: `input_tokens` · `output_tokens` · `cache_read_input_tokens` · `cache_creation_input_tokens` · `web_search_requests` · `web_fetch_requests` · `iterations` (детектор extended-thinking).
Слой LLM-агентов (дозаполняется): `classifier_input_tokens` · `classifier_output_tokens` · `self_assessment_input_tokens` · `self_assessment_output_tokens` · `reviewer_input_tokens` · `reviewer_output_tokens` · `reviewer_subagent_usd` · `reviewer_direct_fallback_usd` · `judge_spend_usd` (✅ NEW — `judge_calls × JUDGE_PER_CALL_USD`).
### A.8. Мета (`task_meta`)
`prompt_length_chars` · `mcp_servers_used[]` · `file_type_distribution` по корзинам `src / test / config / spec / norm / data / other` (`classifyFilePath``observer-transcript-parser.mjs:358`).
### A.9. Классификатор (`classifier_output`) + `degraded_mode`
`observer-state-enricher.mjs:52`. `task_type` · `recommended_node` · `recommended_chain` · `recommended_chain_id` · `no_skill_found` · `source` (llm/regex/prefilter/cache) · `reasoning` (≤600 симв.) · `confidence` · `latency_ms` · `retry_count_internal` · `llm_error` · `alternatives_considered[]` (топ-3). Отдельно `degraded_mode` (bool, LLM→regex fallback).
### A.10. Рассуждение маршрута (`primary_rationale`)
`step` · `node_chosen` · `chain_ref` · `triggers_matched[]` · `candidates_considered[]` · `boundaries_applied[]` · `hard_floor{invoked, rules[]}` · `task_classification` · `recommended_node` · `recommended_chain` · `chain_progress` · `chain_completed`.
**`task_classification` — 12 значений** (`observer-transcript-parser.mjs:208`): `memory-sync`, `regulatory-bump`, `planning`, `release`, `refactor`, `bugfix`, `feature`, `docs`, `analysis`, `cleanup`, `monitoring`, `question`, `other`.
### A.11. События (`events[]`) — 11 видов
`skill_invoked` (skill) · `tool_summary` (counts) · `error` (tool, summary) · `hook_fired` (counts, scripts, errors) · `interrupt` · `retry` · `time_burn` (ход > 15 мин) · `parse_gap` (> 10% битых строк) · `unrecovered_error` (ход кончился на ошибке) · `ask_user_question` (question_count, answer_kind: `option`/`custom`/`no_answer`) · `subagent_invoked` (subagent_type, model, description).
### A.12. Сигналы защит router-gate v4 (`v4_signals`) — ✅ NEW (schema_minor 4)
Поднимаются в эпизод ридером `observer-v4-signals.mjs` по окну хода `[started_at, ended_at]`: `rationalization_flag_count` (число пойманных самооправданий в окне) · `judge_verdict` (`YES`/`NO`/`block`/`null` — последний вердикт судьи в окне) · `safe_baseline_action` (`allow`/`soft_flag`/`hard_block`/`null` — худшее действие safe-baseline в окне) · `judge_calls` (кумулятивно за сессию из бюджета судьи).
---
## B. Факторные оси — `FACTOR_FNS` (`brain-retro-analyzer.mjs:326`) — 27 осей + `chain_ref`
Каждая ось раскладывает эпизоды по корзинам и строит матрицу «значение фактора × распределение исходов» (`buildFactorMatrix`, `brain-retro-analyzer.mjs:384`).
**Pass 0 (из ядра эпизода):** `decision_provenance` · `economy_level` · `model` · `post_compaction` · `session_segment_turn` · `parallel_session` · `task_size` · `node_chosen` · `task_classification` · `recommended_node_for_direct`.
**Pass 1 (дешёвые оси из v4):** `prompt_signal` · `classifier_source` · `degraded_mode` · `path_type` · `retry_count` · `error_count` · `hard_floor_invoked` · `iterations_bucket`.
**Pass 2 (метрики классификатора):** `latency_bucket` (fast<500 / medium<2000 / slow<10000 / very_slow) · `error_type`.
**Pass 3 (динамика):** `prompt_length_bucket` (short<100 / medium<1000 / long<2500 / huge) · `time_of_day_bucket` (night/morning/afternoon/evening, UTC) · `day_of_week` · `inter_prompt_gap_bucket` (<1m / 1-10m / 10-60m / 60m+) · `mcp_server_used` (any/none) · `file_type_main` · `skill_invocations_bucket` (0/1/2+) · `subagent_spawns_bucket` (0/1/2+).
**Pass 4 (семантика):** `similar_past_outcome_majority` (исход большинства соседей по смысловому вектору; `no_neighbors` если вектора нет).
**Pass 5 (✅ NEW — сигналы router-gate v4):** `rationalization_flag_count` (0/1/2+) · `judge_verdict` (YES/NO/block/null) · `safe_baseline_action` (allow/soft_flag/hard_block/null) · `judge_calls_bucket` (0 / 1-9 / 10+).
**Отдельно:** `chain_ref` — мульти-значный (эпизод считается по разу на каждую цепочку).
---
## C. Вывод исхода — `inferOutcome` (`brain-retro-analyzer.mjs:95`) — 5 меток
- `blocked` — ход кончился на неисправленной ошибке (`unrecovered_error`).
- `rework` — следующий эпизод имеет `prompt_signal = correction`.
- `success` — следующий = `approval` или `new_task`.
- `soft_success` — следующий = `neutral` (тихий успех).
- `unknown` — следующего эпизода ещё нет.
---
## D. Аналитические срезы (Cuts) `/brain-retro` (`brain-retro-analyzer.mjs`)
| Срез | Функция | Что агрегирует |
|---|---|---|
| Факторная матрица | `buildFactorMatrix` | 27 осей × распределение исходов |
| Cut 8 — Class × canon coverage | `buildClassCanonCoverage:448` | по классу задачи: count, канон-узлы, как часто роутер рекомендовал, что взял Claude, попало ли в канон, rework |
| Cut 9 — Router vs Opus | `buildRouterVsOpus:498` | расхождение роутера и Opus-ревьюера (3 секции) |
| Cut 10 — Chain-ignore breakdown | `buildChainIgnoreBreakdown:559` | % игнора цепочек + rework-rate по длине (1 / 2 / 3+) |
| Cut 11 — Chain-hook effectiveness | `analyzeChainHookEffectiveness:36` + `buildChainHookEffectiveness:59` | исходы срабатывания chain-хука по ledger |
| Router-gate hook effectiveness | `buildRouterGateHookEffectiveness:617` | эффективность router-gate |
| Self-fabrication signals | `buildSelfFabricationSignals:643` | признаки фейковых результатов |
---
## E. Числовые счётчики и деньги (вне эпизода)
### E.1. `~/.claude/runtime/cost-daily.json` (per-date)
`cost-aggregator.mjs:13`. Поля: `classifier_usd` · `self_assessment_usd` · `reviewer_subagent_usd` · `reviewer_direct_fallback_usd` · `self_retrospect_usd` · `total_usd` · `episode_count`.
### E.2. `PRICING` (`cost-pricing.mjs`)
Sonnet — $3/Mtok вход, $15/Mtok выход. Opus — $15/Mtok вход, $75/Mtok выход.
### E.3. `~/.claude/runtime/hook-outcomes.jsonl`
6 корзин исхода хука (`classifyOutcome`): `blocked` / `passed-with-skill` / `passed-inline-override` / `passed-global-override` / `passed-short-chain` / `passed-no-mutating`. Строка: rule, outcome, sessionId, timestamp.
### E.4. `~/.claude/runtime/override-usage.jsonl`
Лог override-фраз. Порог 5/день на фразу (6-я блокируется `enforce-override-limit`). Байпас — фраза «лимит снят».
### E.5. Контролёр C5 (`observer-coverage-checker.mjs`) — warn-only
`coverage` (хук зарегистрирован, но 0 эпизодов за месяц) · `registration` (Stop-хук + post-commit на месте) · `missed.totalMissed` (промахи активации узлов, `missed-activations.mjs`).
### E.6. Три счётчика в `docs/observer/`
`.pii-counters.json` (сколько ПДн вырезано) · `.read-counter.json` (когда читали файлы наблюдателя; алерт через 54 недели тишины) · `.self-retrospect-counter.json` (`episodes_since_last`, порог 50 → предложить саморазбор).
---
## F. Сигналы новых защит router-gate v4
> **Обновление 31.05.2026:** F.1F.3 ✅ **заведены в эпизод** (`v4_signals`, см. A.12) и в факторный анализ (Pass 5, раздел B) через ридер `observer-v4-signals.mjs`. F.4/F.5 — пока только на диске.
### F.1. Rationalization-audit (`enforce-rationalization-audit.mjs`)
`~/.claude/runtime/rationalization-flags-<session>.jsonl`. Строка: `{kind, evidence}`. Виды (`kind`): `rationalization-phrase` (фраза-самооправдание) · `prod-edit-without-test` (правка прод-кода без теста в том же ходе) · `weak-commit-message` (commit с сообщением < 12 симв.). Блокирует на 3-м флаге за сессию (`decide:112`). Перед сопоставлением снимает цитаты/код (`stripQuotedContext:51`).
### F.2. Safe-baseline metering (`enforce-safe-baseline-metering.mjs`)
`~/.claude/runtime/safe-baseline-ledger-<sess>.json` (per-task счётчики вызовов safe-инструментов Read/Grep/Glob/LS/TodoWrite/AskUser + `skill_match_within_task` + `lastKeywords`) и `safe-baseline-flags-<sess>.jsonl` (`{ts, tool, reason}`). Действия: `allow` / `soft_flag` / `hard_block` (мутирующий инструмент за порогом без навыка). Escape — любой Skill / EnterPlanMode.
### F.3. LLM-судья Layer 4 (`enforce-llm-judge-per-tool.mjs` + `-response-scan.mjs`)
Вердикт по каждому мутирующему инструменту: `YES → allow`, `NO`/сомнение → `block`. Spend гейтится `resolveJudgeConfig` (флаг `ROUTER_LLM_JUDGE_ENABLED` И ключ) + per-session бюджет `JUDGE_SESSION_BUDGET` (инкремент только на реальный вызов). Исключения из проверки (scope-fix, не понижение дисциплины): `isReadonlyBashEvent` (readonly git/cat/grep/ls) и `isTestRunnerBashEvent` (vitest/pest/phpunit/artisan test/composer test/npm test без цепочки).
### F.4. Router-state writer (`router-prehook.mjs:156`)
`~/.claude/runtime/router-state-<session>.json`: `classification` (вывод классификатора — task_type/recommended_node/recommended_chain/source/confidence/reasoning/…) · `chainProgress[]` · `chainCompleted` · `task_cost` (токены классификатора). Это источник, из которого `observer-state-enricher` обогащает эпизод (A.9–A.10).
### F.5. Прочие runtime-сигналы
`expected-branch-<session>` (защита от угона ветки, `enforce-branch-switch`) · `verify-pass-<session>` (свежесть регрессии перед push, `enforce-verify-before-push`) · `askuser-decisions-<session>.jsonl` (одобрения git-операций) · `session-lock-<workspaceHash>.json` (замок параллельной сессии, `enforce-parallel-session-lock`) · `router-gate-mode.json` и набор `*-mode.json` (рубильники слоёв).
---
## Кандидаты на расширение факторного анализа
**Реализовано 31.05.2026** (план `docs/superpowers/plans/2026-05-31-brain-factor-analysis-f-candidates.md`): следующие 4 оси заведены в эпизод (`v4_signals`) и в `FACTOR_FNS` (Pass 5):
- `rationalization_flag_count` (F.1) — число самооправданий за ход/сессию.
- `safe_baseline_action` (F.2) — allow / soft_flag / hard_block.
- `judge_verdict` (F.3) — YES / block / disabled (когда Layer 4 активен).
- `judge_spend_usd` (F.3) — расход судьи (добавить компонентом в `task_cost` и в `cost-daily.json`).
File diff suppressed because one or more lines are too long
@@ -0,0 +1,18 @@
# Shadow-replay отчёт
## М5 пол — GREEN
events: 954 | over-block: 0 | real-catch: 5 | allow: 949 | miss: 0
## М6 снимок — GREEN
events: 951 | over-block: 0 | real-catch: 2 | allow: 949 | miss: 0
## М2 стена — GREEN
events: 5 | over-block: 0 | real-catch: 2 | allow: 3 | miss: 0
## М4 судья — GREEN
events: 5 | over-block: 0 | real-catch: 2 | allow: 3 | miss: 0
## М3 роутер — расхождение (реальные эпизоды)
total: 884 | followed: 2 | diverged: 88 | no-rec: 794
> М1 журнал: вне холостого прогона (runtime read-protected); целостность — unit-тест (пин 5782ede3).
@@ -0,0 +1,12 @@
{
"skill": "21st-magic",
"kind": "external",
"needs": ["намерение UI-шаблона (компонент / лейаут / форма)"],
"produces": ["стартовый UI-шаблон (LLM-сгенерированный)"],
"constraints": ["генератор шаблонов через PSR_v1 R14.4 pipeline", "Pa11y проверка обязательна после генерации", "стек-фильтр R6.0"],
"preview-form": "mockup",
"defaults": ["после генерации — обязательный Pa11y"],
"key-decisions": ["какой шаблон; адаптация под Vue+Vuetify"],
"acceptance-criteria": ["шаблон в стеке Vue+Vuetify, Pa11y 0 нарушений"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "adr-kit",
"kind": "external",
"needs": ["архитектурное решение для фиксации/проверки"],
"produces": ["ADR в docs/adr/ + enforcement через adr-judge"],
"constraints": ["ADR + adr-judge lefthook job 9 (без LLM)", "НЕ диаграммы (mermaid)", "НЕ справочник паттернов (architecture-patterns)"],
"preview-form": "outline",
"defaults": ["adr-judge декларативно, без --llm"],
"key-decisions": ["что фиксировать как ADR; статус решения"],
"acceptance-criteria": ["решение зафиксировано ADR, adr-judge проходит"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "architecture-patterns",
"kind": "external",
"needs": ["вопрос выбора архитектурного паттерна"],
"produces": ["описание паттернов + критерии выбора (Clean/Hexagonal/DDD/CQRS/...)"],
"constraints": ["справочник паттернов (knowledge)", "НЕ фиксация решения (adr-kit)"],
"preview-form": "none",
"defaults": ["давать критерии выбора, не догму"],
"key-decisions": ["какой паттерн под контекст"],
"acceptance-criteria": ["паттерн обоснован под контекст задачи"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "billing-audit",
"kind": "own",
"needs": ["код/диф биллинга для аудита денежной корректности"],
"produces": ["отчёт о money-инвариантах биллинга"],
"constraints": ["self-authored; аудит кода биллинга (bcmath/идемпотентность/tier/charge_source)", "ADR-012: НЕ налоги (ru-tax), НЕ процесс (process-*), НЕ security (D3)"],
"preview-form": "outline",
"defaults": ["проверять потерю копеек, двойное списание, tier-резолюцию, дрейф reconcile"],
"key-decisions": ["какие денежные инварианты в scope"],
"acceptance-criteria": ["каждый денежный путь проверен на потерю копеек и двойное списание"]
}
@@ -0,0 +1,12 @@
{
"skill": "boost",
"kind": "external",
"needs": ["SQL/Eloquent-запрос к dev-БД или вопрос по docs Laravel/пакета"],
"produces": ["результат SQL/Eloquent или релевантная документация Laravel"],
"constraints": ["MCP к dev-БД через Roster auto-detect", "НЕ подключать к production DB", "заменил PostgreSQL MCP (#1)"],
"preview-form": "none",
"defaults": ["read-first; serverить только установленные пакеты (Roster)"],
"key-decisions": ["источник: только dev-БД, не прод"],
"acceptance-criteria": ["запрос/доки отданы из правильного (dev) источника"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "brand-voice",
"kind": "external",
"needs": ["текст/коммуникация для проверки голоса бренда"],
"produces": ["вербальные brand guidelines / проверка тональности"],
"constraints": ["вербальный бренд (ADR-015 MKT6) НЕ Brandbook визуальный", "взаимодополняют"],
"preview-form": "outline",
"defaults": ["единый тон коммуникации Лидерры"],
"key-decisions": ["тональность под канал/аудиторию"],
"acceptance-criteria": ["текст соответствует голосу бренда"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "ccpm",
"kind": "external",
"needs": ["идея фичи для управления (PRD→эпик→issue→код)"],
"produces": ["PRD/эпики/issues в .claude/prds/ + .claude/epics/"],
"constraints": ["вендоренный скил, 14 bash-скриптов без хуков", "GitHub-issues через GitHub MCP", "НЕ продуктовые церемонии (product-management)"],
"preview-form": "outline",
"defaults": ["PRD → эпик → issues → код"],
"key-decisions": ["декомпозиция эпика на issues"],
"acceptance-criteria": ["фича прослежена PRD→issue→код"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "claude-code-setup",
"kind": "external",
"needs": ["паттерны использования Claude Code для рекомендаций"],
"produces": ["рекомендации автоматизаций (hooks/permissions/settings)"],
"constraints": ["READ-ONLY рекомендатель, не меняет конфиг"],
"preview-form": "outline",
"defaults": ["предлагает, не применяет"],
"key-decisions": ["какие автоматизации предложить"],
"acceptance-criteria": ["рекомендации релевантны паттернам использования"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "claude-md-management",
"kind": "external",
"needs": ["намерение правки CLAUDE.md (audit / capture learnings)"],
"produces": ["обновлённый CLAUDE.md (через claude-md-improver / revise-claude-md)"],
"constraints": ["единственный разрешённый канал правки CLAUDE.md (§5 п.10)", "синхронизировать Pravila + Tooling (п.7)"],
"preview-form": "none",
"defaults": ["claude-md-improver для структурных, revise для learnings"],
"key-decisions": ["audit-правка vs захват learnings"],
"acceptance-criteria": ["CLAUDE.md обновлён через плагин, нормативка синхронна"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "context7",
"kind": "external",
"needs": ["вопрос по API/доке конкретной библиотеки/SDK"],
"produces": ["актуальная документация библиотеки/SDK"],
"constraints": ["первый выбор для доков известной библиотеки", "WebFetch — fallback на URL; WebSearch — без знания библиотеки"],
"preview-form": "none",
"defaults": ["resolve-library-id → query-docs"],
"key-decisions": ["какая библиотека/тема"],
"acceptance-criteria": ["актуальная дока по API получена"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "cspell",
"kind": "external",
"needs": ["Markdown-текст для проверки орфографии", "пользовательский словарь проекта"],
"produces": ["отчёт о неизвестных словах"],
"constraints": ["ru/en орфография .md с пользовательским словарём", "НЕ стиль (markdownlint)", "НЕ грамматика"],
"preview-form": "none",
"defaults": ["учитывать cspell-words.txt"],
"key-decisions": ["новый валидный термин → в словарь, а не подавлять находку"],
"acceptance-criteria": ["0 неизвестных слов вне словаря"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "data-scientist",
"kind": "external",
"needs": ["датасет + ML-задача (классификация/регрессия/анализ)"],
"produces": ["ML-результат: модель, метрики, визуализация"],
"constraints": ["вендоренный скил; классический ML-воркфлоу", "требует датасета, не доменной БД портала"],
"preview-form": "sample",
"defaults": ["загрузка → feature engineering → обучение → оценка"],
"key-decisions": ["алгоритм и метрики под задачу"],
"acceptance-criteria": ["модель оценена метриками, результат воспроизводим"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "dataforseo-mcp",
"kind": "external",
"needs": ["SEO-вопрос по РФ (SERP/ключевые/бэклинки)"],
"produces": ["SEO-данные РФ: SERP-позиции, бэклинки, конкурентный анализ"],
"constraints": ["DEFERRED — платный, pending Б-1", "комплементарен Wordstat #79"],
"preview-form": "none",
"defaults": ["при платном аккаунте"],
"key-decisions": ["какие SEO-данные нужны"],
"acceptance-criteria": ["SEO-данные РФ получены (при доступе)"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "dependabot",
"kind": "external",
"needs": ["Composer/npm-зависимости"],
"produces": ["auto-PR при обнаружении CVE в зависимости"],
"constraints": ["авто-PR через .github/dependabot.yml", "НЕ блок install (Roave)"],
"preview-form": "none",
"defaults": ["настройка через .github/dependabot.yml"],
"key-decisions": ["принять/отклонить предложенное обновление"],
"acceptance-criteria": ["CVE-зависимости имеют открытый update-PR"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "deptrac",
"kind": "external",
"needs": ["PHP-слои для проверки направления зависимостей"],
"produces": ["отчёт о нарушениях границ слоёв"],
"constraints": ["граф слоёв по app/deptrac.yaml; lefthook job 10", "НЕ типовой анализ (Larastan)", "НЕ декларативный ADR (adr-judge)"],
"preview-form": "none",
"defaults": ["конфиг 13 слоёв, консервативный ruleset"],
"key-decisions": ["допустимые направления зависимостей"],
"acceptance-criteria": ["0 нарушений границ слоёв"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "design-plugin",
"kind": "external",
"needs": ["дизайн-вопрос pre-code (критика / UX-копирайт / research synthesis)"],
"produces": ["дизайн-критика / UX-копирайт / research synthesis"],
"constraints": ["pre-code; a11y-принципы дизайн-уровня", "технический a11y SoT — Pa11y (#9)"],
"preview-form": "none",
"defaults": ["до написания кода"],
"key-decisions": ["критика, копирайт или synthesis"],
"acceptance-criteria": ["дизайн-замечания/копирайт учтены до кода"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "discovery-interview",
"kind": "own",
"needs": ["задача до проектирования: фича (интервью заказчика) или ориентация в системе"],
"produces": ["discovery-brief (FEATURE) или snapshot мета-слоя (SYSTEM)"],
"constraints": ["self-authored; FEATURE=JTBD-интервью человека, SYSTEM=ориентация по мета-слою", "ADR-009 граница с process-analysis (#53): человек vs код"],
"preview-form": "outline",
"defaults": ["FEATURE → discovery-brief в brainstorming; SYSTEM → snapshot в docs/discovery/"],
"key-decisions": ["режим FEATURE или SYSTEM"],
"acceptance-criteria": ["проблема/контекст вскрыты до проектирования"]
}
@@ -0,0 +1,12 @@
{
"skill": "eslint-prettier",
"kind": "external",
"needs": ["JS/Vue-код для линта+форматирования"],
"produces": ["исправленный/проверенный JS/Vue по ESLint+Prettier"],
"constraints": ["связка lint+format JS/Vue", "НЕ CSS (Stylelint)", "НЕ типы (vue-tsc)"],
"preview-form": "none",
"defaults": ["flat-config + plugin-vue; config-prettier разводит конфликты"],
"key-decisions": ["scope: staged-файлы vs весь js/vue"],
"acceptance-criteria": ["0 ESLint-ошибок, формат единообразен"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "figma-mcp",
"kind": "external",
"needs": ["Figma-файл с дизайн-токенами/компонентами"],
"produces": ["извлечённые дизайн-токены/компоненты/стили"],
"constraints": ["DEFERRED — нет Figma-аккаунта; источник — статический handoff Платона", "extract-only, code-gen за Frontend Design (#30)"],
"preview-form": "none",
"defaults": ["на поддерживаемом источнике: extract-only"],
"key-decisions": ["какие токены извлекать"],
"acceptance-criteria": ["токены извлечены из Figma-источника (когда доступен)"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "finance-plugin",
"kind": "external",
"needs": ["финансовая задача (сверка/variance/проводки/отчётность)"],
"produces": ["сверка / variance-анализ / проводки / финотчётность"],
"constraints": ["US-GAAP-ориентирован, частично применим РФ; SOX not-applicable", "РФ-налоги — за ru-tax-accounting (#63); ADR-012 граница C6/C7", "warehouse-MCP DEFERRED"],
"preview-form": "outline",
"defaults": ["reconciliation/variance применимы; US-GAAP-скилы с осторожностью"],
"key-decisions": ["применим ли скил для РФ-контекста"],
"acceptance-criteria": ["финансовая операция корректна, РФ-ограничения учтены"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "frontend-design",
"kind": "external",
"needs": ["UI-задача: компонент / паттерн / состояние / a11y-принцип"],
"produces": ["доменное решение UI/UX (компоненты, паттерны, a11y-принципы)"],
"constraints": ["доменная база UI для Vue+Vuetify; обязательный стек-фильтр R6.0", "paired со #19", "технический a11y — за Pa11y, не здесь"],
"preview-form": "mockup",
"defaults": ["срезать React/Tailwind/shadcn → Vue 3 + Vuetify 3; палитра Forest из Brandbook"],
"key-decisions": ["компонент/паттерн под задачу в рамках стека"],
"acceptance-criteria": ["решение в стеке Vue+Vuetify, бренд Forest соблюдён"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "github-mcp",
"kind": "external",
"needs": ["ссылка на repo/issue/PR", "намерение операции"],
"produces": ["результат чтения или записи issue/PR/комментария"],
"constraints": ["внешний MCP — операции через GitHub API", "НЕ локальный git-флоу (это git/PowerShell)"],
"preview-form": "none",
"defaults": ["read-first перед мутацией"],
"key-decisions": ["scope операции: чтение или запись"],
"acceptance-criteria": ["операция отражена в GitHub и подтверждена ответом API"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "gitleaks",
"kind": "external",
"needs": ["git diff или история репозитория"],
"produces": ["находки утечек секретов (ключи/токены/пароли/DSN)"],
"constraints": ["сканирует секреты в diff/истории через lefthook pre-commit/pre-push", "НЕ SAST-уязвимости кода (Semgrep)"],
"preview-form": "none",
"defaults": ["protect --staged на pre-commit; полная история на pre-push"],
"key-decisions": ["реальный секрет vs тестовая фикстура (false-positive)"],
"acceptance-criteria": ["0 утечек секретов в diff/истории"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "graphifyy",
"kind": "external",
"needs": ["структурный/cross-layer вопрос по проекту (docs+code)"],
"produces": ["ответ из knowledge-graph портала (узлы/рёбра/source_location)"],
"constraints": ["user-level CLI; backend GEMINI/GOOGLE key ИЛИ Claude subagent", "ADR-017: KG1 НЕ context7 #60 (внутренний vs внешний), KG2 НЕ Boost #10 (static vs runtime), KG3 НЕ openapi #47, KG4 НЕ Sentry #34, KG5 НЕ adr-kit/mermaid (auto vs manual)", "артефакты graphify-out*/ gitignored; только manual --update"],
"preview-form": "none",
"defaults": ["query/explain/path read-only; перед открытым codebase-вопросом сначала graphify"],
"key-decisions": ["структурный вопрос vs известный путь (Read/Grep)"],
"acceptance-criteria": ["структурный вопрос отвечен с source_location-цитатами"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "histoire",
"kind": "external",
"needs": ["Vue-компонент для каталога stories"],
"produces": ["визуальный каталог stories/variants"],
"constraints": ["каталог компонентов (не Storybook)", "Vuetify через setupFile"],
"preview-form": "sample",
"defaults": ["npm run story"],
"key-decisions": ["какие компоненты/variants в каталоге"],
"acceptance-criteria": ["stories собираются и рендерятся"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "hookify",
"kind": "external",
"needs": ["явный /hookify + поведение для предотвращения"],
"produces": ["сгенерированный Claude Code хук (PreToolUse/PostToolUse/Stop/...)"],
"constraints": ["только по явному /hookify", "HK1 pre-check коллизий с существующими хуками (ADR-010)"],
"preview-form": "outline",
"defaults": ["HK1 pre-check до генерации"],
"key-decisions": ["тип события хука и условие"],
"acceptance-criteria": ["хук генерируется без коллизий с существующей архитектурой"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "ide-helper",
"kind": "external",
"needs": ["Laravel-проект (facades/модели/хелперы)"],
"produces": ["IDE-заглушки (@mixin IdeHelper*) для autocomplete/type-inference"],
"constraints": ["генерация stubs для IDE", "НЕ влияет на рантайм"],
"preview-form": "none",
"defaults": ["ide-helper:generate + models -W -M -N"],
"key-decisions": ["когда перегенерировать (после изменения моделей)"],
"acceptance-criteria": ["autocomplete/type-inference покрывают facades+модели"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "jupyter-mcp",
"kind": "external",
"needs": ["Jupyter-ноутбук для исполнения"],
"produces": ["результат исполнения ячеек ноутбука"],
"constraints": ["DEFERRED — нет Python ML-окружения на native-Windows"],
"preview-form": "none",
"defaults": ["на поддерживаемой среде с Python ML"],
"key-decisions": ["какие ячейки исполнять"],
"acceptance-criteria": ["ноутбук исполнен, результаты получены (на поддерживаемой среде)"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "larastan",
"kind": "external",
"needs": ["PHP-код для статанализа типов"],
"produces": ["отчёт об ошибках типов/сигнатур/undefined-переменных"],
"constraints": ["типовой анализ PHPStan+Laravel", "НЕ стиль (Pint)", "НЕ граф слоёв (deptrac)"],
"preview-form": "none",
"defaults": ["уровень + baseline проекта"],
"key-decisions": ["новая ошибка vs baseline-долг"],
"acceptance-criteria": ["0 новых ошибок типов сверх baseline"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "laravel-backend-patterns",
"kind": "own",
"needs": ["backend-задача Лидерры (controller/service/job/RLS/деньги)"],
"produces": ["проектные backend-конвенции (слоистость, RLS-aware, bcmath, идемпотентность, partition-aware)"],
"constraints": ["self-authored справочник проектных конвенций", "ADR-013: BT5 НЕ architecture-patterns #38 (проектные vs generic), BT6 НЕ billing-audit #62"],
"preview-form": "outline",
"defaults": ["controller→service→job; RLS-aware; деньги через bcmath/LedgerService"],
"key-decisions": ["паттерн под слой задачи"],
"acceptance-criteria": ["backend-код следует конвенциям Лидерры"]
}
@@ -0,0 +1,12 @@
{
"skill": "lychee",
"kind": "external",
"needs": ["Markdown-файлы со ссылками"],
"produces": ["отчёт о битых URL и якорях"],
"constraints": ["внутренние + внешние ссылки и якоря .md", "НЕ стиль/орфография"],
"preview-form": "none",
"defaults": ["проверять и внутренние якоря, и внешние URL"],
"key-decisions": ["внешний временно недоступный vs реально битый — различать"],
"acceptance-criteria": ["0 битых ссылок/якорей"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "markdownlint",
"kind": "external",
"needs": ["Markdown-файлы для линта"],
"produces": ["отчёт о нарушениях стиля Markdown"],
"constraints": ["внешний CLI — стиль .md (заголовки/таблицы/пробелы/переносы)", "НЕ орфография (cspell)", "НЕ ссылки (lychee)"],
"preview-form": "none",
"defaults": ["авто-fix где возможно (--fix), кроме корневого CLAUDE.md"],
"key-decisions": ["scope: какие .md в проверке"],
"acceptance-criteria": ["0 нарушений стиля по правилам markdownlint"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "marketing-plugin",
"kind": "external",
"needs": ["маркетинговая задача (контент/кампания/SEO/email/бриф)"],
"produces": ["маркетинговый артефакт (контент/email-цепочка/SEO-аудит/бриф/отчёт)"],
"constraints": ["первичный resolver C1 (8 скилов)", "ADR-015: MKT3 решатель, материал — marketingskills #75; MKT2 НЕ product-management #42"],
"preview-form": "outline",
"defaults": ["скил под тип задачи C1"],
"key-decisions": ["какой маркетинг-скил под задачу"],
"acceptance-criteria": ["маркетинговый артефакт готов и таргетирован"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "marketing-ru",
"kind": "own",
"needs": ["маркетинговая задача для РФ-рынка (Директ/ВК/Telegram/лендинг/152-ФЗ)"],
"produces": ["РФ-маркетинг: каналы, конверсия лендинга, 152-ФЗ согласия"],
"constraints": ["self-authored; РФ-специфика (ADR-015 MKT9, 152-ФЗ cross-ref #71)", "НЕ generic marketing #74"],
"preview-form": "outline",
"defaults": ["РФ-каналы: Яндекс.Директ/ВК/Telegram; согласия по 152-ФЗ"],
"key-decisions": ["канал и РФ-ограничения"],
"acceptance-criteria": ["маркетинг учитывает РФ-каналы и 152-ФЗ"]
}
@@ -0,0 +1,12 @@
{
"skill": "marketingskills",
"kind": "external",
"needs": ["маркетинговая задача, требующая фреймворка (AIDA/PAS/CRO/...)"],
"produces": ["маркетинговые фреймворки как материал (40 шт)"],
"constraints": ["материал/резерв-библиотека, не решатель (ADR-015 MKT3)", "решатель — marketing #74"],
"preview-form": "none",
"defaults": ["материал отбирается, решение за marketing #74"],
"key-decisions": ["какой фреймворк под задачу"],
"acceptance-criteria": ["фреймворк отобран как материал для решателя"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "mermaid",
"kind": "external",
"needs": ["требование к диаграмме (C4 / flow / sequence / ...)"],
"produces": ["диаграмма в нотации Mermaid/C4"],
"constraints": ["вендоренный скил; диаграммы в docs/architecture/", "НЕ фиксация решения (adr-kit)"],
"preview-form": "diagram",
"defaults": ["C4: context/container/component"],
"key-decisions": ["тип и уровень диаграммы"],
"acceptance-criteria": ["диаграмма рендерится и отражает систему"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "n8n-mcp",
"kind": "external",
"needs": ["workflow для движка n8n"],
"produces": ["автоматизация процесса через n8n"],
"constraints": ["DEFERRED — n8n не в стеке; движок процессов = очередь Laravel", "принятие n8n — отдельное архитектурное решение"],
"preview-form": "none",
"defaults": ["на среде с n8n"],
"key-decisions": ["принятие n8n как движка — отдельный ADR"],
"acceptance-criteria": ["workflow исполняется в n8n (когда принят)"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "nightowl",
"kind": "external",
"needs": ["сквозная корреляция request/job/query трассировок"],
"produces": ["коррелированный runtime-трейс (self-hosted)"],
"constraints": ["DEFERRED — нет pcntl/posix на native-Windows; pending Б-1/Linux", "ADR-013 BT7 НЕ Sentry #34 (трейс vs ошибки), BT8 НЕ Pail/Boost"],
"preview-form": "none",
"defaults": ["на Linux-среде с pcntl/posix"],
"key-decisions": ["scope корреляции трассировок"],
"acceptance-criteria": ["request/job/query скоррелированы в трейс (на поддерживаемой среде)"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "normative-sync",
"kind": "own",
"needs": ["завершённая интеграция/ADR/brain-артефакт для синка нормативки"],
"produces": ["синхронизированные Pravila/PSR_v1/Tooling/CLAUDE.md (version bumps, §0 cross-refs, footer, §9)"],
"constraints": ["project-агент; звать после закрытия крупной off-phase интеграции/ADR (Pravila §2.4)", "парный с #85; не в Tooling-каноне счётчиков"],
"preview-form": "outline",
"defaults": ["синк 4 нормативных файлов с version bumps"],
"key-decisions": ["какие version bumps/cross-refs нужны"],
"acceptance-criteria": ["4 нормативных документа синхронны, cross-refs сходятся"]
}
@@ -0,0 +1,12 @@
{
"skill": "nuclei",
"kind": "external",
"needs": ["работающий хост для скана по шаблонам"],
"produces": ["находки известных уязвимостей (CVE/экспозиция/слабый TLS/misconfig)"],
"constraints": ["CLI bin/nuclei.exe; цель 127.0.0.1 не localhost", "ADR-014 IS2 НЕ ZAP #68 (широта vs глубина)"],
"preview-form": "none",
"defaults": ["низкий rate-limit для dev"],
"key-decisions": ["набор шаблонов"],
"acceptance-criteria": ["0 известных уязвимостей по шаблонам"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "openapi-mcp",
"kind": "external",
"needs": ["OpenAPI/REST-спецификация интеграции"],
"produces": ["эндпоинты/схемы/параметры как MCP-ресурсы (чтение)"],
"constraints": ["READ-ONLY интроспекция спеки", "НЕ генерация кода"],
"preview-form": "none",
"defaults": ["read-only через .mcp.json"],
"key-decisions": ["какой эндпоинт/схему смотреть"],
"acceptance-criteria": ["структура API понята из спеки"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "operations:process-doc",
"kind": "external",
"needs": ["as-is process description"],
"produces": ["structured process documentation"],
"constraints": ["marketplace skill — outputs doc only"],
"preview-form": "none",
"defaults": ["follow operations plugin process-doc template"],
"key-decisions": ["scope of the process being documented"],
"acceptance-criteria": ["doc covers all process steps and owners"],
"source": { "version": "1.2.0", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "operations",
"kind": "external",
"needs": ["задача по бизнес-процессу (документ/runbook/риск/capacity)"],
"produces": ["процессный артефакт (process-doc/runbook/risk/capacity/...)"],
"constraints": ["зонтик 9 скилов, 0 lifecycle-хуков", "process-doc → Mermaid-исходник рендерит mermaid (#37)", "НЕ as-is анализ из кода (process-analysis)"],
"preview-form": "outline",
"defaults": ["скил под тип артефакта"],
"key-decisions": ["какой из 9 скилов под задачу"],
"acceptance-criteria": ["процессный артефакт полон (шаги/владельцы)"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "owasp-zap",
"kind": "external",
"needs": ["работающий веб-портал для DAST"],
"produces": ["DAST-отчёт (инъекции/XSS/обход входа/IDOR)"],
"constraints": ["активное динамическое тестирование; цель 127.0.0.1", "ADR-014: IS1 НЕ Semgrep #25 (динамика vs статика), IS2 НЕ Nuclei #69 (глубина vs широта)"],
"preview-form": "none",
"defaults": ["цель 127.0.0.1, не localhost"],
"key-decisions": ["scope активного скана"],
"acceptance-criteria": ["DAST не нашёл критичных уязвимостей"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "pa11y",
"kind": "external",
"needs": ["отрендеренная веб-страница / URL"],
"produces": ["отчёт о нарушениях доступности WCAG 2.1 AA"],
"constraints": ["единственный технический SoT a11y в проекте", "НЕ через Lighthouse", "НЕ визуальный смок (Playwright)"],
"preview-form": "none",
"defaults": ["проверять контраст / alt / роли / фокус-порядок по WCAG 2.1 AA"],
"key-decisions": ["какие страницы/URL в a11y-прогоне"],
"acceptance-criteria": ["0 нарушений WCAG 2.1 AA на проверяемых страницах"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "pdn-152fz-audit",
"kind": "own",
"needs": ["задача аудита ПДн / 152-ФЗ"],
"produces": ["аудит ПДн: инвентаризация, согласия, маскирование, логи доступа, pd_subject_request"],
"constraints": ["self-authored; режим техника + закон", "ADR-014: IS4 НЕ pg_anonymizer #29 (аудит vs инструмент), IS5 НЕ D2 (техника vs юр.оформление)"],
"preview-form": "outline",
"defaults": ["инвентаризация ПДн в схеме/коде → проверка соответствия"],
"key-decisions": ["режим: техника или закон"],
"acceptance-criteria": ["ПДн инвентаризированы, соответствие 152-ФЗ проверено"]
}
@@ -0,0 +1,12 @@
{
"skill": "pest",
"kind": "external",
"needs": ["PHP-тесты (unit/feature/RLS)"],
"produces": ["результат прогона тестов (pass/fail/assertions)"],
"constraints": ["Pest 4: unit/feature/RLS/parallel/browser/stress/mutation", "НЕ Vue-тесты (Vitest)"],
"preview-form": "none",
"defaults": ["composer test; --parallel в CI"],
"key-decisions": ["scope: какие тесты, parallel vs serial"],
"acceptance-criteria": ["все тесты зелёные, без регрессий"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "pg-anonymizer",
"kind": "external",
"needs": ["дамп БД с персональными данными"],
"produces": ["маскированный дамп (телефоны/имена/email)"],
"constraints": ["загрузка по требованию LOAD 'anon' (не db-wide preload)", "на проде liderra.ru"],
"preview-form": "sample",
"defaults": ["маски по требованию для выгрузок"],
"key-decisions": ["какие поля маскировать"],
"acceptance-criteria": ["ПДн в выгрузке замаскированы"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "pg-audit",
"kind": "external",
"needs": ["DDL/DML/DCL операции БД"],
"produces": ["аудит-журнал операций на уровне БД"],
"constraints": ["pgaudit.log=ddl,role,write; log_parameter=off (ПДн не логируются)", "на проде liderra.ru; закрывает 152-ФЗ"],
"preview-form": "none",
"defaults": ["журнал в /var/log/postgresql"],
"key-decisions": ["scope логируемых операций"],
"acceptance-criteria": ["аудит-журнал БД ведётся, ПДн не в логах"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "pg-formatter",
"kind": "external",
"needs": ["SQL-файл для форматирования"],
"produces": ["отформатированный SQL (отступы/регистр/выравнивание)"],
"constraints": ["форматирование SQL по хуку на db/schema.sql", "НЕ линт опасных паттернов (squawk)"],
"preview-form": "none",
"defaults": ["стандарт pgFormatter"],
"key-decisions": ["scope: какой SQL форматировать"],
"acceptance-criteria": ["SQL приведён к стандарту pgFormatter"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "pg-partman",
"kind": "external",
"needs": ["расписание партиционирования таблиц"],
"produces": ["авто-создание/удаление partition-таблиц по расписанию"],
"constraints": ["dormant — недоступно на native-Windows PG", "заменён Artisan partitions:create-months"],
"preview-form": "none",
"defaults": ["на поддерживаемой среде — по расписанию; на dev заменён ручным cron'ом"],
"key-decisions": ["окно/гранулярность партиций"],
"acceptance-criteria": ["партиции созданы/удалены по расписанию (на поддерживаемой среде)"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "php-insights",
"kind": "external",
"needs": ["PHP-код для метрик качества"],
"produces": ["метрики: сложность, архитектура, code style score"],
"constraints": ["on-demand/CI, не блокирует; пороги 78/79/73", "ADR-013 BT4 НЕ Pint/Larastan; уникум — оси complexity+architecture"],
"preview-form": "none",
"defaults": ["composer insights; baseline-пороги"],
"key-decisions": ["какие оси/пороги важны"],
"acceptance-criteria": ["метрики не ниже baseline-порогов"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "pint",
"kind": "external",
"needs": ["PHP-код для форматирования"],
"produces": ["отформатированный PHP по PSR-12 + Laravel style"],
"constraints": ["только форматирование стиля", "НЕ статанализ типов (Larastan)"],
"preview-form": "none",
"defaults": ["применять Laravel preset"],
"key-decisions": ["scope: staged-файлы vs весь php"],
"acceptance-criteria": ["0 расхождений со стилем Pint"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "playwright-mcp",
"kind": "external",
"needs": ["URL или HTML-файл для управления", "намерение: скриншот / взаимодействие / сетевой трейс"],
"produces": ["скриншот / результат взаимодействия / снимок console+network"],
"constraints": ["внешний MCP — управляет headless-браузером", "НЕ a11y-проверка (это Pa11y)", "НЕ замена unit/e2e-тестам"],
"preview-form": "sample",
"defaults": ["read-first: снять снимок/состояние страницы до действия"],
"key-decisions": ["что проверяем: визуал, взаимодействие или сетевой трейс"],
"acceptance-criteria": ["ожидаемое состояние страницы подтверждено снимком/снапшотом"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "plugin-dev",
"kind": "external",
"needs": ["намерение разработать marketplace Claude-плагин"],
"produces": ["scaffold плагина (plugin.json, MCP, хуки, доки, публикация)"],
"constraints": ["8 sub-skills + 3 агента", "НЕ standalone-скилы (skill-creator)"],
"preview-form": "outline",
"defaults": ["plugin.json + структура компонентов"],
"key-decisions": ["состав компонентов плагина"],
"acceptance-criteria": ["плагин валиден и публикуем"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "postgres-mcp",
"kind": "external",
"needs": ["исторический SQL-запрос к dev-БД"],
"produces": ["результат SQL (исторически)"],
"constraints": ["historic — заменён Laravel Boost (#10); не используется"],
"preview-form": "none",
"defaults": ["заменён Boost #10"],
"key-decisions": ["использовать Boost #10 вместо этого узла"],
"acceptance-criteria": ["SQL-запросы идут через Boost #10, не через этот узел"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "postiz",
"kind": "external",
"needs": ["контент-календарь / план публикаций в соцсети"],
"produces": ["запланированные публикации в 30+ соцсетях (VK/Telegram)"],
"constraints": ["self-host AGPL-3.0 без дистрибуции (ADR-015 MKT7)", "покрывает VK-постинг"],
"preview-form": "outline",
"defaults": ["контент-календарь, self-host"],
"key-decisions": ["каналы и расписание публикаций"],
"acceptance-criteria": ["публикации запланированы по календарю"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "process-analysis",
"kind": "own",
"needs": ["as-is процесс для discovery из кода Laravel"],
"produces": ["реконструкция as-is процесса + узкие места"],
"constraints": ["self-authored project skill; discovery из app-кода (routes/controllers/jobs)", "ADR-009 граница с discovery-interview (#55): код vs человек", "НЕ моделирование to-be (process-modeling)"],
"preview-form": "outline",
"defaults": ["discovery из маршрутов/контроллеров/джобов/очередей"],
"key-decisions": ["scope процесса для реконструкции"],
"acceptance-criteria": ["as-is процесс восстановлен, узкие места выявлены"]
}
@@ -0,0 +1,11 @@
{
"skill": "process-modeling",
"kind": "own",
"needs": ["to-be бизнес-процесс для моделирования"],
"produces": ["BPMN 2.0 модель (swimlane/события/шлюзы) в docs/process/"],
"constraints": ["self-authored project skill; нотация BPMN", "НЕ as-is анализ из кода (process-analysis)", "рендер диаграмм — через свой вывод/mermaid"],
"preview-form": "diagram",
"defaults": ["BPMN 2.0; результаты в docs/process/"],
"key-decisions": ["границы и дорожки процесса"],
"acceptance-criteria": ["to-be модель покрывает поток управления и роли"]
}
@@ -0,0 +1,11 @@
{
"skill": "prod-deploy-validator",
"kind": "own",
"needs": ["намерение выката на боевой liderra.ru"],
"produces": ["вердикт GO/NO-GO + результаты 8 SSH pre-flight проверок"],
"constraints": ["project-агент; READ-ONLY по дизайну; звать перед любым выкатом (Pravila §2.4)", "парный с #84; не в Tooling-каноне"],
"preview-form": "outline",
"defaults": ["8 READ-ONLY SSH-проверок: конфиг/сервисы/БД/очереди"],
"key-decisions": ["go/no-go по результатам проверок"],
"acceptance-criteria": ["вердикт GO/NO-GO обоснован pre-flight проверками"]
}
@@ -0,0 +1,12 @@
{
"skill": "product-management",
"kind": "external",
"needs": ["продуктовая церемония (спека / роадмап / метрики)"],
"produces": ["спецификация / роадмап / анализ метрик / конкурентный бриф"],
"constraints": ["продуктовые церемонии (write-spec/roadmap/metrics)", "НЕ dev-issues (CCPM)"],
"preview-form": "outline",
"defaults": ["/write-spec, /roadmap-update, /metrics-review"],
"key-decisions": ["какая церемония под запрос"],
"acceptance-criteria": ["артефакт церемонии готов и обоснован"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "promptfoo",
"kind": "external",
"needs": ["LLM-промпт + тест-кейсы для eval"],
"produces": ["результат eval/регрессии промпта (ассерты/judge/red-team)"],
"constraints": ["только вручную/CI, никогда в хук (платные вызовы)", "НЕ SAST (Semgrep)"],
"preview-form": "none",
"defaults": ["запуск вручную или в CI"],
"key-decisions": ["метрики/ассерты eval"],
"acceptance-criteria": ["промпт прошёл регрессию/eval по критериям"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "rector",
"kind": "external",
"needs": ["PHP-код для авто-рефакторинга/version-upgrade"],
"produces": ["трансформированный PHP (upgrade/dead-code/modernization)"],
"constraints": ["вручную/CI, не блокирует коммит", "ADR-013: BT1 НЕ Pint (трансформация vs формат), BT2 комплементарен Larastan, BT3 НЕ deptrac"],
"preview-form": "dry-run",
"defaults": ["dry-run baseline; conservative ruleset"],
"key-decisions": ["какие правила трансформации"],
"acceptance-criteria": ["код трансформирован, тесты зелёные"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "redis-mcp",
"kind": "external",
"needs": ["вопрос о состоянии Redis/Memurai (ключи/очереди/TTL)"],
"produces": ["состояние Redis (чтение): ключи, очереди, TTL, паттерны"],
"constraints": ["READ-ONLY MCP к Redis/Memurai", "НЕ prod-ошибки (Sentry MCP)"],
"preview-form": "none",
"defaults": ["read-only инспекция кэша/очередей"],
"key-decisions": ["что инспектировать: кэш, очередь, race"],
"acceptance-criteria": ["состояние кэша/очереди/race локализовано"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "roave-security",
"kind": "external",
"needs": ["composer install/update"],
"produces": ["блок установки пакета с известным CVE"],
"constraints": ["conflict-список CVE на install/update", "НЕ SAST кода (Semgrep)"],
"preview-form": "none",
"defaults": ["срабатывает автоматически на composer"],
"key-decisions": ["нет ручного выбора — автоматический conflict-гейт"],
"acceptance-criteria": ["установка с известным CVE заблокирована"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "ru-tax-accounting",
"kind": "own",
"needs": ["вопрос по РСБУ/НК РФ (НДС/УСН/налоговая база/проводки)"],
"produces": ["РСБУ/налоговый контекст: расчёты, проводки ДТ/КТ, выгрузки бухгалтеру"],
"constraints": ["self-authored; закрывает РФ-gap finance-plugin (#61)", "ADR-012: НЕ billing-audit #62 (код), НЕ D1/D2 (право)"],
"preview-form": "outline",
"defaults": ["НДС/УСН по НК РФ; проводки по РСБУ"],
"key-decisions": ["налоговый режим и база"],
"acceptance-criteria": ["налоговый расчёт/проводка корректны по НК РФ/РСБУ"]
}
@@ -0,0 +1,11 @@
{
"skill": "security-go-live",
"kind": "own",
"needs": ["портал перед выходом в интернет (go/no-go)"],
"produces": ["вердикт GO/NO-GO + сводка проверок безопасности"],
"constraints": ["self-authored оркестратор #68-72 + D3", "ADR-014 IS7 НЕ audit-portal (только security+go-live vs полный 14-фазный аудит)"],
"preview-form": "outline",
"defaults": ["оркеструет ZAP/Nuclei/Ward/pdn-152fz/threat-model + Semgrep"],
"key-decisions": ["go/no-go порог"],
"acceptance-criteria": ["вердикт GO/NO-GO обоснован результатами проверок"]
}
@@ -0,0 +1,12 @@
{
"skill": "security-guidance",
"kind": "external",
"needs": ["правка файла с потенциально уязвимым паттерном"],
"produces": ["inline-предупреждение + блок правки (sys.exit 2)"],
"constraints": ["блокирующий PreToolUse-хук, speed-bump per файл+правило", "НЕ глубокий аудит (Trail of Bits)"],
"preview-form": "none",
"defaults": ["одноразовый блок, retry проходит"],
"key-decisions": ["реальная уязвимость vs false-positive"],
"acceptance-criteria": ["уязвимый паттерн замечен до коммита"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "semgrep",
"kind": "external",
"needs": ["PHP/JS/Vue-код для SAST"],
"produces": ["отчёт об уязвимостях кода (инъекции, небезопасная конфигурация, XSS)"],
"constraints": ["SAST бинарь + MCP", "НЕ секреты в diff (gitleaks)", "НЕ глубокий on-demand аудит (Trail of Bits)"],
"preview-form": "none",
"defaults": ["npm run sast"],
"key-decisions": ["scope скана; реальная уязвимость vs false-positive"],
"acceptance-criteria": ["0 уязвимостей высокого риска"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "sentry-mcp",
"kind": "external",
"needs": ["production runtime ошибка для диагностики"],
"produces": ["события/ошибки/трассировки из Sentry (чтение)"],
"constraints": ["READ-ONLY MCP к self-hosted Sentry", "pending активации Б-1", "НЕ Redis-состояние (Redis MCP)"],
"preview-form": "none",
"defaults": ["read-only диагностика"],
"key-decisions": ["какое событие/трассировку смотреть"],
"acceptance-criteria": ["причина prod-ошибки локализована по событию Sentry"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "skill-creator",
"kind": "external",
"needs": ["намерение создать standalone Claude-скил"],
"produces": ["scaffold SKILL.md + evals.json + references/"],
"constraints": ["конструктор скилов с eval-набором", "НЕ плагины (plugin-dev)", "НЕ хуки (hookify)"],
"preview-form": "outline",
"defaults": ["скил с eval-набором для проверки точности"],
"key-decisions": ["scope и триггеры скила"],
"acceptance-criteria": ["скил оформлен, eval проходит"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "squawk",
"kind": "external",
"needs": ["SQL-миграция PostgreSQL"],
"produces": ["отчёт об опасных паттернах миграции (блокировки, без CONCURRENTLY, ненадёжный DEFAULT)"],
"constraints": ["линт миграций в pre-commit для database/migrations", "НЕ форматирование (pgFormatter)"],
"preview-form": "none",
"defaults": ["прогон на staged миграциях"],
"key-decisions": ["блокирующая операция vs допустимая"],
"acceptance-criteria": ["0 опасных паттернов в миграции"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "stylelint",
"kind": "external",
"needs": ["CSS-код в .vue SFC или .css-файлах"],
"produces": ["отчёт о нарушениях стиля CSS"],
"constraints": ["CSS в .vue SFC + css-файлы", "НЕ JS/TS (ESLint)", "НЕ a11y (Pa11y)"],
"preview-form": "none",
"defaults": ["порядок свойств + именование по конфигу проекта"],
"key-decisions": ["scope: staged-файлы vs весь css"],
"acceptance-criteria": ["0 нарушений стиля CSS"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "superpowers",
"kind": "own",
"needs": ["задача разработки, требующая процесса (TDD/debug/plan/review/brainstorm/worktree)"],
"produces": ["дисциплинированный процесс: тест-первый, план, ревью, верификация"],
"constraints": ["мета-процесс (зонтик 14 sub-skills), не доменный решатель", "hard-floor источник (ADR-011)", "paired со #30 Frontend Design"],
"preview-form": "outline",
"defaults": ["skill инвоцируется ПЕРВЫМ для подходящей задачи"],
"key-decisions": ["какой sub-skill под задачу (tdd/debugging/writing-plans/brainstorming/...)"],
"acceptance-criteria": ["процесс-скил применён ДО реализации, дисциплина соблюдена"]
}
@@ -0,0 +1,12 @@
{
"skill": "telegram-mcp",
"kind": "external",
"needs": ["пост/действие в Telegram-канале"],
"produces": ["публикация/редактирование/аналитика Telegram-канала"],
"constraints": ["выделенный аккаунт через SESSION_STRING (только .env)", "ADR-015 MKT8"],
"preview-form": "none",
"defaults": ["выделенный аккаунт, SESSION_STRING в .env"],
"key-decisions": ["канал и контент поста"],
"acceptance-criteria": ["пост опубликован / аналитика получена"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "threat-model",
"kind": "own",
"needs": ["портал для моделирования угроз перед публикацией"],
"produces": ["STRIDE-модель: attack surface + приоритеты защиты"],
"constraints": ["self-authored; STRIDE going-public", "ADR-014 IS6 НЕ Trail of Bits #39 (портал+STRIDE vs generic deep-audit)"],
"preview-form": "outline",
"defaults": ["карта точек входа → приоритизация по STRIDE"],
"key-decisions": ["что защищать первым перед публикацией"],
"acceptance-criteria": ["attack surface картирован, защита приоритизирована"]
}
@@ -0,0 +1,12 @@
{
"skill": "trail-of-bits",
"kind": "external",
"needs": ["diff/код для глубокого security-аудита"],
"produces": ["глубокий аудит-отчёт (diff-review / supply-chain / variant / static)"],
"constraints": ["on-demand глубокий аудит (8 скилов)", "НЕ inline-блок (Security Guidance)", "НЕ быстрый SAST (Semgrep)"],
"preview-form": "outline",
"defaults": ["on-demand кампания, не в хуке"],
"key-decisions": ["какой аудит-скил под задачу"],
"acceptance-criteria": ["аудит покрыл diff/supply-chain/варианты"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "trivy",
"kind": "external",
"needs": ["Docker-образ для скана"],
"produces": ["отчёт о CVE в OS-пакетах и зависимостях образа"],
"constraints": ["скан Docker-образов в CI перед push в registry", "НЕ скан кода (Semgrep)"],
"preview-form": "none",
"defaults": ["trivy image перед push в Yandex Container Registry"],
"key-decisions": ["порог severity для блока"],
"acceptance-criteria": ["0 критичных CVE в образе"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "ui-ux-pro-max",
"kind": "external",
"needs": ["UI-задача, требующая материала (стиль / палитра / UX-гайд / график)"],
"produces": ["UI-материалы: стили, палитры, UX-гайдлайны, паттерны графиков"],
"constraints": ["материал, не решатель; только через PSR_v1 R14.3 pipeline", "не параллельно с Frontend Design (#30)"],
"preview-form": "none",
"defaults": ["активация только через R14.3 pipeline"],
"key-decisions": ["какой материал нужен под задачу"],
"acceptance-criteria": ["материал отобран, решение принимает Frontend Design"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "unisender-go-mcp",
"kind": "external",
"needs": ["массовая email-рассылка через Unisender Go"],
"produces": ["отправка маркетинговой email-рассылки"],
"constraints": ["DEFERRED — нет upstream MCP, нужна своя обёртка", "ADR-015 MKT5: маркетинговые рассылки НЕ транзакционный email; 152-ФЗ согласия cross-ref #77/#71"],
"preview-form": "none",
"defaults": ["при наличии обёртки"],
"key-decisions": ["сегмент и согласия рассылки"],
"acceptance-criteria": ["рассылка отправлена с соблюдением 152-ФЗ согласий (при наличии обёртки)"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "universal-icons-mcp",
"kind": "external",
"needs": ["потребность в SVG-иконке (не-Lucide коллекция)"],
"produces": ["SVG-иконка из коллекции (Material/Tabler/Phosphor/...)"],
"constraints": ["только не-Lucide коллекции (ADR-006: Lucide → lucide-vue-next)", "raw-SVG, не компонент"],
"preview-form": "sample",
"defaults": ["для Lucide использовать lucide-vue-next, не этот MCP"],
"key-decisions": ["коллекция и конкретная иконка"],
"acceptance-criteria": ["иконка вставлена из не-Lucide коллекции корректно"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "vitest",
"kind": "external",
"needs": ["Vue-компоненты/модули для unit/component-тестов"],
"produces": ["результат прогона Vitest (pass/fail)"],
"constraints": ["тесты Vue (jsdom, @vue/test-utils, Pinia)", "НЕ PHP-тесты (Pest)"],
"preview-form": "none",
"defaults": ["npm run test:vue"],
"key-decisions": ["scope тестов"],
"acceptance-criteria": ["все Vue-тесты зелёные"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "volar",
"kind": "external",
"needs": ["открытый .vue-файл в VSCode"],
"produces": ["IntelliSense / go-to-definition / hover / диагностика типов в редакторе"],
"constraints": ["VSCode-расширение (редактор-only)", "НЕ CI type-check (vue-tsc)"],
"preview-form": "none",
"defaults": ["работает в редакторе автоматически"],
"key-decisions": ["нет ручного выбора — редакторная служба"],
"acceptance-criteria": ["навигация/диагностика по .vue работают в редакторе"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "vue-tsc",
"kind": "external",
"needs": [".vue-компоненты для проверки типов"],
"produces": ["отчёт о несоответствиях типов в шаблонах/script"],
"constraints": ["полный type-check только в CI", "НЕ редакторная служба (Volar)"],
"preview-form": "none",
"defaults": ["прогон в CI"],
"key-decisions": ["scope проверки типов"],
"acceptance-criteria": ["0 ошибок типов vue-tsc"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "ward",
"kind": "external",
"needs": ["Laravel-проект (.env/config/cookie/secrets/deps)"],
"produces": ["аудит-отчёт безопасности настроек Laravel"],
"constraints": ["Go CLI bin/ward.exe; заменил Enlightn (abandoned)", "ADR-014 IS3 НЕ Larastan #12/Semgrep #25"],
"preview-form": "none",
"defaults": ["скан .env/config/заголовков/secrets"],
"key-decisions": ["какие настройки критичны"],
"acceptance-criteria": ["настройки Laravel безопасны (нет High-находок)"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,11 @@
{
"skill": "writing-plans",
"kind": "own",
"needs": ["spec or requirements", "file structure decisions"],
"produces": ["implementation-plan with bite-sized TDD tasks"],
"constraints": ["only writes the plan file", "no code, no reads beyond plan authoring"],
"preview-form": "outline",
"defaults": ["one action per step (2-5 min)", "test->RED->code->GREEN->commit"],
"key-decisions": ["file structure / decomposition", "task granularity"],
"acceptance-criteria": ["every step has concrete content (no placeholders)", "types consistent across tasks"]
}

Some files were not shown because too many files have changed in this diff Show More