gatelineAPI reference
CONTRACT_DISPUTE: RegExp = ...

D8's escalation reason, and the pattern that finds one again (#348).

Two readers match on this text rather than on a rule id, because the reason is all state.yaml records: observe.ts reads it to date the bounce budget from the last resolved dispute over that artifact, and Gatehouse's paused card (core/src/view-model/readiness.ts) reads it to say what a hand fix actually is. Core cannot import this — the layering runs record → sources → view-model, with nothing pointing at the orchestrator — so it matches on the same stable substrings instead. Reword the reason and both go quiet: keep <artifact> bounced at the head and is still malformed behind it, or fix both readers in the same change.