a8a39a67f6eb970b9c08d42cb770233941386909
T11 §D: una celda con dos escritores vivos que no se comunican es IMPOSIBLE
de resolver coordination-free (CAP dentro de la celda). El fencing es lo mejor
posible: bounded + detect, no prevent.
- fencing::FencedCell: spent indexado por (device_id, epoch); epoch monótona
DEVICE-LOCAL (evita consenso), persistida al arrancar (boot). merge une por
máximo por época y devuelve MergeOutcome::CloneDetected{device_id,
stale_epoch, live_epoch} cuando halla dos linajes. overspend acotado a una
celda; reconciled_spent = solo el linaje vivo (aísla el obsoleto).
Tests §G.3 (clon detectado, acotado a una celda, delatado; el linaje vivo no
propaga el doble gasto) y §G.4 (fuente monótona una época = Ok; el clon nunca
pasa como Ok silencioso). proptest: daño de clon siempre ≤ una celda.
BOUNDARY.md: el teorema de imposibilidad, la garantía real (bounded+detect vs
el fencing token linealizable de Kleppmann), y por qué epochs device-local.
STRONG_RESULT.md: el terminus honesto §E (seguridad coord-free módulo un
supuesto físico nombrado) + el contrato de M4 §H listo para escribir.
73 tests, clippy limpio. Hito T11 cerrado.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Languages
Rust
100%