35 lines
2.1 KiB
JavaScript
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();
|