Volver a la wiki

bib_cochange_backfill — Backfill de co-cambios git en bib_cochanges

Descripción

Script Python standalone (scripts/bib_cochange_backfill.py, 202 líneas) que rellena la tabla D1 bib_cochanges con datos históricos desde el inicio del repositorio git. Es un runbook one-shot: se ejecuta UNA sola vez tras desplegar la migración D1 0043 (que crea la tabla). No hay que volverlo a lanzar en operación normal — los merges futuros alimentan la tabla vía record_cochanges().

Cuándo ejecutar

Uso

Dry-run (reporta sin publicar)

$env:BIB_MCP_TOKEN="<token>"  # PowerShell
python scripts/bib_cochange_backfill.py --dry-run

# Imprime los primeros 25 pares, ordenados por count descendente:
#   1234  monitoring/api/signage.py  ↔  static/js/pages/signage/SignageContentManager.js
#   ...
#   (+ N pares más)

Publicar de verdad

python scripts/bib_cochange_backfill.py
# [backfill] Leyendo historial git (repo=CreaRack-Pro, since=todo)…
# [backfill] 1250 commits no-merge con archivos.
# [backfill] 15432 pares distintos; 8912 con count>=2 (a publicar).
# [backfill] Lote 1: 500 pares.
# [backfill] Lote 2: 500 pares.
# ...
# [backfill] ✅ 8912 pares publicados en bib_cochanges (repo=CreaRack-Pro).

Opciones

# Limitar historial (ej: últimos 6 meses)
python scripts/bib_cochange_backfill.py --since "2025-12-09"

# Repo del Workspace (ejecutar dentro del directorio workspace)
python ../scripts/bib_cochange_backfill.py --repo CreaRackSL-workspace

Args completos:

Secretos (environment)

Obligatorio (salvo --dry-run):

Opcionales (si el MCP está tras Cloudflare Access):

Algoritmo

  1. Lee historial git: git log --no-merges --name-only itera cada commit no-merge.
  2. Filtra a código (mismas reglas que record_cochanges()):
    • Extiende .py, .ts, .tsx, .js, .jsx, .mjs, .cjs, .astro, .vue, .html, .css, .scss, .sql.
    • Excluye src/content/wiki/, .github/scripts/bib_*, scripts/harness/, public/supercontext/.
    • Excluye config/settings/base.py (alta rotación, ruido).
  3. Cuenta pares: Para cada commit con 2–25 archivos de código, incrementa el contador de cada par (file_a, file_b) donde file_a < file_b.
    • Commits con >25 archivos se saltan (refactor masivo, señal débil).
  4. Filtra por umbral: Solo publica pares con count >= 2 (1 = coincidencia casual).
  5. Envía al MCP: Agrupa pares en lotes de ≤500 (límite del handler) y llama a bib_record_cochanges en modo pairs.

Parámetros anti-ruido:

MAX_FILES_PER_COMMIT = 25   # Commits que tocan >esto se saltan
BATCH_PAIRS = 500            # Pares por llamada MCP
CHURN_DENYLIST = ("config/settings/base.py",)  # Altísima rotación

Idempotencia

El script no es totalmente idempotente en el sentido de “re-ejecutar = mismo estado”:

Esto es intencionado (la tabla se alimenta también en caliente vía record_cochanges() post-merge). Si necesitas reload:

-- En D1 (Workspace)
DELETE FROM bib_cochanges;
-- Luego ejecutar el backfill

Manejo de errores

Fuentes

Véase también

Subir