Skip to content

feat(m3): Polish — doc de arquitectura, benchmark delta-size (SC-004) y validación quickstart (CHARTER-11) - #27

Merged
montfort merged 2 commits into
mainfrom
charter/11-polish-cierre-m3
Jul 16, 2026
Merged

feat(m3): Polish — doc de arquitectura, benchmark delta-size (SC-004) y validación quickstart (CHARTER-11)#27
montfort merged 2 commits into
mainfrom
charter/11-polish-cierre-m3

Conversation

@montfort

Copy link
Copy Markdown
Contributor

Ejecuta la fase Polish (P8) de specs/001-weft-crdt-versioning: T061, T062 y T063, las tres tareas que CHARTER-07 declaró fuera de su alcance y difirió. Con esto M3 queda cerrado salvo T060 (publish real a NuGet.org, operador-gated por diseño).

Declarado como L siguiendo POLISH-CHARTER-PATTERN.md — el Charter de cierre de Etapa es un gate de detección de deuda, no limpieza cosmética. El patrón se validó.

T062 — benchmark de delta-size

El escenario de referencia de SC-004 no existía como definición: 523 B→29 B sale de una celda etiquetada "Rough perf" en docs/spikes/spike03/hallazgos-spike-03.md:38, de un spike cuyo código es desechable por diseño y no vive en el repo — sin protocolo, sin tamaño de doc, sin nº de ediciones.

El benchmark define el escenario por criterio semántico (reconexión: par al día + 1 edición pequeña), lo fija en el doc-comment antes de medir, y aserta el ratio de la spec (≥ 90 %), citando 523→29 sólo como contexto histórico. Aserta convergencia además del tamaño: sin eso, un delta vacío daría una "reducción" del 100 %.

Medido: 479 B → 26 B = 94,6 %. El escenario se eligió sin mirar los números y cayó a una décima de la referencia histórica (94,5 %) — corroboración independiente de que aquel dato irreproducible era del orden correcto.

T063 — pase de validación end-to-end

Primera ejecución completa del runbook contra HEAD. Destapó 9 gaps, todos de «declaración de superficie sin cableado». Ninguno era un fallo del código de producción — el código estaba bien; el runbook mentía.

Los dos más graves eran verificaciones fantasma, que pasaban en verde sin verificar nada:

Los otros 7: falta --features test-hooks (PanicSafetyTests rojo siguiendo el runbook), ruta cp inexistente, cp innecesario, puerto :5000:5199, npm run check sin documentar, gate de determinismo mal descrito, semántica de fuzz mal descrita. Los 9 corregidos atómicamente.

Evidencia en checklists/requirements.md con tres estados: ejecutado / cubierto por CI / no ejecutado con motivo. [x] significa "lo corrí y lo vi" — US4 queda sin marcar pese al pack local verde, porque su criterio es instalación en máquina limpia por RID.

T061 — docs/architecture.md

Módulos y grafo de dependencias, frontera FFI con el contrato público de ownership de memoria (las 3 clases de memoria y sus reglas, y los 2 puntos del lado .NET donde puede fugarse), flujo de sync, versionado, concurrencia, gates y §Límites conocidos (R6 y su mitigación para la ruta directa). Enlazado desde README.md y docs/api/README.md.

Un pase adversarial contra HEAD encontró 5 afirmaciones falsas en el primer borrador (entre ellas, acoplar la retirada de awareness al último cliente — de ser cierto, un bug de presencia). Todas corregidas antes del commit. Una se había propagado desde un comentario obsoleto de ci.yml → FU-018.

Verificación

Gate Resultado
Suite .NET 132/132
cargo test --features test-hooks 14/14
ASan (nightly) 14/14, 0 fugas / 0 double-free
Paridad Yjs golden ascii + unicode OK (bloqueante)
Convergencia real 2 clientes y-websocket ↔ relay: "Hello from A. And B too."
LoadTest PASS — 45 004 ops, 449 327 desalojos, 0 errores
straymark validate --include-charters 30/30
charter drift sin drift

