---
name: git_hook_audit_app_drift
kind: function
lang: bash
domain: infra
version: 1.0.0
purity: impure
signature: "git_hook_audit_app_drift <repo_dir>"
description: "Pre-commit guard: bloquea commit si los archivos staged tocan una app cuyo app.md tiene drift de uses_functions. Permite ediciones a app.md (correcciones)."
tags: [git, hook, precommit, registry-first, audit]
uses_functions:
  - audit_uses_functions_go_infra
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
example: |
  # Manual check
  bash bash/functions/infra/git_hook_audit_app_drift.sh /home/lucas/fn_registry/apps/kanban

  # Used by pre_commit_hook_install_bash_infra (v2 hook chain)
file_path: bash/functions/infra/git_hook_audit_app_drift.sh
tested: false
params:
  - name: repo_dir
    desc: "Ruta absoluta o relativa al repo git a verificar (debe contener .git/)."
output: "stdout: vacio si OK. stderr: lineas '[hook] BLOCK: ...' si bloquea. Exit 0 = allow, 1 = block, 2 = error de config."
notes: |
  Resuelve fn_registry root via FN_REGISTRY_ROOT, presencia de registry.db en
  el repo, o ancestros (..\, ../..). Si no encuentra registry.db, salta el
  check (no bloquea — el repo puede no estar fn_registry-aware).

  Llama `./fn doctor uses-functions --json` y filtra por DirPath registry-relativo.
  Solo bloquea si la app del archivo staged aparece en el reporte CON drift
  (Missing o Unused no vacios).

  Permite commits que tocan SOLO `app.md` (caso corrective: el dev esta
  arreglando el frontmatter). Se reconoce por basename == 'app.md'.

  Para saltar: `git commit --no-verify` (debe ser raro y consciente).
documentation: |
  Compone con `pre_commit_hook_install_bash_infra` para encadenar checks:
  scan_secrets primero, luego este. Ambos fallan en exit != 0.
---
