|
| 1 | +{ |
| 2 | + "spec_version": "anchor-self-certify-ref-v1", |
| 3 | + "description": "Reference shape for self-certify + on-chain anchor conformance. Four joins required before anchoring_invariant can flip: signer identity, action_ref recomputation, trail record binding, registry transition. One positive vector; three negatives covering the most common ways an anchor can look valid while failing the governance claim.", |
| 4 | + "vectors": [ |
| 5 | + { |
| 6 | + "id": "anchor-self-certify-all-joins-pass", |
| 7 | + "description": "Positive baseline: all four joins satisfied. Signer identity resolves to declared agent_id. action_ref recomputes from canonical response (governance block excluded). Trail record binds to same action_ref and exposes accepted anchor. block_time * 1000 < outcome_ts_ms. Registry row flips to anchored.", |
| 8 | + "expected": "PASS", |
| 9 | + "joins": { |
| 10 | + "signer_identity": { |
| 11 | + "governance_signing_key": "3d54caa2a1f4b8e7c2d9f0a3b6e1c4f7d2a5b8e3c6f1d4a7b0e3c6f9d2a5b8e1", |
| 12 | + "declared_agent_id": "moyan-governance-v1", |
| 13 | + "key_resolves_to_agent": true, |
| 14 | + "resolution_source": "sixu-ai.net.cn/.well-known/auth.md" |
| 15 | + }, |
| 16 | + "action_ref": { |
| 17 | + "canonical_response_hash": "906a51a3be93e9ab5c4911080b2e1dc4ad07bbbc9711aa997f212ea95257008c", |
| 18 | + "governance_block_normalization": "excluded_once", |
| 19 | + "action_ref_recomputed": "a4f7b2e5c8d1f4a7b0e3c6f9d2a5b8e1c4f7d0a3b6e9c2f5d8a1b4e7c0f3d6b9", |
| 20 | + "action_ref_matches_submitted": true |
| 21 | + }, |
| 22 | + "trail_record": { |
| 23 | + "trail_id": "e1b4a7c0-f3d6-b9e2-c5a8-f1d4b7e0c3a6", |
| 24 | + "action_ref_in_trail": "a4f7b2e5c8d1f4a7b0e3c6f9d2a5b8e1c4f7d0a3b6e9c2f5d8a1b4e7c0f3d6b9", |
| 25 | + "anchor_point": { |
| 26 | + "method": "on-chain", |
| 27 | + "chain": "arbitrum-one", |
| 28 | + "tx_hash": "b1e4a7c0f3d6b9e2c5a8f1d4b7e0c3a6f9d2b5e8a1c4f7d0b3e6c9f2a5d8b1e4", |
| 29 | + "block_time": 1782680000 |
| 30 | + }, |
| 31 | + "trail_binds_to_action_ref": true |
| 32 | + }, |
| 33 | + "registry_transition": { |
| 34 | + "outcome_ts_ms": 1782680599000, |
| 35 | + "precedence_check": "block_time * 1000 < outcome_ts_ms", |
| 36 | + "precedence_check_value": "1782680000000 < 1782680599000", |
| 37 | + "precedence_margin_ms": 599000, |
| 38 | + "existence_verified": true, |
| 39 | + "precedence_verified": true, |
| 40 | + "allowed_to_flip": true |
| 41 | + } |
| 42 | + }, |
| 43 | + "board_result": { |
| 44 | + "displayed_claim_level": "anchor_precedence_verified", |
| 45 | + "blocked_reason": null, |
| 46 | + "registry_row": "anchored" |
| 47 | + } |
| 48 | + }, |
| 49 | + { |
| 50 | + "id": "wrong-signing-key-for-declared-identity", |
| 51 | + "description": "Signer identity join fails: the governance signing key used for self-certify does not resolve to the declared agent_id. The key is well-formed and the signature is valid — but the key belongs to a different identity. Self-certify creates a candidate record only; the board cannot advance to anchoring_invariant.", |
| 52 | + "expected": "FAIL", |
| 53 | + "failure_mode": "self_certify_signature_invalid", |
| 54 | + "failure_detail": "governance_signing_key resolves to 'other-agent-v1', not 'moyan-governance-v1'. A valid signature from the wrong key is not admission. Identity join fails; remaining joins not evaluated.", |
| 55 | + "joins": { |
| 56 | + "signer_identity": { |
| 57 | + "governance_signing_key": "9f2c5a8b1d4e7f0c3a6b9e2c5f8d1b4e7a0c3f6d9b2e5a8c1f4d7b0e3a6f9c2d5", |
| 58 | + "declared_agent_id": "moyan-governance-v1", |
| 59 | + "key_resolves_to_agent": false, |
| 60 | + "key_resolves_to": "other-agent-v1", |
| 61 | + "resolution_source": "sixu-ai.net.cn/.well-known/auth.md" |
| 62 | + } |
| 63 | + }, |
| 64 | + "board_result": { |
| 65 | + "displayed_claim_level": null, |
| 66 | + "blocked_reason": "self_certify_signature_invalid: signing key does not resolve to declared agent_id", |
| 67 | + "registry_row": "rejected" |
| 68 | + } |
| 69 | + }, |
| 70 | + { |
| 71 | + "id": "action-ref-derived-from-wrong-canonical", |
| 72 | + "description": "Action_ref join fails: the submitted action_ref was derived from a different canonical response — governance block excluded from a different envelope version. Identity join passes; action_ref recomputation produces a different hash than submitted. Trail cannot be bound.", |
| 73 | + "expected": "FAIL", |
| 74 | + "failure_mode": "action_ref_mismatch", |
| 75 | + "failure_detail": "Submitted action_ref a4f7b2e5... does not recompute from the canonical response with governance block excluded exactly once. Referee derives b7e0c3a6... instead. action_ref join fails; trail_record and registry_transition joins not evaluated.", |
| 76 | + "joins": { |
| 77 | + "signer_identity": { |
| 78 | + "key_resolves_to_agent": true |
| 79 | + }, |
| 80 | + "action_ref": { |
| 81 | + "canonical_response_hash": "906a51a3be93e9ab5c4911080b2e1dc4ad07bbbc9711aa997f212ea95257008c", |
| 82 | + "governance_block_normalization": "excluded_once", |
| 83 | + "action_ref_recomputed": "b7e0c3a6f9d2b5e8a1c4f7d0b3e6c9f2a5d8b1e4a7c0f3d6b9e2c5a8f1d4b7e0", |
| 84 | + "action_ref_submitted": "a4f7b2e5c8d1f4a7b0e3c6f9d2a5b8e1c4f7d0a3b6e9c2f5d8a1b4e7c0f3d6b9", |
| 85 | + "action_ref_matches_submitted": false |
| 86 | + } |
| 87 | + }, |
| 88 | + "board_result": { |
| 89 | + "displayed_claim_level": null, |
| 90 | + "blocked_reason": "action_ref_mismatch: recomputed hash does not match submitted action_ref", |
| 91 | + "registry_row": "rejected" |
| 92 | + } |
| 93 | + }, |
| 94 | + { |
| 95 | + "id": "valid-trail-block-time-too-late", |
| 96 | + "description": "Trail record and signer identity joins pass; precedence fails. tx_hash is real and recomputable. block_time is confirmed. But block_time * 1000 > outcome_ts_ms — the anchor arrived after the outcome. Anchor proves existence; precedence is not established. Registry row stays at anchor_existence_only, not anchor_precedence_verified.", |
| 97 | + "expected": "FAIL", |
| 98 | + "failure_mode": "anchor_precedence_failed", |
| 99 | + "failure_detail": "block_time * 1000 > outcome_ts_ms by 220000ms. The commitment was recorded on-chain after the governed outcome. Existence is independently verifiable from the tx_hash; precedence is not. These are separate invariants — the board must not conflate them.", |
| 100 | + "joins": { |
| 101 | + "signer_identity": { |
| 102 | + "key_resolves_to_agent": true |
| 103 | + }, |
| 104 | + "action_ref": { |
| 105 | + "action_ref_matches_submitted": true |
| 106 | + }, |
| 107 | + "trail_record": { |
| 108 | + "trail_binds_to_action_ref": true, |
| 109 | + "anchor_point": { |
| 110 | + "method": "on-chain", |
| 111 | + "chain": "arbitrum-one", |
| 112 | + "tx_hash": "c3a6f9d2b5e8a1c4f7d0b3e6c9f2a5d8b1e4a7c0f3d6b9e2c5a8f1d4b7e0c3a6", |
| 113 | + "block_time": 1782678200 |
| 114 | + } |
| 115 | + }, |
| 116 | + "registry_transition": { |
| 117 | + "outcome_ts_ms": 1782677980000, |
| 118 | + "precedence_check": "block_time * 1000 < outcome_ts_ms", |
| 119 | + "precedence_check_value": "1782678200000 < 1782677980000", |
| 120 | + "precedence_margin_ms": -220000, |
| 121 | + "existence_verified": true, |
| 122 | + "precedence_verified": false, |
| 123 | + "allowed_to_flip": false |
| 124 | + } |
| 125 | + }, |
| 126 | + "board_result": { |
| 127 | + "displayed_claim_level": "anchor_existence_only", |
| 128 | + "blocked_reason": "anchor_precedence_failed: block_time * 1000 > outcome_ts_ms by 220000ms", |
| 129 | + "registry_row": "anchor_existence_only" |
| 130 | + } |
| 131 | + } |
| 132 | + ] |
| 133 | +} |
0 commit comments