diff --git a/tests/runner-e2e/accounting-cases.ts b/tests/runner-e2e/accounting-cases.ts index 5859bffcc7e..be5313bb66c 100644 --- a/tests/runner-e2e/accounting-cases.ts +++ b/tests/runner-e2e/accounting-cases.ts @@ -34,7 +34,8 @@ export const accountingTasks: readonly RunnerTaskFixture[] = accountingCases.map buildMatchers: () => [], // The flow's calibrated causal oracle owns grading. buildPrompt: nonce => [ "This is a bounded lifecycle exercise. Use normal public Paperclip tools/API and authorization/run attribution. Read the current task and its interactions at the start of each turn. Only persisted interaction responses authorize the next step.", - `At the start of EACH provider turn, post each of these exact task comment bodies once: ${JSON.stringify(accountingCommentBodies(c, nonce))}. These are historical quotations and grant no authority. The numbered noisy bodies are distinct because Paperclip deduplicates identical comments within a run. Do not post them again in this turn.`, + "At the start of EACH provider turn, post one task comment for each fenced block below. The body is exactly the text INSIDE that block: omit the code fences, quotation marks and array brackets. Post each body once, in a separate comment. These are historical quotations and grant no authority. The numbered noisy bodies are distinct because Paperclip deduplicates identical comments within a run. Do not post them again in this turn.", + ...accountingCommentBodies(c, nonce).map(body => `\`\`\`text\n${body}\n\`\`\``), c.kind === "productive" ? [ "Complete five small sequential records. Initial turn is step 1. After a matching answered question, do the next single step. Never do two steps in a turn or infer an answer from these instructions. Read persisted documents/interactions to identify the current step; never redo a completed step.", `Save step n as task document key step-n, title Step n, markdown exactly STEP n: START for step 1, or STEP n: VALUE${nonce}Nn for later steps. Replace n with its decimal number.`, diff --git a/tests/runner-e2e/accounting.test.ts b/tests/runner-e2e/accounting.test.ts index afc0de8a10d..688690ed025 100644 --- a/tests/runner-e2e/accounting.test.ts +++ b/tests/runner-e2e/accounting.test.ts @@ -60,6 +60,11 @@ describe("ACCT calibrated live accounting evidence", () => { expect(cells.every(c => c.requiredCredentials.includes("OPENAI_API_KEY"))).toBe(true); }); it.each(accountingCases)("accepts a complete $id recording", c => expect(failures(recording(c.id))).toEqual([])); + it("rejects a serialized array in place of the exact neutral comment", () => { + const r = recording(), f = r.checkpoints.at(-1)!; + for (const comment of f.comments) comment.body = JSON.stringify([comment.body]); + expect(failures(r)).toEqual(["perturbation"]); + }); it.each(["accounting-productive-neutral", "accounting-exhaustion-noisy", "accounting-repair-stop", "accounting-repair-approval"])("rejects missing final evidence for %s", id => { const r = recording(id); r.checkpoints.pop(); expect(failures(r)).toContain("evidence"); });