{"record":{"id":"662c93b83adb0c66","repo":"paperclipai/paperclip","slug":"explicit-skill-inputs-are-supported-only-by-codex","errorCode":null,"errorMessage":"Explicit skill inputs are supported only by Codex","messagePattern":"Explicit skill inputs are supported only by Codex","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/runnerd-codex-transport.ts","lineNumber":5493,"sourceCode":"    params: Record<string, unknown>,\n  ): Promise<Record<string, unknown>> {\n    const turnStartTimeoutMs = this.options.turnStartTimeoutMs ?? 30_000;\n    if (!Number.isSafeInteger(turnStartTimeoutMs) || turnStartTimeoutMs <= 0) {\n      throw new Error(\"turnStartTimeoutMs must be a positive safe integer\");\n    }\n    const commandDeadline = Date.now() + turnStartTimeoutMs;\n    const input = Array.isArray(params.input) ? params.input.map(record) : [];\n    const message = input\n      .filter((item) => item.type !== \"skill\")\n      .map((item) => (typeof item.text === \"string\" ? item.text : \"\"))\n      .join(\"\\n\");\n    const skills = resolveRunnerdCodexSkillInputs(\n      input.filter((item) => item.type === \"skill\"),\n      this.options.runtimeContext ?? null,\n      resolve(this.options.runnerFilesystemRoot ?? this.#root, \"codex-home\"),\n    );\n    if (skills.length && (this.options.provider ?? \"codex\") !== \"codex\") {\n      throw new Error(\"Explicit skill inputs are supported only by Codex\");\n    }\n    const pendingTurnId = `turn_lab_${randomUUID().replaceAll(\"-\", \"\")}`;\n    this.#turnId = pendingTurnId;\n    const responseEpoch = ++this.#turnStartResponseEpoch;\n    this.#turnStartAdmission?.resolve(false);\n    let resolveAdmission!: (accepted: boolean) => void;\n    this.#turnStartAdmission = {\n      settled: new Promise((resolve) => {\n        resolveAdmission = resolve;\n      }),\n      resolve: (accepted) => resolveAdmission(accepted),\n    };\n    this.#turnStartResponsePending = true;\n    let releaseStartResponse!: () => void;\n    this.#turnStartResponseSettled = new Promise<void>(resolve => { releaseStartResponse = resolve; });\n    this.#expectedProviderTurnId = null;\n    let responseReady = false;\n    try {","sourceCodeStart":5475,"sourceCodeEnd":5511,"githubUrl":"https://github.com/paperclipai/paperclip/blob/3f1d897a7c018d76563a21c6e39c3c9b03933622/packages/paperclip-runner/src/live/runnerd-codex-transport.ts#L5475-L5511","documentation":"Capability guard in the runnerd Codex transport's turn-start path: the incoming turn input contains explicit skill inputs (type: 'skill' items), but the active agent is not Codex — explicit skill inputs are a Codex-only feature (they map to files on the Codex filesystem), so the transport rejects the turn instead of silently dropping the skills. Generic validation — the input at fault is skill items in a turn addressed to a non-Codex agent.","triggerScenarios":"Thrown at packages/paperclip-runner/src/live/runnerd-codex-transport.ts:5493 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Route turns carrying explicit skill inputs to a Codex-backed transport.","Strip skill items from the input for non-Codex agents or inline their content as plain text instead.","Gate the caller's skill-input feature on the agent type before submitting the turn."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"3f1d897a7c018d76563a21c6e39c3c9b03933622","analyzedAt":"2026-09-18T08:03:59.046Z","contentChangedAt":"2026-09-18T08:03:59.046Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}