diff --git a/tests/runner-e2e/catalog.test.ts b/tests/runner-e2e/catalog.test.ts index fb20579bff..4060ea010e 100644 --- a/tests/runner-e2e/catalog.test.ts +++ b/tests/runner-e2e/catalog.test.ts @@ -209,6 +209,15 @@ describe("runner E2E catalog", () => { }); expect(task!.buildPrompt("nonce")).toContain("request_confirmation"); expect(task!.buildPrompt("nonce")).toContain("baseRevisionId"); + expect(task!.buildPrompt("nonce")).toContain( + "do not spell, quote, repeat, announce, or include PAPERCLIP_E2E_PLAN_DONE_nonce", + ); + expect(task!.buildPrompt("nonce")).toContain( + "paperclip_finish with PAPERCLIP_E2E_PLAN_DONE_nonce as its complete summary", + ); + expect(task!.buildPrompt("nonce")).toContain( + "one atomic issue PATCH with status `done` and that exact comment", + ); expect(task!.buildRevisionRequest?.("nonce")).toContain("baseRevisionId"); }); diff --git a/tests/runner-e2e/catalog.ts b/tests/runner-e2e/catalog.ts index 11b126ddee..7be157ffde 100644 --- a/tests/runner-e2e/catalog.ts +++ b/tests/runner-e2e/catalog.ts @@ -444,11 +444,12 @@ export const runnerTasks: readonly RunnerTaskFixture[] = [ "First, create a small canonical Plan with exactly two numbered steps and request approval; do not implement it.", `The initial Plan body must contain PAPERCLIP_E2E_PLAN_DRAFT_${nonce}.`, "If the plan is sent back, revise that same Plan document according to the revision note, publish a new revision-bound confirmation, and still do not implement.", + `Before the revised Plan is accepted, do not spell, quote, repeat, announce, or include PAPERCLIP_E2E_PLAN_DONE_${nonce} in any visible response, comment, or tool payload; refer to it only as “the terminal marker.”`, "Only after the revised plan is accepted, implement it by posting one final visible task-thread response containing exactly " + `PAPERCLIP_E2E_PLAN_DONE_${nonce}` + " and mark the task Done.", - "For a native runner, remain in the requested planning collaboration mode. Call write_document for key `plan`, then call request_human_input exactly once with interactionKind `confirmation`, targetRevisionId set to the returned latest Plan revision, and continuationPolicy `wake_assignee`. Do not call paperclip_finish while waiting for either Plan confirmation.", - "For a legacy runner, use the public Paperclip API. The first PUT of the `plan` issue document creates it. For every later PUT, first GET the current document and set `baseRevisionId` to its `latestRevisionId`; a 409 means you must GET again and retry with the new latest revision. Create a `request_confirmation` targeting the successful PUT response's `latestRevisionId` with `continuationPolicy: wake_assignee`, and move the issue to `in_review` while waiting.", + `For a native runner, remain in the requested planning collaboration mode. Call write_document for key \`plan\`, then call request_human_input exactly once with interactionKind \`confirmation\`, targetRevisionId set to the returned latest Plan revision, and continuationPolicy \`wake_assignee\`. Do not call paperclip_finish while waiting for either Plan confirmation. After the revised Plan is accepted, first call paperclip_finish with PAPERCLIP_E2E_PLAN_DONE_${nonce} as its complete summary, then emit exactly that marker as the complete final response and do not call another tool.`, + `For a legacy runner, use the public Paperclip API. The first PUT of the \`plan\` issue document creates it. For every later PUT, first GET the current document and set \`baseRevisionId\` to its \`latestRevisionId\`; a 409 means you must GET again and retry with the new latest revision. Create a \`request_confirmation\` targeting the successful PUT response's \`latestRevisionId\` with \`continuationPolicy: wake_assignee\`, and move the issue to \`in_review\` while waiting. After the revised Plan is accepted, write PAPERCLIP_E2E_PLAN_DONE_${nonce} exactly once through one atomic issue PATCH with status \`done\` and that exact comment; do not POST a separate comment or perform a second write.`, "Do not create files, child tasks, or unrelated work, and do not expose credentials.", ].join("\n"), buildMatchers(nonce, execution) {