feat(m3): cerrar la clase «declaración de superficie sin cableado» (CHARTER-12) - #28
Merged
Merged
Conversation
…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>
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.
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:8yweft_ffi.h:4-6decí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 sobreNativeMethods, comparando conjunto de funciones, aridad, orden y tipos, para yrs y Loro. Probado contra mutaciones reales del header (función extra → detectada;size_t→uint32_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_panicenrelease.ymlno cazabaweft_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 sinm/stringsfaltan, 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+ jobtest-filters: cadadotnet test --filter Xdocumentado o en CI debe casar con ≥1 test. Cubre el fantasma vivoFullyQualifiedName~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 falsocontinue-on-errordel jobfuzz, el obsoleto «M2»,with_capacitygené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) yREADME.md(NOTICEinexistente,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
test-hooksdocumentado enCONTRIBUTING.md.quickstart.md:37(dotnet testde 2 proyectos → MSB1008) partido en 2.requirements.md:45afirmaba «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
weft_test_panicyweft_loro_test_panic; falla si la herramienta está ciegaci.yml+release.ymlválidosstraymark validatecharter driftsin drift🤖 Generated with Claude Code