12 KiB
CONTINUE — lectura del corpus doctrinal
Registro de lectura. Existe porque la lectura del corpus no cabe en una sola
ventana de contexto (~19.000 líneas) y sin este fichero cada sesión la
reempieza o se la salta — que es exactamente cómo se auditó a ciegas el
2026-07-29/30 y hubo que revertir 7 commits (3097cfcb6).
No es fuente de verdad. Es un marcador de posición.
La regla que lo motiva
La instrucción del usuario fue: «audita el sistema, para ello previamente lee toda la documentación». Es una precondición bloqueante, no contexto opcional. Incumplirla produjo tres hallazgos falsos, un commit dedicado a retirarlos, y preguntas al usuario cuya respuesta estaba escrita.
El orden lo fija el propio corpus en docs/README.md
§«Reading order for a fresh start»: overview → active-architecture →
CANON → el capítulo de la capa que se toque.
⚠️ Contaminación: 7 documentos leídos en estado editado
Lo primero que hay que saber. El commit revertido c39170abb editaba 12
documentos. La lectura del 2026-07-30 se hizo sobre el árbol con esas
ediciones dentro, así que parte de lo que se leyó como «doctrina» era la
escritura del propio agente que luego se revirtió.
Consecuencia: esos 7 hay que releerlos en su estado actual (original).
Dos ejemplos medidos de cómo engañó:
testing-and-tooling.md— el original dice «a guard fails when an active provider ships without one». La edición lo había cambiado a «This is a convention, not a guard — the mechanical check does not exist». Se citó como doctrina para justificar una decisión de arnés de tests. Era autocita.overview.md— el original documentaprovider.commitState()/provider.emitEvent()(«Three Soma scenarios»). La edición lo sustituyó por «One door: runtime.trigger» + la frase «neither has ever existed in the code». Con eso se «descubrió» una contradicción contrasoma-architecture.mdque la propia edición había creado. Tras el revert ambos documentos coinciden.
Lección para quien siga: antes de citar un documento como doctrina, comprobar
que la línea citada no la escribió una sesión previa. git log -p -- <fichero>
sobre el párrafo en cuestión.
Inventario
Estado: LIMPIO = leído sobre el original · RELEER = leído contaminado ·
— = sin empezar.
Núcleo de arquitectura
| Doc | Líneas | Estado |
|---|---|---|
README.md (el mapa) |
155 | LIMPIO |
architecture/sema.md |
1024 | LIMPIO |
architecture/eidos.md |
1055 | LIMPIO — leída completa 2026-07-30 |
architecture/overview.md |
503 | RELEER |
architecture/active-architecture.md |
837 | RELEER |
architecture/active-uix.md |
115 | RELEER |
architecture/soma.md |
471 | RELEER |
architecture/soma-architecture.md |
1034 | RELEER (iba por ~669) |
testing-and-tooling.md |
110 | RELEER |
CANON.md |
305 | RELEER |
architecture/morfo.md |
888 | LIMPIO — leída completa 2026-07-30 |
architecture/active-app.md |
351 | — |
architecture/agent.md |
472 | — |
architecture/packs.md |
86 | RELEER |
architecture/blocks.md |
113 | — |
morfo.mdera la prioridad y ya está leída (era la capa del contrato, la más tocada durante la auditoría fallida, y se llegó a escribir criterio en su §Step 2 sin haberla leído nunca). Lo que salió, en «Hallazgos».
Canon
| Doc | Líneas | Estado |
|---|---|---|
canon/tsc.md (Token Scope Contract) |
329 | — |
canon/vocabularies.md (conjuntos cerrados, generados) |
153 | — |
canon/recipe-contract.md |
184 | — |
Theming y motion
| Doc | Líneas | Estado |
|---|---|---|
theming/reference.md |
1822 | — |
theming/motion.md |
791 | RELEER |
theming/gradient-finish.md |
475 | — |
theming/guide.md |
241 | — |
theming/motion-guide.md |
232 | RELEER |
theming/notes.md |
179 | — |
theming/channels.md |
143 | — |
Guías y decisiones
| Doc | Líneas | Estado |
|---|---|---|
guides/component-guide.md (pasos + reglas A1–A37) |
1568 | — |
decisions/book-deviations.md |
851 | — |
guides/component-audit.md |
369 | — |
guides/completion-checklist.md |
337 | RELEER |
book-map.md |
201 | — |
authoring.md |
136 | — |
glossary.md |
89 | RELEER |
decisions.md |
88 | — |
building-a-component.md |
55 | — |
rfcs/* (7 ficheros) |
1860 | — |
Total ≈ 19.000 líneas. Válidas hoy: 3 documentos.
Hallazgos que SÍ se sostienen
Salen de documentos limpios y verificados como originales:
- «Only composition roots create shared services» —
architecture/active-uix.md§Ownership, regla 1: «morfo,soma,sema,eidosand components never createdom,langs,prefs,format,clipboardor equivalents: they receive them fromActiveUix».eidos.mdla repite («ActiveEidos creates no shared services»). Las dos puertas soncreateActiveUix/attachActiveUix; el arranque de un shell son tres líneas (createActiveUix→setActiveUix→Soma.create()). ⚠️ La regla es original, pero el fichero está marcado RELEER por otras ediciones — confirmar el párrafo antes de apoyarse en él. - Overlays:
sequence: 'post', no'pre'—sema.md(LIMPIO), nota destacada: un evento de aparición cuyo provider fijaopenen el HANDLER debe declarar'post'; con'pre'el hold de ~240 ms gatea el montaje. intentRationale—sema.md(LIMPIO),BK-FRAME-NO-INTENT: una familia estructural (contact/emerge/shift/sustain/delegate) que declare intent no neutro debe justificarlo enMorfoEventSemantic.intentRationaleovalidateMorfola rechaza.handleestá exento.- El scheduler de los holds —
sema.md(LIMPIO): los holds van poruix.timers.schedule(semaDelay,sema/timers.ts), y sólo caen asetTimeout«when a channel is built without a scheduler (direct unit tests)». Matiza la regla 1 para tests unitarios; no la anula.
De morfo.md (leída completa, original)
- §Step 2 omite
'private'— CONFIRMADO contra el original. Las líneas 397–399 listan sólo'public'y'virtual'; la lista de referencia (líneas 55–59) sí documenta los treskind. El autor decide en §Step 2, así que el hueco es real. ⚠️ Lo que estaba MAL era el criterio que la sesión revertida escribió ahí como arreglo («el test es mecánico: debe existir<Componente.Parte>»), que clasifica mal a todo primitivo de API plana. El hueco sigue abierto; el arreglo no está decidido. emit: 'value'es legítimo (línea 436): losdata-*no-enum van por defecto aemit: 'presence';emit: 'value'es para atributos que llevan un valor real (data-value,data-min,data-max).- ⚠️ Y una regla que CUESTIONA la conclusión de la sesión revertida sobre
data-color(línea 878, «Common pitfalls»): «Provider emits a data-attr not in the morfo. Strict mode logs a warning at runtime; morfo-check fails in CI. Either add the attr to the morfo or rename the provider's emission todata-_*». Más el incidente 2026-05-20 (línea 868): «A component is not done if the provider or demo emits requireddata-*that Morfo does not declare». La sesión revertida concluyó quedata-colorNO debe ir en el morfo porque su vocabulario es de eidos; esta regla dice que lo emitido debe declararse. La distinción a resolver es si un attr estampado por el WRAPPER de eidos (no por el provider de soma) entra en la regla — y eso exige leereidos.mdcompleto ytheming/reference. NO resolver antes. data-_*es el prefijo reservado para attrs privados, deliberadamente fuera del morfo;validateMorfo()los RECHAZA en una declaración.
De eidos.md (limpia, leída hasta la 750)
-
Existe una categoría SANCIONADA de data-attrs visuales fuera del morfo. §«From Soma», línea 489: «The wrapper adds the visual token data-attrs (
data-variant,data-size,data-block,data-icon-only) and does not reimplement state». Y la tabla §«From morfo» (líneas 451–460) enumera lo que eidos consume del morfo —parts[].kebab,archetype,states+data[].values,data-starting-style/data-ending-style,events[].name,semantic.family/.intent,prewrite[],focus.trap:data-colorNO aparece. → Esto es la mitad de la respuesta a la pregunta aparcada (nº 7): la regla demorfo.mdlínea 878 («lo que el PROVIDER emite, se declara») convive con una categoría de attrs que estampa el WRAPPER y que no van al morfo.data-sizees el precedente concreto y verificable (switch.csslo usa en 4 reglas y no está en el morfo de switch). → Falta la otra mitad: sidata-colorpertenece a esa categoría. La lista de la línea 489 es ilustrativa, no exhaustiva, y no lo incluye. La respuesta está entheming/reference.md§25 («Color model: palette + roles + intents»), que el propioeidos.mdseñala como canon del color (línea 589). NO resolver antes de leer §25. -
--*es namespace de eidos (§«The--*token rule»): «The upper layers (sema, soma, morfo) do NOT consume these tokens and do not use the prefix». Es sobre custom properties, no sobre data-attrs, pero fija el principio de propiedad. -
eidos-onlyes una clasificación VÁLIDA, no un error (§«Selector-drift defense», líneas 850–858).eidos-lintclasifica cada selector en morfo-backed / eidos-only / invalid, y define eidos-only como: «the marker is there, but at least onedata-*is not declared in the morfo. Valid by convention (visual tokens likedata-variant,data-sizecome from the wrapper)». Sólo invalid (attr declarado con valor fuera del enum) es bug. -
THM-4 (líneas 865–887) da la disposición para el caso inverso: un attr «declared FOR a visual axis and that nothing anywhere consumes — no recipe, no shared layer, no sibling, no behavioral reason» es deuda, y la disposición es «consume it or prune it from the morfo (never leave "declared for styling, styled nowhere")». → Las dos piezas juntas apuntan a que un
data-colorestampado por el wrapper y ausente del morfo es legítimo (eidos-only), y que undata-colordeclarado en el morfo sólo por un eje visual es podable. Pero sigue faltandotheming/reference.md§25, queeidos.mddesigna como el canon del color: no dar la pregunta por cerrada hasta leerla.
Hallazgos RETIRADOS (eran autocita)
«los tests de provider son convención, no guard»— era la edición revertida. El original afirma que el guard existe. La pregunta sobre el arnés de tests sigue abierta y no está resuelta por el corpus.«— la contradicción la creó la edición revertida.soma-architecture.mddocumenta una API fantasma queoverview.mddesmiente»
Cómo continuar
- Releer los 7 marcados
RELEER, en el orden del corpus. - Luego
morfo.mdcompleto — es la prioridad real. - Después el resto por el orden del inventario.
- Actualizar este fichero al final de cada sesión de lectura: estado por documento y línea donde se paró.
- No escribir código ni doctrina hasta acabar. Un hallazgo sólo se reporta si se puede citar documento + línea, y se ha comprobado que esa línea no la escribió una sesión anterior.
- Un analizador heurístico que no resuelve algo dice «no verificado»; no emite un hallazgo.