# LRU_TECH_DEBT · deuda técnica viva

> Fichero: `LRU_TECH_DEBT_VIVO.md` · documento vivo sin sufijo de sesión · inaugurado en s204 (D-s204-E)
> Régimen: se **reescribe al cierre** de cada sesión (items nuevos entran · items cerrados **salen** — el histórico de cada item vive en el git de este fichero, no en tachados acumulados). Sustituye la cadena `LRU_TECH_DEBT_s{N}.md`, congelada en `LRU_TECH_DEBT_s203.md` (último eslabón · la cadena queda como archivo de consulta).
> Vive **solo en disco** (no se sube al Project · D-s204-F) · Claude lo lee vía MCP al arrancar.
> Reescrito al cierre de s251. **Sale TD-s250-1** (botón GPIO27 resuelto: era el pull-down por defecto — con `pull_up` flancos limpios en banco). **Alta TD-s251-1** (truncación del JSON de SensorsCfg). Notas s251 en TD-s235-1 (Bc3 materializada, banco parcial en verde — lo restante es lo único que gatea la flota), TD-s234-1, TD-s246-2 y TD-s224-1 (las perillas del clásico nacen igual).

---

## TD-s251-1 · El JSON de SensorsCfg se trunca al componer to_json (baja · diagnóstico · dispara al consultar what=all)

Visto repetido en los logs de banco s251: `[SensorsCfg] to_json: truncación en sensor 'adc2' — aumentar SENSORS_CFG_JSON_BUF_SIZE`. La respuesta de `to/query what=all` viaja incompleta (la cola de sensores no entra en el buffer). Cura obvia: subir `SENSORS_CFG_JSON_BUF_SIZE` (sensors_cfg.c) o trocear la respuesta. No bloquea nada del plano de rescate; ensucia la consulta de configuración.

## TD-s248-1 · La S3 no tiene log de dispositivo consultable: el Minilog nunca funcionó en esa familia (media · diseño+firmware · candidata a sesión propia)

Hallazgo del banco s248: `TabActlog` habla `to/actlog → from/actlog` (contrato clásico rpc1cl s218) y el dispatcher de la S3 no tiene el método → timeout garantizado desde siempre. Cura s248 en PWA: `useHwActlog(id, enabled)` + rama `s3_` en TabActlog con aviso honesto (sin consulta condenada). Lo pendiente es la pieza real, con la articulación de Manuel como motivación: **el log en el dispositivo vale porque está descentralizado y es recuperable cuando hay que seguir un problema o bug**. Vocación forense, patrón otalog: anillo estructurado en NVS (sobrevive reboots/OTAs), decidir qué eventos entran (órdenes Act con port/val/seq/actor · ¿transiciones WiFi/broker? · ¿resets con causa?), método del dispatcher (`Actlog.Get`) y consumo en TabActlog. Camino incremental aceptable: exponer primero el anillo existente `lru_cmd_log` de la tile RPC (`CmdLog.Get`, texto, RAM) y evolucionar a NVS. Implica bump de firmware — coordinar con el banco P1-P6 (TD-s246-1) para no ensuciar la 0.246.3 validada. Hermana de TD-s245-1 (la PWA hablando el idioma de cada familia).

## TD-s247-2 · IS_TOUCH/ARR_V/ARR_H viven en hw1Shared (baja · higiene · dispara al aplicar los patrones fuera de Hw1)

La detección táctil y la geometría de flechas son transversales pero nacieron en `hw1Shared.tsx`. Al llevar los patrones a otra página, promoverlas a un módulo neutro (p.ej. `src/hooks/touch.ts`) y que hw1Shared re-exporte — no importar del panel Hw1 desde páginas ajenas. **Nota s248**: el banco-móvil pasó (TD-s247-1 cerrada) → la réplica está desbloqueada y esta TD es su primer paso. Candidatos nuevos al catálogo de patrones cuando se repitan: grid auto-fill de tarjetas y orden-cíclico+búsqueda (s248). **Nota s250**: la utilidad clave de rescate nació respetando el patrón — lógica en `src/utils/` (qrMini + rescueKey, neutros sin React ni imports del panel), solo la cara React vive en Hw1AdminPanel.

## TD-s246-1 · Banco P1-P6 del plano de rescate S3 pendiente (media · verificación · frente diferido en s247)

