El AX hablaba tres dialectos rotos a la vez (medido por CDP): dos listbox
anidados (las opciones eran hijas del Control; el Provider no tenia ninguna),
button DENTRO de option (rol hoja: el nombre se fundia - "svelte Eliminar
etiqueta" como una sola cosa) y un combobox sin aria-expanded/aria-controls
apuntando activedescendant a etiquetas commiteadas. F-1, adjudicado
2026-07-07; el registro de ayer era una re-deteccion parcial.
Estructura B (firmada): Control = grid de UNA fila - etiquetas = gridcell
(conservan el aria-selected -> stateRef de 2ce43db56; gridcell lo admite) -
el boton de borrar CONVIVE en la celda de su etiqueta ("a cell contains one
widget... link, button" - lo que lo prohibia era option, Children
Presentational) - el input en celda propia como TEXTBOX nativo (combobox
EXIGE controls/expanded y no hay popup) - el Provider pierde su listbox.
Dos partes privadas nuevas (Row, InputCell) con display:contents: grid solo
posee filas, row solo celdas.
- Teclado: la navegacion estaba MUERTA (ArrowLeft x2 avanzaba 0) y ahora
camina; el resalte mueve foco DOM - la CONDICION de retirar el
activedescendant (su destino debe ser descendiente y era hermano).
Tabulacion sigue en UNA parada.
- aria-orientation RETIRADO (no es propiedad de grid; Chrome no la expone,
medido): se conserva como comportamiento, no como atributo.
- Pixel CERO: sonda 2.496 valores por identidad de nodo, 0 diffs, geometria
al centesimo; capturas byte-identicas. CSS: 7 lineas display:contents.
- Gates: morfo 222/222 - soma tags-input - attr-audit con el techo APRETADO
1->0 - eidos 443+1 ajeno - morfo:check PASA - check 0 propios - docs 0/0.
- Registro: F-1 CERRADO (ficha de componente, nota fechada) - el item 12.5
del tono MOVIDO de 13 a 12 con sus dos cifras corregidas ((0,4,0); gana el
BLOQUE de archetypes) - abiertos: tag-group filas sin celdas (el
"precedente" refutado midiendo: CERO gridcell), search-field F-1, y la
regla del censo de citas APG - demo: 3 filas de su tabla a11y actualizadas
para no mentir sobre los roles nuevos.
- Trampa nueva anotada: `const state = Provider.create()` SOMBREA la runa
$state (compila y revienta en render); un error SSR no llega al navegador -
se caza navegando por el router desde otra pagina.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- **Duplicación de alturas (SYS-6)**: date/time/color/search/password/mask-field (6).
- **Packs sema (SYS-3) — censo CORREGIDO por la re-auditoría (pickers/calendar)**: trío FIELDS roto (date ✓ / time ✗ / color-field ✗) PERO los pickers de media TODOS con pack ✓ (color-picker, image-picker, gradient-picker, gradient-builder) · **command RETIRADO de la lista** (family-default razonado con libro in-place: cap.22 §8 anti-"celebrate before time", precedente Button — tercer default legítimo documentado con field-langs y button) · sin pack con semántica rica CONFIRMADOS: **range-calendar (el mejor candidato: start affirm → range FULFILL → reset neutral ya declarados)**, month/year-grid, listbox, clipboard, drag-drop, media-player, onion-menu/menu-dial, carousel, table · **tercera categoría nueva: deuda DECLARADA** (Picker genérico :18-19 — fijar plazo a los "yet" en el veredicto) · pendiente re-verificar al llegar a sus familias: listbox/clipboard/drag-drop/etc.
- ~~Demo (D-7.4 chip drift · D-1.2 plantilla · D-1.5/D-4.3/D-3.1 cableado)~~ — **FUERA DEL ALCANCE de esta auditoría** (corrección de alcance 2026-07-07: solo las capas del componente). Los datos siguen en tmp/component-audit.md como backlog de demos aparte; no computan en fichas ni en el checkpoint.
- **APG ausente (A-1.4)**: natural-time-picker, gradient-picker, gradient-builder, card (variante interactiva), drag-drop, media-player, virtual-list, metrics → y **regla nueva necesaria**: cómo satisfacer "sin patrón APG oficial" (media-player, drag-drop) — ¿`apg: 'none — rationale'`?**Actualización 2026-08-25**: la cara gemela —el `apg` PRESENTE pero MENTIROSO— tiene ya su primer miembro resuelto (`tags-input` F-1: se implementó el layout grid que citaba, en vez de corregir la cita) y dos miembros vivos medidos: `search-field` F-1 (`apg: combobox` sin popup) y **`tag-group`**, que declara el mismo `apg: grid` que `tags-input` y renderiza `role=row` SIN ninguna celda (`morfo/components/tag-group.ts:64` `:137``:163` — cero `gridcell` declarados) más un `Label` colgando del `grid` que no es `row`. La regla que falta es UNA para las dos caras: qué se hace cuando no hay patrón, y qué se hace cuando el declarado no describe lo implementado.
- **Gramática de eventos (A-3.6/A-3.7)**: media-player ×4 nombres fuera de `{familia}-{verbo}` · float-panel 28 mutaciones/6 eventos (el mayor infra-declarado).
- **Interactivo con 0 eventos (A-3.1) — censo FINAL tras chequeos de delegación**: **pin-input = el único caso desnudo** (0 eventos + comentario :7-9 que promete un "commit-fill" imposible: sema ni está en scope — contradicción in-file). EXONERADOS: date-range-field/time-range-field (delegación real a los singles embebidos; les falta solo declararla — `expression: 'delegated'`) · natural-time-picker (header :4-19 documenta la composición entera; su hueco transaccional es deuda del Picker genérico) · **Picker genérico = tercera categoría: deuda DECLARADA** (:18-19 "candidate commit-* events for a later sema pass" — Accept/Cancel/Clear sin contrato, reconocido; UN fix ahí repara ntp + los 5 pickers de la migración deferValue). Afinar A-3.1: leer expression/scope/header antes de flaguear; añadir el Picker genérico al universo del script.
| 5 | Tokens | ✓ | Sin duplicación de alturas; chips vía recipe |
| 6 | Sema | ✓ | Pack ✓ + eventos ricos |
| 7 | Animaciones | ✓ | Sin keyframes |
| 8 | Contrato morfo | **HALLAZGO ARIA** | **F-1**: `apg: grid` (:9) pero Provider `role='listbox'` (:73) **Y** Control `role='listbox'` (:88) **Y** Input `role='combobox'` + `aria-autocomplete='list'` + `activedescendant` (:104-113) — tres patrones mezclados, y **dos listbox anidados** (Provider⊃Control con el mismo rol) es ARIA inválida; además combobox exige popup que no existe (misma clase que search-field F-1) |
| 8 | Contrato morfo | **F-1 CERRADO 2026-08-25** | **F-1**: `apg: grid` (:9) pero Provider `role='listbox'` (:73) **Y** Control `role='listbox'` (:88) **Y** Input `role='combobox'` + `aria-autocomplete='list'` + `activedescendant` (:104-113) — tres patrones mezclados, y **dos listbox anidados** (Provider⊃Control con el mismo rol) es ARIA inválida; además combobox exige popup que no existe (misma clase que search-field F-1). **Cerrado** por la firma «el árbol ARIA de `tags-input` habla UN patrón» — ver la nota fechada bajo «Hallazgos y propuestas» |
| 9 | A11y | condicionada a F-1 | Textos remove/clear localizados ✓; activedescendant hacia item ✓ — pero el árbol de roles necesita el veredicto de F-1 antes de validar el conjunto |
| 11 | Composición interna | verificar | Types NO mencionan OR-merge con Field (a diferencia de sus hermanos) — ¿participa de Field.Provider? verificar provider en fase de fixes; si no, gap de familia |
@ -28,14 +28,48 @@
| ID | Hallazgo | Propuesta |
|---|---|---|
| **F-1** | Árbol ARIA mezclado: grid citado, listbox ×2 anidados, combobox sin popup | Sesión de patrón en fase de fixes: elegir UNO (propuesta: grid layout para la colección de pills — como su APG cita — O group+listbox único; el combobox solo si se añaden sugerencias); eliminar el rol duplicado Provider/Control |
| ~~**F-1**~~ | ~~Árbol ARIA mezclado: grid citado, listbox ×2 anidados, combobox sin popup~~ | **CERRADO 2026-08-25** — se eligió el layout grid que el `apg` ya citaba (ver nota abajo) |
| **F-2** | `validate` booleano + `onValueInvalid` divergen de la familia (validador-mensaje + `onInvalid`) | Veredicto _naming: una firma de validador (propuesta: la que devuelve mensaje, con razones tipadas como color-field) y un nombre de callback |
| **F-3** | Verbo `set-add` vs `remove` asimétrico | Revisar contra verbos del CANON en el veredicto de vocabulario |
| **F-4** | Participación en Field sin documentar (¿existe?) | Verificación dirigida; si falta, sumarlo al pass SYS-6 |
### F-1 — CERRADO el 2026-08-25
Firma «el árbol ARIA de `tags-input` habla UN patrón», estructura **B**. Se
eligió UNO: el **layout grid** que el `apg` ya citaba — porque es el patrón que
existe justamente para esto («a layout grid can be used to group a set of
interactive elements», APG), y el botón de borrar por etiqueta es un
interactivo que un `listbox` no puede alojar (`option` es *Children
Presentational: true*, y el nombre computado lo probaba: `"svelte Eliminar
etiqueta"` — el botón se había fundido con el nombre de la opción).
Las tres caras, cerradas juntas:
1. **El rol duplicado** — el Provider pierde `role='listbox'` (medido: no
contenía ninguna opción propia; las dos son hijas DIRECTAS del Control) y el
Control pasa a `role='grid'`, de UNA fila. `aria-orientation` se va con el
listbox: no es propiedad soportada de `grid`, y Chrome la ignora (medido).
2. **La etiqueta** pasa a `role='gridcell'` — que es *Children Presentational:
false*, así que el botón de borrar deja de fundirse, y que **admite
`aria-selected`**, así que el `stateRef('active')` de la firma del 2026-08-24
sobrevive sin tocarse. No necesita celda propia para el botón: APG contempla
el widget dentro de la celda.
3. **El `combobox`** deja de serlo: sus dos propiedades REQUERIDAS son
`aria-expanded` y `aria-controls`, y no llevaba ninguna porque no hay popup.
Queda un `<input type="text">` (textbox nativo) dentro de su propio
`gridcell` — un `row` no puede poseer nada que no sea una celda. Con el rol
se retiró el `aria-activedescendant`, que apuntaba a una etiqueta HERMANA
(su destino debe ser descendiente del nodo que lo lleva), y el resalte pasó
a mover foco DOM real sobre la celda: el modelo del propio grid, y el que la
`tabindex` roving de soma ya preparaba sin que nadie la usara.
privados (`row`, `input-cell`) con `display: contents` — geometría idéntica al
píxel y **0 diffs sobre 2496 valores computados**.
## Escalan al sistema
_naming (validadores ×3 firmas · onInvalid vs onValueInvalid · identidad de items por índice) · F-1 alimenta el censo de citas APG erróneas (con search-field) · SYS-5.
_naming (validadores ×3 firmas · onInvalid vs onValueInvalid · identidad de items por índice) · **F-1 CERRADO 2026-08-25** — el censo de citas APG erróneas sigue vivo con `search-field` (mismo «combobox sin popup») y ahora con `tag-group`, que declara el mismo `apg` y tiene filas SIN celdas · SYS-5.