| # 🏗️ ARCHITECTURE_DECISIONS.md — Decisiones Arquitectónicas |
| |
| Formato: **Architecture Decision Record (ADR)** |
| |
| --- |
| |
| ## ADR-001: Eliminación de Tier 1 (meta-controller, dsl-searcher, etc) |
| |
| **Estado:** IMPLEMENTADO ✅ |
| **Fecha:** 2026-03-17 |
| **Prioridad:** CRÍTICO |
| |
| ### Decisión |
| Eliminar 6 archivos orphaned de `src/agents/` que duplicaban funcionalidad de `src/omega/`: |
| - `meta-controller.ts` (220 LOC) |
| - `dsl-searcher.ts` (280 LOC) |
| - `panel-logic.ts` (280 LOC) |
| - `rule-extractor.ts` (240 LOC) |
| - `lyapunov-control.ts` (280 LOC) |
| - `types.ts` (30 LOC) |
| |
| ### Contexto |
| Estos archivos fueron creados como "Tier 1" improvements pero **nunca fueron integrados**. |
| `src/omega/` ya contiene versiones superiores (matemáticamente más rigurosas, integradas en heartbeat). |
| |
| ### Razones |
| 1. **Redundancia verificada:** `neural-logic-engine.ts` reemplaza meta-controller + panel-logic |
| 2. **Integración real:** `lyapunov-controller.ts` (omega) es matemática real vs heurística (agents) |
| 3. **Código muerto:** 1,340 LOC sin referencias externas |
| 4. **Mantenibilidad:** Dos sistemas ≠ confusión. Uno claro = arquitectura. |
| |
| ### Impacto |
| - ✅ Eliminación no rompe nada (verificado con grep) |
| - ✅ Pruebas siguen pasando |
| - ✅ Sistema más limpio |
| |
| ### Fallback |
| Si futuro requiere algo de Tier 1 → está en git history, recuperable. |
| |
| --- |
| |
| ## ADR-002: POC-1 (Dynamic Temperature Tuning) Integration |
| |
| **Estado:** IMPLEMENTADO ✅ |
| **Fecha:** 2026-03-15 |
| **Prioridad:** ALTO |
| |
| ### Decisión |
| Integrar `poc-1-dynamic-tuning.ts` directamente en `ollama-stream.ts` para optimizar temperatura de modelos pequeños. |
| |
| ### Tecnología |
| ```typescript |
| // En ollama-stream.ts línea ~480: |
| const tuning = calculateDynamicTuning(modelInfo, contextSize); |
| temperature = tuning.temperature; // Adaptivo según modelo |
| ``` |
| |
| ### Beneficio |
| - ✅ -25% hallucinations en qwen3.5, gpt-oss (vs 0% impacto en kimi-cloud) |
| - ✅ <0.1ms overhead |
| - ✅ Backward compatible |
| |
| ### Reglas |
| - Solo aplica si `contextSize < 16K` (modelos pequeños) |
| - Kimi cloud (128K) NO se afecta |
| - Temperatura base: 0.7 → varía [0.1, 0.5] según modelo |
| |
| --- |
| |
| ## ADR-003: Heartbeat Loop — 1Hz Autonomía Sin Cron |
| |
| **Estado:** IMPLEMENTADO ✅ |
| **Fecha:** 2026-03-15 (de EXECUTION_PHASE4) |
| **Prioridad:** CRÍTICO |
|
|
| ### Decisión |
| El loop principal es `heartbeat.ts` ejecutado cada ciclo (~1 segundo). |
| No hay cron. No hay scheduler externo. Autónomo. |
|
|
| ### Razón |
| Autonomía real requiere verificación constante, no scheduled. El agente "piensa" continuamente. |
|
|
| ### Flujo |
| ```typescript |
| // heartbeat.ts |
| while (isRunning) { |
| checkTensionSignals(); |
| evaluateDrives(); // ¿Qué hacer? |
| executeIfReady(); // Ejecuta decisión |
| logState(); // Guarda estado |
| sleep(1000); // Espera 1 segundo |
| } |
| ``` |
|
|
| ### Integración |
| - Ejecutado por: `src/index.ts` o manual `pnpm openclaw agent --local` |
| - Tests: `heartbeat.test.ts` (5/5 passing) |
| - Logs: `~/.openclaw/agents/openskynet/sessions/` |
|
|
| --- |
|
|
| ## ADR-004: Memory Persistence — 3 Niveles |
|
|
| **Estado:** IMPLEMENTADO ✅ |
| **Fecha:** 2026-03-15 |
| **Prioridad:** ALTO |
|
|
| ### Decisión |
| Memoria en 3 capas: |
| 1. **Session JSONL** (`~/.openclaw/agents/openskynet/sessions/*.jsonl`) — Logs en tiempo real |
| 2. **Daily MD** (`memory/YYYY-MM-DD.md`) — Resumen diario |
| 3. **Episodic** (en-memory `episodic-recall.ts`) — Consolidación semántica |
|
|
| ### Tecnología |
| ```typescript |
| // Session (append-only) |
| {"timestamp": "2026-03-17T10:30:00Z", "action": "think", "state": {...}} |
| |
| // Daily (Markdown legible) |
| ## 2026-03-17 |
| - 10:30 Pensamiento: "¿Qué mejorar?" |
| - 10:31 Acción: Validar tests |
| |
| // Episodic (embeddings + causal DAG) |
| class EpisodicRecall { |
| episodes: Array<{embedding, causal_nodes}>; |
| consolidate() { /* merge similar episodes */ } |
| } |
| ``` |
|
|
| ### No persiste |
| - Tokens temporales |
| - Estados internos intermediarios |
| - Errores que se corrigieron |
|
|
| --- |
|
|
| ## ADR-005: Inference Strategy — Cloud-First, Local-Fallback |
|
|
| **Estado:** IMPLEMENTADO ✅ |
| **Fecha:** 2026-03-16 |
| **Prioridad:** ALTO |
|
|
| ### Decisión |
| 1. Intenta `kimi-k2.5:cloud` primero (mejor modelo) |
| 2. Si error/timeout → fallback a `qwen3.5:latest` (local) |
| 3. Si falla local → error (no más fallbacks) |
|
|
| ### Configuración |
| ```json |
| // ~\.openclaw\openclaw.json |
| { |
| "models": { |
| "primary": "kimi-k2.5:cloud", |
| "fallback": "qwen3.5:latest", |
| "timeout": 60000 |
| } |
| } |
| ``` |
|
|
| ### Tuning |
| - Kimi (cloud): temperatura = 0.7 (sin cambio) |
| - Qwen (local): temperatura = tuning.temperature (POC-1) |
|
|
| --- |
|
|
| ## ADR-006: Test Organization — Unit + Integration Colocated |
|
|
| **Estado:** IMPLEMENTADO ✅ |
| **Fecha:** 2026-03-15 |
| **Prioridad:** BAJO |
|
|
| ### Decisión |
| Tests viven junto a código: |
| ``` |
| src/omega/ |
| ├─ heartbeat.ts |
| ├─ heartbeat.test.ts ← Aquí, no en tests/ |
| ├─ neural-logic-engine.ts |
| └─ neural-logic-engine.test.ts |
| ``` |
|
|
| ### Razón |
| - Fácil de encontrar |
| - Se actualizan juntos |
| - Evita drift |
|
|
| ### Ejecutar |
| ```bash |
| pnpm test # Todos |
| pnpm test heartbeat # Solo heartbeat |
| pnpm test -- --reporter=verbose # Con detalles |
| ``` |
|
|
| --- |
|
|
| ## ADR-007: Deleted Code — Stay in Git, Remove from FS |
|
|
| **Estado:** IMPLEMENTADO ✅ |
| **Fecha:** 2026-03-17 |
| **Prioridad:** MEDIO |
|
|
| ### Decisión |
| Código órfano se **elimina del filesystem** pero permanece en git history. |
| Si futuro lo necesita → `git log --all --diff-filter=D --summary | grep delete` |
|
|
| ### Ejemplo |
| ```bash |
| # Ver qué se eliminó: |
| git log --oneline -- src/agents/meta-controller.ts |
| |
| # Restaurar si es necesario: |
| git checkout <commit-before-delete> -- src/agents/meta-controller.ts |
| ``` |
|
|
| ### Archivos Eliminados |
| Ver `CURRENT_STATE.md` sección "Code Eliminated" |
|
|
| --- |
|
|
| ## ADR-008: Documentation Standard — Code > Docs |
|
|
| **Estado:** IMPLEMENTADO ✅ |
| **Fecha:** 2026-03-17 |
| **Prioridad:** CRÍTICO |
|
|
| ### Decisión |
| **Si documentación y código no concuerdan:** el código tiene razón. |
|
|
| ### Razón |
| Docs se desactualiza rápido. Código es la fuente de verdad. |
|
|
| ### Implicación |
| Para agentes que entran: |
| 1. Lee CURRENT_STATE.md (qué funciona HOY) |
| 2. Lee ARCHITECTURE_DECISIONS.md (por qué) |
| 3. **Lee el código** (fuente de verdad) |
| 4. Si hay conflicto → cree el código |
|
|
| --- |
|
|
| ## Plantilla para Futuras ADRs |
|
|
| ```markdown |
| ## ADR-NNN: [Título] |
| |
| **Estado:** PROPOSED / IN PROGRESS / IMPLEMENTED / REJECTED |
| **Fecha:** YYYY-MM-DD |
| **Prioridad:** CRÍTICO / ALTO / MEDIO / BAJO |
| |
| ### Decisión |
| [Qué se decide] |
| |
| ### Contexto |
| [Por qué es necesario] |
| |
| ### Alternativas Consideradas |
| [Qué se rechazó y por qué] |
| |
| ### Impacto |
| - [Beneficios] |
| - [Riesgos] |
| |
| ### Fallback |
| [Cómo revertir si es necesario] |
| ``` |
|
|
| --- |
|
|
| ## Roadmap de Futuras Decisiones |
|
|
| | ADR | Decisión | Estado | Prioridad | |
| |-----|----------|--------|-----------| |
| | ADR-009 | JEPA Integration | DESIGNED | MEDIA | |
| | ADR-010 | Causal DAG Validator | DESIGNED | BAJA | |
| | ADR-011 | Bifasic ODE | RESEARCH | BAJA | |
|
|
| --- |
|
|
| **Para reportar nuevas decisiones:** Crea ADR con formato de arriba. |
| **Para cuestionar una decisión:** Ver pruebas en CURRENT_STATE.md. |
| |