El frente B está COMPLETO en fuente (B1 s245 · B2/B3 s246, firmware 0.246.3) pero solo B1 y B2-vía-(a) tienen banco. El guion completo con logs esperados y criterios ✔ vive en `lru_rescate_referencia_operativa_s246.md` §6: **P1** vía (b) (flasheo en rescate real + Confirmar) · **P2** rollback provocado (5 min sin confirmar) · **P3** péndulo cronometrado (perillas 1/2/1/1) · **P4** inhibiciones (user_off, AP manual, Ap.Off externo) · **P5** bug B1 curado (el AP sobrevive al connect desde el portal) · **P6** radiografía (hwm de ap_dns 3072 · httpd 8192 · ap_vig 4096 → recortar con dato). ~40 min de banco. Anotar resultados en el destilado §6 + ESTADO. Absorbe TD-s245-4. **Nota s247 — banco parcial ejecutado antes de diferir**: flasheo por portal con broker vivo → `rescue_pending` re-levantó el AP al boot ✔ → `valid via broker` a los 20 s ✔ → otalog v2 con hora ✔. Lo que P1 quiere (router muerto · `valid via portal`) sigue sin ejercitar. El bin ya quedó en el móvil. **Nota s249**: la rebanada S3 de D-s249-F implica bump S3 — coordinarla con este banco para no ensuciar la 0.246.3 hasta tener P1-P6 en verde. **Nota s251**: el clásico ya ejercitó en banco varios de estos mismos caminos (flasheo local, rescate automático) — el guion P1-P6 de la S3 puede aprovechar la experiencia y las perillas rápidas.

## TD-s246-2 · Las perillas del vigilante no persisten (baja · decisión pendiente · dispara si el banco P3 la pide)

`rescueN/T/M/H` viven en RAM: un reboot devuelve 5/10/3/2. Para el banco es incluso cómodo (P2 lo explota), pero si algún despliegue real quiere perillas afinadas habrá que persistirlas (NVS, patrón cfg) — y entonces `Cfg.Get` (TD-s245-1) gana otro motivo para existir (leerlas). Decisión de Manuel cuando muerda. **Nota s251**: el vigilante clásico (Bc3, 0.251.2) nace con la misma semántica a propósito — paridad de familias; si se decide persistir, decidirlo para las dos a la vez.

## TD-s245-1 · La barra Consulta de la PWA no habla con la S3 (media-baja · articulacion Manuel s245 · dispara con Cfg.Get/Caps.Get)

(Íntegro s245.) La evolucion correcta NO es replicar from/query sino que la barra hable el idioma de cada familia: clasico por to/query; S3 por el dispatcher (`all`/`cfg` → `Status.Get` ya posible; `hysts`/`ranges` esperan `Cfg.Get`/`Caps.Get`). Frase de Manuel: **«la barra vuelve a la S3 con la misma cara y mejor fontanería»**. **Nota s246**: `Cfg.Get` gana dos consumidores mas — leer las perillas rescue (TD-s246-2) y confirmar cfg desde el portal. **Nota s248**: hermana nueva TD-s248-1 — el Minilog era otro caso de la PWA hablando clásico a la S3.

## TD-s245-2 · El popup del portal cautivo es movil-dependiente (baja · documentado · sin disparador)

(Íntegro s245.) Mecanismo completo montado en la S3 (DHCP OFFER_DNS + mini-DNS + catch-all 302 + capport 114); el movil del banco ni sondea http ni habla RFC 8910 → QRs como cura universal. **Nota s251**: el clásico NO invierte (D del diseño §4) — catch-all 302 + capport sí (gratis en portal1.c), mini-DNS no; QRs de la utilidad PWA cubren.

## TD-s245-3 · mcp-server-git fijado a SDK mcp<2 (baja · regla operativa · dispara si mcp-server-git se actualiza)

(Íntegro s245.) Pin `--with "mcp<2"` + ruta absoluta de uvx en TODAS las instancias. Revisar cuando mcp-server-git soporte SDK 2.x. **Nota s249**: tercera instancia gemela `git-cl` → rpc1cl añadida y validada; quedan `rpc1`/`blink1` cuando se versionen.

## TD-s244-1 · El tactil remoto es click puro: sin arrastre ni long-press (baja · UX · sin disparador)

(Íntegro s245, con su nota: la pagina del portal hereda el limite — asumido en el diseño §5.) **Nota s247**: TabPantalla gana mapeo correcto con letterbox; el límite click-puro sigue.

## TD-s243-1 · Leak de ~0,7 KB por ciclo ON/OFF del BLE (baja · documentado · sin disparador hasta uso intensivo de ciclos)

(Íntegro s244.)

