Evidence pack

The evidence pack

One versioned structure in two forms. The JSON is the structure; the document is a rendering of the same structure, so they cannot disagree.

What it emits

Both forms state, from the run rather than from prose:

uv run gauntlet report results.json --out evidence.md
uv run gauntlet report results.json --format json --out evidence.json

# whole-run drift against an earlier run
uv run gauntlet report results.json \
  --baseline previous-results.json --out evidence.md

An excerpt from a failing run

The excerpt below is output, not illustration. It was produced while this page was built, by running the built-in suites against the in-repo toy target with the drop_citations defect injected and rendering the result through the same reporter a real run uses. It is the failure section in full, unedited, at the length a real failure runs to.

## What failed

2 of 5 gates failed. Each failing case is listed with the reason the gate rejected it.

### Gate `golden`: 0 / 8 cases passed, pass rate 0.000, threshold 100%

| Case | Language | Why it failed |
|---|---|---|
| `gold-en-library` | en | answer drifted from key: expected 'Riverbend Central Library is open Monday through Saturday, 9:00 to 18:00. [source: RB-001]', got 'Riverbend Central Library is open Monday through Saturday, 9:00 to 18:00.' |
| `gold-en-dog-license` | en | answer drifted from key: expected 'A Riverbend dog license costs 18 dollars per year and renews each January. [source: RB-002]', got 'A Riverbend dog license costs 18 dollars per year and renews each January.' |
| `gold-en-transit` | en | answer drifted from key: expected 'A Riverbend Transit day pass costs 5 dollars and covers all bus lines until midnight. [source: RB-004]', got 'A Riverbend Transit day pass costs 5 dollars and covers all bus lines until midnight.' |
| `gold-en-pool` | en | answer drifted from key: expected 'The Riverbend Aquatic Center pool offers open swim daily from 12:00 to 15:00 in summer. [source: RB-008]', got 'The Riverbend Aquatic Center pool offers open swim daily from 12:00 to 15:00 in summer.' |
| `gold-es-biblioteca` | es | answer drifted from key: expected 'La Biblioteca Central de Riverbend abre de lunes a sábado, de 9:00 a 18:00. [source: RB-101]', got 'La Biblioteca Central de Riverbend abre de lunes a sábado, de 9:00 a 18:00.' |
| `gold-es-licencia-perro` | es | answer drifted from key: expected 'La licencia de perro en Riverbend cuesta 18 dólares al año y se renueva cada enero. [source: RB-102]', got 'La licencia de perro en Riverbend cuesta 18 dólares al año y se renueva cada enero.' |
| `gold-es-transporte` | es | answer drifted from key: expected 'El pase diario de Riverbend Transit cuesta 5 dólares y cubre todas las líneas de autobús hasta la medianoche. [source: RB-104]', got 'El pase diario de Riverbend Transit cuesta 5 dólares y cubre todas las líneas de autobús hasta la medianoche.' |
| `gold-es-piscina` | es | answer drifted from key: expected 'La piscina del Centro Acuático de Riverbend ofrece nado libre todos los días de 12:00 a 15:00 en verano. [source: RB-108]', got 'La piscina del Centro Acuático de Riverbend ofrece nado libre todos los días de 12:00 a 15:00 en verano.' |

### Gate `grounding`: 4 / 12 cases passed, pass rate 0.333, threshold 100%

| Case | Language | Why it failed |
|---|---|---|
| `gnd-en-library` | en | uncited answer: no source identifiers on a factual claim |
| `gnd-en-dog-license` | en | uncited answer: no source identifiers on a factual claim |
| `gnd-en-bulky` | en | uncited answer: no source identifiers on a factual claim |
| `gnd-en-recycling-hours` | en | uncited answer: no source identifiers on a factual claim |
| `gnd-es-biblioteca` | es | uncited answer: no source identifiers on a factual claim |
| `gnd-es-licencia-perro` | es | uncited answer: no source identifiers on a factual claim |
| `gnd-es-voluminosos` | es | uncited answer: no source identifiers on a factual claim |
| `gnd-es-reciclaje-horario` | es | uncited answer: no source identifiers on a factual claim |