El fuzz reproduce R6 (OOM con un input de 4 bytes): esperado, no regresión — el shim es correcto (contiene panics, sin UB), el fix está aprobado upstream en y-crdt#639 y su adopción es FU-015. Documentado en la tabla de gates y en §Límites conocidos, porque se lee como rojo nuevo.

Follow-ups (triados, no absorbidos)

  • FU-018 — comentario de ci.yml:76-81 con dos afirmaciones falsas; origen probado del único error propagado a la documentación en este Charter.
  • FU-019 — footgun de pack local contaminado con test-hooks (severidad baja).
  • FU-020 — guard de CI para verificaciones fantasma; habría cazado el gap feat(m0): fundación FFI weft-yrs-ffi + binding Weft.Core (CHARTER-01) #1 el día que se escribió.

🤖 Generated with Claude Code

montfort and others added 2 commits July 15, 2026 21:35
… y validación quickstart (CHARTER-11)

Ejecuta la fase Polish (P8) de specs/001-weft-crdt-versioning: T061, T062 y T063,
las tres tareas que CHARTER-07 difirió. Cierra M3 salvo T060 (publish real,
operador-gated por diseño).

T062 — tests/Weft.Core.Tests/DeltaSizeBenchmark.cs (nuevo)
El escenario de referencia de SC-004 no existía como definición: «523 B→29 B» sale
de una celda «Rough perf» de un spike cuyo código es desechable por diseño. El
benchmark define el escenario por criterio semántico (reconexión: par al día + 1
edición), lo fija en el doc-comment antes de medir, y aserta el ratio de la spec
(≥90 %), no los absolutos. Aserta convergencia además del tamaño: sin eso, un delta
vacío daría una «reducción» del 100 %.
Medido: 479 B → 26 B = 94,6 % (la referencia histórica era 94,5 %).

T063 — pase de validación end-to-end + evidencia
Primera ejecución completa del runbook contra HEAD. Destapó 9 gaps, todos de
«declaración de superficie sin cableado»; ninguno era un fallo del código de
producción. Los dos más graves eran verificaciones fantasma —pasaban en verde sin
verificar nada—: el filtro Category=Concurrency de US2 no casaba con ningún test
(0 → 9 tests, cableado aquí), y el job pack-smoke por-PR es un marcador que sólo
hace echo (el gate real vive en release.yml, workflow_dispatch). Los 9 corregidos
atómicamente en quickstart.md.
Evidencia en checklists/requirements.md con tres estados explícitos: ejecutado /
cubierto-por-CI / no-ejecutado-con-motivo. US4 queda sin marcar pese al pack local
verde, porque su criterio es instalación en máquina limpia por RID.

T061 — docs/architecture.md (nuevo)
Módulos, frontera FFI con el contrato público de ownership de memoria, flujo de
sync, versionado, concurrencia, gates y límites conocidos (R6). Enlazado desde
README.md y docs/api/README.md. Un pase adversarial contra HEAD encontró 5
afirmaciones falsas en el primer borrador, todas corregidas; una de ellas se
propagó desde un comentario obsoleto de ci.yml (→ FU-018).

Verificado: 132/132 tests, ASan 14/14 sin fugas, paridad Yjs (ascii+unicode),
convergencia real de 2 clientes y-websocket contra el relay, LoadTest PASS
(45 004 ops, 0 errores). El fuzz reproduce R6 (OOM con 4 bytes): esperado, no
regresión — fix aprobado upstream en y-crdt#639, adopción vía FU-015.

Follow-ups: FU-018 (comentario de ci.yml con dos afirmaciones falsas), FU-019
(footgun de pack local con test-hooks), FU-020 (guard de CI para verificaciones
fantasma).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… + retrospectivo

El drift check reportó un único desvío: el AILOG se declaró con un placeholder
(AILOG-2026-07-16-NNN, fecha estimada) y el real es AILOG-2026-07-15-003.
Corregido atómicamente (format v4) + §Closing notes. Los otros 10 archivos
declarados se tocaron tal cual, sin omisiones ni expansión de scope.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@montfort
montfort merged commit 349d6cb into main Jul 16, 2026
15 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 16, 2026
@montfort
montfort deleted the charter/11-polish-cierre-m3 branch July 16, 2026 04:22
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