Gestionar el harness: qué mira JMAX de sí mismo, y qué hacer con eso
JMAX mide cada turno: qué herramienta llamó, qué falló, qué le dijo al modelo para desatascarlo, si eso sirvió, cuánto tardó y con qué cerebro. Esta guía es para leer esos datos y decidir con ellos.
No hay pantalla todavía: se mira con un comando.
El comando
En PowerShell, que es lo que abre Windows por defecto:
cd D:\I+D-PROGRESO\inversagpt
& "$env:LOCALAPPDATA\Programs\JMAX\python\python.exe" scripts\ver_traza.py
El & del principio no es opcional: sin él, PowerShell trata la ruta entre
comillas como texto y no la ejecuta. En cmd sería %LOCALAPPDATA% y sin &.
Hay que usar el Python de JMAX, no el del sistema: es el único que sabe abrir la base cifrada.
Se puede ejecutar con JMAX abierto — solo lee.
| Variante | Para qué |
|---|---|
scripts\ver_traza.py |
El tablero completo |
... --turnos 30 |
Más turnos en la lista |
... --presupuestos |
Probar otros topes sobre lo ya grabado |
... --repo |
La base de desarrollo en vez de la instalada |
Si salen cuadraditos en vez de acentos: chcp 65001 antes del comando.
Cómo leer el tablero
Cada cerebro: qué cumple y qué le cuesta
modelo dónde turnos cumple pasos seg puntaje agotados
orcarouter/Qwen3.8-27B-Unc... local 17 100% 5.2 129 76.6 0
| Columna | Qué dice | Cuándo preocupa |
|---|---|---|
dónde |
Si corre en tu equipo o en la nube | Si dice nube y creías que era local, el presupuesto que se le aplica es el equivocado |
cumple |
Turnos que acabaron con resultado | Por debajo del 80 % |
pasos |
Cuántas herramientas necesita de media | Si sube con el tiempo, el modelo está dando vueltas |
seg |
Cuánto tarda de media | Más de 180 s en local es un usuario que se va |
puntaje |
Resumen de todo lo anterior | Sirve para comparar, no como nota |
agotados |
Turnos cortados por presupuesto | Cualquier número > 0 merece mirarse |
agotados es la columna que más importa. Si sube con los modelos locales,
el harness los está estrangulando y hay que darles más presupuesto.
Los últimos turnos
Una línea por turno, con ✓ si cumplió, ✗ si no, y ⚠ con el motivo si se agotó: «se alcanzó el tope de 28 pasos», «llevaba 180 segundos sin dar señales».
Las herramientas que más fallan
Ordenadas por fallos. El tiempo medio de cada una también sale aquí: una herramienta lenta gasta el presupuesto de reloj de todo el turno.
Pistas: cuáles desatascan y cuáles no
66.7% (2/3) ui_click La pantalla cambió desde el último ui_snapshot...
0.0% (0/4) fs_read Ese paso falló. No repitas la misma llamada...
Una pista «acierta» si, después de darla, el modelo volvió a llamar a esa misma herramienta y le salió bien.
Una pista que se da mucho y casi nunca desatasca es una pista mala: o el texto no dice qué hacer, o el modelo no puede hacerlo. Las del 0 % con muchas veces son las primeras que hay que reescribir.
Lo aprendido: qué desatasca cada error
fs:no existe ruta indicada → fs_search (4x)
Sale solo, de mirar qué hizo el modelo después de cada fallo. Hacen falta tres casos del mismo error resueltos igual para que se atreva a aconsejar. Con menos, no dice nada — y eso es lo correcto: una pista equivocada manda al modelo por un camino que no lleva a ningún sitio.
Huecos: lo que nadie sabe resolver
Es la lista de trabajo. Cada línea es una pista que falta por escribir o una herramienta que hay que arreglar, ordenada por lo que molesta.
Escalera de desatasco
Qué peldaño se probó y si funcionó. Cuando uno acumule cinco casos, el orden se recalcula para ese modelo.
Probar otros topes sin gastar un token
& "$env:LOCALAPPDATA\Programs\JMAX\python\python.exe" scripts\ver_traza.py --presupuestos
local (el de ahora) turnos 20 · cumple 100.0% · ESTRANGULA 0 · ahorra 0.0s · puntaje 76.80
apretado turnos 20 · cumple 95.0% · ESTRANGULA 1 · ahorra 0.0s · puntaje 72.88
Corre cada configuración sobre los turnos ya grabados, sin llamar al modelo ni una vez.
La columna que manda es ESTRANGULA: turnos que salieron bien y que ese tope habría cortado antes de terminar. Un presupuesto que sube el puntaje estrangulando turnos buenos no es mejor, es más barato, que no es lo mismo.
Lo que NO puede decirte: el simulador solo conoce los pasos que de verdad ocurrieron. Sabe cuándo habría cortado; no sabe qué habría contestado el modelo con otra pista o con otro orden de la escalera. Para eso hay que volver a llamarlo.
Qué hacer ante cada hallazgo
| Lo que ves | Qué significa | Qué hacer |
|---|---|---|
agotados sube en local |
El presupuesto ahoga al modelo | Subir LOCAL en jmax/core/presupuestos.py, o esperar a los 20 turnos para que se calcule solo |
agotados siempre 0 y seg bajo |
Sobra margen | Bajar el tope: los turnos perdidos se cortarán antes |
| Muchos turnos con ✗ | El modelo no resuelve | Mirar «herramientas que más fallan»: ¿es el modelo o es un conector roto? |
| Una pista al 0 % con 5+ veces | El texto no dice qué hacer | Reescribirla en _HINTS de harness.py |
| Un hueco con muchas veces | Nadie sabe resolver ese error | Escribir la pista, o arreglar la herramienta |
pasos sube semana a semana |
El modelo da vueltas | Revisar el selector de herramientas: quizá recibe demasiadas |
| Un turno con ⚠ «sin dar señales» | El servidor de modelos se atragantó | Comprobar que el servidor esté vivo; si pasa mucho, subir silencio |
Cambiar los presupuestos
Los topes de partida están en
jmax/core/presupuestos.py:
NUBE = Presupuesto(pasos=40, segundos=300.0, desatascos=3, silencio=90.0)
LOCAL = Presupuesto(pasos=28, segundos=600.0, desatascos=2, silencio=180.0)
Un modelo local necesita menos pasos y más reloj que uno de nube: falla más pero cada intento tarda mucho más, así que el tope que muerde es el reloj.
silencio son los segundos sin que ocurra nada antes de dar el turno por
perdido. Es el que evita que la ventana se quede muda cuando el servidor de
modelos deja de contestar.
Cuando un modelo acumule 20 turnos cumplidos, sus topes dejan de salir de esa tabla y se calculan de sus propios percentiles (p75 de pasos, p90 de segundos, con un 50 % de holgura), con suelo y techo para que nunca se quede sin margen ni deje al usuario media hora esperando.
Antes de cambiar nada a ojo, pruébalo con --presupuestos: para eso está.
Rutina sugerida
Cada semana, cinco minutos:
- Corre el visor.
- Mira
agotadosycumplepor cerebro. - Mira los huecos: si alguno creció, ahí está el trabajo de la semana.
- Si cambiaste algo la semana pasada, compara el
puntajecon el anterior.
Al cerrar un piloto: corre --presupuestos sobre los turnos de ese cliente
para saber si los topes le quedaban cortos.
Dónde vive cada cosa
| Qué | Dónde |
|---|---|
| La traza y el puntaje | jmax/core/traza.py |
| Los presupuestos por modelo | jmax/core/presupuestos.py |
| Las pistas aprendidas | jmax/core/pistas.py |
| La repetición offline | jmax/core/repeticion.py |
| La escalera de desatasco | jmax/core/desatascar.py |
| Las reglas del harness | jmax/core/harness.py |
| El visor | scripts/ver_traza.py |
| Las tablas | traza_pasos y traza_turnos, en backend/data/jmax.db |
Los datos se quedan en el equipo, dentro de la base cifrada, como todo lo demás. No salen a ningún sitio.
Lo que todavía no hay
- Las estrellas no cuentan en el puntaje. El mecanismo existe
(
traza.calificar()), pero nadie lo llama cuando calificas una respuesta: falta cruzarlo con la tablacalificaciones, que indexa por chat y respuesta, no por turno. - No hay pantalla. Todo esto se ve con el visor.
- Las pistas aprendidas no se escriben solas en
_HINTS. Se usan en vivo, pero si quieres que una quede fija, hay que escribirla a mano.
Para probarlo paso a paso
Los diez casos con lo que espera cada uno están en
docs/planes/pruebas-dream-rsi.md. El
porqué de cada mejora, en
docs/planes/mejoras-dream-rsi.md.
¿No encuentras la respuesta?
Cuéntanos qué pasa: el ticket queda unido a tu licencia y te respondemos por correo.