Volver a la wiki

Handler MCP: wiki_propagate_mirror_changes — Marca espejos como verification_pending

Handler MCP: wiki_propagate_mirror_changes

Handler MCP introducido en Sync Cascade s80 (22-05-2026). Detecta qué docs-espejo deben revisarse cuando uno o varios docs-fuente cambian, y los marca con verification_pending=1 en D1. Forma el núcleo de las Fases 1 y 2 del sistema Sync Cascade.

Ubicación

functions/api/mcp/handlers/wiki.ts → función wikiPropagateMirrorChanges() Registrado en functions/api/mcp/index.ts bajo LOGGED_TOOLS con action: 'lint'.

Signature MCP

{
  "name": "wiki_propagate_mirror_changes",
  "inputSchema": {
    "type": "object",
    "required": ["source_slugs"],
    "properties": {
      "source_slugs": {
        "type": "array",
        "items": { "type": "string" },
        "description": "Slugs de docs-fuente cuyos cambios deben propagarse a sus espejos."
      },
      "dry_run": { "type": "boolean", "description": "Solo reporta sin marcar. Default false." },
      "actor": { "type": "string", "description": "Default: agent-sync-cascade." }
    }
  }
}

Lógica interna

  1. Fetch candidates: selecciona todas las bib_wiki_pages con status='active' y mirrors IS NOT NULL.
  2. Filtra en JS: para cada page candidata, parsea mirrors (JSON array) y comprueba si alguno de los source_slugs está incluido. Evita el LIKE '%slug%' que tendría riesgo de match parcial.
  3. Marca targets: para cada espejo encontrado, ejecuta:
    UPDATE bib_wiki_pages
    SET verification_pending = 1,
        mirror_changed_at = datetime('now'),
        mirror_source = <source_slug>
    WHERE slug = <mirror_slug>
    Si un mirror recibe múltiples cascadas en el mismo trigger, el último source gana (semántica direccional documentada).
  4. Log: inserta en bib_wiki_log con operation='lint', actor='agent-sync-cascade' y summary Mirror cascade from [...] → N mirror(s) marked pending.

Respuesta

{
  "ok": true,
  "propagated": 3,
  "mirrors": [
    { "source_slug": "onboarding-edu", "mirror_slug": "onboarding-dani", "mirror_title": "..." },
    ...
  ],
  "sources_checked": 1,
  "pages_with_mirrors": 7,
  "dry_run": false
}

Idempotencia

Un mirror que ya está verification_pending=1 se sobrescribe con el último mirror_source. No hay riesgo de duplicar entradas en el log — cada llamada inserta un nuevo registro de evento.

Caller principal

El workflow .github/workflows/sync-cascade-detect.yml lo llama vía scripts/sync_cascade.mjs con los slugs modificados en el push a main. También puede llamarse manualmente desde el cliente MCP del Bibliotecario.

Véase también

Subir