## TD-s243-2 · La pestana TRAFICO se borra al cambiar de pestana (baja · UX · P11)

(Íntegro s244.)

## TD-s242-1 · Prueba de banco del audio dormido pendiente (baja · verificacion · dispara al pasar por la tile System)

(Íntegro s244.) La tile System es operable tambien desde el portal de rescate — el banco puede hacerse sin tocar la placa, salvo la escucha.

## TD-s241-2 · Redundancia y seguridad de OTA incompletas (media · objetivo articulado s241 · dispara al endurecer la entrega de firmware)

(Íntegro s245 en lo estructural: matriz en `LRU_FIRMWARE_PUBLICACION_VIVO.md`; faltan 2º destino de deploy, http-sin-redirect en boxdin.com, cert TLS en la caja ddns; OTA sin firmar, BLE sin pairing, :80 sin auth.) **Nota s246**: el anillo 2 S3 esta COMPLETO en fuente; el HTTPS limpio en boxdin.com y la firma de imagenes siguen siendo los siguientes escalones. **Nota s251**: el clásico suma su `POST /ota` por LAN sin credenciales (mismo criterio que la S3: rescate + aula, acotado por slot hermano + rollback + confirmación; el intencionado es el hilo seguridad de siempre).

## TD-s238-1 · Cámara y BLE no coexisten en la DRAM interna de la S3 (media · dispara al querer recuperar la cámara junto a BLE)

(Íntegro s244/s245.)

## TD-s236-1 · La PoC BLE y el protocolo mOS-RPC-GATT no se han validado nunca contra una placa CLÁSICA (media-baja · dispara ANTES de escribir el cliente PWA definitivo)

(Íntegro s244.)

## TD-s235-1 · Rotación multi-red y NET_WDT sin validar en placa (media · **la cura está materializada — queda su banco** · gatea la OTA de flota)

**Nota s251 — Bc3 MATERIALIZADA y banco parcial en verde**: el vigilante-péndulo clásico existe (0.251.2) y el banco de estreno validó el camino estrella — disparo automático a los 5 min de placa huérfana, RESCATE con derivada, recuperación por portal, y **NET_WDT congelado durante el rescate** (D-s249-D, verificado: sin reboot a los 600 s). Lo que RESTA del banco (y es lo único que sigue gateando la OTA de flota): **péndulo completo** sin asociarse (RESCATE→REINTENTO→RESCATE, perillas rápidas 1/2/1/1) · **rotación nativa multi-red** con `sta1` habilitada (nunca vista en placa) · **NET_WDT como guardián único** con `rescueN:0` (reboot a los 10 min) · heap del ciclo. El manifiesto publicado sigue ofreciendo `rpc1cl 0.235.1` y el local 0.251.1 — **no desplegar `firmware.json` a boxdin hasta pasar este banco**; al pasar, la OTA escalonada de la flota clásica queda desbloqueada (TD-s234-1).

## TD-s234-1 · Frente de flota pendiente (media · SUBE de peso desde s250)

El manifiesto ya NO miente: publica `s3_lcd35 0.246.x` y `rpc1cl 0.235.1` (ciclo gen-manifest completo en s246). Lo que queda: OTA escalonada de las S3 y la clasica gateada por TD-s235-1. **Nota s250 — motivo serio**: toda la flota clásica desplegada lleva la **mina de mgos_provision** — 300 s sin conectar → factory reset con wipe de config de usuario. La cura (`provision.timeout 0`) viaja con 0.250.x+: la OTA de flota clásica es parche de resiliencia, no mejora. **Nota s251**: la 0.251.2 de mesa lleva además el plano de rescate completo (Bc1+Bc2+Bc3) — la imagen candidata a flota existe; solo espera el banco de TD-s235-1 y el ciclo gen-manifest.

## TD-s234-2 · Transición de hora: el contenido pre-s234 del RTC se interpreta como UTC (baja · transicional · se disuelve sola)

(Íntegro s244.)

## TD-s234-3 · Doble sondeo del estado WiFi desde la UI (baja · sin disparador)

(Íntegro s245: tres consumidores + /wifi.) **Nota s246**: cuarto consumidor — el tick del vigilante S3. **Nota s251**: el clásico suma los suyos (tick del vigilante + /wifi del panel) — mismo patrón, snapshot compartido con TTL sigue ganando motivos.

## TD-s234-4 · Claves WiFi visibles al teclear (baja · decisión de aula · sin disparador)

(Íntegro s245.)

## TD-s233-1 · Carrera benigna en el otalog entre tarea OTA y tarea MQTT (baja · diseño asumido · sin disparador)

