{"record":{"id":"45ff0043ed360905","repo":"can1357/oh-my-pi","slug":"unknown-disposition-status","errorCode":null,"errorMessage":"Unknown disposition: ${status}","messagePattern":"Unknown disposition: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/coding-agent/src/slash-commands/helpers/security.ts","lineNumber":339,"sourceCode":"\t\t\t\tconfigurationId: options.configurationId,\n\t\t\t\tstore,\n\t\t\t});\n\t\t\tawait runtime.output(\n\t\t\t\t`Imported ${bundle.findings.length} Codex Security cloud finding(s) as security scan ${bundle.scan.id}.`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(\"Usage: /security cloud <scans|start|status|pull>\");\n\t}\n}\n\nasync function updateDisposition(runtime: SlashCommandRuntime, rest: string): Promise<void> {\n\tconst [scanId, findingId, status, ...rationaleParts] = parseCommandArgs(rest);\n\tif (!scanId || !findingId || !status) {\n\t\tthrow new Error(\"disposition requires <scan-id> <finding-id> <status> [rationale]\");\n\t}\n\tif (!DISPOSITIONS.has(status as SecurityDispositionStatus)) throw new Error(`Unknown disposition: ${status}`);\n\tconst rationale = rationaleParts.join(\" \").trim();\n\tif (status !== \"open\" && !rationale) throw new Error(`${status} requires a rationale`);\n\tconst store = await SecurityStore.openForCwd(runtime.cwd);\n\tconst finding = await store.updateDisposition(scanId, findingId, {\n\t\tstatus: status as SecurityDispositionStatus,\n\t\trationale: rationale || undefined,\n\t\tupdatedAt: new Date().toISOString(),\n\t\tactor: \"operator\",\n\t});\n\tawait runtime.output(`Finding ${finding.id} disposition is now ${finding.disposition.status}.`);\n}\n\nexport async function handleSecurityCommand(\n\tcommand: ParsedSlashCommand,\n\truntime: SlashCommandRuntime,\n): Promise<SlashCommandResult> {\n\tif (!runtime.settings.get(\"security.enabled\")) {\n\t\treturn usage(\"Security is disabled. Enable security.enabled before using /security.\", runtime);","sourceCodeStart":321,"sourceCodeEnd":357,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/coding-agent/src/slash-commands/helpers/security.ts#L321-L357","documentation":"Thrown by updateDisposition when the status argument is not a member of the DISPOSITIONS set (SecurityDispositionStatus values such as open/triaged/false-positive/etc.). Validated client-side before persisting, so an invalid disposition never reaches store.updateDisposition.","triggerScenarios":"Run `/security disposition scan_1 finding_2 resolved` or `... fixed` or `... Open` (case-sensitive) — any status outside the allowed set.","commonSituations":"Using synonyms like resolved/fixed/wontfix from other triage tools; capitalizing the status; guessing the vocabulary instead of checking allowed values.","solutions":["Use one of the exact allowed disposition values (lowercase) — check DISPOSITIONS in security.ts or the /security docs.","Remember `open` is the only status allowed without a rationale.","Check spelling and case of the status token."],"exampleFix":"// before\n/security disposition scan_1 finding_2 resolved\n// after\n/security disposition scan_1 finding_2 triaged","handlingStrategy":"validation","validationCode":"const DISPOSITIONS = new Set([\"open\", \"triaged\", \"false-positive\", \"accepted-risk\", \"remediated\"]); // match library values\nif (!DISPOSITIONS.has(status)) throw new Error(`status must be one of: ${[...DISPOSITIONS].join(\", \")}`);","typeGuard":"function isDisposition(s: string): s is SecurityDispositionStatus {\n\treturn [\"open\", \"triaged\", \"false-positive\", \"accepted-risk\", \"remediated\"].includes(s);\n}","tryCatchPattern":null,"preventionTips":["Use only the exact lowercase disposition values the library defines; no synonyms like resolved/fixed.","Validate the status token in any script that constructs disposition commands.","Check DISPOSITIONS in security.ts when the allowed set is uncertain."],"tags":["cli","validation","enum"],"backgroundTag":"invalid-enum-value","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}