Documento rector de la arquitectura vigente. Describe cómo está construido el motor hoy (Plan V9: gerente SEO/AEO, Semrush a fondo, tandas encadenadas con control) y cómo se extiende. La historia vive en
CHANGELOG.md(adendas); las reglas, enCLAUDE.md; los comandos, endocs/HERRAMIENTAS_CLI.md; el método paso a paso, endocs/RUNBOOK_AUDITORIAS_SEO_AEO.md; el índice de toda la documentación, endocs/INDICE_DOCUMENTACION.md. Estado vivo del día:CONTINUAR_AQUI_2026-10-28.mdy la sección «Estado vivo» dedocs/ARQUITECTURA.html, quetools/arquitectura_html.pyrehace en cada plan (y corrige aquí las versiones citadas que quedaron viejas).Versión del motor: 0.9.394 (
MOTOR_VERSION), Kit Portable 1.154.0. Red: hub www.masterestaurant.com + 7 satélites (meseros.ai, costorestaurante.com, contenidorestaurante.com, restaurantescerca.com, restaurantecercademi.co, hospitalidad.ai, sateinstitute.org). 8.070 páginas vivas del motor (ES+EN, inventario del 28-10; el dato del día está en el estado vivo).
engine/), con JSON-LD, cifras con fuente y enlaces de red.flowchart LR
subgraph F[Fuentes]
GSC[Search Console] --- BING[Bing · Copilot] --- GA4 --- SEM[Semrush] --- UBS[Ubersuggest] --- ATP[AnswerThePublic]
end
F --> CAP[Captura y consolidación<br/>receptor_semrush · semrush_consolidar · exportadores]
CAP --> GER[Gerente SEO/AEO<br/>gerente_seo_aeo 1.10.0]
CAP --> TC[temas_competencia 1.3.1<br/>--decidir]
CAP --> ESC[escalera_top10 1.6.0]
GER --> COLAS[(cola/*.json<br/>objetivos · lotes · enlaces)]
TC --> COLAS
ESC --> COLAS
COLAS --> TANDA[Lanzador de tanda<br/>.command en fila]
TANDA --> EJ[Ejecución<br/>refuerzo · orquestar · transformar · enlaces · gen_pdf]
EJ --> REN[Render<br/>engine/ · pilares.py]
REN --> GUA{Guardianes<br/>C1 · golden · integridad · GA · identidad}
GUA -- verde --> PUB[Publicación única<br/>TERMINAR HOY · SFTP 8 sitios]
GUA -- rojo --> STOP[Se detiene<br/>sin bandera]
PUB --> VIVO[En vivo + indexación<br/>IndexNow · Bing · Google API]
VIVO --> MED[Medición<br/>seguimiento · control · hitos]
MED --> GER
MED --> PLAN[Plan V9 HTML<br/>v9_listas + FX + guardián]
PLAN --> TR[Traspasos<br/>armar_traspaso → Landings]| Capa | Componente (versión) | Entra | Sale | Documento |
|---|---|---|---|---|
| Datos | contenido/content.<slug>.json · registro.json | briefs, redacción | la pieza bilingüe y su índice | docs/ARQUITECTURA_MOTOR_BLOG.md |
| Datos | Banco de cifras repertorio_estadisticas.json + fuentes_externas.json | investigar/aplicar cifras | cifras con página verificada | docs/CONTRATO_CIFRAS_Y_FUENTES.md |
| Datos | Pilares pilares/contenido/pilar.<id>.json · seo/pilares_contenido.json | redacción del pilar; videos (id, título, subida, segundos, descripción ES/EN) y _refuerzos (marca, plan, motivo) | /dark/, /EN/dark/, cursos | pilares.py (docstring) |
| Captura | tools/receptor_semrush.py 1.3.1 (archivos semrush_pNN_<herramienta>_…) | Descargas | docs/semrush_reportes/<F>/<categoría>/ | docs/SEMRUSH_GUIA.md |
| Captura | tools/semrush_consolidar.py 1.2.1 (Keyword Magic en filas; dueño declarado de Listas manda sobre URL truncada) | datos y síntesis de todas las rondas | seo/semrush/consolidado_<F>.json: posiciones por URL, acciones con dueño y preguntas reales | R-SEMRUSH-POR-HERRAMIENTAS |
| Captura | exportadores GSC/Bing/GA4/Ubersuggest/ATP | APIs y Chrome | docs/*_reportes/ | docs/EXPORTAR_*.md |
| Decisión | tools/gerente_seo_aeo.py 1.10.0 | 22 fuentes | seo/gerente/{expedientes,decisiones,resumen}_<F> | CLAUDE.md R-GERENTE |
| Decisión | tools/mega_cola.py 1.5.0 | gerente + Semrush | colas de objetivos con control | docs/HERRAMIENTAS_CLI.md |
| Decisión | tools/temas_competencia.py 1.3.1 | Top Pages de la competencia · temas aprobados por Diego | cubierto/plantar/hueco/producto; --decidir ajustar o crear; --crear-temas lote dirigido | R-COMPETENCIA-CANDIDATOS |
| Decisión | tools/mapa_oportunidades.py 1.1.0 | salidas de todas las herramientas | seo/oportunidades/mapa_<F>.{json,md} + plan «Oportunidades» | docs/HERRAMIENTAS_CLI.md |
| Captura | tools/repertorio_youtube.py 1.2.0 | canal @masterestaurant (público) + Search Console del canal (export) | seo/videos/repertorio_youtube.json: 4.166 videos, índice por tema | docs/VIDEOS_YOUTUBE_MOTOR.md |
| Decisión | tools/gerente_seo_aeo.py 1.10.0 · palanca video_youtube + decisión por video | repertorio + plan de trabajo (keywords) + dueñas + Position Tracking (vid) + AIO | cola/videos_recomendados_<F>.json · cola/videos_decision_<F>.json | R-VIDEO-PROPIO |
| Creación | tools/videos_paginas.py 1.0.0 | decisiones «pagina_video» | lote dirigido con la guarda → piezas con el video como principal | docs/VIDEOS_YOUTUBE_MOTOR.md §3b |
| Render | engine/videos.py 1.3.0 · gancho en engine/builder.py · tools/videos_aplicar.py 1.1.0 (también AL NACER, desde orquestar) | videos del contenido | sección con 1 reproductor + VideoObject + lint | Biblioteca videos-youtube-seo-aeo |
| Decisión | tools/optimizar_pareja.py 1.1.0 | cola/pareja_<E>_<F>.json + preguntas del consolidado | FAQ distinta + enlaces que suman para dos piezas que rankean juntas; solo_faq para piezas nuevas | R-PAREJA-RANKEA |
| Decisión | tools/escalera_top10.py 1.6.0 | Semrush p14 + consolidado | FAQ, preguntas, enlaces hacia la URL 4-20 | R-ESCALERA-TOP10 |
| Decisión | tools/plantar_competencia.py 1.2.0 | temas «plantar» + AI PR | objetivos FAQ en páginas existentes | R-COMPETENCIA-CANDIDATOS |
| Ejecución | refuerzo_preguntas_reales.py 1.2.0 → reforzar_citas_ia.py 1.4.0 | cola de objetivos | FAQ literal redactada (juez de sentido) y aplicada | docs/SEGUIMIENTO_PIEZAS.md |
| Ejecución | orquestar.py continuar --plan + guarda_canibalizacion.py 1.2.0 | lote dirigido | piezas nuevas (pre-vuelo de cifras) | docs/GUARDA_CANIBALIZACION.md |
| Ejecución | tools/transformar_misma_url.py 1.0.2 | página dormida | la misma URL con tema nuevo | R-COMPETENCIA-CANDIDATOS |
| Ejecución | tools/enlaces_v9_3.py 1.0.0 | registro + gerente | tarjetas «Contenido relacionado» que suman | R-V9-3-ENLACES |
| Ejecución | gen_pdf.py (TIPOS_PDF + checklist) | piezas profundas | PDF alojado + compuerta de lead | docs/HERRAMIENTAS_CLI.md |
| Render | engine/ (builder, render_pieza, schema, enlaces_red…) | content + banderas | HTML ES/EN, JSON-LD, sitemaps | docs/ARQUITECTURA_MOTOR_BLOG.md |
| Render | Banderas de plantilla seo/v8_tecnico.json, seo/v9_tecnico.json | lanzador | arreglos técnicos con golden intacto apagados | RUNBOOK §10 |
| Guardianes | contrato_cifras.py 1.0.13 (C1/C2/C3) · golden · pulso · integridad · GA · identidad | salida local | VERDE o detención | docs/GUARDIAN_DUPLICADOS_Y_GATES.md |
| Publicación | «TERMINAR HOY 0.9.392» → publicar_paralelo.py · pilares.py 1.2.0 (videos por engine/videos.py, lint en verificar) | Comparativas Para Publicar | 8 sitios por SFTP, sitemap solo suma | docs/ARQUITECTURA_PUBLICACION.md |
| Indexación | indexacion.py (cuota Google por proyecto, seo/cuota_indexacion.json) | URL nuevas/cambiadas | IndexNow, Bing, WebSub, Google | docs/ARQUITECTURA_PUBLICACION.md |
| Medición | tools/seguimiento_piezas.py 1.4.1 · tools/inventario_publicado.py 1.2.0 · seo/mega/*_control.json | GSC/GA4/sitemaps | fichas por pieza, inventario vivo, lecturas contra control | docs/SEGUIMIENTO_PIEZAS.md |
| Informe | tools/plan_html/v9_listas.py 1.11.0 + FX + tools/guardian_reporte.py 1.0.1 | todo lo anterior | docs/planes/PLAN_SEO_AEO_V9_2026-10-26.html (CONFIABLE) | docs/LISTAS_VIZ.md, docs/GUARDIAN_REPORTES.md |
| Traspaso | tools/armar_traspaso.py 1.0.0 | manifiesto | zip con SHA256, 0 secretos | RUNBOOK §11-12 |
| Contrato | Regla | Quién la hace cumplir |
|---|---|---|
| Pieza | ES+EN, un H1, canonical propio, hreflang, JSON-LD válido, FAQ literal; nada de 301, noindex ni cambio de URL | render + tests/ + guardián de integridad |
| Cifras | cada número que afirma un dato tiene fuente verificada; el banco solo suma respaldo; una pieza nueva nace en 0 | contrato_cifras.py 1.0.13 (C1/C2/C3) + pre-vuelo |
| Enlaces | solo se suman; destino en 200; ≤ 3 tarjetas por pieza; se pueden re-apuntar al destino final (sin redirección) | enlaces_v9_3, escalera_top10, tests/test_enlaces_hub_satelite.py |
| Dueño de URL | registro.json = pieza; seo/pilares_contenido.json = pilar; /kpi-dashboard/ = KPIs; resto del hub = Landings | R-DUENO-URL; escalera_top10 1.1.0+ |
| Control | 15 % por semilla propia de cada tanda (mr-control-v9t, -v93, -v94…); el control nunca recibe la intervención | cada herramienta + seo/mega/*_control.json |
| Alcance | inocuidad EN ESPERA (D-V10a); sin comparaciones de marcas ni cursos; legales excluidas | expresión INOCUIDAD (MR_INOCUIDAD=1 reactiva), seo/exclusiones_intervencion.json |
| Secretos | ningún secreto en logs, commits, documentos, traspasos ni _PARA_BORRAR/ | receptor_semrush y armar_traspaso los rechazan |
Seguimiento de piezas (7.378) · plan técnico de keywords · canibalización (dueñas) · Search Console 90 d por URL · Bing Webmaster (páginas) · Copilot (citas por página) · GA4 90 d (vistas y conversiones) · Semrush: posiciones por URL, Keyword Strategy Builder, AI Overviews con impresiones propias, Site Audit › AI Search, AI Traffic, Keyword Magic, Keyword Gap · Ubersuggest · AnswerThePublic · temas de la competencia · rondas de Semrush consolidadas (posiciones por URL y acciones, tools/semrush_consolidar.py) · repertorio de YouTube del canal · decisión por video · palanca video_youtube · palanca hipotesis (plan_dormidas + elegir_duena + páginas con impresiones sin acción). Si una falta, la tarjeta «gerente» del Pulso se pone en rojo (seo/gerente/resumen_<F>.md).
sequenceDiagram
participant D as Diego (Finder)
participant L as Lanzador .command
participant H as Herramientas
participant G as Guardianes
participant S as Servidores (8 sitios)
D->>L: doble clic (puede quedar en fila)
L->>L: pgrep: espera a toda corrida de Listas
L->>L: exige la bandera de la tanda anterior
L->>H: autopruebas · golden · pulso · gerente al día
H->>H: plan en seco + control 15 % (semilla propia)
H->>H: redactar (CLI) → aplicar → PDF → enlaces (vivo 200 → aplicar)
L->>G: TERMINAR HOY (paso 5): C1, cifras, GA, integridad, identidad
alt verde
G->>S: UNA publicación SFTP, sitemap solo suma
S-->>L: en vivo 200 + muestra de cambios
L->>H: indexación · seguimiento · hito · gerente · plan
L->>L: escribe cola/_tanda_<x>_<F>_hecho.flag
else rojo
G-->>L: [Proceso detenido] sin bandera → las siguientes se detienen solas
endReglas de operación: nunca dos publicaciones a la vez; nunca se edita un .command que corre; el patrón pgrep de una tanda no incluye a las que vienen después (sin abrazo mortal); los lanzadores se abren por Finder (Diego o Claude con computer use; con la pantalla bloqueada, Finder no responde). Fila del 27-10: V9-1b → HUECOS → V9-3 → V9-4 → PILARES → V9-5 (D-V10b) → PILARES 2 (/dark/ revisado: forma del AIO, México y Colombia, videos) → VIDEOS (videos del canal donde el gerente los recomienda).
| Momento | Guardián | Qué para |
|---|---|---|
| Antes de tocar | autopruebas de cada herramienta; tests/golden_builder.py check; tests/test_pulso_cobertura.py | código roto, render cambiado sin re-base, herramienta sin tarjeta del Pulso |
| Antes de redactar | pre-vuelo de cifras; guarda anti-canibalización; juez de sentido del refuerzo | temas sin cifras verificadas, choque con una pieza dueña, FAQ sin sentido |
| Antes de publicar | contrato de cifras C1/C2/C3; cifras verificadas; verificar_ga; integridad de la red; identidad externa; dependencias de página | más números sin fuente, medición mixta, 404/noindex/canonical roto |
| Después de publicar | en vivo 200; muestra de enlaces/PDF; pilares.py verificar | lo que no llegó al servidor |
| En el informe | tools/guardian_reporte.py 1.0.1 (G1-G5): tablas, páginas a intervenir, inventario = sitemaps, acumulado = inventario al corte | un plan con cifras que no cuadran (NO CONFIABLE) |
Cuando un guardián frena, se arregla la causa y se verifica con su prueba; nunca se baja el guardián (RUNBOOK §12.7).
RESUMEN_PROFUNDIZACION_<n>.md y pNN_….json con una lista acciones (tipo, URL o tema, frase, volumen, país, dueño, motivo).receptor_semrush.py; síntesis y datos → semrush_consolidar.py (dueño resuelto, sin inocuidad) → gerente (fuente 18), escalera_top10, temas_competencia, plan y traspaso. Nunca se guarda una credencial ni una cabecera.serp_features (aio).docs/SEMRUSH_GUIA.md, docs/SEMRUSH_OPCIONES.md.docs/planes/constructores/construir_plan_v9_2026-10-26.py arma el plan sobre el V8 y el v7, con:
tools/plan_html/v9_listas.py 1.11.0): gerente, portafolio, palancas, hoy, top por valor, activos, 17 mercados, tráfico, Semrush 34-38 · 39-43 · 44-53 · 54-62 · 63-73, opciones de Semrush, pendientes y calendario; desde el 28-10 también oportunidades (mapa) y las seis de la V11: hipótesis y aprendizaje, canibalización con dueña multivariable, dormidas al ataque, árbol de temas, páginas nuevas con procedimiento completo y salud del motor (70 secciones).tools/plan_html/integrar_fx.py --escribir): portada 3D LAR 1.3.0, secciones LVZ9 (barras con ejes nombrados), profundidad LPR 1.2.5 (título, ejes y fuente de cada gráfica), red en vivo LXI 1.2.0 (respiración de luz), kit F39. Regla R-GRAFICA-EJES: toda gráfica con título, fuente, ejes nombrados con unidad y escala. Catálogo: docs/FX_CATALOGO_LISTAS.md.| Motor | Qué recibe de Listas | Qué le da a Listas | Canal |
|---|---|---|---|
Landings (_MR_Landings, solo lectura desde aquí) | hallazgos por URL suya, herramientas portables, ejemplos de lanzador | respuestas, paquetes de datos, cuota de indexación cedida | zips de docs/traspasos/ (último consolidado: ACTUALIZACION_LISTAS_A_LANDINGS_2026-10-27n.zip) |
KPIs (/kpi-dashboard/) | solo informe | — | traspaso |
| MR Central | aportes al Kit Portable | Kit 1.154.0, cerebro de marca | docs/INTEGRACION_CON_MR_CENTRAL.md |
tools/inventario_publicado.py (sitemaps de los 8 sitios) → seo/inventario/publicadas_<F>.json.v9d), V9-2 párrafos (v9t: medido en Semrush 417 → 3 frente a control 69 → 69), V9-3 (mr-control-v93), V9-4 (mr-control-v94, destinos y orígenes), V9-5 pareja (mr-control-v95, orígenes). Lecturas: 21-11 (T27, T28, MEGA, K, V8-1) y 23-11 (V9 contra control, tools/v9t_parrafos.py medir).seo/hitos_intervencion.json (cada tanda deja el suyo).tools/ con VERSION, docstring con «Uso», --autoprueba y plan en seco.seo/pulso_cobertura.json (si no, el Pulso falla).pgrep, exige la bandera anterior, una publicación con guardianes, bandera propia; chmod 755.CHANGELOG.md, regla en CLAUDE.md, fila en docs/HERRAMIENTAS_CLI.md, método en el RUNBOOK si cambia, sección o pendiente en el plan (gráfica con ejes), CONTINUAR_AQUI y, si aplica a Landings, traspaso por manifiesto.sh ./mrgit commit "<mensaje>" --solo <rutas>; nada se borra: lo que se va a borrar va a _PARA_BORRAR/ y toda copia de seguridad a respaldos/ (R-PARA-BORRAR-SOLO-BORRABLE, 28-10).Creado por MASTERESTAURANT®.
| Pieza | Qué hace | Dónde |
|---|---|---|
| Videos al nacer | orquestar._render_incremental llama a videos_aplicar.para_piezas_nuevas() antes del render: cada pieza nueva recibe su video del canal con las reglas del gerente (control 15 %, una vez por pieza, fail-open). EN = enlace con miniatura, sin reproductor ni VideoObject (engine/videos 1.3.0). | orquestar.py, tools/videos_aplicar.py 1.1.0, engine/videos.py 1.3.0 |
| Cadena V10 | V10-1 (FAQ y AIO literal) → V10-3 (canal → web) → V10-4 (temas sin cifras y dormidas), por bandera y pgrep; V10-2 (lectura GA4) aparte, sin publicar. | lanzadores TANDA V10-* |
| Medición de conversión | 8 propiedades GA4 con eventos clave cta_click/file_download/form_submit y dimensiones oferta/tema/posicion (27-10); lectura con la Data API. | tools/ga4_conversion.py 1.0.0 |
| Canal → web | Descripción sugerida por video con su página dueña. | tools/videos_descripciones.py 1.0.0 |
| Respaldos | Toda copia previa va a respaldos/ (fuera de git); _PARA_BORRAR/ solo lo borrable. | 23 herramientas, R-PARA-BORRAR-SOLO-BORRABLE |
| Filtro de foco | temas_competencia.INOCUIDAD 1.3.1, compartido por gerente, escalera, plantar_competencia y los lotes V10. | tools/temas_competencia.py |
El motor ya no espera a tener evidencia perfecta. Decide, plantea una hipótesis con su control, la lee a los 28 días y aprende (Diego, 28-10 07:18-07:26). Cuatro piezas nuevas se conectan con el gerente y el plan:
| Pieza | Qué decide | Entra por | Sale hacia |
|---|---|---|---|
tools/elegir_duena.py 1.1.1 (R-DUENA-MULTIVARIABLE, docs/METODO_ELECCION_DUENA.md) | Qué página del motor es la dueña de cada consulta que 2+ URL de la red se disputan. Usa 8 variables con pesos explícitos (aprendidos si hay lecturas), margen, estabilidad Monte Carlo y guardas de evidencia. Siempre decide: si hay poca evidencia, la decisión es una hipótesis de confianza baja. Landings no compite ni recibe nada. | Search Console consulta × URL (8 sitios), expedientes del gerente | seo/duenas_manuales.json → duenas_por_frase → render (tarjeta). Las otras páginas se redactan hacia su propio foco con optimizar_pareja (TANDA V11-2). |
guarda_canibalizacion.py 1.2.0 · G5 | Que una página nueva no nazca donde la red ya gana (top 10 de cualquier sitio) ni donde ya hay 2+ URL compitiendo. | Search Console de la red + eleccion_duenas | lote.py, lote_familias, orquestar y temas_competencia --crear-temas: es el motor principal cuando crea cientos de páginas. |
tools/plan_dormidas.py 1.0.0 | Para cada página sin tráfico (6.086): estado de indexación (UI), un foco libre por evidencia, chequeo técnico SEO/AEO, acciones, hipótesis y control 15 %. | Expedientes, Search Console (UI y API), huecos, árbol de temas | cola/dormidas_reorientar_<F>_L<NN>.json → refuerzo_preguntas_reales (TANDA V11-5); enlaces desde el hub (construir/aplicar_enlaces_hub_satelite); indexación. |
tools/hipotesis.py 1.0.0 | El ciclo de aprendizaje: registra lo aplicado con su línea base, lee lo vencido contra el control y actualiza P(éxito) por clase (Beta con previas informadas). Con ≥ 30 lecturas de canibalización, ajusta los pesos de elegir_duena. | Lo anterior + Search Console | seo/hipotesis/modelo.json. P(éxito) se multiplica en la prioridad de plan_dormidas y se muestra en cada acción «hipotesis» del gerente. |
tools/gerente_seo_aeo.py 1.10.0 · palanca hipotesis | Donde no hay palanca probada, el gerente propone: • dormidas (de plan_dormidas);• canibalización (de elegir_duena);• con impresiones sin acción: FAQ literal de su keyword. Cada propuesta lleva confianza, P(éxito) y fecha de lectura. | Las salidas anteriores | Expedientes → tandas → plan. |
tools/arbol_temas.py 1.0.0 | Árbol tema → subtema → keywords, priorizado por la demanda de todas las fuentes (Search Console de la red, Semrush, canal, competencia, huecos), con su estado: hueco, oportunidad, competido o cubierto. | Fuentes de keywords + registro | demanda_temas.para_lote() (nivel «arbol») → lote.py: la creación nueva sigue las keywords, no solo los temas generales. Se rehace solo en cada plan. |
tools/auditar_piezas_nuevas.py 1.1.0 | Comprueba si cada página nueva hizo el procedimiento completo, con 10 controles (C1-C10): contenido ES y EN, render, en vivo, sitemap, schema, registro, envío a buscadores, seguimiento, video y llms. | Contenido, render, sitios en vivo | COMPLETAR PAGINAS NUEVAS (indexación y seguimiento de lo que falte). |
tools/salud_motor.py 1.0.0 | Comprueba que todo esté al día y conectado: • edad de 16 fuentes y salidas frente a su tope; • los 219 lanzadores y las referencias del panel apuntan a archivos que existen. | Disco | Plan («Salud del motor») y arquitectura HTML. |
Cadena del 28-10:
Cada tanda se encadena por bandera y pgrep, y ninguna espera a otra posterior.
Siempre al día:
mapa_oportunidades corre hipotesis.actualizar() y el constructor del plan rehace docs/ARQUITECTURA.html (tools/arquitectura_html.py, con el estado vivo de salud_motor).BAJAR SEARCH CONSOLE rehace la auditoría de demanda (G1), la elección de dueñas, las hipótesis y la salud del motor.demanda_temas rehace el árbol de temas.Reglas que gobiernan esta capa:
respaldos/.Este documento tiene una sola versión en HTML, siempre al día: docs/ARQUITECTURA.html (local) y su copia web https://www.masterestaurant.com/arquitecturablogs.html (noindex,follow, como universo.html). Las rehace tools/arquitectura_html.py 2.1.0 al final de cada tanda, con el modelo de datos real del día. Sin artifacts (Diego 28-10 07:39-07:47).
#capa-<id>). El documento completo va al final, plegado por secciones y con buscador.tools/plan_html/fx/arquitectura_atlas.{js,css}; catálogo docs/FX_CATALOGO_LISTAS.md §6. Se hizo en 3 pasadas gráficas y 5 de profundización.