Task
Mirror-bond promotion (bond_verify.rs / mirror_bond.rs, activated by PR #501) decides rank from a chain read that is single-source and uncorroborated: chain_source() asks coinset first and, on failure, ONE dialled chia peer whose own doc says "the peers do not corroborate the answer" (trustless: false). Nothing checks block inclusion. A peer in the chia peer set can therefore return a self-consistent fabricated coin that declares its own peer id and take rank 0 at zero collateral. Bring this read under NC-12: agreement across the ~5 concurrently-held untrusted chia peers (or coinset + at least one independent peer agreeing on coin id, puzzle hash, amount, spent state and confirmed height) before a verdict of Bonded is produced; disagreement or insufficient sources → Unverified, never Bonded.
Context
Effort
High — custody-adjacent decision, quorum semantics, failure direction matters (fails-closed to Unverified).
Scope
Only the verdict path that produces Bonded. Do not widen to the census or spends unless they share the exact helper.
Evidence
A test with a chain-source double where one of N sources returns a fabricated coin and the others do not → verdict Unverified; and where all agree → Bonded. Cite the test names and the SPEC §25.6a change in the PR.
Priority
High (money path). kind:business — a fabricated coin taking rank 0 moves $DIG to the wrong party.
Task
Mirror-bond promotion (
bond_verify.rs/mirror_bond.rs, activated by PR #501) decides rank from a chain read that is single-source and uncorroborated:chain_source()asks coinset first and, on failure, ONE dialled chia peer whose own doc says "the peers do not corroborate the answer" (trustless: false). Nothing checks block inclusion. A peer in the chia peer set can therefore return a self-consistent fabricated coin that declares its own peer id and take rank 0 at zero collateral. Bring this read under NC-12: agreement across the ~5 concurrently-held untrusted chia peers (or coinset + at least one independent peer agreeing on coin id, puzzle hash, amount, spent state and confirmed height) before a verdict ofBondedis produced; disagreement or insufficient sources →Unverified, neverBonded.Context
59a0331: feat(mirror): activate bond promotion on the coin's own peer declaration #501 (comment)chain_source()(crates/dig-wallet/src/sage/chain.rs), which the light client already corroborates for sync-status (NC-12 in.claude/skills/normative-contract). Reuse that quorum path (quorum.rs) rather than building a second one — §2.0 centralize rivals.SPEC.md§25.6a naming the assumption; this ticket removes the assumption.Effort
High — custody-adjacent decision, quorum semantics, failure direction matters (fails-closed to
Unverified).Scope
Only the verdict path that produces
Bonded. Do not widen to the census or spends unless they share the exact helper.Evidence
A test with a chain-source double where one of N sources returns a fabricated coin and the others do not → verdict
Unverified; and where all agree →Bonded. Cite the test names and the SPEC §25.6a change in the PR.Priority
High (money path).
kind:business— a fabricated coin taking rank 0 moves $DIG to the wrong party.