feat(gate): fase B de P0 — la puerta existe y sabe fallar
El hallazgo mayor confirmado de la auditoría 2026-08-26: ~16 validadores y
429 ficheros de test que nada ejecutaba (sin CI en ninguna rama de la
historia, hooks .sample, eidos-lint sin script npm). Esta fase los cablea:
- `check:gate` (scripts/check-gate.ts): svelte-check con política — src/
debe cero; web/ se mide contra el ledger menguante scripts/check-debt.ts
(34 ficheros, 71 errores congelados; sólo puede bajar, la disciplina de
theming-census-debt). Guard anti-vacío: sin marcador COMPLETED o con
conteo que no cuadra, falla — un gate que no inspeccionó nada no pasa.
- `eidos:lint` deja de ser invocación cruda (exit 1 real en invalid/dead).
- `gate`: check:gate → validadores rápidos → vitest al final. `lint` queda
deliberadamente FUERA: hay ~2.300 ficheros de deuda de formato
preexistente (nunca se formateó el repo entero; el one-shot pendiente es
`npm run format` en árbol quieto y re-añadirlo — documentado en el hook).
- scripts/hooks/pre-push: la fuente del hook, SIN armar. Se armó en
caliente, bloqueó el push legítimo del eje theming (secuencia mal: verde
primero, puerta después) y se desarmó — de paso la puerta demostró que
sabe fallar, que era el requisito de verificación de la fase.
- .prettierrc endOfLine:auto — neutraliza la clase CRLF/autocrlf de
Windows (~350 falsos rojos), sin cambiar formato real.
Verificación: check:gate exit 0 sobre HEAD (71 dentro del ledger, src/ a
cero tras 9d6533cb7 del eje navigation-menu) · sondeo individual del resto
de miembros del gate: verdes salvo los adjudicados en fase A.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
/**
|
|
|
|
|
* check-gate — svelte-check with the debt ledger applied.
|
|
|
|
|
*
|
|
|
|
|
* Policy (P0 fase A, audit 2026-08-26):
|
chore(gate): scripts/ entra en el comprobador de tipos y debe cero como src/; fuera csstype, esm-env y generate:contracts-docs; prettier ignora web/ y .claude/ (F5 del cierre, parte 1)
Preparación del formateo de una sola vez, en un commit aparte para que ese
commit sea formato puro y quepa en .git-blame-ignore-revs.
- scripts/ nunca se había tipado. svelte.config.js lo añade al include de Kit;
tsconfig.json excluye las sondas de agentes (scripts/__*: el exclude de la
raíz pisa el que genera Kit, por eso va ahí). Medido: 7 errores en 4 scripts,
todos de tipos. Arreglados sin casts nuevos: tres casts que el compilador
rechazaba (component-audit, docs-vocabularies) y un Set tipado estrecho
(morfo-vocabulary-check, 3 errores) — el JavaScript que emite esbuild para
esos tres scripts es byte-idéntico antes y después. add-contracts-imports.ts
es una migración muerta (apunta a $terra, capa borrada): sus 2 errores se
arreglan (index ?? 0, e instanceof Error) y borrarla es decisión del autor.
- check-gate.ts: src/ y scripts/ deben cero (un ledger no puede absolverlos).
Visto fallar: con un cast roto en docs-vocabularies, exit 1 «src/ and
scripts/ owe zero»; restaurado byte a byte.
- package.json: fuera generate:contracts-docs (su script no existe) y las
dependencias csstype y esm-env, que nadie importa (esm-env sigue como
transitiva de kit y svelte; npm ls lo confirma).
- .prettierignore: web/ (árbol congelado) y .claude/ (configuración de la
herramienta, incluido settings.local.json del autor).
Verificación: check:gate OK (89 de web/ dentro del ledger; src/ y scripts/ a
cero) · morfo:vocabulary exit 0 · docs:check 0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3 weeks ago
|
|
|
* - Any ERROR under `src/` or `scripts/` fails the gate: framework source and
|
|
|
|
|
* the tooling that guards it owe zero (scripts/ is type-checked since the
|
|
|
|
|
* closure plan's F5; agent probes `scripts/__*` are excluded in tsconfig.json).
|
feat(gate): fase B de P0 — la puerta existe y sabe fallar
El hallazgo mayor confirmado de la auditoría 2026-08-26: ~16 validadores y
429 ficheros de test que nada ejecutaba (sin CI en ninguna rama de la
historia, hooks .sample, eidos-lint sin script npm). Esta fase los cablea:
- `check:gate` (scripts/check-gate.ts): svelte-check con política — src/
debe cero; web/ se mide contra el ledger menguante scripts/check-debt.ts
(34 ficheros, 71 errores congelados; sólo puede bajar, la disciplina de
theming-census-debt). Guard anti-vacío: sin marcador COMPLETED o con
conteo que no cuadra, falla — un gate que no inspeccionó nada no pasa.
- `eidos:lint` deja de ser invocación cruda (exit 1 real en invalid/dead).
- `gate`: check:gate → validadores rápidos → vitest al final. `lint` queda
deliberadamente FUERA: hay ~2.300 ficheros de deuda de formato
preexistente (nunca se formateó el repo entero; el one-shot pendiente es
`npm run format` en árbol quieto y re-añadirlo — documentado en el hook).
- scripts/hooks/pre-push: la fuente del hook, SIN armar. Se armó en
caliente, bloqueó el push legítimo del eje theming (secuencia mal: verde
primero, puerta después) y se desarmó — de paso la puerta demostró que
sabe fallar, que era el requisito de verificación de la fase.
- .prettierrc endOfLine:auto — neutraliza la clase CRLF/autocrlf de
Windows (~350 falsos rojos), sin cambiar formato real.
Verificación: check:gate exit 0 sobre HEAD (71 dentro del ledger, src/ a
cero tras 9d6533cb7 del eje navigation-menu) · sondeo individual del resto
de miembros del gate: verdes salvo los adjudicados en fase A.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
* - ERRORs elsewhere (the demo tree) are measured against the per-file
|
|
|
|
|
* ledger in `check-debt.ts`. A file above its ledgered count — or an
|
|
|
|
|
* erroring file the ledger does not name — fails. Counts only shrink:
|
|
|
|
|
* when a file drops below its entry the gate says so; lower the entry
|
|
|
|
|
* in the same change.
|
|
|
|
|
* - The run must end with svelte-check's `COMPLETED` marker and the
|
|
|
|
|
* parsed error count must match the marker's total — a gate that
|
|
|
|
|
* inspected nothing must fail, never pass.
|
|
|
|
|
*
|
|
|
|
|
* Usage: npm run check:gate
|
|
|
|
|
*/
|
|
|
|
|
import { spawnSync } from 'node:child_process';
|
|
|
|
|
import { CHECK_DEBT } from './check-debt';
|
|
|
|
|
|
|
|
|
|
const run = spawnSync('npm', ['run', 'check'], {
|
|
|
|
|
shell: true,
|
|
|
|
|
encoding: 'utf8',
|
|
|
|
|
maxBuffer: 64 * 1024 * 1024
|
|
|
|
|
});
|
|
|
|
|
const out = `${run.stdout ?? ''}\n${run.stderr ?? ''}`;
|
|
|
|
|
|
|
|
|
|
const completed = /^\d+\s+COMPLETED\s+\d+\s+FILES\s+(\d+)\s+ERRORS\b/m.exec(out);
|
|
|
|
|
if (!completed) {
|
|
|
|
|
console.error('check-gate: svelte-check produced no COMPLETED marker — treating as failure.');
|
|
|
|
|
console.error(out.slice(-2000));
|
|
|
|
|
process.exit(1);
|
|
|
|
|
}
|
|
|
|
|
const reportedErrors = Number(completed[1]);
|
|
|
|
|
|
|
|
|
|
const errorsByFile = new Map<string, number>();
|
|
|
|
|
let parsedErrors = 0;
|
|
|
|
|
for (const line of out.split('\n')) {
|
|
|
|
|
const m = /^\d+\s+ERROR\s+"(.+?)"\s+\d+:\d+\s+/.exec(line);
|
|
|
|
|
if (!m) continue;
|
|
|
|
|
const file = m[1].replace(/\\+/g, '/');
|
|
|
|
|
errorsByFile.set(file, (errorsByFile.get(file) ?? 0) + 1);
|
|
|
|
|
parsedErrors += 1;
|
|
|
|
|
}
|
|
|
|
|
if (parsedErrors !== reportedErrors) {
|
|
|
|
|
console.error(
|
|
|
|
|
`check-gate: parsed ${parsedErrors} ERROR lines but svelte-check reported ${reportedErrors} — output format drifted, refusing to judge.`
|
|
|
|
|
);
|
|
|
|
|
process.exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let failed = false;
|
|
|
|
|
|
chore(gate): scripts/ entra en el comprobador de tipos y debe cero como src/; fuera csstype, esm-env y generate:contracts-docs; prettier ignora web/ y .claude/ (F5 del cierre, parte 1)
Preparación del formateo de una sola vez, en un commit aparte para que ese
commit sea formato puro y quepa en .git-blame-ignore-revs.
- scripts/ nunca se había tipado. svelte.config.js lo añade al include de Kit;
tsconfig.json excluye las sondas de agentes (scripts/__*: el exclude de la
raíz pisa el que genera Kit, por eso va ahí). Medido: 7 errores en 4 scripts,
todos de tipos. Arreglados sin casts nuevos: tres casts que el compilador
rechazaba (component-audit, docs-vocabularies) y un Set tipado estrecho
(morfo-vocabulary-check, 3 errores) — el JavaScript que emite esbuild para
esos tres scripts es byte-idéntico antes y después. add-contracts-imports.ts
es una migración muerta (apunta a $terra, capa borrada): sus 2 errores se
arreglan (index ?? 0, e instanceof Error) y borrarla es decisión del autor.
- check-gate.ts: src/ y scripts/ deben cero (un ledger no puede absolverlos).
Visto fallar: con un cast roto en docs-vocabularies, exit 1 «src/ and
scripts/ owe zero»; restaurado byte a byte.
- package.json: fuera generate:contracts-docs (su script no existe) y las
dependencias csstype y esm-env, que nadie importa (esm-env sigue como
transitiva de kit y svelte; npm ls lo confirma).
- .prettierignore: web/ (árbol congelado) y .claude/ (configuración de la
herramienta, incluido settings.local.json del autor).
Verificación: check:gate OK (89 de web/ dentro del ledger; src/ y scripts/ a
cero) · morfo:vocabulary exit 0 · docs:check 0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3 weeks ago
|
|
|
const OWES_ZERO = ['src/', 'scripts/'];
|
|
|
|
|
const owesZero = (file: string) => OWES_ZERO.some((prefix) => file.startsWith(prefix));
|
|
|
|
|
|
|
|
|
|
const srcErrors = [...errorsByFile].filter(([file]) => owesZero(file));
|
feat(gate): fase B de P0 — la puerta existe y sabe fallar
El hallazgo mayor confirmado de la auditoría 2026-08-26: ~16 validadores y
429 ficheros de test que nada ejecutaba (sin CI en ninguna rama de la
historia, hooks .sample, eidos-lint sin script npm). Esta fase los cablea:
- `check:gate` (scripts/check-gate.ts): svelte-check con política — src/
debe cero; web/ se mide contra el ledger menguante scripts/check-debt.ts
(34 ficheros, 71 errores congelados; sólo puede bajar, la disciplina de
theming-census-debt). Guard anti-vacío: sin marcador COMPLETED o con
conteo que no cuadra, falla — un gate que no inspeccionó nada no pasa.
- `eidos:lint` deja de ser invocación cruda (exit 1 real en invalid/dead).
- `gate`: check:gate → validadores rápidos → vitest al final. `lint` queda
deliberadamente FUERA: hay ~2.300 ficheros de deuda de formato
preexistente (nunca se formateó el repo entero; el one-shot pendiente es
`npm run format` en árbol quieto y re-añadirlo — documentado en el hook).
- scripts/hooks/pre-push: la fuente del hook, SIN armar. Se armó en
caliente, bloqueó el push legítimo del eje theming (secuencia mal: verde
primero, puerta después) y se desarmó — de paso la puerta demostró que
sabe fallar, que era el requisito de verificación de la fase.
- .prettierrc endOfLine:auto — neutraliza la clase CRLF/autocrlf de
Windows (~350 falsos rojos), sin cambiar formato real.
Verificación: check:gate exit 0 sobre HEAD (71 dentro del ledger, src/ a
cero tras 9d6533cb7 del eje navigation-menu) · sondeo individual del resto
de miembros del gate: verdes salvo los adjudicados en fase A.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
if (srcErrors.length > 0) {
|
|
|
|
|
failed = true;
|
chore(gate): scripts/ entra en el comprobador de tipos y debe cero como src/; fuera csstype, esm-env y generate:contracts-docs; prettier ignora web/ y .claude/ (F5 del cierre, parte 1)
Preparación del formateo de una sola vez, en un commit aparte para que ese
commit sea formato puro y quepa en .git-blame-ignore-revs.
- scripts/ nunca se había tipado. svelte.config.js lo añade al include de Kit;
tsconfig.json excluye las sondas de agentes (scripts/__*: el exclude de la
raíz pisa el que genera Kit, por eso va ahí). Medido: 7 errores en 4 scripts,
todos de tipos. Arreglados sin casts nuevos: tres casts que el compilador
rechazaba (component-audit, docs-vocabularies) y un Set tipado estrecho
(morfo-vocabulary-check, 3 errores) — el JavaScript que emite esbuild para
esos tres scripts es byte-idéntico antes y después. add-contracts-imports.ts
es una migración muerta (apunta a $terra, capa borrada): sus 2 errores se
arreglan (index ?? 0, e instanceof Error) y borrarla es decisión del autor.
- check-gate.ts: src/ y scripts/ deben cero (un ledger no puede absolverlos).
Visto fallar: con un cast roto en docs-vocabularies, exit 1 «src/ and
scripts/ owe zero»; restaurado byte a byte.
- package.json: fuera generate:contracts-docs (su script no existe) y las
dependencias csstype y esm-env, que nadie importa (esm-env sigue como
transitiva de kit y svelte; npm ls lo confirma).
- .prettierignore: web/ (árbol congelado) y .claude/ (configuración de la
herramienta, incluido settings.local.json del autor).
Verificación: check:gate OK (89 de web/ dentro del ledger; src/ y scripts/ a
cero) · morfo:vocabulary exit 0 · docs:check 0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3 weeks ago
|
|
|
console.error(
|
|
|
|
|
'check-gate: framework source or tooling has type errors (src/ and scripts/ owe zero):'
|
|
|
|
|
);
|
feat(gate): fase B de P0 — la puerta existe y sabe fallar
El hallazgo mayor confirmado de la auditoría 2026-08-26: ~16 validadores y
429 ficheros de test que nada ejecutaba (sin CI en ninguna rama de la
historia, hooks .sample, eidos-lint sin script npm). Esta fase los cablea:
- `check:gate` (scripts/check-gate.ts): svelte-check con política — src/
debe cero; web/ se mide contra el ledger menguante scripts/check-debt.ts
(34 ficheros, 71 errores congelados; sólo puede bajar, la disciplina de
theming-census-debt). Guard anti-vacío: sin marcador COMPLETED o con
conteo que no cuadra, falla — un gate que no inspeccionó nada no pasa.
- `eidos:lint` deja de ser invocación cruda (exit 1 real en invalid/dead).
- `gate`: check:gate → validadores rápidos → vitest al final. `lint` queda
deliberadamente FUERA: hay ~2.300 ficheros de deuda de formato
preexistente (nunca se formateó el repo entero; el one-shot pendiente es
`npm run format` en árbol quieto y re-añadirlo — documentado en el hook).
- scripts/hooks/pre-push: la fuente del hook, SIN armar. Se armó en
caliente, bloqueó el push legítimo del eje theming (secuencia mal: verde
primero, puerta después) y se desarmó — de paso la puerta demostró que
sabe fallar, que era el requisito de verificación de la fase.
- .prettierrc endOfLine:auto — neutraliza la clase CRLF/autocrlf de
Windows (~350 falsos rojos), sin cambiar formato real.
Verificación: check:gate exit 0 sobre HEAD (71 dentro del ledger, src/ a
cero tras 9d6533cb7 del eje navigation-menu) · sondeo individual del resto
de miembros del gate: verdes salvo los adjudicados en fase A.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
for (const [file, count] of srcErrors) console.error(` ${file}: ${count}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const [file, count] of errorsByFile) {
|
chore(gate): scripts/ entra en el comprobador de tipos y debe cero como src/; fuera csstype, esm-env y generate:contracts-docs; prettier ignora web/ y .claude/ (F5 del cierre, parte 1)
Preparación del formateo de una sola vez, en un commit aparte para que ese
commit sea formato puro y quepa en .git-blame-ignore-revs.
- scripts/ nunca se había tipado. svelte.config.js lo añade al include de Kit;
tsconfig.json excluye las sondas de agentes (scripts/__*: el exclude de la
raíz pisa el que genera Kit, por eso va ahí). Medido: 7 errores en 4 scripts,
todos de tipos. Arreglados sin casts nuevos: tres casts que el compilador
rechazaba (component-audit, docs-vocabularies) y un Set tipado estrecho
(morfo-vocabulary-check, 3 errores) — el JavaScript que emite esbuild para
esos tres scripts es byte-idéntico antes y después. add-contracts-imports.ts
es una migración muerta (apunta a $terra, capa borrada): sus 2 errores se
arreglan (index ?? 0, e instanceof Error) y borrarla es decisión del autor.
- check-gate.ts: src/ y scripts/ deben cero (un ledger no puede absolverlos).
Visto fallar: con un cast roto en docs-vocabularies, exit 1 «src/ and
scripts/ owe zero»; restaurado byte a byte.
- package.json: fuera generate:contracts-docs (su script no existe) y las
dependencias csstype y esm-env, que nadie importa (esm-env sigue como
transitiva de kit y svelte; npm ls lo confirma).
- .prettierignore: web/ (árbol congelado) y .claude/ (configuración de la
herramienta, incluido settings.local.json del autor).
Verificación: check:gate OK (89 de web/ dentro del ledger; src/ y scripts/ a
cero) · morfo:vocabulary exit 0 · docs:check 0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3 weeks ago
|
|
|
if (owesZero(file)) continue;
|
feat(gate): fase B de P0 — la puerta existe y sabe fallar
El hallazgo mayor confirmado de la auditoría 2026-08-26: ~16 validadores y
429 ficheros de test que nada ejecutaba (sin CI en ninguna rama de la
historia, hooks .sample, eidos-lint sin script npm). Esta fase los cablea:
- `check:gate` (scripts/check-gate.ts): svelte-check con política — src/
debe cero; web/ se mide contra el ledger menguante scripts/check-debt.ts
(34 ficheros, 71 errores congelados; sólo puede bajar, la disciplina de
theming-census-debt). Guard anti-vacío: sin marcador COMPLETED o con
conteo que no cuadra, falla — un gate que no inspeccionó nada no pasa.
- `eidos:lint` deja de ser invocación cruda (exit 1 real en invalid/dead).
- `gate`: check:gate → validadores rápidos → vitest al final. `lint` queda
deliberadamente FUERA: hay ~2.300 ficheros de deuda de formato
preexistente (nunca se formateó el repo entero; el one-shot pendiente es
`npm run format` en árbol quieto y re-añadirlo — documentado en el hook).
- scripts/hooks/pre-push: la fuente del hook, SIN armar. Se armó en
caliente, bloqueó el push legítimo del eje theming (secuencia mal: verde
primero, puerta después) y se desarmó — de paso la puerta demostró que
sabe fallar, que era el requisito de verificación de la fase.
- .prettierrc endOfLine:auto — neutraliza la clase CRLF/autocrlf de
Windows (~350 falsos rojos), sin cambiar formato real.
Verificación: check:gate exit 0 sobre HEAD (71 dentro del ledger, src/ a
cero tras 9d6533cb7 del eje navigation-menu) · sondeo individual del resto
de miembros del gate: verdes salvo los adjudicados en fase A.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
const allowed = CHECK_DEBT[file];
|
|
|
|
|
if (allowed === undefined) {
|
|
|
|
|
failed = true;
|
|
|
|
|
console.error(`check-gate: NEW debt — ${file} has ${count} error(s) and no ledger entry.`);
|
|
|
|
|
} else if (count > allowed) {
|
|
|
|
|
failed = true;
|
|
|
|
|
console.error(
|
|
|
|
|
`check-gate: debt GREW — ${file} has ${count} error(s), ledger allows ${allowed}.`
|
|
|
|
|
);
|
|
|
|
|
} else if (count < allowed) {
|
|
|
|
|
console.log(
|
|
|
|
|
`check-gate: debt shrank — ${file} is at ${count} (ledger says ${allowed}); lower the entry.`
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (const file of Object.keys(CHECK_DEBT)) {
|
|
|
|
|
if (!errorsByFile.has(file)) {
|
|
|
|
|
console.log(`check-gate: ${file} is clean — remove its ledger entry.`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!failed) console.log(`check-gate: OK — ${reportedErrors} error(s), all within the ledger.`);
|
|
|
|
|
process.exit(failed ? 1 : 0);
|