THE DECLARATION SET, hashed — the contract's GRAMMAR with every number removed.
Which rows exist, which fields each declares, which are per-instance, and the MEMBERS of every
enumerated field. Not the bounds, not the step, not the unit, not the default.
That split is the whole point. A limit moving from 36 to 40 dB changes the fingerprint and not
this; a field appearing, a row landing or a value joining a menu changes both. So the version
ratchet can demand a MINOR BUMP for the second and merely a listed line for the first, which
is exactly the operator's rule — when we change the grammar we increase the minor version —
made mechanical instead of remembered.
Member values are part of the GRAMMAR rather than the state: a client renders a menu from them,
so one appearing or leaving changes what a client can say, which a bound moving does not.
THE DECLARATION SET, hashed — the contract's GRAMMAR with every number removed.
Which rows exist, which fields each declares, which are per-instance, and the MEMBERS of every enumerated field. Not the bounds, not the step, not the unit, not the default.
That split is the whole point. A limit moving from 36 to 40 dB changes the fingerprint and not this; a field appearing, a row landing or a value joining a menu changes both. So the version ratchet can demand a MINOR BUMP for the second and merely a listed line for the first, which is exactly the operator's rule — when we change the grammar we increase the minor version — made mechanical instead of remembered.
Member values are part of the GRAMMAR rather than the state: a client renders a menu from them, so one appearing or leaving changes what a client can say, which a bound moving does not.