mirror of
https://github.com/wassname/pi-plan.git
synced 2026-08-11 11:23:31 +08:00
Re-running verify was fine for 'npm test' but a footgun for ML workflows where verify may be a 10-hour training run -- and bash made 'read-only' nominal anyway (it could mutate). The agent now runs verify itself and saves the output as evidence. The judge checks, in order: anything here / quoted+attributed / provenance / quotes match disk / substance. Matches the cooperative-but- confused threat model: reading real artifacts catches confusion; execution only defended against deliberate forgery, which is out of scope. Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
34 lines
1.5 KiB
TypeScript
34 lines
1.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { buildJudgeArgs } from "../src/index.js";
|
|
|
|
describe("buildJudgeArgs", () => {
|
|
it("omits --model when judgeModel is null (pi uses its configured default; never a pre-emptive 'no model' failure)", () => {
|
|
const args = buildJudgeArgs(null);
|
|
expect(args).not.toContain("--model");
|
|
// an empty --model "" would make every sign-off silently inconclusive -- guard against it
|
|
const i = args.indexOf("--model");
|
|
expect(i).toBe(-1);
|
|
});
|
|
|
|
it("includes --model <ref> when an explicit/session model is set", () => {
|
|
const args = buildJudgeArgs("openrouter/~anthropic/claude-haiku-latest");
|
|
const i = args.indexOf("--model");
|
|
expect(i).not.toBe(-1);
|
|
expect(args[i + 1]).toBe("openrouter/~anthropic/claude-haiku-latest");
|
|
});
|
|
|
|
it("always sets --no-session, --no-extensions, the read-only tool allowlist, and edit/write exclusion", () => {
|
|
for (const m of [null, "some/model"]) {
|
|
const args = buildJudgeArgs(m);
|
|
expect(args).toContain("--no-session");
|
|
expect(args).toContain("--no-extensions"); // a broken global extension must not take down sign-offs
|
|
expect(args).toContain("--tools");
|
|
expect(args.some((a) => a.startsWith("read,grep,find,ls"))).toBe(true);
|
|
// no bash: the judge must never be able to execute (or re-run a 10-hour verify) or mutate
|
|
expect(args.some((a) => a.includes("bash"))).toBe(false);
|
|
expect(args).toContain("--exclude-tools");
|
|
expect(args.some((a) => a.includes("edit") && a.includes("write"))).toBe(true);
|
|
}
|
|
});
|
|
});
|