Files
portal/tools/post-seal.mjs
T

47 lines
2.6 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
/**
* post-seal (фикс дедлока) — печать плана в PostToolUse наставника. Берёт СВЕЖИЙ вердикт
* наставника (для текущего плана) + сохранённый судьёй GO (judge-go) → binding нах.F4 сходится,
* stale-вердикт исчезает. Переиспользует sealOnWiredGo (плановую ветку). Все I/O инъектируемы.
*/
import { sealOnWiredGo } from './enforce-judge-gate.mjs';
import { loadJudgeGo, judgeGoValidFor } from './judge-go-store.mjs';
import { freezeGate } from './freeze-gate.mjs';
import { sealPlan } from './seal-orchestration.mjs';
import { loadFrozenArtifact, saveFrozenPlan } from './plan-lock.mjs';
import { parseVerifiedContext } from './plan-verified-context.mjs';
import { artifactHasUnresolvedExtracted } from './context-verity.mjs';
import fsDefault from 'node:fs';
import { resolve as pathResolve } from 'node:path';
/**
* Запечатать план по свежему вердикту наставника + сохранённому GO судьи.
* Нет валидного GO (нет файла / чужой plan_hash / битая подпись) → {sealed:false, reason}.
* Иначе — sealOnWiredGo с freeze-gate на СВЕЖЕМ вердикте (mentorVerdict).
*/
export function postSealPlan({ event, mentorVerdict, planHash, sessionId, runtimeDir, repoRoot, key, deps = {} }) {
const judgeGo = (deps.loadJudgeGo || loadJudgeGo)({ sessionId, runtimeDir });
if (!judgeGoValidFor(judgeGo, { planHash, key })) {
return { sealed: false, reason: 'нет валидного GO судьи для этого плана (binding/подпись)' };
}
const fsImpl = deps.fsImpl || fsDefault;
return (deps.sealOnWiredGo || sealOnWiredGo)({
event,
verdict: { wired: true, decision: 'GO', judged_hash: judgeGo.judged_hash },
judgeMode: judgeGo.judge_mode,
deps: {
key,
sealPlan: deps.sealPlan || sealPlan,
loadCurrentArtifact: deps.loadCurrentArtifact || (() => loadFrozenArtifact({ sessionId, runtimeDir })),
persistPlan: deps.persistPlan || ((seal) => saveFrozenPlan({ plan: seal, sessionId, runtimeDir })),
mentorGate: deps.mentorGate || (({ content }) => freezeGate({
mentorVerdict,
mentorWired: true,
planHash,
verifiedContextArtifact: parseVerifiedContext(content),
hasUnresolvedExtractedImpl: (art) => artifactHasUnresolvedExtracted(art, (f) => fsImpl.readFileSync(pathResolve(repoRoot, f), 'utf8')),
})),
},
});
}