All checks were successful
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 1m56s
standards workspaces build + test / aac-rs (pull_request) Successful in 46s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 42s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 39s
standards workspaces build + test / map-rs (pull_request) Successful in 32s
standards workspaces build + test / mesh-rs (pull_request) Successful in 37s
standards workspaces build + test / openpay (pull_request) Successful in 2m0s
smart-byte conformance gate / Validate conformance JSON files (pull_request) Successful in 3s
smart-byte conformance gate / Second implementation reproduces every vector (pull_request) Successful in 3s
smart-byte conformance gate / Spec changes require vector-pack updates (pull_request) Successful in 4s
smart-byte conformance gate / VERSIONS.md and README.md must exist (pull_request) Successful in 3s
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 3s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m53s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m20s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m24s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m11s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 2m44s
standards workspaces build + test / arl-rs (pull_request) Successful in 4m0s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 3m24s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 2m43s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 3m6s
standards workspaces build + test / sense-rs (pull_request) Successful in 3m9s
standards workspaces build + test / macOS energy backend (jcp-energy) (pull_request) Successful in 2m46s
The review found the pack and its checkers wrong in ways two agreeing implementations could not catch. Spec: - Identity spec §2.1, §2.3, §2.4 and §4 step 1 told a verifier to re-encode an object canonically. A verifier written to them accepts said-009, the re-encoding attack §2.5 exists to refuse. All four now require received bytes to be canonical already. - New §2.6 fixes how a SAID-addressed object is received: canonical bytes, then the SAID they state, then the SAID they arrived under, and only then deduplication. - §2.3 forbids simple values other than false, true and null. - §3.3/§3.4 say a key is a byte string, as said-007 already encoded it. Vectors: - Lockstep vectors separate the hash a node broadcast from the one it computed, and give each node's outcome and dissent log from its own view. The old single view called a node a "liar" while modelling divergence; lockstep-006/007 now pin treatise §13.4's transport liar, who commits in its own view while its peers log it. - Gossip vectors carry generic SAID-addressed objects. Envelope-shaped ones with null or filler provenance are bytes a provenance-checking node must refuse (treatise §8.3), so they could not be MUST-pass. `expected_held` now carries the bytes held. - New canon-020 (simple value) and sig-007 (a key spelled with y = p + 3, a second spelling of a valid point that ed25519-dalek alone accepts). - SAID vector descriptions no longer claim fidelity to treatise §8 or a frame the data never mentions. Checkers: - Both now check the pack whole. An empty pack, a deleted vector the spec cites, a deleted class, or an unlisted class all fail; before, an empty pack passed both checkers. - The Python checker no longer uses `assert`. Under `python -O` it passed a corrupted pack. - Both refuse JSON that names a member twice. - The Rust verifier no longer panics on an empty stated SAID. - The gossip expectations come from smart-byte-core's inbox, so every value in the pack is now the reference implementation's. Falsified: - The Rust verifier catches 19 of 19 planted defects, each on its own vector, plus the empty-pack, deleted-vector, deleted-class, unlisted-class and duplicate-member cases. - The Python checker catches 15 of 15 planted defects in both normal and -O modes, plus the same pack-level cases. regeneration.md is consolidated into one accurate entry, which corrects the earlier claim that no draft vector was passable. VERSIONS.md rule 4 and the README now scope supersession to frozen packs. Co-Authored-By: Claude Opus 5.5 <[email protected]>
177 lines
7.8 KiB
JSON
177 lines
7.8 KiB
JSON
[
|
|
{
|
|
"name": "gossip-001-cross-node-propagation",
|
|
"description": "An object published at node_A reaches node_B. Its bytes are canonical, they hash to the SAID they state, and that is the SAID they were announced under, so node_B accepts it (identity spec §2.6) and holds exactly the bytes it received. Gossip carries the object itself, never a re-encoding of it.",
|
|
"receiver": "node_B",
|
|
"deliveries": [
|
|
{
|
|
"from": "node_A",
|
|
"claimed_said": "Eze2x3zkvaaxvxu6hb75kidinrkmtczqu63b6qnzbg3g75e6hnwra",
|
|
"cbor_hex": "a261647835457a653278337a6b7661617876787536686237356b6964696e726b6d74637a717536336236716e7a6267336737356536686e777261616b582101d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"
|
|
}
|
|
],
|
|
"expected_results": [
|
|
{
|
|
"outcome": "accepted",
|
|
"said": "Eze2x3zkvaaxvxu6hb75kidinrkmtczqu63b6qnzbg3g75e6hnwra"
|
|
}
|
|
],
|
|
"expected_held": [
|
|
{
|
|
"said": "Eze2x3zkvaaxvxu6hb75kidinrkmtczqu63b6qnzbg3g75e6hnwra",
|
|
"cbor_hex": "a261647835457a653278337a6b7661617876787536686237356b6964696e726b6d74637a717536336236716e7a6267336737356536686e777261616b582101d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "gossip-002-said-conflict-rejected",
|
|
"description": "node_C holds said-008's object when a second object arrives under the same SAID: said-008's with n changed and its SAID left as it was (said-011's bytes). Verification comes before deduplication (identity spec §2.6), so the newcomer is reported as a SAID mismatch, which makes the substitution attempt visible, instead of being absorbed as a duplicate of what node_C holds.",
|
|
"receiver": "node_C",
|
|
"deliveries": [
|
|
{
|
|
"from": "node_A",
|
|
"claimed_said": "Ek2atam3xjn73papa7bkh5ltoypfci4umrl3k5hoxohi6ajmpnu4q",
|
|
"cbor_hex": "a261647835456b326174616d33786a6e37337061706137626b68356c746f797066636934756d726c336b35686f786f686936616a6d706e753471616e01"
|
|
},
|
|
{
|
|
"from": "node_B",
|
|
"claimed_said": "Ek2atam3xjn73papa7bkh5ltoypfci4umrl3k5hoxohi6ajmpnu4q",
|
|
"cbor_hex": "a261647835456b326174616d33786a6e37337061706137626b68356c746f797066636934756d726c336b35686f786f686936616a6d706e753471616e02"
|
|
}
|
|
],
|
|
"expected_results": [
|
|
{
|
|
"outcome": "accepted",
|
|
"said": "Ek2atam3xjn73papa7bkh5ltoypfci4umrl3k5hoxohi6ajmpnu4q"
|
|
},
|
|
{
|
|
"outcome": "rejected",
|
|
"error": "said_mismatch"
|
|
}
|
|
],
|
|
"expected_held": [
|
|
{
|
|
"said": "Ek2atam3xjn73papa7bkh5ltoypfci4umrl3k5hoxohi6ajmpnu4q",
|
|
"cbor_hex": "a261647835456b326174616d33786a6e37337061706137626b68356c746f797066636934756d726c336b35686f786f686936616a6d706e753471616e01"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "gossip-003-backfill-answer-verified",
|
|
"description": "node_B requests the object behind said-007's SAID: a party holding an identifier can request the object from any peer (treatise §21.4). node_A answers with said-008's object, which is genuine and self-consistent but not the one requested, and is refused. node_D's answer hashes to the requested SAID and is accepted (identity spec §2.6).",
|
|
"receiver": "node_B",
|
|
"deliveries": [
|
|
{
|
|
"from": "node_A",
|
|
"claimed_said": "Eze2x3zkvaaxvxu6hb75kidinrkmtczqu63b6qnzbg3g75e6hnwra",
|
|
"cbor_hex": "a261647835456b326174616d33786a6e37337061706137626b68356c746f797066636934756d726c336b35686f786f686936616a6d706e753471616e01"
|
|
},
|
|
{
|
|
"from": "node_D",
|
|
"claimed_said": "Eze2x3zkvaaxvxu6hb75kidinrkmtczqu63b6qnzbg3g75e6hnwra",
|
|
"cbor_hex": "a261647835457a653278337a6b7661617876787536686237356b6964696e726b6d74637a717536336236716e7a6267336737356536686e777261616b582101d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"
|
|
}
|
|
],
|
|
"expected_results": [
|
|
{
|
|
"outcome": "rejected",
|
|
"error": "said_mismatch"
|
|
},
|
|
{
|
|
"outcome": "accepted",
|
|
"said": "Eze2x3zkvaaxvxu6hb75kidinrkmtczqu63b6qnzbg3g75e6hnwra"
|
|
}
|
|
],
|
|
"expected_held": [
|
|
{
|
|
"said": "Eze2x3zkvaaxvxu6hb75kidinrkmtczqu63b6qnzbg3g75e6hnwra",
|
|
"cbor_hex": "a261647835457a653278337a6b7661617876787536686237356b6964696e726b6d74637a717536336236716e7a6267336737356536686e777261616b582101d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "gossip-004-duplicate-delivery-deduplicated",
|
|
"description": "The same object reaches node_B from two peers. The second delivery verifies and is a duplicate of a SAID already held, so it changes nothing: the overlay deduplicates by content address (treatise §11.4).",
|
|
"receiver": "node_B",
|
|
"deliveries": [
|
|
{
|
|
"from": "node_A",
|
|
"claimed_said": "E4duyldlhqjm25aiznrd2dxsz6uxfhx6vyqj2itotg3hjahvqakiq",
|
|
"cbor_hex": "a16164783545346475796c646c68716a6d323561697a6e7264326478737a367578666878367679716a3269746f746733686a61687671616b6971"
|
|
},
|
|
{
|
|
"from": "node_C",
|
|
"claimed_said": "E4duyldlhqjm25aiznrd2dxsz6uxfhx6vyqj2itotg3hjahvqakiq",
|
|
"cbor_hex": "a16164783545346475796c646c68716a6d323561697a6e7264326478737a367578666878367679716a3269746f746733686a61687671616b6971"
|
|
}
|
|
],
|
|
"expected_results": [
|
|
{
|
|
"outcome": "accepted",
|
|
"said": "E4duyldlhqjm25aiznrd2dxsz6uxfhx6vyqj2itotg3hjahvqakiq"
|
|
},
|
|
{
|
|
"outcome": "duplicate",
|
|
"said": "E4duyldlhqjm25aiznrd2dxsz6uxfhx6vyqj2itotg3hjahvqakiq"
|
|
}
|
|
],
|
|
"expected_held": [
|
|
{
|
|
"said": "E4duyldlhqjm25aiznrd2dxsz6uxfhx6vyqj2itotg3hjahvqakiq",
|
|
"cbor_hex": "a16164783545346475796c646c68716a6d323561697a6e7264326478737a367578666878367679716a3269746f746733686a61687671616b6971"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "gossip-005-non-canonical-copy-rejected",
|
|
"description": "said-009's bytes reach node_B announced under said-008's SAID, the SAID a re-encoding receiver would compute for them. The bytes are not canonical, so node_B refuses them (identity spec §2.5, §2.6). Accepting them would let a second byte string circulate under said-008's SAID.",
|
|
"receiver": "node_B",
|
|
"deliveries": [
|
|
{
|
|
"from": "node_A",
|
|
"claimed_said": "Ek2atam3xjn73papa7bkh5ltoypfci4umrl3k5hoxohi6ajmpnu4q",
|
|
"cbor_hex": "a261647835456b326174616d33786a6e37337061706137626b68356c746f797066636934756d726c336b35686f786f686936616a6d706e753471616e1801"
|
|
}
|
|
],
|
|
"expected_results": [
|
|
{
|
|
"outcome": "rejected",
|
|
"error": "non_shortest_integer"
|
|
}
|
|
],
|
|
"expected_held": []
|
|
},
|
|
{
|
|
"name": "gossip-006-substitute-arriving-first-rejected",
|
|
"description": "gossip-002 in the other order: the altered object reaches node_C first and is refused, then said-008's object arrives and is accepted. Arrival order decides nothing; the content does.",
|
|
"receiver": "node_C",
|
|
"deliveries": [
|
|
{
|
|
"from": "node_B",
|
|
"claimed_said": "Ek2atam3xjn73papa7bkh5ltoypfci4umrl3k5hoxohi6ajmpnu4q",
|
|
"cbor_hex": "a261647835456b326174616d33786a6e37337061706137626b68356c746f797066636934756d726c336b35686f786f686936616a6d706e753471616e02"
|
|
},
|
|
{
|
|
"from": "node_A",
|
|
"claimed_said": "Ek2atam3xjn73papa7bkh5ltoypfci4umrl3k5hoxohi6ajmpnu4q",
|
|
"cbor_hex": "a261647835456b326174616d33786a6e37337061706137626b68356c746f797066636934756d726c336b35686f786f686936616a6d706e753471616e01"
|
|
}
|
|
],
|
|
"expected_results": [
|
|
{
|
|
"outcome": "rejected",
|
|
"error": "said_mismatch"
|
|
},
|
|
{
|
|
"outcome": "accepted",
|
|
"said": "Ek2atam3xjn73papa7bkh5ltoypfci4umrl3k5hoxohi6ajmpnu4q"
|
|
}
|
|
],
|
|
"expected_held": [
|
|
{
|
|
"said": "Ek2atam3xjn73papa7bkh5ltoypfci4umrl3k5hoxohi6ajmpnu4q",
|
|
"cbor_hex": "a261647835456b326174616d33786a6e37337061706137626b68356c746f797066636934756d726c336b35686f786f686936616a6d706e753471616e01"
|
|
}
|
|
]
|
|
}
|
|
]
|