You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
12 KiB
209 lines
12 KiB
|
2 months ago
|
# AUDIT — contradicciones docs↔código: registro de defectos (ledger)
|
||
|
|
|
||
|
|
> **Fuente única del estado de los defectos que salieron del barrido
|
||
|
|
> docs↔morfo del 2026-08-11.** Hasta hoy vivían sólo en la memoria de la
|
||
|
|
> sesión que los encontró, que es una superficie de recuerdo del agente y no
|
||
|
|
> del proyecto: un handoff que no se carga los pierde. Este fichero es la casa.
|
||
|
|
|
||
|
|
## Por qué existe este fichero
|
||
|
|
|
||
|
|
El 2026-08-11 un barrido de alta precisión sacó **101 contradicciones** entre la
|
||
|
|
documentación y el morfo. La instrucción inicial fue «borra toda la basura», y
|
||
|
|
fue corregida en el acto: *«puede ser que la documentación esté desfasada o que
|
||
|
|
el código esté obsoleto, hay que evaluar primero cuál es el caso»*. Sin esa
|
||
|
|
corrección los 101 hallazgos se habrían aplanado contra el morfo y **habría
|
||
|
|
desaparecido la única huella de nueve averías reales**.
|
||
|
|
|
||
|
|
De ahí el veredicto por sitio, con evidencia (`git log -S`, docs de decisión, el
|
||
|
|
componente vivo):
|
||
|
|
|
||
|
|
- **DOC-DESFASADA** — la documentación miente sobre código correcto → se arregla.
|
||
|
|
- **CÓDIGO-OBSOLETO** — el código miente sobre documentación correcta → **se
|
||
|
|
reporta, no se toca**. Son las filas de abajo.
|
||
|
|
- **FALSO-POSITIVO** — el script se equivocó.
|
||
|
|
|
||
|
|
⚠️ Aun con la instrucción explícita, **dos agentes borraron filas de «Gaps» que
|
||
|
|
documentaban un defecto abierto**. Repuestas a mano. La lección es la regla 3.
|
||
|
|
|
||
|
|
## Las reglas de este registro
|
||
|
|
|
||
|
|
1. **Se escribe por `id`.** `D1`…`D10` no se renumeran nunca. Un defecto que
|
||
|
|
resulta ser dos se parte en `D3a`/`D3b`, no desplaza a los siguientes.
|
||
|
|
2. **Un `ARREGLADO` lleva su commit.** Sin sha no es un arreglo, es una opinión.
|
||
|
|
3. **Una fila de gap o de known issue NUNCA es basura**, aunque cite nombres
|
||
|
|
muertos: es la huella de una avería. Borrarla es borrar el defecto, no
|
||
|
|
arreglarlo.
|
||
|
|
4. **«No lo referencia nadie» no es un veredicto.** Es una observación. Antes de
|
||
|
|
proponer retirar algo hay que abrir TODOS los hits de `docs/` que lo nombren
|
||
|
|
— `D10` nació precisamente de saltarse esto.
|
||
|
|
|
||
|
|
Estados: `CONFIRMADO` (medido, abierto) · `ARREGLADO` (con sha) ·
|
||
|
|
`PENDIENTE` (sin re-medir) · `DIFERIDO` (confirmado, disposición firmada).
|
||
|
|
|
||
|
|
## La tabla
|
||
|
|
|
||
|
|
| id | Componente | Estado | Prioridad | Una línea |
|
||
|
|
| --- | --- | --- | --- | --- |
|
||
|
|
| D1 | AlertDialog | `ARREGLADO` `f4e414e2e` | P0 | Action y Cancel cerraban sin causa: mudos |
|
||
|
|
| D2 | Splitter (eidos) | `ARREGLADO` `6f42eebfe` | P0 | regla CSS enganchada a un evento renombrado en mayo |
|
||
|
|
| D3 | 5 pickers | `ARREGLADO` `f4e414e2e` | P0 | `commit-reset` declarado y jamás disparado |
|
||
|
|
| D4 | ColorPicker | `ARREGLADO` `f4e414e2e` | P0 | swatch y eyedropper commitean en silencio |
|
||
|
|
| D5 | picker-shell | `CONFIRMADO` | P1 | `mode='modal'` promete bloquear Escape y no lo bloquea |
|
||
|
|
| D6 | date/time-field | `CONFIRMADO` | P1 | `Home`/`End`/`PageUp`/`PageDown` documentados en 4 sitios, nunca construidos |
|
||
|
|
| D7 | date/time-field | `CONFIRMADO` | P1 | el Label renderiza `<div>` y el morfo declara `label` |
|
||
|
|
| D8 | context-menu | `CONFIRMADO` | P2 | `defaultElement` falso en `arrow` — posible deuda sistémica |
|
||
|
|
| D9 | chronos | `CONFIRMADO` | P2 | el morfo declara `handle-drag` y `handle-resize`; nadie los dispara |
|
||
|
|
| D10 | sema ↔ `$sound` | `CONFIRMADO` | P1 | los 3 resolvers de gesto: migración a medias del 2026-08-06 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Fichas
|
||
|
|
|
||
|
|
### D1 · AlertDialog mudo — `ARREGLADO` (`f4e414e2e`)
|
||
|
|
|
||
|
|
Action y Cancel llamaban `dialog.handleClose()`, que sólo voltea `open`: nunca
|
||
|
|
pasaban por `dismissWith` ni disparaban `emerge-close`. Medido: sólo sellaba
|
||
|
|
`contact-activate`. Escape sí funcionaba, así que **el teclado tenía firma y los
|
||
|
|
botones no**.
|
||
|
|
|
||
|
|
Arreglo: Action llama `dismissWith('save', { intent })` y Cancel
|
||
|
|
`dismissWith('cancel')`. `dismissWith` gana un `opts.intent` porque la causa es
|
||
|
|
vocabulario cerrado pero el PESO es por instancia — el mismo eje por el que
|
||
|
|
`emerge-open` liga con `fromProp`. Medido: Action → commit/risk/saved, Cancel →
|
||
|
|
emerge/cancelled.
|
||
|
|
|
||
|
|
### D2 · Regla CSS muerta del splitter — `ARREGLADO` (`6f42eebfe`)
|
||
|
|
|
||
|
|
`splitter.css` enganchaba `data-event='commit-resize'`, evento renombrado a
|
||
|
|
`commit-set` en `bd2e40366` (2026-05-22). No se arreglaba renombrando: el
|
||
|
|
`commit-set` de hoy apunta al `provider`, no al trigger.
|
||
|
|
|
||
|
|
Arreglo: la regla engancha por familia sobre el provider
|
||
|
|
(`[data-event-family='commit'][data-event-phase='active']`) y pinta el trigger
|
||
|
|
con **selector descendente**, más un opt-out del anillo global de commit. La
|
||
|
|
firma que pinta otro nodo es un selector descendente — no una razón para mover
|
||
|
|
el sello (doctrina en `docs/architecture/eidos.md` §«descendant-selector
|
||
|
|
corollary»).
|
||
|
|
|
||
|
|
### D3 · `commit-reset` mudo en 5 pickers — `ARREGLADO` (`f4e414e2e`)
|
||
|
|
|
||
|
|
Declarado en date / time / date-range / time-range / color y jamás disparado:
|
||
|
|
`clear()` sólo asignaba.
|
||
|
|
|
||
|
|
Al arreglarlo salió **una segunda avería debajo**: date-picker y
|
||
|
|
date-range-picker apuntaban `commit-reset` a la parte `calendar`, que nadie
|
||
|
|
registra en el runtime — destino inalcanzable, emit rechazado en silencio.
|
||
|
|
Retargeteados al `provider`.
|
||
|
|
|
||
|
|
⚠️ **Una parte declarada sin registro en runtime es un destino inalcanzable, y
|
||
|
|
no chilla.** Vale para todo el catálogo, no sólo para estos dos.
|
||
|
|
|
||
|
|
### D4 · ColorPicker commitea en silencio — `ARREGLADO` (`f4e414e2e`)
|
||
|
|
|
||
|
|
Swatch y eyedropper aplican el color sin disparar nada, pese a que el morfo **y**
|
||
|
|
el pack de sema declaran que disparan `commit-set`.
|
||
|
|
|
||
|
|
### D5 · `mode='modal'` no bloquea Escape — `CONFIRMADO` · P1
|
||
|
|
|
||
|
|
Dos sitios lo prometen:
|
||
|
|
[`picker-shell-handle.svelte.ts:32`](../../src/uix/soma/components/picker-shell/picker-shell-handle.svelte.ts)
|
||
|
|
(*«`modal` blocks outside-click + Escape»*) y el comentario de
|
||
|
|
[`date-picker.svelte:164`](../../src/uix/soma/components/date-picker/components/date-picker.svelte).
|
||
|
|
El Popover resuelve `escapeKeydownBehavior` a `'close'` por defecto
|
||
|
|
([`popover-provider.svelte.ts:555`](../../src/uix/soma/components/popover/popover-provider.svelte.ts))
|
||
|
|
y **`modal` no lo alimenta**: sólo gobierna outside-click, hover y
|
||
|
|
trapFocus/preventScroll.
|
||
|
|
|
||
|
|
**Y hay un defecto más hondo debajo.**
|
||
|
|
[`date-picker/types.ts:73`](../../src/uix/soma/components/date-picker/types.ts)
|
||
|
|
promete que en `modal` *«selection edits a buffer… Cancel reverts to the value
|
||
|
|
the popover opened with»*. **No hay buffer.** Así que Escape no sólo cierra: se
|
||
|
|
lleva la edición puesta mientras sella una dismissal. Arreglar sólo el Escape
|
||
|
|
dejaría la promesa del buffer igual de rota.
|
||
|
|
|
||
|
|
### D6 · Teclas de página en date/time-field — `CONFIRMADO` · P1
|
||
|
|
|
||
|
|
`Home` / `End` / `PageUp` / `PageDown` están documentados en cuatro sitios y no
|
||
|
|
existen en el código. Peor: **las tres páginas se contradicen** sobre qué harían
|
||
|
|
(saltar de segmento, saltar al extremo del rango, o paginar el valor). No es
|
||
|
|
sólo una funcionalidad que falta: es una decisión que nadie tomó.
|
||
|
|
|
||
|
|
### D7 · El Label de date/time-field — `CONFIRMADO` · P1
|
||
|
|
|
||
|
|
[`date-field-label.svelte:32`](../../src/uix/soma/components/date-field/components/date-field-label.svelte)
|
||
|
|
renderiza `<div>`; el morfo declara `defaultElement: 'label'`
|
||
|
|
([`morfo/components/date-field.ts:145`](../../src/uix/morfo/components/date-field.ts)).
|
||
|
|
Y la doc promete un par `for`/`id` que nadie emite. Un `<div>` no asocia: el
|
||
|
|
campo se queda sin nombre accesible por esta vía.
|
||
|
|
|
||
|
|
### D8 · `defaultElement` falso en context-menu — `CONFIRMADO` · P2
|
||
|
|
|
||
|
|
[`morfo/components/context-menu.ts:345`](../../src/uix/morfo/components/context-menu.ts)
|
||
|
|
declara `defaultElement: 'div'` para `arrow`, y lo renderizado es
|
||
|
|
`<span>`/`<svg>`. Sospecha de **deuda sistémica en todos los `arrow`** del
|
||
|
|
catálogo — no verificada; verificarla es parte de cerrar esta fila.
|
||
|
|
|
||
|
|
### D9 · Eventos de chronos sin emisor — `CONFIRMADO` · P2
|
||
|
|
|
||
|
|
El morfo de chronos declara `handle-drag`
|
||
|
|
([`chronos.ts:131`](../../src/uix/morfo/components/chronos.ts)) y `handle-resize`
|
||
|
|
(:141), y **ningún provider los dispara**: el barrido de `trigger(` en
|
||
|
|
`soma/components/chronos/` da `shift-navigate`, `commit-restore`, `commit-apply`
|
||
|
|
y el trío `commit-save`/`commit-move`/`commit-delete` de `emitOnChip`. El
|
||
|
|
arrastre y el redimensionado emiten su `commit-move`, nunca la familia `handle`
|
||
|
|
que declaran. Ya declarado como S-37 en el README de chronos.
|
||
|
|
|
||
|
|
⚠️ Corrección de método, 2026-08-12: la primera lectura de esta fila dio «los
|
||
|
|
tres `commit-*` tampoco se disparan». Era falsa — se despachan **por variable**
|
||
|
|
en `emitOnChip` (`chronos-provider.svelte.ts:1240`), invisible a un grep de
|
||
|
|
`trigger('literal')`.
|
||
|
|
|
||
|
|
### D10 · Los 3 resolvers de gesto: migración a medias — `CONFIRMADO` · P1
|
||
|
|
|
||
|
|
El 2026-08-06 se reescribió `dragSignalOverrides` (slider y splitter) a
|
||
|
|
`sound: 'step'` — el gesto pasa a sonar por REPETICIÓN — y eso dejó
|
||
|
|
`resolveHandleDragSound` / `resolveSliderDragSound` / `resolveSplitterDragSound`
|
||
|
|
sin un solo llamador. **No se adjudicó ninguno de los cinco sitios que los
|
||
|
|
describen como vigentes:**
|
||
|
|
|
||
|
|
| Sitio | Qué afirma |
|
||
|
|
| --- | --- |
|
||
|
|
| [`splitter-provider.svelte.ts:435`](../../src/uix/soma/components/splitter/splitter-provider.svelte.ts) | «Pitch/centroid/gain come from… `resolveSplitterDragSound`» — y `dragSignalOverrides`, 30 líneas más abajo **en el mismo fichero**, dice que eso se sustituyó |
|
||
|
|
| [`sema/components/splitter.ts:15`](../../src/uix/sema/components/splitter.ts) | medio cierto: soma **sí** calcula overrides por emisión, pero no por ese resolver, y «la curva dinámica sobrevive» ya sólo vale para el háptico |
|
||
|
|
| [`PLAN-sound-engine.md:95`](./PLAN-sound-engine.md) | §4, los tres en la columna **«sema conserva»** de la LÍNEA DE CORTE |
|
||
|
|
| [`PLAN-audio-player.md:367`](./PLAN-audio-player.md) | D-AP.7, **✅ CONFIRMADO**: el slider adjunta el resolver en cada `handle-drag` |
|
||
|
|
| [`AUDIT-sema-2026-08-05.md`](./AUDIT-sema-2026-08-05.md) hallazgo 7 | la regla del pack del slider está muda **a propósito** porque las primitivas vienen del resolver — razón hoy sin base |
|
||
|
|
|
||
|
|
El slider **no** arrastra el comentario rancio: el suyo describe bien la
|
||
|
|
sustitución. La contradicción interna es sólo del splitter.
|
||
|
|
|
||
|
|
**Decisión abierta del autor:** ¿se retiran los resolvers de gesto, o se
|
||
|
|
recablean? La tabla de corte de `PLAN-sound-engine.md` §4 hay que actualizarla
|
||
|
|
en los dos casos. Nada se toca hasta entonces: reescribir los comentarios para
|
||
|
|
decir «se sustituyó» contesta la pregunta y borra la huella (regla 3).
|
||
|
|
|
||
|
|
**Cuelga de esta decisión** el homónimo `SoundContour`: el 2026-08-11 se renombró
|
||
|
|
`SoundDirection` → `SoundContour` en
|
||
|
|
[`sema/sounds.ts:34`](../../src/uix/sema/sounds.ts) sin mirar que
|
||
|
|
[`arts/sound/types.ts:44`](../../src/arts/sound/types.ts) ya exportaba ese nombre
|
||
|
|
con cinco valores en vez de dos. Cinco sitios a tocar; el nombre no puede volver
|
||
|
|
a `SoundDirection` (el rename se hizo porque tres cosas distintas se llamaban
|
||
|
|
`direction`). Propuesto: `GestureContour`, que es la palabra que usa la propia
|
||
|
|
tabla de corte («los 3 resolvedores de **gesto**»). Si los resolvers se retiran,
|
||
|
|
el tipo se va con ellos y no hay nada que renombrar.
|
||
|
|
|
||
|
|
⚠️ Esta fila nació de un error de método: se propuso **retirar** los tres
|
||
|
|
resolvers por «cero llamadores», con dos de esos cinco sitios en la salida del
|
||
|
|
propio grep y sin abrirlos. «No lo referencia nadie» es una observación, nunca
|
||
|
|
un veredicto (regla 4).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Cola menor · comentarios fósiles
|
||
|
|
|
||
|
|
~11 comentarios en código que citan nombres muertos, sin defecto de
|
||
|
|
comportamiento detrás: color-picker, combobox, nav-tree («stays sema-free» con
|
||
|
|
dos eventos `emerge` declarados) y aura, que cita el patrón
|
||
|
|
`close-save`/`close-cancel` que Dialog ya no usa. Sin `id` propio: se limpian
|
||
|
|
cuando se toque el fichero por otra razón.
|