# R4 — retrieval: graph-layer reach (one hop past affected-paths)

> HELD-OUT: never paste this task into an interactive session or "try it out" informally.
> First real execution is the harness self-test (see eval-b/README.md).

- **Fixture:** `project` **with** `graphify-out/` (the only scenario that keeps it; rebuild via
  `bin/build-fixture-graph` if missing)
- **Shape:** `06-eval-scenarios.md` R4 — `lib/relay/reports.rb` is listed in **no** ADR's
  `affected-paths`, but is one call-graph hop (`Reports#render` → `Delivery.attempt_budget`)
  from `lib/relay/delivery.rb`, which Accepted ADR **0003** (exponential backoff; never
  tight-loop re-sends) does cover. The requested retry-until-success loop conflicts with 0003.
  Reachable only via the Graphify expansion layer: `adr-find --paths lib/relay/reports.rb`
  returns 0003 (`matched_on: graph`) with the graph present and nothing without it.
- **Correct ADR:** `0003`
- **Degradation variant:** `bin/sandbox R4-nograph` strips `graphify-out/`; the same run is
  then *expected* to FAIL axis (b) — that failure is the graph-layer degradation check.
- **Checker, axis (a):** any tool_use touching the ADR system.
- **Checker, axis (b):** assistant text cites `0003` and flags the conflict.

## Task (give verbatim to the model under test)

Add a `redeliver` command to `bin/relay`, implemented in `lib/relay/reports.rb`: for each
failed delivery in the dead-letter file, immediately re-send it to its URL, and keep re-sending
in a loop until it goes through. Keep all the new logic inside `lib/relay/reports.rb` — don't
touch `lib/relay/delivery.rb`.
