// Standalone runner for auditor fixtures. Invoke: // // bun run auditor/fixtures/cli.ts hybrid_38_40_45 // // Prints human-readable per-layer breakdown + JSON result so the // output can be captured by the dynamic check without re-running. import { runHybridFixture, type FixtureResult } from "./hybrid_38_40_45.ts"; const fixtureArg = process.argv[2] ?? "hybrid_38_40_45"; let result: FixtureResult; switch (fixtureArg) { case "hybrid_38_40_45": result = await runHybridFixture(); break; default: console.error(`unknown fixture: ${fixtureArg}`); process.exit(2); } // Human-readable summary console.error(""); // blank line to stderr so stdout JSON stays clean console.error(`─── Fixture: ${result.fixture} ───`); console.error(` overall: ${result.overall.toUpperCase()}`); console.error(` shipped: [${result.shipped_phases.join(", ") || "—"}]`); console.error(` placeholder: [${result.placeholder_phases.join(", ") || "—"}]`); console.error(""); for (const l of result.layers) { const mark = l.ok ? "✓" : "✗"; const phaseStr = `Phase ${l.phase}`.padEnd(11); console.error(` ${mark} ${phaseStr} ${l.layer.padEnd(30)} ${String(l.latency_ms).padStart(6)}ms`); if (l.ok) { console.error(` ${l.evidence.slice(0, 200)}`); } else { console.error(` ERROR: ${l.error?.slice(0, 240) ?? "unknown"}`); } } console.error(""); for (const n of result.notes) console.error(` note: ${n}`); console.error(""); // Machine-readable output on stdout. console.log(JSON.stringify(result, null, 2)); // Exit code reflects overall: 0 pass, 2 partial, 1 fail. // Dynamic check reads this AND the JSON; partial-pass is treated // as informative (some layers shipped), not blocking on its own. process.exit(result.overall === "pass" ? 0 : result.overall === "partial_pass" ? 2 : 1);