@@ -204,6 +204,86 @@ authorizes or changes delivery.
204204 reached its ordinary end — clears it; an unclassified failure leaves a
205205 standing rejection standing. Delivery semantics are unchanged.
206206
207+ ### Must separate what is wrong from what is being asked
208+
209+ - ** OHS-R17 Condition is its own axis:** The record carries a tagged
210+ ` condition ∈ clear | fault ` , published under its own record version so the
211+ meaning of a version's bytes stays decidable from those bytes. A fault
212+ carries a CLOSED `category ∈ authentication | account | quota | rateLimit |
213+ provider | context | configuration | policy | harness` — closed because
214+ consumers route on it — an OPEN, provider-namespaced ` code ` for diagnostic
215+ granularity, a ` recovery ∈ automatic | human | terminal | unknown ` , and its
216+ own semantic observation time. Provider prose is diagnostic only; no
217+ consumer branches on it. A category word outside the closed set leaves the
218+ fault UNTYPED and still routed by its recovery: neither borrowing a
219+ neighbouring category nor discarding the whole observation is acceptable,
220+ because the first invents a claim and the second makes a real fault stop
221+ being reported. Versions without the axis project it as EXPLICITLY absent —
222+ never ` clear ` , and no fault is inferred from their legacy words.
223+ - ** OHS-R18 An ask is an actual human prompt:** The ask axis is tagged so
224+ ` none ` , ` pending ` with its kind, and ` unknown ` are three distinct
225+ statements, and it speaks only about prompts. A fault is not an ask: a
226+ throttled provider asks nobody anything. Where a fault and an ask coexist,
227+ remediation is primary and the ask remains visible on the raw axis.
228+ - ** OHS-R19 Strict edges, typed indeterminacy:** A record whose OBSERVATION
229+ axes contradict each other is not a weaker observation; it is not an
230+ observation. Every rejection carries its own reason word — a ` clear `
231+ bearing fault evidence, a fault missing recovery or its observation time, a
232+ recovery deadline on a recovery this version recognizes as non-automatic,
233+ an inverted deadline, an ask that names a kind while claiming none — so an
234+ operator can tell a producer bug from a stale seat and one bug from
235+ another. Rejection is scoped to what the contradiction actually damages:
236+ strictness must not destroy evidence. A deadline beside an UNRECOGNIZED
237+ recovery word is kept, because that class may be automatic in a version
238+ the reader predates and rejecting it would turn a fault that pages into a
239+ non-paging row; and a badly stated conversation reference degrades only
240+ that axis, because a broken side-channel is not evidence about the harness.
241+ Indeterminacy is exposed TYPED, carrying that word and the age of the
242+ evidence it was derived from when the bytes carried a usable stamp; the
243+ legacy scalar reason remains a projection of the same single value and is
244+ never derived independently.
245+ - ** OHS-R20 Two clocks:** Transport freshness and semantic observation are
246+ separate. The heartbeat proves only that a writer still holds evidence; it
247+ never moves a fault's observation time or its recovery deadline, and
248+ attention is derived at READ time. An ` automatic ` recovery past its own
249+ deadline becomes an untyped, unknown-recovery fault that pages until an
250+ explicit paired clear, a terminal record, a new claim, or a new incarnation
251+ replaces it — a recovery that missed its own deadline is no longer evidence
252+ of anything automatic.
253+ - ** OHS-R21 One shared disposition:** st2 owns normalization and publishes
254+ ONE derived disposition — exactly three closed axes: a state, how soon a
255+ human is needed, and what that human would do first — from one pure
256+ function, exposed on the roster, the catalog graph, and Doctor. Consumers
257+ read it; none re-derives urgency, because two independent derivations are
258+ how one consumer starts paging for what another ignores. Raw activity, the
259+ actual human ask, the condition, and recovery stay orthogonal and ride
260+ beside it, so a consumer that disagrees can see exactly what was folded.
261+ Ended and record-level indeterminate never page. A native-driver diagnostic
262+ failure contributes through the same function — it is a fault the harness
263+ could not report itself — and still never changes delivery.
264+ - ** OHS-R22 Conversation reference is identity and capability:** The
265+ conversation bridge is tagged ` linked | unavailable | unsupported ` , and a
266+ linked reference carries the driver's namespace, the provider's opaque
267+ conversation identity, the runtime incarnation, an explicit history
268+ mutability claim with the evidence for it, and a FINITE verification bound
269+ so a consumer ages the claim instead of trusting it forever. A record that
270+ states nothing about a conversation claims no capability, which is distinct
271+ from ` unsupported ` . Conversation content stays out of the record entirely.
272+ A ` linked ` reference that is not fully stated is not trusted and not
273+ discarded either: it degrades to ` unavailable ` carrying st2's own closed
274+ rejection word — never provider prose — and the observation's activity,
275+ condition, and ask axes stand untouched.
276+ - ** OHS-R23 Reader-first activation with a positive drain gate:** A record
277+ version is read, strictly validated, and projected before any writer emits
278+ it, and exactly one writer-selection point decides which version this build
279+ writes. Every projected row carries the EXACT version its record declared,
280+ including versions the build cannot interpret, so a migration's drain gate
281+ is positive — "every row reads the new version" is checkable, while "no row
282+ is still the old one" is not checkable from any absence. The ownership
283+ envelope is version-independent, so a claim honors the schema fence and the
284+ ownership sequence of a record whose meaning it cannot read rather than
285+ treating those bytes as an empty seat.
286+
207287## Evidence
208288
209289The measurements are #268 's, taken 2026-08-16/17 on one host and carried with
0 commit comments