Polish pass MEDIUM/LOW post-audit (2 items limpios + triage de los invasivos):
governance — cobertura del desempate (consenso-relevante, sin cobertura previa):
- scenario_8b_finalize_tie_rejected_canonical: yes==nay ⇒ `yes > nay` es false ⇒
Rejected. Fija que se exige MAYORÍA ESTRICTA (el empate favorece el status quo).
Entre scenario_7 (yes-majority→Approved) y scenario_8 (nay-majority→Rejected)
faltaba justo el borde del empate.
origin-chain-types — SSOT de attestation ahora que el crate aterrizó:
- `arkhe-noesis-attestation-types` ya existe (crate standalone no_std + feature scale
en el monorepo). El vendor-copy SE QUEDA como type-mirror deliberado: el chain es
submódulo y depender del crate del monorepo invierte la dep-direction
(submódulo→monorepo = ILEGAL). La SSOT se preserva por los golden vectors del
oráculo real (decode_golden_vector_1/3/4), no por Cargo.
- attestation_verify: §SSOT parity anchor doc — documenta que esos vectores pinnean
el decoder al field-order de `SigningPayload` y cómo regenerar ante deriva.
- attestation.rs: comentario del mirror actualizado (el crate aterrizó; diferencia
conocida schema_version [u8;8] vs String es irrelevante — el mirror no serializa
el wire; el decoder secuencial sí es byte-fiel al postcard, probado por vectores).
Triage documentado (items considerados y DIFERIDOS con rationale, no olvidados):
- register_agent_did unbounded Vec: bound del arg a ConstU32<10> movería el rechazo
a decode-time, volvería AgentChainOverflow inalcanzable + rompería el test de
overflow + exigiría spec bump — invasivo para un DoS ya mitigado por length-fee +
límite de bloque. Diferido.
- SS58 prefix (42): NO es bug — placeholder testnet correcto, gated en un DC de
ss58-registry pre-mainnet. Sin cambio.
- no-author path (emission): requiere un FindAuthor mock que devuelva None (segundo
runtime o toggle) — ripple > valor. Diferido.
Verificado: origin-chain-types 77 tests verde (incl. golden parity) + tie test verde.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>