Files
fn_registry/dev/issues/completed/0107a-fn-doctor-modules.md
T
egutierrez b9716a7cd6 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

83 lines
3.1 KiB
Markdown

---
id: "0107a"
title: "fn doctor modules — detectar drift uses_modules vs uses_functions y version skew"
status: pendiente
type: feature
domain:
- meta
- cpp-stack
- tooling
scope: registry
priority: alta
depends: []
blocks:
- "0107b"
related:
- "0107"
created: 2026-05-17
updated: 2026-05-17
tags: [modules, fn-doctor, drift, audit, cpp]
---
# 0107a — `fn doctor modules`
Parte del issue principal [0107](0107-modules-standardization.md). Feature flag `modules-v2`.
## Objetivo
Subcomando `fn doctor modules` + funcion del registry `audit_modules_drift_go_infra` que detecta:
1. App declara `uses_modules: [X]` Y un miembro de X aparece en `uses_functions` → drift.
2. App declara `uses_modules: [X]` pero su `CMakeLists.txt` NO linkea `fn_module_X` → mismatch.
3. App linkea `fn_module_X` pero NO declara `uses_modules: [X]` → mismatch inverso.
4. App declara `uses_modules: [{name: X, min_version: "1.4"}]` y `module.md::version` < 1.4 → version skew (post 0107e).
## Tareas
- [ ] **1.1** `functions/infra/audit_modules_drift.go` con firma:
```go
type ModuleDriftReport struct {
ModuleID string
ModuleVersion string
ConsumersTotal int
ConsumersWithDrift int
Violations []DriftViolation
}
type DriftViolation struct {
AppID string
Kind string // "duplicate_members" | "uses_modules_no_link" | "link_no_uses_modules" | "version_skew"
DuplicatedIDs []string
Message string
}
func AuditModulesDrift(registryDB string, cppRoot string) ([]ModuleDriftReport, error)
```
- [ ] **1.2** `.md` correspondiente con frontmatter completo + ejemplo lanzable.
- [ ] **1.3** Subcomando en `cmd/fn/doctor.go`: `fn doctor modules` + `fn doctor modules --json`.
- [ ] **1.4** Exponer via MCP: `mcp__registry__fn_doctor subcommand="modules"`.
- [ ] **1.5** Test sintetico: fixture con 1 modulo + 3 apps (1 limpia, 1 con drift de duplicados, 1 con version skew).
- [ ] **1.6** Anadir entrada a `.claude/rules/fn_doctor.md` mapeando subcomando.
## Output esperado (texto)
```
fn doctor modules
=================
data_table_cpp v1.4.0 — 7 consumers
services_monitor DRIFT 12 duplicated members in uses_functions
dag_engine_ui DRIFT 12 duplicated members in uses_functions
odr_console DRIFT 5 duplicated members in uses_functions
navegator_dashboard DRIFT 12 duplicated members in uses_functions
graph_explorer DRIFT 12 duplicated members in uses_functions
registry_dashboard DRIFT 11 duplicated members in uses_functions
app_gestion DRIFT 12 duplicated members in uses_functions
framework_cpp v1.1.0 — 0 explicit consumers (transitive via add_imgui_app)
Summary: 2 modules, 7 apps with drift, 0 version skews.
Exit: 1 (drift detected)
```
## Riesgos
- Falso positivo si un app legitimamente necesita un miembro fuera del scope del modulo (ej. usar `lua_engine` standalone). Mitigacion: post-0107d (members generales fuera del modulo), este caso desaparece. Mientras tanto: flag `--ignore-known` con allowlist temporal.