(Íntegro s245.) **Nota s246**: se suman los volatiles del vigilante S3. **Nota s251**: en el clásico no aplica la carrera (todo corre en el event loop de mgos — otalog v2, vigilante y OTA local comparten hilo por construcción).

## TD-s232-1 · Labels fósiles en los scripts de ensayo del broker (baja · cosmética · sin disparador)

(Íntegro s244.)

## TD-s231-1 · Claves del broker expuestas + anónimo abierto (media · alimenta el hilo seguridad)

(Íntegro s245: motivos a-e + 5º + 7º + 8º + 9º.) **Nota s246**: el 9º motivo (panel /wifi sin auth por LAN) suma el `POST /ota` de la S3. **Nota s251**: y ahora también el del clásico (portal1.c) — flashear cualquier placa de la familia desde la LAN sin credenciales es posible por diseño en ambas familias. Nombrado, no bloquea; el hilo seguridad sigue esperando a Manuel.

## TD-s230-1 · Matices transicionales del ciclo de salud en flota pre-s230 (baja · transicional · se disuelve al OTAr la flota)

(Íntegro s244.)

## TD-s229-1 · Regla cache-sandbox de Cowork (media · regla operativa viva · candidata a PRINCIPIOS_OPERATIVOS)

(Íntegro s245.) **Nota s247**: el puente remote-devices volvió a caer y reconectar solo durante la sesion (patron s239/s240/s246) · sin perdida · las herramientas se recargan via ToolSearch tras la reconexion. **Nota s251**: sesión entera sin caída del puente.

## TD-s229-2 · Los ciclos de swap y de rollback se etiquetan mal en la tarjeta OTA (baja · cosmética · sin disparador)

(Íntegro s244.) **Nota s246/s251**: el otalog v2 con `via` (ya en AMBAS familias) da a la PWA la informacion para distinguirlos — si algun dia se arregla, el dato ya viaja.

## TD-s228-1 · Caducidad/rotación del ancla TLS en `fs/ota-ca.pem` (media · CON FECHA · dispara 2027-11 o antes)

(Íntegro s244.)

## TD-s228-2 · La copia de fs durante OTA/swap es un snapshot del fs vivo (baja · carrera teórica · sin disparador)

(Íntegro s244.) **Nota s251**: aplica igual al camino local (`ota1_local_end` usa el mismo `ota1_copy_fs`).

## TD-s225-1 · Concurrencia benigna en `esp_mqtt_port` entre tarea LVGL y sampler (baja · diseño asumido · sin disparador)

(Íntegro s244.)

## TD-s225-2 · Claves de cfg del teclado LRU_03 duplicadas del parser (baja · DRY · sin disparador)

(Íntegro s244.)

## TD-s224-1 · Perillas del puerto S3 sin calibrar en uso real (baja · tuning · sin disparador hasta uso sostenido)

(Íntegro s245.) **Nota s246**: hermanas nuevas con mando remoto — `rescueN/T/M/H` S3 + ventana rescate + stacks del portal. **Nota s251**: el clásico estrena su juego gemelo (`rescueN/T/M/H` 5/10/3/2 vía to/cfg, ventana rescue 5 min `OTA1_TRIAL_RESCUE_MS`, sondeo E4 de ~15 s en `rescue_ap_boot_cb`) — todo sin calibrar, a ajustar con dato de banco.

## TD-s224-2 · Higiene menor del puerto S3 (baja · cosmética · sin disparador)

(Íntegro s244.)

## TD-s221-2 · Perillas del motor de vitalidad sin calibrar on-device (baja · tuning · sin disparador hasta la validación)

(Íntegro s244.)

## TD-s218-1 · Auto-consulta de las pestañas Minilog/Status da timeout en dispositivos virtuales (baja · UX · P11 · sin disparador)

(Íntegro s245.) **Nota s248**: la rama S3 del Minilog ya no consulta; el timeout en dispositivos virtuales clásicos sigue tal cual.

## TD-s217-1 · `to/act` con formato dual: sobre + plano legacy (baja→media · contrato · P11 · sin disparador)

(Íntegro s244.)

## TD-s215-1 · Las guías de migración de clips deben marcar qué líneas SE CONSERVAN (baja · doc/proceso · plegada desde s215)

(Íntegro s244.)

## TD-s214-1 · Estilos inline del diagnóstico/inyector de la celda (baja · UX · P11 · sin disparador)

(Íntegro s245.)

