---
id: "0116"
title: "skill_tree v2: reemplazar boton Claude fix por Launch workflow"
status: pendiente
type: feature
domain:
  - cpp-stack
  - agents
  - dev-loop
scope: app
priority: alta
depends:
  - "0113"
  - "0114"
blocks: []
related:
  - "0008"
  - "0109"
  - "0117"
  - "0118"
created: 2026-05-18
updated: 2026-05-18
tags: [skill-tree, agents, ui, feature-flag]
flow: "0008"
---

# 0116 — skill_tree v2: Launch workflow

## Problema

`apps/skill_tree/main.cpp::spawn_claude_terminal` abre `wt.exe new-tab wsl.exe -- bash -ic "claude --dangerously-skip-permissions"`. Side effects:

- Terminal externa fuera de la app (mala UX para agentes paralelos).
- Sin trazabilidad (run no persistido).
- Sin DoD ni evidencias.
- Imposible cancelar desde la UI.

Flow 0008 surface 2: usuario clica `Launch workflow` -> run trackeado en `agent_runner_api`, NO se abre terminal.

## Decision

Modificar `apps/skill_tree/main.cpp`:

1. **Eliminar** (o esconder detras de feature flag `legacy_claude_fix`) el boton `TI_TERMINAL_2 " Claude fix"`.
2. **Anadir** boton `TI_PLAY " Launch workflow"`:
   - POST `http://localhost:8486/api/runs` con `{issue_id, mode: "fix-issue"}`.
   - Captura `run_id` del response.
   - Toast `run_id=...` visible 3s.
   - Refresh panel `Timeline` (issue 0118).
3. Pasar al panel `DoD inspector` (issue 0117) si el run tiene `dod_evidence_schema` declarado.

### Feature flag `legacy_claude_fix`

`dev/feature_flags.json`:
```json
"legacy_claude_fix": {
  "enabled": false,
  "issue": "0116",
  "description": "Mostrar boton Claude fix viejo (terminal externa). Default OFF tras 0116",
  "added": "2026-05-18",
  "enabled_at": null
}
```

Logica: si flag ON, muestra ambos botones (Launch workflow + Claude fix legacy) durante rollback window. Si OFF (default), solo Launch workflow.

Eliminar flag + codigo legacy en issue separado tras 2 semanas estables.

## Criterios de aceptacion

- [ ] `apps/skill_tree/main.cpp` modificado: boton `Launch workflow` operativo.
- [ ] POST a `:8486/api/runs` usa `http_request_cpp_core` (0110) — NO popen inline.
- [ ] Feature flag `legacy_claude_fix` registrado en `dev/feature_flags.json` con `enabled: false`.
- [ ] Cuando flag OFF: `Claude fix` no se renderiza.
- [ ] Cuando flag ON: ambos botones aparecen para rollback.
- [ ] Toast `run_id=...` visible al lanzar.
- [ ] Si `agent_runner_api` no responde (`:8486` down): toast error + sugerencia `systemctl --user start agent_runner_api`.
- [ ] `uses_functions` actualizado en `apps/skill_tree/app.md`: anadir `http_request_cpp_core`.
- [ ] `e2e_checks` actualizados: smoke launch workflow con backend mock.
- [ ] Test manual: clic en nodo issue -> ve run en kanban_cpp `panel_agent_runs` y en skill_tree `Timeline` (0118).
- [ ] Version bump `apps/skill_tree/app.md::version` minor (`/version apps/skill_tree minor "..."`).

## Gotchas

- `spawn_claude_terminal` esta en main.cpp inline. NO eliminar la funcion en este issue — solo no llamarla cuando flag OFF. Eliminar en issue separado tras 2 semanas.
- HTTP POST sincrono bloquearia frame ImGui. Usar `std::async` o spawn thread + flag `pending_launch`. Renderizar spinner.
- Sin `agent_runner_api` corriendo, el boton es decorativo. Doctor check: `fn doctor services` debe mostrar `agent_runner_api active`.
- Si el issue NO tiene `dod_evidence_schema` declarado: run igualmente arranca, pero sin items DoD precreados.

## Out of scope

- Panel DoD inspector (0117).
- Panel Timeline (0118).
- Tab Calendar/Dashboard de skill_tree (otros sub-issues 0109*).
- Eliminacion definitiva de `spawn_claude_terminal` (issue separado tras rollback window).
