MCP Tool: wiki_lint_contradictions
Descripción
Tool MCP del Bibliotecario-Lint (Supercontexto Fase 5). Detecta contradicciones semánticas entre pares de páginas wiki activas que pertenecen a la misma community_id. Usa Claude 3 Haiku para clasificar cada par como contradict, complementary o unrelated.
Las contradicciones confirmadas se persisten en la tabla D1 bib_wiki_contradictions (con dry_run=false).
Signatura
wikiLintContradictions(
db: D1Database,
args: {
mode?: 'incremental' | 'full'; // default 'incremental'
recent_days?: number; // default 7 (solo en modo incremental)
max_pairs_per_community?: number; // default 15
max_total_pairs?: number; // default 100
dry_run?: boolean; // default true
},
env: Env
): Promise<string> // JSON serializado
Ubicación: functions/api/mcp/handlers/wiki.ts → función wikiLintContradictions
Modos de operación
incremental (default)
Solo evalúa pares donde al menos una de las dos páginas es “reciente” (su last_verified o created_at cae dentro de los últimos recent_days días). Optimizado para el cron diario: procesa pocas páginas, coste mínimo.
full
Evalúa todos los pares dentro de cada community. Usado por el cron semanal de consolidación para garantizar que no se escapen contradicciones antiguas.
Input Schema (MCP)
{
"mode": "incremental",
"recent_days": 7,
"max_pairs_per_community": 10,
"max_total_pairs": 40,
"dry_run": true
}
Output
{
"mode": "incremental",
"pairs_checked": 12,
"contradictions_found": 2,
"contradictions_inserted": 0,
"total_tokens": 960,
"dry_run": true,
"results": [
{
"page_a": "entity--racks--model--rack",
"page_b": "feature--monitoring--cns-v1",
"community_id": 3,
"verdict": "contradict",
"subject": "comportamiento bajo carga",
"claim_a": "Rack se evalúa síncronamente en cada request",
"claim_b": "CNS evalúa el estado de forma completamente asíncrona",
"reason": "Afirmaciones incompatibles sobre el modelo de ejecución",
"tokens_used": 480,
"inserted": false
}
]
}
Pipeline interno
1. SELECT pages WHERE status='active' AND community_id IS NOT NULL
2. Agrupar por community_id
3. Generar pares candidatos según modo
4. Por cada par:
a. fetchSnippet(page_a) — GH Contents API, ≤2000 chars, cacheado en Map
b. fetchSnippet(page_b)
c. Si algún snippet está vacío → skip
d. callAnthropicHaiku(contradictionPrompt, userMsg, max_tokens=400)
e. parseJsonFromLLM → {verdict, subject, claim_a, claim_b, reason}
f. Si verdict='contradict' AND !dry_run → INSERT bib_wiki_contradictions
5. Agregar resultados y loguear en bib_wiki_log
Prompt de Haiku
El prompt del sistema instruye a Haiku a responder con un único JSON en una línea:
{"verdict":"contradict","subject":"tema","claim_a":"cita A","claim_b":"cita B","reason":"breve"}
Criterio conservador: en caso de duda → "complementary". Solo se reportan contradicciones claras.
Idempotencia
Antes de insertar una contradicción, el tool:
- Ordena el par alfabéticamente:
[a.slug, b.slug].sort() - Verifica si ya existe en
bib_wiki_contradictionsconstatus='open'para el mismopage_a_slug,page_b_slugysubject - Solo inserta si no existe → evita duplicados en ejecuciones repetidas
Tabla D1: bib_wiki_contradictions
INSERT INTO bib_wiki_contradictions (page_a_slug, page_b_slug, claim_a, claim_b, subject)
VALUES (?, ?, ?, ?, ?)
-- claim_a/b truncados a 500 chars, subject a 200 chars
Variables de entorno requeridas
| Variable | Obligatoria | Uso |
|---|---|---|
ANTHROPIC_API_KEY | Sí | Llamadas a Claude 3 Haiku |
GH_PAT | No (pero recomendada) | Fetch de snippets de wiki desde GitHub |
Si ANTHROPIC_API_KEY no está configurado, el tool retorna {"error": "ANTHROPIC_API_KEY not configured"}.
Registro MCP (index.ts)
wiki_lint_contradictions: { action: 'lint', entity_type: 'wiki_contradiction' }
Coste estimado
| Escenario | Pares | Coste aprox. |
|---|---|---|
| Cron diario (incremental, max 40 pares) | ≤40 | ~$0.08 |
| Cron semanal (full, max 200 pares) | ≤200 | ~$0.40 |
| Review manual (dry_run=true, 40 pares) | ≤40 | ~$0.08 |
Evitar relanzar en bucle — el coste se acumula linealmente con el número de pares.
Roadmap / Limitaciones conocidas
wiki_resolve_contradictionaún no existe — mejora futura para resolver contradicciones individualmente desde la wiki.- Los snippets se limitan a 2000 chars del inicio del fichero. Páginas muy largas pueden tener contradicciones en secciones no leídas.
- Si
GH_PATno está disponible, todos los pares se saltean (no hay contenido que comparar).
Véase también
- [[feature—supercontext—bibliotecario-lint-fase-5]] — fase del Supercontexto que introdujo esta tool
- [[feature—biblioteca—wiki-lint-contradictions-pagination]] — mejora posterior de paginación sobre esta misma tool
- [[entity—mcp—tool—wiki-lint-bulk]] — tool hermana del Bibliotecario-Lint (stale/orphans) que corre en el mismo cron
- [[concept—biblioteca—supercontexto]] — arquitectura global del sistema de bibliotecarios latentes
- [[feature—biblioteca—graphify]] — detección de comunidades que agrupa pares candidatos para el Lint