Hmbown/CodeWhale · error

guardian context contains only serializable values

Error message

guardian context contains only serializable values

What it means

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.

Source

Thrown at crates/tui/src/tui/auto_review.rs:540

pub(crate) fn build_reviewer_context(
    ctx: &AutoReviewContext<'_>,
    held_reason: &str,
    tool_input: &Value,
) -> String {
    serde_json::to_string(&serde_json::json!({
        "proposed_tool_call": {
            "tool": ctx.tool_name,
            "input": tool_input,
        },
        "deterministic_observations": {
            "action_kind": ctx.action_kind.as_str(),
            "risk": risk_label(ctx.risk),
            "run_origin": ctx.run_origin.as_str(),
            "workspace_trusted": ctx.workspace_trusted,
            "hold_reason": held_reason,
        }
    }))
    .expect("guardian context contains only serializable values")
}

/// Strict JSON-object parse of a reviewer reply. Extra prose, fields, or an
/// empty rationale are unavailable answers and therefore fail closed.
pub(crate) fn parse_reviewer_verdict(text: &str) -> Option<ReviewerVerdict> {
    let object: Value = serde_json::from_str(text.trim()).ok()?;
    let fields = object.as_object()?;
    if fields.len() != 3
        || !fields.contains_key("risk_level")
        || !fields.contains_key("decision")
        || !fields.contains_key("reason")
    {
        return None;
    }
    let risk = match object
        .get("risk_level")?
        .as_str()?
        .trim()

View on GitHub (pinned to 0c42157ee5)

Solutions

  1. Keep the json! payload limited to strings, booleans, and Value (already serializable)
  2. If a struct field is added, ensure it is Serialize or map it to a string first
  3. On failure, the reviewer hold path cannot proceed; log the tool name and hold reason before any panic
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at crates/tui/src/tui/auto_review.rs:540 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20). Data as JSON: /api/errors/d6c4a7aa57997713. Report an issue: GitHub.