{"record":{"id":"a779903330b26e44","repo":"openai/codex","slug":"guardian-assessment-was-not-valid-json","errorCode":null,"errorMessage":"guardian assessment was not valid JSON","messagePattern":"guardian assessment was not valid JSON","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"codex-rs/core/src/guardian/prompt.rs","lineNumber":719,"sourceCode":"\n/// The model is asked for strict JSON, but we still accept a surrounding prose\n/// wrapper so transient formatting drift fails less noisily during dogfooding.\n/// Non-JSON output is still a review failure; this is only a thin recovery path\n/// for cases where the model wrapped the JSON in extra prose.\npub(crate) fn parse_guardian_assessment(text: Option<&str>) -> anyhow::Result<GuardianAssessment> {\n    let Some(text) = text else {\n        anyhow::bail!(\"guardian review completed without an assessment payload\");\n    };\n    let parsed_payload =\n        if let Ok(payload) = serde_json::from_str::<GuardianAssessmentPayload>(text) {\n            payload\n        } else if let (Some(start), Some(end)) = (text.find('{'), text.rfind('}'))\n            && start < end\n            && let Some(slice) = text.get(start..=end)\n        {\n            serde_json::from_str::<GuardianAssessmentPayload>(slice)?\n        } else {\n            anyhow::bail!(\"guardian assessment was not valid JSON\");\n        };\n\n    let outcome = parsed_payload.outcome;\n    let risk_level = parsed_payload.risk_level.unwrap_or(match outcome {\n        super::GuardianAssessmentOutcome::Allow => GuardianRiskLevel::Low,\n        super::GuardianAssessmentOutcome::Deny => GuardianRiskLevel::High,\n    });\n    let rationale = parsed_payload\n        .rationale\n        .filter(|rationale| !rationale.trim().is_empty())\n        .unwrap_or_else(|| match outcome {\n            super::GuardianAssessmentOutcome::Allow => {\n                \"Auto-review returned a low-risk allow decision.\".to_string()\n            }\n            super::GuardianAssessmentOutcome::Deny => {\n                \"Auto-review returned a deny decision without a rationale.\".to_string()\n            }\n        });","sourceCodeStart":701,"sourceCodeEnd":737,"githubUrl":"https://github.com/openai/codex/blob/339751715c64496cb86246bfb3935f40e309dd3d/codex-rs/core/src/guardian/prompt.rs#L701-L737","documentation":"Error \"guardian assessment was not valid JSON\" thrown in openai/codex.","triggerScenarios":"Thrown at codex-rs/core/src/guardian/prompt.rs:719 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Retry the guardian review; the assessment response was not valid JSON."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"339751715c64496cb86246bfb3935f40e309dd3d","analyzedAt":"2026-08-25T05:35:09.876Z","schemaVersion":2},"datasetVersion":"2026-08-25T06:17:31.827Z"}