@ -1774,7 +1774,14 @@ Lo que `chart` destapó (2026-08-22):
(`theming-sentinel.ts:214-221`: `openBy: 'focus'` , `openWith` ) y la sonda
no. Dos arreglos, y conviene hacer los dos: copiar la puerta, y que el
`catch` **avise** en vez de tragar (un pase perdido en silencio es un 0/N
que nadie investiga).
que nadie investiga). **EJECUTADO 2026-08-25 («la mitad gratis»)** : la
sonda importa `COMPONENT_OVERRIDES` del centinela (exportada con guarda
de entrypoint — con `realpathSync` , o el guard muere a través de un
junction) y habla su vocabulario entero (`prepareWith` / `openBy` /
`openWith` / `openMarker` ); el `catch` AVISA por stderr distinguiendo «no
hay trigger» de «el gesto falló». `editable` registra ya bloque `open`
(25 filas, 6 con `data-editing` ; dos corridas sobre código idéntico = 0
diffs) y `card` sigue a 0 diffs en sus 7 bloques pre-firma.
2. **La sonda no tiene análogo del barrido de variantes.** `DEMO_VARIANTS`
(`:139-202`, **10 claves** : avatar, audio-player, text-gradient, badge,
image-picker, search-field, chat-composer, chat-message, chat-typing, toast)
@ -1794,6 +1801,37 @@ Lo que `chart` destapó (2026-08-22):
`orange` (risk), `red` (threat) y `plum` (loss). Para barridos futuros: usar
una escala sonda de las **24 libres** (`fuchsia`, `steel` , `sand` … ) y NO
`plum` , que a primera vista parece neutra y es el rol `loss` .
**EJECUTADO 2026-08-25** : `PROBE_ROLE_BOUND_SCALES` (las 9 → su rol) +
`PROBE_SAFE_SCALES` (las 24) + `assertProbeSafeScale()` en la sonda, con
la discrepancia `risk: amber` (config-types) vs `orange` (tema base)
documentada en el comentario. Guardia sin usos inventados: hoy nada en la
sonda estampa una escala; las 33 verificadas contra `PALETTE_SCALES`
(`lib/types.ts:232-270`), 0 sobras, 0 faltas.
- **Lo que «la mitad gratis» añadió a la sonda, y lo que abrió (2026-08-25).**
Ganó el pase de **FOCO** que la cabecera prometía desde siempre sin que nada
llamara a `.focus()` (recarga propia — el bucle de hover deja el puntero
aparcado y una regla `:hover` pesa más; mide foco PROGRAMÁTICO, `:focus` ,
nunca mezclado con gestos), un pase ** `disabled` ** como bloque APARTE y
ÚLTIMO de la corrida (la trampa «montar más mide menos»: la regla de
file-upload apaga `pointer-events` del subárbol), y ** `UIX_DEV_URL` ** en
sonda y centinela (adiós el `:5173` clavado; el argumento explícito sigue
ganando). Deudas nuevas, medidas por la verificación adversarial de la
firma: (i) ** `search-field` pierde `[data-search-field-clear-trigger]` en el
pase `open` ** — la guarda «`prepareWith` sólo corre sin fila en
`DEMO_VARIANTS` » lo salta (su fila sólo clica el chip de loading) y el
centinela documenta que el ORDEN importa (el clear ha de venir ANTES);
cobertura, no regresión — antes la sonda no corría `prepareWith` en
absoluto. (ii) En los seis con `prepareWith` y sin fila (`editable`,
`rating-group` , `toolbar` , `form` , `progress` , `background` ) el bloque
`open` monta capas que `rest` /`size`/`hover`/`focus`/`disabled` no ven —
comparar bloques entre sí no es comparar lo mismo. (iii) La sonda no tiene
el cortocircuito `alreadyOpen` del centinela y, tras un `openMarker`
fallido, prueba el siguiente opener sobre página ya ensuciada (no se
manifestó en lo corrido). Y un dato para la GRANDE: el no-determinismo de
`chat-message` quedó ACOTADO al bloque `rest` de la sonda (13 vs 16 nodos —
los chips de `DEMO_VARIANTS` sin cuajar al medir; `size/open/hover/focus/
disabled` dan 16/24/11/11/16 con 0 diffs), coherente con el `prepareWith`
mudo del guard que la ceguera 6 arregla.
- **Montar MÁS capas puede medir MENOS** (medido 2026-08-23 en `background` ).
Al enseñar al guard a encender las capas opt-in del componente, añadir el foco
puntual, la velocidad de paralaje y la profundidad hizo BAJAR la corrida de 17
@ -2178,7 +2216,21 @@ Lo que ABRE la firma «el árbol ARIA de `tags-input` habla UN patrón» (2026-0
bloqueo, y hoy sin urgencia (el censo `--names` da 0 desviadas, así que no
queda cola para el codemod); pero si vuelve a haber cola, esto se arregla
ANTES — son unas líneas, con el mismo dedentado que censo y centinela ya
tienen.
tienen. **EJECUTADA 2026-08-25 (firma «la mitad gratis»)** : `blocks()`
devuelve `{name, at, end, depth}` con offsets REALES del fichero (dedentar
virtualmente rompería el pase A, que edita por rango); la IIFE acota su
región al `return {` …`};` con `depth: 3` y una guarda que LANZA si no lo
encuentra. Los muros 2-3 leen por fin las **97** claves de avatar (86
públicas + 11 privadas — el codemod ve las privadas a propósito) y el pase A
renombra a `\t{depth}` : verificado en laboratorio sobre copias (duplicado
inyectado a 3 tabs DETECTADO, renombrado de una clave de avatar = 1 línea, y
la frontera `-hover` intacta). La vía de carga **SE QUEDA en tsx** : la
premisa «el censo corre con node pelado» era falsa — `theming-census`
importa `../src/uix/morfo/compile` SIN extensión y todo `src/uix/morfo` está
escrito así; alinear la vía es un barrido de `src/` , no del codemod. Queda
vivo el riesgo hermano: **TRES lectores independientes** de la estructura de
`base.ts` (este codemod, `theming-census.ts recipeBlock()` y el centinela) —
la próxima forma nueva de bloque habrá que enseñarla tres veces.
- **El centinela elige el VALOR de sonda por el NOMBRE de la clave, y D-TH.6
fabrica nombres que ese chequeo no reconoce** (hallazgo propio del ejecutor
E-avatar, 2026-08-25). `sentinelFor()` (`theming-sentinel.ts:692`) es una