{"record":{"id":"d6c4a7aa57997713","repo":"Hmbown/CodeWhale","slug":"guardian-context-contains-only-serializable-values","errorCode":null,"errorMessage":"guardian context contains only serializable values","messagePattern":"guardian context contains only serializable values","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/tui/auto_review.rs","lineNumber":540,"sourceCode":"pub(crate) fn build_reviewer_context(\n    ctx: &AutoReviewContext<'_>,\n    held_reason: &str,\n    tool_input: &Value,\n) -> String {\n    serde_json::to_string(&serde_json::json!({\n        \"proposed_tool_call\": {\n            \"tool\": ctx.tool_name,\n            \"input\": tool_input,\n        },\n        \"deterministic_observations\": {\n            \"action_kind\": ctx.action_kind.as_str(),\n            \"risk\": risk_label(ctx.risk),\n            \"run_origin\": ctx.run_origin.as_str(),\n            \"workspace_trusted\": ctx.workspace_trusted,\n            \"hold_reason\": held_reason,\n        }\n    }))\n    .expect(\"guardian context contains only serializable values\")\n}\n\n/// Strict JSON-object parse of a reviewer reply. Extra prose, fields, or an\n/// empty rationale are unavailable answers and therefore fail closed.\npub(crate) fn parse_reviewer_verdict(text: &str) -> Option<ReviewerVerdict> {\n    let object: Value = serde_json::from_str(text.trim()).ok()?;\n    let fields = object.as_object()?;\n    if fields.len() != 3\n        || !fields.contains_key(\"risk_level\")\n        || !fields.contains_key(\"decision\")\n        || !fields.contains_key(\"reason\")\n    {\n        return None;\n    }\n    let risk = match object\n        .get(\"risk_level\")?\n        .as_str()?\n        .trim()","sourceCodeStart":522,"sourceCodeEnd":558,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/tui/auto_review.rs#L522-L558","documentation":"build_reviewer_context serializes a json! literal whose fields are all strings and booleans (tool name, input Value, risk label, hold reason, trust flags). serde_json::to_string on such a value cannot fail — it fails only on maps with non-string keys or unserializable types — so this expect marks a serializeability invariant for the guardian context payload.","triggerScenarios":"Thrown at crates/tui/src/tui/auto_review.rs:540 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Keep the json! payload limited to strings, booleans, and Value (already serializable)","If a struct field is added, ensure it is Serialize or map it to a string first","On failure, the reviewer hold path cannot proceed; log the tool name and hold reason before any panic"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}