Independent Project Not affiliated with, sponsored by, or endorsed by the Watch Tower Bible and Tract Society or Jehovah's Witnesses.
jw-agent-toolkit
ES

Guide

Citation integrity validator (jw_core.citations)

Fase 23 — validador de integridad de citas / link-rot. Spec en docs/superpowers/specs/2026-05-30-fase-23-citation-validator-design.md.

Para qué sirve

Verifica que cada URL wol.jw.org que produce un agente esté sana en tres ejes:

EjeQué chequeaDefault
CatálogodocId↔pub_code contra MepsCatalog local (Fase 19)siempre
ResolveHTTP 200 (acepta 3xx terminando en 200)sólo con --live
Driftshape del HTML coincide con snapshot de Fase 22sólo con --live --drift

Pareja natural de Fase 22 (eval doctrinal). Fase 22 detecta drift una vez por semana; Fase 23 diagnostica y enriquece los issues.

Usar desde CLI

# Default offline-only (sólo catálogo)
echo "https://wol.jw.org/es/wol/d/r4/lp-s/1101989140" > /tmp/urls.txt
uv run jw citations check --urls /tmp/urls.txt

# Validar un AgentResult serializado
jw mcp call apologetics --question "Trinidad?" --out /tmp/result.json
uv run jw citations check --agent-output /tmp/result.json

# Live: HTTP real con concurrencia limitada
uv run jw citations check --urls /tmp/urls.txt --live

# Live + drift: compara contra snapshots de jw-eval
uv run jw citations check --urls /tmp/urls.txt --live --drift

# JSON output (para pipelines)
uv run jw citations check --urls /tmp/urls.txt --report json --out /tmp/report.json

Usar desde MCP

# tool: validate_citations
out = validate_citations(
    urls=["https://wol.jw.org/es/wol/d/r4/lp-s/1101989140"],
    live=False,
    check_drift=False,
)
# {"mode": "structural", "checks": [...], "summary": {...}}

Modo live requiere JW_CITATIONS_LIVE=1 en el entorno del MCP server — diseño explícito para que un cliente LLM no martillee wol.jw.org por accidente.

Usar desde código (validador de agentes)

from jw_core.citations import CitationValidator

async def smoke(agent_output):
    v = CitationValidator()
    report = await v.validate_agent_output(agent_output, mode="structural")
    assert report.summary["failed"] == 0

Interpretar el reporte

resolveQué significa
okHTTP 200 directo
ok_redirect3xx → 200 (warning, no error)
not_found404
gone410
server_error5xx
redirect_loop>3 redirecciones
network_errortimeout/DNS/TLS
skippedmodo estructural
catalogQué significa
okdocId en MepsCatalog, pub_code coincide
mismatchdocId existe pero pub_code de la URL no coincide con catálogo
missingdocId no está en el catálogo local
unknownURL sin docId (Biblia) o catálogo vacío
skippedno se pasó catálogo
driftQué significa
okshape HTML == snapshot
driftshape difiere; revisar notes
no_snapshotno hay snapshot para esa URL
skippedmodo no incluye drift

Política

  • CI público corre solo modo estructural. --live es manual o weekly cron de Fase 22.
  • Concurrencia 4 por defecto en modo live. Aumentar sólo si tu red lo soporta y has hablado con el mantenedor.
  • missing en catálogo no es failure: significa que falta .jwpub indexado, no que la URL esté rota.

Troubleshooting

SíntomaDiagnósticoFix
Todos catalog=unknowncatálogo vacíojw library register <archivo.jwpub>
drift en una URL conocidawol cambió el HTMLrefrescar snapshot vía packages/jw-eval/scripts/build_eval_snapshots.py --force
MCP rechaza live=Truefalta env varexport JW_CITATIONS_LIVE=1 para esa sesión

Edit this page on docs/guias/citation-validator.md