Arising from dec-0003 — No model client in the binary — semantic extraction is delegated to the live session
The regex tier stages decisions only, and `alternatives` is required except when staged
`dira sniff` may stage **decisions** and nothing else. `alternatives` gains `minItems: 1` in the schema, waived only while `state: staged`.
What this fixes that was actually broken
`alternatives: []` validated against `entry.schema.json` and was **rejected** by the Go validator. Two halves of the same rule disagreed, and neither test noticed, because each was only ever run against the other's happy path. That is the fifth instance this month of a check agreeing with itself rather than with reality — see `docs/lore.md` L-0001.
A weakness this exposed in dec-0003's reasoning
`dec-0003` argues for no model client partly by asserting that "regex reliably catches decision *language*", and names `"let's go with"` and `"we're not doing"` as its examples. Measured across this machine's stored sessions, those two phrases appear in **12 and 2 transcripts respectively**, against roughly **1,100 each** for `"instead of"` and `"rather than"`. In the single session E2-L1 measured in full, both named phrases occur **zero** times.
**This does not overturn `dec-0003` — it strengthens its conclusion and falsifies its illustration.** If the phrases regex is supposed to reliably catch are two orders of magnitude rarer than the ones people actually use, then the regex tier is *weaker* than `dec-0003` assumed, and the semantic tier it argues for is more necessary rather than less. The decision stands; the example in it should not be quoted as evidence again.
The corrected reading: regex catches decision *shape* — an imperative followed by a contrast — not a fixed vocabulary. `"rather than"` and `"instead of"` are the real handles, and both are far too common to use alone, which is precisely why the tier may only stage.
Alternatives on record — 3
✗Let the regex tier stage questions and intents as well as decisionsrefused Precision is the binding constraint, not coverage.
A tier that stages twenty candidates a session trains the human to reject reflexively, and a reflexive rejector is worse than no capture at all because it also destroys trust in the staged queue. Measured detection is 92% on the frozen corpus and roughly 73% precision out of sample; widening the kinds would move both the wrong way.
revisit ifout-of-sample precision on decisions holds above 90% across several unrelated sessions
✗Keep `alternatives` optional for every state, as the schema had itrefused It hid a real disagreement nothing tested: `alternatives: []` validated against entry.schema.json and was rejected by the Go validator, so the two halves of the same rule disagreed in the case that matters.
A decision with no recorded rejection is exactly the entry `dira check` cannot use.
✗Require `alternatives` unconditionally, including on staged entriesrefused The regex tier cannot extract a rejected alternative with its reason - that is the semantic tier's job - so this would make it impossible for sniff to stage anything at all, which is the whole point of having a cheap first pass.
The regex tier cannot extract a rejected alternative with its reason - that is the semantic tier's job - so this would make it impossible for sniff to stage anything at all, which is the whole point of having a cheap first pass.