# CommitBrief 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

Canonical URL: https://commitbrief.com/changelog/v1.13.0/

---

## 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.