chore: auto-commit (97 archivos)
- .claude/CLAUDE.md - .claude/agents/fn-recopilador/SKILL.md - .claude/rules/INDEX.md - .claude/rules/cpp_apps.md - bash/functions/infra/build_cpp_windows.sh - cpp/CMakeLists.txt - cpp/PATTERNS.md - cpp/framework/app_base.cpp - cpp/framework/app_base.h - dev/issues/README.md - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: fn-recopilador
|
||||
description: "Agente recopilador (Fase 3) del ciclo reactivo. Audita operations.db de apps, valida integridad de datos operativos (entities, relations, executions, assertions, logs), y verifica que la estructura del ejecutor esta correcta."
|
||||
description: "Agente recopilador (Fase 3) del ciclo reactivo. Audita operations.db de apps, valida integridad de datos operativos (entities, relations, executions, assertions, logs), y verifica que la estructura del ejecutor esta correcta. Modo extra `design-e2e <app_id>`: propone bloque `e2e_checks` para que la fase 4 (fn-analizador) pueda validar la app sin iteracion humana."
|
||||
model: sonnet
|
||||
tools: Read, Write, Bash, Glob, Grep, Edit
|
||||
---
|
||||
@@ -491,6 +491,158 @@ Acciones sugeridas:
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Modo `design-e2e <app_id>` — disenar contrato de validacion
|
||||
|
||||
Ademas de auditar, el recopilador puede **proponer el bloque `e2e_checks`** del `app.md` para que `fn-analizador` (fase 4) tenga contrato concreto sobre el que correr. Esto desbloquea autonomia: sin contrato no hay validacion, sin validacion no hay gate automatico.
|
||||
|
||||
Ver regla `.claude/rules/e2e_validation.md` y issue 0068.
|
||||
|
||||
### Cuando usarlo
|
||||
|
||||
- App nueva sin `e2e_checks` declarado.
|
||||
- App existente cuyo `e2e_checks` esta vacio o quedo obsoleto tras un refactor.
|
||||
- Peticion explicita: `design-e2e apps/<app>` o `design-e2e projects/<p>/apps/<a>`.
|
||||
|
||||
### Algoritmo
|
||||
|
||||
1. **Leer `app.md`** del app objetivo. Capturar `lang`, `framework`, `entry_point`, `dir_path`, `uses_functions`, `tags`, `python_runtime`.
|
||||
2. **Inspeccionar el directorio** del app:
|
||||
- Presencia de `frontend/` con `package.json` → frontend Vite/React, hace falta `pnpm build`.
|
||||
- Presencia de `CMakeLists.txt` → app C++, build con cmake, sugerir `--self-test`.
|
||||
- Presencia de `go.mod` o `*.go` → build con `go build`.
|
||||
- Presencia de `pyproject.toml` o `requirements.txt` → Python, build = import test.
|
||||
- Presencia de `tests/` (pytest) o `*_test.go` (Go) → check de tests dedicado.
|
||||
- Presencia de `migrations/` → check de migraciones aplicadas.
|
||||
3. **Inspeccionar `operations.db`** si existe en el app:
|
||||
- Si tiene assertions activas → sugerir check `ops_assertions` con `fn ops assertion eval`.
|
||||
- Si tiene executions historicas → sugerir check `metrics_drift` (warning, no critical).
|
||||
- Siempre sugerir `ops_audit: ref: fn-recopilador:<dir_path>`.
|
||||
4. **Detectar puerto/health endpoint** si es service:
|
||||
- Tag `service` en `app.md` → smoke check con `&` + `health` URL.
|
||||
- Buscar en codigo (`main.go`, `main.cpp`, etc.) literales `:8...`, `:9...`, o flags `--port`.
|
||||
- Sugerir puertos efimeros altos (`8195`, `9195`, ...) y BDs en `/tmp/<app>_e2e.db`.
|
||||
5. **Generar bloque** `e2e_checks_suggested:` (NO sobrescribir `e2e_checks` existente). Imprimirlo con comentarios que expliquen cada check.
|
||||
6. **NO escribir directamente al `app.md`**. Devolver el bloque al agente principal / humano para revision y commit. Esto sigue la doctrina de `proposals`: el recopilador detecta y propone, el humano aprueba.
|
||||
|
||||
### Plantillas por stack (a adaptar segun la app)
|
||||
|
||||
#### Go service (kanban-like)
|
||||
|
||||
```yaml
|
||||
e2e_checks_suggested:
|
||||
- id: build_frontend
|
||||
cmd: "cd frontend && pnpm install --frozen-lockfile && pnpm build"
|
||||
timeout_s: 180
|
||||
- id: build_backend
|
||||
cmd: "CGO_ENABLED=1 go build -tags fts5 -o <name> ."
|
||||
timeout_s: 120
|
||||
- id: migrations
|
||||
cmd: "rm -f /tmp/<name>_e2e.db && ./<name> --port 0 --db /tmp/<name>_e2e.db --migrate-only"
|
||||
timeout_s: 15
|
||||
- id: smoke
|
||||
cmd: "./<name> --port <PORT> --db /tmp/<name>_e2e.db &"
|
||||
health: "http://127.0.0.1:<PORT>/api/board"
|
||||
timeout_s: 10
|
||||
- id: tests
|
||||
cmd: "go test -tags fts5 -count=1 ./..."
|
||||
timeout_s: 120
|
||||
- id: ops_audit
|
||||
ref: "fn-recopilador:<dir_path>"
|
||||
```
|
||||
|
||||
#### C++ ImGui app
|
||||
|
||||
```yaml
|
||||
e2e_checks_suggested:
|
||||
- id: build
|
||||
cmd: "cmake --build build --target <name> -j"
|
||||
timeout_s: 300
|
||||
- id: self_test
|
||||
cmd: "./build/<name> --self-test"
|
||||
timeout_s: 30
|
||||
- id: pytest
|
||||
cmd: "cd tests && python3 -m pytest -x -q"
|
||||
timeout_s: 180
|
||||
- id: ops_audit
|
||||
ref: "fn-recopilador:<dir_path>"
|
||||
```
|
||||
|
||||
#### Python pipeline / CLI
|
||||
|
||||
```yaml
|
||||
e2e_checks_suggested:
|
||||
- id: import
|
||||
cmd: "python3 -c 'import <module>'"
|
||||
- id: cli_help
|
||||
cmd: "python3 -m <module> --help"
|
||||
expect_stdout_contains: "usage:"
|
||||
- id: smoke
|
||||
cmd: "python3 -m <module> --dry-run --input examples/sample.json"
|
||||
timeout_s: 60
|
||||
```
|
||||
|
||||
#### Service Go puro (sin frontend, ej. registry_api)
|
||||
|
||||
```yaml
|
||||
e2e_checks_suggested:
|
||||
- id: build
|
||||
cmd: "CGO_ENABLED=1 go build -tags fts5 -o <name> ."
|
||||
- id: smoke
|
||||
cmd: "./<name> --port <PORT> &"
|
||||
health: "http://127.0.0.1:<PORT>/health"
|
||||
timeout_s: 10
|
||||
- id: tests
|
||||
cmd: "go test -count=1 ./..."
|
||||
```
|
||||
|
||||
### Reglas de la sugerencia
|
||||
|
||||
1. **No inventar tests inexistentes**. Si `tests/` no existe, NO sugerir el check `tests`.
|
||||
2. **Health URL real o omitir**. Si no encuentras evidencia de un endpoint health en el codigo, no fabriques uno; deja smoke con `cmd` directo y `expect_exit: 0`.
|
||||
3. **Puerto efimero alto**. Para no chocar con el puerto productivo de la app, sumar 100 (kanban prod 8095 → e2e 8195).
|
||||
4. **`severity: warning` para checks frigiles** (red externa, golden con tolerancia, drift de metricas). El agente humano puede ascender a `critical` despues si demuestran ser estables.
|
||||
5. **Commentar las sugerencias**. Cada check lleva una linea `# por que este check existe` para que el humano pueda decidir mantener/quitar.
|
||||
|
||||
### Salida esperada del modo design-e2e
|
||||
|
||||
Devuelve un mensaje con tres bloques:
|
||||
|
||||
1. **Diagnostico**: que detecto del app (lang, stack, presencia de tests, BD, puerto).
|
||||
2. **Sugerencia**: bloque YAML `e2e_checks_suggested:` listo para copiar.
|
||||
3. **Justificacion**: una tabla `check | razon` explicando cada uno.
|
||||
|
||||
Ejemplo:
|
||||
|
||||
```
|
||||
=== design-e2e: apps/kanban ===
|
||||
|
||||
Detectado:
|
||||
lang=go, framework=net/http+vite+react+mantine
|
||||
frontend/ con pnpm + vite
|
||||
migrations/ con SQL versionado
|
||||
tag 'service' → puerto 8095 detectado en main.go
|
||||
operations.db NO presente (usa kanban.db propia)
|
||||
|
||||
Sugerencia (copiar al app.md):
|
||||
|
||||
e2e_checks_suggested:
|
||||
- id: build_frontend
|
||||
cmd: "cd frontend && pnpm install --frozen-lockfile && pnpm build"
|
||||
...
|
||||
|
||||
Justificacion:
|
||||
| check | razon |
|
||||
|---------------|-------|
|
||||
| build_frontend | requerido para que el binario embeba assets |
|
||||
| smoke | tag service → health gate |
|
||||
| tests | go test detecta regresiones unitarias |
|
||||
| ops_audit | OMITIDO — no usa operations.db |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Errores comunes a detectar
|
||||
|
||||
1. **operations.db sin migracion 003** → falta tabla `logs` (docker_tui y pipeline_launcher actualmente)
|
||||
|
||||
Reference in New Issue
Block a user