Grade 0 (D-093) had ghost fn/ghost let sitting fully parsed and
inert, a real foothold to finish. Grade 1 has no such foothold —
grep confirms nothing named linear/once/grade exists in the parser,
and the protocol/session/process surface that does parse (a
substantial protocol-declaration feature, ItemKind::Protocol in HIR)
reaches nothing in strata-check and isn't a usable substitute for
D-039's capability-token value anyway.
v0 adds the smallest real new surface: a `linear let` qualifier,
structurally identical to `ghost let`, deliberately not D-039's full
Capability<Resource> type or acquire/release operators (declining the
same scope-multiplication D-093 already declined once). The actual
new infrastructure is the checking discipline itself: local_taint's
flat HashMap<LocalId, bool> OR-taint can't express linearity (an
either-arm-consumed fact needs to be a type error, a both-arms-consumed
fact needs to be accepted as one use, and a flat boolean gets this
backwards). local_linear tracks per-binding Zero/One/Many use counts
with a real join rule at CheckedExprKind::Select, plus an end-of-scope
sweep rejecting never-consumed bindings — genuinely new, since grade-0
and mem-taint are pure rejection-at-sink checks with no "did you
finish" obligation.
match-as-statement and if-without-else stay out of scope because
StatementKind::If/Match don't exist in HIR at all yet — confirmed via
direct inspection, not assumed.
OP-7's disposition is sharper than grade 0's: delay/Later/feedback
have zero code representation anywhere, so the trap isn't excluded by
a checking rule, there's no position in the checker for it to occupy
at all. D-093's FIX-ω commitment is restated as a binding obligation:
whoever implements delay/Later checking must, in the same change,
either ω-promote linear references inside next arguments or reject
them until that promotion ships.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
a0828f6543versecafe committed on 8/20/2026, 3:51:51 AMparent04eb9cf