## TD-s213-1 · Pulir la UI de la mini-mesa de actuación (baja · UX · P11 · sin disparador)

(Íntegro s244.)

## TD-s212-1 · El `actuadorAdapter` emite hasta 20fps por señal con arista (baja · rendimiento futuro · P11)

(Íntegro s244.)

## TD-s210-1 · Publicador HwSim emite la placa entera, sin `src` ni `channelId` (media-baja · P11)

(Íntegro s244.)

## TD-s209-1 · Relay wss broadcast sin filtrado per-cliente (sin trigger aún · límite conocido)

(Íntegro s244.)

## TD-s208-1 · Docs fósiles del menú PiP (baja · cosmética/contenido · plegada desde s208)

(Íntegro s245.) **Nota s246**: el destilado nuevo del eje S3 (candidato firme) tiene ya material de sobra; buen momento tras el banco P1-P6. **Nota s251**: el eje clásico también acumula material de destilado propio (Bc0→Bc3 + bancos) — candidato cuando el banco cierre.

## TD-s208-2 · Backpressure inerte en el camino scanStage de IB_04 (baja · rendimiento futuro · plegada desde s208)

(Íntegro s244.)

## TD-s207-1 · El cambio de partitura en caliente llega a medias (sin trigger aún · registrado por arbitraje s207)

(Íntegro s244.) La familia Caps.Get/Cfg.Get acumula consumidores: TD-s245-1 + TD-s246-2.

## TD-s202-2 · Cola de dato externo (animaciones · NO commiteable)

(Íntegro s244.)

## TD-s202-3 · T-S202-DISPLAY-LABEL-ID (coherencia de presentación · cosmética P11)

(Íntegro s244.)

## TD-s203-1 · Regla BOM para .ps1 generados / lectura mojibake (candidata a PRINCIPIOS_OPERATIVOS)

(Íntegro s244.)

## TD-s204-1 · Coherencia de GUIA_ARRANQUE con el régimen s204 (menor)

(Íntegro s244.)

## TD-s205-1 · Sync-line del MAPA fuerza re-subida en cada cierre (fricción · requiere arbitraje)

(Íntegro s244, con mitigacion project_write y matiz namespace claude/.)

## TD-s206-1 · Enlaces huérfanos `vir1` en localStorage (limpieza menor)

(Íntegro s244.)

## TD-s206-2 · Semilla `Real` para señales de músicos dinámicos (P11 · una línea)

(Íntegro s244.)

---

## Arrastres (no bloqueantes, de cierres previos)

- Poda etapa 3 (apéndice de 60 tensiones antiguas a triar) + formalizar etapa 4 en LRU_METODO.
- Prueba de ciclo restante s206: desenlazar `pc_xxxx` → la aguja vuelve a casa.
- Regen del `.html` del alfiler `lru_alfiler_egress_mesa_s210.md` · + regen de `index.html` desde `index.md` (MD autoritativo · `lru_md_to_html.py` host-side).
- **Versionado de firmware**: `rpc1cl` HECHO (git-cl, ya con 5 commits s249-s251). Quedan `rpc1` (4 fixes s228) · `blink1` (s228) con el mismo patrón.
- **`C:\esp32\01_factory\_to_delete\`**: borrar a mano (el bridge no puede borrar).
- `C:\lru\docker`: git local opcional (backup automatico existe).
- **Autoría Animate** (no-commiteable): herencia s221 + sub-clip de estatus R-D + destino de `lru_clip_animate_switches_s215.html`.
- **Broker**: retained huérfano `s3/s3_XXXXXX/from/status` — verificar si sobrevivio al cutover antes de limpiar.
- **Bitácora §B**: líneas s239-s251 ausentes (el pie declara sincronización a s212) + **catálogo anillo 2 sin los destilados s246-s249** — candidatas a pasada única de backfill.
- **Rebuild + deploy dist de pwa6 a boxdin + Unregister SW** (el build desplegado no lleva la utilidad clave de rescate ni los fixes s248).

---

Reescrito al cierre de s251 (2026-08-08). Sale TD-s250-1 (resuelta: pull_up era la cura — flancos verificados en banco, larga/corta operativas) · alta TD-s251-1 (truncación SensorsCfg) · notas s251 en TD-s235-1 (Bc3 materializada — su banco restante es lo único que gatea la flota), TD-s234-1 (imagen candidata a flota existe), TD-s246-2/TD-s224-1 (perillas gemelas del clásico), TD-s241-2/TD-s231-1 (POST /ota del clásico), TD-s245-2 (clásico sin mini-DNS a propósito).
