{"record":{"id":"1d3ba213b82765ed","repo":"paperclipai/paperclip","slug":"the-pi-acpx-profile-is-not-available","errorCode":null,"errorMessage":"The Pi ACPX profile is not available","messagePattern":"The Pi ACPX profile is not available","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/cli/eval-session-contract.ts","lineNumber":240,"sourceCode":"    providerValue !== \"opencode\" &&\n    providerValue !== \"claude_managed\" &&\n    providerValue !== \"aws_agentcore\" &&\n    providerValue !== \"acpx\"\n  ) {\n    throw new Error(\n      \"eval-session provider is unsupported by CapabilityLiveSessionService\",\n    );\n  }\n  const provider = providerValue;\n  const driver = expectedEvalSessionDriver(provider);\n  if (input.driver !== undefined && input.driver !== driver) {\n    throw new Error(\"eval-session provider/driver mismatch\");\n  }\n  // The original Evalbook v1 producer serialized absent provider-specific\n  // options as JSON null. Preserve compatibility with those immutable request\n  // artifacts while continuing to reject non-null values for the wrong lane.\n  const acpxAgent = input.acpxAgent === null ? undefined : input.acpxAgent;\n  if (acpxAgent === \"pi\") throw new Error(\"The Pi ACPX profile is not available\");\n  if (\n    acpxAgent !== undefined &&\n    acpxAgent !== \"codex\" &&\n    acpxAgent !== \"claude\"\n  ) {\n    throw new Error(\"eval-session acpxAgent must be codex or claude\");\n  }\n  if (provider !== \"acpx\" && acpxAgent !== undefined) {\n    throw new Error(\"eval-session acpxAgent requires provider acpx\");\n  }\n  const managedProfileInput = input.managedProfile === null\n    ? undefined\n    : input.managedProfile;\n  const agentCoreProfileInput = input.agentCoreProfile === null\n    ? undefined\n    : input.agentCoreProfile;\n  const managedProfile = provider === \"claude_managed\"\n    ? parseManagedProfile(managedProfileInput)","sourceCodeStart":222,"sourceCodeEnd":258,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/cli/eval-session-contract.ts#L222-L258","documentation":"The Pi ACPX agent profile is explicitly disallowed in eval-session requests. parseEvalSessionRequest fail-closed rejects input.acpxAgent === 'pi' before any other acpxAgent validation, so Pi can never reach CapabilityLiveSessionService even though other ACPX agents (codex, claude) are accepted. The library throws this to guarantee only qualified ACPX profiles run at the executable boundary.","triggerScenarios":"Submitting an eval-session request with provider 'acpx' and acpxAgent set to 'pi', typically via the eval-session CLI request path that calls parseEvalSessionRequest.","commonSituations":"Copy-pasting an ACPX config that previously used the Pi profile; enumerating agent names generically instead of using the supported set; a CI matrix listing 'pi' as an agent variant; switching agent profiles after Pi support was removed.","solutions":["Change acpxAgent to 'codex' or 'claude' in the request.","Remove the acpxAgent field entirely if the default ACPX agent is acceptable.","Update the eval pipeline/matrix to exclude the Pi profile.","If Pi is genuinely required, check whether a newer version of paperclip-runner qualifies it — in this contract it is hard-rejected."],"exampleFix":"// before\nconst request = { schema, provider: \"acpx\", acpxAgent: \"pi\", ... };\n// after\nconst request = { schema, provider: \"acpx\", acpxAgent: \"codex\", ... };","handlingStrategy":"validation","validationCode":"const SUPPORTED_ACPX_AGENTS = [\"codex\", \"claude\"] as const;\nfunction assertAcpxAgentSupported(request: { provider?: string; acpxAgent?: string }): void {\n  if (request.acpxAgent === \"pi\") {\n    throw new Error(\"Pi ACPX profile is not available; use codex or claude\");\n  }\n  if (request.acpxAgent !== undefined &&\n      !(SUPPORTED_ACPX_AGENTS as readonly string[]).includes(request.acpxAgent)) {\n    throw new Error(`acpxAgent must be one of ${SUPPORTED_ACPX_AGENTS.join(\"|\")}`);\n  }\n}","typeGuard":"function isSupportedAcpxAgent(v: unknown): v is \"codex\" | \"claude\" {\n  return v === \"codex\" || v === \"claude\";\n}","tryCatchPattern":"try {\n  const parsed = parseEvalSessionRequest(raw);\n} catch (err) {\n  if (err instanceof Error && err.message === \"The Pi ACPX profile is not available\") {\n    console.error(\"Request uses the retired Pi profile; switch acpxAgent to 'codex' or 'claude'.\");\n  } else throw err;\n}","preventionTips":["Keep an allowlist constant ('codex' | 'claude') in your request builder and type acpxAgent as that union.","Exclude 'pi' from any eval matrix or agent enumeration configs.","When copying ACPX configs, check for profile-specific fields before reusing them.","Type acpxAgent as 'codex' | 'claude' | undefined so Pi is a compile-time error."],"tags":["validation","contract","unsupported-feature"],"backgroundTag":"unsupported-acpx-profile","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"}