Files
portal/tools/enforce-judge-gate.mjs
T

35 lines
2.1 KiB
JavaScript

#!/usr/bin/env node
/**
* enforce-judge-gate — тонкая хук-обёртка судьи (Машина 4). НЕ движок: движок —
* judge-orchestrator + judge-engine + пол судьи (4-A..4-F). Обёртка ИНЕРТНА, пока
* владелец не включит судью (флаг + ключ + регистрация в settings.json — шаг владельца).
* Даже включённая, по D28 «сперва тихо» она НЕ блокирует — лишь помечает теневое решение;
* живой блокирующий режим подключается отдельным шагом владельца. $0 пока выключен.
*
* Регистрировать в settings.json нужно ИМЕННО эту обёртку (не движок) — у движка нет
* рубильника $0; обёртка гейтит расход флагом+ключом (паттерн llm-judge v4).
*/
import { readStdin, parseEventJson, exitDecision } from './enforce-hook-helpers.mjs';
import { judgeActive } from './judge-gate-config.mjs';
/** Чистое решение обёртки. Никогда не блокирует на этом этапе (D28 тихий режим). */
export function decide({ active }) {
if (!active) return { block: false, reason: 'judge disabled ($0) — рубильник владельца выключен' };
return { block: false, reason: 'shadow (D28) — живой блок подключается шагом владельца (live wiring)' };
}
async function main() {
try {
parseEventJson(await readStdin()); // событие читаем, но пока не используем (тихий режим)
const active = judgeActive();
const r = decide({ active });
exitDecision({ block: r.block });
} catch {
exitDecision({ block: false }); // fail-open пока инертна; живой режим будет fail-closed
}
}
import { fileURLToPath } from 'node:url';
const isCli = process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1];
if (isCli) main();