oficina-opencode 3.1.0 → 3.1.1

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 (69) hide show
  1. package/README.md +1 -1
  2. package/commands/oficina.md +7 -6
  3. package/dashboard/.dom-check.html +1257 -0
  4. package/dashboard/README-DASHBOARD.md +64 -0
  5. package/dashboard/assets/factory.css +1543 -0
  6. package/dashboard/assets/tokens.css +208 -0
  7. package/dashboard/build-kanban-data.mjs +279 -0
  8. package/dashboard/dashboard.css +753 -0
  9. package/dashboard/dashboard.html +121 -0
  10. package/dashboard/dashboard.js +610 -0
  11. package/dashboard/data/snapshot.json +883 -0
  12. package/dashboard/debate.html +134 -0
  13. package/dashboard/factory/build-snapshot.mjs +89 -0
  14. package/dashboard/factory/factory-app.js +1185 -0
  15. package/dashboard/factory/factory-core.js +541 -0
  16. package/dashboard/factory/snapshot.js +850 -0
  17. package/dashboard/factory.html +350 -0
  18. package/dashboard/kanban-data.json +671 -0
  19. package/dashboard/kanban-source.js +643 -0
  20. package/dashboard/kanban.check.mjs +454 -0
  21. package/dashboard/kanban.html +1257 -0
  22. package/dashboard/leadership.html +1008 -0
  23. package/dashboard/lib/debate-app.js +1149 -0
  24. package/dashboard/lib/debate-core.js +698 -0
  25. package/dashboard/lib/debate-data.js +163 -0
  26. package/dashboard/lib/debate-demo.js +110 -0
  27. package/dashboard/lib/debate.css +1155 -0
  28. package/dashboard/lib/leadership-model.js +946 -0
  29. package/dashboard/probe.mjs +35 -0
  30. package/dashboard/scripts/serve.mjs +122 -0
  31. package/dashboard/scripts/snapshot-data.mjs +93 -0
  32. package/dashboard/scripts/snapshot.mjs +28 -0
  33. package/dashboard/server.mjs +242 -0
  34. package/dashboard/shot.mjs +54 -0
  35. package/dashboard/shots/desktop-gates.png +0 -0
  36. package/dashboard/shots/desktop-light.png +0 -0
  37. package/dashboard/shots/desktop-real.png +0 -0
  38. package/dashboard/shots/mobile.png +0 -0
  39. package/dashboard/test/factory-core.test.mjs +244 -0
  40. package/dashboard/tests/debate-core.test.mjs +336 -0
  41. package/dashboard/tests/leadership-model.test.mjs +404 -0
  42. package/dist/cli.js +24 -0
  43. package/dist/cli.js.map +1 -1
  44. package/dist/core/dashboard.d.ts +33 -0
  45. package/dist/core/dashboard.d.ts.map +1 -0
  46. package/dist/core/dashboard.js +115 -0
  47. package/dist/core/dashboard.js.map +1 -0
  48. package/dist/core/dispatch.d.ts.map +1 -1
  49. package/dist/core/dispatch.js +11 -0
  50. package/dist/core/dispatch.js.map +1 -1
  51. package/dist/core/environment.d.ts +28 -0
  52. package/dist/core/environment.d.ts.map +1 -0
  53. package/dist/core/environment.js +80 -0
  54. package/dist/core/environment.js.map +1 -0
  55. package/dist/core/systemPrompt.d.ts.map +1 -1
  56. package/dist/core/systemPrompt.js +3 -0
  57. package/dist/core/systemPrompt.js.map +1 -1
  58. package/dist/tools/index.d.ts +9 -1
  59. package/dist/tools/index.d.ts.map +1 -1
  60. package/dist/tools/index.js +26 -22
  61. package/dist/tools/index.js.bak +972 -0
  62. package/dist/tools/index.js.map +1 -1
  63. package/dist/v2.d.ts +5 -0
  64. package/dist/v2.d.ts.map +1 -1
  65. package/dist/v2.js +57 -5
  66. package/dist/v2.js.bak +517 -0
  67. package/dist/v2.js.map +1 -1
  68. package/docs/QUE-ES.md +1 -1
  69. package/package.json +4 -1
