Files
fn_registry/functions/infra/proposal_from_failure.md
egutierrez 7913116a8e chore: auto-commit (129 archivos)
- .claude/agents/fn-analizador/SKILL.md
- .claude/agents/fn-constructor/SKILL.md
- .claude/agents/fn-executor/SKILL.md
- .claude/agents/fn-mejorador/SKILL.md
- .claude/agents/fn-orquestador/SKILL.md
- .claude/agents/fn-recopilador/SKILL.md
- .claude/commands/app.md
- .claude/commands/compile.md
- .claude/commands/cpp-app.md
- .claude/commands/create_functions.md
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-01 22:23:12 +02:00

73 lines
3.1 KiB
Markdown

---
name: proposal_from_failure
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: impure
signature: "func ProposalFromFailure(registryDB string, appID string, results []CheckResult, executionID string) ([]string, error)"
description: "Crea una fila en la tabla proposals de registry.db por cada CheckResult con Status=fail. Usa kind=new_function para fallos criticos y kind=improve_function para warnings. Retorna los IDs de proposals creados. Parte del bucle reactivo: conecta los resultados de e2e_run_checks con la etapa MEJORAR."
tags: [proposals, reactive-loop, e2e, monitoring, registry, infra, pendiente-usar]
uses_functions: [random_hex_id_go_core, sqlite_open_go_infra]
uses_types: [CheckResult_go_infra]
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [crypto/rand, encoding/hex, encoding/json, fmt, time, database/sql]
tested: true
tests:
- "no inserta nada cuando todos los checks pasan"
- "inserta proposal por cada check fallido"
- "proposal critica usa kind new_function"
- "proposal warning usa kind improve_function"
- "proposals tienen timestamp reciente"
test_file_path: "functions/infra/proposal_from_failure_test.go"
file_path: "functions/infra/proposal_from_failure.go"
params:
- name: registryDB
desc: "Path absoluto o relativo a registry.db. Puede ser ':memory:' en tests."
- name: appID
desc: "ID del artefacto (app) al que pertenecen los checks. Se guarda como target_id en la proposal."
- name: results
desc: "Lista de CheckResult de e2e_run_checks_go_infra. Solo los con Status=fail generan proposals."
- name: executionID
desc: "ID de la ejecucion en operations.db. Se incluye en el campo evidence de la proposal para trazabilidad."
output: "Lista de IDs de proposals creados (formato 'prop_<16hexchars>'). Error si no se puede abrir la BD o falla algun INSERT."
---
## Ejemplo
```go
results, _ := infra.E2ERunChecks(checks, "/opt/apps/myapp")
propIDs, err := infra.ProposalFromFailure(
"$HOME/fn_registry/registry.db",
"my_app",
results,
"exec_20260509_001",
)
// propIDs = ["prop_a1b2c3d4e5f6a7b8", ...]
// Cada ID insertado en proposals con status=pending, created_by=reactive_loop
```
## Mapeo de severity a kind de proposal
| Severity del check | kind en proposals |
|---|---|
| `critical` | `new_function` (proxy de mayor urgencia) |
| `warning` | `improve_function` |
**Nota de diseno:** el schema de `proposals` limita `kind` a
`(new_function, new_type, improve_function, improve_type, new_pipeline)`.
No existe `bug` ni `optimization`. Se usan `new_function` e `improve_function`
como proxies hasta que se extienda el schema con un migration.
Para un futuro migration: `ALTER TABLE proposals ADD COLUMN ...` o
añadir `bug` y `optimization` al CHECK constraint en `migrations/NNN_add_bug_kind.sql`.
## Notas
La funcion abre y cierra la conexion a registry.db en cada llamada. Para uso frecuente
dentro de una sesion larga, considerar pasar una `*sql.DB` abierta como variante futura.
El campo `evidence` de la proposal contiene JSON con:
`{check_id, execution_id, exit_code, error, severity}` para debugging posterior.