// changelog

v1.13.0

Repair-oriented structured-output recovery. When a provider returns something that fails findings-JSON parsing, the pipeline no longer re-sends the byte-identical request — a lone markdown fence is now salvaged for free before parsing, and the single retry sends a failure-mode-specific repair prompt instead. Two new optional meta fields make retries and degrades visible.

Released July 4, 2026

Changed

  • Repair-oriented structured-output recovery (ADR-0031). When a provider returns output that fails findings-JSON parsing, the pipeline no longer retries with the byte-identical request. The recovery ladder has three rungs:
    • Phase 0 — fence salvage, zero retries. ParseFindings now unwraps a lone markdown code-fence pair (```json … ```) before parsing, so a provider that fenced otherwise-valid JSON — common for prompt-only, OpenAI-compatible and Ollama models — parses on the first attempt. Non-fenced input passes through byte-identical, so the cache key is unchanged and cached results that happen to be fenced now render as findings on replay.
    • Phase 1 + 2 — a repair prompt, not a re-roll. The parse error is classified (empty / prose / truncated-JSON / schema violation) and the single retry sends a failure-mode-specific repair prompt: a hard “JSON only, no prose” reset for prose or schema-ignored output, or a “complete the JSON” nudge — with the partial output embedded and a raised max_tokens ceiling — for a truncated attempt.
  • The retry stays a fresh single-shot request; the terminal markdown-fallback degrade state and the summed token usage are unchanged. CLI plain-text providers are unaffected.

Added

  • Recovery observability (ADR-0031). New additive optional meta.retry_count and meta.degrade_reason fields in the --json output. Both are omitempty, so a clean review is byte-for-byte the same as before and the schema version stays 1. Two matching --verbose footer lines make retries and degrades visible for make eval model comparison. Both are live-call-only — a cache replay reports neither.