syntaxis/docs/provision/problem-statement-correct.md
Jesús Pérez 9cef9b8d57 refactor: consolidate configuration directories
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)
2025-12-26 18:36:23 +00:00

373 lines
9.3 KiB
Markdown

# 🎯 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`
```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`
```kcl
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:
> 1. Developer mantiene (una sola vez)
> 2. provisioning importa (como taskservs)
> 3. provctl consume (para gestión local)
> 4. 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)