añadido guidelines de karpathy y repensado del proyecto

This commit is contained in:
2026-05-25 19:28:58 +02:00
parent 8c594f8ddf
commit d95ed15766
51 changed files with 637 additions and 1215 deletions
+12 -35
View File
@@ -66,9 +66,8 @@ NIVEL 5
NIVEL 6
main ⇐ api (routers), api.middlewares, config, observability.logging → create_app(), app
(separado, sin imports del paquete core)
dashboard/src/ forja_dashboard/* ← habla con `main` por HTTP, no por import
```
(UI HTMX co-locada dentro del propio forja-core; mismo proceso, sin cliente HTTP intermedio)
```
Reglas que se cumplen y conviene mantener:
- **`domain/` no importa nada del resto del proyecto.** Es el vocabulario; todos dependen de él.
@@ -333,33 +332,14 @@ Hashing/versionado: `registry/versioning.compute_hash(yaml_text)` = SHA-256 del
---
## 6. Dashboard ↔ Core (` forja_dashboard`)
## 6. UI HTMX embebida en Core
El dashboard no comparte código con el core: solo lo llama por HTTP a través de
`CoreClient` (`dashboard/src/ forja_dashboard/client.py`, httpx síncrono con 2
retries, `base_url = FORJA_CORE_URL`; mapea 404/409/422 → `{"error": <json>}`).
Con la migración a Opción A (FastAPI + HTMX), la interfaz de usuario se sirve
directamente desde el mismo proceso `forja-core` (Jinja2 + HTMX vía CDN, sin
servicio separado). No hay `CoreClient` intermedio para las páginas; los
endpoints de UI llaman a los mismos servicios internos que la API REST.
| `CoreClient.<método>` | Endpoint del core | Página(s) que lo usan |
|-----------------------|-------------------|-----------------------|
| `health()` | `GET /health` | `app.py` (sidebar) |
| `list_agents()` | `GET /agents` | Registro, Ejecutar |
| `get_agent(name)` | `GET /agents/{name}` | Registro |
| `list_versions(name)` | `GET /agents/{name}/versions` | Registro |
| `diff_versions(name, a, b)` | `GET /agents/{name}/versions/{a}/diff/{b}` | Registro (→ `components/diff_view`) |
| `invoke_agent(name, body)` | `POST /agents/{name}/invoke` | Ejecutar |
| `list_executions()` | `GET /executions` | Aprobaciones (filtra `status=="awaiting_approval"`), Historial |
| `get_execution(trace_id)` | `GET /executions/{trace_id}` | Aprobaciones, Historial (→ `components/trace_view`, `violation_view`) |
| `approve(trace_id, body)` | `POST /executions/{trace_id}/approve` | Aprobaciones |
| `reject(trace_id, body)` | `POST /executions/{trace_id}/reject` | Aprobaciones |
| `list_violations(**filters)` | `GET /violations?…` | Historial |
| `list_policies()` | `GET /policies` | Politicas |
| `list_policy_versions(name)` | `GET /policies/{name}/versions` | Politicas |
Páginas (Streamlit multipágina; el nº y el emoji del nombre del fichero son la
navegación): `app.py` (raíz), `pages/1_🏛️_Registro.py`, `pages/2_▶️_Ejecutar.py`,
`pages/3_🤝_Aprobaciones.py`, `pages/4_📜_Historial.py`, `pages/5_📐_Politicas.py`.
Componentes reutilizables: `components/diff_view.render_unified_diff(diff_text)`,
`components/trace_view.render_trace(decision_path)`, `components/violation_view.render_violations(violations)`.
La antigua sección de dashboard Streamlit ha sido eliminada.
---
@@ -378,13 +358,10 @@ Componentes reutilizables: `components/diff_view.render_unified_diff(diff_text)`
pueden disparar la construcción perezosa) → handler → respuesta con `X-Trace-Id`.
**Contenedores** (`docker-compose.yml`): servicio `core` (`core/Dockerfile`,
`uvicorn forja_core.main:app --host 0.0.0.0 --port 8000`, `HEALTHCHECK`
`curl /health`, monta `./agents:ro`, `./policies:ro`, `./data:rw`, env
`DATA_DIR=/app/data`, `AGENTS_DIR=/app/agents`, `POLICIES_DIR=/app/policies`,
`env_file: .env`); servicio `dashboard` (`dashboard/Dockerfile`, `streamlit run
app.py`, `HEALTHCHECK``/_stcore/health`, `depends_on: core: service_healthy`,
env `FORJA_CORE_URL=http://core:8000`, monta `./agents:ro` para leer los
`examples/*.txt`).
`uvicorn forja_core.main:app --host 0.0.0.0 --port 8000` para API + UI HTMX,
`HEALTHCHECK``curl /health`, monta `./agents:rw`, `./policies:rw`, `./data:rw`,
env `DATA_DIR=/app/data`, `AGENTS_DIR=/app/agents`, `POLICIES_DIR=/app/policies`,
`env_file: .env`). Un solo servicio.
**`Settings` (env vars)** — `config.py`: