# 🎯 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)
