protocol: bind the gated-field list to the call sites it claims #233
No reviewers
Labels
No labels
priority/P0
priority/P1
priority/P2
release/v0.1.0
status/blocked
status/planned
type/bug
type/design
type/test-gap
type/tracker
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
natsukium/felis!233
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-175"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
GATED_FIELDSrecorded every post-baseline field twice — once in a hand-written list, once at theRequires::whencall site inside the owningrequires()arm — with nothing binding the two. Deleting a call site left the field listed and claimed by the prose ledger while the send gate quietly stopped authorizing it, and the ledger-coverage test could not see it because it walked the list rather than the gate.Each gated field is now one table entry pairing its requirement with the predicate that decides whether a value carries it (
GatedField<T>), and arequiresimpl folds its owner's table instead of naming fields one by one. The listgated_fields()reports is derived from those entries, so a field cannot be listed without a call site. A new per-field test (every_gated_field_is_authorized_where_it_is_carried) closes the remaining freedom: for each field it routes a message that omits it and a message that carries it through the owning impl, requiring the carrier to answer exactly the field's declared requirement. Removing a table fold from anyrequiresimpl fails it, naming the field.just checkpasses (fmt, clippy, 3428 nextest tests, deny, proto-compat, release self-test).Fixes #175