# Auditoría word-for-word SYNONYMS (repo vs impreso original) — HANDOFF

Última actualización: 2026-07-27 ~14:00 CEST

## Qué es esto

Auditoría de las **glosas word-for-word (SYNONYMS)** de los libros de Prabhupāda
(SB y CC; ISO ya cerrado) contra los **escaneos del impreso original** (Surya OCR
como pista + adjudicación por imagen real). Encuentra divergencias repo↔impreso
que nunca se habían auditado (el diff de prosa las excluía).

**REGLA CLAVE (decisión del usuario): el impreso es el gold standard — se iguala
verbatim, AUNQUE el impreso tenga una errata evidente** (p. ej. `lips→lies`,
`plates→space`, `mukhya principal→principle`). Excepción de sentido común que los
agentes aplican: si el impreso se contradice a sí mismo (su glosa difiere de su
propia línea de verso, p. ej. `cintāmaṇi`/`anādiḥ`), NO se copia la errata.

## Herramientas (en `scripts/scan_audit/`)

- `diff_align_surya.py --synonyms` — genera candidatos: repo vs Surya OCR, SOLO el
  bloque de glosas. Salida: `out_syn/<book>.candidates.jsonl`. Veredictos:
  REVISAR / REPO_OMISSION / REPO_EXTRA / OCR_NOISE / AMBIGUO.
- `syn_audit_workflow.js` — workflow de subagentes: cada uno renderiza la página
  del PDF, LEE la imagen (visión) y adjudica cada candidato →
  CONFIRMED_FIX / OCR_NOISE / UNCLEAR. Parametrizado por `args.dir` (dónde están
  los batches) y `args.count`.
- `out_syn/*.candidates.jsonl` — candidatos por libro (persistentes en disco).

## Progreso (todo commiteado en `~/git_projects/vedabase-original`)

Auditoría de las 5 cubetas hecha por 4 tandas del workflow (158/158 batches, run
`wf_405f1695-a5c`) + muestreo + audit completo de OCR_NOISE (en curso).

| Cubeta | Estado | Fixes aplicados |
|---|---|---|
| ISO (1969) todas | ✅ 100% | 12 |
| CC+SB REVISAR/OMISSION/EXTRA | ✅ 100% (158/158) | ~1385 CONFIRMED_FIX |
| CC+SB UNCLEAR | ✅ 100% (124 artefactos, 15 reales aplicados, 2 tags purport dejados) | 15 |
| CC+SB AMBIGUO (fix_old no único) | ✅ resueltos restringiendo a línea de glosas | 9 |
| **OCR_NOISE (muestreo 120 pág)** | ✅ | 47 rescatados |
| **OCR_NOISE FULL (1276 pág / 107 batches)** | ✅ **107/107 COMPLETO** | ~412 rescatados |

**AUDITORÍA 100% COMPLETA.** Total: **1921 correcciones de synonyms** aplicadas y
commiteadas (ISO 12 · CC 694 · SB 1214), todas `applied_d1:false`.
`corrections.jsonl`: 2128 líneas. El bucket OCR_NOISE escondía ~30% de fixes reales.

## RELEASE A PRODUCCIÓN — ✅ COMPLETO (2026-07-27)

Los 1918 fixes (1496 versos) están EN VIVO en vedabase.cc:
- ✅ **D1** synced (columna `synonyms`, full-field replace desde repo) + cache purgado.
- ✅ **Web** verificado live (iso/10 "sober sect", cc/adi/1/12 "of the name Mahā-Viṣṇu").
- ✅ **FTS** auto-sync por triggers `verses_ai/ad/au`.
- ✅ **Ebooks** — 13 libros (iso, cc-adi/madhya/antya, sb-canto-1/2/3/4/6/7/8/9/10)
  regenerados desde repo + subidos a R2 (`vedabase.cc/downloads/<slug>.{epub,pdf,mobi}`),
  verificado live.
- ✅ **Packs (apps offline)** — refresh `frontend/data` desde D1 → `build_all.py` →
  13 packs afectados + catalog re-subidos a `vedabase-files` (packs primero, catalog
  último), **integridad live verificada** (catalog sha == pack real).
- ✅ **Push**: `vedabase-original` + `vedabase-pwa` pusheados. `astro_vedabase` push
  DIFERIDO (remoto divergió con commits de blog + 289 ficheros sin commitear; no forzado).

