Handler MCP: wiki_propose_mirror_update — Propuesta Haiku diff-aware para docs-espejo
Handler MCP: wiki_propose_mirror_update
Handler MCP de Fase 3 del sistema Sync Cascade (s80, 22-05-2026). Recibe el diff unificado de un doc-fuente y el body actual de su doc-espejo, y usa Claude Haiku 4.5 para generar el contenido completo actualizado del espejo. No crea PR ni commit — eso lo hace scripts/sync_cascade.mjs con gh CLI.
Coste típico: $0.02–$0.08 por par fuente/espejo según tamaño del diff.
Ubicación
functions/api/mcp/handlers/wiki.ts → función wikiProposeMirrorUpdate()
Signature MCP
{
"name": "wiki_propose_mirror_update",
"inputSchema": {
"type": "object",
"required": ["source_slug", "source_diff", "mirror_slug", "mirror_body"],
"properties": {
"source_slug": { "type": "string", "description": "Slug del doc-fuente que cambió." },
"source_diff": { "type": "string", "description": "Diff unificado (HEAD~1 vs HEAD)." },
"mirror_slug": { "type": "string", "description": "Slug del doc-espejo a actualizar." },
"mirror_body": { "type": "string", "description": "Contenido actual del mirror sin frontmatter." }
}
}
}
Lógica interna
Límites defensivos
| Parámetro | Límite | Razón |
|---|---|---|
source_diff | 8 000 chars (trunca) | Contener coste Haiku |
mirror_body | 8 000 chars (trunca) | Contener coste Haiku |
source_diff > 16 000 chars | should_propose=false con reason="diff_too_large_for_haiku" | Refactors masivos (>800 LOC) no aptos para síntesis |
Prompt Haiku
System prompt instruye a Haiku a:
- Decidir
should_propose: true/false(false si el diff es trivial o no afecta al espejo). - Mantener el tono y voz propios del espejo (no copiar texto literal del fuente).
- Preservar secciones que el espejo tiene y el fuente no.
- Devolver
proposed_bodycompleto listo para reemplazar el actual (no un diff parcial).
Respuesta
{
"should_propose": true,
"reasoning": "El diff actualiza el proceso de acceso CF; el espejo refleja los mismos accesos.",
"proposed_body": "<markdown completo del espejo actualizado>",
"changes_summary": "- Actualizado proceso CF Access\n- Ajustada sección de credenciales",
"source_slug": "onboarding-edu",
"mirror_slug": "onboarding-dani",
"haiku_input_tokens": 1842,
"haiku_output_tokens": 673,
"haiku_cost_usd": 0.0034
}
Flujo de consumo (script sync_cascade.mjs)
para cada par (source, mirror) en propagate.mirrors:
1. git diff HEAD~1 HEAD -- <source>.md → source_diff
2. leer body actual de <mirror>.md → mirror_body
3. wiki_propose_mirror_update(...)
4. si should_propose=true:
branch: sync-cascade/<source>-to-<mirror>-<sha7>
commit: sync-cascade(propose): <mirror> sync from <source>
gh pr create --draft --label sync-cascade-proposal
Anti-loops
- El commit de los PR drafts usa prefijo
sync-cascade(propose):, filtrado por el workflowsync-cascade-detect.yml. - Los PRs son siempre draft — no se auto-mergean.
should_propose=falseen caso de duda → un humano puede ignorar el PR o mergearlo manualmente.
Dependencias de entorno
Requiere ANTHROPIC_API_KEY en el entorno de Cloudflare Workers. Sin ella devuelve { error: "ANTHROPIC_API_KEY not configured" }.
Véase también
- [[feature—supercontext—sync-cascade]]
- [[entity—biblioteca—handler—wiki-propagate-mirror-changes]]
- [[entity—biblioteca—endpoint—mirror-cascades]]
- [[entity—biblioteca—migration—0037-sync-cascade-mirrors]]