# JIT plan — failed-command diagnostics keep the decisive line (→ omp-spt 0.7.1)

> Opened 2026-09-06 after doyle's F-037 answer. The 0.7.0 subagent field report cited
> `ER_HOSTED_PROBE:no-row` as the bind refusal; it is not — it is an eager reserved-id probe
> diagnostic that core prints ahead of the real `CONFLICT:<id> is live under session <sid>`
> refusal (spt-bs-releases#279). Our log never held the CONFLICT line because `runSpt`
> summarises a failed command by its first non-empty output line.

## Scope

- `REQ-BIND-REFUSAL-DIAGNOSTIC` (doc, impl, unit): a failed `spt` command is summarised by the
  first line that is not a known diagnostic (`ER_HOSTED_PROBE:`), and its whole output travels
  with the error into the log line, so a refusal printed after a diagnostic is never lost.
- Record corrections: F-037 rewritten to cite the published `api bind` ownership sentence and
  the CONFLICT line; KNOWN-HAZARDS #15 and PARITY row 49 stop calling the probe the guard;
  PARITY rows 46/47 (shortform outcomes, inline sender proof) record what 0.4.0 shipped
  (`DISPATCH_RESULTS`) instead of "gap → phase 2".

## Out of scope

- The RECV-silence watchdog (`REQ-HAZARD-LISTENER-EMIT-SILENCE`): waits on doyle's answer to the
  poll/listen consume-cursor question (asked 2026-09-06 10:23 UTC). Next plan.
- Usage-limit hold end-to-end field check: needs a real provider refusal.

## Tasks

1. `traceable-reqs.toml`: add `REQ-BIND-REFUSAL-DIAGNOSTIC`.
2. Extension: `failureDetail(output)` + `errorFields(error)`; `runSpt` close path attaches
   `error.output`; `logError` and the bind catch log the full capture.
3. Test `testBindRefusalKeepsTheDecisiveLine` (runSpt summary/output; activation log carries it).
4. Docs: harness-contract Failure behavior paragraph; F-037; KNOWN-HAZARDS #15; PARITY rows
   46/47/49; CHANGELOG 0.7.1.
5. Gate + release 0.7.1 per `docs/RELEASE-RUNBOOK.md`; `spt adapter update omp-spt`; restart
   hertz; report doyle.