## FASE BG — ⏳ EN CURSO (escaneo 1972 Macmillan)

BG era el único libro de versos sin auditar (no había escaneo). Descargado el original
1972 Macmillan (1034 pág, archive.org) → `scan_vedabase/originals/`, cableado en
`books.json`. **Surya OCR corriendo** (`bg_guardian.sh` bajo caffeinate, ~1 día).
Al terminar el OCR:
```bash
cd scripts/scan_audit
python3 diff_align_surya.py --synonyms --book bhagavad-gita-as-it-is   # candidatos
# luego: workflow de adjudicación (como CC/SB) -> aplicar -> D1 bg + ebook bg + pack bg
```
Monitor: `find surya/bhagavad-gita-as-it-is -name '*.surya.txt' | wc -l`  (/1034)

## RETOMAR DESDE AQUÍ

### 1. Terminar OCR_NOISE FULL (41 batches pendientes, run `wf_487a47a4-947`)

Reset de sesión resetea ~cada pocas horas; el throttle deja ~20-45 batches por
ventana. Cuando la ventana esté abierta:

```
Workflow({
  scriptPath: "/Users/jaganat/git_projects/astro_vedabase/scripts/scan_audit/syn_audit_workflow.js",
  resumeFromRunId: "wf_487a47a4-947",
  args: {"count":107,"dir":"/tmp/synbatch_noisefull","batch":12,"pages":1276,"cands":1545}
})
```

Los batches ya hechos replican de caché gratis. Al terminar cada tramo, aplicar
los CONFIRMED_FIX nuevos (idempotente) y commitear:

```python
# guardar el output del task en /tmp/noisefull_runN.json, luego:
import json,sys; sys.path.insert(0,'/tmp'); from apply_rescued import apply_conf
V=json.load(open('/private/tmp/.../tasks/<taskid>.output'))['result']['verdicts']
conf=[v for v in V if v['verdict']=='CONFIRMED_FIX' and v.get('fix_old') and v.get('fix_new') and v.get('file')]
NOTE="repo synonyms drift vs original printed scan; RESCUED from OCR_NOISE full audit; print gold standard."
apply_conf(conf, NOTE)   # aplica idempotente + restringe a línea de glosas si fix_old no es único
```

### ⚠️ /tmp es efímero — si se ha borrado tras un reinicio, regenerar:

**`/tmp/apply_rescued.py`** (helper de aplicación) y **`/tmp/synbatch_noisefull/`**
(worklist). El worklist es determinista desde `out_syn/*.candidates.jsonl`:
filtrar OCR_NOISE con PDF existente, mapear stem→PDF vía `books.json`, ordenar por
(book,stem,page_no), excluir las 120 ya muestreadas (en `/tmp/syn_noise_sample.json`
si sobrevive; si no, incluirlas — solo re-adjudica ~120 págs de más), batches de 12.
(El código exacto de ambos está en el historial de la sesión; `apply_rescued.py`
define `apply_conf(conf, note)` con `ref_of()` y reemplazo restringido a la línea
`\*...\*—`.) Si `/tmp/synbatch_noisefull` falta, los agentes pendientes fallarán al
leer su batch → hay que regenerarlo al MISMO path antes de reanudar.

### 2. Después: PROPAGACIÓN EXTERIOR (deploy — PEDIR OK primero)

Ninguna corrección está aún en D1 ni en los ebooks (`applied_d1:false`). Cuando
el usuario dé luz verde, en un solo lote ISO+SB+CC:
- repo → D1 (sync) + purgar edge cache.
- Regenerar ebooks afectados (`scripts/regen_books/build_all_books.py --only ...`)
  → mobi → subir a `vedabase-files/downloads` → purgar esas URLs.
- Ver skill `sync-all-vedabase-cc` / `sync-d1` y CLAUDE.md ("fix repo first").

## Casos borde anotados (revisión humana opcional)

- Erratas internas del impreso que los agentes NO copiaron (repo correcto):
  `cintāmaṇi`, `anādiḥ` (la glosa del impreso contradice su propia línea de verso).
- Tags de cross-referencia en PURPORT (no synonyms) que el repo añade a propósito:
  `sb-10.3.34-35 [SB 12.3.51]`, `sb-9.21.21 [[bg/4/13]]` — dejados como están.
- `bhaṭṭācāyera` (cc-madhya-6.209): errata del impreso, aplicada por política verbatim.
