@ -1,33 +1,68 @@
# CONTINUE — la superficie perceptual es UNA RANURA
> **Kickoff** : _«Lee `docs/process/CONTINUE-perceptual-surface.md` y sigue por §3.0.»_
> **Fecha** : 2026-08-10, actualizado 2026-08-11 · Rama `alpha-0.1-dir-prefs`
> (COMPARTIDA — otra sesión trabaja en `blocks` ; `git reset -q` + add sólo lo
> propio, siempre).
> **Kickoff** : _«Lee `docs/process/CONTINUE-perceptual-surface.md` y sigue por §0.»_
> **Fecha** : 2026-08-10, actualizado 2026-08-11 (cierre) · Rama
> `alpha-0.1-dir-prefs` , pusheada en `61457baac` .
> ⚠️ **COMPARTIDA** : otra sesión trabaja en `blocks` **y** en un eje de
> dismissal. `git reset -q` + stagear por lista explícita, y clasificar **por
> contenido del diff, nunca por nombre** — hoy un fichero de proceso estaba
> mixto (133 líneas, 3 mías).
> **Doctrina viva** : [`architecture/sema.md` §The surface is ONE SLOT ](../architecture/sema.md )
> y [`architecture/morfo.md` §`renderAttrs` ](../architecture/morfo.md ).
> · [`architecture/morfo.md` §Step 4 ](../architecture/morfo.md ) (las DOS clases
> de precedencia de attrs: contract vs naming) · [`§renderAttrs` ](../architecture/morfo.md ).
> Este documento sólo dice **qué se cerró, qué queda y cómo medirlo** .
## 0 · Dónde estás (2026-08-11)
## 0 · Dónde estás (2026-08-11, cierre de jornada )
Seis commits sobre `56a96114f` , ninguno tocando la rama de `blocks` :
**PUSHEADO a `gita/alpha-0.1-dir-prefs` en `61457baac` ** — la rama está limpia
contra el remoto (0 por delante). Cuatro commits de la jornada del nombrado:
| Commit | Qué |
| --- | --- |
| `968fff9cd` | chronos deja de tener partes que el morfo no conoce (C3 + C4) |
| `a542f9f10` | chronos abre su estructura (C5 r1: namespace + toolbar) |
| `fc3a9c0e5` | el editor sube a la raíz (C5 r2: overlays) |
| `b7f889957` | una ocurrencia recurrente deja de fingir que se arrastra |
| `56d7f744e` | retirado el defecto del `data-event-id` — no reproducía |
| *(este)* | documentación del framework al día |
| `37c732c3a` | el guard de traducciones deja de cascar **y de ser ciego** a los call sites |
| `25e59e18f` | A-85: el attr de nombrado es un DEFAULT del contrato, no una imposición |
| `b201f190d` | la consecuencia: espejos, button, las 21 cadenas, cross-element, gemelos |
| `61457baac` | el handoff dice lo que pasó (dos diagnósticos heredados eran falsos) |
⚠️ **Rama compartida, y hoy se notó** : otra sesión trabaja en `blocks` **y** en
un eje de dismissal (los `types.ts` de color-picker / time-picker /
time-range-picker). Clasificar **por contenido del diff** , nunca por nombre:
`AUDIT-blocks-ledger.md` estaba MIXTO (133 líneas, 3 mías) y quedó entero
fuera. **Mis filas de A-85 en ese ledger siguen SIN COMMITEAR** — cuando esa
sesión lo commitee, irán en su commit; no hay que rehacerlas.
### El eje del nombrado: qué queda, y por qué
Sólo **UNA** cadena pendiente es mecánica: ** `alert-dialog` **
(`opts.ariaLabel || ALERT_DIALOG_LANGS.ACTION`, clase 1 + su `cancel` ).
Se excluyó a propósito porque la otra sesión editaba ese fichero durante el
barrido; su D1 ya está commiteado, así que **hoy está libre** . Receta idéntica
a la de los 21: `morfo.md` Step 4.
Las otras 10 cadenas **no son deuda** — están medidas y clasificadas:
`clipboard` · `password-field` (toggle) · `table` (row-detail) · `tree-grid`
(expand) están BLOQUEADAS por estado; `tag-group` (remove) por interpolación;
`waveform` es correcta (su nombre lo lleva un `<Slider>` compuesto);
`progress` · `radio-group` · `rating-group` · `slider` conservan sólo la
supresión por labelledby sobre un prop sin default.
> **DECISIÓN TOMADA (2026-08-11): NO se ensancha `mapRef`.** Traducir su salida
> desbloquearía sólo la clase ESTADO —ni las interpoladas ni las
> cross-element— y reintroduce la avería que esta jornada mató: el guard v2
> **no recorre los valores del mapa** , y `normalizeTranslationRef` tampoco los
> tocaría, así que una clave relativa llegaría cruda a `ts()` y saldría literal.
> Si algún día se hace, la forma correcta NO es traducir la salida sino que los
> valores del mapa sean **fuentes** (composicional, sin magia de prefijo, y el
> guard los ve por la vía que ya tiene).
**Lo siguiente, en orden:**
1. **Dos decisiones del autor** (§4): el defecto de `fixedWeeks` y cómo pintar
1. ** `alert-dialog` ** — la única cadena mecánica que queda (30 min).
2. **Dos decisiones del autor** (§4): el defecto de `fixedWeeks` y cómo pintar
un chip bloqueado. Ninguna necesita código hasta que decidas.
2. **C5 rebanada 3** , y empieza por **subir a soma el comportamiento del chip**
3 . **C5 rebanada 3** , y empieza por **subir a soma el comportamiento del chip**
— la tabla de §C5-r3 explica por qué no es mecánica.
3. ~~**Arreglar `npm run translations:check` ** (casca) y censar los 166 morfos.~~
4 . ~~**Arreglar `npm run translations:check` ** (casca) y censar los 166 morfos.~~
**HECHO 2026-08-11** — y el diagnóstico era doblemente falso: el crash no era
una «url multilínea» sino el stripper de comentarios comiéndose el `//` de un
`https://` DENTRO de una cadena; y el guard, incluso sano, **jamás escaneó los
@ -40,13 +75,39 @@ Seis commits sobre `56a96114f`, ninguno tocando la rama de `blocks`:
colisiones hoja↔rama `status` /`placeholder` resueltas a `status.label` /
`placeholder.default` y descripciones slash en clave plana `-d` ). Detalle:
caja ⚠️ de `morfo.md` §common-mistakes.
4. El resto del eje: §3.2 restitución de persistentes · §3.3 eje B · §3.4 cola
de sema · §3.5 fable · §3.6 ledger de blocks.
5. El resto del eje: **F3** (censo `targetOverride` **89 → 83** hoy, de rebote;
la cola vive en §3.0) · **F5** navegador (site-header 375px · knob ·
dropdown+Button) · §3.2 restitución de persistentes · §3.3 eje B · §3.4 cola
de sema · §3.5 fable · §3.6 ledger de blocks (`A-47`, `A-69` ).
**Deuda menor, medida y sin urgencia** (no la re-descubras):
- **10 de 17 harnesses tienen un `ts` que IGNORA su clave** — una clave errónea
*pero existente* pasaría su aserción del bag. Lo tapa parcialmente
`translations:check` (caza las inexistentes) y hoy se verificó a mano que no
hay deriva. Cerrarlo es `expect(ts).toHaveBeenCalledWith(ref)` , decidido una
vez para todos.
- **14 `langs.ts` sin consumidores** (meter, popover, drawer, splitter, listbox,
breadcrumb, anchor-nav, cropper, feed, grid-list, pin-input, progress,
editable, carousel). Basura declarada. **NO borrar sin instrucción explícita.**
- **12 avisos de huérfanos** en `translations:check` (los `tab-*` de
gradient-builder/picker y 8 de palabras): candidatos a borrar, decisión tuya.
- `range-calendar/langs.ts` conserva `PREV_MONTH` /`NEXT_MONTH` muertas
**PREEXISTENTES** — no las tocó este pase.
**Documentación ya actualizada** (no hace falta re-hacerla): `morfo.md`
§common-mistakes (la trampa de `texts` ) · README de soma/chronos (partes,
permisos, búsqueda) · README de eidos/chronos (§Composición, gaps) ·
`CONTINUE.md` de chronos (marcado como NO vigente, apuntando aquí).
§Step 4 (las dos clases de precedencia, el anti-patrón del `propRef` + cadena,
la tabla de las cuatro exclusiones, el spread condicional y la regla «mira si el
elemento es tuyo») · `morfo.md` §common-mistakes (la trampa de `texts` + el
guard v2) · `soma-architecture.md` §mergeProps (la fila de naming) · README de
soma/chronos · README de eidos/chronos · `CONTINUE.md` de chronos (NO vigente,
apunta aquí).
**Línea base al cerrar** (mídete contra esto, no contra memoria): `check`
**70 = base** con el WIP ajeno presente, **57** sin él — mis commits aportan
CERO · soma **1269 ✓ / 1** (el timeout ajeno preexistente de
`soma-attr-audit` ) · morfo+sema **496 ✓** · `translations:check` **0 errores /
12 avisos** · `docs:check` 0/621 · `rtl:check` 0/177 · refs compilados **157** .
---