{"record":{"id":"35771f695361e433","repo":"paperclipai/paperclip","slug":"the-pi-acpx-profile-is-not-available-35771f","errorCode":null,"errorMessage":"The Pi ACPX profile is not available","messagePattern":"The Pi ACPX profile is not available","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/runnerd-codex-transport.ts","lineNumber":3212,"sourceCode":"  #runnerRecoveryInProgress = false;\n  #startupComplete = false;\n  #startupFailureCode = \"native_runner_process_exited\";\n  #controlPlaneCheckpoint:\n    ((settlement: \"settled\" | \"unsettled\") => Promise<void> | void) | null =\n    null;\n  #controlPlaneRelease: (() => Promise<void> | void) | null = null;\n  #nextTraceDebugSequence = 1;\n  #traceRehydrationSpoolOverflow = false;\n  #pendingTraceRehydrations: PendingTraceRehydration[] = [];\n  #pendingDriverTraceInterpretations: PendingDriverTraceInterpretation[] = [];\n  readonly #bridgedRuntimeInputs = new Map<string, { durableTurnId: string }>();\n\n  constructor(readonly options: CapabilityRunnerdCodexTransportOptions) {\n    if (options.adoptExistingRunner && !options.stateDirectory?.trim()) {\n      throw new Error(\"native_adopted_runner_state_directory_required\");\n    }\n    if (options.provider === \"acpx\" && options.acpxAgent === \"pi\") {\n      throw new Error(\"The Pi ACPX profile is not available\");\n    }\n    this.#failureSignal = new Promise<never>((_resolve, reject) => {\n      this.#rejectFailureSignal = reject;\n    });\n    // Failure is also observed by request/notification paths. Register an\n    // internal handler so a process exit after the owner has closed the\n    // session cannot become an unhandled process-level rejection.\n    void this.#failureSignal.catch(() => undefined);\n    this.#ownsRoot = options.stateDirectory === undefined;\n    this.#turnId = options.resumeActiveTurnId ?? \"\";\n    this.#root =\n      options.stateDirectory ??\n      mkdtempSync(resolve(tmpdir(), \"paperclip-runner-lab-prp-\"));\n    if (options.resumeDynamicTools !== undefined) {\n      this.#authorizedTools = authorizedToolSetForProvider(options.provider, [\n        ...options.resumeDynamicTools,\n        ...codexSemanticToolSpecs(),\n      ]);","sourceCodeStart":3194,"sourceCodeEnd":3230,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/live/runnerd-codex-transport.ts#L3194-L3230","documentation":"The transport constructor hard-disables the 'pi' agent under the ACPX provider: provider === 'acpx' && acpxAgent === 'pi' throws immediately. This profile is intentionally unavailable, so construction never succeeds for that combination.","triggerScenarios":"Constructing CapabilityRunnerdCodexTransport with options.provider='acpx' and options.acpxAgent='pi'.","commonSituations":"Config files selecting the pi agent profile left over from an older version; user-supplied agent name passed through without allowlisting; template or docs referencing a removed profile.","solutions":["Choose a supported acpxAgent value (any profile other than 'pi') in the transport options.","Remove or update stale configuration that still names the pi profile.","Validate/sanitize the agent name against the supported set before constructing the transport.","Upgrade paperclip-runner if pi support is needed, since availability may change in later versions."],"exampleFix":"// before\nnew CapabilityRunnerdCodexTransport({ provider: 'acpx', acpxAgent: 'pi' });\n// after\nnew CapabilityRunnerdCodexTransport({ provider: 'acpx', acpxAgent: 'codex' });","handlingStrategy":"validation","validationCode":"const SUPPORTED_ACPX_AGENTS = ['codex'];\nif (opts.provider === 'acpx' && !SUPPORTED_ACPX_AGENTS.includes(opts.acpxAgent)) {\n  throw new Error(`acpxAgent '${opts.acpxAgent}' is not supported`);\n}","typeGuard":"const isSupportedAcpxAgent = (a: string): a is 'codex' => a !== 'pi' && SUPPORTED_ACPX_AGENTS.includes(a);","tryCatchPattern":"try {\n  transport = new CapabilityRunnerdCodexTransport(options);\n} catch (err) {\n  if ((err as Error).message === 'The Pi ACPX profile is not available') {\n    options.acpxAgent = 'codex';\n    transport = new CapabilityRunnerdCodexTransport(options);\n  } else throw err;\n}","preventionTips":["Keep a central allowlist of supported agent profiles","Prune removed profiles from config templates on upgrade","Log/telemetry unsupported profile selections early"],"tags":["unsupported","acpx","config","feature-flag"],"backgroundTag":"unsupported-enum-value","analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-10T03:14:50.855Z","contentChangedAt":"2026-09-10T03:14:50.855Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}