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

3.1 KiB

id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
id title status type domain scope priority depends blocks related created updated tags
0107a fn doctor modules — detectar drift uses_modules vs uses_functions y version skew pendiente feature
meta
cpp-stack
tooling
registry alta
0107b
0107
2026-05-17 2026-05-17
modules
fn-doctor
drift
audit
cpp

0107a — fn doctor modules

Parte del issue principal 0107. 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:
    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.