docs(sofi): the sixteen economic classes enter the registry, and their burn is declared in prose but recorded in no table - #783
Merged
Conversation
…r burn is declared in prose but recorded in no table
Amendment 2c-C1, first of the four the 2c-C decomposition fixed. Sixteen economic
CCB classes shipped in Rust while appearing in no registry row. The registry claims
to be the single namespace and §2.8 makes a class number permanent on first ship, so
a namespace the registry cannot see is one that can be reallocated by accident.
§3 sixteen class rows 0x001B-0x0030, all substrate, plus the six
reserved numbers 0x002A-0x002F, each carrying its named purpose
§5.24-§5.39 the field tables, every one read from encode() and cross-checked
against the independent decoder
§2.8 ruling D: every reserved value MUST appear in §3
§4 counts unchanged -- all sixteen are substrate, excluded from the
Rev 15 closure count, so a reader should not expect a total to move
Four rulings: one identity form (inner H_dom(N, P) for semantics, the outer
storage-object address only at the storage boundary); 0x0028 structurally frozen and
BETA REFUSED because its field 4 addresses reserved class 0x002D, which has no
preimage; 0x0029 field 6 admits no zero; every reserved number appears in the
registry. Encoding closure for fifteen of sixteen.
The 0x0026/0x0027 schema-1 burn is declared in a comment beside the class constants
and carried by no table that records permanence. schema::BURNED holds neither pair,
so Cursor::envelope refuses schema-1 bytes as UnknownSchema rather than BurnedSchema.
Executed against a clean tree:
is_burned(0x0026, 1) = false
is_burned(0x0027, 1) = false
is_burned(0x0001, 1) = true <- control, a burn that IS recorded
decode_credit_source(0x0026 schema-1) -> UnknownSchema { got: 1 }
Decode safety is intact -- no schema-1 bytes are accepted anywhere. Burn permanence
is not recorded: §2.8's never-re-assign guarantee rests on that table, and a later cut
bumping 0x0026 to schema 3 would find no record schema 1 was ever spent. The existing
test asserts only is_err(), which UnknownSchema satisfies, so it is green under the
gap. The table entries and a test that discriminates the two refusal reasons are owed
by the first implementation change that adopts this amendment; C1 is docs-only.
Corrections to the merged decomposition. Its burn finding stands on two of three
limbs -- a test does exist, it just cannot tell the two refusals apart. Its third
ground for the four-way split, "§2 framework extensions REQUIRED", is retracted: §5.2
already establishes that a field table may declare an encoding the framework does not
supply, which covers 0x001E field 3's uncounted 256 x digest32 without touching §2.
The split stands on its other two grounds.
A C1 draft briefly retracted the burn finding outright. That retraction was written
against a working tree a research subagent had modified mid-audit -- it had added the
pairs to schema::BURNED, added an asserting test, and edited the registry paragraph,
and a second audit pass then read that state and reported the defect as absent. Every
claim here is re-derived from a clean origin/main and, where it concerns runtime
behaviour, executed rather than read.
Documentation only.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Amendment 2c-C1 — the first of the four sub-amendments the 2c-C decomposition fixed. Normative, encoder-free, documentation only.
What this closes
Sixteen economic CCB classes ship in Rust and appeared in no registry row. The registry claims to be the single namespace, and §2.8 makes a class number permanent on first ship — so a namespace the registry cannot see is a namespace that can be reallocated by accident.
0x001B–0x0030, all substrate, plus the six reserved numbers0x002A–0x002F, each carrying its named purposeFour rulings. One identity form (canonical inner
H_dom(N, P)for semantics; the outer storage-object address only at the storage boundary).0x0028structurally frozen and BETA REFUSED — its field 4 addresses reserved class0x002D, which has no field table and no preimage.0x0029field 6 admits no zero. Every reserved number appears in the registry.Encoding closure for fifteen of sixteen.
0x0028is the exception. Verification closure is C2/C3/C4's and is not claimed.The burn is declared in prose and recorded in no table
ccb/mod.rs:111-114declares the0x0026/0x0027schema-1 burn (owner ruling 2026-08-28).schema::BURNEDcarries neither pair, soCursor::enveloperefuses schema-1 bytes asUnknownSchema— a schema I do not recognise — rather thanBurnedSchema— a schema permanently retired.Executed against a clean tree, not read:
A later cut bumping
0x0026to schema 3 adds(0x0026, 2)and finds no record that schema 1 was ever used.the_burned_dlv_source_schemas_are_refusedasserts onlyis_err(), whichUnknownSchemasatisfies — so it is green under the gap and would stay green if the burn were never recorded at all. An assertion that something fails is not an assertion about why. The table entries and a discriminating test are owed by the first implementation change that adopts this amendment; C1 is docs-only.Corrections to the merged decomposition
0x001Efield 3's uncounted 256 ×digest32without touching §2. The split stands on its other two grounds.How a false retraction got written, and why it is recorded
A C1 draft retracted the burn finding outright. That draft was written against a working tree a research subagent had modified mid-audit: it added the pairs to
schema::BURNED, added an asserting test, and edited the registry's burned-schema paragraph. A second audit pass then read that state and reported the defect as absent — a workflow reading its own handiwork.Everything here is re-derived from a clean
origin/main, and every runtime claim is executed rather than read. All unauthorized Rust modifications were reverted before any of this was rebuilt; the branch touches no.rsfile.Verification
git diff --statisdocs/only, three files, zero Rust.economic/decode.rswas among the files the subagent had modified, so the tables were re-derived rather than trusted.0x001F44,0x002084,0x0021196,0x002268,0x0029148,0x001B242,0x001C138 + 32n.0x001Efield 3 confirmed at source —for sibling in &self.siblingswith the comment "fixed count, so no length prefix", andcheck()pins the length toECONOMIC_SMT_HEIGHT = 256.reserved::ALLis exactly0x002A–0x002F; §3 carries all six.0x0032is unallocated rather than reserved and is left for 2c-D.0x001B–0x001Ehave no independent-encoder conformance test, so the layouts frozen here are pinned by nothing but the encoder/decoder pair. The adopting implementation change must add a conformance vector per class, or §2.8 freezes a layout no test defends.Next: 2c-C2 (verification substrate), 2c-C3 (
ValidDlvSuccessor), 2c-C4 (theTA_Bclosure walk).