xonecode 0.19.0 → 0.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/apps/web/dist/assets/{index-BvPUqjUm.js → index-40sIfNsT.js} +65 -65
  2. package/apps/web/dist/assets/{index-CGEXMJBx.css → index-BYTna8Os.css} +1 -1
  3. package/apps/web/dist/assets/{php-Dk28VW45.js → php-CDg2Quc0.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-CPzEcmdp.js → ruby-DlFaAWQT.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/config/modelos.js +13 -8
  7. package/dist/agent/config/modelos.js.map +1 -1
  8. package/dist/agent/grafo/atributosXone.js +58 -0
  9. package/dist/agent/grafo/atributosXone.js.map +1 -0
  10. package/dist/agent/grafo/describirImagen.js +134 -0
  11. package/dist/agent/grafo/describirImagen.js.map +1 -0
  12. package/dist/agent/grafo/marcarCriteriosDelPlan.js +3 -2
  13. package/dist/agent/grafo/marcarCriteriosDelPlan.js.map +1 -1
  14. package/dist/agent/grafo/xoneAgent.js +7 -6
  15. package/dist/agent/grafo/xoneAgent.js.map +1 -1
  16. package/dist/agent/motores/trueforge/capacidades.js +49 -1
  17. package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
  18. package/dist/agent/motores/trueforge/esperas.js +61 -0
  19. package/dist/agent/motores/trueforge/esperas.js.map +1 -0
  20. package/dist/agent/motores/trueforge/informesDeHijos.js +63 -0
  21. package/dist/agent/motores/trueforge/informesDeHijos.js.map +1 -0
  22. package/dist/agent/motores/trueforge/medidaAutomatica.js +118 -0
  23. package/dist/agent/motores/trueforge/medidaAutomatica.js.map +1 -0
  24. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js +186 -0
  25. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js.map +1 -0
  26. package/dist/agent/motores/trueforge/resumenSeguro.js +52 -0
  27. package/dist/agent/motores/trueforge/resumenSeguro.js.map +1 -0
  28. package/dist/agent/motores/trueforge/sesionTrueforge.js +512 -30
  29. package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
  30. package/dist/agent/motores/trueforge/toolsDeFichero.js +77 -4
  31. package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
  32. package/dist/agent/subagentes/agentesEnDisco.js +81 -24
  33. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  34. package/dist/agent/turno/diagnosticoDeTools.js +12 -0
  35. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
  36. package/dist/agent/turno/informeDeTraza.js +13 -1
  37. package/dist/agent/turno/informeDeTraza.js.map +1 -1
  38. package/dist/agent/turno/resumenDeTool.js +5 -0
  39. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  40. package/dist/core/actos.js.map +1 -1
  41. package/dist/core/adjuntos.js +2 -3
  42. package/dist/core/adjuntos.js.map +1 -1
  43. package/dist/core/agentes.js +20 -1
  44. package/dist/core/agentes.js.map +1 -1
  45. package/dist/core/atributosXone.js +187 -0
  46. package/dist/core/atributosXone.js.map +1 -0
  47. package/dist/core/compararCapturas.js +81 -15
  48. package/dist/core/compararCapturas.js.map +1 -1
  49. package/dist/core/esfuerzo.js +33 -0
  50. package/dist/core/esfuerzo.js.map +1 -1
  51. package/dist/core/iconos.js +6 -1
  52. package/dist/core/iconos.js.map +1 -1
  53. package/dist/core/modoDeEscritura.js +18 -0
  54. package/dist/core/modoDeEscritura.js.map +1 -1
  55. package/dist/core/motor.js +5 -0
  56. package/dist/core/motor.js.map +1 -1
  57. package/dist/core/nucleoXone.js +3 -1
  58. package/dist/core/nucleoXone.js.map +1 -1
  59. package/dist/core/selectorDeCarpeta.js +15 -1
  60. package/dist/core/selectorDeCarpeta.js.map +1 -1
  61. package/dist/core/settings.js +19 -4
  62. package/dist/core/settings.js.map +1 -1
  63. package/dist/core/shellDeAgente.js +39 -0
  64. package/dist/core/shellDeAgente.js.map +1 -1
  65. package/dist/core/tareasDelPlan.js +70 -8
  66. package/dist/core/tareasDelPlan.js.map +1 -1
  67. package/dist/web/servidor/consolaWeb.js +10 -2
  68. package/dist/web/servidor/consolaWeb.js.map +1 -1
  69. package/dist/web/servidor/pielWeb.js +13 -4
  70. package/dist/web/servidor/pielWeb.js.map +1 -1
  71. package/package.json +1 -1
  72. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +2 -2
  73. package/skills/xone-development/references/datos/appdata.md +5 -3
  74. package/skills/xone-development/references/fundamentos/errores-comunes.md +34 -0
  75. package/skills/xone-hotswap/SKILL.md +2 -0
  76. package/skills/xone-hotswap/scripts/xone-log-android +18 -1
  77. package/skills/xone-plan-builder/SKILL.md +10 -10
  78. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +5 -5
  79. package/skills/xone-spec-builder/SKILL.md +3 -3
@@ -300,6 +300,40 @@ Declararlas explícitamente (`<prop name="ID">` / `<prop name="ROWID">`) **no ca
300
300
 
301
301
  **Lo que NO es valido:** dos `<coll>` con el mismo `name` en el proyecto.
302
302
 
303
+ ### Error 12: Pedir un control con `getControl` cuando todavía no existe
304
+
305
+ ```javascript
306
+ // MAL: en <create> la vista aún no está montada
307
+ function calcInit() {
308
+ var c = getControl("MAP_EXPRESION"); // LANZA
309
+ c.setText("0");
310
+ }
311
+ ```
312
+
313
+ `getControl("X")` **lanza** una `IllegalArgumentException` («Cannot find control "X"») si el control no existe, y **un
314
+ `try/catch` de JavaScript no la detiene**: viene del puente nativo, aborta el evento entero (`CXoneDataObject::OnCreate
315
+ failed`) y deja un diálogo de error encima de la pantalla. Medido en un emulador Android.
316
+
317
+ **No existen** los controles de la vista durante `<create>` (todavía no está montada) ni los hijos de un frame
318
+ **oculto** (`visible="0"`), como un cajón cerrado.
319
+
320
+ ```javascript
321
+ // BIEN: en <create> solo estado y valores
322
+ function calcInit() {
323
+ self.MAP_EXPRESION = "0";
324
+ }
325
+
326
+ // BIEN: una sonda que NO lanza, para un control que puede no existir
327
+ function calcControl(nombre) {
328
+ var v = ui.getView(self);
329
+ return v ? (v[nombre] || null) : null; // ui.getView(self)["X"] da undefined, no lanza
330
+ }
331
+ ```
332
+
333
+ La documentación de `getControl` y la indexación de la vista (`ui.getView(self)["X"]`) las presenta como equivalentes:
334
+ para acceder no lo son, y esa diferencia es la que evita el diálogo. **Y un texto que cambia desde JavaScript no va en
335
+ un `L`/`TL`** (pintan su `title`): usa un `T` con `labelwidth="0"` y `locked="true"`.
336
+
303
337
  ---
304
338
 
305
339
  Esta guía ha cubierto los conceptos fundamentales de XOne:
@@ -26,6 +26,7 @@ No cuestan lo mismo, ni de lejos. Por orden de lo que vas a necesitar:
26
26
  |---|---|---|
27
27
  | **dónde estoy** | `screen` | una línea: colección activa, diálogos abiertos, ventana con el foco |
28
28
  | **qué está fallando** | `xone-log-android` | un error de JavaScript o una excepción salen ahí con su mensaje y su línea |
29
+ | **qué ha pasado tras una acción** | `xone-log-android --limpiar`, la acción, `xone-log-android --app` | trae SOLO los `console.log` de la app, sus errores y qué manejador corrió (`Executing script: [MenuPrincipal][btnD8][onclick]`): casi siempre basta sin captura |
29
30
  | **el valor de un campo** | `getText name=X` | un viaje, una respuesta corta |
30
31
  | **varios campos** | `getFields names=A,B,C` | UN viaje; un campo que falle no tumba a los demás |
31
32
  | **el contenido de una lista** | `getRows content=X fields=…` | alcanza todas las filas, no solo las pintadas |
@@ -117,6 +118,7 @@ xone-hotswap waitForElement name=BTN_OK timeout=5000 -- click name=BTN_OK # UN
117
118
  # Por qué algo no se pinta o la app se muere: las excepciones del aparato.
118
119
  xone-log-android
119
120
  xone-log-android --limpiar # aísla lo que pase a partir de ahora
121
+ xone-log-android --app # SOLO los console.log de la app, sus errores y qué manejador corrió
120
122
 
121
123
  # RESPALDO de la captura, para cuando el canal no contesta: `adb exec-out screencap` pero
122
124
  # guardándola donde toca. Nunca redirijas ese `adb` tú: el `cwd` es la raíz del proyecto.
@@ -17,6 +17,7 @@
17
17
  * xone-log-android errores y excepciones recientes
18
18
  * xone-log-android --lineas 400 más cola
19
19
  * xone-log-android --todo todo lo del host, no solo errores
20
+ * xone-log-android --app SOLO lo que escribió la app con console.log, más sus errores
20
21
  * xone-log-android --limpiar vacía el buffer y sale (para aislar lo siguiente)
21
22
  * xone-log-android --serie emulator-5554
22
23
  */
@@ -32,6 +33,7 @@ if (args.includes("--help") || args.includes("-h")) {
32
33
  xone-log-android errores y excepciones recientes (por omisión, 200 líneas)
33
34
  xone-log-android --lineas 400 más cola
34
35
  xone-log-android --todo todo lo del host, no solo errores
36
+ xone-log-android --app SOLO los console.log de la app (etiqueta XOneJavaScript) y sus errores
35
37
  xone-log-android --limpiar vacía el buffer y sale, para aislar lo que pase después
36
38
  xone-log-android --serie <id> con varios aparatos conectados
37
39
 
@@ -62,6 +64,13 @@ if (args.includes("--limpiar")) {
62
64
 
63
65
  const lineas = Number(opcion("lineas") ?? 200);
64
66
  const todo = args.includes("--todo");
67
+ /**
68
+ * `--app`: lo que la APP escribió con `console.log`, y sus errores, sin el resto del host. Medido en el emulador: un
69
+ * `console.log("X")` de un script sale como `V XOneJavaScript: X` en el log del host, y la vista por omisión —solo
70
+ * errores— lo tira; `--todo` lo entierra entre cientos de líneas del sistema. `appData.writeConsoleString` (legacy) no
71
+ * deja nada en el log de Android. Es lo que hay que leer para saber qué ha pasado tras una acción, antes que una captura.
72
+ */
73
+ const app = args.includes("--app");
65
74
 
66
75
  /** El PID del host, si está vivo. Sin él no se puede acotar por proceso: se dice y se sigue. */
67
76
  let pid;
@@ -76,7 +85,7 @@ const salida = [];
76
85
  if (pid !== undefined && pid !== "") {
77
86
  const suyo = adb("logcat", "-d", "--pid", pid, "-t", String(lineas));
78
87
  salida.push(`--- ${PAQUETE} (pid ${pid}) ---`);
79
- salida.push(todo ? suyo : soloInteresante(suyo));
88
+ salida.push(todo ? suyo : app ? soloDeLaApp(suyo) : soloInteresante(suyo));
80
89
  } else {
81
90
  salida.push(`--- ${PAQUETE} no está vivo ahora mismo: solo queda lo que dejó escrito ---`);
82
91
  }
@@ -91,6 +100,14 @@ if (caidas !== "") {
91
100
  salida.push("", "--- caídas duras (cualquier proceso) ---", caidas);
92
101
  }
93
102
 
103
+ /** Los `console.log` de la app (etiqueta XOneJavaScript) y los errores del host, en su orden. */
104
+ function soloDeLaApp(texto) {
105
+ const filas = texto.split("\n").filter((l) => /\sXOneJavaScript\s*:/.test(l) || /\s[EF]\s/.test(l) || /Caused by:|Exception/.test(l));
106
+ return filas.length === 0
107
+ ? "(la app no ha escrito nada con console.log ni ha dado errores en esas líneas; si esperabas una línea, no se ejecutó ese código)"
108
+ : filas.join("\n");
109
+ }
110
+
94
111
  /** Lo que merece la pena leer de un volcado del host: errores, avisos y trazas de excepción. */
95
112
  function soloInteresante(texto) {
96
113
  const filas = texto.split("\n").filter((l) => {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: xone-plan-builder
3
- description: "Descomponer el PLAN.md (spec) de xone-spec-builder en un plan de ejecución (TASKS.md): tareas tracer-bullet verticales con dependencias explícitas. Valida el spec, descompone en cortes verticales (coll + pantalla + eventos + estilo), cada uno demoable y verificable con xone-review. Dependencias naturales XOne: mappings.xne → colls base → colls negocio → pantallas entidad → pantallas especiales → integraciones dispositivo (GPS, cámara, firma DR, escáner, biometría) → estilo → sincronización → validación. Prefactoring: reestructuras que facilitan el cambio. Refactors amplios: expand-contract. Quiz al usuario: granularidad, dependencias, partición. Tareas: una por context window, qué entrega (no cómo), bloqueada por, criterios verificables. Hitos con validación xone-review. Es análisis, no entrevista: no toma decisiones de diseño, si el spec tiene huecos lo devuelve a xone-spec-builder."
3
+ description: "Descomponer el PLAN.md (spec) de xone-spec-builder en un plan de ejecución (TASKS.md): tareas tracer-bullet verticales con dependencias explícitas. Valida el spec, descompone en cortes verticales (coll + pantalla + eventos + estilo), cada uno demoable y comprobable en el aparato. Dependencias naturales XOne: mappings.xne → colls base → colls negocio → pantallas entidad → pantallas especiales → integraciones dispositivo (GPS, cámara, firma DR, escáner, biometría) → estilo → sincronización → validación. Prefactoring: reestructuras que facilitan el cambio. Refactors amplios: expand-contract. Quiz al usuario: granularidad, dependencias, partición. Tareas: una por context window, qué entrega (no cómo), bloqueada por, criterios verificables. Hitos que cierran con una comprobación en el aparato. Es análisis, no entrevista: no toma decisiones de diseño, si el spec tiene huecos lo devuelve a xone-spec-builder."
4
4
  ---
5
5
 
6
6
  # XOne Plan Builder
@@ -17,7 +17,7 @@ Esta skill es **análisis y descomposición**, no entrevista. No afina el domini
17
17
  xone-spec-builder → PLAN.md (el spec)
18
18
  xone-plan-builder → TASKS.md (el plan de ejecución) ← esta skill
19
19
  xone-project-generator / xone-development → ejecutan una tarea cada vez
20
- xone-review → valida con xone-simulator
20
+ arnés + device-controller → valida: el verificador al cerrar el turno, el aparato con toques reales
21
21
  ```
22
22
 
23
23
  ## Estructura de archivos
@@ -79,7 +79,7 @@ Si algo falta, no lo inventes: devuelve a `xone-spec-builder` con una nota espec
79
79
  Una tarea es un **corte vertical** que atraviesa todas las capas que necesite para entregar un comportamiento completo y verificable:
80
80
 
81
81
  - **Vertical, no horizontal.** «Crear coll Clientes + su pantalla de lista + su pantalla de edición + su estilo» es vertical. «Crear todas las colls» es horizontal —no es una tarea, es una capa.
82
- - **Demoable o verificable por sí sola.** Al cerrar la tarea, hay algo que funciona de principio a fin y se puede validar con `xone-review`.
82
+ - **Demoable o verificable por sí sola.** Al cerrar la tarea, hay algo que funciona de principio a fin y se puede comprobar: el verificador del arnés (corre `xone-simulator validate` solo, al cerrar cada turno que escribió) y la comprobación en el aparato de `device-controller`.
83
83
  - **Cabe en una sesión de agente.** Si una tarea es tan grande que no cabe en un context window, pártela.
84
84
  - **Declara sus dependencias.** Qué tareas deben cerrarse antes de que ésta pueda empezar.
85
85
 
@@ -104,7 +104,7 @@ El orden de ejecución sigue las dependencias del framework:
104
104
  ↓ — puede ir en paralelo desde el principio; ajuste fino al final
105
105
  8. Sincronización y seguridad (réplica, OAuth2, tokens…)
106
106
  ↓ — si el desarrollo la toca
107
- 9. Validación con xone-review (xone-simulator validate + smoke)
107
+ 9. Comprobación en el aparato (device-controller; el verificador del arnés corre solo)
108
108
  ```
109
109
 
110
110
  ### Reglas de secuenciación
@@ -115,7 +115,7 @@ El orden de ejecución sigue las dependencias del framework:
115
115
  - **El comportamiento se comprueba ANTES que el pulido.** En una pantalla interactiva, la tarea «la app reacciona a un toque» —una captura antes y otra después de la zona que debe cambiar— va justo detrás del esqueleto visual y antes de cualquier tarea de aspecto fino. Si no, se pule algo que no funciona: medido, un display que no se repintaba vivió siete pasadas de retoques visuales.
116
116
  - **Estilo en paralelo.** `default.css` con las clases base puede empezar desde la tarea 1, pero el ajuste fino de pantallas específicas va después de que la pantalla exista.
117
117
  - **Integraciones después de su contenedor.** La firma DR en Pedidos va en una tarea que depende de que Pedidos (coll + pantalla de edición) ya exista.
118
- - **Validación al final de cada hito.** Si el plan tiene varios hitos, cada uno cierra con una tarea de validación `xone-review`.
118
+ - **Comprobación al final de cada hito.** Si el plan tiene varios hitos, cada uno cierra con una tarea de comprobación en el aparato (`device-controller`); la validación estática la hace el verificador del arnés solo.
119
119
 
120
120
  ### Prefactoring
121
121
 
@@ -128,7 +128,7 @@ Solo propón prefactor si el spec lo justifica o si al leer el proyecto existent
128
128
  Un **refactor amplio** es un cambio mecánico cuyo **radio de explosión** cubre todo el proyecto —renombrar una coll, cambiar el tipo de un campo compartido, migrar de `load` a `before-edit` en todas las colls—. No se puede partir en un corte vertical porque un solo edit rompe miles de sitios. Secuenciálo como **expand–contract**:
129
129
 
130
130
  1. **Expand:** añade la nueva forma junto a la vieja, sin romper nada.
131
- 2. **Migra** los sitios de uso en lotes (por carpeta, por módulo), cada lote su propia tarea bloqueada por el expand, manteniendo `xone-review` verde lote a lote.
131
+ 2. **Migra** los sitios de uso en lotes (por carpeta, por módulo), cada lote su propia tarea bloqueada por el expand, manteniendo el verificador del arnés en verde lote a lote.
132
132
  3. **Contract:** borra la forma vieja cuando nadie la usa, en una tarea bloqueada por todos los lotes.
133
133
 
134
134
  Si el spec no describe un refactor amplio, no lo fuerces. Es excepción, no regla.
@@ -182,7 +182,7 @@ Ver [TASKS-FORMAT.md](references/TASKS-FORMAT.md) para la plantilla completa. Re
182
182
 
183
183
  ## Hitos
184
184
 
185
- {si aplica: qué conjunto de tareas forma un hito verificable con xone-review}
185
+ {si aplica: qué conjunto de tareas forma un hito comprobable en el aparato}
186
186
  ```
187
187
 
188
188
  ## Reglas
@@ -192,7 +192,7 @@ Ver [TASKS-FORMAT.md](references/TASKS-FORMAT.md) para la plantilla completa. Re
192
192
  - **Nombres consistentes con el spec**, y el `MAP_` según `xone-development`.
193
193
  - **No inventes lo que el spec no dice.** Si falta algo para descomponer, devuelve a `xone-spec-builder`.
194
194
  - **Evita rutas de archivo o snippets de código específicos** —envejecen rápido. Excepción: si un prototipo o el spec produjo un snippet que codifica una decisión más preciso que prosa (esquema, state machine), inclúyelo y nota su origen.
195
- - **La validación es una tarea.** Si el plan tiene hitos, cada hito cierra con una tarea `xone-review`. Si no, al menos una tarea de validación al final.
195
+ - **La comprobación es una tarea.** Si el plan tiene hitos, cada hito cierra con una tarea de comprobación en el aparato. Si no, al menos una al final. No nombres herramientas que no estén en las skills de los especialistas: quien ejecuta las buscará.
196
196
 
197
197
  ## Cierre
198
198
 
@@ -203,9 +203,9 @@ Antes de entregar `TASKS.md`:
203
203
  - [ ] El orden de ejecución respeta las dependencias naturales de XOne (mappings → colls → pantallas → integraciones → estilo → validación).
204
204
  - [ ] No hay tareas que dependan de cosas que el spec no especifica —o están marcadas como notas.
205
205
  - [ ] El usuario aprobó el desglose.
206
- - [ ] Las tareas de validación `xone-review` están en su sitio.
206
+ - [ ] Las tareas de comprobación en el aparato están en su sitio.
207
207
 
208
- Al entregar, señala el siguiente paso: `xone-project-generator` (app nueva) o `xone-development` (sobre existente) ejecutan una tarea cada vez, y `xone-review` valida los hitos.
208
+ Al entregar, señala el siguiente paso: `xone-project-generator` (app nueva) o `xone-development` (sobre existente) ejecutan una tarea cada vez, y el verificador del arnés (al cerrar cada turno) y device-controller en el aparato validan los hitos.
209
209
 
210
210
  ## Referencias
211
211
 
@@ -43,13 +43,13 @@
43
43
  6. 06 — Integración GPS + ClientesMapa (bloqueada por 02)
44
44
  7. 07 — Firma DR en Pedidos (bloqueada por 03)
45
45
  8. 08 — Estilo: default.css completo + variantes (en paralelo desde 01)
46
- 9. 09 — Validación xone-review (bloqueada por 02-08)
46
+ 9. 09 — Comprobación en el aparato con device-controller (bloqueada por 02-08)
47
47
 
48
48
  ## Hitos
49
49
 
50
50
  {si aplica: qué conjunto de tareas forma un hito verificable. Ejemplo:}
51
51
 
52
- - **Hito 1 — CRUD básico:** tareas 01-04. Al cerrar, validar con xone-review.
52
+ - **Hito 1 — CRUD básico:** tareas 01-04. Al cerrar, comprobarlo en el aparato con device-controller.
53
53
  - **Hito 2 — App completa:** tareas 05-09. Validación final.
54
54
  ```
55
55
 
@@ -83,9 +83,9 @@ y quien empiece un encargo con este plan lo lee primero. Ejemplo:}
83
83
  - **Decisiones, no código.** Sin XML/JS/CSS pegado. Excepción: si un snippet codifica una decisión más preciso que prosa (esquema, state machine), inclúyelo y nota su origen.
84
84
  - **Nombres consistentes con el spec**, y el `MAP_` según `xone-development`.
85
85
  - **Evita rutas de archivo específicas.** Envejecen rápido. El ejecutor las infiere del spec y del proyecto.
86
- - **Criterios de aceptación verificables.** Cada criterio debe poder comprobarse —con `xone-review`, con un smoke, o con un comportamiento observable.
86
+ - **Criterios de aceptación verificables.** Cada criterio debe poder comprobarse —en el aparato con un toque y lo que dice el log, o con un comportamiento observable.
87
87
  - **El comportamiento antes que el pulido.** En una pantalla interactiva, «reacciona a un toque» (captura antes y después) va tras el esqueleto visual y antes del aspecto fino.
88
- - **La validación es una tarea.** Cada hito cierra con una tarea `xone-review`, o al menos una al final del plan.
88
+ - **La comprobación es una tarea.** Cada hito cierra con una tarea de comprobación en el aparato (`device-controller`). La validación estática no es una tarea: la hace el verificador del arnés solo, al cerrar cada turno. No nombres herramientas que no estén en esta skill ni en las de los especialistas: quien ejecuta las buscará.
89
89
 
90
90
  ## Ejemplo: feature sobre existente
91
91
 
@@ -136,5 +136,5 @@ Antes de entregar el plan:
136
136
  - [ ] El orden respeta las dependencias naturales de XOne (mappings → colls → pantallas → integraciones → estilo → validación).
137
137
  - [ ] No hay tareas que dependan de cosas que el spec no especifica —o están marcadas como notas.
138
138
  - [ ] El usuario aprobó el desglose.
139
- - [ ] Las tareas de validación xone-review están en su sitio.
139
+ - [ ] Las tareas de comprobación en el aparato están en su sitio.
140
140
  - [ ] Los hitos (si los hay) están definidos y cierran con validación.
@@ -18,7 +18,7 @@ El spec builder es el primer paso de cualquier trabajo XOne. Lo que sigue:
18
18
  - **`xone-plan-builder`** lee el `PLAN.md` y lo descompone en tareas tracer-bullet con dependencias (`TASKS.md`).
19
19
  - **App nueva** → `xone-project-generator` lee el `PLAN.md` y genera el proyecto completo.
20
20
  - **Feature, refactor, integración, cambio de modelo, rediseño** sobre un proyecto existente → `xone-development` aplica el `PLAN.md` sobre los `.xne`, `.js` y `.css` que ya viven en el repo.
21
- - **Validación final** → `xone-review` con `xone-simulator` en ambos casos.
21
+ - **Validación final** → el verificador del arnés (corre `xone-simulator validate` solo, al cerrar cada turno que escribió) y la comprobación en el aparato de `device-controller`, en ambos casos.
22
22
 
23
23
  `xone-spec-builder` es **especificación**: produce decisiones de diseño y un spec, no código ni tareas. La tentación de empezar a generar archivos o a descomponer el trabajo es la señal de que has llegado al borde del spec; para ahí y entrega el `PLAN.md`.
24
24
 
@@ -76,7 +76,7 @@ No toda petición necesita una entrevista de 8 rounds. Antes de empezar, clasifi
76
76
 
77
77
  | Nivel | Cuándo | Qué hace el spec-builder |
78
78
  |---|---|---|
79
- | **Trivial** | Una sola acción mecánica, sin decisiones de diseño. Ej: «añadir un prop EMAIL (T) a Clientes», «cambiar el color del header», «añadir un botón de salir». | **No produces PLAN.md.** Confirmas la petición en 1-2 preguntas, ejecutas con `xone-development` o `xone-project-generator` directamente, y validas con `xone-review`. Sin `CONTEXT.md` ni ADRs. |
79
+ | **Trivial** | Una sola acción mecánica, sin decisiones de diseño. Ej: «añadir un prop EMAIL (T) a Clientes», «cambiar el color del header», «añadir un botón de salir». | **No produces PLAN.md.** Confirmas la petición en 1-2 preguntas, ejecutas con `xone-development` o `xone-project-generator` directamente; lo valida el verificador del arnés (al cerrar cada turno) y device-controller en el aparato. Sin `CONTEXT.md` ni ADRs. |
80
80
  | **Simple** | Un cambio acotado con alguna decisión menor. Ej: «añadir campo IVA a LineasPedido con formula», «pasar Clientes a mapa», «añadir escáner QR en una pantalla». | **Spec ligero.** Entrevista reducida: solo los rounds que apliquen (típicamente 1, 3 y/o 4 y/o 5). `PLAN.md` en formato condensado —una sección por round, sin secciones vacías—. `CONTEXT.md` solo si hay término de dominio nuevo; ADR solo si hay decisión dura. |
81
81
  | **Normal** | Feature con varias colls/pantallas, refactor, integración multi-pantalla. Ej: «firma de entrega en Pedidos», «login con OAuth2», «módulo de incidencias con fotos». | **Spec completo.** Entrevista con los rounds que apliquen al tipo. `PLAN.md` con las secciones condicionales del formato. `CONTEXT.md` y ADRs según se resuelvan. |
82
82
  | **Grande** | App nueva completa, re-arquitectura, o un desarrollo que no cabe en una sesión de plan-builder. | **Spec completo + considerar wayfinder.** Entrevista los 8 rounds. Si el scope es tan grande que ni el spec cabe en una sesión, considera dividir el esfuerzo con un enfoque tipo wayfinder (chart el mapa de decisiones primero, luego spec por contexto). |
@@ -209,7 +209,7 @@ Revisa el `PLAN.md` completo contra el checklist de [PLAN-FORMAT.md](references/
209
209
  - ¿Los términos de dominio nuevos están en `CONTEXT.md` y las decisiones duras en ADRs?
210
210
  - ¿Quedan preguntas abiertas? Márcalas en `PLAN.md` §Pendientes; no las resuelvas tú.
211
211
 
212
- Si falta algo, vuelve al round correspondiente. Si todo está, entrega el spec y señala el siguiente paso: `xone-plan-builder` para descomponer en tareas, después `xone-project-generator` (app nueva) o `xone-development` (sobre existente), y `xone-review` para validar al final.
212
+ Si falta algo, vuelve al round correspondiente. Si todo está, entrega el spec y señala el siguiente paso: `xone-plan-builder` para descomponer en tareas, después `xone-project-generator` (app nueva) o `xone-development` (sobre existente), y el verificador del arnés (al cerrar cada turno) y device-controller en el aparato para validar.
213
213
 
214
214
  ## Disciplina durante la entrevista
215
215