Merge _configs/ into config/ for single configuration directory. Update all path references. Changes: - Move _configs/* to config/ - Update .gitignore for new patterns - No code references to _configs/ found Impact: -1 root directory (layout_conventions.md compliance)
9.3 KiB
🎯 PLANTEAMIENTO DEL PROBLEMA - VERSIÓN CORRECTA
Fecha: 2025-11-20 Estado: Análisis crítico basado en retroalimentación real Autor: Corrección necesaria
❌ Lo Que Estaba Mal
Asunción 1: El Catalog TOML era fuente de verdad
Problema: TOML es ingestionable, no eficiente, requiere compilación continua
Asunción 2: Tenemos "dos sistemas desconectados"
Problema: Es incorrecto - YA EXISTE un bridge entre project-provisioning y provctl
Asunción 3: El catalog TOML debería ser el puente
Problema: El TOML no es el formato adecuado, ya hay un bridge mejor
✅ El Problema REAL (Corregido)
El Contexto Real
project-provisioning
└─ Orquesta infraestructura (máquinas, redes, servicios)
└─ Usa KCL para definiciones
└─ Tiene bridge para conectar con provctl
provctl
└─ Controla servicios locales y remotos
└─ Sabe cómo ejecutar, monitorear, orchestrar servicios
└─ Lee configuración
syntaxis
└─ Es UN PROYECTO como cualquier otro
└─ Podría ser un "taskservs" (task service) en provisioning
└─ Debería poder:
├─ Definir sus funcionalidades
├─ Declarar sus requisitos de infra
├─ Describir cómo se gestiona (systemctl, provctl, etc)
└─ Generar catálogo automáticamente
El Problema REAL
HOY:
syntaxis developer define proyecto en Rust
↓
¿Cómo describe qué servicios necesita?
¿Cómo describe cómo se ejecutan?
¿Cómo se integra con provisioning y provctl?
↓
PROBLEMA: No hay un mecanismo DECLARATIVO para esto
Solución necesaria:
syntaxis project
↓
Archivo declarativo (NO TOML): project.yaml o similar
└─ Define: servicios, requisitos, modos de ejecución
└─ Generado/mantenido: por desarrollador
└─ Consumido por: provisioning, provctl, installer
↓
provisioning lo ve como taskservs
├─ Sabe: qué services necesita syntaxis
├─ Sabe: requisitos de infra
└─ Puede: orchestrar como parte del sistema
provctl lo ve como:
├─ Sabe: cómo ejecutar cada servicio
├─ Sabe: health checks, dependencias
└─ Puede: gestionar ciclo de vida
syntaxis installer lo usa para:
├─ Ofrecer presets (local, dev, prod)
├─ Integrar con provisioning si disponible
└─ Integrar con provctl si disponible
📋 El Flujo Correcto
1. Developer declara su proyecto
Archivo: syntaxis.declarative.k o syntaxis.yaml
# DECLARACIÓN DE PROYECTO (no TOML compilado)
# Developer lo mantiene, es legible, NO requiere compilación continua
project: syntaxis
version: 1.0.0
description: "Project management platform"
services:
cli:
name: syntaxis-cli
type: binary
# ... metadatos
api:
name: syntaxis-api
type: service
port: 3000
requires: [database, cache]
# ... metadatos
database:
name: surrealdb
type: database
# ... metadatos
deployment_modes:
local:
description: "Single machine, development"
services: [cli]
manager: manual # Developer runs manually
dev:
description: "Full dev stack"
services: [cli, api, database, cache]
manager: provctl # provctl manages these
production:
description: "HA production"
services: [cli, api, database, cache, nats]
manager: provisioning # Full provisioning manages
2. provisioning lo consume
Cómo:
provisioning/kcl/syntaxis-taskservs.k
service_syntaxis = ServiceRegistry {
name: "syntaxis"
# Importa/consume: syntaxis.declarative.k
services: import_from("syntaxis.declarative.k").services
deployment_mode: "production"
}
Beneficio:
- syntaxis es ahora un "taskservs" en provisioning
- Provisioning conoce sus requisitos
- Se puede orchestrar con otros servicios
3. provctl lo consume
Cómo:
provctl config --from-project /path/to/syntaxis
Busca: syntaxis.declarative.k
Lee: deployment_modes.production (o lo que pidas)
Genera: configuración local para provctl
Ejecuta: servicios según deployment_mode.manager = "provctl"
Beneficio:
- provctl sabe cómo ejecutar servicios de syntaxis
- Puede monitorear health
- Puede orchestrar en múltiples máquinas
4. syntaxis installer lo consume
Cómo:
syntaxis-installer
Lee: syntaxis.declarative.k
Ofrece presets:
- local: "Instala solo CLI"
- dev: "Instala todo para desarrollo"
- production: "Usa provisioning para HA"
Si desarrollo elige "dev":
├─ Detecta provctl disponible?
│ ├─ SÍ: "provctl config --from-project . && provctl apply"
│ └─ NO: "Sigue esta guía manual..."
└─ Inicia servicios necesarios
🔄 Por Qué NO TOML
Problemas del TOML compilado
❌ "Ingestionable"
- Tenemos 436 líneas en services-catalog.toml
- Requiere parsing manual en Rust
- Cada cambio = recompilación (incómodo)
❌ No es "semántico"
- TOML es data format, no schema
- Sin validación nativa
- Sin herencia/composición
❌ No es "legible para developer"
- Developer ve: archivo generado/procesado
- No ve: intención original
- Difícil de mantener
Ventajas de format declarativo (KCL o YAML)
✅ "Semántico"
- Define SCHEMA, TIPOS, RESTRICCIONES
- Valida automáticamente
- Permite herencia
✅ "Legible"
- Developer escribe UNA VEZ
- Es su "fuente de verdad personal"
- Fácil de mantener
✅ "Eficiente"
- NO requiere compilación continua
- Puede convertirse a múltiples formatos
- Integrable con provisioning (KCL)
🎯 La Solución en 3 Partes
Parte 1: Developer declara (NUEVA)
syntaxis/
├── Cargo.toml
├── CLAUDE.md
├── docs/
│ └── provision/
├── configs/
│ ├── database.toml (configuración, no catalog)
│ └── syntaxis.declarative.k ← NUEVA
│ (Define: servicios, requisitos, modos)
└── src/
└── main.rs
syntaxis.declarative.k contiene:
- Definición de servicios de syntaxis
- Requisitos (BD, cache, etc)
- Modos de deployment (local, dev, prod)
- Health checks, puertos, etc
- NO compilado, NO derivado
Parte 2: provisioning lo importa (MEJORA)
provisioning/kcl/syntaxis-taskservs.k
# Importa declaración de syntaxis
syntaxis_def = import("/path/to/syntaxis/configs/syntaxis.declarative.k")
# Define cómo se provisiona
service_syntaxis = ServiceRegistry {
name: "syntaxis"
services: syntaxis_def.services
deployment_mode: syntaxis_def.deployment_modes.production
// ... específicos de provisioning
}
Beneficio: provisioning ve syntaxis como un "proyecto externo" que declare sus necesidades
Parte 3: provctl lo consumes (NUEVA)
provctl config --from-declarative /path/to/syntaxis/configs/syntaxis.declarative.k --mode dev
├─ Lee: syntaxis.declarative.k
├─ Busca: deployment_modes.dev
├─ Genera: configuración para provctl
├─ Valida: health checks
└─ Resultado: listo para "provctl apply"
Beneficio: Developer puede usar provctl localmente sin provisioning
📊 Comparación: TOML vs Solución Correcta
| Aspecto | TOML Compilado | Solución Correcta |
|---|---|---|
| Ubicación | syntaxis/configs/services-catalog.toml | syntaxis/configs/syntaxis.declarative.k |
| Quién mantiene | Tooling automático (catalog.rs) | Developer (una sola vez) |
| Cambios requieren | Recompilación | Solo guardar archivo |
| Consumible por | provisioning tools | provisioning, provctl, installer |
| Validación | Manual en Rust | Nativa en formato (KCL/YAML schema) |
| Escalabilidad | Crece exponencialmente | Modular, reutilizable |
| Sincronización | ¿Quién es source of truth? | El archivo del developer |
🚀 Implementación
Fase 1: Definir formato declarativo
Decisión: ¿KCL o YAML?
- KCL: Type-safe, schema, validación nativa
- YAML: Más simple, menos overhead
Recomendación: KCL (aprovecha inversión en provisioning)
Archivo: syntaxis.declarative.k
project:
name = "syntaxis"
version = "1.0.0"
service "api-server":
type = "http_service"
port = 3000
image = "syntaxis:api-latest"
service "database":
type = "database"
port = 5432
deployment "local":
description = "Single machine, development"
services = ["api-server"]
manager = "manual"
Fase 2: Extender provisioning
Para que lea syntaxis.declarative.k como taskservs importable
Fase 3: Extender provctl
Para que lea syntaxis.declarative.k y genere configuración local
Fase 4: Extender syntaxis installer
Para que consuma syntaxis.declarative.k y ofrezca presets
📌 Conclusión
El problema REAL:
syntaxis (como proyecto) NO tiene forma declarativa de describir sus servicios, requisitos, y modos de deployment. El TOML compilado es incómodo porque requiere recompilación continua y es "derivado", no "fuente de verdad".
La solución REAL:
Crear un archivo declarativo (syntaxis.declarative.k) que:
- Developer mantiene (una sola vez)
- provisioning importa (como taskservs)
- provctl consume (para gestión local)
- installer usa (para presets)
Por qué esto es mejor:
- ✅ Developer es "dueño" de la declaración
- ✅ No requiere recompilación continua
- ✅ Es consumible por múltiples sistemas
- ✅ Escalable a otros proyectos
- ✅ Eficiente (legible, no ingestionable)