373 lines
9.3 KiB
Markdown
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)
|