docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
---
title: UIX Decision & RFC Index
type: index
audience: human + agent
authority: navigational — the single entry point to the design/RFC corpus
status: current
related:
canon: docs/CANON.md (semantic vocabulary)
theming: docs/theming/reference.md (eidos visual system, canonical reference)
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
---
# UIX Decision & RFC Index
This is the **entry point to the framework's design rationale** — the RFCs, the
per-subsystem design documents, and the decision logs. It is the E3 stratum of
docs(media-player): la calidad de reproduccion, especificada sin implementar
Decision del usuario: escribir el contrato antes de tocar codigo.
El documento existe porque `settings-button` lleva declarada desde el principio
prometiendo «velocidad / calidad / pista», y al ir a implementarla resulta que
dos de los tres ejes ya no le corresponden y el tercero no existe.
Auditado sobre el codigo: grep de `quality|bitrate|resolution|level|
representation` sobre el puerto da CERO. Ni `MediaSnapshot` (0 de 14 campos), ni
`MediaProvider` (0 de 9 miembros), ni los espejos de `$arts/sound`.
Y no es un descuido: la calidad NO es intrinseca al `<video>`. Un fichero no
tiene niveles; los niveles aparecen con un manifiesto HLS/DASH y un motor que
elige representacion. Este framework no vendoriza motores, asi que la lista solo
puede venir del consumidor. De ahi que el contrato, si se abre, sera una lista
VACIA para el 90 % de los usos — lo que decide la forma: el control se AUSENTA,
no sale vacio. Misma doctrina que el waveform sin picos.
Queda escrito el contrato minimo (3 campos de snapshot con `qualityId` separado
de `qualityAuto`, `setQuality`, los dos espejos, el evento de morfo que rompe el
censo de 11, los textos) y la trampa que ya nos mordio con la velocidad: el
commit cabalga el RESULTADO, no el clic — pedir 1080p no es haberlo conseguido.
Registrado en el indice `docs/decisions.md`. docs:check 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
the corpus: _why it is built the way it is_ . Architecture (how the layers fit)
lives in [`architecture/active-architecture.md` ](./architecture/active-architecture.md );
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
the semantic vocabulary lives in [`CANON.md` ](./CANON.md ); this file collects the
docs(media-player): la calidad de reproduccion, especificada sin implementar
Decision del usuario: escribir el contrato antes de tocar codigo.
El documento existe porque `settings-button` lleva declarada desde el principio
prometiendo «velocidad / calidad / pista», y al ir a implementarla resulta que
dos de los tres ejes ya no le corresponden y el tercero no existe.
Auditado sobre el codigo: grep de `quality|bitrate|resolution|level|
representation` sobre el puerto da CERO. Ni `MediaSnapshot` (0 de 14 campos), ni
`MediaProvider` (0 de 9 miembros), ni los espejos de `$arts/sound`.
Y no es un descuido: la calidad NO es intrinseca al `<video>`. Un fichero no
tiene niveles; los niveles aparecen con un manifiesto HLS/DASH y un motor que
elige representacion. Este framework no vendoriza motores, asi que la lista solo
puede venir del consumidor. De ahi que el contrato, si se abre, sera una lista
VACIA para el 90 % de los usos — lo que decide la forma: el control se AUSENTA,
no sale vacio. Misma doctrina que el waveform sin picos.
Queda escrito el contrato minimo (3 campos de snapshot con `qualityId` separado
de `qualityAuto`, `setQuality`, los dos espejos, el evento de morfo que rompe el
censo de 11, los textos) y la trampa que ya nos mordio con la velocidad: el
commit cabalga el RESULTADO, no el clic — pedir 1080p no es haberlo conseguido.
Registrado en el indice `docs/decisions.md`. docs:check 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
_decisions_.
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
Each entry gives the document, its status, and the one decision it records. Open
the document for the full argument — this index never copies it.
docs(book): F7.4 (4/4) — color-engine RFC translated; rfcs/ batch COMPLETE
COLOR_ENGINE_RFC (619 L, the largest RFC) -> rfcs/rfc-color-engine.md,
Spanish to English, same section numbering (s0 TL;DR, s6 generator +
s6.1 isomorphism + s6.2 deriveScheme/buildScheme, s7 wide-gamut
strategies, s8 APCA, s10 frozen invariants, s11 phases with 4-bis
implemented, s13 bloat-doc absorption, s14 comparison). Its
THEMING_AUDIT citation notes the audit is retired; the s25/s26 canon
citations point into theming/reference.md. decisions.md row repointed +
Status aligned (implemented through phase 4-bis); the index's naming
note rewritten — the deferred eidos-RFC rename is now DONE via stubs,
while the arts DESIGN_* docs keep their legacy names in place (their
citations were not swept).
F7.4 complete: 7 RFCs live at docs/rfcs/rfc-{scaling, structure, depth,
shape, typography, color-model, color-engine}.md; MOTION_SERVICE_RFC
stays in src (foreign/concurrent). docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
> **Naming note.** The eidos RFCs were renamed to `rfc-*` when they moved into
> `docs/rfcs/` (docs-book F7.4, 2026-07-02). The provenance anchors cited from
> source (e.g. `// (DEPTH_ENGINE_RFC §5)` across `src/uix/eidos/lib/*.ts`)
> keep resolving: every old path holds a stub pointing at the new chapter with
> the same section numbering. The arts design documents got the same treatment
> (arts-docs-reconciliation B2, 2026-07-03): they moved to
> `docs/decisions/design-*.md`, and every old path holds a stub so their
> citations (e.g. `DESIGN_TIMR §12.8` across `src/arts/timer/*`) keep resolving.
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
---
## Eidos — expression channels (the 8 of the book)
docs(book): F7.3 (2/3) — theming/ satellites: guide + notes + channels + motion-guide + changelog
Five theming docs into the book tree:
- docs/theming/guide.md — THEMING_GUIDE (241 L, Spanish -> English): add a
component's recipe step-by-step + the three theme-definition modes.
- docs/theming/notes.md — THEMING_NOTES (168 L, Spanish -> English): the
bundle/feature comparison + the controversial-decisions FAQ (in-page
anchor to s1.bis fixed to a real THEMING link).
- docs/theming/channels.md — CHANNELS_SYNTHESIS (115 L, Spanish ->
English): the per-channel-RFC capstone (two moments, 8 expression vs 3
runtime channels, the builder sextet + applyTheme).
- docs/theming/motion-guide.md — MOTION_GUIDE (213 L, already English):
moved with frontmatter + links repointed.
- docs/theming/changelog.md — THEMING_CHANGELOG (1310 L): chronicle,
moved VERBATIM (recorded history is not translated), links repointed.
Thin stubs at all five old paths; corpus links swept (docs map E3/E4
rows, building-a-component phase 5, decisions umbrella, getting-started,
eidos chapter). docs:check 0 errors (258 docs).
Remaining in F7.3: THEMING.md itself (1499 L) + eidos-motion.md (698 L).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
[`theming/channels.md` ](./theming/channels.md ) is the umbrella:
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
the conceptual synthesis of the book's eight expression channels (time · motion ·
presence · depth · shape · color · sound · haptic). The engine RFCs below take the
visual channels to reference-grade, one at a time, "breaking the model of the
references rather than copying it — with the cage open".
docs(media-player): la calidad de reproduccion, especificada sin implementar
Decision del usuario: escribir el contrato antes de tocar codigo.
El documento existe porque `settings-button` lleva declarada desde el principio
prometiendo «velocidad / calidad / pista», y al ir a implementarla resulta que
dos de los tres ejes ya no le corresponden y el tercero no existe.
Auditado sobre el codigo: grep de `quality|bitrate|resolution|level|
representation` sobre el puerto da CERO. Ni `MediaSnapshot` (0 de 14 campos), ni
`MediaProvider` (0 de 9 miembros), ni los espejos de `$arts/sound`.
Y no es un descuido: la calidad NO es intrinseca al `<video>`. Un fichero no
tiene niveles; los niveles aparecen con un manifiesto HLS/DASH y un motor que
elige representacion. Este framework no vendoriza motores, asi que la lista solo
puede venir del consumidor. De ahi que el contrato, si se abre, sera una lista
VACIA para el 90 % de los usos — lo que decide la forma: el control se AUSENTA,
no sale vacio. Misma doctrina que el waveform sin picos.
Queda escrito el contrato minimo (3 campos de snapshot con `qualityId` separado
de `qualityAuto`, `setQuality`, los dos espejos, el evento de morfo que rompe el
censo de 11, los textos) y la trampa que ya nos mordio con la velocidad: el
commit cabalga el RESULTADO, no el clic — pedir 1080p no es haberlo conseguido.
Registrado en el indice `docs/decisions.md`. docs:check 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
| RFC | Status | The decision it records |
| --------------------------------------------------- | ------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`rfc-color-model.md` ](./rfcs/rfc-color-model.md ) | RESUELTO (2026-06-02) — canon in [`theming/reference.md` ](./theming/reference.md ) §25 | The conceptual color model: rich palette (33 scales) + hierarchy roles by explicit alias + intents auto-derived from the palette (identity = step 9). Rejected the "intent = single-anchor" variant. |
| [`rfc-color-engine.md` ](./rfcs/rfc-color-engine.md ) | ✅ Implementado (hasta fase 4-bis) | The _physical_ layer of color: OKLCH · P3 wide-gamut · APCA contrast · 1-seed generator. Changes how the color variables are produced, not which exist or what they mean. |
| [`rfc-typography.md` ](./rfcs/rfc-typography.md ) | ✅ Implementado (fases 1– 5) | Typography to reference-grade, additively behind the frozen token contract (audit → compare → extend, mirroring color). |
| [`rfc-depth.md` ](./rfcs/rfc-depth.md ) | ✅ Implementado (fases 1– 5) | The depth/presence channel: "depth is not something an element _has_ , it is something that _happens_ ". Two-moment model (state + event). |
| [`rfc-shape.md` ](./rfcs/rfc-shape.md ) | ✅ Implementado (fases 1– 5) | The shape channel (the book's 8th and last expression channel) as orthogonal axes on top of the untouched `--radius-*` magnitude. |
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
## Eidos — structural systems
docs(media-player): la calidad de reproduccion, especificada sin implementar
Decision del usuario: escribir el contrato antes de tocar codigo.
El documento existe porque `settings-button` lleva declarada desde el principio
prometiendo «velocidad / calidad / pista», y al ir a implementarla resulta que
dos de los tres ejes ya no le corresponden y el tercero no existe.
Auditado sobre el codigo: grep de `quality|bitrate|resolution|level|
representation` sobre el puerto da CERO. Ni `MediaSnapshot` (0 de 14 campos), ni
`MediaProvider` (0 de 9 miembros), ni los espejos de `$arts/sound`.
Y no es un descuido: la calidad NO es intrinseca al `<video>`. Un fichero no
tiene niveles; los niveles aparecen con un manifiesto HLS/DASH y un motor que
elige representacion. Este framework no vendoriza motores, asi que la lista solo
puede venir del consumidor. De ahi que el contrato, si se abre, sera una lista
VACIA para el 90 % de los usos — lo que decide la forma: el control se AUSENTA,
no sale vacio. Misma doctrina que el waveform sin picos.
Queda escrito el contrato minimo (3 campos de snapshot con `qualityId` separado
de `qualityAuto`, `setQuality`, los dos espejos, el evento de morfo que rompe el
censo de 11, los textos) y la trampa que ya nos mordio con la velocidad: el
commit cabalga el RESULTADO, no el clic — pedir 1080p no es haberlo conseguido.
Registrado en el indice `docs/decisions.md`. docs:check 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
| RFC | Status | The decision it records |
| --------------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`rfc-structure.md` ](./rfcs/rfc-structure.md ) | Propuesta | Space · density · scale as state-only structural systems (the stage, not the event): rhythm, fluidity, axis composition under the open cage. |
| [`rfc-scaling.md` ](./rfcs/rfc-scaling.md ) | ✅ IMPLEMENTADO (2026-06-02) | Splits global zoom (`scaling`: 90/95/100/105/110) from density. Scales space + control-height + font-size + icon-size; radius/border/shadow/line-height excluded on purpose. |
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
## Arts — subsystem design documents
Exhaustive design-and-implementation records for the harder runtime artifacts.
Each predates the 2026-05-14 directory-rename sweep and carries a historical-note
header about the old short names (`conn`/`timr`/`sess`). Moved into the corpus
(B2, 2026-07-03); a stub at each old `src/arts/*` path keeps the source
provenance citations resolving. `design-timer.md` is kept verbatim in Spanish.
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
docs(media-player): la calidad de reproduccion, especificada sin implementar
Decision del usuario: escribir el contrato antes de tocar codigo.
El documento existe porque `settings-button` lleva declarada desde el principio
prometiendo «velocidad / calidad / pista», y al ir a implementarla resulta que
dos de los tres ejes ya no le corresponden y el tercero no existe.
Auditado sobre el codigo: grep de `quality|bitrate|resolution|level|
representation` sobre el puerto da CERO. Ni `MediaSnapshot` (0 de 14 campos), ni
`MediaProvider` (0 de 9 miembros), ni los espejos de `$arts/sound`.
Y no es un descuido: la calidad NO es intrinseca al `<video>`. Un fichero no
tiene niveles; los niveles aparecen con un manifiesto HLS/DASH y un motor que
elige representacion. Este framework no vendoriza motores, asi que la lista solo
puede venir del consumidor. De ahi que el contrato, si se abre, sera una lista
VACIA para el 90 % de los usos — lo que decide la forma: el control se AUSENTA,
no sale vacio. Misma doctrina que el waveform sin picos.
Queda escrito el contrato minimo (3 campos de snapshot con `qualityId` separado
de `qualityAuto`, `setQuality`, los dos espejos, el evento de morfo que rompe el
censo de 11, los textos) y la trampa que ya nos mordio con la velocidad: el
commit cabalga el RESULTADO, no el clic — pedir 1080p no es haberlo conseguido.
Registrado en el indice `docs/decisions.md`. docs:check 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
| Document | Subsystem | The decision it records |
| ---------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------- |
| [`design-connection.md` ](./decisions/design-connection.md ) | `connection` | Realtime connection registry: transports, reconnect, heartbeat, request/reply, channels, session bridge. |
| [`design-timer.md` ](./decisions/design-timer.md ) | `timer` | Deterministic timer scheduler: clock injection, the race-safety contract (§12.8), one-shots, intervals, backoff. |
| [`design-session.md` ](./decisions/design-session.md ) | `session` | Session lifecycle consultation: adopt/revoke/refresh, profile loading, SSR via cookie reader. |
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
feat(packs+text): incorporate the animation collection — Ambient pack + text-effects family + docs
Two streams, split by what the animation touches:
STREAM A — decorative backgrounds → the pack tier
- arts/scene: a consolidated scene runtime ($scene) that owns, once, the
citizenship every ad-hoc background reinvented or skipped (frame loop,
off-view pause, DPR cap, mandatory reduced-motion, WebGL context
loss/restore, scene budget, teardown). SceneDom port (adom satisfies it),
webgl/webgl2/canvas2d drivers + a custom-pipeline extension (vertexShader +
draw + glContext.depth/dprCap) for real geometry (beam, particles, dither,
grid, eter, pixel-blast, hyperspeed). 32 effects as shared resources.
- src/packs/ambient: the first pack — <Ambient effect="…"> mounts a registered
effect; the P contract (P-1..P-6) guarded by scripts/packs-check.ts; colors
are token-aware (P-4). One-way dependency, removable-by-construction.
- resolveToken extended to semantic color slots (--color-{role}-{slot}) so
consumers resolve theme tokens to concrete colors (the P-4 half).
STREAM B — animations over real text → canon
- Six components (count-up + text-{gradient,circular,blur,focus,scramble}):
each a morfo + eidos recipe (where there's styling) + demo. CountUp is a
service component (counts through uix.format.numbers). The five Text* are
passive decoratives. Upgrades over the seeds: SR hardening (real text
visually-hidden + aria-hidden decoration), a11y fix (no fake role=button),
measurement discipline (cached rects via dom.measure, no reflow storm),
reduced-motion, ecosystem citizenship (eidos.dom/timers, no raw platform).
- MorfoElement gains 'p'.
DOCS
- docs/architecture/packs.md (pack tier, admission rule, P contract, Aura
promotion path); docs/decisions/design-text-effects.md (the family design
record) + indexed in decisions.md / README.md; glossary entries
(scene/Ambient/Aura/text effects); scene README custom-pipeline + authoring
bridge; motion-guide content-effects note; strata tables acknowledge packs.
Gates: component:audit 141/0/0 · docs:check 0/0 · scene tests 9/9 · packs:check
0/36 · check 0 own errors. Verified in browser (32 effects mount+compile;
6 text components SSR+hydrate, CountUp re-formats by locale live, TextGradient
resolves token stops to OKLCH via var()).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
## Component families — design records
Design records for component families whose doctrine spans several components
(so it belongs in one durable place, not scattered across per-component READMEs).
docs(media-player): la calidad de reproduccion, especificada sin implementar
Decision del usuario: escribir el contrato antes de tocar codigo.
El documento existe porque `settings-button` lleva declarada desde el principio
prometiendo «velocidad / calidad / pista», y al ir a implementarla resulta que
dos de los tres ejes ya no le corresponden y el tercero no existe.
Auditado sobre el codigo: grep de `quality|bitrate|resolution|level|
representation` sobre el puerto da CERO. Ni `MediaSnapshot` (0 de 14 campos), ni
`MediaProvider` (0 de 9 miembros), ni los espejos de `$arts/sound`.
Y no es un descuido: la calidad NO es intrinseca al `<video>`. Un fichero no
tiene niveles; los niveles aparecen con un manifiesto HLS/DASH y un motor que
elige representacion. Este framework no vendoriza motores, asi que la lista solo
puede venir del consumidor. De ahi que el contrato, si se abre, sera una lista
VACIA para el 90 % de los usos — lo que decide la forma: el control se AUSENTA,
no sale vacio. Misma doctrina que el waveform sin picos.
Queda escrito el contrato minimo (3 campos de snapshot con `qualityId` separado
de `qualityAuto`, `setQuality`, los dos espejos, el evento de morfo que rompe el
censo de 11, los textos) y la trampa que ya nos mordio con la velocidad: el
commit cabalga el RESULTADO, no el clic — pedir 1080p no es haberlo conseguido.
Registrado en el indice `docs/decisions.md`. docs:check 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
| Document | Family | The decision it records |
| ---------------------------------------------------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`design-media-quality.md` ](./decisions/design-media-quality.md ) | `media-player` | **Especificado, no implementado.** Por qué la calidad de reproducción no está en el puerto `MediaProvider` y nunca podría estarlo con un `<video src>` plano (los niveles los aporta un motor HLS/DASH que el framework no vendoriza); el contrato mínimo si se abre (3 campos de snapshot + `setQuality` + los espejos de `$arts/sound` + un evento de morfo que rompe el censo de 11); por qué el control se AUSENTA en vez de salir vacío; y por qué `settings-button` sigue declarado y sin implementar. |
| [`design-text-effects.md` ](./decisions/design-text-effects.md ) | text effects | Why animations applied to real text are **canon** (a11y surface = contract surface) while backgrounds are the pack tier; the CountUp-service vs `Text*` -decorative split (D-T1/D-T2); the shared doctrine every member obeys (content-is-the-SR-surface, no fake interactivity, measurement discipline, reduced motion, ecosystem citizenship, theme-aware color); per-member animation home (D-T5); the `TextCircular` →`Aura` connection. |
| [`design-chat-block.md` ](./decisions/design-chat-block.md ) | chat (`chat-*`) | Why the messaging block **composes** the ecosystem (triple-registered `Feed` + anchored `VirtualList` , `Textarea` , `FileUpload` , lucide `Icon` ) instead of reinventing; the five sector failures it beats (a11y feed + separate live region, virtualization, transport-agnostic, headless-with-logic, threads/reactions); the anchoring doctrine (monotonic sticky, real-DOM pin); the reference visual redesign (soft bubbles, tapback bar, canonical size contract); and the two framework fixes it surfaced (langs `#?` -prefix, `commit-set-resize` `channels:[]` ). |
feat(packs+text): incorporate the animation collection — Ambient pack + text-effects family + docs
Two streams, split by what the animation touches:
STREAM A — decorative backgrounds → the pack tier
- arts/scene: a consolidated scene runtime ($scene) that owns, once, the
citizenship every ad-hoc background reinvented or skipped (frame loop,
off-view pause, DPR cap, mandatory reduced-motion, WebGL context
loss/restore, scene budget, teardown). SceneDom port (adom satisfies it),
webgl/webgl2/canvas2d drivers + a custom-pipeline extension (vertexShader +
draw + glContext.depth/dprCap) for real geometry (beam, particles, dither,
grid, eter, pixel-blast, hyperspeed). 32 effects as shared resources.
- src/packs/ambient: the first pack — <Ambient effect="…"> mounts a registered
effect; the P contract (P-1..P-6) guarded by scripts/packs-check.ts; colors
are token-aware (P-4). One-way dependency, removable-by-construction.
- resolveToken extended to semantic color slots (--color-{role}-{slot}) so
consumers resolve theme tokens to concrete colors (the P-4 half).
STREAM B — animations over real text → canon
- Six components (count-up + text-{gradient,circular,blur,focus,scramble}):
each a morfo + eidos recipe (where there's styling) + demo. CountUp is a
service component (counts through uix.format.numbers). The five Text* are
passive decoratives. Upgrades over the seeds: SR hardening (real text
visually-hidden + aria-hidden decoration), a11y fix (no fake role=button),
measurement discipline (cached rects via dom.measure, no reflow storm),
reduced-motion, ecosystem citizenship (eidos.dom/timers, no raw platform).
- MorfoElement gains 'p'.
DOCS
- docs/architecture/packs.md (pack tier, admission rule, P contract, Aura
promotion path); docs/decisions/design-text-effects.md (the family design
record) + indexed in decisions.md / README.md; glossary entries
(scene/Ambient/Aura/text effects); scene README custom-pipeline + authoring
bridge; motion-guide content-effects note; strata tables acknowledge packs.
Gates: component:audit 141/0/0 · docs:check 0/0 · scene tests 9/9 · packs:check
0/36 · check 0 own errors. Verified in browser (32 effects mount+compile;
6 text components SSR+hydrate, CountUp re-formats by locale live, TextGradient
resolves token stops to OKLCH via var()).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
docs(corpus): add docs/decisions.md — the RFC/design decision index
A single E3 entry point cataloguing the design rationale: the 7 eidos RFCs
(color model/engine, typography/depth/shape/structure engines, scaling), the
3 arts subsystem design docs (connection/timer/session), and the cross-cutting
decision logs (LIBRO_VARIACIONES, GESTURES). Each entry gives status + the one
decision it records, linking the document for the full argument.
This delivers the "naming único" goal at the index level. The physical file
rename (*_RFC -> rfc-*, DESIGN_* -> design-*) is deferred: those names are cited
as provenance anchors in ~30 source files (eidos/lib/*.ts, arts/timer/*,
arts/color/*, tests), so a rename only pays off if every citation is swept in
the same pass. The index gives consistent naming without that churn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
## Cross-cutting decision logs
docs(media-player): la calidad de reproduccion, especificada sin implementar
Decision del usuario: escribir el contrato antes de tocar codigo.
El documento existe porque `settings-button` lleva declarada desde el principio
prometiendo «velocidad / calidad / pista», y al ir a implementarla resulta que
dos de los tres ejes ya no le corresponden y el tercero no existe.
Auditado sobre el codigo: grep de `quality|bitrate|resolution|level|
representation` sobre el puerto da CERO. Ni `MediaSnapshot` (0 de 14 campos), ni
`MediaProvider` (0 de 9 miembros), ni los espejos de `$arts/sound`.
Y no es un descuido: la calidad NO es intrinseca al `<video>`. Un fichero no
tiene niveles; los niveles aparecen con un manifiesto HLS/DASH y un motor que
elige representacion. Este framework no vendoriza motores, asi que la lista solo
puede venir del consumidor. De ahi que el contrato, si se abre, sera una lista
VACIA para el 90 % de los usos — lo que decide la forma: el control se AUSENTA,
no sale vacio. Misma doctrina que el waveform sin picos.
Queda escrito el contrato minimo (3 campos de snapshot con `qualityId` separado
de `qualityAuto`, `setQuality`, los dos espejos, el evento de morfo que rompe el
censo de 11, los textos) y la trampa que ya nos mordio con la velocidad: el
commit cabalga el RESULTADO, no el clic — pedir 1080p no es haberlo conseguido.
Registrado en el indice `docs/decisions.md`. docs:check 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
| Document | The decision it records |
| ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`LIBRO_VARIACIONES_Y_EXTENSIONES.md` ](../src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md ) | The running log of where the implementation deviates from (or extends) the book's editorial canon — verbs, adoptions, clusters, and the D.x architectural decisions. The seed for a consolidated decision-log. |
| [`GESTURES.md` ](../src/uix/soma/layers/gesture/GESTURES.md ) | The soma gesture layer design: `Gesture.base` /`drag`/`resize`, velocity ring-buffer, axis lock, deferred pointer capture. |
| [`architecture/active-architecture.md` §7 + `arts/adom`/`arts/perf` READMEs ](./architecture/active-architecture.md ) | **Sec-dom — read-timing & token-resolution (2026-06-29).** The framework governs layout READS like it governs writes: `dom.measure` (coalesced post-layout reads), `eidos.resolveToken` (token→colour in JS, no `getComputedStyle` probe), the discoverable `uix.color` /`uix.perf` surfaces. Decided: **reject** a static grep-guard (too noisy across ~120 legit reads, and it can't catch the sync-read-after-write _ordering_ nor cover routes) — the dev `uix.perf` detector (Long Animation Frames) is the runtime safety net instead. |
| [`canon/direction-contract.md` ](./canon/direction-contract.md ) §1, §2, §6 | **Direction endgame — physics over convention (ratified 2026-08-05).** Four decisions signed at once: (D1) the chain gains the CONTEXT link — every `activeDir` publishes its assertion and descendants consult it before prefs, the "implicit inheritance" phase reopened and ratified, closing both field-measured holes (in-place and portal) with one mechanism; (D2) the attribute stamps ONLY the assertion — prefs leave the per-component chain and reach the page once, through the now-AUTOMATIC boot projection (opt-out in standalone, opt-in in attach), with the environment SEED (`readPrefsEnvironmentFromDom`) adopting a hand-set `<html dir>` at precedence `intent > env > derive(language) > default` ; (D3) the stamping mechanism belongs to the MORFO — `direction: { parts }` declares it, `soma.runtime<M>` computes the requirement from the declaration (required when declared, forbidden when not), `compileMorfo` validates part names fail-closed, and the census guard crosses prop ↔ morfo; (D4) the API census (7 components without the prop + chat-log) stays POSTPONED by explicit decision. |
docs(media-player): la calidad de reproduccion, especificada sin implementar
Decision del usuario: escribir el contrato antes de tocar codigo.
El documento existe porque `settings-button` lleva declarada desde el principio
prometiendo «velocidad / calidad / pista», y al ir a implementarla resulta que
dos de los tres ejes ya no le corresponden y el tercero no existe.
Auditado sobre el codigo: grep de `quality|bitrate|resolution|level|
representation` sobre el puerto da CERO. Ni `MediaSnapshot` (0 de 14 campos), ni
`MediaProvider` (0 de 9 miembros), ni los espejos de `$arts/sound`.
Y no es un descuido: la calidad NO es intrinseca al `<video>`. Un fichero no
tiene niveles; los niveles aparecen con un manifiesto HLS/DASH y un motor que
elige representacion. Este framework no vendoriza motores, asi que la lista solo
puede venir del consumidor. De ahi que el contrato, si se abre, sera una lista
VACIA para el 90 % de los usos — lo que decide la forma: el control se AUSENTA,
no sale vacio. Misma doctrina que el waveform sin picos.
Queda escrito el contrato minimo (3 campos de snapshot con `qualityId` separado
de `qualityAuto`, `setQuality`, los dos espejos, el evento de morfo que rompe el
censo de 11, los textos) y la trampa que ya nos mordio con la velocidad: el
commit cabalga el RESULTADO, no el clic — pedir 1080p no es haberlo conseguido.
Registrado en el indice `docs/decisions.md`. docs:check 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
| [`canon/direction-contract.md` ](./canon/direction-contract.md ) | **Direction — resolution, assertion and paint.** One chain resolves a component's reading direction, one native attribute asserts it to the DOM, one selector form reads it back. Decided: the resolver stops **before** the default and returns `undefined` , because _nobody asserted a direction_ is a different fact from the default; stamping `dir` is **conditional** on who reads the direction — mandatory when the recipe branches with `:dir()` , needless when the dependence is pure JavaScript; and the static guard (`RTL-1`, `npm run rtl:check` ) is deliberately scoped to the one trap CSS text can reveal — a logical inline anchor paired with a physical inline translate — leaving the chain, the attribute and the selector form to review. |