paperclipai/paperclip · error

Too many explicit skill inputs

Error message

Too many explicit skill inputs

What it means

Bound guard in the runnerd Codex skill-input resolution (resolveRunnerdCodexSkillInputs): the turn supplies more explicit skill inputs than the transport allows, so it refuses rather than materializing an unbounded set of controller-asset copies onto the provider filesystem. Generic validation — the input at fault is an oversized skills array on the turn request, usually from a caller bug or missing batching.

Solutions

  1. Reduce the number of explicit skill inputs attached to a single turn (split across turns or preselect the needed skills).
  2. Deduplicate the input list before sending — repeated skill entries often inflate the count.
  3. If a legitimate workload needs more skills, raise the documented cap in resolveRunnerdCodexSkillInputs.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at packages/paperclip-runner/src/live/runnerd-codex-transport.ts:6623 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-09-18). Data as JSON: /api/errors/d5ece1b77591ba7e. Report an issue: GitHub.

Appendix: source

Thrown at packages/paperclip-runner/src/live/runnerd-codex-transport.ts:6623

  providerTurnIsActiveFromCommittedEvents,
  recoveredRunAttachment,
  releaseRunnerProcessOwnership,
  runnerCloseDeadlines,
  rotatedRunAttachPayload,
  rotateExternalAuthorityEpoch,
  turnStartCommandResultValid,
  turnStartNotificationDisposition,
  turnStartResponseReady,
});


/** Map controller asset paths to the assigned copy on the provider filesystem. */
export function resolveRunnerdCodexSkillInputs(
  inputs: Record<string, unknown>[],
  context: NativeRuntimeContextSnapshot | null,
  codexHome: string,
): Array<{ type: "skill"; name: string; path: string }> {
  if (inputs.length > 64) throw new Error("Too many explicit skill inputs");
  const seen = new Set<string>();
  return inputs.map((input) => {
    const assigned = context?.skills.find((skill) => skill.runtimeName === input.name);
    if (
      !assigned || !/^[a-zA-Z0-9_-]+$/.test(assigned.runtimeName)
      || input.path !== resolve(assigned.bundle.rootPath, "SKILL.md")
      || seen.has(assigned.runtimeName)
    ) {
      throw new Error("Explicit skill input must reference a unique assigned runtime skill");
    }
    seen.add(assigned.runtimeName);
    return {
      type: "skill",
      name: assigned.runtimeName,
      path: resolve(codexHome, "skills", assigned.runtimeName, "SKILL.md"),
    };
  });
}

View on GitHub (pinned to 3f1d897a7c)