{"record":{"id":"7e46eff962ecd62c","repo":"can1357/oh-my-pi","slug":"validation-status-is-required-for-this-action","errorCode":null,"errorMessage":"validation_status is required for this action","messagePattern":"validation_status is required for this action","errorType":"validation","errorClass":"ToolError","httpStatus":null,"severity":"error","filePath":"packages/coding-agent/src/tools/security-scan.ts","lineNumber":254,"sourceCode":"\t\t\t\tconst bundle = await pullCodexSecurityCloudResults({\n\t\t\t\t\tclient: cloudClientForSession(this.session, params.credential_id),\n\t\t\t\t\tconfigurationId: requireValue(params.cloud_configuration_id, \"cloud_configuration_id\"),\n\t\t\t\t\tstore,\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\t\t\t\treturn textResult(\n\t\t\t\t\t`Imported ${bundle.findings.length} Codex Security cloud finding(s) as security scan ${bundle.scan.id}.`,\n\t\t\t\t\t{\n\t\t\t\t\t\taction: params.action,\n\t\t\t\t\t\timportedScan: { id: bundle.scan.id, findingCount: bundle.findings.length },\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"validate\": {\n\t\t\t\tconst scanId = requireValue(params.scan_id, \"scan_id\");\n\t\t\t\tconst findingId = requireValue(params.finding_id, \"finding_id\");\n\t\t\t\tconst status = params.validation_status;\n\t\t\t\tif (!status) throw new ToolError(\"validation_status is required for this action\");\n\t\t\t\tconst summary = requireValue(params.validation_summary, \"validation_summary\");\n\t\t\t\tconst store = await SecurityStore.openForCwd(this.session.cwd, { signal });\n\t\t\t\tconst finding = await store.getFinding(scanId, findingId);\n\t\t\t\tif (!finding) throw new ToolError(`Unknown security finding: ${findingId}`);\n\t\t\t\tconst evidence: SecurityEvidence[] = (params.validation_evidence ?? []).map((item, index) => ({\n\t\t\t\t\tid: createSecurityEvidenceId(\n\t\t\t\t\t\tfinding.fingerprint,\n\t\t\t\t\t\t`validation:${item.label}`,\n\t\t\t\t\t\tfinding.evidence.length + index,\n\t\t\t\t\t),\n\t\t\t\t\tkind: \"validation\",\n\t\t\t\t\tlabel: item.label,\n\t\t\t\t\texplanation: item.explanation,\n\t\t\t\t}));\n\t\t\t\tconst updated = await store.updateValidation(\n\t\t\t\t\tscanId,\n\t\t\t\t\tfindingId,\n\t\t\t\t\t{","sourceCodeStart":236,"sourceCodeEnd":272,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/coding-agent/src/tools/security-scan.ts#L236-L272","documentation":"For action=validate, the tool requires scan_id, finding_id, validation_status, and validation_summary. The schema marks validation_status optional, but the validate branch itself mandates it; this ToolError is thrown when the parameter is absent (undefined) even though the other required fields were present.","triggerScenarios":"security_scan with action=\"validate\", valid scan_id/finding_id/validation_summary, but validation_status omitted. Note the enum is 'unvalidated' | 'validated' | 'rejected' | 'partial' | 'error'.","commonSituations":"An agent or script constructing validate calls from a template that misses the status field; callers assuming a default status exists; partial migrations of older call shapes that didn't include validation_status.","solutions":["Add validation_status to the params, using one of the allowed values (usually 'validated' or 'rejected').","Double-check the action-specific parameter list in the security_scan tool description.","If the intent was merely to annotate without deciding, use status 'unvalidated'."],"exampleFix":"// before\nawait tool.execute(id, { action: \"validate\", scan_id: s, finding_id: f, validation_summary: \"ok\" });\n// after\nawait tool.execute(id, { action: \"validate\", scan_id: s, finding_id: f, validation_status: \"validated\", validation_summary: \"ok\" });","handlingStrategy":"validation","validationCode":"const VALID = [\"unvalidated\", \"validated\", \"rejected\", \"partial\", \"error\"] as const;\nif (!VALID.includes(params.validation_status as typeof VALID[number])) throw new Error(\"validation_status required for validate\");","typeGuard":"function hasValidationStatus(p: { validation_status?: string }): p is { validation_status: \"unvalidated\" | \"validated\" | \"rejected\" | \"partial\" | \"error\" } { return typeof p.validation_status === \"string\"; }","tryCatchPattern":"try { await tool.execute(id, validateParams); } catch (e) { if (e instanceof ToolError && e.message === \"validation_status is required for this action\") { /* re-issue with status */ } throw e; }","preventionTips":["Build validate calls from a typed helper that requires all four fields.","Never rely on defaults — validation_status has none.","Validate tool params against the schema in your dispatch layer."],"tags":["validation","parameters","tooling"],"backgroundTag":"missing-required-parameter","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}