--- id: "0120" title: "fn-orquestador: piloto verde end-to-end sobre chart_demo" status: pendiente type: chore domain: - meta - registry-quality scope: agent priority: alta depends: [] blocks: - "0121" - "0122" - "0123" related: - "0069" - "0068" created: 2026-05-18 updated: 2026-05-18 tags: [orquestador, autonomous, e2e_checks, piloto] --- # 0120 — Piloto verde de fn-orquestador ## Problema `fn-orquestador` (issue 0069) tiene spec completa con 11 reglas duras, worktree aislado, paths protegidos y watchdog. Pero `task_runs` esta vacio: ningun piloto verde documentado. Memoria del "piloto 1" registra contaminacion del main repo (origen de las reglas 9/10/11). Sin un task_run con `status=done` y PR mergeado, el comando `/autonomous-task` es promesa, no herramienta. Las olas 0121-0123 dependen de que esto funcione. ## Decision Ejecutar `/autonomous-task` sobre un target acotado y verificable: anadir bloque `e2e_checks` minimo al `app.md` de `chart_demo` y validar que `fn-analizador` corre la suite verde. Documentar el `task_run` entero (iteraciones, proposals, eventos) para auditar comportamiento real del orquestador. ### Target `apps/chart_demo/` — app C++ ImGui pequeña, sin `e2e_checks` declarado, con `--self-test` ya implementado por el framework `fn::run_app`. ### Bloque `e2e_checks` esperado ```yaml e2e_checks: - id: build cmd: "cmake --build cpp/build/windows --target chart_demo -j" timeout_s: 300 - id: binary_exists cmd: "test -f cpp/build/windows/apps/chart_demo/chart_demo.exe" timeout_s: 5 ``` (Inicialmente se planteo `--self-test` pero `fn::run_app` no parsea argv; el dry-run del orquestador 2026-05-18 lo detecto como R1 bloqueador. Sustituido por check estructural de binario construido. Implementar `--self-test` real es scope futuro fuera del piloto.) ## Tareas 1. Confirmar pre-condiciones del orquestador (migration 006, autonomous_protected_paths.json, gh auth, master limpio). 2. Lanzar `/autonomous-task 0120 --dry-run` para audit. 3. Lanzar `/autonomous-task 0120 --max-iterations 5 --max-minutes 30`. 4. Recoger output: `task_run_id`, branch `auto/0120-*`, log de iteraciones, proposals aplicadas/skipped, URL del PR draft. 5. Verificar `git -C /home/lucas/fn_registry status --short` igual a baseline (regla 11 sandbox breach). 6. Post-mortem: si fallo en alguna iteracion, anotar en seccion `## Hallazgos` y refinar `fn-orquestador/SKILL.md` o `autonomous_loop.md` si corresponde. ## Acceptance - [ ] `sqlite3 apps/deploy_server/operations.db "SELECT id, task_id, status FROM task_runs WHERE task_id LIKE '0120%'"` devuelve >=1 fila con `status=converged` (schema real: `task_id`, no `issue_id`). - [ ] `apps/chart_demo/app.md` contiene bloque `e2e_checks:` con al menos `build` + `binary_exists`. - [ ] `fn-analizador` corrida sobre `chart_demo` reporta `checks_pass=checks_total` (todo verde). - [ ] PR draft existe en Gitea con branch `auto/0120-*` apuntando a `master`. - [ ] `git -C /home/lucas/fn_registry status --short` antes/despues del piloto identico (excluyendo solo este `.md` cerrado). - [ ] Documento de post-mortem en `## Hallazgos` con: iteraciones totales, tiempo total, proposals creadas, decisiones del orquestador. ## DoD User-facing surface: - **Donde**: PR draft visible en Gitea `dataforge/fn_registry/pulls`. - **Latencia**: <30 min total. - **Como vuelve**: lectura del `task_run` via `mcp__registry__fn_doctor` o tab Monitor del registry_dashboard. - **Onboarding (1 parrafo)**: "Para lanzar orquestador autonomo sobre un issue trivial, ejecuta `/autonomous-task `. Tras converger, abre PR draft. Si falla, lee `task_runs.events_json` para reconstruir las decisiones." ## Hallazgos (Rellenar tras ejecucion)