feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress)
Re-audit of the whole component catalog at pilot depth (91 fichas + the
checkpoint verdicts in docs/audit/components/) and the executed fix packages.
- P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 +
API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d,
component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts
(role=application removed ×4, aria-selected off the Day, drp translationRef,
field data-state prune, pin-input commit-set, media-player renames), 13 new
sema packs + 12 morfos family-default → pack.
- P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar);
onValueCommit terminal-callback norm (pin-input/search/password/textarea +
date/time/color-field add); typed validation reason + onInvalid (tags-input,
css-field); index/onIndexChange (carousel); deselectable; openDelay/
groupSkipDelay; allowCustomValue; defaultValue prune.
- P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across
cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in
field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel);
touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual,
44 AAA). S6 (Field composition) + S8 (calendar-surface) pending.
Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline);
morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched
components; per-component vitest suites green.
Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md
Excluded (broken by the N1 rename, left broken per user decision, not staged):
words/**, palabras/**, chronos, web/routes/alpha/**.
Reconciliation pending: the touch-rows ::before for checkbox/switch reverses
changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed
markers to a labeled-row/Field task — flagged for the user in the handoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
# Continue — Auditoría de componentes + fase de fixes (P0–P7)
|
|
|
|
|
|
|
docs(audit): formal programme close-out + the clean-room continuation handoff
- docs/audit/components/_cierre.md — the programme closure: final gates
(matrix 134/0/0, contracts 37/37, vocab 0, baseline 57), the full package
journey with hashes, the canonized method (dossier template, evidence-only
exceptions, no-cascada, machine valves), the findings that outlive the
programme, and what moved to new owners (demo frame, active tracks,
follow-ups).
- docs/process/continue-cleanroom-fixes-2026-07.md — the LIVE turnkey for
the next sessions: the clean-room severity table as the queue, the state
reconciliation (SOM-5 P1 already closed post-snapshot; SOM-3 partial), the
proposed P1 order (machine-extending THM-1/MOR-4 first), the WIDENED
verification protocol (134/0/0 and 37/37 must HOLD), exclusions and the
side queue.
- The old audit-fixes handoff is sealed as historical with a redirect header.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
> **⛔ PROGRAMA COMPLETO (2026-07-11) — este handoff queda CERRADO como
|
|
|
|
|
|
> histórico.** Matriz 134/0/0 · contracts 37/37. Cierre formal:
|
|
|
|
|
|
> [`docs/audit/components/_cierre.md`](../audit/components/_cierre.md).
|
|
|
|
|
|
> **La continuación viva es**
|
|
|
|
|
|
> [`continue-cleanroom-fixes-2026-07.md`](./continue-cleanroom-fixes-2026-07.md)
|
|
|
|
|
|
> (los P1 de la auditoría clean-room). No arrancar sesiones desde aquí.
|
|
|
|
|
|
|
|
|
|
|
|
**Handoff. Fecha: 2026-07-08 · actualizado 2026-07-10 (S4 lote 1 ✅).** Rama `alpha-0.1-sec-dom`.
|
|
|
|
|
|
|
docs(components): S4 lotes 2-5 + drag-drop — 24 consumer-door dossiers, E-2.3 = 0 (P7)
Batches: pickers/nav (range-calendar, natural-time-picker, menubar,
navigation-menu, command, listbox) + data (table, tree-view, tree-grid,
grid-list, feed, virtual-list, virtual-grid) + typography/display (s-text,
s-text-virtual-list, badge, card, image, skeleton, spinner — passives carry
## Passive justification) + util (link-preview, announce, clipboard) +
drag-drop (29th missing README, omitted from the 5-batch plan; census said
28, real count was 29).
R-1.x exceptions only with read evidence (announce: no interactive parts;
clipboard: trigger composes Button; trf/drf mirror). Non-README flags stay
recorded in each dossier's Gaps with disposition (ntp S9 package, badge
state-layer census, stvl archetype artifact, demo D-* rules).
Machine: 85 -> 102 PASS, E-2.3 = 0 catalog-wide; type baseline stays 57.
Handoff: S4 COMPLETE — audit-fix P0-P7 closed; S9 as dedicated sessions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
> **S4 COMPLETO (2026-07-10) → el audit-fix P0–P7 está CERRADO.**
|
|
|
|
|
|
> E-2.3 = 0 en el catálogo (29 dossiers eidos + README soma field-langs;
|
|
|
|
|
|
> máquina 81→**102** PASS; baseline 57). Los NEEDS-WORK restantes son flags
|
|
|
|
|
|
> no-README documentados en los `## Gaps` de cada dossier (S9, demos D-\*,
|
|
|
|
|
|
> censos R-1.x). **Pendiente de decisión del usuario**: (a) los one-liners
|
|
|
|
|
|
> recopilados abajo; (b) ¿"lote 6" opcional? — 13 READMEs ANTIGUOS con
|
|
|
|
|
|
> F-1.x en warn (color-swatch, float-panel, format-date/number,
|
|
|
|
|
|
> gradient-\*·metrics [son S9], onion-menu, radio-cards, relative-time,
|
|
|
|
|
|
> scroll-frames, timeline, trans) que existen pero no tienen forma dossier;
|
|
|
|
|
|
> NO estaban en el plan S4 (solo cubría los ausentes). Después: S9 en
|
|
|
|
|
|
> sesiones dedicadas + reconciliación touch-rows↔§37.
|
|
|
|
|
|
> **P5 y P6 están CERRADOS**: P5 = S1·S5·depth·touch·S6·S8 ✅ (S6 `53b6f629..d1670caa`;
|
|
|
|
|
|
> S8 `83e13be6`). P6 = C6 `3b02fd11` · C7 `444e05eb` · B.11 `0f0feb4f` ✅.
|
|
|
|
|
|
> Pende tu decisión touch-rows↔§37. Follow-ups no bloqueantes abajo.
|
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress)
Re-audit of the whole component catalog at pilot depth (91 fichas + the
checkpoint verdicts in docs/audit/components/) and the executed fix packages.
- P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 +
API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d,
component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts
(role=application removed ×4, aria-selected off the Day, drp translationRef,
field data-state prune, pin-input commit-set, media-player renames), 13 new
sema packs + 12 morfos family-default → pack.
- P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar);
onValueCommit terminal-callback norm (pin-input/search/password/textarea +
date/time/color-field add); typed validation reason + onInvalid (tags-input,
css-field); index/onIndexChange (carousel); deselectable; openDelay/
groupSkipDelay; allowCustomValue; defaultValue prune.
- P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across
cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in
field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel);
touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual,
44 AAA). S6 (Field composition) + S8 (calendar-surface) pending.
Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline);
morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched
components; per-component vitest suites green.
Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md
Excluded (broken by the N1 rename, left broken per user decision, not staged):
words/**, palabras/**, chronos, web/routes/alpha/**.
Reconciliation pending: the touch-rows ::before for checkbox/switch reverses
changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed
markers to a labeled-row/Field task — flagged for the user in the handoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
|
|
|
|
|
|
Documento de continuación para retomar la fase de fixes de la re-auditoría de
|
|
|
|
|
|
componentes. La **fuente de verdad de los veredictos** es
|
|
|
|
|
|
[`docs/audit/components/_veredictos.md`](../audit/components/_veredictos.md)
|
|
|
|
|
|
(bloques N1–N10 · S1–S11 · C1–C8 + fixes obvios). Los censos de apoyo:
|
|
|
|
|
|
[`_naming.md`](../audit/components/_naming.md) y
|
|
|
|
|
|
[`_system.md`](../audit/components/_system.md). Las 91 fichas pilotadas viven en
|
|
|
|
|
|
`docs/audit/components/{kebab}.md`.
|
|
|
|
|
|
|
|
|
|
|
|
## Estado por paquete
|
|
|
|
|
|
|
|
|
|
|
|
| Paquete | Estado |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| **P0** doctrina (sema participation, CANON §3 intent, component-guide §5 + API naming, §32 outline) | ✅ |
|
|
|
|
|
|
| **P1** guardas (vocab-check S10/S11d, component-audit A-3.1/A-1.4/S9, eidos lint classHooks) | ✅ |
|
|
|
|
|
|
| **P2** contratos morfo (role=application×4, aria-selected fuera del Day, drp translationRef, field data-state, pin-input commit-set, media-player renames) | ✅ |
|
|
|
|
|
|
| **P3** packs sema (13 packs nuevos + 12 morfos `family-default`→`'pack'`) | ✅ |
|
|
|
|
|
|
| **P4** naming/API N1–N10 | ✅ **COMPLETO** |
|
|
|
|
|
|
| **P5** sistema/eidos | ✅ **CERRADO** — S1 ✅ · S5 ✅ · depth ✅ · touch-rows ✅ · **S6 ✅** (composición + poda + de-alias) · **S8 ✅** (`--calendar-range-*` API pública `83e13be6`) · (touch↔§37 pende decisión) |
|
|
|
|
|
|
| **P6** C7 textarea-measure + D13 · C6 weekInfo · B.11 splitter | ✅ **CERRADO** — C6 `3b02fd11` · C7 `444e05eb` · B.11 `0f0feb4f` |
|
docs(components): S4 lotes 2-5 + drag-drop — 24 consumer-door dossiers, E-2.3 = 0 (P7)
Batches: pickers/nav (range-calendar, natural-time-picker, menubar,
navigation-menu, command, listbox) + data (table, tree-view, tree-grid,
grid-list, feed, virtual-list, virtual-grid) + typography/display (s-text,
s-text-virtual-list, badge, card, image, skeleton, spinner — passives carry
## Passive justification) + util (link-preview, announce, clipboard) +
drag-drop (29th missing README, omitted from the 5-batch plan; census said
28, real count was 29).
R-1.x exceptions only with read evidence (announce: no interactive parts;
clipboard: trigger composes Button; trf/drf mirror). Non-README flags stay
recorded in each dossier's Gaps with disposition (ntp S9 package, badge
state-layer census, stvl archetype artifact, demo D-* rules).
Machine: 85 -> 102 PASS, E-2.3 = 0 catalog-wide; type baseline stays 57.
Handoff: S4 COMPLETE — audit-fix P0-P7 closed; S9 as dedicated sessions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
| **P7** S9 iniciativas · S4 READMEs · S7 papeleo · errores de tipo baseline | ✅ **S4 COMPLETO 2026-07-10** (baseline ✅ · S7 ✅ · S4 29+1 dossiers ✅, E-2.3=0, máquina 102 PASS) — S9 queda como sesiones dedicadas POST-audit-fix |
|
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress)
Re-audit of the whole component catalog at pilot depth (91 fichas + the
checkpoint verdicts in docs/audit/components/) and the executed fix packages.
- P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 +
API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d,
component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts
(role=application removed ×4, aria-selected off the Day, drp translationRef,
field data-state prune, pin-input commit-set, media-player renames), 13 new
sema packs + 12 morfos family-default → pack.
- P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar);
onValueCommit terminal-callback norm (pin-input/search/password/textarea +
date/time/color-field add); typed validation reason + onInvalid (tags-input,
css-field); index/onIndexChange (carousel); deselectable; openDelay/
groupSkipDelay; allowCustomValue; defaultValue prune.
- P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across
cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in
field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel);
touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual,
44 AAA). S6 (Field composition) + S8 (calendar-surface) pending.
Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline);
morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched
components; per-component vitest suites green.
Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md
Excluded (broken by the N1 rename, left broken per user decision, not staged):
words/**, palabras/**, chronos, web/routes/alpha/**.
Reconciliation pending: the touch-rows ::before for checkbox/switch reverses
changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed
markers to a labeled-row/Field task — flagged for the user in the handoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
|
|
|
|
|
|
## ✅ Reconciliación touch-rows ↔ §37 — CERRADA (decisión usuario 2026-07-10)
|
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress)
Re-audit of the whole component catalog at pilot depth (91 fichas + the
checkpoint verdicts in docs/audit/components/) and the executed fix packages.
- P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 +
API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d,
component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts
(role=application removed ×4, aria-selected off the Day, drp translationRef,
field data-state prune, pin-input commit-set, media-player renames), 13 new
sema packs + 12 morfos family-default → pack.
- P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar);
onValueCommit terminal-callback norm (pin-input/search/password/textarea +
date/time/color-field add); typed validation reason + onInvalid (tags-input,
css-field); index/onIndexChange (carousel); deselectable; openDelay/
groupSkipDelay; allowCustomValue; defaultValue prune.
- P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across
cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in
field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel);
touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual,
44 AAA). S6 (Field composition) + S8 (calendar-surface) pending.
Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline);
morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched
components; per-component vitest suites green.
Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md
Excluded (broken by the N1 rename, left broken per user decision, not staged):
words/**, palabras/**, chronos, web/routes/alpha/**.
Reconciliation pending: the touch-rows ::before for checkbox/switch reverses
changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed
markers to a labeled-row/Field task — flagged for the user in the handoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
|
|
|
|
|
|
**Opción (a) con nota**: el `::before` hit-slop queda CONFIRMADO como mecanismo
|
|
|
|
|
|
para markers desnudos (linaje Material `mdc-touch-target` / Android
|
|
|
|
|
|
touch-delegates / iOS hit-test insets). El argumento WCAG-solape del §37
|
|
|
|
|
|
original se resuelve con (1) requisito de spacing en pilas táctiles densas
|
|
|
|
|
|
(pitch ≥ `--touch-target`; AA garantizado en el peor caso por la excepción
|
|
|
|
|
|
Spacing) y (2) la **fila-label de Field sigue viva como mejora ADITIVA** — la
|
|
|
|
|
|
fila será el target AAA real cuando exista (2.5.5 Equivalent) y el pseudo queda
|
|
|
|
|
|
de red. Redactado en `changelog.md §37` (reconciliación) + `reference.md §37`
|
|
|
|
|
|
(standing "confirmed 2026-07-10").
|
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress)
Re-audit of the whole component catalog at pilot depth (91 fichas + the
checkpoint verdicts in docs/audit/components/) and the executed fix packages.
- P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 +
API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d,
component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts
(role=application removed ×4, aria-selected off the Day, drp translationRef,
field data-state prune, pin-input commit-set, media-player renames), 13 new
sema packs + 12 morfos family-default → pack.
- P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar);
onValueCommit terminal-callback norm (pin-input/search/password/textarea +
date/time/color-field add); typed validation reason + onInvalid (tags-input,
css-field); index/onIndexChange (carousel); deselectable; openDelay/
groupSkipDelay; allowCustomValue; defaultValue prune.
- P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across
cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in
field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel);
touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual,
44 AAA). S6 (Field composition) + S8 (calendar-surface) pending.
Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline);
morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched
components; per-component vitest suites green.
Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md
Excluded (broken by the N1 rename, left broken per user decision, not staged):
words/**, palabras/**, chronos, web/routes/alpha/**.
Reconciliation pending: the touch-rows ::before for checkbox/switch reverses
changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed
markers to a labeled-row/Field task — flagged for the user in the handoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
|
|
|
|
|
|
## P4 — hecho este bloque (N1–N10)
|
|
|
|
|
|
|
|
|
|
|
|
- **N1 `selectionMode`**: select, combobox, toggle-group, **calendar** (unión
|
|
|
|
|
|
discriminada; `data-type` como atributo se conserva — contrato eidos; solo prop
|
|
|
|
|
|
+ opts key → `selectionMode`). date-picker interno migrado; range-calendar N/A.
|
|
|
|
|
|
file-upload conserva `multiple` (espejo nativo).
|
|
|
|
|
|
- **N2 `onValueCommit`** (norma única callback terminal): pin-input `onComplete`→,
|
|
|
|
|
|
search/password `onSubmit`→, date/time/color-field **añaden** el callback
|
|
|
|
|
|
disparado en `commit-set` (solo al completar, no al limpiar), **textarea**
|
|
|
|
|
|
`onSubmit`→ (hueco de censo cazado). 5 sitios internos de picker/rango pasan
|
|
|
|
|
|
`undefined`.
|
|
|
|
|
|
- **N3** carousel `value`→`index`/`onIndexChange`. **N5** `deselectable`
|
|
|
|
|
|
(calendar migra `preventDeselect` con inversión de polaridad). **N6** tooltip
|
|
|
|
|
|
`openDelay`/`closeDelay`, `groupSkipDelay`. **N7** combobox `allowCustomValue`.
|
|
|
|
|
|
**N8** poda `defaultValue` (editable/select/grid-list; knob conserva). **N4/N10**
|
|
|
|
|
|
= veredictos que ratifican el statu quo (sin código).
|
|
|
|
|
|
- **N9 razón tipada + `onInvalid`**: tags-input migra `validate`-boolean→mensaje +
|
|
|
|
|
|
`onValueInvalid`→`onInvalid(reason, value, msg?)` con `'duplicate'|'custom'`.
|
|
|
|
|
|
**Verificado que date/time/ranges YA cumplían** (razones tipadas via
|
|
|
|
|
|
`DateOnInvalid`/`TimeOnInvalid` = `'min'|'max'|'custom'`). **css-field nivelado**
|
|
|
|
|
|
(decisión del usuario): `onInvalid(reason, value, msg?)` con `'parse'|'custom'`,
|
|
|
|
|
|
reenviando el `message` que ya computaba. (file-upload N/A — `FileRejectionReason[]`
|
|
|
|
|
|
ya tipado; words excluido.)
|
|
|
|
|
|
|
|
|
|
|
|
## P5 — hecho este bloque
|
|
|
|
|
|
|
|
|
|
|
|
- **S1 codemod 22 class-hooks** → `[data-{c}-{part}]` (plantilla + CSS): cropper 8
|
|
|
|
|
|
(+ estado `.is-zoomed`→`data-zoomed`), button 6 (+ `:is()` simplificado), image-picker
|
|
|
|
|
|
6, toggle 1, image-adjustments 1. eidos-lint: class-hooks 0 / invalid 0 en los 5.
|
|
|
|
|
|
- **S5 outline**: eliminado el remanente `box-shadow` (transición muerta) de
|
|
|
|
|
|
field.css; el resto del catálogo ya canonizado (comentarios post-migración).
|
|
|
|
|
|
- **depth pass**: `data-depth="overlay"` en tooltip-content, toast-item,
|
|
|
|
|
|
float-panel-content. **No-destructivo** (probado: la regla propia de cada overlay
|
|
|
|
|
|
gana la cascada por orden de fuente; el plano solo aporta identidad frost/Cristal
|
|
|
|
|
|
+ forced-colors). banner **fuera** (decisión del usuario — es strip inline).
|
|
|
|
|
|
- **touch-rows**: token `--touch-target: 44px` (`:root` en archetypes.css). Botones
|
|
|
|
|
|
tokenizados. checkbox/switch: `::before` transparente `max(100%, var(--touch-target))`
|
|
|
|
|
|
gated a coarse → **crece el ÁREA, no el visual** (modelo React Aria / Material
|
|
|
|
|
|
`mdc-touch-target`; suelo único 44 AAA). radio-group row tokenizado.
|
|
|
|
|
|
|
|
|
|
|
|
### Decisiones de método relevantes (para no repetir errores)
|
|
|
|
|
|
|
|
|
|
|
|
- **depth**: la disyuntiva "migrar-al-plano vs quitar-shadow" partía de una premisa
|
|
|
|
|
|
falsa (el "doble shadow" — `box-shadow` NO es aditivo). El fix correcto era el
|
|
|
|
|
|
simple: solo añadir `data-depth`; la regla propia gana. Verificado en vivo.
|
|
|
|
|
|
- **touch-rows**: NO anclar en "44px" sin ver que (a) **área ≠ visual** son ejes
|
|
|
|
|
|
distintos, y (b) el visual depende de size/fuente. Se comparó con 5 frameworks
|
|
|
|
|
|
(React Aria, Radix, Material/MUI, Ark, Base/Bootstrap/shadcn): solo React Aria y
|
|
|
|
|
|
Material desacoplan área/visual; **nadie** hace split AA/AAA por talla (el análogo
|
|
|
|
|
|
MUI se considera bug). → suelo único 44 AAA sobre el ÁREA.
|
|
|
|
|
|
|
|
|
|
|
|
## P5 — S6 Field composition (HECHO 2026-07-08→09, pusheado)
|
|
|
|
|
|
|
|
|
|
|
|
Doctrina del usuario: **todos los fields deben SER fields** (componen `field.css`),
|
|
|
|
|
|
**y ningún field concreto declara tokens que aliasen los de Field**. Commits
|
|
|
|
|
|
`5eb92132..d1670caa` (12). Detalle en memoria: `compose-base-field-not-replicate`,
|
|
|
|
|
|
`no-token-aliases`, `recipe-orphan-test-prune`.
|
|
|
|
|
|
|
|
|
|
|
|
- **16 fields componen `field.css`** — cuatro cardinalidades descubiertas y
|
|
|
|
|
|
documentadas:
|
|
|
|
|
|
1. **multi-field** (date/time-range-field): montan un `<DateField>`/`<TimeField>`
|
|
|
|
|
|
real por endpoint (soma), tamaño/variant/color via visual context.
|
|
|
|
|
|
2. **single-field picker** (date/time-picker): el root ES el field
|
|
|
|
|
|
(`data-field` + `data-{c}-field`), chrome de `field.css`.
|
|
|
|
|
|
3. **single-control text** (search/mask/number/css): colapsan `fieldRole('provider')`
|
|
|
|
|
|
+ `fieldRole('control')` en la única caja; `field.css [data-field-control]` fija
|
|
|
|
|
|
`flex-direction: row` (evita que la columna del provider apile los afijos).
|
|
|
|
|
|
4. **field con contenido debajo** (password: strength meter): estructura Field
|
|
|
|
|
|
canónica completa con una parte `<Control>` real + el meter como hermano del stack.
|
|
|
|
|
|
- **Poda de recipe-tokens** (`a820e5f3` + `d1670caa`, **199 tokens**): mover el chrome
|
|
|
|
|
|
a `field.css` dejó los `--{c}-field-height/padding/border/bg/font/...` **huérfanos**
|
|
|
|
|
|
(emitidos sin consumidor). El guard **`recipe-css-contract.test.ts` "orphaned"** los
|
|
|
|
|
|
caza (167 en la 1ª pasada + 32 tras de-aliasar los pickers). mask-field quedó sin
|
|
|
|
|
|
tokens propios → entrada de recipe eliminada.
|
|
|
|
|
|
- **De-alias de pickers** (`d1670caa`): date-range/time/time-range-picker aliasaban
|
|
|
|
|
|
`--date-field-*`/`--time-field-*` para su parte "field-shaped" → retargeteados a los
|
|
|
|
|
|
**tokens públicos de Field** (`--field-control-*`/`--field-*`/`--field-segment-height`)
|
|
|
|
|
|
o al primitivo donde Field no tiene equivalente (wrap column-gap = segment gap).
|
|
|
|
|
|
Value-preserving (mismo primitivo tras un hop), verificado con revisión adversarial
|
|
|
|
|
|
(workflow, 4 agentes) + navegador en los 4 pickers.
|
|
|
|
|
|
|
|
|
|
|
|
### Lecciones de método (S6) — no repetir
|
|
|
|
|
|
|
|
|
|
|
|
- **El baseline `svelte-check` NO corre vitest.** Tras cualquier refactor de
|
|
|
|
|
|
recipe/CSS, corre además `npx vitest run src/uix/eidos/recipe-css-contract.test.ts`
|
|
|
|
|
|
(25 tests: huérfanos, phantom, "todo var resuelve", scope-contract). La regresión
|
|
|
|
|
|
de 167 huérfanos fue invisible al baseline durante toda la composición S6.
|
|
|
|
|
|
- **`--field-segment-height` solo existe bajo `[data-field][data-size]`.** Un elemento
|
|
|
|
|
|
compuesto SIN `[data-size]` cae al default `[data-field]` = **md, fijado**. Antes de
|
|
|
|
|
|
cambiar un `calc(--control-height - space-2)` por `--field-segment-height`, verifica
|
|
|
|
|
|
en el DOM (xs/sm/lg) que el elemento consumidor lleva `[data-size]`. La revisión
|
|
|
|
|
|
adversarial cazó exactamente esto en time-range-picker.
|
|
|
|
|
|
|
|
|
|
|
|
## P5 — CERRADO ✅ (S8 hecho 2026-07-09, `83e13be6`)
|
|
|
|
|
|
|
|
|
|
|
|
- **S8 calendar-surface**: 8 tokens públicos `--calendar-range-{start,end}-*` en el
|
|
|
|
|
|
recipe `calendar` (API de la capa); range-calendar los consume por el nombre
|
|
|
|
|
|
público; drp deja de tunear los `--_calendar-range-*` privados. Value-preserving
|
|
|
|
|
|
(25/25, baseline 59, eidos-lint 0, navegador idéntico en 4 colores + drp popover).
|
|
|
|
|
|
Asimetría deliberada documentada: start desde `:root` (tema-overrideable), end atado
|
|
|
|
|
|
al accent en el host. Detalle en memoria [[recipe-orphan-test-prune]] /
|
|
|
|
|
|
[[compose-base-field-not-replicate]] (mismo patrón anti-alias que el de-alias de pickers).
|
|
|
|
|
|
|
|
|
|
|
|
## P6 — CERRADO ✅ (2026-07-09→10)
|
|
|
|
|
|
|
|
|
|
|
|
- **C6** (`3b02fd11`): `getWeekInfo(locale)` público en `$libs/days` (convención Intl
|
|
|
|
|
|
1=lun..7=dom; `firstDay` espeja el `getWeekStart` interno; weekend de Intl con
|
|
|
|
|
|
fallback sáb/dom documentado, caché por locale). Calendar + range-calendar derivan
|
|
|
|
|
|
`weekend` del locale (antes: hardcoded sáb/dom con 'en-US' — mal para ar-SA).
|
|
|
|
|
|
Verificado en vivo (ar-SA → vie/sáb). **Hallazgo extra arreglado**: `getSimpleWeekNumber`
|
|
|
|
|
|
mezclaba marcos (weekStartsOn absoluto + locale-relativo) → semanas 'simple'
|
|
|
|
|
|
desplazadas −1 en es-ES; ancla en marco en-US fijo + test de regresión.
|
|
|
|
|
|
- **C7** (`444e05eb`): textarea `measureAutosize` difiere la lectura vía
|
|
|
|
|
|
`dom.measure` del contexto (antes: reflow forzado POR TECLA). Censo D13:
|
|
|
|
|
|
violaciones arregladas en scroll-area (getters del thumb leían clientHeight en
|
|
|
|
|
|
`$derived` → reflow por tick; ahora track medido por RO en $state), virtual-list
|
|
|
|
|
|
(×2 viewports), virtual-grid, carousel (seed diferido + fallback vivo en render
|
|
|
|
|
|
eliminado). Conformes sin cambio: float-panel, cropper, splitter (lecturas
|
|
|
|
|
|
event-time antes de write — D13 es regla de timing). Suites actualizadas al
|
|
|
|
|
|
contrato diferido.
|
|
|
|
|
|
- **B.11** (`0f0feb4f`): par bindable del splitter — `sizes` (bindable, % por orden
|
|
|
|
|
|
de registro: seed + sync + escritura externa clampada) + `onResize`→`onSizesChange`
|
|
|
|
|
|
(norma X+onXChange; dos nombres = alias). `onResizeEnd` se queda (momento commit).
|
|
|
|
|
|
Verificado en vivo en ambas direcciones.
|
|
|
|
|
|
- **Gotcha de entorno registrado** (memoria `hidden-pane-suspends-raf`): el Browser
|
|
|
|
|
|
pane oculto (`visibilityState: hidden`) suspende rAF + entrega de RO → sondas de
|
|
|
|
|
|
medición "muertas", screenshots en timeout. Chequear la vitalidad de rAF ANTES de
|
|
|
|
|
|
diagnosticar; verificar vía suite de navegador de vitest en su lugar. La sonda
|
|
|
|
|
|
reflowDetector quedó pendiente por esto (opcional, no bloqueante).
|
|
|
|
|
|
|
|
|
|
|
|
## P7 — estado (2026-07-10)
|
|
|
|
|
|
|
|
|
|
|
|
- **Baseline** ✅ (`c0ae3de1`): editable + grid-list arreglados (tipos-solo, cast
|
|
|
|
|
|
sobre renderProps) → protocolo ahora **57**. Quedan 9 src/ + ~48 web/ fuera de
|
|
|
|
|
|
mandato (inventario arriba en el protocolo).
|
|
|
|
|
|
- **S7 papeleo** ✅ (`fe844c62`): doctrina §5 + clasificador + F-1.5 ya existían
|
|
|
|
|
|
(P0/P1); añadidos los 2 artefactos que faltaban — `## Passive justification` en
|
|
|
|
|
|
color-swatch (F-1.5 verificado verde en la máquina) + README de capa de
|
|
|
|
|
|
spin-field. radio-cards = interactive para la máquina (F-1.5 N/A; su cita
|
|
|
|
|
|
canónica es el header del morfo, verificada).
|
|
|
|
|
|
- **S4 READMEs** ◐ — **decisión del usuario (2026-07-10): dossier completo, por
|
|
|
|
|
|
lotes de ~6/sesión, máquina en verde por lote**. Forma real (hallazgo): F-1.x
|
|
|
|
|
|
lee el README de eidos como dossier de embarque (`## Baseline` / `## Comparativa`
|
|
|
|
|
|
≥3 refs / `## Decisiones` / `## Gaps` con disposiciones) + puerta del consumidor
|
|
|
|
|
|
(plantilla date-field); el grandfather.json existe para que estos dossiers se
|
|
|
|
|
|
escriban en P7. Gran parte = trasplante ficha→README (las 91 fichas ya tienen
|
|
|
|
|
|
Baseline/Comparativa). **Lotes propuestos** (28 + field-langs):
|
|
|
|
|
|
1. ✅ **forms (2026-07-10, `7b82aa79`)**: button · password-field ·
|
|
|
|
|
|
time-range-field · textarea · knob (READMEs eidos) + **soma field-langs**
|
|
|
|
|
|
(contrato headless).
|
|
|
|
|
|
Máquina: 81→85 PASS; los 5 E-2.3 limpios; F-1.x verde en los 6; baseline 57.
|
|
|
|
|
|
Método fijado: exceptions `R-1.x exception:` SOLO con evidencia leída (pf
|
|
|
|
|
|
R-1.3/R-1.4 → field.css; trf R-1.5/R-1.3/R-1.4 → endpoints TimeField reales,
|
|
|
|
|
|
espejo drf) + gaps de ficha aún vivos trasladados a `## Gaps` con disposición.
|
|
|
|
|
|
button sigue NEEDS-WORK solo por `D-1.5` (regla de DEMO, fuera del alcance).
|
|
|
|
|
|
One-liners detectados y NO ejecutados (decisión pendiente): apg de trf
|
|
|
|
|
|
(`spinbutton`) y apg none-con-razón de field-langs (su `A-1.4 exception` en
|
|
|
|
|
|
README ya no se honra tras C5); README soma de button drifted
|
|
|
|
|
|
(`pending`/`pressed` vs types reales) + docblocks F-2/F-3 de la ficha.
|
docs(components): S4 lotes 2-5 + drag-drop — 24 consumer-door dossiers, E-2.3 = 0 (P7)
Batches: pickers/nav (range-calendar, natural-time-picker, menubar,
navigation-menu, command, listbox) + data (table, tree-view, tree-grid,
grid-list, feed, virtual-list, virtual-grid) + typography/display (s-text,
s-text-virtual-list, badge, card, image, skeleton, spinner — passives carry
## Passive justification) + util (link-preview, announce, clipboard) +
drag-drop (29th missing README, omitted from the 5-batch plan; census said
28, real count was 29).
R-1.x exceptions only with read evidence (announce: no interactive parts;
clipboard: trigger composes Button; trf/drf mirror). Non-README flags stay
recorded in each dossier's Gaps with disposition (ntp S9 package, badge
state-layer census, stvl archetype artifact, demo D-* rules).
Machine: 85 -> 102 PASS, E-2.3 = 0 catalog-wide; type baseline stays 57.
Handoff: S4 COMPLETE — audit-fix P0-P7 closed; S9 as dedicated sessions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
2. ✅ **pickers/nav (2026-07-10)**: range-calendar · natural-time-picker ·
|
|
|
|
|
|
menubar · navigation-menu · command · listbox. Máquina 85→90 PASS; F-1.x
|
|
|
|
|
|
verde en los 6; baseline 57. Verificado pre-escritura el estado
|
|
|
|
|
|
post-fixes (los 6 con hallazgos de ficha YA resueltos por P2/P3/S3b/S8:
|
|
|
|
|
|
packs de range-calendar y listbox, aria-selected, role application, apg
|
|
|
|
|
|
de ntp). **Hallazgo nuevo con evidencia** (README de range-calendar,
|
|
|
|
|
|
Gaps): las marcas holiday/event siguen MUERTAS en range-calendar — sus 2
|
|
|
|
|
|
tokens (`--calendar-day-holiday-shadow`, `--calendar-event-shadow`) se
|
|
|
|
|
|
emiten bajo `[data-calendar]` en generated/base.css y no resuelven bajo
|
|
|
|
|
|
`[data-range-calendar]` (el resto del préstamo va en `:root` y sí).
|
|
|
|
|
|
ntp sigue NEEDS-WORK por su paquete S9 "ntp integral" (A-3.1 del Picker
|
|
|
|
|
|
genérico sin eventos · R-2.1 los 9 cielos sin anotar · README soma +
|
|
|
|
|
|
tests) — todo trasladado a su `## Gaps` con disposición; one-liner
|
|
|
|
|
|
`expression: 'delegated'` en ntp pendiente de decisión (diría la verdad
|
|
|
|
|
|
y silencia A-3.1). R-1.3 readonly de range-calendar/listbox = gap real
|
|
|
|
|
|
(no pinta en ningún sitio) → censo, SIN exception.
|
|
|
|
|
|
3. ✅ **data (2026-07-10)**: table · tree-view · tree-grid · grid-list ·
|
|
|
|
|
|
feed · virtual-list · virtual-grid. Máquina 90→95 PASS; F-1.x verde en
|
|
|
|
|
|
los 7; baseline 57. Los 7 tenían soma README ✓ y suite ✓; varios
|
|
|
|
|
|
hallazgos de ficha ya resueltos post-audit y documentados en los
|
|
|
|
|
|
dossiers (table pack S3b + sort reclasificado a commit.set; apg de
|
|
|
|
|
|
virtual-list en forma C5 "none — rationale"; D13 de virtual-* vía
|
|
|
|
|
|
dom.measure, C7; error de tipos de grid-list en baseline `c0ae3de1`).
|
|
|
|
|
|
virtual-list/virtual-grid quedan NEEDS-WORK SOLO por `D-1.5` (regla de
|
|
|
|
|
|
DEMO, fuera del alcance — mismo caso que button). **Hallazgo nuevo**
|
|
|
|
|
|
(Gaps de tree-grid): asimetría de naming entre gemelos — tree-grid usa
|
|
|
|
|
|
`value`+`expanded`, tree-view usa `selectedValue`+`expandedValue` (N4
|
|
|
|
|
|
solo ratificó el segundo; ambos multi-eje) → decisión de espejo
|
|
|
|
|
|
pendiente. R-1.3 readonly de tree-grid/grid-list = gap real → censo,
|
|
|
|
|
|
SIN exception.
|
|
|
|
|
|
4. ✅ **typography/display (2026-07-10)**: s-text · s-text-virtual-list ·
|
|
|
|
|
|
badge · card · image · skeleton · spinner. Máquina 95→99 PASS; F-1.x (+
|
|
|
|
|
|
F-1.5 en los 4 pasivos: s-text, image, skeleton, spinner) verde en los
|
|
|
|
|
|
7; baseline 57. Quedan NEEDS-WORK con F-1.x verde y el resto en Gaps:
|
|
|
|
|
|
badge (R-4.3 hover del Remove con color-mix hand-rolled → censo
|
|
|
|
|
|
state-layer; R-4.3 NO honra exceptions de README), s-text-virtual-list
|
|
|
|
|
|
(R-1.5 = ARTEFACTO del `archetype: 'item'` en Row — display de 0
|
|
|
|
|
|
eventos `scope: ['eidos']`; one-liner de morfo pendiente que lo vuelca
|
|
|
|
|
|
a passive, el README ya trae la Passive justification preparada) y
|
|
|
|
|
|
spinner (D-7.4, demo). apg de badge/card/virtual-list ya estaban en
|
|
|
|
|
|
forma C5 "none — rationale" ✓.
|
|
|
|
|
|
5. ✅ **util (2026-07-10)**: link-preview · announce · clipboard +
|
|
|
|
|
|
**drag-drop** (el nº29 del censo E-2.3, omitido del plan de 5 lotes e
|
|
|
|
|
|
incorporado al cierre — el "28" del plan era 29 en el censo real).
|
|
|
|
|
|
Máquina 99→102 PASS. Exceptions con evidencia: announce R-1.5 (cero
|
|
|
|
|
|
partes interactivas — eventos programáticos de live region) y
|
|
|
|
|
|
clipboard R-1.5 (el Trigger compone `<Button>`; focus en button.css).
|
|
|
|
|
|
Estados post-fixes verificados: clipboard y drag-drop con pack S3b ✓,
|
|
|
|
|
|
link-preview con `expression: 'delegated'` ✓, apg C5 en drag-drop ✓
|
|
|
|
|
|
(link-preview aún sin apg → one-liner en su Gaps).
|
|
|
|
|
|
Criterio de éxito por lote: `npx tsx scripts/component-audit.ts` → los F-1.x
|
|
|
|
|
|
del lote pasan (el informe cae en `tmp/component-audit.md`).
|
|
|
|
|
|
- **S9 iniciativas** ◐ — sesiones dedicadas POST-S4. **gradient-* ✅ CERRADA
|
|
|
|
|
|
(2026-07-10, `45ae3691`)**: la memoria "trabajo sin commitear" era stale
|
|
|
|
|
|
(todo estaba en `b3d0e290`/`f5eb8acb`); la sesión graduó ambos de
|
|
|
|
|
|
`ACTIVE_DEV_TRACK` (única violación: barrel soma; contracts quedan con los
|
|
|
|
|
|
mismos 13 fallos AJENOS preexistentes — knob/menu-dial/metrics/onion-menu),
|
|
|
|
|
|
declaró apg ×2, subió ambos READMEs a dossier y arregló el falso negativo
|
|
|
|
|
|
D-1.2 del builder. **ntp integral ✅ CERRADA (2026-07-10, `dd249eac`)**: el
|
|
|
|
|
|
ítem estrella (eventos del Picker genérico) YA estaba pagado en S3b (la
|
|
|
|
|
|
ficha era stale — verificado: morfo+pack+triggers+suite); lo que la sesión
|
|
|
|
|
|
añadió: R-2.1 aprende la válvula `literal:` (espejo R-4.x) + los 9 colores
|
|
|
|
|
|
del cielo anotados (no tokenizados, F-2) + README soma (contrato del
|
|
|
|
|
|
coordinador de dominio + cadena delegada) + suite del provider 12/12.
|
|
|
|
|
|
**metrics+suite ✅ CERRADA (2026-07-10, `8e3a67bd`) — S9 COMPLETO**: metrics
|
|
|
|
|
|
reclasificado como puente interno (`SOMA_INTERNAL_PRIMITIVES`, con
|
|
|
|
|
|
picker-shell — su soma es una función sin Provider POR DISEÑO; contracts
|
|
|
|
|
|
13→12 fallos, cero metrics) + import self-alias arreglado + apg C5 +
|
|
|
|
|
|
dossier (goodTrend como diferencial) + suite 7/7 (helper `resolveDeltaIntent`
|
|
|
|
|
|
extraído puro + el puente signal con intent del prop source y contrato de
|
|
|
|
|
|
live region). **Censo contracts ✅ (2026-07-10, `cb554ae2`) — 12→3
|
|
|
|
|
|
fallos**: knob (barrel + README soma) · menu-dial/onion-menu = puentes
|
|
|
|
|
|
internos (`SOMA_INTERNAL_PRIMITIVES`; el guard de scope resta el set de
|
|
|
|
|
|
AMBOS lados — un puente puede declarar 'soma' con verdad sin ser namespace
|
|
|
|
|
|
público) · 6 barrels desacoplados del filename del provider (patrón
|
|
|
|
|
|
`internals.ts` del picker: calendar/cropper/field-langs/gradient-*/
|
|
|
|
|
|
image-adjustments) · `listSourceFiles` salta el ACTIVE_DEV_TRACK
|
|
|
|
|
|
(words/chronos fuera de los guards de ficheros) · `data-archetype` = attr
|
|
|
|
|
|
conocido del compilador + los 4 triggers field-overlay (color-picker/drp/
|
|
|
|
|
|
time-picker/trp) alineados al precedente date-picker/ntp (el contrato ya
|
|
|
|
|
|
coincide con el DOM; cero cambio runtime) · marker
|
|
|
|
|
|
`data-float-panel-no-drag` declarado en el morfo. **Cola
|
|
|
|
|
|
runtime-discipline ✅ CERRADA (2026-07-11, `bdd17f04` + field `33f346ed`)
|
|
|
|
|
|
— contracts.test 37/37 VERDE por primera vez**: field adopta
|
|
|
|
|
|
`commit-submit` al Enter (doctrina de familia, verificado en vivo: stamp
|
|
|
|
|
|
`commit/neutral/active` + traza de la demo) · float-panel migra TODO a
|
|
|
|
|
|
`dom.writeProperty`/`removeProperty` (síncrono — el hot-path pegado al
|
|
|
|
|
|
cursor conserva su timing, verificado en vivo píxel-perfecto puntero Y
|
|
|
|
|
|
teclado) + `uix.timers.schedule` para el readout + los modos kb ahora
|
|
|
|
|
|
suenan por los MISMOS handle-events que el puntero (pick al entrar, drop
|
|
|
|
|
|
al salir/cancelar) · A-3.7 afinado a acciones DISTINTAS (Set — la
|
|
|
|
|
|
semántica de su propio comentario; 0 fallos de catálogo) · media-provider
|
|
|
|
|
|
= PUERTO Svelte-agnóstico por diseño documentado → excepción del guard de
|
|
|
|
|
|
listeners (la válvula que timers ya tenía para announce). Matriz: **120
|
|
|
|
|
|
PASS / 14 NEEDS-WORK / 0 BROKEN**.
|
|
|
|
|
|
**Censo R-1.x ✅ CERRADO (2026-07-11, `ee9786bc`)**: 9 componentes — badge
|
|
|
|
|
|
con fix REAL (hover del Remove al velo `--state-hover` §38, verificado en
|
|
|
|
|
|
demo) + 8 exceptions con evidencia leída (alert-dialog/fab/split-button/
|
|
|
|
|
|
qr-code componen `<Button>`; date-picker superpone `data-field` y su
|
|
|
|
|
|
trigger es DateField.Input compuesto; drf = layout-only espejo de trf;
|
|
|
|
|
|
mask-field IS-A Field ×4 reglas; pin-input YA pinta el ring en
|
|
|
|
|
|
`[data-active]` con tokens canónicos — vehículo que la heurística no
|
|
|
|
|
|
reconoce). Matriz: **129 PASS / 5 NEEDS-WORK / 0 BROKEN** — los 5 = el
|
|
|
|
|
|
lote 6 final (color-swatch · onion-menu · radio-cards · scroll-frames ·
|
|
|
|
|
|
timeline, cero errores, solo dossiers antiguos).
|
|
|
|
|
|
**Lote 6 ✅ CERRADO (2026-07-11, `7f2bcc28`) → PROGRAMA COMPLETO: la
|
|
|
|
|
|
matriz entera en VERDE — 134 PASS / 0 NEEDS-WORK / 0 BROKEN** (+ timeline
|
|
|
|
|
|
gana apg C5 y sus dos `1em` anotados `literal:`; onion-menu renombra
|
|
|
|
|
|
"## Decisions"→"## Decisiones"; scroll-frames gana su Passive
|
|
|
|
|
|
justification). contracts 37/37 · vocab 0 · baseline 57. **La cola del
|
|
|
|
|
|
programa de auditoría está VACÍA. Siguiente = los P1 de la auditoría
|
|
|
|
|
|
clean-room del usuario (`docs/audit-new-10-july/audit-active-uix.md`)** —
|
|
|
|
|
|
los dos que amplían la máquina primero (CSS secundarios sin escaneo R-* ·
|
|
|
|
|
|
card-group sin morfo, invisible a la matriz) y el resto de frentes
|
|
|
|
|
|
(literales en archetypes.css, live-region dual, paleta 33 2/17…).
|
|
|
|
|
|
**Demos FUERA del fix (decisión usuario 2026-07-10, `e53bf0e8`)**: habrá un
|
|
|
|
|
|
frame NUEVO para exponer las demos de todo el sistema → las reglas D-* son
|
|
|
|
|
|
verdict-NEUTRAL en la máquina (datos visibles, matriz sin pintar; se
|
|
|
|
|
|
reescriben contra el frame nuevo). **Matriz resultante: 118 PASS / 16
|
|
|
|
|
|
NEEDS-WORK / 0 BROKEN**, y los 16 = tres familias reales:
|
|
|
|
|
|
(1) censo R-1.x focus/disabled ×9 (alert-dialog/date-picker/drf/fab/
|
|
|
|
|
|
mask-field/pin-input/qr-code/split-button + badge R-4.3 state-layer);
|
|
|
|
|
|
(2) dossiers antiguos ×6 = lote 6 reducido (color-swatch/onion-menu/
|
|
|
|
|
|
radio-cards/scroll-frames/timeline/float-panel);
|
|
|
|
|
|
(3) contrato ×2: field A-3.1 + float-panel A-3.7 — **convergen con el
|
|
|
|
|
|
hallazgo "field/float-panel infra-declarados" de la clean-room nueva**.
|
|
|
|
|
|
Otros: class-hooks preexistentes color-picker(2)/time-picker(8)/trp(12).
|
|
|
|
|
|
**Audit-fix cerrado con S4; S9 cerrado; la auditoría viva ahora es la
|
|
|
|
|
|
clean-room del usuario en `docs/audit-new-10-july/`.**
|
|
|
|
|
|
|
docs(components): S4 lotes 2-5 + drag-drop — 24 consumer-door dossiers, E-2.3 = 0 (P7)
Batches: pickers/nav (range-calendar, natural-time-picker, menubar,
navigation-menu, command, listbox) + data (table, tree-view, tree-grid,
grid-list, feed, virtual-list, virtual-grid) + typography/display (s-text,
s-text-virtual-list, badge, card, image, skeleton, spinner — passives carry
## Passive justification) + util (link-preview, announce, clipboard) +
drag-drop (29th missing README, omitted from the 5-batch plan; census said
28, real count was 29).
R-1.x exceptions only with read evidence (announce: no interactive parts;
clipboard: trigger composes Button; trf/drf mirror). Non-README flags stay
recorded in each dossier's Gaps with disposition (ntp S9 package, badge
state-layer census, stvl archetype artifact, demo D-* rules).
Machine: 85 -> 102 PASS, E-2.3 = 0 catalog-wide; type baseline stays 57.
Handoff: S4 COMPLETE — audit-fix P0-P7 closed; S9 as dedicated sessions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
## Lo que queda — **S4 CERRADO; siguiente = decisiones + S9**
|
|
|
|
|
|
|
|
|
|
|
|
### Follow-ups no bloqueantes (registrados)
|
|
|
|
|
|
|
|
|
|
|
|
- **`task_d66356de`** — **TimeRangePicker no propaga `data-size` a sus endpoints**
|
|
|
|
|
|
(caja fijada a md en todo tamaño; verificado en DOM 2026-07-08). DateRangePicker SÍ
|
|
|
|
|
|
lo hace (via el visual context de date-range-field). Espejar ese patrón; luego el
|
|
|
|
|
|
embedded-trigger de time-range-picker podrá volver a `--field-segment-height` (hoy usa
|
|
|
|
|
|
el privado `--_time-field-height` a propósito, por este hueco).
|
|
|
|
|
|
- **Task #31 (memoria)** — migrar los date/time pickers al `PickerProvider<TValue>`
|
|
|
|
|
|
genérico (deferValue). **POST audit-fix**, no ahora.
|
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress)
Re-audit of the whole component catalog at pilot depth (91 fichas + the
checkpoint verdicts in docs/audit/components/) and the executed fix packages.
- P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 +
API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d,
component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts
(role=application removed ×4, aria-selected off the Day, drp translationRef,
field data-state prune, pin-input commit-set, media-player renames), 13 new
sema packs + 12 morfos family-default → pack.
- P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar);
onValueCommit terminal-callback norm (pin-input/search/password/textarea +
date/time/color-field add); typed validation reason + onInvalid (tags-input,
css-field); index/onIndexChange (carousel); deselectable; openDelay/
groupSkipDelay; allowCustomValue; defaultValue prune.
- P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across
cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in
field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel);
touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual,
44 AAA). S6 (Field composition) + S8 (calendar-surface) pending.
Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline);
morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched
components; per-component vitest suites green.
Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md
Excluded (broken by the N1 rename, left broken per user decision, not staged):
words/**, palabras/**, chronos, web/routes/alpha/**.
Reconciliation pending: the touch-rows ::before for checkbox/switch reverses
changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed
markers to a labeled-row/Field task — flagged for the user in the handoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
|
|
|
|
|
|
## Protocolo de verificación (invariante en toda la fase)
|
|
|
|
|
|
|
|
|
|
|
|
- **Baseline de tipos**: `npm run check` → errores **fuera de**
|
|
|
|
|
|
`alpha|words|palabras|chronos` debe seguir en **57** (era 59; P7 arregló los 2
|
|
|
|
|
|
mandados: editable + grid-list — tipos-solo, cast sobre renderProps). (Comando:
|
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress)
Re-audit of the whole component catalog at pilot depth (91 fichas + the
checkpoint verdicts in docs/audit/components/) and the executed fix packages.
- P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 +
API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d,
component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts
(role=application removed ×4, aria-selected off the Day, drp translationRef,
field data-state prune, pin-input commit-set, media-player renames), 13 new
sema packs + 12 morfos family-default → pack.
- P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar);
onValueCommit terminal-callback norm (pin-input/search/password/textarea +
date/time/color-field add); typed validation reason + onInvalid (tags-input,
css-field); index/onIndexChange (carousel); deselectable; openDelay/
groupSkipDelay; allowCustomValue; defaultValue prune.
- P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across
cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in
field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel);
touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual,
44 AAA). S6 (Field composition) + S8 (calendar-surface) pending.
Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline);
morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched
components; per-component vitest suites green.
Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md
Excluded (broken by the N1 rename, left broken per user decision, not staged):
words/**, palabras/**, chronos, web/routes/alpha/**.
Reconciliation pending: the touch-rows ::before for checkbox/switch reverses
changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed
markers to a labeled-row/Field task — flagged for the user in the handoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
`npm run check 2>&1 | grep " ERROR " | grep -vaiE "alpha|words|palabras|chronos" | wc -l`.)
|
|
|
|
|
|
Quedan 9 src/ fuera de mandato (file-upload ×4 aria-label, navigation-menu
|
|
|
|
|
|
sideOffset, arts/connection ×4) + ~48 en web/ (demos) — candidatos, no mandato.
|
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress)
Re-audit of the whole component catalog at pilot depth (91 fichas + the
checkpoint verdicts in docs/audit/components/) and the executed fix packages.
- P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 +
API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d,
component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts
(role=application removed ×4, aria-selected off the Day, drp translationRef,
field data-state prune, pin-input commit-set, media-player renames), 13 new
sema packs + 12 morfos family-default → pack.
- P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar);
onValueCommit terminal-callback norm (pin-input/search/password/textarea +
date/time/color-field add); typed validation reason + onInvalid (tags-input,
css-field); index/onIndexChange (carousel); deselectable; openDelay/
groupSkipDelay; allowCustomValue; defaultValue prune.
- P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across
cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in
field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel);
touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual,
44 AAA). S6 (Field composition) + S8 (calendar-surface) pending.
Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline);
morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched
components; per-component vitest suites green.
Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md
Excluded (broken by the N1 rename, left broken per user decision, not staged):
words/**, palabras/**, chronos, web/routes/alpha/**.
Reconciliation pending: the touch-rows ::before for checkbox/switch reverses
changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed
markers to a labeled-row/Field task — flagged for the user in the handoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
- **Vocab guard**: `npx tsx scripts/morfo-vocabulary-check.ts` → exit 0 (el único
|
|
|
|
|
|
WARN preexistente es `cropper.commit-crop`, descubribilidad, no mandato).
|
|
|
|
|
|
- **eidos-lint**: `npx tsx scripts/eidos-lint.ts <componente>` → class-hooks 0 /
|
|
|
|
|
|
invalid 0.
|
|
|
|
|
|
- **Suites por componente** en verde antes de pasar al siguiente (no-cascada: UN
|
|
|
|
|
|
componente, verificar, luego el siguiente).
|
|
|
|
|
|
- **UI**: check en navegador con los `preview_*` (no screenshot — flaky; usar
|
|
|
|
|
|
`preview_eval`/`preview_inspect`). Limitación conocida: no se puede forzar
|
|
|
|
|
|
`pointer: coarse` en el preview headless (el resize a móvil no cambia el tipo de
|
|
|
|
|
|
puntero) — verificar coarse por CSSOM + gating en fine.
|
|
|
|
|
|
|
|
|
|
|
|
## Exclusiones DURAS (no tocar / no commitear)
|
|
|
|
|
|
|
|
|
|
|
|
- `words/**`, `palabras/**`, `chronos` — el rename N1 los rompió; **decisión del
|
|
|
|
|
|
usuario: dejarlos rotos** (excluidos del baseline y del commit).
|
|
|
|
|
|
- `web/routes/alpha/**` — sitio de docs TERMINADO.
|
|
|
|
|
|
- Nada a git sin petición explícita; al commitear, **paths explícitos** excluyendo
|
|
|
|
|
|
lo de arriba + `.claude/` (settings locales).
|