Handler MCP: wikiProposeMirrorUpdate — propuesta segura de actualizaciones mirror
Handler MCP: wikiProposeMirrorUpdate — propuesta segura de actualizaciones mirror
Descripción
wikiProposeMirrorUpdate es un handler del MCP de CreaRack Pro implementado en functions/api/mcp/handlers/wiki.ts. Su propósito es, dado un sourceDiff (diff del doc fuente) y un mirrorBody (contenido actual del mirror en otra wiki/idioma), generar mediante Haiku 4.5 un proposed_body actualizado coherente con el cambio, y opcionalmente abrir un PR con la propuesta.
Forma parte del subsistema sync-cascade: cuando una página fuente cambia, el sistema propaga el cambio a sus mirrors de forma asistida por LLM, evitando reescrituras manuales.
Parámetros de entrada
| Parámetro | Tipo | Descripción |
|---|---|---|
sourceDiff | string | Diff unificado del documento fuente |
mirrorBody | string | Contenido actual del mirror a actualizar |
| (env) | ANTHROPIC_API_KEY | Clave Anthropic; retorna error si no está configurada |
Comportamiento y límites (post-fix s80, 2026-05-22)
Constantes de control
| Constante | Valor | Propósito |
|---|---|---|
MAX_DIFF | 8 000 chars | Límite de sourceDiff enviado a Haiku |
MAX_BODY | 32 000 chars | Límite de mirrorBody enviado a Haiku (era 8 000 antes del fix s80) |
ABORT_BODY | 50 000 chars | Si mirrorBody supera este umbral, se aborta y retorna should_propose: false |
max_tokens output | 8 000 | Tokens máx. en respuesta Haiku (era 4 000 antes del fix s80) |
SUSPICIOUS_REDUCTION_RATIO | 0.5 | Si proposed_body.length < mirrorBody.length × 0.5, se descarta la propuesta |
Flujo de decisión
sourceDiff.length > MAX_DIFF × 2?
→ should_propose: false, reason: "diff_too_large_for_haiku"
mirrorBody.length > ABORT_BODY?
→ should_propose: false, reason: "mirror_body excede N chars. Revisa a mano."
Llamada Haiku con truncatedDiff (hasta MAX_DIFF) + truncatedBody (hasta MAX_BODY)
→ Error? → { error: "Haiku call failed: ..." }
→ Parse OK?
proposed_body.length < mirrorBody.length × SUSPICIOUS_REDUCTION_RATIO?
→ shouldPropose = false
→ reasoning = "[safety] Propose descartado: ..." + reasoning original Haiku
→ Retorno: { should_propose, reasoning, proposed_body, changes_summary, cost_usd }
Safety check anti-truncado
El check post-Haiku protege contra el escenario donde el modelo, habiendo recibido solo un fragmento del mirror (por límite de contexto o error de output tokens), devuelve ese fragmento como proposed_body completo. Si el body resultante es menor al 50% del original, la propuesta se rechaza automáticamente y se registra el reasoning de Haiku para diagnóstico.
Historial de cambios relevantes
| Fecha | Cambio | Motivo |
|---|---|---|
| 2026-05-22 | MAX_BODY 8000 → 32000 | Incidente s80: docs largos se truncaban |
| 2026-05-22 | max_tokens output 4000 → 8000 | Permitir respuestas proporcionales al input |
| 2026-05-22 | Añadido ABORT_BODY=50000 | Abort explícito para docs muy largos |
| 2026-05-22 | Safety check SUSPICIOUS_REDUCTION_RATIO=0.5 | Detectar y descartar propuestas truncadas |
Coste estimado
El handler reporta cost_usd calculado con haikuCostUsd(inputTokens, outputTokens). Con MAX_BODY=32000 + max_tokens=8000, el techo teórico por llamada es aproximadamente:
- Input: ~10K tokens → $0.0010
- Output: ~2K tokens → $0.0005
- Total estimado: ~$0.0015/llamada (Haiku 4.5 pricing, mayo 2026)
Riesgos conocidos y mitigaciones
| Riesgo | Mitigación |
|---|---|
| Mirror >50KB no procesado | ABORT_BODY retorna skip con mensaje — revisión humana obligatoria |
| Haiku trunca output inesperadamente | Safety ratio 0.5 descarta propuesta y expone reasoning |
| Diff fuente demasiado grande | MAX_DIFF×2 check retorna skip |
ANTHROPIC_API_KEY no configurada | Return error inmediato antes de cualquier lógica |
Véase también
- [[incident—20260522—wiki-propose-destructive-prs]]