# Capability Group: doctor Funciones de diagnostico read-only del registry y sus artefactos. Componen `fn doctor` — el entrypoint unico de auditoria del ecosistema. No modifican nada. ## Funciones del grupo | ID | Firma corta | Que hace | |---|---|---| | `artefact_doctor_go_infra` | `ArtefactDoctor(registryRoot string) ([]ArtefactCheck, error)` | Estado git/venv/app.md/upstream de cada app y analysis | | `audit_capability_groups_go_infra` | `AuditCapabilityGroups(root string) ([]CapabilityGroupAudit, error)` | Drift entre INDEX.md, tags en BD y docs en disco | | `audit_copied_code_go_infra` | `AuditCopiedCode(registryRoot string) ([]CopiedCodeEntry, error)` | Cuerpos de funcion copiados del registry sin import | | `audit_cpp_apps_go_infra` | `AuditCppApps(registryRoot string) ([]CppAppAudit, error)` | Conformidad C++ con cpp/PATTERNS.md | | `audit_ml_env_go_infra` | `AuditMlEnv(registryRoot string) (MlEnvReport, error)` | Entorno ML: GPUs, CUDA, venv, paquetes clave | | `audit_uses_functions_go_infra` | `AuditUsesFunctions(registryRoot string) ([]UsesFunctionsAudit, error)` | Drift uses_functions declarado vs imports reales | | `find_unused_functions_go_infra` | `FindUnusedFunctions(registryRoot string) ([]UnusedFunction, error)` | Funciones del registry sin consumidores | | `frontend_doctor_bash_infra` | `frontend_doctor(project_dir: string) -> diagnostics_stdout` | Diagnostico frontend: node_modules, builds, tipos | | `pc_locations_drift_go_infra` | `PcLocationsDrift(registryRoot string, pcID string) ([]LocationDrift, error)` | Drift pc_locations BD vs disco local | | `services_status_go_infra` | `ServicesStatus(registryRoot string) ([]ServiceStatus, error)` | Apps con tag service + systemctl + puerto | | `vault_doctor_go_infra` | `VaultDoctor(repoRoot string) ([]VaultDoctorEntry, error)` | Estado de vaults: symlinks, manifest, integridad | ## Ejemplo canonico ```go // Todas las funciones siguen el mismo patron: // reciben registryRoot (raiz del repo) y retornan slice de resultados + error. import "fn-registry/functions/infra" audits, err := infra.AuditCapabilityGroups("/home/lucas/fn_registry") if err != nil { log.Fatal(err) } for _, a := range audits { if !a.OK { fmt.Printf("%s: %v\n", a.Group, a.Issues) } } // fn doctor las compone todas via subcomandos: // fn doctor artefacts → ArtefactDoctor // fn doctor services → ServicesStatus // fn doctor sync → PcLocationsDrift // fn doctor uses-functions → AuditUsesFunctions // fn doctor unused → FindUnusedFunctions // fn doctor cpp-apps → AuditCppApps // fn doctor capabilities → AuditCapabilityGroups ``` ## Fronteras - **Read-only**: ninguna funcion del grupo escribe, modifica estado ni mata procesos. - **No incluye**: funciones de reparacion/fix (esas son acciones derivadas descritas en `.claude/rules/fn_doctor.md`). - **No incluye**: `e2e_checks` ni `assertion eval` — esos son pasos del bucle reactivo, no diagnostico pasivo.