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.
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.yamlrecords:observe.tsreads 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> bouncedat the head andis still malformedbehind it, or fix both readers in the same change.