From ef67cd2d15be9e88b4cabc93b8d99441fd0b6f24 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Tue, 19 May 2026 00:19:30 +0200 Subject: [PATCH] docs(0120): hallazgos piloto + regla sub-repos/Gitea API en autonomous_loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Piloto 0120 convergio en 2 iter (2m28s). PR creado en dataforge/chart_demo/pulls/1 (no en dataforge/fn_registry — sub-repo). Anadido a autonomous_loop.md: - Seccion "Sub-repos vs worktree padre": orquestador opera en sub-repo cuando issue toca apps/, projects/*/apps/, cpp/apps/ o analysis/. - Seccion "Gitea API vs gh": gh auth es smoke, real es curl + pass token. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/rules/autonomous_loop.md | 29 ++++++++++++++++++- dev/issues/0120-orquestador-piloto-verde.md | 31 ++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/.claude/rules/autonomous_loop.md b/.claude/rules/autonomous_loop.md index 4ffcc330..a3995ffc 100644 --- a/.claude/rules/autonomous_loop.md +++ b/.claude/rules/autonomous_loop.md @@ -5,7 +5,7 @@ ### Cuando se invoca - Skill `/autonomous-task ` (humano lanza explicitamente). -- Cron / Dagu (planificable; no implementado por defecto). +- Cron / dag_engine (`schedule:` en YAML; planificable, no implementado por defecto). - NO se invoca como reaccion a hooks ni a fallos de tests "en caliente". Siempre tarea explicita. ### Reglas duras @@ -24,6 +24,33 @@ 9. **NUNCA paths absolutos fuera del worktree**. Refuerzo del piloto 1 (2026-05-15): el orquestador uso `/home/lucas/fn_registry/bash/functions/...` para fixear hooks bash y contamino el repo principal. Solucion correcta: fix vive solo en el worktree. Post-cada-iteracion: `git -C status --short` debe permanecer igual al baseline; cualquier diff = `status=sandbox_breach` -> ABORT. 10. **Pre-commit hooks compartidos**. Worktrees comparten `.git/hooks/` con main. Si un hook llama scripts via path absoluto, ejecutara la version de main. Si el hook bloquea progreso por bug en main: aplica el fix EN EL WORKTREE (commit en auto/*); si el bug del hook excede scope: `git commit --no-verify` para ESE commit con `task_runs.events_json[].decision="skip_hook"` + razon. NO editar main. +### Sub-repos vs worktree padre + +Cuando el issue toca `app.md` o codigo dentro de `apps//`, `projects/

/apps//`, `cpp/apps//`, o `analysis//` — estos directorios son **sub-repos Gitea independientes** y estan `.gitignore`d en el repo padre `fn_registry` (regla `apps_subrepo.md`). El orquestador: + +- **Crea worktree padre** `auto/` en `/tmp/fn_orq__/` por protocolo, **pero no escribe alli** porque los cambios no se versionan en el padre. +- **Opera DIRECTAMENTE en el sub-repo** de la app/analysis target. Branch `auto/-` se crea dentro de `apps//.git`, NO en el padre. +- **PR draft sale al sub-repo** en `dataforge/` (NO a `dataforge/fn_registry`). Humano revisa+mergea en el sub-repo. +- **Worktree padre queda vacio** y se limpia normal con `git worktree remove` al terminar. + +Validado en piloto 0120 (`add_e2e_check` sobre `chart_demo`): PR creado en `dataforge/chart_demo/pulls/1`, sanity check del main repo `fn_registry` confirmo cero contaminacion. + +Si el issue toca AMBOS lados (codigo del registry padre + app de sub-repo), el orquestador commitea separado: cambios del padre en `auto/` (worktree padre), cambios de la app en `auto/-` (sub-repo). Dos PRs draft. Humano coordina merge. + +### Gitea API vs `gh` + +Pre-condicion `gh auth status` es smoke check (target github.com). Mecanismo real de PR es `curl` a Gitea API: + +```bash +GITEA_TOKEN=$(pass gitea/dataforge-git-token | head -n1) +curl -X POST -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"title":"...","head":"auto/-","base":"master","draft":true,"body":"..."}' \ + "https://gitea-.../api/v1/repos/dataforge//pulls" +``` + +Validado en pilotos 0076 y 0120. + ### Estructura task_run Migration `fn_operations/migrations/006_task_runs.sql`. Campos minimos: `id`, `issue_id`, `branch`, `started_at`, `finished_at`, `status` (`running|done|failed|aborted_protected_path|stalled|timeout`), `iterations`, `checks_pass`, `checks_fail`, `proposals_applied_json`, `proposals_skipped_json`, `events_json`, `final_diff_sha`. diff --git a/dev/issues/0120-orquestador-piloto-verde.md b/dev/issues/0120-orquestador-piloto-verde.md index 645f3fa0..3273c8b1 100644 --- a/dev/issues/0120-orquestador-piloto-verde.md +++ b/dev/issues/0120-orquestador-piloto-verde.md @@ -77,4 +77,33 @@ User-facing surface: ## Hallazgos -(Rellenar tras ejecucion) +Ejecucion: 2026-05-18, `task_b3069559f34415c3`. + +### Resultado + +- status: **converged** +- iteraciones: 2/5 (CONSTRUIR + ANALIZAR, sin necesidad de MEJORAR) +- duracion: 2m 28s / 30min +- branch: `auto/0120-chart-demo-e2e` (en sub-repo `dataforge/chart_demo`, NO en `fn_registry`) +- PR draft: https://gitea-dgg044oo04woo4ggcsws4gk0.organic-machine.com/dataforge/chart_demo/pulls/1 +- e2e_run: `e2e_61557e2ba1cc67ac` checks_pass=2 checks_total=2 (build 6742ms + binary_exists 1ms) +- sanity check regla 11: baseline `git status --short` identico a post-run (sin contaminacion del main repo) + +### Hallazgos + +1. **Arquitectura sub-repo**: para issues `add_e2e_check` que editan `app.md`, el orquestador opera DIRECTAMENTE en el sub-repo Gitea de la app target (`dataforge/chart_demo`), NO en el worktree del repo padre. Razon: `apps/*/` esta gitignored en `fn_registry` (regla `apps_subrepo`). El worktree padre se crea por protocolo pero queda sin uso. Implicacion: PR draft sale al sub-repo, no al repo padre — humano revisa+mergea en el sub-repo. + +2. **R3 (Gitea API) confirmado**: orquestador usa `curl + pass gitea/dataforge-git-token` para crear PR. NO usa `gh pr create`. Documentar en `autonomous_loop.md` que la pre-condicion `gh auth status` es smoke check; mecanismo real es Gitea API. + +3. **R4 (schema task_runs) confirmado**: campos reales `id, task_id, started_at, finished_at, status, iterations, last_phase, last_run_id, branch, worktree_path, pr_url, progress_json`. Status `converged` (no `done` como dice la spec antigua de `autonomous_loop.md`). Acceptance del issue debe usar `task_id LIKE '0120%'` y `status='converged'`. + +4. **Convergencia rapida**: 2 iter sin MEJORAR. Check `binary_exists` paso porque `chart_demo.exe` ya existia en `cpp/build/windows/` (build incremental cmake reutiliza objetos). Para apps sin binario previo, se esperaria 1 iter extra de build real. + +5. **Paths protegidos respetados**: ni `.claude/`, ni `dev/issues/`, ni `.env*` tocados durante la run. Regla 8 verde. + +### Siguientes pasos + +- [ ] Revisar PR `dataforge/chart_demo/pulls/1` (humano). +- [ ] Mergear PR a `master` del sub-repo cuando aprobado. +- [ ] Cerrar este issue: `mv dev/issues/0120-orquestador-piloto-verde.md dev/issues/completed/`. +- [ ] Lanzar `/autonomous-task 0121` (desbloqueado).