@@ -0,0 +1,671 @@
1
+ {
2
+ "meta": {
3
+ "runId": "run-87fc0537",
4
+ "objective": "",
5
+ "status": "running",
6
+ "iteration": 0,
7
+ "updatedAt": "2026-10-29T17:39:24.040Z",
8
+ "generatedAt": "2026-10-29T17:42:05.317Z",
9
+ "generator": "dashboard/build-kanban-data.mjs"
10
+ },
11
+ "agents": {
12
+ "e-testing-api-tester": {
13
+ "id": "e-testing-api-tester",
14
+ "displayName": "API Tester",
15
+ "role": "testing-api-tester",
16
+ "state": "idle_available",
17
+ "currentCard": null
18
+ },
19
+ "e-design-ui-finish-gate-reviewer": {
20
+ "id": "e-design-ui-finish-gate-reviewer",
21
+ "displayName": "UI Finish-Gate Reviewer",
22
+ "role": "design-ui-finish-gate-reviewer",
23
+ "state": "idle_available",
24
+ "currentCard": null
25
+ },
26
+ "e-xr-immersive-developer": {
27
+ "id": "e-xr-immersive-developer",
28
+ "displayName": "XR Immersive Developer",
29
+ "role": "xr-immersive-developer",
30
+ "state": "working",
31
+ "currentCard": "T-07"
32
+ }
33
+ },
34
+ "cards": [
35
+ {
36
+ "id": "T-00",
37
+ "title": "Cablear el guard anti-gate-verde-vacío en el runner de gates",
38
+ "type": "bugfix",
39
+ "state": "done",
40
+ "owner": "e-testing-api-tester",
41
+ "reviewer": null,
42
+ "requiredCapabilities": [
43
+ "typescript",
44
+ "testing",
45
+ "vitest",
46
+ "node"
47
+ ],
48
+ "scope": {
49
+ "mayTouch": [
50
+ "src/core/gates.ts",
51
+ "src/core/office.ts",
52
+ "tests/gates.test.ts"
53
+ ],
54
+ "forbidden": [
55
+ "src/hooks/**",
56
+ "src/cli.ts",
57
+ "dist/**",
58
+ "node_modules/**",
59
+ ".oficina/**"
60
+ ]
61
+ },
62
+ "acceptance": [
63
+ "runTechnicalGates participa del guard: si la fase test sale con exit 0 pero testsActuallyRan es false, la fase test se reporta como not_run con reason explícita de gate verde vacío (no PASS silencioso ni silencioso en otros campos)",
64
+ "si testsActuallyRan es true (p. ej. conteo legible '5 passed' o 'Tests: 5'), la fase test sigue en PASS sin regresión",
65
+ "consolidate con ese resultado produce technicalOutcome fail/not_run (passed=false) y renderGate muestra el motivo de forma legible",
66
+ "pmOfficeOffice.runGates / flujo Office.runGates queda cableado al guard vía runTechnicalGates (sin duplicar lógica)",
67
+ "regresión cubierta por tests vitest nuevos en tests/gates.test.ts (existen ya tests de testsActuallyRan; se agregan los del cableado)",
68
+ "npm run typecheck sin errores y npm test todo en verde (las 456 existentes + nuevas)"
69
+ ],
70
+ "gate": "npm run typecheck && npm test (exit 0, 0 tests fallidos)",
71
+ "dependsOn": [],
72
+ "attempts": 1,
73
+ "rejections": 1,
74
+ "artifacts": ".oficina\\artifacts\\T-00",
75
+ "result": "APROBADO: REWORK 2 verificado (secuencia post-gate FAIL de secrecy): fixtures literales de secretos en tests/gates.test.ts neutralizados por concatenación — runtime byte-a-byte idéntico (evaluado directo: FAKE_SK_LIVE ≡ sk_live_abcdef123456, FAKE_AKIA ≡ AKIAIOSFODNN7EXAMPLE), los tests de comportamiento de runSecurityGate siguen detectando secretos reales (29/29 en el archivo). Scanner sin cambios (decisión correcta: no excluir tests/** — no oculta secretos reales). Escaneo real del revisor: tests/gates.test.ts → [], src/core/gates.ts → [], src/core/office.ts → [], repositorio entero → []. C-001 sigue resuelto (sin deltas en gates.ts/office.ts desde mi aprobación previa). Findings ≥80: ninguno. Verificación independiente: typecheck exit 0; npm test 27 archivos / 466 passed, exit 0. Review completo en .oficina/artifacts/T-00/review-rework2.md.",
76
+ "helpRequests": [],
77
+ "helpHops": 0
78
+ },
79
+ {
80
+ "id": "T-01",
81
+ "title": "Explorar estructura .oficina/ y definir schema de datos para el dashboard",
82
+ "type": "exploration",
83
+ "state": "todo",
84
+ "owner": "e-design-ui-finish-gate-reviewer",
85
+ "reviewer": "e-testing-api-tester",
86
+ "requiredCapabilities": [
87
+ "typescript",
88
+ "node",
89
+ "filesystem"
90
+ ],
91
+ "scope": {
92
+ "mayTouch": [
93
+ ".oficina/**"
94
+ ],
95
+ "forbidden": [
96
+ "src/**",
97
+ "dist/**",
98
+ "node_modules/**"
99
+ ]
100
+ },
101
+ "acceptance": [
102
+ "Mapear todos los archivos en .oficina/ (state.json, roster.json, bus/*, evidence/*, leases/*, context.md, cost.json)",
103
+ "Definir TypeScript interfaces para cada tipo de dato que el dashboard consumira",
104
+ "Identificar que archivos cambian en tiempo real y frecuencia de actualizacion",
105
+ "Documentar estructura de mensajes en bus/ y formato de envelopes"
106
+ ],
107
+ "gate": "TypeScript interfaces validadas y documentadas en artifacts/T-01/handoff.md",
108
+ "dependsOn": [],
109
+ "attempts": 0,
110
+ "rejections": 0,
111
+ "artifacts": ".oficina\\artifacts\\T-01",
112
+ "result": null,
113
+ "helpRequests": [],
114
+ "helpHops": 0
115
+ },
116
+ {
117
+ "id": "T-02",
118
+ "title": "Arquitectura del dashboard: single-page app con polling/WebSocket sobre archivos",
119
+ "type": "design",
120
+ "state": "todo",
121
+ "owner": "e-design-ui-finish-gate-reviewer",
122
+ "reviewer": "e-testing-api-tester",
123
+ "requiredCapabilities": [
124
+ "frontend-architecture",
125
+ "typescript",
126
+ "real-time-systems"
127
+ ],
128
+ "scope": {
129
+ "mayTouch": [
130
+ "dashboard/**"
131
+ ],
132
+ "forbidden": [
133
+ "src/**",
134
+ ".oficina/**",
135
+ "dist/**",
136
+ "node_modules/**"
137
+ ]
138
+ },
139
+ "acceptance": [
140
+ "Diseno de arquitectura: HTML unico + CSS + JS vanilla/Alpine.js sin build step",
141
+ "Estrategia de polling: intervalos adaptativos por tipo de dato (state.json: 500ms, bus: 1s, roster: 2s)",
142
+ "WebSocket fallback si se detecta servidor (opcional, documentar)",
143
+ "Tema oscuro/claro con design tokens consistentes (OKLCH)",
144
+ "Responsive: desktop paneles lado a lado, mobile tabs/accordion",
145
+ "Accesibilidad: ARIA live regions, keyboard navigation, WCAG AA contrast"
146
+ ],
147
+ "gate": "Architecture decision document en artifacts/T-02/handoff.md con decisiones y trade-offs",
148
+ "dependsOn": [
149
+ "T-01"
150
+ ],
151
+ "attempts": 0,
152
+ "rejections": 0,
153
+ "artifacts": ".oficina\\artifacts\\T-02",
154
+ "result": null,
155
+ "helpRequests": [],
156
+ "helpHops": 0
157
+ },
158
+ {
159
+ "id": "T-03",
160
+ "title": "Implementar mesa visual en vivo (panel principal)",
161
+ "type": "implementation",
162
+ "state": "todo",
163
+ "owner": "e-design-ui-finish-gate-reviewer",
164
+ "reviewer": "e-testing-api-tester",
165
+ "requiredCapabilities": [
166
+ "typescript",
167
+ "frontend",
168
+ "svg-canvas",
169
+ "real-time-ui"
170
+ ],
171
+ "scope": {
172
+ "mayTouch": [
173
+ "dashboard/**"
174
+ ],
175
+ "forbidden": [
176
+ "src/**",
177
+ ".oficina/**",
178
+ "dist/**",
179
+ "node_modules/**"
180
+ ]
181
+ },
182
+ "acceptance": [
183
+ "Panel que lee roster.json y state.json y muestra agentes con estado visual (working/idle/no-heartbeat/dead)",
184
+ "Cards sin owner visibles con badge de 'unassigned'",
185
+ "Avatares de agentes con iniciales, color por rol, indicador de heartbeat (pulse animation)",
186
+ "Tooltip con capabilities, currentCard, idleSince, helpGiven/Received",
187
+ "Actualizacion en tiempo real via polling (500ms)",
188
+ "Keyboard navigation entre agentes, Enter para ver detalle"
189
+ ],
190
+ "gate": "dashboard/mesa.html funcional + npm run typecheck + npm test pass",
191
+ "dependsOn": [
192
+ "T-02"
193
+ ],
194
+ "attempts": 0,
195
+ "rejections": 0,
196
+ "artifacts": ".oficina\\artifacts\\T-03",
197
+ "result": null,
198
+ "helpRequests": [],
199
+ "helpHops": 0
200
+ },
201
+ {
202
+ "id": "T-04",
203
+ "title": "Implementar bus de mensajes visible con threading y prioridades",
204
+ "type": "implementation",
205
+ "state": "todo",
206
+ "owner": "e-design-ui-finish-gate-reviewer",
207
+ "reviewer": "e-testing-api-tester",
208
+ "requiredCapabilities": [
209
+ "typescript",
210
+ "frontend",
211
+ "data-visualization",
212
+ "real-time-ui"
213
+ ],
214
+ "scope": {
215
+ "mayTouch": [
216
+ "dashboard/**"
217
+ ],
218
+ "forbidden": [
219
+ "src/**",
220
+ ".oficina/**",
221
+ "dist/**",
222
+ "node_modules/**"
223
+ ]
224
+ },
225
+ "acceptance": [
226
+ "Panel que lee bus/peer/ y canales de coordinadores (coord-command, coord-arch, coord-flow)",
227
+ "Visualizacion tipo sequence diagram: flechas entre avatares, colores por prioridad (critical=red, high=orange, normal=blue, low=gray)",
228
+ "Threading visual: inReplyTo agrupa mensajes en hilos colapsables/expandibles",
229
+ "Filtros por kind (HELP_REQUEST, HELP_ACCEPT, CLAIM, RELEASE, SPAWN_REQUEST, etc.)",
230
+ "Timeline con timestamps relativos, auto-scroll opcional",
231
+ "Click en mensaje muestra detalle completo (body, ttl, hops, idempotency_key)"
232
+ ],
233
+ "gate": "dashboard/bus.html funcional + typecheck + tests pass",
234
+ "dependsOn": [
235
+ "T-02"
236
+ ],
237
+ "attempts": 0,
238
+ "rejections": 0,
239
+ "artifacts": ".oficina\\artifacts\\T-04",
240
+ "result": null,
241
+ "helpRequests": [],
242
+ "helpHops": 0
243
+ },
244
+ {
245
+ "id": "T-05",
246
+ "title": "Implementar panel de debate/brainstorming trazable (HELP_REQUEST broadcast + respuestas)",
247
+ "type": "implementation",
248
+ "state": "todo",
249
+ "owner": "e-xr-immersive-developer",
250
+ "reviewer": null,
251
+ "requiredCapabilities": [
252
+ "typescript",
253
+ "frontend",
254
+ "chat-ui",
255
+ "threading"
256
+ ],
257
+ "scope": {
258
+ "mayTouch": [
259
+ "dashboard/**"
260
+ ],
261
+ "forbidden": [
262
+ "src/**",
263
+ ".oficina/**",
264
+ "dist/**",
265
+ "node_modules/**"
266
+ ]
267
+ },
268
+ "acceptance": [
269
+ "Deteccion automatica de HELP_REQUEST con to:['*'] (broadcast)",
270
+ "Vista tipo chat: burbujas con avatar, timestamp, agente, expandible para ver body completo",
271
+ "Respuestas (HELP_ACCEPT, HELP_DECLINE, HELP_PARTIAL, HELP_QUESTION) anidadas bajo el request",
272
+ "Indicador visual de estado: pending -> accepted/declined/partial -> completed",
273
+ "Colapso/expansion de hilos completos, contador de respuestas",
274
+ "ARIA live region para anuncios de nuevos mensajes en hilos abiertos"
275
+ ],
276
+ "gate": "dashboard/debate.html funcional + typecheck + tests pass",
277
+ "dependsOn": [
278
+ "T-02"
279
+ ],
280
+ "attempts": 0,
281
+ "rejections": 0,
282
+ "artifacts": ".oficina\\artifacts\\T-05",
283
+ "result": null,
284
+ "helpRequests": [],
285
+ "helpHops": 0
286
+ },
287
+ {
288
+ "id": "T-06",
289
+ "title": "Implementar panel de intervencion del jefe (Commander/Integrator/Architect decisions)",
290
+ "type": "implementation",
291
+ "state": "todo",
292
+ "owner": "e-xr-immersive-developer",
293
+ "reviewer": null,
294
+ "requiredCapabilities": [
295
+ "typescript",
296
+ "frontend",
297
+ "decision-tracking"
298
+ ],
299
+ "scope": {
300
+ "mayTouch": [
301
+ "dashboard/**"
302
+ ],
303
+ "forbidden": [
304
+ "src/**",
305
+ ".oficina/**",
306
+ "dist/**",
307
+ "node_modules/**"
308
+ ]
309
+ },
310
+ "acceptance": [
311
+ "Tres secciones: Commander (scope/prioridades/escalations), Integrator (routing/leases/gates/deadlocks), Architect (tech decisions/patterns/contracts)",
312
+ "Lee decisions de state.json + mensajes en canales de coordinadores",
313
+ "Cada decision: timestamp, actor, cardId, decision, razon, siguiente accion",
314
+ "Filtro por coordinador, por card, por tipo de decision",
315
+ "Enlace a card afectada y a artifacts correspondientes"
316
+ ],
317
+ "gate": "dashboard/leadership.html funcional + typecheck + tests pass",
318
+ "dependsOn": [
319
+ "T-02"
320
+ ],
321
+ "attempts": 0,
322
+ "rejections": 0,
323
+ "artifacts": ".oficina\\artifacts\\T-06",
324
+ "result": null,
325
+ "helpRequests": [],
326
+ "helpHops": 0
327
+ },
328
+ {
329
+ "id": "T-07",
330
+ "title": "Implementar Kanban visual de cards con drag-drop y acceptance criteria",
331
+ "type": "implementation",
332
+ "state": "in_progress",
333
+ "owner": "e-xr-immersive-developer",
334
+ "reviewer": null,
335
+ "requiredCapabilities": [
336
+ "typescript",
337
+ "frontend",
338
+ "kanban",
339
+ "drag-drop"
340
+ ],
341
+ "scope": {
342
+ "mayTouch": [
343
+ "dashboard/**"
344
+ ],
345
+ "forbidden": [
346
+ "src/**",
347
+ ".oficina/**",
348
+ "dist/**",
349
+ "node_modules/**"
350
+ ]
351
+ },
352
+ "acceptance": [
353
+ "Columnas: TODO, IN_PROGRESS, REVIEW, DONE, REWORK, BLOCKED, ESCALATED",
354
+ "Cards muestran: id, titulo, owner avatar, reviewer avatar, rejection count, acceptance checklist",
355
+ "Drag-drop opcional entre columnas (solo visual, no persiste - read-only dashboard)",
356
+ "Click en card abre modal con detalle completo: scope, acceptance, gate, artifacts, evidence links",
357
+ "Badges de estado gate: PASS/FAIL/NOT_RUN con colores",
358
+ "Filtro por owner, por tipo, por estado"
359
+ ],
360
+ "gate": "dashboard/kanban.html funcional + typecheck + tests pass",
361
+ "dependsOn": [
362
+ "T-02"
363
+ ],
364
+ "attempts": 0,
365
+ "rejections": 0,
366
+ "artifacts": ".oficina\\artifacts\\T-07",
367
+ "result": null,
368
+ "helpRequests": [],
369
+ "helpHops": 0
370
+ },
371
+ {
372
+ "id": "T-08",
373
+ "title": "Implementar animacion de Factory creando agentes nuevos",
374
+ "type": "implementation",
375
+ "state": "todo",
376
+ "owner": "e-xr-immersive-developer",
377
+ "reviewer": null,
378
+ "requiredCapabilities": [
379
+ "typescript",
380
+ "frontend",
381
+ "animation",
382
+ "svg-canvas"
383
+ ],
384
+ "scope": {
385
+ "mayTouch": [
386
+ "dashboard/**"
387
+ ],
388
+ "forbidden": [
389
+ "src/**",
390
+ ".oficina/**",
391
+ "dist/**",
392
+ "node_modules/**"
393
+ ]
394
+ },
395
+ "acceptance": [
396
+ "Deteccion: cuando hay card sin match en catalogo (cobertura < 60% en roster/state)",
397
+ "Animacion secuencial: Factory creando agente... -> archivo .md apareciendo en .opencode/agents/ -> entrada al catalogo dinamico -> match en proxima card",
398
+ "Visualizacion: progress steps con checkmarks, archivo escribiendose con cursor parpadeante",
399
+ "Toast/notification cuando factory completa y agente aparece en roster",
400
+ "Click en notificacion abre ficha del agente fabricado"
401
+ ],
402
+ "gate": "dashboard/factory.html funcional + typecheck + tests pass",
403
+ "dependsOn": [
404
+ "T-02"
405
+ ],
406
+ "attempts": 0,
407
+ "rejections": 0,
408
+ "artifacts": ".oficina\\artifacts\\T-08",
409
+ "result": null,
410
+ "helpRequests": [],
411
+ "helpHops": 0
412
+ },
413
+ {
414
+ "id": "T-09",
415
+ "title": "Implementar panel lateral de Gates y Evidencia con spinners y resultados",
416
+ "type": "implementation",
417
+ "state": "todo",
418
+ "owner": "e-testing-api-tester",
419
+ "reviewer": "e-design-ui-finish-gate-reviewer",
420
+ "requiredCapabilities": [
421
+ "typescript",
422
+ "frontend",
423
+ "real-time-ui",
424
+ "testing"
425
+ ],
426
+ "scope": {
427
+ "mayTouch": [
428
+ "dashboard/**"
429
+ ],
430
+ "forbidden": [
431
+ "src/**",
432
+ ".oficina/**",
433
+ "dist/**",
434
+ "node_modules/**"
435
+ ]
436
+ },
437
+ "acceptance": [
438
+ "Panel lateral fijo (desktop) / bottom sheet (mobile) mostrando 7 gates",
439
+ "Fases: Build, Type check, Lint, Tests+coverage, Security grep, Diff review, Requisitos",
440
+ "Spinners animados mientras corren, iconos PASS/FAIL/NOT_RUN/N/A al terminar",
441
+ "Click en fase muestra output real (pega de evidence.md/gates.md)",
442
+ "Enlace a evidence.md y handoff.md de la card",
443
+ "Gate 7 (Requisitos): lista acceptance criteria con check/cross y link a evidencia registrada"
444
+ ],
445
+ "gate": "dashboard/gates.html funcional + typecheck + tests pass",
446
+ "dependsOn": [
447
+ "T-02"
448
+ ],
449
+ "attempts": 0,
450
+ "rejections": 0,
451
+ "artifacts": ".oficina\\artifacts\\T-09",
452
+ "result": null,
453
+ "helpRequests": [],
454
+ "helpHops": 0
455
+ },
456
+ {
457
+ "id": "T-10",
458
+ "title": "Integrar todo en dashboard.html unico + README-DASHBOARD.md",
459
+ "type": "implementation",
460
+ "state": "todo",
461
+ "owner": "e-testing-api-tester",
462
+ "reviewer": "e-design-ui-finish-gate-reviewer",
463
+ "requiredCapabilities": [
464
+ "typescript",
465
+ "frontend",
466
+ "integration",
467
+ "documentation"
468
+ ],
469
+ "scope": {
470
+ "mayTouch": [
471
+ "dashboard/**"
472
+ ],
473
+ "forbidden": [
474
+ "src/**",
475
+ ".oficina/**",
476
+ "dist/**",
477
+ "node_modules/**"
478
+ ]
479
+ },
480
+ "acceptance": [
481
+ "dashboard.html unico con todos los paneles (layout: header + sidebar tabs + main area)",
482
+ "Navegacion por tabs: Mesa | Bus | Debate | Jefe | Kanban | Factory | Gates",
483
+ "Persistencia de tab activo en localStorage",
484
+ "Tema oscuro/claro con toggle persistido",
485
+ "Atajos de teclado: 1-7 tabs, Espacio pause/resume polling, R refresh, ? ayuda",
486
+ "README-DASHBOARD.md con: como usarlo, que muestra cada panel, atajos, troubleshooting"
487
+ ],
488
+ "gate": "dashboard.html abre en browser file:// + typecheck + tests pass + README completo",
489
+ "dependsOn": [
490
+ "T-03",
491
+ "T-04",
492
+ "T-05",
493
+ "T-06",
494
+ "T-07",
495
+ "T-08",
496
+ "T-09"
497
+ ],
498
+ "attempts": 0,
499
+ "rejections": 0,
500
+ "artifacts": ".oficina\\artifacts\\T-10",
501
+ "result": null,
502
+ "helpRequests": [],
503
+ "helpHops": 0
504
+ }
505
+ ],
506
+ "gates": {
507
+ "T-00": {
508
+ "ranAt": "2026-10-29T03:28:55.630Z",
509
+ "technical": [
510
+ {
511
+ "phase": "build",
512
+ "command": "npm run build",
513
+ "outcome": "pass",
514
+ "detail": "exit 0 en 11254ms",
515
+ "reason": ""
516
+ },
517
+ {
518
+ "phase": "typecheck",
519
+ "command": "npm run typecheck",
520
+ "outcome": "pass",
521
+ "detail": "exit 0 en 10481ms",
522
+ "reason": ""
523
+ },
524
+ {
525
+ "phase": "lint",
526
+ "command": null,
527
+ "outcome": "na",
528
+ "detail": "el proyecto no define script `lint`",
529
+ "reason": ""
530
+ },
531
+ {
532
+ "phase": "test",
533
+ "command": "npm run test",
534
+ "outcome": "pass",
535
+ "detail": "exit 0 en 38518ms",
536
+ "reason": ""
537
+ },
538
+ {
539
+ "phase": "secrecy",
540
+ "command": "scan:secretos",
541
+ "outcome": "pass",
542
+ "detail": "sin secretos en el scope",
543
+ "reason": ""
544
+ },
545
+ {
546
+ "phase": "diff",
547
+ "command": "git diff --stat HEAD",
548
+ "outcome": "pass",
549
+ "detail": "exit 0 en 448ms",
550
+ "reason": ""
551
+ }
552
+ ],
553
+ "security": [
554
+ {
555
+ "phase": "secrecy",
556
+ "command": "scan:credenciales asignadas",
557
+ "outcome": "pass",
558
+ "detail": "credenciales asignadas — limpio",
559
+ "reason": ""
560
+ },
561
+ {
562
+ "phase": "secrecy",
563
+ "command": "scan:claves de cloud",
564
+ "outcome": "pass",
565
+ "detail": "claves de cloud — limpio",
566
+ "reason": ""
567
+ },
568
+ {
569
+ "phase": "secrecy",
570
+ "command": "scan:tokens de provider",
571
+ "outcome": "pass",
572
+ "detail": "tokens de provider — limpio",
573
+ "reason": ""
574
+ }
575
+ ],
576
+ "requirements": [],
577
+ "technicalOutcome": "pass",
578
+ "securityOutcome": "pass",
579
+ "requirementsOutcome": "not_run",
580
+ "verdict": "pass"
581
+ }
582
+ },
583
+ "evidence": {
584
+ "T-00": [
585
+ {
586
+ "id": "ev-t-00-0-test-tests-gates-test-ts-guard-anti-gate-verde-vacio-",
587
+ "cardId": "T-00",
588
+ "requirement": "runTechnicalGates participa del guard: si la fase test sale con exit 0 pero testsActuallyRan es false, la fase test se reporta como not_run con reason explícita de gate verde vacío (no PASS silencioso ni silencioso en otros campos)",
589
+ "requirementIndex": 0,
590
+ "mandatory": false,
591
+ "kind": "test",
592
+ "level": 2,
593
+ "ref": "tests/gates.test.ts > Guard anti-gate-verde-vacío > degrada a not_run la fase test que sale 0 sin tests",
594
+ "note": "runTechnicalGates marca la fase test como not_run con reason EMPTY_TEST_GATE_REASON cuando exit 0 y no hay conteo; conserva exitCode 0 y output real.",
595
+ "recordedAt": "1970-01-01T00:00:00.000Z",
596
+ "recordedBy": "e-testing-api-tester",
597
+ "passed": true
598
+ },
599
+ {
600
+ "id": "ev-t-00-1-test-tests-gates-test-ts-guard-anti-gate-verde-vacio-",
601
+ "cardId": "T-00",
602
+ "requirement": "si testsActuallyRan es true (p. ej. conteo legible '5 passed' o 'Tests: 5'), la fase test sigue en PASS sin regresión",
603
+ "requirementIndex": 1,
604
+ "mandatory": false,
605
+ "kind": "test",
606
+ "level": 2,
607
+ "ref": "tests/gates.test.ts > Guard anti-gate-verde-vacío > no degrada cuando el conteo es legible ('5 passed' / 'Tests: 5')",
608
+ "note": "Con conteo legible la fase test sigue en PASS; sin regresión.",
609
+ "recordedAt": "1970-01-01T00:00:00.000Z",
610
+ "recordedBy": "e-testing-api-tester",
611
+ "passed": true
612
+ },
613
+ {
614
+ "id": "ev-t-00-2-test-tests-gates-test-ts-guard-anti-gate-verde-vacio-",
615
+ "cardId": "T-00",
616
+ "requirement": "consolidate con ese resultado produce technicalOutcome fail/not_run (passed=false) y renderGate muestra el motivo de forma legible",
617
+ "requirementIndex": 2,
618
+ "mandatory": false,
619
+ "kind": "test",
620
+ "level": 2,
621
+ "ref": "tests/gates.test.ts > Guard anti-gate-verde-vacío > consolidate propaga not_run / renderGate muestra el motivo",
622
+ "note": "consolidate devuelve technicalOutcome=not_run y passed=false; renderGate incluye columna Motivo con el texto del gate verde vacío.",
623
+ "recordedAt": "1970-01-01T00:00:00.000Z",
624
+ "recordedBy": "e-testing-api-tester",
625
+ "passed": true
626
+ },
627
+ {
628
+ "id": "ev-t-00-3-test-tests-gates-test-ts-guard-anti-gate-verde-vacio-",
629
+ "cardId": "T-00",
630
+ "requirement": "pmOfficeOffice.runGates / flujo Office.runGates queda cableado al guard vía runTechnicalGates (sin duplicar lógica)",
631
+ "requirementIndex": 3,
632
+ "mandatory": false,
633
+ "kind": "test",
634
+ "level": 2,
635
+ "ref": "tests/gates.test.ts > Guard anti-gate-verde-vacío > Office.runGates hereda el guard vía runTechnicalGates",
636
+ "note": "Office.runGates no reimplementa el guard: delega en runTechnicalGates; gates.md en disco muestra el motivo.",
637
+ "recordedAt": "1970-01-01T00:00:00.000Z",
638
+ "recordedBy": "e-testing-api-tester",
639
+ "passed": true
640
+ },
641
+ {
642
+ "id": "ev-t-00-4-artifact-tests-gates-test-ts",
643
+ "cardId": "T-00",
644
+ "requirement": "regresión cubierta por tests vitest nuevos en tests/gates.test.ts (existen ya tests de testsActuallyRan; se agregan los del cableado)",
645
+ "requirementIndex": 4,
646
+ "mandatory": false,
647
+ "kind": "artifact",
648
+ "level": 2,
649
+ "ref": "tests/gates.test.ts",
650
+ "note": "8 tests vitest nuevos en el describe 'Guard anti-gate-verde-vacío' (27 en el archivo).",
651
+ "recordedAt": "1970-01-01T00:00:00.000Z",
652
+ "recordedBy": "e-testing-api-tester",
653
+ "passed": true
654
+ },
655
+ {
656
+ "id": "ev-t-00-5-test-npm-run-typecheck-npm-test",
657
+ "cardId": "T-00",
658
+ "requirement": "npm run typecheck sin errores y npm test todo en verde (las 456 existentes + nuevas)",
659
+ "requirementIndex": 5,
660
+ "mandatory": false,
661
+ "kind": "test",
662
+ "level": 2,
663
+ "ref": "npm run typecheck && npm test",
664
+ "note": "typecheck exit 0; vitest 27 archivos / 464 tests en verde, 0 fallidos.",
665
+ "recordedAt": "1970-01-01T00:00:00.000Z",
666
+ "recordedBy": "e-testing-api-tester",
667
+ "passed": true
668
+ }
669
+ ]
670
+ }
671
+ }