Skip to main content
Export fixing diffs from clean failed-to-passed CI transitions. This procedure is for operators with captured CI outcomes and local Git mirrors. Inference calls enrich the pairs when available; they aren’t required to produce a row.

Prepare the evidence

Use the configured operator shell and private output parent. Set SEDIMENT_ORG_ID, SEDIMENT_DATABASE_URL, and SEDIMENT_MIRROR_PATH. The mirrors must contain the failed and fixed commits and their ancestry. Recovery reads Facts and mirrors directly. It doesn’t accept --from, cohort filters, a Derivation policy file, or a consumer profile. A reviewed bundle doesn’t freeze the evidence for this command.

Understand Recovery lineage

The Recovery export writes one row per red-to-green CI transition in a clean, resolved workflow lineage (Recovery pair). It pairs the last failed run with the next passed run on a descendant commit. The row carries the fixing diff and identifiers for Inference calls attributed to each side. Match workflow IDs within one provider, or paths when both IDs are absent. Names alone don’t establish a definition; workflow_identity_absent counts each excluded clean resolution. If an earlier attempt carries the identity, the resolved run retains it. Recovery pairs documents the Derivation gates: ancestry, suspected-flake exclusion, ambiguous-verdict exclusion, non-verdict exclusion, same-commit rerun decline, and the diff-size cap.

Export the pairs

Run the command with an unused destination:
The command selects recovery_ci version 1. It prints pairs derived and recovery rows, each with a separate skipped map, followed by written paths. The CLI uses the default evaluation fraction of 0.1. Populated partitions produce recovery.train.jsonl and recovery.eval.jsonl; an empty partition produces no file. The CLI has no split override.

Inspect the output

  1. Check that the failed and fixed outcomes describe the same workflow lineage and that the fixed commit descends from the failed commit.
  2. Inspect recovery_diff against the mirror. The default limit is 200 changed lines, counting additions and removals inside hunks.
  3. Review both diagnostic maps. workflow_identity_absent, same_commit, not_ancestor, and diff_oversized explain common Derivation exclusions.
  4. Audit the split. A pair goes to eval if any resolvable Session on either side belongs to eval. With no resolvable Session evidence, it goes to train. That fallback doesn’t establish a task-level holdout.
If no rows qualify, the command prints nothing written and leaves earlier files untouched. Use a fresh destination to keep that result unambiguous.

Read a Recovery row

The RecoveryRow schema defines the complete wire contract. Inspect these fields when auditing a pair:

Interpret the degradation tally

The projection declines each unrepresentable pair once under non_finite_number or unrepresentable_unicode. It checks emitted content and metadata, excluding omitted Inference-call messages. The separate inference_call_not_found tally counts attributed inference-call IDs that are missing from the Inference call lookup. Missing source records count under attribution_evidence_absent, per side and Inference call. These two enrichment counts don’t drop the CI pair. Don’t add them to pair-level exclusions to estimate lost rows.