diff --git a/tests/runner-e2e/catalog.test.ts b/tests/runner-e2e/catalog.test.ts index 7c4e5620d7..dd87dd3494 100644 --- a/tests/runner-e2e/catalog.test.ts +++ b/tests/runner-e2e/catalog.test.ts @@ -206,6 +206,12 @@ describe("runner E2E catalog", () => { expect(breadthHello).toContain( "Do not emit any assistant text, acknowledgement, or preamble before calling it", ); + + const nativeAsk = ask?.buildPrompt("nonce"); + expect(nativeAsk).toContain("paperclip_finish must be your only tool call"); + expect(nativeAsk).toContain( + "never call report_progress or any other tool before or after it", + ); }); it("uses only declared secret references in generated payloads", () => { diff --git a/tests/runner-e2e/catalog.ts b/tests/runner-e2e/catalog.ts index 28c34e99c8..4752beab55 100644 --- a/tests/runner-e2e/catalog.ts +++ b/tests/runner-e2e/catalog.ts @@ -512,7 +512,7 @@ export const runnerTasks: readonly RunnerTaskFixture[] = [ `Your final visible task-thread answer must be exactly this complete marker, including its final suffix: E2E_ASK_12_${nonce}.`, "Do not create or modify files, do not create a plan or additional work, and do not expose credentials.", "After posting the direct answer, mark this task Done.", - `In a native runner, call paperclip_finish exactly once with {reportedWorkDisposition:"done",summary:"E2E_ASK_12_${nonce}",completionClaim:{contractRevision:"1",objectiveSatisfied:true,criteria:[{criterionId:"objective",status:"satisfied",evidenceRefs:[]}],remainingWork:[]},evidence:[],verification:[]}. Wait for that tool call to succeed, then emit exactly E2E_ASK_12_${nonce} as the complete final response. Do not write a user-facing final response before paperclip_finish succeeds, and do not call another tool.`, + `In a native runner, call paperclip_finish exactly once with {reportedWorkDisposition:"done",summary:"E2E_ASK_12_${nonce}",completionClaim:{contractRevision:"1",objectiveSatisfied:true,criteria:[{criterionId:"objective",status:"satisfied",evidenceRefs:[]}],remainingWork:[]},evidence:[],verification:[]}. For the entire run, paperclip_finish must be your only tool call: never call report_progress or any other tool before or after it. Wait for that tool call to succeed, then emit exactly E2E_ASK_12_${nonce} as the complete final response. Do not write a user-facing final response before paperclip_finish succeeds.`, `In a legacy runner, post exactly E2E_ASK_12_${nonce} as the task comment body and mark the task Done through the public API.`, ].join("\n"), buildMatchers(nonce, execution) { diff --git a/tests/runner-e2e/runner.spec.ts b/tests/runner-e2e/runner.spec.ts index d85ca19939..298108d0e0 100644 --- a/tests/runner-e2e/runner.spec.ts +++ b/tests/runner-e2e/runner.spec.ts @@ -1026,7 +1026,11 @@ for (const execution of executions) { }); await page.goto( `/${encodeURIComponent(issuePrefix)}/issues/${encodeURIComponent(issue.identifier ?? issue.id)}`, - { waitUntil: "domcontentloaded" }, + // A restarted Vite dev server may keep loading its fresh module + // graph after the task UI is already usable. Bind navigation only + // to the committed canonical route, then let the explicit UI and + // API assertions below prove readiness and preserved state. + { waitUntil: "commit" }, ); await expect( page