---
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`.
