Skip to content

feat(m3): endurecer decoder de yrs contra amplificación R6 (CHARTER-08) - #24

Merged
montfort merged 4 commits into
mainfrom
charter/08-yrs-decoder-hardening
Jul 15, 2026
Merged

feat(m3): endurecer decoder de yrs contra amplificación R6 (CHARTER-08)#24
montfort merged 4 commits into
mainfrom
charter/08-yrs-decoder-hardening

Conversation

@montfort

Copy link
Copy Markdown
Contributor

CHARTER-08 — Endurecer el decoder de yrs contra amplificación de memoria (R6)

Endurece la ruta directa del FFI ante la amplificación de memoria del decoder de yrs (R6, allocation-bomb), que FU-002 (cerrado) mitigó solo en la capa de relay. La corrección canónica vive upstream; este repo aporta la prueba de regresión y la documentación del caveat. Cierra FU-014.

Entregables

  • (a) PR upstream — y-crdt/y-crdt#639 (externo, desde el fork StrangeDaysTech/y-crdt). Extiende el patrón try_reserve que yrs ya estableció en Update::decode a la clase completa de allocation-bomb por prefijo de longitud. Una revisión de completitud durante la implementación amplió el alcance de los 2 sitios del Charter a los 5 reales:
    • state_vector.rs, any.rs (Map + Array), sync/awareness.rstry_reserve(len)? (variante Error::NotEnoughMemory existente).
    • id_set.rs (SmallVec) → grow-on-push (su try_reserve da otro tipo de error → evita ampliar el enum público).
    • 5 tests de regresión, suite del fork verde (377 + 34).
  • (b) Doc del caveat (ship-now): nota de seguridad en GOVERNANCE.md §Seguridad + pointer en README.md — ingesta directa de bytes CRDT no confiables fuera del relay → cap de tamaño + límite de memoria del proceso.
  • (c) Fuzz de regresión: nuevo target export_since (ruta residual state_vector::decode) + [[bin]] + step informativo en ci.yml. Validado: seed [255,255,255,122] → RSS ~553 MB, error limpio (exit 0, sin abort) en glibc.
  • (d) FU-015 registrado (adopción vía bump R16 al mergear+publicar upstream); NO ejecutado aquí, no bloquea el cierre.

Verificación

  • dotnet test Weft.sln -c Release124/124, 0 fallos (8 Redis omitidos sin servidor local).
  • cargo +nightly fuzz build export_since verde; el seed alcanza el residual.
  • Suite del fork y-crdt verde con el fix + 5 tests (377 + 34).
  • straymark charter drift CHARTER-08 --range origin/main..HEAD → limpio.

Gobernanza

AILOG-2026-07-14-002 + AIDEC-2026-07-14-001 (risk_level: medium, revisados). CHARTER-08 scope reconciliado 2→5 sitios (§Context/§Scope). El cierre del Charter depende solo de nuestros entregables (fuzz + doc + PR enviado); la adopción es FU-015.

🤖 Generated with Claude Code

montfort and others added 4 commits July 14, 2026 00:39
…ación R6)

El job fuzz (informativo) destapó la amplificación de memoria del decoder de yrs
(R6) en la ruta CRUDA del FFI (weft_doc_load/apply_update), NO capeada por FU-002
(que mitigó R6 solo en la capa de relay). Un consumidor que ingiera bytes CRDT no
confiables directamente a la API podría dispararla. Dos partes: (a) nota de
seguridad en GOVERNANCE/README, (b) evaluar bump de yrs con validación de longitud
o guard de tamaño a nivel FFI. Mini-charter, no urge (no se publica ya).

Registro hand-add + recount (§13). Backlog: 4 open / 14 total.
A abordar con FU-006/FU-010/FU-012 (mini-charters).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
FU-014 como charter propio. Endurece la ruta directa del FFI ante la amplificación
de memoria del decoder de yrs (R6), no capeada por FU-002 (relay). Basado en la
investigación upstream 2026-07-14: Update::decode ya usa try_reserve, pero
id_set.rs:91 (delete sets) y state_vector.rs:120 (state vectors) siguen con
with_capacity sin acotar (en 0.27.2 y 0.27.3).

Plan 4 partes: (a) PR upstream de try_reserve a y-crdt (fork StrangeDaysTech/y-crdt),
(b) doc del caveat de ingesta directa, (c) fuzz de regresión export_since,
(d) adopción vía bump R16 → diferida a FU-015. Cierre INDEPENDIENTE del merge
upstream (cierra con nuestros entregables + PR enviado).

Effort M. Branch apila chore/fu-014-register (piggyback). Validado (20 docs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Endurece la ruta directa del FFI ante la amplificación de memoria del
decoder de yrs (R6, allocation-bomb), no capeada por FU-002 (relay). La
corrección canónica vive upstream; este repo aporta la prueba de regresión
y la documentación del caveat.

- (a) PR upstream y-crdt/y-crdt#639: extiende el patrón try_reserve de yrs
  a la clase completa (5 sitios, ampliado de 2 por revisión de completitud:
  state_vector, any Map/Array, awareness → try_reserve; id_set SmallVec →
  grow-on-push). Externo al repo; link en telemetría.
- (b) Nota de seguridad del caveat de ingesta directa no confiable en
  GOVERNANCE.md §Seguridad + pointer en README.md (ship-now).
- (c) Fuzz target de regresión export_since (ruta residual
  state_vector::decode) + [[bin]] + step informativo en ci.yml. Validado:
  seed [255,255,255,122] → RSS ~553 MB, error limpio (exit 0, sin abort).
- (d) FU-015 registrado (adopción vía bump R16); FU-014 cerrado.

CHARTER-08 status → in-progress; scope reconciliado 2→5 sitios.
AILOG-2026-07-14-002 + AIDEC-2026-07-14-001 (risk medium, revisados).

Verificación: dotnet test Weft.sln -c Release (124/124, 0 fallos);
fuzz build export_since verde; suite del fork y-crdt verde (377+34).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Telemetría de cierre + status → closed. Los 4 entregables confirmados:
(a) PR upstream y-crdt/y-crdt#639 enviado (5 sitios), (b) doc del caveat,
(c) fuzz de regresión export_since verde en CI, (d) FU-015 registrado.
No cierra hito (sin auditoría externa). CI del PR #24 verde. La adopción
vía bump (FU-015) dispara al mergear+publicar upstream.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@montfort
montfort merged commit 8232ada into main Jul 15, 2026
15 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 15, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant