docs: el repositorio, el formato y los guards de texto entran en el corpus; cuatro afirmaciones caducas mueren (documentación del cierre)
El plan de cierre cambió cosas de un nivel que el corpus no cubría: la forma del
repositorio, la política de formato, el inventario de lo generado y la clase de
guard que lee TEXTO fuente. Un inventario previo de todo `docs/**` (más los
README de raíz, `src/**` y `apps/**`) midió qué había: los temas de capa estaban
cubiertos, y este nivel no.
NUEVO
- `docs/repository.md` (E0): las zonas y quién escribe en cada una; la LEY de
`web/routes/` congelado y sus dos consecuencias (los validadores de navegador
siguen manuales; el formato no llega ahí); un solo install y un solo workspace
(el argumento de la copia única de Svelte); un solo mapa de importación con el
orden como contrato; qué debe cero y qué debe un ledger que solo mengua.
Enlazada desde el mapa, el README de la raíz, getting-started y AGENTS.md.
- `docs/testing-and-tooling.md` §Format policy: `.prettierignore` enumerado y
justificado (cinco clases), el commit único de formato, el
`git config blame.ignoreRevsFile` que hay que ejecutar a mano y que Gitea no
lo lee.
- `docs/testing-and-tooling.md` §Guards that read source text: la doctrina que
faltaba. Un guard de texto está acoplado al formateador; el positivo se pone
ROJO y te enteras, el NEGATIVO pasa en VERDE sin inspeccionar nada. Los cinco
síntomas medidos en el formateo de una sola vez, seis reglas para escribir uno
que no dependa del formato, y los cuatro pasos antes de commitear un formateo
masivo (neutralidad compilada, la vista de los guards, los validadores que NO
están en el gate, un commit puro).
CORREGIDO (afirmaciones vivas y falsas)
- `README.md` de la raíz: era una plantilla vacía que mandaba `npm install
vicen` con el repositorio `private: true` y sin paquete. Ahora es una puerta.
- `AGENTS.md`: su pre-flight INVIOLABLE mandaba leer dos guías del árbol
congelado (el canónico está migrado), su ejemplo de test apuntaba a
`src/lib/ling/`, borrado en el refactor, y describía cuatro librerías que no
existen. Además decía que los comentarios en castellano valen, contra
CLAUDE.md.
- `docs/theming/guide.md`: los cuatro sitios que llamaban `eidos.listThemes()`
DENTRO de `hooks.server.ts`, donde no hay instancia; ahora `THEME_IDS`
derivado con `listEidosThemes(config)` del módulo que la raíz también importa.
- `docs/architecture/active-uix.md`: la regla 6 decía que la raíz no proyecta
preferencias; hoy standalone proyecta por defecto (`projectPrefs`, `@default
true`) y attach es opt-in. Su ejemplo de arranque montaba una SEGUNDA
proyección a mano.
- `announce`: el opt-in queda calificado (motor desnudo) frente al cableado por
defecto de las raíces, en `book-deviations.md`, `channels.md:58` y el docblock
del canal.
- `docs/getting-started.md` y `docs/architecture/morfo.md`: la política de
`check:gate` también cubre `scripts/`.
- `docs/canon/direction-contract.md`: los dueños literales de la marca (`boot`,
`projection-<n>`) pasan a la prosa, citables por un guard.
- `src/uix/eidos/components/README.md`: regla 8 — un bindable se reenvía con
`bind:`, nunca por el spread del resto (el proxy de rest props no lleva
`set`, así que el tipo promete lo que no ata). Con el `ref` en la superficie
del `Button` y el gap RESUELTO en `cookie-consent`.
`docs/canon/vocabularies.md` y `src/libs/emoji/data.ts` aparecen por fin como
artefactos generados, con su comando.
Ledger: L-133 · L-142 · L-143 · L-154 a ARREGLADO; L-152 conserva los 532
ficheros pero ya con doctrina escrita; nuevas L-161…L-165 (la última, DIFERIDA:
nadie obliga aún a que un guard de texto falle con el corpus vacío).
Verificación: `npm run gate` exit 0 en 542 s — lint limpio · check:gate OK
(89 de web/ en el ledger) · docs:check 0/0 en 822 docs · suite 466/466 ficheros,
5445/5445 tests · apps:check verde. `component:audit` exit 0 con PASS 161 /
NEEDS-WORK 5, las cifras de antes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3 weeks ago
|
|
|
|
---
|
|
|
|
|
|
title: The Repository
|
|
|
|
|
|
type: reference
|
|
|
|
|
|
audience: human + agent
|
|
|
|
|
|
authority: reference — the zones of this repository, who may write in each, and the invariants that hold them apart
|
|
|
|
|
|
status: current
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# The Repository
|
|
|
|
|
|
|
|
|
|
|
|
One tree, one install, one gate. [`docs/README.md`](./README.md) is the map of
|
|
|
|
|
|
the **docs**; this is the map of the **repository**: what each zone is, who may
|
|
|
|
|
|
write in it, and the few invariants that keep the zones from bleeding into each
|
|
|
|
|
|
other. The path from clone to first change is
|
|
|
|
|
|
[`getting-started.md`](./getting-started.md).
|
|
|
|
|
|
|
|
|
|
|
|
## The zones
|
|
|
|
|
|
|
|
|
|
|
|
| Zone | What it is | Who writes it |
|
|
|
|
|
|
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------- |
|
|
|
|
|
|
| `src/uix/` | The layers — `morfo` (contract), `soma` (behavior), `sema` (perceptual engine), `eidos` (CSS) — plus the `active-uix` composition root and the `blocks` tier | the framework |
|
|
|
|
|
|
| `src/arts/` · `src/libs/` · `src/svrs/` · `src/packs/` | Runtime artifacts, zero-dependency helpers, server-authoritative engines, the opt-in pack tier | the framework |
|
|
|
|
|
|
| `web/routes/` | The demo site Kit serves (`kit.files.routes`). **FROZEN** — see below | nobody |
|
|
|
|
|
|
| `apps/*` | npm workspaces that consume the framework as source; `apps/base` is the reference consumer | app authors |
|
|
|
|
|
|
| `scripts/` | The tooling: validators, generators, the pre-push hook. Type-checked and owing zero, like `src/` | whoever adds or fixes a guard |
|
|
|
|
|
|
| `docs/` | The doc corpus (strata E0–E5), plus `docs/process/` for the ephemeral record | doc authors |
|
|
|
|
|
|
| `static/` | Fonts, sounds, images served by URL; an app copies what it needs into its own `static/` | the framework |
|
|
|
|
|
|
|
|
|
|
|
|
Two zones are NOT source: `src/docs/` holds the book manuscripts the canon comes
|
|
|
|
|
|
from, and `src/lib/_demo` holds the frozen demo site's own widgets (the `$demo`
|
|
|
|
|
|
alias).
|
|
|
|
|
|
|
|
|
|
|
|
## `web/routes/` is frozen
|
|
|
|
|
|
|
|
|
|
|
|
The demo tree is being rebuilt from scratch, so it is **read-only**: read it as
|
|
|
|
|
|
a reference for composition, never edit it. Two consequences that bite:
|
|
|
|
|
|
|
|
|
|
|
|
- the browser-driven validators (`morfo:check`, `perm:check`, `smoke`,
|
|
|
|
|
|
`layer:check`) and the demo rules of `component:audit` validate AGAINST that
|
|
|
|
|
|
frozen tree, so they stay manual until an app tree replaces them;
|
|
|
|
|
|
- `web/` is in `.prettierignore`, so the format policy does not reach it.
|
|
|
|
|
|
|
|
|
|
|
|
## One install, one workspace
|
|
|
|
|
|
|
|
|
|
|
|
The root `package.json` declares `workspaces: ["apps/*"]`: one `node_modules`,
|
|
|
|
|
|
one lockfile, one copy of `svelte`, `vite` and `@sveltejs/kit` for the framework
|
|
|
|
|
|
and every app. Two copies of Svelte would be two runes runtimes, and the
|
|
|
|
|
|
framework's `.svelte.ts` modules would not share state with an app's components.
|
|
|
|
|
|
Vite derives the workspace root from that field, which is what lets an app's dev
|
|
|
|
|
|
server read files under `src/` with no `server.fs.allow`. The contract an app
|
|
|
|
|
|
follows — aliases, runes, composition root, CSS and assets, the pre-hydration
|
|
|
|
|
|
boot — is [`consuming.md`](./consuming.md).
|
|
|
|
|
|
|
|
|
|
|
|
## One import map
|
|
|
|
|
|
|
|
|
|
|
|
Every `$…` / `@/` specifier resolves through ONE module,
|
|
|
|
|
|
[`uix.aliases.js`](../uix.aliases.js), imported by `vite.config.ts`,
|
|
|
|
|
|
`svelte.config.js`, `scripts/generate-boot.ts`, `scripts/docs-check.ts` and each
|
|
|
|
|
|
app's `svelte.config.js`. Order is load-bearing — Vite and esbuild match a
|
|
|
|
|
|
string alias as a PREFIX, so a longer specifier must precede any key that is its
|
|
|
|
|
|
prefix — and `src/uix/aliases.test.ts` fails on a second copy, a broken order,
|
|
|
|
|
|
or a target that is not on disk. The table summary lives in
|
|
|
|
|
|
[`CLAUDE.md`](../CLAUDE.md) → Path Aliases.
|
|
|
|
|
|
|
|
|
|
|
|
## The framework owes zero, the demo tree owes a shrinking ledger
|
|
|
|
|
|
|
|
|
|
|
|
`npm run check:gate` fails on any type error under `src/` or `scripts/`; errors
|
|
|
|
|
|
in the frozen `web/` tree are measured against a per-file ledger that may only
|
|
|
|
|
|
shrink. That policy, the whole gate chain and the pre-push hook are in
|
|
|
|
|
|
[`testing-and-tooling.md`](./testing-and-tooling.md) § The gate — with the
|
|
|
|
|
|
format policy and the inventory of generated artifacts in the same page.
|
|
|
|
|
|
|
|
|
|
|
|
## What is open
|
|
|
|
|
|
|
|
|
|
|
|
The framework's open rows live in one place, by id:
|
|
|
|
|
|
[`docs/process/LEDGER-cierre-2026-09.md`](./process/LEDGER-cierre-2026-09.md).
|
|
|
|
|
|
It is process — a record of what happened, never a source of truth for how the
|
|
|
|
|
|
framework works — but it is the only place that knows what was deferred and why.
|
|
|
|
|
|
The `CONTINUE-*.md` hand-offs beside it are frozen and point at it.
|