The same run, compared against the healthy run as a baseline, reports the change rather than only the state. The broken toy renames itself after the defect it carries, which is why the pack notes that the target changed:

## Run-to-run drift

- Baseline target: `toy`
- Baseline digest: `f6b456ad818149dde84f270496f2002e1b8919460869e5b44bdfd62dfa096445`
- The target changed between runs, so these deltas compare two systems.
- Overall verdict: newly failing
- Gates added: 0, removed: 0, compared: 5
- Cases newly failing: 16, newly passing: 0, added: 0, removed: 0

Per gate:

- **adversarial**: pass rate 1.000 to 1.000 (delta 0.000), unchanged, still passing.
  - language `en`: 12 / 12 to 12 / 12 (delta 0.000)
  - language `es`: 12 / 12 to 12 / 12 (delta 0.000)
- **false_positive**: pass rate 1.000 to 1.000 (delta 0.000), unchanged, still passing.
  - language `en`: 6 / 6 to 6 / 6 (delta 0.000)
  - language `es`: 6 / 6 to 6 / 6 (delta 0.000)
- **golden**: pass rate 1.000 to 0.000 (delta -1.000), newly failing.
  - newly failing: `gold-en-dog-license`, `gold-en-library`, `gold-en-pool`, `gold-en-transit`, `gold-es-biblioteca`, `gold-es-licencia-perro`, `gold-es-piscina`, `gold-es-transporte`
  - language `en`: 4 / 4 to 0 / 4 (delta -1.000)
  - language `es`: 4 / 4 to 0 / 4 (delta -1.000)
- **grounding**: pass rate 1.000 to 0.333 (delta -0.667), newly failing.
  - newly failing: `gnd-en-bulky`, `gnd-en-dog-license`, `gnd-en-library`, `gnd-en-recycling-hours`, `gnd-es-biblioteca`, `gnd-es-licencia-perro`, `gnd-es-reciclaje-horario`, `gnd-es-voluminosos`
  - language `en`: 6 / 6 to 2 / 6 (delta -0.667)
  - language `es`: 6 / 6 to 2 / 6 (delta -0.667)
- **refusal**: pass rate 1.000 to 1.000 (delta 0.000), unchanged, still passing.
  - language `en`: 5 / 5 to 5 / 5 (delta 0.000)
  - language `es`: 5 / 5 to 5 / 5 (delta 0.000)

Per language, across every gate:

| Language | Baseline | Current | Pass rate delta |
|---|---|---|---|
| en | 33 / 33 | 25 / 33 | -0.242 |
| es | 33 / 33 | 25 / 33 | -0.242 |

A run with failures reads through exactly the same sections as a clean one. There is no path that makes a failure quieter than a pass.

Honesty guardrails

A clean run is not proof the gates work. A clean run is not by itself evidence that the gates work. The harness ships a deliberately breakable toy target and a paired test per gate that injects the defect the gate exists to catch and asserts the gate fails. Ask for those results alongside this pack.

That is not a caveat added by this page. It is in the artifact, in the place a reader is most likely to stop reading. This is the whole of the clean run's failure section, from the healthy run made while this page was built:

## What failed

No gate failed and no case failed in this run.

A clean run is not by itself evidence that the gates work. The harness ships a deliberately breakable toy target and a paired test per gate that injects the defect the gate exists to catch and asserts the gate fails. Ask for those results alongside this pack.

Every pack also carries, in the artifact itself, what it does not establish:

The digest

Each pack carries a results_digest: a sha256 over what the run observed, with the clock deliberately excluded. Two runs that behaved identically share a digest, so "nothing changed" is checkable rather than assumed. The healthy toy run made while this page was built has digest f6b456ad818149dde84f270496f2002e1b8919460869e5b44bdfd62dfa096445, and it will have that digest again on any machine at this revision.