--- name: audit_cpp_apps kind: function lang: go domain: infra version: "1.0.0" purity: impure signature: "func AuditCppApps(registryRoot string) ([]CppAppAudit, error)" description: "Audita conformidad de apps C++ del registry con cpp/PATTERNS.md y .claude/rules/cpp_apps.md. Verifica que cada main.cpp use fn::run_app, declare cfg.about y cfg.log, no llame fn_ui::app_menubar manualmente, no llame ImGui::DockSpaceOverViewport sin opt-out (cfg.auto_dockspace = false), y que app.md tenga framework: imgui y entry_point. Read-only." tags: [doctor, registry-first, audit, cpp, imgui, standard, pendiente-usar] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["database/sql", "fmt", "os", "path/filepath", "strings", "github.com/mattn/go-sqlite3"] params: - name: registryRoot desc: "ruta absoluta al directorio raiz del fn_registry (donde vive registry.db y cpp/apps/)" output: "slice de CppAppAudit, uno por app C++ registrada. Cada entrada incluye AppID, DirPath, OK (true si no hay issues), y lista Issues con codigos: directory_missing, main.cpp_missing_or_unreadable, no_fn_run_app_call, manual_glfwInit_call, missing_cfg_about, missing_cfg_log, manual_app_menubar_call, manual_DockSpaceOverViewport_without_auto_dockspace_false, app.md_missing, app.md_missing_framework_imgui, app.md_missing_entry_point. Error solo si registry.db no puede abrirse." tested: false tests: [] test_file_path: "" file_path: "functions/infra/audit_cpp_apps.go" --- ## Ejemplo ```go audits, err := infra.AuditCppApps("$HOME/fn_registry") if err != nil { log.Fatal(err) } for _, a := range audits { if !a.OK { fmt.Printf("%s: %v\n", a.AppID, a.Issues) } } ``` ## Contexto Wrapper consumido por `fn doctor cpp-apps`. Sirve como gate para detectar apps que se desvian del estandar (ej. `app_menubar` manual residual, falta `cfg.about`, `app.md` sin frontmatter completo) tras refactors o creacion manual sin usar el scaffolder `init_cpp_app_bash_pipelines`. Issues detectados son codigos cortos (snake_case) para que sean estables y filtrables desde JSON. La interpretacion humana vive en `cpp/PATTERNS.md`.