diff --git a/tests/runner-e2e/PRODUCT-JOURNEYS.md b/tests/runner-e2e/PRODUCT-JOURNEYS.md index 7b6ce0f9708..e90f4723ddf 100644 --- a/tests/runner-e2e/PRODUCT-JOURNEYS.md +++ b/tests/runner-e2e/PRODUCT-JOURNEYS.md @@ -40,11 +40,15 @@ journey without another setup. A recipe reports `startingState: recipe`; reusing successful onboarding reports `onboarding`. Preconfigured state is never counted as onboarding coverage. -The scripted onboarding request orders the child's work: create the files, -publish the proof file, save its document with the returned file link, then -report completion. It explains the native completion contract: include actual -verification, omit the optional schema, and use receipt-derived deliverable -references in evidence and file artifacts. Local input paths are verification +The scripted onboarding request supplies a self-contained child brief. The +parent must copy the full marked brief verbatim into `create_task.description`, +including tool names, parameters, and the encoded input. It orders the child's +work: create the files, publish `connection-proof.json` with that exact filename +and workspace-relative content reference, save its Paperclip task document with +the returned file link, then report completion. A Markdown workspace note does +not replace the task document. It explains the native completion contract: +include actual verification, omit the optional schema, and use receipt-derived +deliverable references in evidence and file artifacts. Local input paths are verification details. Correcting rejected tool arguments stays within the same attempt; it does not retry the journey. The model still computes the result, publishes the file, saves the document, and completes the tasks. Independent download, diff --git a/tests/runner-e2e/product-journeys/onboarding-first-task.ts b/tests/runner-e2e/product-journeys/onboarding-first-task.ts index ebc379c171b..0b394720daf 100644 --- a/tests/runner-e2e/product-journeys/onboarding-first-task.ts +++ b/tests/runner-e2e/product-journeys/onboarding-first-task.ts @@ -176,17 +176,23 @@ export async function onboardingFirstTask(input: OnboardingFirstTaskInput): Prom // Persist the exact intended child before the opening reply can dispatch any model work. await input.own({ kind: "issue", name: title }); await page.getByRole("radio", { name: option.label }).last().click({ timeout: remaining() }); - await page.getByTestId("question-other-answer-composer").last().locator('[contenteditable="true"],textarea').first().fill([ - `I have one task in mind. Propose exactly one child task named "${title}" and wait for my approval before creating it or doing its work.`, - "After approval, assign it to yourself and let its own Paperclip execution produce the result. Then verify and link its saved document and downloadable file in this onboarding conversation and complete both tasks.", - "The child's approved scope, in this order:", + const childBrief = [ + "Complete this child's approved scope in this order:", "1. Decode the following base64 into connection-input.json in its workspace, using actual tools.", `Exact input bytes: ${Buffer.from(proof.input).toString("base64")}`, '2. Write connection-proof.json containing exactly {"nonce":string,"count":number,"total":number,"sha256":string}. Copy nonce, count the input values, sum them, and compute sha256 of the exact input bytes including the final newline.', - "3. Publish connection-proof.json on that child using register_deliverable with workspace-relative contentRef and correct byteSize and SHA-256.", - "4. Use write_document to save a connection-proof document on the child including the filename connection-proof.json, input nonce, result, and the file link returned by register_deliverable.", + '3. Publish connection-proof.json on this child using register_deliverable with filename "connection-proof.json", workspace-relative contentRef "connection-proof.json", and correct byteSize and SHA-256 for that file.', + "4. Use write_document to save a connection-proof document on this child including the filename connection-proof.json, input nonce, result, and the file link returned by register_deliverable. A Markdown workspace note is not a Paperclip task document and does not replace this step.", "5. Report completion with paperclip_finish using the current completion contract. Include verification for checks actually run and omit optional schema. Use deliverable: from register_deliverable in evidence and any file artifacts. Keep local input paths in verification details, not completion evidence or artifacts. Correct rejected arguments using the tool feedback and retry before declaring a blocker.", "Do not hire agents, create additional tasks, or access credentials or unrelated files.", + ].join("\n"); + await page.getByTestId("question-other-answer-composer").last().locator('[contenteditable="true"],textarea').first().fill([ + `I have one task in mind. Propose exactly one child task named "${title}" and wait for my approval before creating it or doing its work.`, + "After approval, assign it to yourself and let its own Paperclip execution produce the result. Then verify and link its saved document and downloadable file in this onboarding conversation and complete both tasks.", + "When you create the child, copy the entire brief between BEGIN CHILD BRIEF and END CHILD BRIEF VERBATIM into create_task.description. Preserve every step, tool name, parameter instruction, and exact encoded input. Do not summarize or paraphrase it.", + "BEGIN CHILD BRIEF", + childBrief, + "END CHILD BRIEF", ].join("\n"), { timeout: remaining() }); await page.getByRole("button", { name: opening[0]!.payload.submitLabel ?? "Continue", exact: true }).last().click({ timeout: remaining() });