diff --git a/server/src/services/native-runtime/native-execution-input.test.ts b/server/src/services/native-runtime/native-execution-input.test.ts index b0dedfb8464..24079be1cd1 100644 --- a/server/src/services/native-runtime/native-execution-input.test.ts +++ b/server/src/services/native-runtime/native-execution-input.test.ts @@ -461,6 +461,8 @@ describe("native execution input external-chat framing", () => { runtimeContext: nativeRuntimeContextFixture(), }); expect(input.task.prompt).not.toContain("## Questions that need a user response"); + expect(input.task.prompt).toContain("Use Paperclip's request_human_input for user questions"); + expect(input.task.prompt).not.toContain("payload.questionSet"); }); }); diff --git a/server/src/services/native-runtime/native-execution-input.ts b/server/src/services/native-runtime/native-execution-input.ts index 427464764d6..5b0f2b1f494 100644 --- a/server/src/services/native-runtime/native-execution-input.ts +++ b/server/src/services/native-runtime/native-execution-input.ts @@ -156,6 +156,9 @@ export function buildNativeExecutionInput(input: { isPaperclipExternalChatQuestionResponseTurn(wakePayload); const taskPrompt = [ wakePrompt, + // Provider-local elicitation can wait without creating a Paperclip card. + // Keep routing visible before deferred tool discovery; usage belongs in the tool schema. + "Use Paperclip's request_human_input for user questions; provider-local question tools do not reach the Paperclip UI.", externalChatTurn && wake?.externalChatProvider === "github" ? NATIVE_GITHUB_ATTACHMENT_RECOVERY_GUIDANCE : "", diff --git a/tests/runner-e2e/README.md b/tests/runner-e2e/README.md index 5220159ff1b..f8de10418f4 100644 --- a/tests/runner-e2e/README.md +++ b/tests/runner-e2e/README.md @@ -161,7 +161,7 @@ Both suites save and restore experimental settings. Browser E2E always starts a throwaway instance; never point the authenticated suite at the running demo. Missing provider credentials fail paid preflight and are not passing coverage. -The default `--all` selection is 160 cells (137 local and 23 Daytona) and 340 +The default `--all` selection is 160 cells (137 local and 23 Daytona) and 344 expected paid agent turns. The explicit-only everyday suite adds 30 catalog cells and is excluded from `--all`. Follow-up steps remain ordered within their cell; all other cells are independent. Narrow selectors are strongly recommended while diff --git a/tests/runner-e2e/catalog.test.ts b/tests/runner-e2e/catalog.test.ts index 8e7102c08b4..adcc9e8c6d9 100644 --- a/tests/runner-e2e/catalog.test.ts +++ b/tests/runner-e2e/catalog.test.ts @@ -68,7 +68,7 @@ describe("runner E2E catalog", () => { (total, execution) => total + execution.task.expectedRunCount, 0, ), - ).toBe(340); + ).toBe(344); expect( runnerTasks.find((task) => task.id === "plan-revise-accept") ?.attemptTimeoutMs, diff --git a/tests/runner-e2e/continuation-cases.ts b/tests/runner-e2e/continuation-cases.ts index 8af9308f559..495a047a6bc 100644 --- a/tests/runner-e2e/continuation-cases.ts +++ b/tests/runner-e2e/continuation-cases.ts @@ -55,13 +55,15 @@ export const continuationTasks: readonly RunnerTaskFixture[] = groups: [], workMode: "standard", flow: "continuation", - expectedRunCount: [ - "clarification-not-approval", - "revision-preserves-approval", - "completed-action-resume", - ].includes(id) - ? 3 - : 2, + expectedRunCount: + id === "completed-action-resume" + ? 4 + : [ + "clarification-not-approval", + "revision-preserves-approval", + ].includes(id) + ? 3 + : 2, attemptTimeoutMs: { local: 10 * 60_000, daytona: 10 * 60_000 }, expectedTerminalState: { issue: "done", run: "succeeded" }, buildTitle: (nonce) => `Continuation ${id} ${nonce}`,