Files
fn_registry/functions/infra/audit_app_drift.md
T
egutierrez 7913116a8e chore: auto-commit (129 archivos)
- .claude/agents/fn-analizador/SKILL.md
- .claude/agents/fn-constructor/SKILL.md
- .claude/agents/fn-executor/SKILL.md
- .claude/agents/fn-mejorador/SKILL.md
- .claude/agents/fn-orquestador/SKILL.md
- .claude/agents/fn-recopilador/SKILL.md
- .claude/commands/app.md
- .claude/commands/compile.md
- .claude/commands/cpp-app.md
- .claude/commands/create_functions.md
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-01 22:23:12 +02:00

4.1 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, params, output
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports tested tests test_file_path file_path params output
audit_app_drift function go infra 1.0.0 impure func AuditAppDrift(registryRoot string, windowsDeployRoot string) ([]AppDriftEntry, error) Escanea todas las apps C++ del registry, extrae las versiones de modulos embebidas en sus artefactos compilados (exe Windows desplegado, modules_generated.cpp Windows/Linux) y las compara contra la version declarada en modules/*/module.md. Retorna una entrada por app con status ok|drift|no-build y la lista de modulos desactualizados.
audit
drift
cpp
modules
doctor
registry
false error_go_core
fmt
os
path/filepath
regexp
sort
strings
false
functions/infra/audit_app_drift.go
name desc
registryRoot Ruta absoluta a la raiz del fn_registry (ej. $HOME/fn_registry). Se buscan modules/*/module.md, apps/*/app.md, projects/*/apps/*/app.md y cpp/build/{linux,windows}/apps/<name>/.
name desc
windowsDeployRoot Ruta absoluta donde se despliegan los .exe de Windows (ej. /mnt/c/Users/lucas/Desktop/apps). Si vacio, se omite la inspeccion del binario desplegado y solo se usan los artefactos bajo cpp/build.
Slice de AppDriftEntry, uno por app C++ encontrada. Status: 'ok' (todas las versiones coinciden), 'drift' (al menos un modulo tiene version distinta), 'no-build' (no se encontro ningun artefacto compilado). Campo Stale lista los nombres de modulos con drift.

audit_app_drift

Detecta apps C++ cuyos binarios/artefactos enlazan una version de modulo inferior a la que declara el registry.

Cuando usarla

  • Despues de bumpar la version de un modulo en modules/*/module.md — para saber que apps necesitan recompilarse.
  • Como check en fn doctor cpp-apps para detectar drift antes de un deploy.
  • En CI tras actualizar fn_framework o fn_module_data_table — lista apps con status=drift.

Ejemplo

entries, err := infra.AuditAppDrift("$HOME/fn_registry", "/mnt/c/Users/lucas/Desktop/apps")
if err != nil {
    log.Fatal(err)
}
for _, e := range entries {
    switch e.Status {
    case "drift":
        fmt.Printf("STALE  %s: modules %v (build: %s)\n", e.AppName, e.Stale, e.BuildKind)
    case "no-build":
        fmt.Printf("NOBLD  %s: no compiled artifact found\n", e.AppName)
    case "ok":
        fmt.Printf("OK     %s (%s)\n", e.AppName, e.BuildKind)
    }
}

Salida tipica:

STALE  app_gestion: modules [data_table] (build: linux-build)
OK     chart_demo (windows-deployed)
NOBLD  primitives_gallery: no compiled artifact found

Prioridad de artefactos (por app)

  1. <windowsDeployRoot>/<name>/<name>.exe — PE binario: busca patron <module>\x00<version>\x00 directo en bytes.
  2. cpp/build/windows/apps/<name>/<name>_modules_generated.cpp — parsea literales { "module", "version", ... }.
  3. cpp/build/linux/apps/<name>/<name>_modules_generated.cpp — mismo parser.

Si ninguno existe → status = "no-build", BuildKind = "".

Gotchas

  • PE vs ELF string layout: en ELF (Linux) el compilador puede separar las cadenas del struct en distintas regiones del .rodata, por lo que la busqueda directa en el binario no es fiable. Por eso se prefiere el _modules_generated.cpp (generado por codegen_app_modules.py al compilar). El binario PE Windows si tiene el patron contiguo.
  • Sin registry.db: la funcion lee module.md directamente — no necesita la BD. Si el fn index no se ha ejecutado tras un bump de version, esta funcion igual detecta el drift porque lee la fuente de verdad (el .md).
  • Apps sin uses_modules: si una app C++ no declara uses_modules ni tiene _modules_generated.cpp, aparece con status=no-build aunque compile correctamente. Normal para apps que no usan modulos opcionales.
  • Solo compara modulos del registry: si el binario enlaza un modulo desconocido (que no tiene module.md), se ignora silenciosamente en el calculo de drift.
  • windowsDeployRoot vacio: si el usuario no tiene montado /mnt/c/... (no WSL2), pasar "" para evitar os.Stat lento en rutas inexistentes.