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