Cleared the error-severity flags that were mature components missing a
documented exception, not real gaps:
- 4 service components (format-date, format-number, relative-time, trans)
get their E-2.2 exception: they render text via $format/$langs with no
visual recipe — no {name}.css by design.
- alert-dialog gets its R-1.1 exception: it composes Dialog (soma reuses the
Dialog runtime, data-dialog-* markers reach the DOM, dialog.css paints the
chrome) — a [data-alert-dialog] root rule would style nothing.
- card gets its missing A-1.3 texts.label (+ langs entry, registered) —
card had no label at all.
C10 (maturity tiers) reframed after the classification exercise showed the
audit VERDICT is the maturity oracle, and 'experimental' is nearly empty
once exceptions are documented: stable = PASS (82); preview = NEEDS-WORK on
docs/demo only (E-2.3/F-1.x/D-*) — functionally sound but underdocumented,
which includes mature components like button/table/listbox (a README gap is
not immaturity); experimental/WIP = a real FUNCTIONAL gap or foreign track.
C10 folds into C8 (document the tier + exceptions when writing READMEs).
Real gaps registered, NOT silenced: float-panel A-3.7 (28 mutating keyboard
actions, 6 events — a morfo-completeness question), card-group (no morfo),
natural-time-picker A-3.1; announce/clipboard R-1.5 (live-region /
composed-focus) await their READMEs in C8 to host the exception.
npm run check at the 59 baseline; alert-dialog -> PASS.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two real defects the audit's error-severity rules caught:
- onion-menu shipped no default export (E-1.3), unlike every sibling compound;
add 'export default OnionMenu'.
- table + tree-grid referenced 'var(--color-surface-subtle)' — a token that
does not exist (the surface ladder is default/raised/muted/overlay). With no
fallback it resolved to guaranteed-invalid, so the table header + striped rows
rendered with NO background (a silent visual bug R-2.6 flagged). Repointed both
to '--color-surface-muted' (the existing subtle-surface semantic, used for
readonly/muted contexts); verified in the browser the header now paints muted.
A dedicated 'subtle' surface tier is a theme-canon decision, deferred; chronos
(WIP, untouchable) keeps the same reference for its author.
npm run check at the 59 baseline; tree-grid R-2.6 clears.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Accumulated test debt (the eidos suite had been red across several feature
landings — THEME-SYS-1 named z-index, palette-first static donor library,
spin-field extraction, icon stroke-map refinement — none of them regressions;
baselined against HEAD). Each triaged stale-vs-bug by confirming current
behavior in code before touching a line.
Stale tests (code correct/improved, assertion not updated):
- z-index '76' -> 'var(--z-index-overlay-tooltip)' (the code is guarded by
THEME-SYS-1 in contracts.test.ts — the raw integer is forbidden).
- frost '80%' -> 'var(--depth-overlay-translucency, 80%)' (parameterized).
- C7 size-bundle coordinate ('--control-height-md' -> '--size-md-control-height').
- icon visual-stroke ratios 1.5->1.125, 1->0.923 (stroke map md 2->1.5, xxl
icon 48->52px; the arithmetic follows).
- delegate/CSS-only purple-9: the slim foundation legitimately emits the
role-referenced donor scales (purple=primary) as overridable :root defaults;
the real delegation guarantee is 'no baked [data-theme] block', which the
assertion now checks.
Test over-flagging (fixed the test, not the code):
- CSS-only shared layer: spin-field (no wrapper/index) excluded from the
wrapper/barrel/namespace contracts (CSS_ONLY_LAYERS).
- soma-runtime vars: 'var(--x, fallback)' is runtime-optional (the STUMBLES #7
soma->eidos surface) — only bare 'var(--x)' requires a recipe declaration.
- orphan check made corpus-wide: composition means a sibling consumes a
component's tokens (date-picker/month-grid consume calendar-control-*).
- natural-time-picker fixed-tone sky colors documented-exempt (Words-rail
doctrine).
- dialog drift-detector converted to a synthetic fixture (dialog.css no longer
ships the dead rule it self-tested against).
Real code fixes:
- declare '--pin-input-cell-readonly-bg' (I consumed it in C2b without
declaring it).
- remove 5 truly-dead tokens (drawer content-bg + 4 color-field
format-select/segment — 0 consumers anywhere in eidos/soma/web).
- clamp time-picker's 'size' to PopoverSize before forwarding (xs->sm):
TimePickerSize has xs, PopoverSize doesn't — a latent type bug my recipe
change surfaced via a complexity-budget flip. The fix dropped check 61->59,
also clearing navigation-menu-content of the same class.
card-group flagged as a REAL gap (KNOWN_MISSING_MORFO): it ships parts + chrome
but no morfo (morfo-first violation) — tracked, not silenced.
Verified: vitest src/uix/eidos 23 files / 289 tests green; npm run check 59
(better than the 61 baseline); component:audit 0 BROKEN.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The ⚠️ 'canon + guard, not consumed' asterisk is retired: the C7 sweep
made all 34 size-bearing recipes consume the bundle coordinate, so the
row is ✅ (canon + enforcement + consumption). The footnote also drops
the stale control/compact/dense archetypes (superseded by the 2026-06-17
1:1 override) — control text follows the typographic scale 1:1.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The size bundle (--size-{k}-control-height / -font-size / -icon-size,
theming/reference §5) was emitted + guarded but consumed by ONE recipe
(the toggle pilot). This sweep points every recipe at the canonical
size COORDINATE instead of the raw primitive of the same coordinate:
366 refs across 34 recipes (--control-height-{k} -> --size-{k}-control-
height, and the font-size / icon-size coordinates likewise). Retuning a
size's bundle now reaches every consumer; a recipe that maps a key to a
DIFFERENT size's coordinate stays visible as a deliberate deviation.
The bundle vars are pure aliases of the primitives, so this is
computed-value identical — verified in a live browser: the accordion
chain --accordion-trigger-min-height-md = --size-md-control-height =
--control-height-md all resolve to calc(36px * 1 * 1). The generated
diff is 366-for-366 pure name swaps, nothing else moved. base/xxxl have
no size bundle and correctly stay on the typographic primitive.
Guard: recipe-css-contract forbids the raw size-coordinate primitive in
recipe token values (var(--control-height-{k}) etc.) — the drift can't
creep back. This is the ⚠️->✓ that theming/notes' comparison table flags
as the size canon's remaining asterisk (canon + guard, now + consumption).
component:audit 0 BROKEN; npm run check at the 61-error baseline; the
size-bundle guard + palette-cascade guard both green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two user findings from the Knob build exercise (an agent building a new
component from the docs alone — STUMBLES.md).
Quarantine: the superseded fossils no longer share shelf space with the
live corpus. docs/old-deprecated/ (with an index README explaining what
lands there and pointing readers at docs/README.md) now holds the
executed audits and fix plans: fable_audit, fable-eidos-audit,
inherit_audit + inherit_fix_plan, ARCHETYPE_COHERENCE_AUDIT_2026-06-19
(still citable — the component-guide banner and the eidos components
README repoint to it), COMPONENT_COHERENCE_AUDIT. pendiente.md (a live
pending list, not a fossil) moved to docs/process/. docs-check treats
the folder as sealed chronicle (I1/I2 exempt; I6 skips its internal
links, as its README promises). Root-level *.md is now: README, CLAUDE,
AGENTS + the user's own working files.
STUMBLES fixes applied on the spot (the doc-class ones):
- #2 kind drift: the REAL enum is 'public' | 'private' | 'virtual'
(MorfoPartKind, 671/9/14 uses) — morfo.md omitted 'private', the
checklist invented 'internal' (0 uses). Both fixed; I2 gains the
phantom-'internal' guard. A-2.1's row now says what the audit script
actually checks (kebab only — the archetype may vary, the Toggle
provider-IS-trigger doctrine).
- #6: the langs catalog SHAPE (flat keys, per-language leaves, named
export, index registration) is now shown in morfo.md instead of only
its location.
- #8: component-audit s0 defines the minimum brief package as an
explicit 8-file list.
The engineering-class stumbles are registered as plan batches S1-S6
(generated vocabularies appendix, continuous-gesture trigger doctrine,
part-absent condition, Gesture.rotate, the soma->eidos CSS-var
contract, minor frictions). docs:check 0 errors, 11-warn baseline.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
palette-{slot} is now RESERVED recipe vocabulary: normalizeRecipeTokens
(render-css) appends the full per-scale color:{scale} cascade for every
donor scale in PALETTE_SCALES to any token named palette-track/element/
border/solid/solid-hover/text/contrast — author-declared color:*
declarations win, only absent scales are appended. This is the
structural end of the hand-maintained-subset era: a recipe opts into
the per-instance palette by naming the token, and the generator
guarantees all scales (the 31-vs-33 drift class cannot recur at this
layer). Applies to app-config recipes too, since the hook sits where
every RecipeTokenSet is normalized.
Button's seven manual spreads are gone from base.ts (the helpers moved
into the generator); its generated output is byte-identical. Toggle —
which already exposed palette-* tokens — universalized itself: +330
generated lines, and <Toggle color="teal"> / color="steel" verified
resolving in a live browser (steel and fuchsia are exactly the two
scales the hand-kept lists used to miss). eidos-lint now classifies
donor-scale values on data-color as sanctioned eidos-only vocabulary
(the TSC color:* axis extension) instead of invalid — the morfo enum
keeps declaring the semantic roles, per the pilot's deliberate
runtime-open design. Guard: recipe-css-contract pins the LAST scale of
PALETTE_SCALES for every palette-bearing recipe in the generated css.
Also: the stale '31 physical color scales' test TITLE says 33 (its body
already asserted 33). Recorded in the plan: the eidos suite carries 15
pre-existing failures in 6 files (baselined against HEAD before this
change) — their triage is its own batch. npm run check at the 61-error
baseline; lint toggle baseline green again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 30 eventful morfos that never declared expression: ALL have a
per-component pack in src/uix/sema/components/ — so the classification
(book-deviations D.4: pack / family-default / delegated / none) is
unambiguous: expression: 'pack' across the board, placed after scope
per the switch/button idiom. The sema surface of the contract is now
explicit on all 82 eventful morfos instead of inferred from pack-file
existence. morfo:vocabulary clean (the one naming warn is media-player,
foreign WIP); npm run check at the 61-error baseline. Additional
persistence/a11ySemantic annotations deliberately NOT mass-applied —
per D.9 the canonical table is reference, authors declare per real
consumer (the six that need them already do).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every interactive morfo now either anchors its W3C APG pattern or
documents that none exists. Real patterns (20): the picker family +
command + search-field anchor combobox (field/input + popup, the
pattern's own popup taxonomy); date-field mirrors time-field's
spinbutton (per-segment contract); rating-group -> radio;
navigation-menu -> disclosure (the APG's own site-nav guidance);
splitter -> windowsplitter; tag-group/tags-input/virtual-grid -> grid;
clipboard/file-upload -> button (the trigger IS the widget);
announce -> alert (live region); form -> the form landmark;
image-adjustments -> slider; table -> table.
The A-1.4 valve (documented exception) is wired like the R-x rules,
and five components whose widget has NO APG pattern say so in their
README instead of faking an anchor: cropper (2-D manipulation),
pagination (nav + composed Buttons), stepper, timeline (display list),
image-picker (media picker). Remaining warns are the four expected:
card/drag-drop/virtual-list host their note when C8 writes their
READMEs, media-player is foreign WIP.
Catalog: 83 PASS / 47 NEEDS-WORK / 0 BROKEN (was 75/50/5 at the
audit's start). npm run check at the 61-error baseline.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two classes. Real fixes: 8 numeric font-weights tokenized to
var(--font-weight-medium/semibold/regular) in command,
date-range-picker, link-preview, listbox, menubar, textarea,
time-range-picker x2 — same rendered weight, but the foundation now
propagates (verified in a live browser: the token resolves to 500).
Honest annotations: the proportional/identity literals get their
/* literal: <reason> */ valve instead of a fake token — avatar
initials/badge scale with the avatar diameter (physically
proportional), the calc(1em - (md - sm)) family is the Field
label-one-step-down doctrine with a token-derived delta, 1em is
context identity (fab glyph, password toggle), the x0.85 captions are
proportional to their field token, and combobox's -1px is an optical
adjustment on a token-derived size. component:audit R-2.7: 16/16
clean; npm run check at the 61-error baseline.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The R-1.2/R-1.3/R-1.4 sweep, same method as C2a (evidence first): each
offender is either a REAL missing state or a shared-layer/composed case
that must not duplicate rules.
Real fixes, all verified in a live browser (computed-style probes, with
the transition-mid-flight trap from the demo guide s13 accounted for):
switch/toggle/rating-group get the family invalid tint
(--color-threat-element, the shipped checkbox/pin-input precedent);
toggle gets its readonly cursor; pin-input cells get the readonly
muted-surface treatment mirroring date-field segments; the SHARED
spin-field layer gains the readonly treatment it lacked (one fix covers
css-field + number-field); natural-time-picker gets the disabled
opacity/pointer rule mirroring date-field.
Exception valve wired into R-1.3/R-1.4 (was only R-1.1/1.2/1.5/E-2.2)
and cited exceptions added: css-field/number-field (states live in the
shared spin-field layer), dialog (data-disabled sits on the VIRTUAL
provider — defaultElement none — and the pressable surfaces are
composed Buttons), color-picker (color-field owns the invalid rules),
date-range-field (the runtime overlays data-date-field-input on the
same elements, per its own recipe header), time-picker (composed
time-field chrome). natural-time-picker keeps its two warns for its C8
pass rather than guessing paint targets.
All 10 audited components now PASS with 0 R-1.x pending; npm run check
at the 61-error baseline. css-field/number-field READMEs fixed on disk
but unstaged (unrelated local modifications).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The audit's focus check grepped only for :focus-visible, blind to how
the framework actually shows focus: the universal archetype ring
(archetypes.css [data-archetype]:focus-visible with its documented
exclusions), the field shell's :focus-within, and the canonical
state-attr ring ([data-focused] + focus-ring tokens, soma-written — the
spin-field/search-field pattern). Blindly adding :focus-visible rules
to the 10 flagged recipes would have recreated the exact 'double
border' anti-pattern archetypes.css documents against. The check now
accepts the four sanctioned evidences (textarea and search-field pass
on their own css; date-picker passes via exception) and the remaining
non-ring cases carry cited R-1.5 exceptions: css-field/number-field
(ring lives in the shared spin-field layer), dialog (content panel is
the documented foundation exclusion; close/trigger are composed
Buttons), date-picker (foundation ring + content exclusion),
metrics/timeline (no focusable part — interactive only by events).
clipboard/announce host their exception when C8 writes their READMEs.
css-field/number-field READMEs fixed on disk but left unstaged (they
carry unrelated local modifications).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 5 BROKEN components (cascade, gradient-builder, menu-dial, motion,
qr-code) are BROKEN no more: cascade/motion/menu-dial now PASS,
gradient-builder/qr-code drop to NEEDS-WORK with only demo-phase (D-*)
and C8 items left.
Framework-level piece: component-audit gains the documented-exception
valve the checklist already used for A-2.3/R-1.7 — a greppable
'R-x.y exception: reason' line in the component README turns the rule
into a PASS that reports the reason. Wired for R-1.1, R-1.2, R-1.5 and
E-2.2; the checklist rows say the same. This separates deliberate
design (cascade and motion deliberately ship NO recipe — they ride the
foundation stagger + state presets; menu-dial's focus/disabled states
live in the composed Fab/Button recipes) from plain omission, which
stays an error.
Mechanical fixes: texts.label + langs entries for cascade/motion (new
files, registered) and gradient-builder (label added to its existing
entry); menu-dial's missing default export. README contract sections
(Baseline/Comparativa/Decisiones/Gaps/Passive justification + Audit
exceptions) added to cascade, motion, menu-dial and qr-code — mostly
re-heading content those docs already argued; comparativas grounded in
M3 speed dial/MUI SpeedDial/PrimeVue, Framer Motion/AnimatePresence/
Svelte transitions, ark-ui/qr-code-styling per component.
Verified: component:audit 130 -> 78 PASS / 52 NEEDS-WORK / 0 BROKEN;
npm run check at the 61-error pre-existing baseline (0 own).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Extending the I1 count guard to color roles and role slots surfaced
four more stale counts the palette fix predicted: the RFCs still said
'13 slots' and enumerated borderHover8 (the slot was retired 2026-07-02,
zero consumers — COLOR_ROLE_SLOTS is 12), and two component READMEs
(css-field, float-panel) still said '8 roles' from before tertiary made
it 9. The guard itself had the same disease it polices: extractConstArray
counted the quoted 'borderHover' inside the comment documenting its own
retirement, so expected=13 and the stale mentions passed — comments are
now stripped before extraction. css-field's README is fixed on disk but
left unstaged (it carries unrelated local modifications).
docs-check now verifies families=8, intents=6, archetypes=26,
palette=33, roles=9, slots=12 against their consts on every run.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
User-caught drift, and it was live in the UI, not just prose: the demo
harness's hand-copied PALETTE_GROUPS enumerated 31 scales — fuchsia and
steel (the two non-Radix scales) never appeared in any demo's
PalettePicker even though PALETTE_SCALES (the const, 33) and the recipe
cascade (paletteScaleDecls maps the const) resolve them fine. Fixed the
two missing entries, typed the groups as PaletteScale[], and added a
dev-time completeness assertion so growing the const without grouping
throws at module load.
Prose swept (the numbers were inherited verbatim from the pre-book
sources, which contradicted their own '33-scale library' headers):
decisions.md color-model row, demo-authoring x4 (incl. the '31-scale
palette' lede), rfc-color-engine x4 (ground-truth + templates
open-question). Where the count was incidental the text now points at
PALETTE_SCALES instead of restating a number.
Guard: docs-check I1 gains the palette count (EN + ES patterns,
~-approximation and type/space-scale exclusions; s-mark added to the
section-number skip). The check line now prints palette=33. This was
the exact class I1 already covered for families/intents/archetypes and
had not been extended to the palette.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Consolidated audit (2026-07-02): 130 components -> 75 PASS / 50
NEEDS-WORK / 5 BROKEN; palette-31 wired in 7 recipes, size-bundle in 1,
focus-visible missing in 11, 17 literal-typography recipes, 41/82
eventful morfos without expression:, 33 without APG anchor, 28 without
README. Demos (D-*) explicitly deferred to the next phase (component
info web). Batches C1-C10 with per-batch verification.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CLAUDE.md 981 -> 350 lines. The 12 session hand-offs (2026-05-08 ->
2026-06-05, ~513 L) moved verbatim to docs/process/handoffs-claude-md.md
(chronicle frontmatter). Reference Documents now point into the book
tree, and the long-stale authority claim is fixed: the semantic
vocabulary source is docs/CANON.md (+ decisions/book-deviations.md),
with the Spanish guide correctly framed as a historical seed at its new
decisions/ home — the correction the guia's own banner had been
announcing since Fase 6. The four sema/eidos doctrine sections (~170 L
of copied tables, cascade diagrams and examples — the copy class
docs:check bans in the corpus) compact to the operational MUSTs
(semaSelector mandatory, packs never replace intent primitives,
channels split by owner, types-over-lint) each with its pointer to
CANON.md / architecture/sema.md / theming/channels.md /
architecture/eidos.md. Two head refs swept (eidos-motion ->
theming/motion.md, COMPONENT_GUIDE s4 -> guides/component-guide.md).
Approved by the user after diff review. docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The global sweep caught the last corpus links still pointing at
pre-book paths: morfo chapter's s2.bis cross-ref (src/uix/README ->
overview.md), authoring's E1 stratum row (active_architecture ->
docs/architecture/), the related: frontmatter of decisions.md and
canon/recipe-contract.md (THEMING/THEMING_GUIDE -> theming/reference +
guide), and component-audit's typographic-vertebration pointer (eidos
README -> architecture/eidos.md with the translated heading). README
map completed as the book TOC: every chapter now has a row —
theming/motion.md (the model) and theming/changelog.md (the chronicle)
were the two missing. Remaining old-path references live only in
chronicle docs (theming/changelog, process/) and resolve via stubs;
the 11-warn baseline is all foreign targets (MOTION_SERVICE_RFC demo
routes, deleted THEMING_AUDIT/PENDIENTES).
F7.6 complete. The book tree is fully populated: architecture/ (8) +
canon/ (2) + theming/ (7) + rfcs/ (7) + guides/ (4) + decisions/ (2).
Next and last: F7.7 CLAUDE.md thinning — diff to the user first.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LIBRO_VARIACIONES_Y_EXTENSIONES -> decisions/book-deviations.md and
GUIA_IMPLEMENTACION_SEMAUIX -> decisions/guia-semantica-historica.md,
both moved AS-IS in Spanish: the deviations registry is a logbook of the
author's literal decisions ('transcrita literal') and carries proposed
doctrinal text destined for the Spanish book — translating it would
destroy that function (s G calls itself bitacora); the guia was already
status: historical (Fase 6) and the plan exempts it explicitly. English
frontmatter added to both; internal cross-links repointed (CANON,
theming/reference, book-deviations D.11). docs-check's I2 phantom-field
exemption follows the moved file (it matched by the LIBRO_VARIACIONES
filename; now also matches decisions/book-deviations.md). Corpus swept:
CANON x3, README (E2/E3 strata + tables — also fixed the pre-Fase-6
leftover row still calling the guia 'authoritative for any new wrapper'
and the unswept eidos/TSC.md stratum mention), building-a-component D.4,
completion-checklist G-1.1 + header, theming/reference, architecture
x5 (active-architecture, eidos, morfo, overview, sema x2).
docs:check 0 errors, 11-warn baseline.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
src/uix/soma/COMPONENT_GUIDE.md (1449 L, English body) moved to
docs/guides/component-guide.md. The only Spanish passage — the
archetype-canon banner (2026-06-19) — translated in the move; the rest
is verbatim. Banner's ARCHETYPE_COHERENCE_AUDIT link reaches into src
(audit fossil, stays with the code); the checklist cross-link is now
the sibling ./completion-checklist.md and the 'soma/README s9' mention
now names architecture/soma.md (its post-F7.2 home). Corpus swept:
authoring + README E4 stratum rows (also stale THEMING_GUIDE name),
building-a-component phases 0/2, architecture/{soma-architecture s4/
s13-tree/s17, overview, morfo, active-architecture}.
F7.5 complete: docs/guides/ = component-guide, completion-checklist,
demo-authoring, component-audit. docs:check 0 errors, warns back at
the 11 baseline.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three English guides moved verbatim (copy + link touch-ups, no
translation): COMPONENT_COMPLETION_CHECKLIST -> guides/
completion-checklist.md, COMPONENT_AUDIT_GUIDE -> guides/
component-audit.md, DEMO_AUTHORING_GUIDE -> guides/demo-authoring.md.
Tooling moved with its doc in the same pass: docs-check I5 now parses
the checklist at the new path (verified: 0 errors, rule tables found)
and component-audit.ts's two path strings updated. One reconciliation
in the audit guide's s5, applied as link-don't-copy: the copied v1
6-tab template list (stale vs the v2 9-tab guide it links, drawer
canary vs button) is replaced by a pointer to demo-authoring.md; the
domain canaries in s7 stay. demo-authoring's harness links now reach
into web/routes/uix/lib/ (the modules stay with the code); the deleted
pendiente_color_demos.md reference is marked TODO(reconcile). Corpus
swept: building-a-component (frontmatter related: + phases 6/8),
authoring, architecture/soma, theming/reference s5-parity,
testing-and-tooling, getting-started, README (E4 rows + component-audit
row added + two stale F7.3 paths in 'I want to' fixed). Remaining
warns = links to component-guide.md, which lands in F7.5 (2/2).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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>
TYPOGRAPHY_ENGINE_RFC (191 L) -> rfcs/rfc-typography.md and COLOR_MODEL_RFC
(155 L) -> rfcs/rfc-color-model.md, Spanish to English. color-model is a
RESOLVED RFC kept as the historical record of the rejected single-anchor
proposal — the resolution header travels with it, canonical model stays
theming reference s25. typography's stub notes the measurement arm
(lib/canvas-text, SText) stays in src. decisions.md rows repointed;
typography's Status aligned with the RFC's own closed-phases state.
Theming reference s21/s25 links swept. docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
DEPTH_ENGINE_RFC (149 L) -> rfcs/rfc-depth.md and SHAPE_ENGINE_RFC (162 L)
-> rfcs/rfc-shape.md, Spanish to English. Both stubs summarize the shipped
state (phases 1-5) and keep the by-path citations resolving — including
the '// (DEPTH_ENGINE_RFC s5)' comments across src/uix/eidos/lib/*.ts that
decisions.md documents as load-bearing. decisions.md index rows repointed
and their Status column aligned with the status the RFCs themselves
declare (both said implemented; the rows still said Propuesta). Theming
reference s29/s30 canonical-guide links swept. docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SCALING_RFC (92 L) -> rfcs/rfc-scaling.md and STRUCTURE_ENGINE_RFC (113 L)
-> rfcs/rfc-structure.md, Spanish to English, same section numbering. The
legacy-name -> rfc-* rename that decisions.md declared deferred 'until
those citations are swept in the same pass' happens here: stubs at the old
paths keep every by-path citation resolving. Corpus links swept (theming
reference s23/s31, decisions.md index rows, channels.md capstone list —
the channels.md sibling links to rfc-color-engine/typography/depth/shape
land later in this batch). Chronicle docs (theming/changelog,
inherit_audit) keep old paths by doctrine — the stubs resolve them.
docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
src/uix/eidos/THEMING.md (1499 L, Spanish) translated to English as
docs/theming/reference.md, same s1-s38 numbering: the mental model,
s1.bis (theming lives in eidos — the 2-of-3 derivation and the canonical
split), the CSS layers, the 7 token layers, the 9 roles, the size canon
(universal 1:1 + label step-down + container cap + the icon scale), the
naming conventions, the s7/s8/s9/s13/s15/s17/s18 stubs repointed into the
book (canon/tsc, theming/guide, theming/notes, theming/changelog,
theming/motion), runtime overrides + builders, bundle/purge, validation
tooling, s14 motion (the pickup lift), s16 anti-patterns, s19 variants
canon, and the s20-s38 standing-decision stubs. One internal
reconciliation applied: the s35 stub cited the control/compact/dense size
archetypes that s5 declares superseded by the universal 1:1 — aligned.
One stale v1 DEMO_AUTHORING s12.8 citation in s5 replaced by the v2 s6
parity rule. Stub at the old path carries the full s1-s38 map (the most
sN-cited doc in the repo: code comments, CLAUDE.md, RFCs). Corpus links
swept (CANON, docs map, comparison, glossary, eidos chapter, canon/tsc,
theming/guide + notes). docs:check 0 errors (260 docs).
F7.3 complete: docs/canon/ (tsc, recipe-contract) + docs/theming/
(reference, guide, notes, channels, motion, motion-guide, changelog).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
src/uix/eidos/eidos-motion.md (698 L, Spanish) translated to English, same
s1-s19 numbering: the two-moment thesis, the closed cascade model
(D.11-D.13), motion across the 4 layers, the two-surface registry, types,
the EngineMotion API + cleanup policy, the 5 drivers, the DOM contract
(data-animation-style), Presence integration, reduced motion, primitives/
keyframes, built-in content, per-component defaults, code map, s15 (the
events.css -> signatures migration — cited from events.css), Chakra
comparison, naming, phases F1-F7, deferred. Stub with the full s-map at
the old path; corpus links swept (comparison, eidos chapter, changelog,
motion-guide). docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
src/uix/eidos/TSC.md (334 L) and RECIPE_CONTRACT.md (131 L), both Spanish,
translated to English as docs/canon/tsc.md + docs/canon/recipe-contract.md
(the E2 visual canon inside the book tree). Thin stubs at the old paths
(code comments and component-audit R-4.x provenance keep resolving);
corpus links swept (docs map E2 rows, authoring anti-copy law,
building-a-component phase 5, comparison, getting-started, glossary,
eidos chapter). docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
src/uix/soma/SOMA_ARCHITECTURE.md (1058 L, Spanish) translated to English
as docs/architecture/soma-architecture.md, same s1-s17 numbering: layer
architecture, design principles, the closed six-piece model + SomaRuntime,
component model (picker composition), runtime parts, the layers inventory,
the Soma class + date/time domain + statics convention, the reactive
system, internal helpers, data-* contracts, IDs, barrels, boundaries,
directory structure, anti-patterns, current shape, stability rule,
checklist. The frozen per-provider test list (dated 2026-05-15, ~140 L)
became the timeless fact: the NO_MISSING_PROVIDER_TESTS guard + the test
tree ARE the coverage inventory (testing-and-tooling aligned). Stub with
the full sN map at the old path; corpus links swept.
F7.2 is complete: docs/architecture/ now holds the whole E1 stratum in
English (7 chapters, ~5.4k lines), with thin stubs + sN maps next to the
code. docs:check 0 errors (251 docs).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
src/uix/eidos/README.md (1020 L, Spanish) translated to English: the
ActiveEidos runtime (config/patch, themes, themeSource, CSS contract,
setCssVariables, persistence envelope, resolveToken), canonical size +
transversal primitives, what eidos consumes from morfo/soma/sema, the
--* token rule, the THEMING sN map, typographic vertebration (two
anchors + alias chain + R-2.7), the 2-of-3 rule, disciplined-option-C
API conventions (7+4 rules, Toast special case), the selector-drift
defense, and the picker patterns P-1..P-5. Two already-decided
reconciliations folded in: themes/fonts.css superseded (font-faces live
in generated/base.css) and the dated 2026-05-21 picker block merged into
the picker-patterns intro — its dead PENDIENTES.md pointer replaced by a
TODO(reconcile) note (norms N-6/N-7 orphaned by d68d2c45), which also
clears one docs:check warn (13 -> 12). Thin stub at the old path keeps
THEMING/TSC/motion pointers next to the code; corpus links swept.
docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
src/uix/active_architecture.md (865 L, Spanish) translated to English as
docs/architecture/active-architecture.md: the s0 module contracts +
canonical naming, the four layers in depth, the transcription chain, the
causal chain of one interaction, the DOM-attribute table, the 12 hard
rules (incl. the sec-dom read-timing rule), authorship vs transcription,
what it is NOT, risks. The dated header changelog block was dropped per
the timeless rule (s10 already routes snapshots to docs/process/); the
stale themes/fonts.css mention in the eidos structure listing corrected
to the generated foundation (phase-6 fact). Stub at the old path carries
the full sN section map (the most sN-cited doc in the corpus). All docs/
corpus links repointed to the chapter. docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
src/uix/README.md (485 L, Spanish) translated to English as the book's
opening chapter. Two already-decided reconciliations applied in passing:
the 'authoritative GUIA' pointer now reflects its historical status
(phase-6 decision) and the frozen 2026-05-17 migration status became the
timeless statement (every component ships an eidos wrapper; inventory =
tree + component:audit). Thin stub at the old path; docs/README entry,
strata table and reading order repointed. docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
User decision (2026-07-02): the corpus stops being a MAP over dispersed
layer docs — the layer reference MOVES into docs/ with book order, in
English, superseding the kickoff-era 'hybrid structure' decision. The 189
component READMEs stay in-place (E5, linked).
- docs/process/PLAN-docs-book.md: the phase-7 plan — target tree
(architecture/ canon/ theming/ rfcs/ guides/ decisions/), the per-doc
migration pattern (translate -> Write new path -> stub at old path ->
link sweep -> docs:check -> commit per batch), batches F7.1-F7.7 with
volumes, and the known risks (sN citations get a map in the stub; the
legacy RFC renames finally become safe because the stub keeps the old
name alive for provenance citations).
- Pilot migrated end-to-end: docs/architecture/active-uix.md (English,
frontmatter, links repointed) with a thin stub at
src/uix/active-uix/README.md; docs/README map, glossary and
active_architecture s0 repointed. Validates the pattern for F7.2+.
docs:check: 0 errors (244 docs).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Closing pass of PLAN-docs-reconciliation:
- docs/building-a-component.md 'Known traps' table emptied — every trap
was fixed by phases 1a-1d/2 and docs:check guards the recurrence
classes (this was the phase's visible success indicator).
- PLAN checkboxes ticked + 'Resultado del cierre' appended (commits,
deviations from the plan, out-of-scope findings pending user decision).
- CONTINUE-docs-corpus.md Fase 6 marked HECHA.
- testing-and-tooling.md row reworded so the guard doesn't flag its own
description (the phantom-field literal).
Final state: npm run docs:check = 0 errors, 13 warns (all known foreign/
user-decision targets: THEMING_AUDIT deleted in worktree, PENDIENTES.md
deleted in d68d2c45, MOTION_SERVICE_RFC demo routes).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 3 of PLAN-docs-reconciliation (fable_audit D5: the 'link, don't
copy' law had no mechanical guard). New scripts/docs-check.ts + npm run
docs:check with six invariants, each born from a verified drift:
- I1 vocabulary counts vs SEMA_FAMILIES/INTENTS/ARCHETYPE_VOCABULARY
(context-gated: font/shape families, variant archetypes and evaluative
subsets don't false-positive; section numbers and quoted historical
mentions skipped).
- I2 phantom fields: translations: in morfo/soma docs, defaultSemantic
outside LIBRO_VARIACIONES (rename/rejection mentions allowed).
- I3 dependency claims: soma dep lists must cite real package.json
dependencies; corpus-wide @floating-ui mentions need their devDep-only
context.
- I4 SHARED_VARIANT_VOCAB (component-audit) == EIDOS_VARIANTS (textual
mirror comparison).
- I5 checklist<->audit: every Enforcement:audit rule exists in the
script, every script rule ID is declared.
- I6 relative links resolve (WARN until the known dangling targets get
their user decision: THEMING_AUDIT deleted in worktree, PENDIENTES.md
deleted 2026-06-07, MOTION_SERVICE_RFC demo routes).
Chronicle docs (process/, changelogs, audits, CONTINUEs, status:
historical frontmatter, the book) are exempt from truth-tracking.
Also: THEMING s2 per-layer table realigned to the real entrypoint (the
fragile rule-count column dropped); stale adom link in SOMA_ARCHITECTURE
fixed; validator documented in docs/testing-and-tooling.md.
Current output: 1 error (building-a-component known-traps row — cleared
in the closing pass) + 13 warns.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 2 of PLAN-docs-reconciliation (fable-eidos-audit D1: 'THEMING.md es
referencia + changelog fusionados'). New eidos/THEMING_CHANGELOG.md holds
the dated sprint records verbatim (s13 superseded body + s20-s38, same
section numbers). THEMING keeps a numbered stub per section — same title,
the living decision in a few lines, and pointers to the living sources
(per-channel RFCs: SCALING/COLOR_MODEL/COLOR_ENGINE/DEPTH/SHAPE/STRUCTURE;
config/generator symbols; demos) — so every historical sN citation across
the corpus and CLAUDE.md still resolves. Canon-heavy sections (s25 color
model, s29-s31 depth/shape/structure, s32 focus, s35 scale canon) got
richer stubs carrying the invariant + source instead of prose copies
(anti-copy law). THEMING.md 2603 -> 1499 lines; all 38 numbered headers +
TOC anchors intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 1d of PLAN-docs-reconciliation.
- soma/README s3 + SOMA_ARCHITECTURE s2/s6/s12 + popover/link-preview
READMEs: positioning is the in-house engine (layers/floating +
$ethereal); @floating-ui is devDep-only. Layers table gains Stacking /
AxialDrag / ZoomPan / ImageProvider / ListSelection (popper/ is an empty
leftover dir — not documented). clsx documented as it really is: NOT
declared but still imported by props/props.ts via a svelte transitive
(phantom dep — flagged for a decision, chip spawned).
- COMPONENT_COMPLETION_CHECKLIST: new Enforcement column on every rule
table (audit | tool:X | manual) so declared-but-unchecked rules are
explicit; morfo rule IDs renamed M-* -> A-* to grep-match what
component-audit.ts emits; stale rows fixed against the corrected script
(D-1.2 v2 9-tab, D-3.1 single eidosSnippet, E-2.2 wrapper import);
implemented-but-undeclared rules added (R-2.7 literal typography,
A-3.4b verb/family pairing); A-3.3 family count decopied; sI now
requires an honest Enforcement value for new rules.
- Sema cascade numbering unified to 1 family - 2 intent - 3 morfo -
4 runtime - 5a packs - 5b app across sema/README, engine.ts,
resolver.ts, resolver.test.ts and soma/runtime.svelte.ts (three
divergent schemes coexisted; CLAUDE.md already uses the chosen one).
- '24 archetypes' copied lists replaced by pointers to
ARCHETYPE_VOCABULARY in active_architecture s6 + morfo/README.
- TriggerOptions.semantic JSDoc: phantom defaultSemantic removed
(implemented shape is additive allowedFamilies, D.11); 'warns via
logger' claim corrected — the override is silently ignored on
non-polymorphic events (no warn exists in code).
npm run check: 61 errors = pre-existing baseline, 0 new.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 1c of PLAN-docs-reconciliation (fable-eidos-audit D1/D3/D4, B6/B7).
- THEMING s1 vs s2 ('5 layers' vs '6 capas'): s2 owns the layer story,
retitled count-free and rewritten against the REAL index.css imports
(generated incl. font-faces / archetypes / events / aggregated recipes;
code-split recipes + shared partials + runtime theme blocks noted);
s1 links s2. TOC updated.
- THEMING s3 capa 3 + s6 rule 7: hardcoded slot lists (13 and 9 — both
wrong, code has 12 after border-hover removal) replaced by pointers to
COLOR_ROLE_SLOTS + DEFAULT_COLOR_ROLE_SLOT_STEPS.
- THEMING s4: physical-scale mapping table (primary=indigo, risk=amber —
both stale) replaced by pointer to THEME_BASE_COLOR_ROLES with the
convention-vs-authorship note (CANONICAL_INTENT_SCALES != base theme).
- eidos/README: 'Cambios 2026-05-21' + 'Estado actual (2026-05-17)'
(frozen wrapper list ~20 vs 137 real) extracted to
docs/process/handoffs-2026-05.md; pointer left.
- eidos/components/README: frozen migration table (2026-05-20) extracted
likewise; live inventory = components tree + component:audit.
- COMPONENT_AUDIT_GUIDE: stale v1 s12.7/s12.8/s12.9 citations re-pointed
at DEMO_AUTHORING_GUIDE v2 s6 / the eidos composition doctrine.
- eidos-motion s15: title contradicted its own body (the firma moved to
EidosConfig.motion signatures in F2) — retitled, TOC synced.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 1b of PLAN-docs-reconciliation (fable_audit D2). The guide contradicted
the code in >=5 verified points while CLAUDE.md declared it authoritative.
Decision: degrade, don't reconcile — frontmatter (status: historical) + banner
pointing at docs/CANON.md + code as the ruling sources, and surgical fixes on
the dangerous points only:
- s2: real inventory is 9 roles (tertiary) with --color-{role}-{slot} naming;
pointer to THEMING s4 + THEME_BASE_COLOR_ROLES.
- s4.1: table annotated as doctrinal; Dialog row now records the implemented
emerge (open/close polymorphic, no shift in allowedFamilies).
- s5.3: phantom defaultSemantic shape replaced by the implemented additive
allowedFamilies (real dialog.ts excerpt; LIBRO_VARIACIONES D.11).
- s6.2: diverged holds table replaced by pointers to SEMA_MAP + holds.ts.
- s14: marked historical (migration plan already executed).
CLAUDE.md citations untouched (own deferred pass).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 1a of PLAN-docs-reconciliation (fable_audit D1). The Morfo field is
texts (idlangrefs); the multilingual catalog lives in langs/components/*.
Fixed every example and mechanism claim that still documented the removed
translations: field: morfo/README (contains-list, anatomy, Step 4.5),
SOMA_ARCHITECTURE (Texto funcional + checklist), soma/README (morfo field
list + runtime registration), COMPONENT_GUIDE (A1/A3 + common mistakes +
smoke fixes), COMPONENT_COMPLETION_CHECKLIST M-1.3, active-uix/README,
uix/README, 4 component READMEs, and 3 stale JSDoc blocks in code
(morfo/types.ts, morfo/schema.ts invariant 7, active-uix/types.ts
registerDefaultLangs).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>