{"record":{"id":"6e71aab2e3425dc3","repo":"paperclipai/paperclip","slug":"runnerd-native-runtime-requests-require-a-canonica","errorCode":null,"errorMessage":"runnerd-native runtime requests require a canonical question response","messagePattern":"runnerd-native runtime requests require a canonical question response","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/runnerd-codex-transport.ts","lineNumber":3734,"sourceCode":"      throw failure;\n    }\n  }\n\n  async resolveRuntimeRequest(input: {\n    requestId: string;\n    turnId: string;\n    resolution: HarnessRuntimeRequestResolution;\n  }): Promise<void> {\n    if (this.#pendingWarmRecoveryCompletion !== null) {\n      throw new Error(\"native_runner_warm_transition_completion_pending\");\n    }\n    const pending = this.#bridgedRuntimeInputs.get(input.requestId);\n    if (!pending)\n      throw new Error(\n        `PRP runtime request ${input.requestId} is no longer pending`,\n      );\n    if (!(\"response\" in input.resolution)) {\n      throw new Error(\n        \"runnerd-native runtime requests require a canonical question response\",\n      );\n    }\n    const commandId = `command_runtime_input_${createHash(\"sha256\")\n      .update(`${input.requestId}:${pending.durableTurnId}`)\n      .digest(\"hex\")\n      .slice(0, 24)}`;\n    await this.#command(\n      \"request.resolve\",\n      {\n        requestId: input.requestId,\n        turnId: pending.durableTurnId,\n        response: input.resolution.response,\n      },\n      commandId,\n    );\n  }\n","sourceCodeStart":3716,"sourceCodeEnd":3752,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/live/runnerd-codex-transport.ts#L3716-L3752","documentation":"Thrown when a resolution for a runnerd-native runtime request does not carry a canonical 'response' field. This transport only accepts the canonical question-response shape for runtime inputs; other resolution variants (e.g. raw payload or acknowledgement-only resolutions) are rejected.","triggerScenarios":"Calling resolveRuntimeRequest with a resolution object lacking the 'response' property — e.g. passing { kind: 'dismiss' } or a custom resolution type instead of a canonical question response.","commonSituations":"Copying resolution code written for a different transport (non-native) that permits alternate resolution kinds; constructing the resolution object dynamically and omitting 'response' on one branch.","solutions":["Build the resolution as a canonical question response containing a 'response' field","Map legacy/alternate resolution kinds to the canonical response shape before calling resolveRuntimeRequest","Verify the resolution type used matches the runnerd-native transport's expected HarnessRuntimeRequestResolution variant"],"exampleFix":"// before\nawait transport.resolveRuntimeRequest({ requestId, turnId, resolution: { kind: \"ack\" } });\n// after\nawait transport.resolveRuntimeRequest({ requestId, turnId, resolution: { response: { answers: [\"yes\"] } } });","handlingStrategy":"validation","validationCode":"function isCanonicalQuestionResponse(r: unknown): r is { response: unknown } {\n  return typeof r === \"object\" && r !== null && \"response\" in r;\n}\nif (!isCanonicalQuestionResponse(resolution)) {\n  throw new TypeError(\"runnerd-native resolutions require a 'response' field\");\n}","typeGuard":"function hasResponseField(r: HarnessRuntimeRequestResolution): r is Extract<HarnessRuntimeRequestResolution, { response: unknown }> {\n  return \"response\" in r;\n}","tryCatchPattern":"null","preventionTips":["Always construct resolutions via the canonical response builder","Add a unit test asserting every resolution branch includes 'response'","Do not reuse non-native transport resolution kinds with runnerd-native transports"],"tags":["api-contract","validation","shape-mismatch"],"backgroundTag":"missing-required-argument","analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-10T03:14:50.855Z","contentChangedAt":"2026-09-10T03:14:50.855Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}