QA — Smoke visual conducido del tablero de carrera (2026-08-07, tablero-de-carrera)
Verificación de tablero-de-carrera mirando la ventana, por el método que
estableció gui-acabado-y-cierre-sdd (docs/qa/2026-07-26-gui-acabado-smoke.md) y
repitieron pulido-pre-anuncio y lanzador-conversacional. La change es en su
mitad superficie —calles lado a lado, procedencia por calle, acciones de carrera
con confirmación, vida del tablero— y los tests de cableado leen fuentes: no ven
layout, ni lo que un texto se vuelve al envolverse, ni si un diálogo se alza de
verdad entre el clic y el daemon. Este smoke sí, y encontró una cosa que ninguno
de ellos podía ver (§Hallazgos).
- Binario de release construido con la CLI de Tauri (
ui/node_modules/.bin/tauri build --no-bundle; nuncacargo build --release, que no activatauri/custom-protocol), conadditionalBrowserArgs: --remote-debugging-port=9455temporal entauri.conf.json, revertido y el binario reconstruido limpio al terminar: el binario publicado no expone puerto alguno. - Entorno aislado:
MELTEMI_DATA_DIRyMELTEMI_CONFIG_DIRpropios en el scratchpad, y un repo fixture (harbour) con reglaallow, dos proveedores en registro local (provider-a,provider-b) y dos perfiles de lanzamiento (work,thorough) con marcador de contexto distinto. El único agente esmock-agent. Nunca este repositorio, nunca agentes reales, nunca red. - Las dos calles se crearon de verdad:
meltemi dispatch dark-mode 1.1 worky… thoroughcontra ese fixture, cada uno con su worktree, su checkpoint y su commit. - Driver Node sobre el WebSocket de CDP:
Runtime.evaluateleyendo el DOM real y midiendo cajas, clicks reales sobre los nodos,Page.captureScreenshotpara la mirada humana. Ventana 1200×800 lógicos. - Contraste de dos fuentes: lo que la ventana muestra frente a lo que el daemon
responde (
meltemi --json race dark-mode 1.1), para que la procedencia pintada sea la procedencia registrada y no una coincidencia.
Resultado: lo que la change promete, medido sobre el binario
Sección titulada «Resultado: lo que la change promete, medido sobre el binario»| # | Lo prometido | Medido |
|---|---|---|
| 1 | El tablero abre desde la superficie del método | Revisar diffs → tarea dark-mode · 1.1 — work, thorough; las calles cargan en 3 689 ms (el diff de cada worktree lo calcula git en el momento) |
| 2 | Calles lado a lado | 2 calles, cajas 462×580 cada una, en rejilla de dos columnas |
| 3 | Procedencia visible por calle | resolución: perfil · suscripción: work · nivel: L1 — y la otra calle con suscripción: thorough. Idéntico a lo que el daemon reporta por contrato (source: profile, profile: work/thorough, level: 1) |
| 4 | Estado en señal y palabra | ■ turno concluido · ◆ comiteado e13dfa7afe · ⌖ con checkpoint; la otra calle con 2fb2f1435b |
| 5 | Cada calle con su base | base común d361d3e4ad declarada en cada calle, no solo en la cabecera |
| 6 | Las acciones de la carrera, en la calle | Despachar un turno, Revertir al checkpoint, Commit de la tarea por calle |
| 7 | Merge asistido por archivo | Aplicar en thorough en la calle work, Aplicar en work en la otra: por archivo, hacia la otra calle, nunca “elige ganador” |
| 8 | La acción se compone en el formulario tipado del contrato | panel checkpoint/revert con projectRoot*, change*, task*, agent*, confirm, y el pie generado desde checkpoint.schema.json#revertParams |
| 9 | El confirm del contrato no viene pre-marcado |
casilla confirm sin marcar en el formulario: la guarda del daemon la decide el humano |
| 10 | Acción destructiva solo con confirmación explícita | pulsar Enviar alza el diálogo en 1 ms en vez de enviar: «“Revertir al checkpoint” sobre la calle de work. Es una operación destructiva y se envía al daemon en cuanto la confirmes.» |
| 11 | Cancelar no envía nada | tras Cancelar: 0 diálogos abiertos y los shas de las dos calles idénticos (e13dfa7afe, 2fb2f1435b) antes y después — no hubo revert |
| 12 | El límite de lo que el tablero puede seguir, declarado | «El tablero sigue en vivo los turnos que lanza esta ventana. Un despacho iniciado en otra superficie no llega hasta aquí: actualiza para verlo», junto al botón Actualizar |
| 13 | Sin desbordes horizontales | scrollWidth 1200 = clientWidth 1200 |
Hallazgos
Sección titulada «Hallazgos»H1 (corregido en esta misma change) — la nota de vida se leía como parte de la
base. La cabecera del tablero era una fila flex con tres hijos, así que
base común: d361d3e4ad, la nota y Actualizar caían en la misma línea y la
nota partía a mitad de frase («…no llega hasta aquí: / actualiza para verlo»)
pegada al sha. Se lee como una sola oración sobre la base, que no es lo que dice.
Corregido: la cabecera pasa a rejilla, con base común y Actualizar en su fila
y la nota en su propio párrafo acotado a 68ch. Verificado sobre el binario
reconstruido (captura 03-board). Ningún test de cableado podía verlo: los tres
nodos estaban presentes y en orden, que es todo lo que una aserción de fuente
comprueba.
No es hallazgo — binario obsoleto del operador. En la primera pasada las dos
calles decían sin turno despachado pese a haber sido despachadas. La causa no
era el tablero: el meltemi.exe de target/release era del 26-jul, anterior
a las tareas 2.1/2.2, así que aquellos despachos nunca escribieron registro de
índice. Reconstruidos los binarios y rehechos los despachos, la procedencia
aparece completa. Queda anotado porque el modo de fallo —medir la superficie
nueva con una CLI vieja— se repetirá si no se nombra.
Frontera de esta verificación
Sección titulada «Frontera de esta verificación»- Un smoke conducido prueba esta plataforma (Windows 11, WebView2
Edg/151.0.4129.59) y este recorrido. Ni es una prueba de las tres plataformas ni sustituye a los tests: es la mirada que los tests no tienen. - El agente es el simulado. Que la calle muestre
turno concluido / comiteadose midió contra el mock, no contra un proveedor real; lo que se verifica aquí es que la superficie pinta lo que el daemon registró, no lo que un agente concreto hace. - El tablero del shell (TUI) no entra en este smoke: su verificación es por tests de buffer, incluida la presentación ASCII, que es la forma en que una terminal se mira.
Capturas y mediciones crudas del recorrido (measured.json, confirm.json) se
conservaron fuera del repositorio, en el scratchpad de la sesión: contienen rutas
absolutas de la máquina y no aportan a la verdad viva.