621e8895c9
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
158 lines
6.3 KiB
Markdown
158 lines
6.3 KiB
Markdown
---
|
|
name: <slug>
|
|
id: NNNN
|
|
status: pending
|
|
created: YYYY-MM-DD
|
|
updated: YYYY-MM-DD
|
|
priority: medium # low | medium | high
|
|
risk: low # low | medium | high (sensibilidad datos)
|
|
related_issues: []
|
|
apps: [] # apps tocadas — usadas por /flow list --app
|
|
projects: [] # projects relacionados
|
|
vaults: [] # vaults sink/source
|
|
capability_groups: [] # extractor, transformer, sink, navegator, ...
|
|
trigger: manual # manual | cron | webhook
|
|
schedule: "" # cron expr si trigger=cron
|
|
expected_runtime_s: 60
|
|
tags: []
|
|
---
|
|
|
|
## Goal
|
|
|
|
Una frase: que prueba este flow del sistema multi-app.
|
|
|
|
## Pre-requisitos
|
|
|
|
- Lista de cosas manuales/externas que deben estar listas antes (Chrome logueado, vault montado, service corriendo, token en `pass`, ...).
|
|
|
|
## Funciones del registry recomendadas
|
|
|
|
Tabla rol -> funcion candidata (ver `AGENT_GUIDE.md` para discovery). Si falta una pieza: marca `FALTA: crear <id>` con prompt sugerido para fn-constructor.
|
|
|
|
| Rol | Funcion candidata | Estado |
|
|
|---|---|---|
|
|
| Extractor | `<id>` | OK / FALTA |
|
|
| Validator | `<id>` | OK / FALTA |
|
|
| Transformer | `<id>` | OK / FALTA |
|
|
| Sink | `<id>` | OK / FALTA |
|
|
| Scheduler | DAG `<path>.yaml` / webhook / manual | OK / FALTA |
|
|
| Notify | `<id>` | OK / FALTA |
|
|
|
|
## Apps tocadas
|
|
|
|
- `<app>` (rol en el flow)
|
|
|
|
## Projects relacionados
|
|
|
|
- `<project>` (razon)
|
|
|
|
## Vaults / storage
|
|
|
|
- `<vault o BD>` (origin / sink)
|
|
|
|
## Capability groups consultados
|
|
|
|
- `<group>` (ver `docs/capabilities/<group>.md`)
|
|
|
|
## Flow
|
|
|
|
Pasos numerados. Cada paso puede ser:
|
|
- texto libre (manual)
|
|
- `function: <id>` (registry function)
|
|
- `cmd: <bash>`
|
|
- `js: <expression>` (en tab Chrome)
|
|
- `dag: <name>` (DAG en `apps/dag_engine/dags_migrated/`)
|
|
|
|
1. Paso 1.
|
|
2. Paso 2.
|
|
|
|
## Acceptance
|
|
|
|
Checks task-level del flow — verifican que el flow CORRE una vez. Pueden quedar `[ ]` mientras iteras. NO sustituyen a la DoD.
|
|
|
|
- [ ] Criterio 1.
|
|
- [ ] Criterio 2.
|
|
|
|
## Definition of Done
|
|
|
|
**Filosofia triada (ver `.claude/rules/dod_quality.md`):** DoD no es checkbox que se marca a mano. Cada item debe llevar **evidencia ejecutable** (comando, e2e_check, screenshot link, dashboard URL con datos frescos, log query). Si no puedes probarlo, no es DoD: es deseo. Las 3 capas son obligatorias.
|
|
|
|
### Mecanica (pre-requisito, NO sustituye al resto)
|
|
|
|
Construir verde no es estar hecho. Es la base para empezar a probar.
|
|
|
|
- [ ] **Build verde** (`cmd: <comando build>`).
|
|
- [ ] **Tests unitarios verdes** (`cmd: <comando test>`, listar IDs/paths).
|
|
- [ ] **`fn index` limpio** (sin warnings nuevos).
|
|
- [ ] **`fn doctor` verde** en artefactos tocados (`cmd: ./fn doctor --json | jq ...`).
|
|
- [ ] **`uses_functions` auditado** (sin drift en `app.md` vs imports reales).
|
|
|
|
### Cobertura de comportamiento
|
|
|
|
Cada escenario debe tener una prueba ejecutable con assert real (no smoke "no peto"). Anadir tantas filas como casos relevantes — golden path + edge cases + error paths.
|
|
|
|
| Escenario | Tipo de prueba | Comando / evidencia | Resultado esperado |
|
|
|---|---|---|---|
|
|
| Golden path: <descripcion> | unit / e2e / manual | `<cmd>` | <output concreto, no "ok"> |
|
|
| Edge case 1: <input limite> | unit / e2e | `<cmd>` | <comportamiento concreto> |
|
|
| Edge case 2: <estado raro> | unit / e2e | `<cmd>` | <comportamiento concreto> |
|
|
| Error path 1: <fallo esperado> | e2e | `<cmd que provoca fallo>` | <fallo manejado, no crash> |
|
|
| Error path 2: <recursos caidos> | e2e | `<cmd>` | <degradacion graceful + log> |
|
|
|
|
**Regla**: al menos 1 golden + 2 edge + 1 error path. Tests inscritos en `e2e_runs` de la app correspondiente cuando aplique.
|
|
|
|
### Vida util validada
|
|
|
|
El flow no esta hecho hasta que sobrevive **uso real** durante >=7 dias sin romperse silenciosamente. Cada metrica tiene umbral medible y dashboard observable.
|
|
|
|
| Metrica | Umbral | Donde se observa | Ventana |
|
|
|---|---|---|---|
|
|
| <metrica 1, ej. handshakes vivos> | `>=N` | `<dashboard URL / app panel>` | 7 dias |
|
|
| <metrica 2, ej. error_rate> | `<X%` | `<dashboard URL>` | 7 dias |
|
|
| <metrica 3, ej. duracion p95> | `<Xms` | `call_monitor.function_stats` | 30 dias |
|
|
| crashes del proceso | `0` | `journalctl -u <unit>` | 7 dias |
|
|
| huecos en audit chain | `0` | `cmd: <verify chain>` | continuo |
|
|
|
|
**Regla**: las metricas NO se autoreportan en el flow; las lee el operador del dashboard real. Si el dashboard no existe, el item se invalida.
|
|
|
|
### User-facing (reforzado)
|
|
|
|
"DoD verde" sin uso humano real = plumbing limpio sin razon de existir.
|
|
|
|
- [ ] **User-facing surface**: <accion concreta del humano + lugar exacto donde ve/usa el output (NO una BD, NO un log)>.
|
|
- [ ] **User-facing usage real**: el humano (operador) usa la cosa en **su PC, en su contexto real**, **>=N veces en >=7 dias**, con inputs reales (no demo, no sandbox).
|
|
- [ ] **User-facing variado**: cubre >=3 capabilities/casos distintos (no solo "abre dashboard y mira").
|
|
- [ ] **User-facing onboarding**: parrafo en `## Notas` que explica "para ver/usar esto: hacer X" sin leer el flow.
|
|
- [ ] **User-facing latencia**: percepcion del cambio <Xs|Xmin> tras el evento (X declarado, medido).
|
|
|
|
### Anti-criterios (invalidan la DoD aunque los checkboxes esten verdes)
|
|
|
|
Marca el flow como **NO done** si cualquiera de estas condiciones es cierta:
|
|
|
|
- [ ] **Solo-en-mi-PC**: el flow funciona en `home-wsl` pero falla en `pc-aurgi` u otro PC del operador.
|
|
- [ ] **Repetible-en-sandbox-vacio**: solo pasa con BD limpia / cuenta limpia / sin datos historicos.
|
|
- [ ] **Camino feliz unico**: los error paths fueron declarados pero NUNCA se ejercitaron (sin entry en `e2e_runs` o logs reales).
|
|
- [ ] **Dashboard fantasma**: el dashboard declarado en "Vida util" no se ha abierto en >30 dias.
|
|
- [ ] **Self-test que no apesta**: el `e2e_check` retorna `pass` sin verificar nada material (no asserts).
|
|
- [ ] **Silent-fail**: el proceso muere/degrada sin alerta visible al operador.
|
|
- [ ] **Approval saltado**: alguna capability con `requires_approval=true` fue ejecutada sin el approval flow.
|
|
|
|
### Custom (opcional, dominio-especifico)
|
|
|
|
- [ ] _(custom)_ <DoD especifica al dominio si aplica>.
|
|
|
|
## Telemetria esperada
|
|
|
|
- `call_monitor.calls`: que aparece.
|
|
- `data_factory.runs`: que aparece.
|
|
- `<app>.operations.db`: que aparece.
|
|
- Matrix / email / dashboard: que aparece visible.
|
|
|
|
## Riesgos / gotchas
|
|
|
|
- Lista de cosas que pueden romperse y como detectarlas.
|
|
|
|
## Notas
|
|
|
|
(rellenas tras correr o tras hallazgos)
|