{"record":{"id":"bdbfa1699d0c9065","repo":"paperclipai/paperclip","slug":"acpx-provider-identity-contains-an-invalid-permiss","errorCode":null,"errorMessage":"ACPX provider identity contains an invalid permission mode","messagePattern":"ACPX provider identity contains an invalid permission mode","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/drivers/codex/codex-driver-values.ts","lineNumber":72,"sourceCode":"  ] as const;\n  if (\n    requiredStrings.some(\n      (key) =>\n        typeof identity[key] !== \"string\" ||\n        identity[key].length === 0 ||\n        identity[key].length > 240,\n    )\n  ) {\n    throw new Error(\"ACPX provider identity is incomplete\");\n  }\n  const permissionMode = identity.permissionMode;\n  if (\n    permissionMode !== undefined &&\n    permissionMode !== \"approve-all\" &&\n    permissionMode !== \"approve-reads\" &&\n    permissionMode !== \"deny-all\"\n  ) {\n    throw new Error(\n      \"ACPX provider identity contains an invalid permission mode\",\n    );\n  }\n  const fenceCandidates = identity.providerLifetimeFenceCandidates;\n  if (\n    !Array.isArray(fenceCandidates) ||\n    fenceCandidates.length !== 3 ||\n    fenceCandidates.some(\n      (candidate) =>\n        !Number.isInteger(candidate) ||\n        candidate < 49_152 ||\n        candidate > 65_535,\n    ) ||\n    new Set(fenceCandidates).size !== 3\n  ) {\n    throw new Error(\"ACPX provider identity contains invalid lifetime fences\");\n  }\n  return {","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/drivers/codex/codex-driver-values.ts#L54-L90","documentation":"parseProviderIdentity validates a persisted ACPX provider-identity record when reconstructing a Codex harness session. The optional permissionMode field must be one of exactly three enumerated strings: \"approve-all\", \"approve-reads\", or \"deny-all\" (or undefined). If it is set to any other value — meaning the stored identity was hand-edited, written by a different driver version, or corrupted — the parser refuses to rebuild the session and throws this error.","triggerScenarios":"Calling parseProviderIdentity (usually indirectly via providerIdentity during session recovery/rehydration) with a persisted identity object whose kind is \"acpx\" but whose permissionMode is a non-enumerated string (e.g. \"approve-writes\", \"yolo\", \"default\", or an empty string), a number, or null.","commonSituations":"Hand-editing session persistence files (e.g. changing sandbox/approval settings manually); running a newer or older build that wrote an extra or renamed permission mode; a schema migration that renamed enum values; JSON corruption that mangled the field.","solutions":["Inspect the persisted provider identity record and set permissionMode to one of \"approve-all\", \"approve-reads\", or \"deny-all\", or delete the field entirely (undefined is allowed).","Verify which Paperclip/paperclip-runner version wrote the record; if a version change renamed enum values, re-run session recovery with matching versions or migrate the persisted field.","If the identity record is corrupted beyond repair, discard the persisted session and start a fresh Codex session so a new identity is written with a valid mode."],"exampleFix":"// before (persisted identity)\n{ \"kind\": \"acpx\", \"permissionMode\": \"approve-writes\", ... }\n// after\n{ \"kind\": \"acpx\", \"permissionMode\": \"approve-reads\", ... }","handlingStrategy":"validation","validationCode":"const VALID_MODES = [\"approve-all\", \"approve-reads\", \"deny-all\"];\nfunction hasValidPermissionMode(identity) {\n  const m = identity?.permissionMode;\n  return m === undefined || VALID_MODES.includes(m);\n}\nif (!hasValidPermissionMode(storedIdentity)) {\n  throw new Error(\"stored identity has invalid permissionMode\");\n}","typeGuard":"function isValidPermissionMode(v: unknown): v is \"approve-all\" | \"approve-reads\" | \"deny-all\" | undefined {\n  return v === undefined || v === \"approve-all\" || v === \"approve-reads\" || v === \"deny-all\";\n}","tryCatchPattern":null,"preventionTips":["Never hand-edit persisted session identity files; change permission modes through the documented configuration surface.","Pin driver versions so writer and reader agree on the permission-mode enum.","Add a schema validator (e.g. zod enum) at the persistence boundary so invalid modes are rejected at write time."],"tags":["validation","config","codex","session-recovery"],"backgroundTag":"invalid-enum-value","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"}