Skip to content

feat(m3): cerrar la clase «declaración de superficie sin cableado» (CHARTER-12) - #28

Merged
montfort merged 1 commit into
mainfrom
charter/12-cerrar-declaracion-sin-cableado
Jul 17, 2026
Merged

feat(m3): cerrar la clase «declaración de superficie sin cableado» (CHARTER-12)#28
montfort merged 1 commit into
mainfrom
charter/12-cerrar-declaracion-sin-cableado

Conversation

@montfort

Copy link
Copy Markdown
Contributor

Primero de tres Charters que vacían el backlog de follow-ups antes del publish (T060). Despacha los 4 accionables (FU-017/018/019/020) y varios hallazgos adyacentes, todos de la misma clase — «verificación fantasma», la que CHARTER-11 nombró: una declaración que pasa en verde sin verificar nada. Backlog: 7 open → 3 (FU-010/015/016, que van a CHARTER-13/14).

El hallazgo que ordenó el Charter

El repo afirmaba en dos sitios que existía un test de CI que no existía — ni para yrs ni para Loro. NativeMethods.cs:8 y weft_ffi.h:4-6 decían «un test de CI valida que las declaraciones [LibraryImport] coinciden con este header». Esa afirmación imaginaria fue la que engañó a quien redactó FU-017 («replicar el test que yrs tiene»). No había nada que replicar; había que crearlo.

FU-017 — test de paridad header↔binding (ambos shims)

HeaderBindingParityTests.cs (nuevo): parser acotado del header + reflexión sobre NativeMethods, comparando conjunto de funciones, aridad, orden y tipos, para yrs y Loro. Probado contra mutaciones reales del header (función extra → detectada; size_tuint32_t → detectada) y con dos casos negativos que verifican que el parser sabe fallar y revienta ante lo que no entiende en vez de ignorarlo. El doc-comment declara explícitamente qué NO cubre (semántica/marshalling/ownership: eso sigue en ASan + round-trips). Los dos comentarios que mentían quedan corregidos.

Hueco de gate SC-009 (nuevo, ningún FU lo cubría)

grep -q weft_test_panic en release.yml no cazaba weft_loro_test_panic (no es substring): el shim de Loro estaba fuera del gate. Ampliado a ambos símbolos, más un control positivo (falla si nm/strings faltan, en vez de pasar en verde — era la clase de FU-020 dentro del propio gate). Al montarlo, mi control tenía el mismo bug de substring; lo cacé probando contra un binario de Loro real, no revisándolo. Verificado en 4 casos (limpio/contaminado × yrs/loro).

FU-020 — guard bloqueante de filtros

.github/scripts/check-test-filters.sh + job test-filters: cada dotnet test --filter X documentado o en CI debe casar con ≥1 test. Cubre el fantasma vivo FullyQualifiedName~RedisDocumentStoreContractTests. El guard falla si deja de encontrar filtros (no se deja ciego). Probado: pasa con los 2 reales, falla con uno inyectado.

FU-018 — ~10 comentarios falsos

Corregidos en ci.yml (el falso continue-on-error del job fuzz, el obsoleto «M2», with_capacity genérico, «matriz de sanitizers» inexistente, «gates posteriores» ya activos, cross-impl «se añade en US4» ya bloqueante…), CONTRIBUTING.md (paridad Yjs «no-bloqueante» → bloqueante) y README.md (NOTICE inexistente, native/weft-ffi/ layout muerto, ruta del brief). Todos anclados a HEAD + pase adversarial — R4 (introducir falsedades nuevas, como pasó en CHARTER-11) no se materializó.

FU-019 + hallazgos de CHARTER-11

  • FU-019: footgun de pack local con test-hooks documentado en CONTRIBUTING.md.
  • Comando roto: quickstart.md:37 (dotnet test de 2 proyectos → MSB1008) partido en 2.
  • Evidencia falsa mía: requirements.md:45 afirmaba «58/58» de un comando que no corría; corregida a 28+36=64, con nota de que fue R4 de CHARTER-11 materializándose.

Verificación

Check Resultado
Suite .NET 138/138 (6 nuevos de paridad)
Test de paridad 6/6; probado contra mutaciones reales del header
Guard de filtros pasa con los 2 reales, falla con fantasma inyectado
Gate SC-009 caza weft_test_panic y weft_loro_test_panic; falla si la herramienta está ciega
YAML ci.yml + release.yml válidos
straymark validate 32/32 · charter drift sin drift

🤖 Generated with Claude Code

…HARTER-12)

Despacha los 4 follow-ups accionables (FU-017/018/019/020) y los hallazgos
adyacentes, todos de la misma clase — «verificación fantasma», nombrada en
CHARTER-11: una declaración que pasa en verde sin verificar nada. Backlog de
7 open → 3 (FU-010/015/016, que van a CHARTER-13/14).

El hallazgo que ordenó el Charter: el repo afirmaba en dos sitios (NativeMethods.cs,
weft_ffi.h) que existía un test de CI que NO existía — ni para yrs ni para Loro.
Esa afirmación imaginaria engañó a quien redactó FU-017 («replicar el test que yrs
tiene»); no había nada que replicar.

FU-017 — HeaderBindingParityTests.cs (nuevo), para AMBOS shims: parser acotado del
header + reflexión sobre NativeMethods; compara conjunto de funciones, aridad, orden
y tipos. Probado contra mutaciones reales del header (función extra, tipo divergente)
y con casos negativos que verifican que el parser SABE fallar. Los 2 comentarios que
mentían quedan corregidos; el header de Loro gana su weft_loro_test_panic y su ABI.

Gate SC-009 (nuevo hallazgo): grep -q weft_test_panic NO cazaba weft_loro_test_panic
(no es substring) → el shim de Loro estaba fuera del gate. Ampliado a ambos símbolos,
+ control positivo (falla si nm/strings faltan, en vez de pasar en verde). Al montarlo
el propio control tenía el mismo bug de substring — cazado probando contra un binario
de Loro real, no revisándolo.

FU-020 — check-test-filters.sh + job bloqueante test-filters: cada --filter documentado
debe casar con ≥1 test. Cubre el fantasma vivo FullyQualifiedName~RedisDocumentStore...

FU-018 — ~10 comentarios falsos corregidos (ci.yml, CONTRIBUTING, README), anclados a
HEAD + pase adversarial. R4 (introducir falsedades nuevas, como pasó en CHARTER-11) NO
se materializó esta vez.

FU-019 — footgun de pack local documentado en CONTRIBUTING.

Nuevo (error propio de CHARTER-11): quickstart:37 (dotnet test de 2 proyectos → MSB1008)
partido en 2 comandos; la evidencia de US1 afirmaba «58/58» de un comando que no corría
— corregida a 28+36=64, con nota de que fue R4 materializándose.

Verificado: 138/138 tests (6 de paridad), YAML válido, guard y gate SC-009 probados
localmente (pasan limpio, fallan ante fantasma/contaminación).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@montfort
montfort merged commit 70a9b23 into main Jul 17, 2026
16 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 17, 2026
@montfort
montfort deleted the charter/12-cerrar-declaracion-sin-cableado branch July 17, 2026 19:09
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