Files
fn_registry/dev/issues/0107e-version-pinning-codegen.md
T
egutierrez 7eb7b3d0c8 chore: snapshot WIP previo + flow 0008 + 7 sub-issues (0112-0119)
Snapshot de WIP acumulado de sesiones previas antes de merge wave 1
del flow 0008 (kanban_cpp + agent_runner_api + DoD schema).

Incluye:
- dev/flows/0008-kanban-cpp-and-agent-workflows.md
- dev/issues/0112-0119*.md (7 sub-issues)
- WIP previo en cmd/fn/doctor.go, registry/*, modules/, cpp/, etc.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 18:17:08 +02:00

97 lines
3.6 KiB
Markdown

---
id: "0107e"
title: "uses_modules con min_version + codegen fail-loud"
status: pendiente
type: feature
domain:
- meta
- cpp-stack
- tooling
scope: registry
priority: media
depends:
- "0107a"
blocks: []
related:
- "0107"
created: 2026-05-17
updated: 2026-05-17
tags: [modules, versioning, codegen, fail-loud]
---
# 0107e — Version pinning + codegen fail-loud
Parte del issue principal [0107](0107-modules-standardization.md).
## Objetivo
Permitir que `app.md` declare version minima del modulo y que el codegen falle ruidosamente si:
1. Modulo declarado en `uses_modules` tiene `version < min_version`.
2. Python3 no disponible y `uses_modules` no vacio.
3. Codegen produce `count = 0` cuando `uses_modules` declara N>0 modulos.
## Schema extendido `app.md::uses_modules`
```yaml
# Forma corta (back-compat, sin pinning):
uses_modules: [data_table_cpp]
# Forma larga (con pinning):
uses_modules:
- name: data_table_cpp
min_version: "1.4" # SemVer minor — acepta 1.4.x, 1.5.x, ..., NO 2.0.0
- name: chat_ia_cpp
min_version: "0.1"
# Mixed permitido:
uses_modules:
- data_table_cpp # sin pin
- name: framework_cpp # con pin
min_version: "1.1"
```
Reglas:
- `min_version` formato `MAJOR.MINOR` (no patch — patch siempre bug fix compatible).
- Comparacion: `module.md::version >= min_version` AND `module.md::version.major == min_version.major`. Esto previene saltos de major silenciosos.
## Tareas
- [ ] **5.1** `python/functions/infra/codegen_app_modules.py`: parser acepta string corto Y dict largo.
- [ ] **5.2** Codegen lee `module.md::version` y compara contra `min_version` declarado en `uses_modules`. Si falla → exit 3 con mensaje claro.
- [ ] **5.3** `cpp/CMakeLists.txt::add_imgui_app`: si codegen exit != 0 AND != 2 → `message(FATAL_ERROR ...)` (no WARNING como hoy).
- [ ] **5.4** Si Python3 NO encontrado AND `app.md` tiene `uses_modules` no vacio → `message(FATAL_ERROR "Python3 required to parse uses_modules; install python3.")`.
- [ ] **5.5** Si codegen devuelve count=0 cuando `uses_modules` declara N>0 → `message(FATAL_ERROR ...)` con apunta a la app.md.
- [ ] **5.6** Indexer `registry/parser.go`: parsea ambas formas y persiste en `apps.uses_modules_json` con shape canonico `[{name, min_version}]` (min_version null si no declarado).
- [ ] **5.7** Test: app sintetica con dict largo + modulo sintetico con version 1.3 y min_version 1.4 → cmake configure falla con mensaje esperado.
- [ ] **5.8** Migrar 7 apps consumidoras de data_table a usar dict largo con `min_version: "1.4"` (o lo que sea v actual cuando 0107e cierre).
## Mensajes de error esperados
```
CMake Error at cpp/CMakeLists.txt:289 (message):
codegen_app_modules failed for services_monitor: module 'data_table_cpp'
version 1.3.0 does not satisfy min_version 1.4 declared in
apps/services_monitor/app.md::uses_modules.
Either bump module version (via /version) or relax pin in app.md.
```
```
CMake Error at cpp/CMakeLists.txt:289 (message):
codegen_app_modules: app 'dag_engine_ui' declares uses_modules: [data_table_cpp]
but generated module manifest has count=0.
Likely cause: Python parser failed silently. Re-run with verbose:
python3 python/functions/infra/codegen_app_modules.py \
--app-md apps/dag_engine_ui/app.md \
--modules-root modules/ \
--app-name dag_engine_ui \
--out /tmp/test.cpp
```
## Riesgos
- **Apps existentes sin pinning rompen?**: NO. La forma corta sigue valida y trata `min_version` como null = sin chequeo. Solo apps que opten explicitamente reciben gate.
- **Build se vuelve ruidoso si modulo no se actualizo**: deliberado. Es el sentido del fail-loud.