Commit Graph

1951 Commits

Author SHA1 Message Date
Дмитрий 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