# COMPARISON — detector (T8) vs escrow (T9) Los dos mecanismos sobre los **mismos escenarios**, misma cuenta (saldo inicial 100, invariante `saldo ≥ 0`, slack `S = 100`). Los veredictos de esta tabla son exactamente los que verifica `tests/comparison.rs` — ninguno está escrito a mano. - **Detector (T8):** funde los estados de las réplicas y comprueba el merge (`AccountConfig::haz_coordination`). Detección **reactiva por-estado**. - **Escrow (T9):** reparto de presupuestos `[50,50]` (válido: `Σ ≤ 100`); cada réplica gasta local si le cabe (`try_spend`). **Evitación por construcción**. | # | Escenario | Grafo | Retiros | Detector (T8) | Escrow `[50,50]` (T9) | |---|---|---|---|---|---| | 1 | conectado, caben | `0—1` | `10,10` | corre libre | **Local** (ambos ≤ 50) | | 2 | conectado, sobregiro | `0—1` | `60,60` | coordina | **rebalanceo** (60 > 50) | | 3 | **particionado, sobregiro** | `∅` | `60,60` | **corre libre** ⚠️ | **rebalanceo** (60 > 50) | | 4 | particionado, caben | `∅` | `10,10` | corre libre | Local | ## La fila 3 es todo el punto de T9 **El detector dice "corre libre" al caso más peligroso.** Con las dos réplicas particionadas retirando 60 cada una de una cuenta de 100, el saldo global va a `100 − 120 = −20`: viola el invariante. Pero el detector, al codificar una restricción **global** por aristas **pares**, se queda sin ninguna arista al particionar y no ve el acoplamiento. **Falso-verde: el caso inseguro reportado como seguro** — el peor error posible en un consejero de coordinación. **El escrow lo bloquea correctamente.** El presupuesto de cada réplica es 50; un retiro de 60 devuelve `NeedsRebalance{deficit:10}`, **con o sin partición**, porque el presupuesto `b_i` es local y su certificado (`Σ b_i ≤ S`) no depende de que haya arista. La partición no lo ciega: lo respeta. ## Rendimiento ≠ corrección (R-T9a) | Reparto | Retiro | Escrow | Nota | |---|---|---|---| | `[100, 0]` | réplica 1 retira 10 | rebalanceo | reparto malo: la réplica seca coordina de más | | `[50, 50]` | réplica 1 retira 10 | Local | reparto equilibrado: cero coordinación | Ambos repartos son **correctos** (el certificado `valor ≥ K` aguanta los dos); el segundo es solo más **eficiente**. La calidad del reparto es un problema de optimización sobre el grafo — el trabajo del `BudgetRouter` (`diffuse`) — no de corrección. Por eso los tests los separan. ## Lectura El detector no se borra (sirve como alarma de reconciliación honesta para invariantes sin estructura de recurso divisible, R-T9b: unicidad de ID, integridad referencial). Pero **deja de ser el consejero de coordinación**: para un invariante numérico sobre un recurso conservado, el que evita coordinación de verdad —y sin puntos ciegos— es el **escrow** (`escrow.rs`), ruteado por el grafo (`router.rs`). Ver `STRONG_RESULT.md` para la corrección del reclamo de T8.