feat(m3): Polish — doc de arquitectura, benchmark delta-size (SC-004) y validación quickstart (CHARTER-11) - #27
Merged
Conversation
… 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ejecuta la fase
Polish(P8) despecs/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 Bsale de una celda etiquetada "Rough perf" endocs/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:
--filter Category=Concurrencyno casaba con ningún[Trait]del repo → el paso de US2 pasaba en verde ejecutando 0 tests. Cableado aquí: 0 → 9 tests.pack-smokedeci.ymles un marcador que sólo haceecho. La matriz real y la verificación deweft_test_panicviven enrelease.yml(workflow_dispatch). El runbook prometía que cada PR valida el empaquetado; ningún PR lo valida.Los otros 7: falta
--features test-hooks(PanicSafetyTests rojo siguiendo el runbook), rutacpinexistente,cpinnecesario, puerto:5000→:5199,npm run checksin documentar, gate de determinismo mal descrito, semántica defuzzmal descrita. Los 9 corregidos atómicamente.Evidencia en
checklists/requirements.mdcon 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.mdMó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.mdydocs/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
cargo test --features test-hooksy-websocket↔ relay:"Hello from A. And B too."straymark validate --include-charterscharter driftEl 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)
ci.yml:76-81con dos afirmaciones falsas; origen probado del único error propagado a la documentación en este Charter.test-hooks(severidad baja).🤖 Generated with Claude Code