Hijo de #23. Relacionado: #19 (este repo tampoco corre tests en CI).
Contexto
package.json:97 define "lint": "eslint src/". eslint no está en las dependencias y no existe ningún archivo de config en el repo (eslint.config.*, .eslintrc* — cero hits fuera de node_modules/).
$ npm run lint >/dev/null 2>&1; echo $?
127 # sh: eslint: command not found
.cofoundy/specs/architecture-v1.md especifica los invariantes 4 y 5 como aplicados por lint: core/ prohíbe Math.random, Date, fetch, window, document, porque de esa pureza depende la garantía de determinismo (mismo seed + mismo tick ⇒ mismo frame, byte-idéntico). Nunca se aplicaron.
Fix propuesto
npm i -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
eslint.config.js (flat config — eslint 10 no lee .eslintrc)
no-restricted-globals / no-restricted-syntax scopeada a src/components/chat-sim/core/** con los 5 símbolos
Criterios de aceptación
npm run lint sale 0 sobre el árbol actual
- Los 5 símbolos prohibidos disparan error dentro de
core/** y no fuera
requestAnimationFrame queda resuelto explícitamente (permitido o prohibido) en vez de por comentario
Verificación (runnable)
npm run lint; echo "exit=$?" # espera 0
printf 'export const x = Math.random();\n' > src/components/chat-sim/core/__lintprobe.ts
npm run lint; echo "exit=$?" # espera != 0, y que nombre __lintprobe.ts
rm src/components/chat-sim/core/__lintprobe.ts
printf 'export const y = Math.random();\n' > src/components/chat-sim/element/__lintprobe.ts
npm run lint; echo "exit=$?" # espera 0 — la regla es scopeada, no global
rm src/components/chat-sim/element/__lintprobe.ts
Los pasos 2 y 3 son el gemelo: sin ellos un eslint.config.js vacío también sale 0 y el gate vuelve a no medir nada.
Guardrails
- No arreglar los errores de lint preexistentes del resto de
src/ en este PR. Si son muchos → warn primero, issue aparte.
- No tocar
core/**: hoy está limpio (grep de los 5 símbolos → 6 hits, los 6 comentarios).
Scope
package.json, eslint.config.js (nuevo). Refs: .cofoundy/specs/architecture-v1.md invariantes 4 y 5.
Hijo de #23. Relacionado: #19 (este repo tampoco corre tests en CI).
Contexto
package.json:97define"lint": "eslint src/". eslint no está en las dependencias y no existe ningún archivo de config en el repo (eslint.config.*,.eslintrc*— cero hits fuera denode_modules/)..cofoundy/specs/architecture-v1.mdespecifica los invariantes 4 y 5 como aplicados por lint:core/prohíbeMath.random,Date,fetch,window,document, porque de esa pureza depende la garantía de determinismo (mismo seed + mismo tick ⇒ mismo frame, byte-idéntico). Nunca se aplicaron.Fix propuesto
npm i -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugineslint.config.js(flat config — eslint 10 no lee.eslintrc)no-restricted-globals/no-restricted-syntaxscopeada asrc/components/chat-sim/core/**con los 5 símbolosCriterios de aceptación
npm run lintsale 0 sobre el árbol actualcore/**y no fuerarequestAnimationFramequeda resuelto explícitamente (permitido o prohibido) en vez de por comentarioVerificación (runnable)
Los pasos 2 y 3 son el gemelo: sin ellos un
eslint.config.jsvacío también sale 0 y el gate vuelve a no medir nada.Guardrails
src/en este PR. Si son muchos →warnprimero, issue aparte.core/**: hoy está limpio (grep de los 5 símbolos → 6 hits, los 6 comentarios).Scope
package.json,eslint.config.js(nuevo). Refs:.cofoundy/specs/architecture-v1.mdinvariantes 4 y 5.