paperclipai/paperclip · error · HarnessRuntimeRequestResolutionError

${action} does not carry submitted form data

Error message

${action} does not carry submitted form data

What it means

parseHarnessRuntimeRequestResolution validates that a request resolution matches its request kind. Only action 'submit' may carry form payload fields (answers/content/response); any other action (accept, decline, cancel, accept_for_session) that includes one of those fields is rejected so mismatched submits fail closed instead of degrading into empty responses.

Source

Thrown at packages/paperclip-runner/src/contracts/harness-driver.ts:223

  const candidate = plainRecord(value) ?? {};
  const rawAction = candidate.action;
  if (
    typeof rawAction !== "string" ||
    !RUNTIME_REQUEST_ACTIONS.includes(rawAction as HarnessRuntimeRequestAction)
  ) {
    throw new HarnessRuntimeRequestResolutionError(
      requestKind,
      `unsupported action ${JSON.stringify(rawAction) ?? "undefined"}`,
    );
  }
  const action = rawAction as HarnessRuntimeRequestAction;
  if (
    action !== "submit" &&
    ("answers" in candidate ||
      "content" in candidate ||
      "response" in candidate)
  ) {
    throw new HarnessRuntimeRequestResolutionError(
      requestKind,
      `${action} does not carry submitted form data`,
    );
  }

  if (action === "submit" && "response" in candidate) {
    if (requestKind !== "user_input" && requestKind !== "elicitation") {
      throw new HarnessRuntimeRequestResolutionError(
        requestKind,
        "approval requests do not accept submitted question responses",
      );
    }
    if ("answers" in candidate || "content" in candidate) {
      throw new HarnessRuntimeRequestResolutionError(
        requestKind,
        "canonical submissions cannot also carry provider-specific answers or content",
      );
    }

View on GitHub (pinned to 01ad858492)

Solutions

  1. Strip answers/content/response fields from the payload when the action is not 'submit'.
  2. If the intent is to submit form data, change the action to 'submit'.
  3. For approval requests use accept/accept_for_session/decline with no payload fields; for user_input use submit/decline/cancel.
  4. Validate the resolution object shape client-side before posting it to the route.

Example fix

// before
resolve({ action: 'decline', answers: { q1: ['no'] } });
// after
resolve({ action: 'decline' });
Defensive patterns

Strategy: validation

Validate before calling

function validateResolution(r) {
  const payloadFields = ['answers', 'content', 'response'].filter((k) => k in r);
  if (r.action !== 'submit' && payloadFields.length > 0) {
    throw new Error(`${r.action} must not carry ${payloadFields.join(',')}`);
  }
}

Try / catch

try {
  await resolveRequest(requestId, resolution);
} catch (e) {
  if (e instanceof HarnessRuntimeRequestResolutionError && e.message.includes('does not carry submitted form data')) {
    await resolveRequest(requestId, { action: resolution.action });
  } else throw e;
}

Prevention

When it happens

Trigger: Calling parseHarnessRuntimeRequestResolution (or the agent routes/browser transport that wrap it) with `{ action: 'decline', answers: {...} }`, `{ action: 'accept', content: '...' }`, or similar where a non-submit action also includes answers/content/response.

Common situations: UI sends the user's typed text along with an 'accept' action; a generic resolver attaches a stale answers object to a decline; API client copies the submit payload shape for other actions.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10). Data as JSON: /api/errors/49df8f08219a1927. Report an issue: GitHub.