Audit ultra 2026-07-04 (dimensión governance-hardening, nunca antes corrida):
1. [CRITICAL] override_council_veto revertía CUALQUIER propuesta Rejected a
Approved — incluidas las que la COMUNIDAD votó en contra (finalize_proposal
marca Rejected cuando nay>=yes). Un proponente podía resucitar una propuesta
rechazada en las urnas y drenar el treasury, invirtiendo el voto popular.
Fix: marca VetoRejected (solo la pone veto_proposal al alcanzar el umbral);
el override exige esa marca ⇒ solo revierte VETOS del council, no votos.
2. [HIGH] treasury_disbursement podía re-desembolsar la MISMA propuesta Approved
N veces (drenaje por replay) — el guard status==Approved no cambiaba tras el
pago. Fix: marca Disbursed (single-use) + Error::AlreadyDisbursed.
3. [HIGH] veto_proposal usaba un contador MONÓTONO: el veto de un miembro
removido seguía contando y encoger el council bajaba el umbral retroactivamente
⇒ una minoría podía vetar (derrota el safeguard 2/3). Fix: conteo EN VIVO
(itera VetoVotes filtrando por membresía actual del council, O(≤7)).
+3 regression tests. Governance 45 tests verde. Storage aditivo (VetoRejected,
Disbursed) — sin migración (pre-mainnet, StorageVersion 0). Pendientes para
David (diseño): reserva real del stake de propuesta (HoldReason), emergency 5/7.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>