89c62aa71132362861e3dfbf35826482ea331ee5
T9 §A/§B: corrige los dos errores de T8c. (1) el veredicto de T8 era
DETECCIÓN reactiva por-estado, no evitación; (2) trataba un invariante
GLOBAL como edge-local, de ahí el falso-verde particionado.
- invariant::GlobalInvariant (restricción global valor≥floor, no edge-local;
slack = initial - floor).
- escrow::Budget/SpendResult: reparto con Σ b_i ≤ slack (is_valid_split,
split proporcional por división entera), gasto local try_spend (Local |
NeedsRebalance{deficit}), certificado value_after.
- verdict::Verdict::via_escrow: Local→RunsFree (cero coord, correcto incluso
particionado), NeedsRebalance→NeedsCoordination localizado. Nunca 'libre
global' a ciegas.
Tests: EL CERTIFICADO (proptest) — para todo reparto válido y todo gasto
spent_i ≤ b_i (particiones y máximos incluidos), valor = inicial - Σspent ≥
piso, por construcción. El caso 60/60 con [50,50]: particionado recibe
NeedsRebalance (bloqueado), no Local — muere el falso-verde. El detector de
T8 se conserva pero su 'topología importa' se reetiqueta como PUNTO CIEGO.
Honestidad §B: escrow no vence a CALM, transforma la operación para que sea
I-confluente. 49 tests, clippy limpio.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Languages
Rust
100%