{"id":"cs-1782777290148-ovupusb4","status":"done","createdAt":1782777290148,"finishedAt":1782777445881,"meta":{"projectName":"xzonassite","projectPath":"C:\\xampp\\htdocs\\xzonassite","messagePreview":"Primero redacta un roadmap completo que almacenaras en tu memoria, y no te desvies del orden y sin omitir nada. Document","missionId":null,"phaseId":null},"events":[{"event":"status","data":{"text":"Modo IDE / sesión — completo (80 herramientas, uso selectivo)"},"at":1782777290161},{"event":"status","data":{"text":"Agente"},"at":1782777290173},{"event":"status","data":{"text":"Modo revisión: snapshot local por archivo"},"at":1782777290173},{"event":"agent","data":{"agentId":"agent-68837bf5-6493-4b13-8d15-db5be7ca19a2","projectPath":"C:\\xampp\\htdocs\\xzonassite"},"at":1782777290173},{"event":"changes","data":{"sessionId":"cs-1782777290161-debo7k","pending":0},"at":1782777290173},{"event":"status","data":{"text":"Procesando…"},"at":1782777290279},{"event":"text","data":{"chunk":"Revisando el transcript del hilo anterior para entender el estado del trabajo y redactar el roadmap completo.\n"},"at":1782777445881},{"event":"tool_activity","data":{"activity":{"id":"tool_483edbcf-c9d5-4924-8c4e-60a0f7e085f","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-29T23:55:01.469Z"}},"at":1782777301469},{"event":"tool_activity","data":{"activity":{"id":"tool_92c2891c-8739-4644-b58a-c528c68fe92","name":"grep","status":"completed","summary":"grep: C:\\Users\\Paterna\\.cursor\\projects\\C-xampp-htdocs-xzonassite\\agent-transcripts","detail":"","at":"2026-06-29T23:55:04.458Z"}},"at":1782777304458},{"event":"tool_activity","data":{"activity":{"id":"tool_2c93dda2-7fd5-46b0-955e-c496beac936","name":"read","status":"completed","summary":"read: …9b1dd7-7869-4e0c-9c39-a9a3a107120d\\b89b1dd7-7869-4e0c-9c39-a9a3a107120d.jsonl","detail":"","at":"2026-06-29T23:55:09.414Z"}},"at":1782777309414},{"event":"tool_activity","data":{"activity":{"id":"tool_8e007b3a-92ed-4ee2-ab6c-9427597ffd9","name":"grep","status":"completed","summary":"grep: …9b1dd7-7869-4e0c-9c39-a9a3a107120d\\b89b1dd7-7869-4e0c-9c39-a9a3a107120d.jsonl","detail":"","at":"2026-06-29T23:55:14.162Z"}},"at":1782777314162},{"event":"tool_activity","data":{"activity":{"id":"tool_160d7c52-e05b-4ce7-ad13-1adde0409f0","name":"read","status":"completed","summary":"read: …-09ef-4346-9fec-10cec042ee5b\\agent-4f769eff-09ef-4346-9fec-10cec042ee5b.jsonl","detail":"","at":"2026-06-29T23:55:15.120Z"}},"at":1782777315120},{"event":"tool_activity","data":{"activity":{"id":"tool_e63bb8db-ed5e-4970-8e86-856e33ad4a6","name":"grep","status":"completed","summary":"grep: …9b1dd7-7869-4e0c-9c39-a9a3a107120d\\b89b1dd7-7869-4e0c-9c39-a9a3a107120d.jsonl","detail":"","at":"2026-06-29T23:55:16.752Z"}},"at":1782777316752},{"event":"tool_activity","data":{"activity":{"id":"tool_26699f5c-49f0-41ae-b128-88f850eba35","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\docs\\seo\\ROADMAP_OPTIMIZACION_FASE2_2026-06-04.md","detail":"","at":"2026-06-29T23:55:25.500Z"}},"at":1782777325501},{"event":"tool_activity","data":{"activity":{"id":"tool_0cae7f6d-de28-422c-9379-e1f8eedc800","name":"grep","status":"completed","summary":"grep: …9b1dd7-7869-4e0c-9c39-a9a3a107120d\\b89b1dd7-7869-4e0c-9c39-a9a3a107120d.jsonl","detail":"","at":"2026-06-29T23:55:27.064Z"}},"at":1782777327064},{"event":"tool_activity","data":{"activity":{"id":"tool_4e8701e7-f560-41e7-9c43-bbcd0d47949","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\includes\\filter_page_engine.php","detail":"","at":"2026-06-29T23:55:27.357Z"}},"at":1782777327357},{"event":"tool_activity","data":{"activity":{"id":"tool_af3f1d6d-dec5-4eed-b797-0c60ec257de","name":"shell","status":"running","summary":"shell","detail":"Get-Content \"C:\\Users\\Paterna\\.cursor\\projects\\C-xampp-htdocs-xzonassite\\agent-transcripts\\b89b1dd7-7869-4e0c-9c39-a9a3a107120d\\b89b1dd7-7869-4e0c-9c39-a9a3a107120d.jsonl\" -Tail 15","at":"2026-06-29T23:55:32.152Z"}},"at":1782777332152},{"event":"tool_activity","data":{"activity":{"id":"tool_784843ee-4752-4cd2-a580-02e2ed487ce","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-29T23:55:43.145Z"}},"at":1782777343145},{"event":"tool_activity","data":{"activity":{"id":"tool_af3f1d6d-dec5-4eed-b797-0c60ec257de","name":"shell","status":"completed","summary":"shell","detail":"Get-Content \"C:\\Users\\Paterna\\.cursor\\projects\\C-xampp-htdocs-xzonassite\\agent-transcripts\\b89b1dd7-7869-4e0c-9c39-a9a3a107120d\\b89b1dd7-7869-4e0c-9c39-a9a3a107120d.jsonl\" -Tail 15","at":"2026-06-29T23:55:43.658Z"}},"at":1782777343658},{"event":"text","data":{"chunk":"Consolidando los hilos del transcript en un roadmap maestro único y guardándolo en memoria antes de implementar.\n"},"at":1782777445881},{"event":"tool_activity","data":{"activity":{"id":"tool_2a2db24a-4561-4812-a65d-48b37881a02","name":"edit","status":"completed","summary":"edit: C:\\xampp\\htdocs\\xzonassite\\docs\\seo\\ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md","detail":"","at":"2026-06-29T23:57:04.513Z"}},"at":1782777424513},{"event":"file_change","data":{"sessionId":"cs-1782777290161-debo7k","change":{"id":"ch-1","path":"docs\\seo\\ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md","type":"edit","diffString":"--- /dev/null\n+++ b/C:\\xampp\\htdocs\\xzonassite\\docs\\seo\\ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md\n@@ -1 +1,322 @@\n+# Roadmap maestro full stack — xzonasvalencia.com\n \n+**Proyecto:** `C:\\xampp\\htdocs\\xzonassite`  \n+**Entorno lab:** `:9080` · **Producción:** `https://xzonasvalencia.com`  \n+**Actualizado:** 2026-06-30  \n+**Regla UI móvil:** no alterar diseño salvo requisito SEO explícito.\n+\n+---\n+\n+## Estado global (resumen)\n+\n+| Bloque | Estado | Bloqueante |\n+|--------|--------|------------|\n+| Fase 1 — Auditoría base | ✅ 100% | — |\n+| Fase 2 — Rendimiento HTML/JS | ⏳ ~60% | 2.4, 2.5 |\n+| Fase 2.b — PageSpeed / GSC CWV | ⏳ ~40% | mobile LCP lab + CrUX |\n+| Fase 3 — GA4 estable | ⏳ 0% deploy | FTP operador |\n+| Fase 4 — SiteGround / CDN | ⏳ 0% | manual SG |\n+| Fase 5 — SEO Filter Pages | ⏳ 0% código | P1 quick wins |\n+| Fase 6 — SEO Command Center hub | ⏳ Fase A ok | Fases B–D |\n+| Fase 7 — API grid / caché prod | ⏳ código ok | deploy + carpeta caché |\n+| Fase 8 — Tareas operador | 📋 manual | operador |\n+\n+**Orden obligatorio:** Fase 1 → 2 → 2.b → 3 → 4 → 5 → 6 → 7 → 8.  \n+No iniciar fase N+1 hasta que la fase N esté al **100%** con verificación documentada.\n+\n+---\n+\n+## Fase 1 — Auditoría producción base ✅ COMPLETA\n+\n+| ID | Tarea | Archivos | Verificación | Estado |\n+|----|-------|----------|--------------|--------|\n+| 1.1 | Auditoría home desktop/mobile/bot | `ops/site-health-audit.php`, `run_seo_audit_cli.php` | Score SEO ≥85, HTTP 200 los 3 perfiles | ✅ |\n+| 1.2 | Fix GA4 ausente en landings | `landing-page.php`, `includes/google-analytics-unified.php` | `php -l` OK; gtag en HTML landing | ✅ código |\n+| 1.3 | Eliminar credenciales DB en `analyticstracking.php` | `analyticstracking.php` | Sin fallback hardcoded | ✅ |\n+| 1.4 | Herramienta salud unificada | `ops/site-health-audit.php`, `ops/pagespeed-audit.php` | `composer audit:full` ejecuta | ✅ |\n+| 1.5 | Informes y baseline | `docs/seo/AUDITORIA_PRODUCCION_INTEGRAL_2026-06-04.md`, `storage/audits/site-health-baseline.json` | Artefactos presentes | ✅ |\n+\n+**Criterio cierre Fase 1:** informe + baseline + fix GA4 en repo. ✅\n+\n+---\n+\n+## Fase 2 — Rendimiento HTML/JS (código visitante)\n+\n+| ID | Tarea | Archivos | Verificación | Estado |\n+|----|-------|----------|--------------|--------|\n+| 2.1 | Diferir `grid-mobile-lightbox` idle móvil | `templates/visitor_template.php` | Galería abre tras tap | ✅ |\n+| 2.2 | Reducir scripts sync footer | `templates/visitor_template.php` | −1 script sync móvil home | ✅ parcial |\n+| 2.3 | Fix `grid-unificado-patch.js` + min/manifest | `js/`, `getProdJsUrl()` | Sin SyntaxError; `.min.js` en prod | ✅ |\n+| 2.4 | HTML home <600 KB efectivos | SSR, `menuTop.php`, idle scripts | `site-health-audit` html_weight PASS | ⏳ ~940 KB |\n+| 2.5 | Cache-Control home cookie +18 | `includes/sg_dynamic_cache.php` | TTFB ↓ sin romper gate edad | ⏳ |\n+\n+### Subfases implementación 2.4\n+\n+1. **2.4.a** — Auditar peso por bloque (menuTop inline, grid SSR, scripts head).\n+2. **2.4.b** — Extraer CSS crítico inline duplicado a archivo cacheable (sin cambiar look).\n+3. **2.4.c** — Lazy/defer scripts no críticos restantes en `visitor_template.php`.\n+4. **2.4.d** — Re-ejecutar `php ops/site-health-audit.php --skip-links` → PASS html_weight.\n+\n+### Subfases implementación 2.5\n+\n+1. **2.5.a** — Revisar headers actuales con curl + cookie +18.\n+2. **2.5.b** — Ajustar `sg_dynamic_cache.php` TTL segmentado (edad verificada vs bot).\n+3. **2.5.c** — Validar TTFB desktop/mobile <800 ms en 3 requests.\n+\n+**Comando validación Fase 2:**\n+```bash\n+php ops/site-health-audit.php --skip-links --compare=storage/audits/site-health-baseline.json\n+python ops/_audit_prod_resources.py --json\n+```\n+\n+**Criterio cierre Fase 2:** 2.1–2.5 todos ✅ + comparativa baseline mejorada.\n+\n+---\n+\n+## Fase 2.b — PageSpeed Insights / GSC Core Web Vitals (OBLIGATORIA)\n+\n+Integración PSI API (lab) + CrUX field (misma fuente GSC → Experiencia → CWV).\n+\n+| ID | Tarea | Herramienta | Criterio PASS | Estado |\n+|----|-------|-------------|---------------|--------|\n+| 2.b.1 | PSI **mobile** lab | `ops/pagespeed-audit.php` | score ≥55, LCP ≤4500 ms | ⚠️ 3.8–6.5 s |\n+| 2.b.2 | PSI **desktop** lab | `ops/pagespeed-audit.php` | score ≥65, LCP ≤3500 ms | ✅ 90–96 |\n+| 2.b.3 | Ambos perfiles PASS CLI | `composer audit:pagespeed` exit 0 | mobile + desktop gates | ⚠️ mobile |\n+| 2.b.4 | CrUX field (GSC) | PSI `loadingExperience` | FAST/GOOD móvil+desktop | ⚠️ AVERAGE/SLOW |\n+| 2.b.5 | Baseline PSI registrado | `storage/audits/pagespeed-latest.json` | Comparar antes/después | ✅ herramienta |\n+\n+### Gates CWV estrictos (objetivo Google \"good\")\n+\n+| Métrica | Mobile p75 | Desktop p75 |\n+|---------|------------|-------------|\n+| LCP | ≤ 2500 ms | ≤ 2500 ms |\n+| INP | ≤ 200 ms | ≤ 200 ms |\n+| CLS | ≤ 0.10 | ≤ 0.10 |\n+\n+Modo estricto: `php ops/pagespeed-audit.php --strict` (exit 2 si no cumple).\n+\n+### Subfases implementación 2.b (mobile LCP)\n+\n+1. **2.b.i** — Identificar LCP element en PSI mobile (hero, logo, grid img).\n+2. **2.b.ii** — Priorizar imagen LCP: `fetchpriority=high`, preload, variant `t1` (ya parcial en grid).\n+3. **2.b.iii** — Reducir TBT: diferir `grid-unificado-patch.js` post-LCP si no rompe UX.\n+4. **2.b.iv** — Deploy Fase 2 + re-ejecutar `composer audit:pagespeed`.\n+5. **2.b.v** — Registrar PASS mobile+desktop en `storage/audits/pagespeed-latest.json`.\n+\n+### Checklist manual GSC (operador, tras deploy)\n+\n+- [ ] GSC → Experiencia → CWV → URLs móvil OK\n+- [ ] GSC → Experiencia → CWV → URLs ordenador OK\n+- [ ] GSC → Rendimiento → CTR 7d vs baseline\n+- [ ] GSC → Sitemaps → `sitemap-index.xml` sin errores\n+- [ ] Inspección URL home → disponible + screenshot móvil\n+\n+**Criterio cierre Fase 2.b:** `composer audit:pagespeed` exit 0 + checklist GSC marcado.\n+\n+---\n+\n+## Fase 3 — Medición GA4 estable\n+\n+| ID | Tarea | Archivos / acción | Verificación | Estado |\n+|----|-------|-------------------|--------------|--------|\n+| 3.1 | Deploy `landing-page.php` GA4 unificado | SFTP prod | View-source landing con gtag | ⏳ FTP |\n+| 3.2 | DebugView landing + home cookie +18 | GA4 panel | eventos `page_view` únicos | ⏳ |\n+| 3.3 | Reducir duplicados scroll/page_view | `ga4-events-tracker.js`, docs 2026-05-07 | DebugView sin doble page_view | ⏳ |\n+\n+**Criterio cierre Fase 3:** 3 URLs muestra (home, landing, ficha) con GA4 en DebugView sin duplicados.\n+\n+---\n+\n+## Fase 4 — SiteGround / CDN / PHP extensions\n+\n+| ID | Tarea | Responsable | Verificación | Estado |\n+|----|-------|-------------|--------------|--------|\n+| 4.1 | Revisar Anti-Bot 403 UA incompletos | Dev + SG | Desktop 200 con cookies | ⏳ |\n+| 4.2 | SuperCacher home con cookie edad | Operador SG | TTFB cache HIT | ⏳ |\n+| 4.3 | Brotli assets estáticos | Operador SG | `content-encoding: br` | ⏳ |\n+| 4.4 | Extensiones PHP: memcached+opcache ON; redis opcional | Operador | Panel SG screenshot | ⏳ |\n+| 4.5 | Carpeta `storage/cache/api_grid/` escribible | Operador | `X-Grid-Cache: HIT` 2ª req | ⏳ |\n+\n+Ref: `docs/TAREAS_MANUALES_OPERADOR_2026-06-04.md`\n+\n+**Criterio cierre Fase 4:** checklist operador completo + TTFB home mejorado documentado.\n+\n+---\n+\n+## Fase 5 — SEO Filter Pages (`/filtro/{slug}`)\n+\n+**Archivos núcleo:** `filter-page.php`, `includes/filter_page_engine.php`, `sitemap-filtros.php`, `cron_filter_pages_refresh.php`, `gestion-anuncios-anunciantes/herramientas/filter-pages-manager.php`\n+\n+Estado actual: ~36 seed, ~10 indexables, 72% noindex por `<3` anuncios.\n+\n+### P0 — Inventario y thin content\n+\n+| ID | Tarea | Archivo | Verificación | Estado |\n+|----|-------|---------|--------------|--------|\n+| 5.0.1 | Auditar columnas reales vs seed (`color_piel`, etc.) | seed SQL + `fpe_build_where()` | Query COUNT por filtro_key | ⏳ |\n+| 5.0.2 | Fallback `filtros_txt LIKE` si COUNT < 3 | `filter_page_engine.php` | Slugs vacíos recuperan anuncios | ⏳ |\n+| 5.0.3 | Auto-`activo=0` tras N refreshes con total=0 | `fpe_refresh_page()` | Sitemap sin URLs vacías | ⏳ |\n+| 5.0.4 | `intro_html`/`outro_html` mínimos en 10 indexables | filter-pages-manager / IA | ≥300 palabras indexables | ⏳ |\n+| 5.0.5 | Alinear doc vs código noindex vacío | `filter-page.php` L77 | Comentario = comportamiento | ⏳ |\n+\n+### P1 — Bugs SEO técnicos (quick wins, sin tocar UI móvil)\n+\n+| ID | Tarea | Archivo | Verificación | Estado |\n+|----|-------|---------|--------------|--------|\n+| 5.1.1 | JSON-LD ItemList URLs canónicas | `fpe_jsonld_itemlist()` | `xz_build_detalle_url()` | ⏳ |\n+| 5.1.2 | `BASE_URL` en lugar de dominio hardcodeado | `filter_page_engine.php` | Lab :9080 correcto | ⏳ |\n+| 5.1.3 | Paginación `?page=2+` → noindex,follow + canonical p1 | `filter-page.php` | View-source page=2 | ⏳ |\n+| 5.1.4 | FAQPage schema desde outro/FAQ JSON | `fpe_jsonld_faq()` nuevo | Rich Results Test | ⏳ |\n+\n+### P2 — Enlazado interno\n+\n+| ID | Tarea | Archivo | Verificación | Estado |\n+|----|-------|---------|--------------|--------|\n+| 5.2.1 | API lookup `/filtro/{slug}` por filtro activo | `api_seo_filter_lookup.php` | JSON slug si indexable | ⏳ |\n+| 5.2.2 | Banner grid al activar filtro equivalente | `js/grid-location-url-sync.js` | Banner visible sin cambiar layout | ⏳ |\n+| 5.2.3 | Bloque \"Búsquedas relacionadas\" footer | `filter-page.php` | 3–6 enlaces internos | ⏳ |\n+| 5.2.4 | Breadcrumb intermedio categoría | `fpe_breadcrumb()` | Schema BreadcrumbList | ⏳ |\n+\n+### P3 — Rich results\n+\n+| ID | Tarea | Verificación | Estado |\n+|----|-------|--------------|--------|\n+| 5.3.1 | `og:image` primera foto listado | OG debugger | ⏳ |\n+| 5.3.2 | Thumbs en cards (`fpe_fetch_anuncios`) | HTML con `<img loading=\"lazy\">` | ⏳ |\n+| 5.3.3 | `@graph` WebPage → ItemList `mainEntity` | Schema validator | ⏳ |\n+| 5.3.4 | Sitemap `lastmod` = `last_refresh` | `sitemap-filtros.php` | XML correcto | ⏳ |\n+\n+### P4 — Operativa GSC\n+\n+| ID | Tarea | Verificación | Estado |\n+|----|-------|--------------|--------|\n+| 5.4.1 | Submit ~10 URLs indexables | `ops/submit_gsc_priority_urls.php` | Cola GSC | ⏳ |\n+| 5.4.2 | Lab `sitemap-filtros.xml` no vacío | curl :9080 | ≥10 URLs | ⏳ |\n+| 5.4.3 | Columna último crawl GSC en admin | filter-pages-manager | UI panel | ⏳ |\n+\n+**Criterio cierre Fase 5:** P0+P1 al 100% verificados en lab; P2–P4 según prioridad negocio.\n+\n+---\n+\n+## Fase 6 — SEO Command Center hub (panel admin)\n+\n+Ref: `docs/MANUAL_SEO_UNIFICADO_PANEL.md`\n+\n+### Fase 6.A — Ya completada ✅\n+\n+- [x] 234 checks SEO+AEO+GEO\n+- [x] Autofix Pro landings\n+- [x] GA4 + GSC dashboard\n+- [x] Cron `cron_seo_command_center.php`\n+- [x] Seed sitemap XML\n+\n+### Fase 6.B — Consolidación UI (2–3 semanas)\n+\n+| ID | Tarea | Verificación | Estado |\n+|----|-------|--------------|--------|\n+| 6.B.1 | Menú único \"SEO Hub\" | Una entrada navegación | ⏳ |\n+| 6.B.2 | Tabs embebidas (landings, metrics, portal) | Sin duplicar pantallas | ⏳ |\n+| 6.B.3 | Deprecar `seo-comando-dashboard` | Redirect o aviso | ⏳ |\n+| 6.B.4 | Redirect `seosupertool/` → panel | HTTP 302 + mensaje | ⏳ |\n+\n+### Fase 6.C — Portar seosupertool (1 mes)\n+\n+| ID | Módulo legacy | Destino | Estado |\n+|----|---------------|---------|--------|\n+| 6.C.1 | verificar-indexacion.php | Tab Command Center | ⏳ |\n+| 6.C.2 | gsc-analisis-duplicados.php | Tab Command Center | ⏳ |\n+| 6.C.3 | Informe PDF semanal | Cron + email | ⏳ |\n+\n+### Fase 6.D — Escala indexación\n+\n+| ID | Tarea | Verificación | Estado |\n+|----|-------|--------------|--------|\n+| 6.D.1 | Cron SG 4×/día `source=all` seed 5000 | `site_audit_cron_log` | ⏳ |\n+| 6.D.2 | Autofix batch 10 nocturno | `site_audit_autofix_log` | ⏳ |\n+| 6.D.3 | IndexNow tras autofix | Log IndexNow | ⏳ |\n+\n+**Criterio cierre Fase 6:** 6.B completo + cron prod estable 7 días.\n+\n+---\n+\n+## Fase 7 — API grid rendimiento (visitante móvil)\n+\n+| ID | Tarea | Archivo | Verificación | Estado |\n+|----|-------|---------|--------------|--------|\n+| 7.1 | Caché JSON 45 s home sin filtros | `includes/api_grid_fast.php` | `X-Grid-Cache: HIT` | ✅ código |\n+| 7.2 | URLs foto sin `is_file()` | `api_anuncios_grid.php` | TTFB API <300 ms 2ª req | ✅ código |\n+| 7.3 | Tracking en shutdown | `api_anuncios_grid.php` | JSON no bloqueado | ✅ código |\n+| 7.4 | Thumbs `t1` en móvil | `js/grid-filter-handler.js` | Imágenes más ligeras | ✅ código |\n+| 7.5 | Deploy + carpeta caché prod | operador | MISS→HIT documentado | ⏳ |\n+\n+Ref: `docs/API_ANUNCIOS_GRID_ANALISIS_2026-06-04.md`\n+\n+**Criterio cierre Fase 7:** 7.5 verificado en prod; API <300 ms HIT.\n+\n+---\n+\n+## Fase 8 — Tareas manuales operador (paralelo, no bloquea dev)\n+\n+Documento: `docs/TAREAS_MANUALES_OPERADOR_2026-06-04.md`\n+\n+| ID | Tarea | Estado |\n+|----|-------|--------|\n+| 8.1 | Extensiones PHP SiteGround | ⏳ |\n+| 8.2 | SFTP deploy archivos modificados | ⏳ |\n+| 8.3 | Crear `storage/cache/api_grid/` 755 | ⏳ |\n+| 8.4 | Purga caché SG tras deploy | ⏳ |\n+| 8.5 | Cron SEO Command Center token real | ⏳ |\n+| 8.6 | Verificar home móvil post-deploy | ⏳ |\n+| 8.7 | Panel estadísticas anunciante | ⏳ |\n+\n+---\n+\n+## Archivos prioritarios (ya identificados en transcript)\n+\n+```\n+templates/visitor_template.php\n+includes/sg_dynamic_cache.php\n+includes/filter_page_engine.php\n+filter-page.php\n+sitemap-filtros.php\n+landing-page.php\n+api_anuncios_grid.php\n+includes/api_grid_fast.php\n+ops/pagespeed-audit.php\n+ops/site-health-audit.php\n+ops/includes/pagespeed_audit_lib.php\n+gestion-anuncios-anunciantes/includes/seo_command_audit_lib.php\n+cron_seo_command_center.php\n+```\n+\n+---\n+\n+## Comandos de validación global\n+\n+```bash\n+# Salud + comparativa\n+php ops/site-health-audit.php --skip-links --compare=storage/audits/site-health-baseline.json\n+\n+# PageSpeed mobile + desktop\n+composer audit:pagespeed\n+\n+# Auditoría completa\n+composer audit:full\n+\n+# Syntax PHP archivos tocados\n+php -l includes/filter_page_engine.php\n+php -l filter-page.php\n+\n+# Tail logs (nunca leer entero)\n+Get-Content xzonas_cron_filter_pages.log -Tail 80\n+```\n+\n+---\n+\n+## Próxima acción (turno siguiente)\n+\n+**Iniciar Fase 2 pendiente:** completar **2.4** (HTML home <600 KB) al 100% antes de tocar 2.5 o avanzar a 2.b.\n+\n+---\n+\n+*Memoria agente: sincronizar con TodoWrite IDs `fase-2` … `fase-8` tras cada hito.*","diffHtml":"<div class=\"diff-colored\"><div class=\"diff-line diff-meta\">--- /dev/null</div><div class=\"diff-line diff-meta\">+++ b/C:\\xampp\\htdocs\\xzonassite\\docs\\seo\\ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md</div><div class=\"diff-line diff-hunk\">@@ -1 +1,322 @@</div><div class=\"diff-line diff-add\">+# Roadmap maestro full stack — xzonasvalencia.com</div><div class=\"diff-line diff-ctx\"> </div><div class=\"diff-line diff-add\">+**Proyecto:** `C:\\xampp\\htdocs\\xzonassite`  </div><div class=\"diff-line diff-add\">+**Entorno lab:** `:9080` · **Producción:** `https://xzonasvalencia.com`  </div><div class=\"diff-line diff-add\">+**Actualizado:** 2026-06-30  </div><div class=\"diff-line diff-add\">+**Regla UI móvil:** no alterar diseño salvo requisito SEO explícito.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Estado global (resumen)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| Bloque | Estado | Bloqueante |</div><div class=\"diff-line diff-add\">+|--------|--------|------------|</div><div class=\"diff-line diff-add\">+| Fase 1 — Auditoría base | ✅ 100% | — |</div><div class=\"diff-line diff-add\">+| Fase 2 — Rendimiento HTML/JS | ⏳ ~60% | 2.4, 2.5 |</div><div class=\"diff-line diff-add\">+| Fase 2.b — PageSpeed / GSC CWV | ⏳ ~40% | mobile LCP lab + CrUX |</div><div class=\"diff-line diff-add\">+| Fase 3 — GA4 estable | ⏳ 0% deploy | FTP operador |</div><div class=\"diff-line diff-add\">+| Fase 4 — SiteGround / CDN | ⏳ 0% | manual SG |</div><div class=\"diff-line diff-add\">+| Fase 5 — SEO Filter Pages | ⏳ 0% código | P1 quick wins |</div><div class=\"diff-line diff-add\">+| Fase 6 — SEO Command Center hub | ⏳ Fase A ok | Fases B–D |</div><div class=\"diff-line diff-add\">+| Fase 7 — API grid / caché prod | ⏳ código ok | deploy + carpeta caché |</div><div class=\"diff-line diff-add\">+| Fase 8 — Tareas operador | 📋 manual | operador |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Orden obligatorio:** Fase 1 → 2 → 2.b → 3 → 4 → 5 → 6 → 7 → 8.  </div><div class=\"diff-line diff-add\">+No iniciar fase N+1 hasta que la fase N esté al **100%** con verificación documentada.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Fase 1 — Auditoría producción base ✅ COMPLETA</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Archivos | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|----------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 1.1 | Auditoría home desktop/mobile/bot | `ops/site-health-audit.php`, `run_seo_audit_cli.php` | Score SEO ≥85, HTTP 200 los 3 perfiles | ✅ |</div><div class=\"diff-line diff-add\">+| 1.2 | Fix GA4 ausente en landings | `landing-page.php`, `includes/google-analytics-unified.php` | `php -l` OK; gtag en HTML landing | ✅ código |</div><div class=\"diff-line diff-add\">+| 1.3 | Eliminar credenciales DB en `analyticstracking.php` | `analyticstracking.php` | Sin fallback hardcoded | ✅ |</div><div class=\"diff-line diff-add\">+| 1.4 | Herramienta salud unificada | `ops/site-health-audit.php`, `ops/pagespeed-audit.php` | `composer audit:full` ejecuta | ✅ |</div><div class=\"diff-line diff-add\">+| 1.5 | Informes y baseline | `docs/seo/AUDITORIA_PRODUCCION_INTEGRAL_2026-06-04.md`, `storage/audits/site-health-baseline.json` | Artefactos presentes | ✅ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Criterio cierre Fase 1:** informe + baseline + fix GA4 en repo. ✅</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Fase 2 — Rendimiento HTML/JS (código visitante)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Archivos | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|----------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 2.1 | Diferir `grid-mobile-lightbox` idle móvil | `templates/visitor_template.php` | Galería abre tras tap | ✅ |</div><div class=\"diff-line diff-add\">+| 2.2 | Reducir scripts sync footer | `templates/visitor_template.php` | −1 script sync móvil home | ✅ parcial |</div><div class=\"diff-line diff-add\">+| 2.3 | Fix `grid-unificado-patch.js` + min/manifest | `js/`, `getProdJsUrl()` | Sin SyntaxError; `.min.js` en prod | ✅ |</div><div class=\"diff-line diff-add\">+| 2.4 | HTML home &lt;600 KB efectivos | SSR, `menuTop.php`, idle scripts | `site-health-audit` html_weight PASS | ⏳ ~940 KB |</div><div class=\"diff-line diff-add\">+| 2.5 | Cache-Control home cookie +18 | `includes/sg_dynamic_cache.php` | TTFB ↓ sin romper gate edad | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### Subfases implementación 2.4</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+1. **2.4.a** — Auditar peso por bloque (menuTop inline, grid SSR, scripts head).</div><div class=\"diff-line diff-add\">+2. **2.4.b** — Extraer CSS crítico inline duplicado a archivo cacheable (sin cambiar look).</div><div class=\"diff-line diff-add\">+3. **2.4.c** — Lazy/defer scripts no críticos restantes en `visitor_template.php`.</div><div class=\"diff-line diff-add\">+4. **2.4.d** — Re-ejecutar `php ops/site-health-audit.php --skip-links` → PASS html_weight.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### Subfases implementación 2.5</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+1. **2.5.a** — Revisar headers actuales con curl + cookie +18.</div><div class=\"diff-line diff-add\">+2. **2.5.b** — Ajustar `sg_dynamic_cache.php` TTL segmentado (edad verificada vs bot).</div><div class=\"diff-line diff-add\">+3. **2.5.c** — Validar TTFB desktop/mobile &lt;800 ms en 3 requests.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Comando validación Fase 2:**</div><div class=\"diff-line diff-add\">+```bash</div><div class=\"diff-line diff-add\">+php ops/site-health-audit.php --skip-links --compare=storage/audits/site-health-baseline.json</div><div class=\"diff-line diff-add\">+python ops/_audit_prod_resources.py --json</div><div class=\"diff-line diff-add\">+```</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Criterio cierre Fase 2:** 2.1–2.5 todos ✅ + comparativa baseline mejorada.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Fase 2.b — PageSpeed Insights / GSC Core Web Vitals (OBLIGATORIA)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+Integración PSI API (lab) + CrUX field (misma fuente GSC → Experiencia → CWV).</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Herramienta | Criterio PASS | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|-------------|---------------|--------|</div><div class=\"diff-line diff-add\">+| 2.b.1 | PSI **mobile** lab | `ops/pagespeed-audit.php` | score ≥55, LCP ≤4500 ms | ⚠️ 3.8–6.5 s |</div><div class=\"diff-line diff-add\">+| 2.b.2 | PSI **desktop** lab | `ops/pagespeed-audit.php` | score ≥65, LCP ≤3500 ms | ✅ 90–96 |</div><div class=\"diff-line diff-add\">+| 2.b.3 | Ambos perfiles PASS CLI | `composer audit:pagespeed` exit 0 | mobile + desktop gates | ⚠️ mobile |</div><div class=\"diff-line diff-add\">+| 2.b.4 | CrUX field (GSC) | PSI `loadingExperience` | FAST/GOOD móvil+desktop | ⚠️ AVERAGE/SLOW |</div><div class=\"diff-line diff-add\">+| 2.b.5 | Baseline PSI registrado | `storage/audits/pagespeed-latest.json` | Comparar antes/después | ✅ herramienta |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### Gates CWV estrictos (objetivo Google \"good\")</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| Métrica | Mobile p75 | Desktop p75 |</div><div class=\"diff-line diff-add\">+|---------|------------|-------------|</div><div class=\"diff-line diff-add\">+| LCP | ≤ 2500 ms | ≤ 2500 ms |</div><div class=\"diff-line diff-add\">+| INP | ≤ 200 ms | ≤ 200 ms |</div><div class=\"diff-line diff-add\">+| CLS | ≤ 0.10 | ≤ 0.10 |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+Modo estricto: `php ops/pagespeed-audit.php --strict` (exit 2 si no cumple).</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### Subfases implementación 2.b (mobile LCP)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+1. **2.b.i** — Identificar LCP element en PSI mobile (hero, logo, grid img).</div><div class=\"diff-line diff-add\">+2. **2.b.ii** — Priorizar imagen LCP: `fetchpriority=high`, preload, variant `t1` (ya parcial en grid).</div><div class=\"diff-line diff-add\">+3. **2.b.iii** — Reducir TBT: diferir `grid-unificado-patch.js` post-LCP si no rompe UX.</div><div class=\"diff-line diff-add\">+4. **2.b.iv** — Deploy Fase 2 + re-ejecutar `composer audit:pagespeed`.</div><div class=\"diff-line diff-add\">+5. **2.b.v** — Registrar PASS mobile+desktop en `storage/audits/pagespeed-latest.json`.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### Checklist manual GSC (operador, tras deploy)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+- [ ] GSC → Experiencia → CWV → URLs móvil OK</div><div class=\"diff-line diff-add\">+- [ ] GSC → Experiencia → CWV → URLs ordenador OK</div><div class=\"diff-line diff-add\">+- [ ] GSC → Rendimiento → CTR 7d vs baseline</div><div class=\"diff-line diff-add\">+- [ ] GSC → Sitemaps → `sitemap-index.xml` sin errores</div><div class=\"diff-line diff-add\">+- [ ] Inspección URL home → disponible + screenshot móvil</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Criterio cierre Fase 2.b:** `composer audit:pagespeed` exit 0 + checklist GSC marcado.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Fase 3 — Medición GA4 estable</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Archivos / acción | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|-------------------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 3.1 | Deploy `landing-page.php` GA4 unificado | SFTP prod | View-source landing con gtag | ⏳ FTP |</div><div class=\"diff-line diff-add\">+| 3.2 | DebugView landing + home cookie +18 | GA4 panel | eventos `page_view` únicos | ⏳ |</div><div class=\"diff-line diff-add\">+| 3.3 | Reducir duplicados scroll/page_view | `ga4-events-tracker.js`, docs 2026-05-07 | DebugView sin doble page_view | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Criterio cierre Fase 3:** 3 URLs muestra (home, landing, ficha) con GA4 en DebugView sin duplicados.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Fase 4 — SiteGround / CDN / PHP extensions</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Responsable | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|-------------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 4.1 | Revisar Anti-Bot 403 UA incompletos | Dev + SG | Desktop 200 con cookies | ⏳ |</div><div class=\"diff-line diff-add\">+| 4.2 | SuperCacher home con cookie edad | Operador SG | TTFB cache HIT | ⏳ |</div><div class=\"diff-line diff-add\">+| 4.3 | Brotli assets estáticos | Operador SG | `content-encoding: br` | ⏳ |</div><div class=\"diff-line diff-add\">+| 4.4 | Extensiones PHP: memcached+opcache ON; redis opcional | Operador | Panel SG screenshot | ⏳ |</div><div class=\"diff-line diff-add\">+| 4.5 | Carpeta `storage/cache/api_grid/` escribible | Operador | `X-Grid-Cache: HIT` 2ª req | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+Ref: `docs/TAREAS_MANUALES_OPERADOR_2026-06-04.md`</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Criterio cierre Fase 4:** checklist operador completo + TTFB home mejorado documentado.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Fase 5 — SEO Filter Pages (`/filtro/{slug}`)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Archivos núcleo:** `filter-page.php`, `includes/filter_page_engine.php`, `sitemap-filtros.php`, `cron_filter_pages_refresh.php`, `gestion-anuncios-anunciantes/herramientas/filter-pages-manager.php`</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+Estado actual: ~36 seed, ~10 indexables, 72% noindex por `&lt;3` anuncios.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### P0 — Inventario y thin content</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Archivo | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|---------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 5.0.1 | Auditar columnas reales vs seed (`color_piel`, etc.) | seed SQL + `fpe_build_where()` | Query COUNT por filtro_key | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.0.2 | Fallback `filtros_txt LIKE` si COUNT &lt; 3 | `filter_page_engine.php` | Slugs vacíos recuperan anuncios | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.0.3 | Auto-`activo=0` tras N refreshes con total=0 | `fpe_refresh_page()` | Sitemap sin URLs vacías | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.0.4 | `intro_html`/`outro_html` mínimos en 10 indexables | filter-pages-manager / IA | ≥300 palabras indexables | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.0.5 | Alinear doc vs código noindex vacío | `filter-page.php` L77 | Comentario = comportamiento | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### P1 — Bugs SEO técnicos (quick wins, sin tocar UI móvil)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Archivo | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|---------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 5.1.1 | JSON-LD ItemList URLs canónicas | `fpe_jsonld_itemlist()` | `xz_build_detalle_url()` | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.1.2 | `BASE_URL` en lugar de dominio hardcodeado | `filter_page_engine.php` | Lab :9080 correcto | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.1.3 | Paginación `?page=2+` → noindex,follow + canonical p1 | `filter-page.php` | View-source page=2 | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.1.4 | FAQPage schema desde outro/FAQ JSON | `fpe_jsonld_faq()` nuevo | Rich Results Test | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### P2 — Enlazado interno</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Archivo | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|---------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 5.2.1 | API lookup `/filtro/{slug}` por filtro activo | `api_seo_filter_lookup.php` | JSON slug si indexable | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.2.2 | Banner grid al activar filtro equivalente | `js/grid-location-url-sync.js` | Banner visible sin cambiar layout | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.2.3 | Bloque \"Búsquedas relacionadas\" footer | `filter-page.php` | 3–6 enlaces internos | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.2.4 | Breadcrumb intermedio categoría | `fpe_breadcrumb()` | Schema BreadcrumbList | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### P3 — Rich results</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 5.3.1 | `og:image` primera foto listado | OG debugger | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.3.2 | Thumbs en cards (`fpe_fetch_anuncios`) | HTML con `&lt;img loading=\"lazy\"&gt;` | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.3.3 | `@graph` WebPage → ItemList `mainEntity` | Schema validator | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.3.4 | Sitemap `lastmod` = `last_refresh` | `sitemap-filtros.php` | XML correcto | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### P4 — Operativa GSC</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 5.4.1 | Submit ~10 URLs indexables | `ops/submit_gsc_priority_urls.php` | Cola GSC | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.4.2 | Lab `sitemap-filtros.xml` no vacío | curl :9080 | ≥10 URLs | ⏳ |</div><div class=\"diff-line diff-add\">+| 5.4.3 | Columna último crawl GSC en admin | filter-pages-manager | UI panel | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Criterio cierre Fase 5:** P0+P1 al 100% verificados en lab; P2–P4 según prioridad negocio.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Fase 6 — SEO Command Center hub (panel admin)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+Ref: `docs/MANUAL_SEO_UNIFICADO_PANEL.md`</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### Fase 6.A — Ya completada ✅</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+- [x] 234 checks SEO+AEO+GEO</div><div class=\"diff-line diff-add\">+- [x] Autofix Pro landings</div><div class=\"diff-line diff-add\">+- [x] GA4 + GSC dashboard</div><div class=\"diff-line diff-add\">+- [x] Cron `cron_seo_command_center.php`</div><div class=\"diff-line diff-add\">+- [x] Seed sitemap XML</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### Fase 6.B — Consolidación UI (2–3 semanas)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 6.B.1 | Menú único \"SEO Hub\" | Una entrada navegación | ⏳ |</div><div class=\"diff-line diff-add\">+| 6.B.2 | Tabs embebidas (landings, metrics, portal) | Sin duplicar pantallas | ⏳ |</div><div class=\"diff-line diff-add\">+| 6.B.3 | Deprecar `seo-comando-dashboard` | Redirect o aviso | ⏳ |</div><div class=\"diff-line diff-add\">+| 6.B.4 | Redirect `seosupertool/` → panel | HTTP 302 + mensaje | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### Fase 6.C — Portar seosupertool (1 mes)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Módulo legacy | Destino | Estado |</div><div class=\"diff-line diff-add\">+|----|---------------|---------|--------|</div><div class=\"diff-line diff-add\">+| 6.C.1 | verificar-indexacion.php | Tab Command Center | ⏳ |</div><div class=\"diff-line diff-add\">+| 6.C.2 | gsc-analisis-duplicados.php | Tab Command Center | ⏳ |</div><div class=\"diff-line diff-add\">+| 6.C.3 | Informe PDF semanal | Cron + email | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+### Fase 6.D — Escala indexación</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 6.D.1 | Cron SG 4×/día `source=all` seed 5000 | `site_audit_cron_log` | ⏳ |</div><div class=\"diff-line diff-add\">+| 6.D.2 | Autofix batch 10 nocturno | `site_audit_autofix_log` | ⏳ |</div><div class=\"diff-line diff-add\">+| 6.D.3 | IndexNow tras autofix | Log IndexNow | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Criterio cierre Fase 6:** 6.B completo + cron prod estable 7 días.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Fase 7 — API grid rendimiento (visitante móvil)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Archivo | Verificación | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|---------|--------------|--------|</div><div class=\"diff-line diff-add\">+| 7.1 | Caché JSON 45 s home sin filtros | `includes/api_grid_fast.php` | `X-Grid-Cache: HIT` | ✅ código |</div><div class=\"diff-line diff-add\">+| 7.2 | URLs foto sin `is_file()` | `api_anuncios_grid.php` | TTFB API &lt;300 ms 2ª req | ✅ código |</div><div class=\"diff-line diff-add\">+| 7.3 | Tracking en shutdown | `api_anuncios_grid.php` | JSON no bloqueado | ✅ código |</div><div class=\"diff-line diff-add\">+| 7.4 | Thumbs `t1` en móvil | `js/grid-filter-handler.js` | Imágenes más ligeras | ✅ código |</div><div class=\"diff-line diff-add\">+| 7.5 | Deploy + carpeta caché prod | operador | MISS→HIT documentado | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+Ref: `docs/API_ANUNCIOS_GRID_ANALISIS_2026-06-04.md`</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Criterio cierre Fase 7:** 7.5 verificado en prod; API &lt;300 ms HIT.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Fase 8 — Tareas manuales operador (paralelo, no bloquea dev)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+Documento: `docs/TAREAS_MANUALES_OPERADOR_2026-06-04.md`</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+| ID | Tarea | Estado |</div><div class=\"diff-line diff-add\">+|----|-------|--------|</div><div class=\"diff-line diff-add\">+| 8.1 | Extensiones PHP SiteGround | ⏳ |</div><div class=\"diff-line diff-add\">+| 8.2 | SFTP deploy archivos modificados | ⏳ |</div><div class=\"diff-line diff-add\">+| 8.3 | Crear `storage/cache/api_grid/` 755 | ⏳ |</div><div class=\"diff-line diff-add\">+| 8.4 | Purga caché SG tras deploy | ⏳ |</div><div class=\"diff-line diff-add\">+| 8.5 | Cron SEO Command Center token real | ⏳ |</div><div class=\"diff-line diff-add\">+| 8.6 | Verificar home móvil post-deploy | ⏳ |</div><div class=\"diff-line diff-add\">+| 8.7 | Panel estadísticas anunciante | ⏳ |</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Archivos prioritarios (ya identificados en transcript)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+```</div><div class=\"diff-line diff-add\">+templates/visitor_template.php</div><div class=\"diff-line diff-add\">+includes/sg_dynamic_cache.php</div><div class=\"diff-line diff-add\">+includes/filter_page_engine.php</div><div class=\"diff-line diff-add\">+filter-page.php</div><div class=\"diff-line diff-add\">+sitemap-filtros.php</div><div class=\"diff-line diff-add\">+landing-page.php</div><div class=\"diff-line diff-add\">+api_anuncios_grid.php</div><div class=\"diff-line diff-add\">+includes/api_grid_fast.php</div><div class=\"diff-line diff-add\">+ops/pagespeed-audit.php</div><div class=\"diff-line diff-add\">+ops/site-health-audit.php</div><div class=\"diff-line diff-add\">+ops/includes/pagespeed_audit_lib.php</div><div class=\"diff-line diff-add\">+gestion-anuncios-anunciantes/includes/seo_command_audit_lib.php</div><div class=\"diff-line diff-add\">+cron_seo_command_center.php</div><div class=\"diff-line diff-add\">+```</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Comandos de validación global</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+```bash</div><div class=\"diff-line diff-add\">+# Salud + comparativa</div><div class=\"diff-line diff-add\">+php ops/site-health-audit.php --skip-links --compare=storage/audits/site-health-baseline.json</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+# PageSpeed mobile + desktop</div><div class=\"diff-line diff-add\">+composer audit:pagespeed</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+# Auditoría completa</div><div class=\"diff-line diff-add\">+composer audit:full</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+# Syntax PHP archivos tocados</div><div class=\"diff-line diff-add\">+php -l includes/filter_page_engine.php</div><div class=\"diff-line diff-add\">+php -l filter-page.php</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+# Tail logs (nunca leer entero)</div><div class=\"diff-line diff-add\">+Get-Content xzonas_cron_filter_pages.log -Tail 80</div><div class=\"diff-line diff-add\">+```</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+## Próxima acción (turno siguiente)</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+**Iniciar Fase 2 pendiente:** completar **2.4** (HTML home &lt;600 KB) al 100% antes de tocar 2.5 o avanzar a 2.b.</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+---</div><div class=\"diff-line diff-add\">+</div><div class=\"diff-line diff-add\">+*Memoria agente: sincronizar con TodoWrite IDs `fase-2` … `fase-8` tras cada hito.*</div></div>","linesAdded":321,"linesRemoved":0,"status":"pending"},"pending":1},"at":1782777424514},{"event":"tool_activity","data":{"activity":{"id":"tool_6d82cb0c-79f9-4108-ad87-e8f59a62888","name":"updateTodos","status":"completed","summary":"updateTodos","detail":"{\"todos\":[{\"content\":\"Fase 1 — Auditoría base (GA4 landings, site-health-audit)\",\"status\":\"completed\"},{\"content\":\"Fase…","at":"2026-06-29T23:57:09.837Z"}},"at":1782777429837},{"event":"text","data":{"chunk":"# Roadmap maestro — consolidado y guardado\n\nHe unificado los tres hilos del transcript ([auditoría producción](b89b1dd7-7869-4e0c-9c39-a9a3a107120d), [filter pages SEO](agent-4f769eff-09ef-4346-9fec-10cec042ee5b), [Command Center + UI móvil](b89b1dd7-7869-4e0c-9c39-a9a3a107120d)) en un único documento y en memoria de tareas.\n\n**Documento:** [`docs/seo/ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md`](C:\\xampp\\htdocs\\xzonassite\\docs\\seo\\ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md)\n\n---\n\n## Orden obligatorio (8 fases)\n\n| # | Fase | Estado | Bloqueante actual |\n|---|------|--------|-------------------|\n| 1 | Auditoría base (GA4, site-health-audit) | ✅ 100% | — |\n| 2 | Rendimiento HTML/JS (2.4 HTML <600 KB, 2.5 cache home) | ⏳ ~60% | 2.4, 2.5 |\n| 2.b | PageSpeed mobile+desktop PASS + GSC CWV | ⏳ ~40% | LCP móvil lab |\n| 3 | GA4 estable (deploy landing, DebugView) | ⏳ 0% | FTP operador |\n| 4 | SiteGround/CDN (Anti-Bot, SuperCacher, Brotli) | ⏳ 0% | manual SG |\n| 5 | SEO Filter Pages (P0→P1→P2→P3→P4) | ⏳ 0% código | `filter_page_engine.php` |\n| 6 | SEO Command Center hub (B→C→D) | ⏳ A ok | unificación UI |\n| 7 | API grid caché (deploy prod HIT) | ⏳ código ok | carpeta caché SG |\n| 8 | Tareas manuales operador | 📋 | `TAREAS_MANUALES_OPERADOR` |\n\n**Regla:** no se avanza a fase N+1 hasta cerrar la N al 100% con verificación documentada.\n\n---\n\n## Subfases detalladas por bloque activo\n\n### Fase 2 (siguiente en cola)\n- **2.4.a–d** — Auditar peso → extraer CSS duplicado → defer scripts → PASS `html_weight`\n- **2.5.a–c** — Headers curl → TTL `sg_dynamic_cache.php` → TTFB <800 ms\n\n### Fase 2.b (tras cerrar Fase 2)\n- PSI mobile LCP (preload hero, `fetchpriority`, defer post-LCP)\n- `composer audit:pagespeed` exit 0\n- Checklist GSC Experiencia → CWV\n\n### Fase 5 Filter Pages (archivos ya identificados)\n- **P1 quick win** (~15 líneas): `fpe_jsonld_itemlist()` + `BASE_URL` en `includes/filter_page_engine.php`\n- Sin tocar diseño móvil salvo SEO\n\n---\n\n## Memoria agente (TodoWrite)\n\n```\n✅ fase-1  — Auditoría base\n⏳ fase-2  — HTML/JS 2.4+2.5\n⏳ fase-2b — PageSpeed\n⏳ fase-3  — GA4\n⏳ fase-4  — SiteGround\n⏳ fase-5-p0 / fase-5-p1 / fase-5-p2p4 — Filter pages\n⏳ fase-6  — Command Center hub\n⏳ fase-7  — API grid prod\n⏳ fase-8  — Operador manual\n```\n\n---\n\n## Próximo turno (acción concreta)\n\n**Fase 2 → tarea 2.4.a:** auditar peso por bloque en home móvil (`menuTop.php` inline, grid SSR, scripts head) con `site-health-audit` + curl, sin modificar UI.\n\nConfirma si arranco con **2.4** o si prefieres saltar directamente a **Fase 5 P1** (filter pages JSON-LD, propuesta del hilo `:9080`)."},"at":1782777445881},{"event":"status","data":{"text":"Procesando…"},"at":1782777445868},{"event":"done","data":{"ok":true,"bridgeSessionId":"bs-1782527498115-0s4zbk","agentId":"agent-68837bf5-6493-4b13-8d15-db5be7ca19a2","runId":"run-a7745469-b914-42a0-bb2a-74b6701959d2","status":"finished","result":"# Roadmap maestro — consolidado y guardado\n\nHe unificado los tres hilos del transcript ([auditoría producción](b89b1dd7-7869-4e0c-9c39-a9a3a107120d), [filter pages SEO](agent-4f769eff-09ef-4346-9fec-10cec042ee5b), [Command Center + UI móvil](b89b1dd7-7869-4e0c-9c39-a9a3a107120d)) en un único documento y en memoria de tareas.\n\n**Documento:** [`docs/seo/ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md`](C:\\xampp\\htdocs\\xzonassite\\docs\\seo\\ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md)\n\n---\n\n## Orden obligatorio (8 fases)\n\n| # | Fase | Estado | Bloqueante actual |\n|---|------|--------|-------------------|\n| 1 | Auditoría base (GA4, site-health-audit) | ✅ 100% | — |\n| 2 | Rendimiento HTML/JS (2.4 HTML <600 KB, 2.5 cache home) | ⏳ ~60% | 2.4, 2.5 |\n| 2.b | PageSpeed mobile+desktop PASS + GSC CWV | ⏳ ~40% | LCP móvil lab |\n| 3 | GA4 estable (deploy landing, DebugView) | ⏳ 0% | FTP operador |\n| 4 | SiteGround/CDN (Anti-Bot, SuperCacher, Brotli) | ⏳ 0% | manual SG |\n| 5 | SEO Filter Pages (P0→P1→P2→P3→P4) | ⏳ 0% código | `filter_page_engine.php` |\n| 6 | SEO Command Center hub (B→C→D) | ⏳ A ok | unificación UI |\n| 7 | API grid caché (deploy prod HIT) | ⏳ código ok | carpeta caché SG |\n| 8 | Tareas manuales operador | 📋 | `TAREAS_MANUALES_OPERADOR` |\n\n**Regla:** no se avanza a fase N+1 hasta cerrar la N al 100% con verificación documentada.\n\n---\n\n## Subfases detalladas por bloque activo\n\n### Fase 2 (siguiente en cola)\n- **2.4.a–d** — Auditar peso → extraer CSS duplicado → defer scripts → PASS `html_weight`\n- **2.5.a–c** — Headers curl → TTL `sg_dynamic_cache.php` → TTFB <800 ms\n\n### Fase 2.b (tras cerrar Fase 2)\n- PSI mobile LCP (preload hero, `fetchpriority`, defer post-LCP)\n- `composer audit:pagespeed` exit 0\n- Checklist GSC Experiencia → CWV\n\n### Fase 5 Filter Pages (archivos ya identificados)\n- **P1 quick win** (~15 líneas): `fpe_jsonld_itemlist()` + `BASE_URL` en `includes/filter_page_engine.php`\n- Sin tocar diseño móvil salvo SEO\n\n---\n\n## Memoria agente (TodoWrite)\n\n```\n✅ fase-1  — Auditoría base\n⏳ fase-2  — HTML/JS 2.4+2.5\n⏳ fase-2b — PageSpeed\n⏳ fase-3  — GA4\n⏳ fase-4  — SiteGround\n⏳ fase-5-p0 / fase-5-p1 / fase-5-p2p4 — Filter pages\n⏳ fase-6  — Command Center hub\n⏳ fase-7  — API grid prod\n⏳ fase-8  — Operador manual\n```\n\n---\n\n## Próximo turno (acción concreta)\n\n**Fase 2 → tarea 2.4.a:** auditar peso por bloque en home móvil (`menuTop.php` inline, grid SSR, scripts head) con `site-health-audit` + curl, sin modificar UI.\n\nConfirma si arranco con **2.4** o si prefieres saltar directamente a **Fase 5 P1** (filter pages JSON-LD, propuesta del hilo `:9080`).","changeSessionId":"cs-1782777290161-debo7k","pendingChanges":1,"changes":[{"id":"ch-1","callId":"tool_2a2db24a-4561-4812-a65d-48b37881a02","path":"docs\\seo\\ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md","type":"edit","diffString":"--- /dev/null\n+++ b/C:\\xampp\\htdocs\\xzonassite\\docs\\seo\\ROADMAP_MAESTRO_FULLSTACK_2026-06-30.md\n@@ -1 +1,322 @@\n+# Roadmap maestro full stack — xzonasvalencia.com\n \n+**Proyecto:** `C:\\xampp\\htdocs\\xzonassite`  \n+**Entorno lab:** `:9080` · **Producción:** `https://xzonasvalencia.com`  \n+**Actualizado:** 2026-06-30  \n+**Regla UI móvil:** no alterar diseño salvo requisito SEO explícito.\n+\n+---\n+\n+## Estado global (resumen)\n+\n+| Bloque | Estado | Bloqueante |\n+|--------|--------|------------|\n+| Fase 1 — Auditoría base | ✅ 100% | — |\n+| Fase 2 — Rendimiento HTML/JS | ⏳ ~60% | 2.4, 2.5 |\n+| Fase 2.b — PageSpeed / GSC CWV | ⏳ ~40% | mobile LCP lab + CrUX |\n+| Fase 3 — GA4 estable | ⏳ 0% deploy | FTP operador |\n+| Fase 4 — SiteGround / CDN | ⏳ 0% | manual SG |\n+| Fase 5 — SEO Filter Pages | ⏳ 0% código | P1 quick wins |\n+| Fase 6 — SEO Command Center hub | ⏳ Fase A ok | Fases B–D |\n+| Fase 7 — API grid / caché prod | ⏳ código ok | deploy + carpeta caché |\n+| Fase 8 — Tareas operador | 📋 manual | operador |\n+\n+**Orden obligatorio:** Fase 1 → 2 → 2.b → 3 → 4 → 5 → 6 → 7 → 8.  \n+No iniciar fase N+1 hasta que la fase N esté al **100%** con verificación documentada.\n+\n+---\n+\n+## Fase 1 — Auditoría producción base ✅ COMPLETA\n+\n+| ID | Tarea | Archivos | Verificación | Estado |\n+|----|-------|----------|--------------|--------|\n+| 1.1 | Auditoría home desktop/mobile/bot | `ops/site-health-audit.php`, `run_seo_audit_cli.php` | Score SEO ≥85, HTTP 200 los 3 perfiles | ✅ |\n+| 1.2 | Fix GA4 ausente en landings | `landing-page.php`, `includes/google-analytics-unified.php` | `php -l` OK; gtag en HTML landing | ✅ código |\n+| 1.3 | Eliminar credenciales DB en `analyticstracking.php` | `analyticstracking.php` | Sin fallback hardcoded | ✅ |\n+| 1.4 | Herramienta salud unificada | `ops/site-health-audit.php`, `ops/pagespeed-audit.php` | `composer audit:full` ejecuta | ✅ |\n+| 1.5 | Informes y baseline | `docs/seo/AUDITORIA_PRODUCCION_INTEGRAL_2026-06-04.md`, `storage/audits/site-health-baseline.json` | Artefactos presentes | ✅ |\n+\n+**Criterio cierre Fase 1:** informe + baseline + fix GA4 en repo. ✅\n+\n+---\n+\n+## Fase 2 — Rendimiento HTML/JS (código visitante)\n+\n+| ID | Tarea | Archivos | Verificación | Estado |\n+|----|-------|----------|--------------|--------|\n+| 2.1 | Diferir `grid-mobile-lightbox` idle móvil | `templates/visitor_template.php` | Galería abre tras tap | ✅ |\n+| 2.2 | Reducir scripts sync footer | `templates/visitor_template.php` | −1 script sync móvil home | ✅ parcial |\n+| 2.3 | Fix `grid-unificado-patch.js` + min/manifest | `js/`, `getProdJsUrl()` | Sin SyntaxError; `.min.js` en prod | ✅ |\n+| 2.4 | HTML home <600 KB efectivos | SSR, `menuTop.php`, idle scripts | `site-health-audit` html_weight PASS | ⏳ ~940 KB |\n+| 2.5 | Cache-Control home cookie +18 | `includes/sg_dynamic_cache.php` | TTFB ↓ sin romper gate edad | ⏳ |\n+\n+### Subfases implementación 2.4\n+\n+1. **2.4.a** — Auditar peso por bloque (menuTop inline, grid SSR, scripts head).\n+2. **2.4.b** — Extraer CSS crítico inline duplicado a archivo cacheable (sin cambiar look).\n+3. **2.4.c** — Lazy/defer scripts no críticos restantes en `visitor_template.php`.\n+4. **2.4.d** — Re-ejecutar `php ops/site-health-audit.php --skip-links` → PASS html_weight.\n+\n+### Subfases implementación 2.5\n+\n+1. **2.5.a** — Revisar headers actuales con curl + cookie +18.\n+2. **2.5.b** — Ajustar `sg_dynamic_cache.php` TTL segmentado (edad verificada vs bot).\n+3. **2.5.c** — Validar TTFB desktop/mobile <800 ms en 3 requests.\n+\n+**Comando validación Fase 2:**\n+```bash\n+php ops/site-health-audit.php --skip-links --compare=storage/audits/site-health-baseline.json\n+python ops/_audit_prod_resources.py --json\n+```\n+\n+**Criterio cierre Fase 2:** 2.1–2.5 todos ✅ + comparativa baseline mejorada.\n+\n+---\n+\n+## Fase 2.b — PageSpeed Insights / GSC Core Web Vitals (OBLIGATORIA)\n+\n+Integración PSI API (lab) + CrUX field (misma fuente GSC → Experiencia → CWV).\n+\n+| ID | Tarea | Herramienta | Criterio PASS | Estado |\n+|----|-------|-------------|---------------|--------|\n+| 2.b.1 | PSI **mobile** lab | `ops/pagespeed-audit.php` | score ≥55, LCP ≤4500 ms | ⚠️ 3.8–6.5 s |\n+| 2.b.2 | PSI **desktop** lab | `ops/pagespeed-audit.php` | score ≥65, LCP ≤3500 ms | ✅ 90–96 |\n+| 2.b.3 | Ambos perfiles PASS CLI | `composer audit:pagespeed` exit 0 | mobile + desktop gates | ⚠️ mobile |\n+| 2.b.4 | CrUX field (GSC) | PSI `loadingExperience` | FAST/GOOD móvil+desktop | ⚠️ AVERAGE/SLOW |\n+| 2.b.5 | Baseline PSI registrado | `storage/audits/pagespeed-latest.json` | Comparar antes/después | ✅ herramienta |\n+\n+### Gates CWV estrictos (objetivo Google \"good\")\n+\n+| Métrica | Mobile p75 | Desktop p75 |\n+|---------|------------|-------------|\n+| LCP | ≤ 2500 ms | ≤ 2500 ms |\n+| INP | ≤ 200 ms | ≤ 200 ms |\n+| CLS | ≤ 0.10 | ≤ 0.10 |\n+\n+Modo estricto: `php ops/pagespeed-audit.php --strict` (exit 2 si no cumple).\n+\n+### Subfases implementación 2.b (mobile LCP)\n+\n+1. **2.b.i** — Identificar LCP element en PSI mobile (hero, logo, grid img).\n+2. **2.b.ii** — Priorizar imagen LCP: `fetchpriority=high`, preload, variant `t1` (ya parcial en grid).\n+3. **2.b.iii** — Reducir TBT: diferir `grid-unificado-patch.js` post-LCP si no rompe UX.\n+4. **2.b.iv** — Deploy Fase 2 + re-ejecutar `composer audit:pagespeed`.\n+5. **2.b.v** — Registrar PASS mobile+desktop en `storage/audits/pagespeed-latest.json`.\n+\n+### Checklist manual GSC (operador, tras deploy)\n+\n+- [ ] GSC → Experiencia → CWV → URLs móvil OK\n+- [ ] GSC → Experiencia → CWV → URLs ordenador OK\n+- [ ] GSC → Rendimiento → CTR 7d vs baseline\n+- [ ] GSC → Sitemaps → `sitemap-index.xml` sin errores\n+- [ ] Inspección URL home → disponible + screenshot móvil\n+\n+**Criterio cierre Fase 2.b:** `composer audit:pagespeed` exit 0 + checklist GSC marcado.\n+\n+---\n+\n+## Fase 3 — Medición GA4 estable\n+\n+| ID | Tarea | Archivos / acción | Verificación | Estado |\n+|----|-------|-------------------|--------------|--------|\n+| 3.1 | Deploy `landing-page.php` GA4 unificado | SFTP prod | View-source landing con gtag | ⏳ FTP |\n+| 3.2 | DebugView landing + home cookie +18 | GA4 panel | eventos `page_view` únicos | ⏳ |\n+| 3.3 | Reducir duplicados scroll/page_view | `ga4-events-tracker.js`, docs 2026-05-07 | DebugView sin doble page_view | ⏳ |\n+\n+**Criterio cierre Fase 3:** 3 URLs muestra (home, landing, ficha) con GA4 en DebugView sin duplicados.\n+\n+---\n+\n+## Fase 4 — SiteGround / CDN / PHP extensions\n+\n+| ID | Tarea | Responsable | Verificación | Estado |\n+|----|-------|-------------|--------------|--------|\n+| 4.1 | Revisar Anti-Bot 403 UA incompletos | Dev + SG | Desktop 200 con cookies | ⏳ |\n+| 4.2 | SuperCacher home con cookie edad | Operador SG | TTFB cache HIT | ⏳ |\n+| 4.3 | Brotli assets estáticos | Operador SG | `content-encoding: br` | ⏳ |\n+| 4.4 | Extensiones PHP: memcached+opcache ON; redis opcional | Operador | Panel SG screenshot | ⏳ |\n+| 4.5 | Carpeta `storage/cache/api_grid/` escribible | Operador | `X-Grid-Cache: HIT` 2ª req | ⏳ |\n+\n+Ref: `docs/TAREAS_MANUALES_OPERADOR_2026-06-04.md`\n+\n+**Criterio cierre Fase 4:** checklist operador completo + TTFB home mejorado documentado.\n+\n+---\n+\n+## Fase 5 — SEO Filter Pages (`/filtro/{slug}`)\n+\n+**Archivos núcleo:** `filter-page.php`, `includes/filter_page_engine.php`, `sitemap-filtros.php`, `cron_filter_pages_refresh.php`, `gestion-anuncios-anunciantes/herramientas/filter-pages-manager.php`\n+\n+Estado actual: ~36 seed, ~10 indexables, 72% noindex por `<3` anuncios.\n+\n+### P0 — Inventario y thin content\n+\n+| ID | Tarea | Archivo | Verificación | Estado |\n+|----|-------|---------|--------------|--------|\n+| 5.0.1 | Auditar columnas reales vs seed (`color_piel`, etc.) | seed SQL + `fpe_build_where()` | Query COUNT por filtro_key | ⏳ |\n+| 5.0.2 | Fallback `filtros_txt LIKE` si COUNT < 3 | `filter_page_engine.php` | Slugs vacíos recuperan anuncios | ⏳ |\n+| 5.0.3 | Auto-`activo=0` tras N refreshes con total=0 | `fpe_refresh_page()` | Sitemap sin URLs vacías | ⏳ |\n+| 5.0.4 | `intro_html`/`outro_html` mínimos en 10 indexables | filter-pages-manager / IA | ≥300 palabras indexables | ⏳ |\n+| 5.0.5 | Alinear doc vs código noindex vacío | `filter-page.php` L77 | Comentario = comportamiento | ⏳ |\n+\n+### P1 — Bugs SEO técnicos (quick wins, sin tocar UI móvil)\n+\n+| ID | Tarea | Archivo | Verificación | Estado |\n+|----|-------|---------|--------------|--------|\n+| 5.1.1 | JSON-LD ItemList URLs canónicas | `fpe_jsonld_itemlist()` | `xz_build_detalle_url()` | ⏳ |\n+| 5.1.2 | `BASE_URL` en lugar de dominio hardcodeado | `filter_page_engine.php` | Lab :9080 correcto | ⏳ |\n+| 5.1.3 | Paginación `?page=2+` → noindex,follow + canonical p1 | `filter-page.php` | View-source page=2 | ⏳ |\n+| 5.1.4 | FAQPage schema desde outro/FAQ JSON | `fpe_jsonld_faq()` nuevo | Rich Results Test | ⏳ |\n+\n+### P2 — Enlazado interno\n+\n+| ID | Tarea | Archivo | Verificación | Estado |\n+|----|-------|---------|--------------|--------|\n+| 5.2.1 | API lookup `/filtro/{slug}` por filtro activo | `api_seo_filter_lookup.php` | JSON slug si indexable | ⏳ |\n+| 5.2.2 | Banner grid al activar filtro equivalente | `js/grid-location-url-sync.js` | Banner visible sin cambiar layout | ⏳ |\n+| 5.2.3 | Bloque \"Búsquedas relacionadas\" footer | `filter-page.php` | 3–6 enlaces internos | ⏳ |\n+| 5.2.4 | Breadcrumb intermedio categoría | `fpe_breadcrumb()` | Schema BreadcrumbList | ⏳ |\n+\n+### P3 — Rich results\n+\n+| ID | Tarea | Verificación | Estado |\n+|----|-------|--------------|--------|\n+| 5.3.1 | `og:image` primera foto listado | OG debugger | ⏳ |\n+| 5.3.2 | Thumbs en cards (`fpe_fetch_anuncios`) | HTML con `<img loading=\"lazy\">` | ⏳ |\n+| 5.3.3 | `@graph` WebPage → ItemList `mainEntity` | Schema validator | ⏳ |\n+| 5.3.4 | Sitemap `lastmod` = `last_refresh` | `sitemap-filtros.php` | XML correcto | ⏳ |\n+\n+### P4 — Operativa GSC\n+\n+| ID | Tarea | Verificación | Estado |\n+|----|-------|--------------|--------|\n+| 5.4.1 | Submit ~10 URLs indexables | `ops/submit_gsc_priority_urls.php` | Cola GSC | ⏳ |\n+| 5.4.2 | Lab `sitemap-filtros.xml` no vacío | curl :9080 | ≥10 URLs | ⏳ |\n+| 5.4.3 | Columna último crawl GSC en admin | filter-pages-manager | UI panel | ⏳ |\n+\n+**Criterio cierre Fase 5:** P0+P1 al 100% verificados en lab; P2–P4 según prioridad negocio.\n+\n+---\n+\n+## Fase 6 — SEO Command Center hub (panel admin)\n+\n+Ref: `docs/MANUAL_SEO_UNIFICADO_PANEL.md`\n+\n+### Fase 6.A — Ya completada ✅\n+\n+- [x] 234 checks SEO+AEO+GEO\n+- [x] Autofix Pro landings\n+- [x] GA4 + GSC dashboard\n+- [x] Cron `cron_seo_command_center.php`\n+- [x] Seed sitemap XML\n+\n+### Fase 6.B — Consolidación UI (2–3 semanas)\n+\n+| ID | Tarea | Verificación | Estado |\n+|----|-------|--------------|--------|\n+| 6.B.1 | Menú único \"SEO Hub\" | Una entrada navegación | ⏳ |\n+| 6.B.2 | Tabs embebidas (landings, metrics, portal) | Sin duplicar pantallas | ⏳ |\n+| 6.B.3 | Deprecar `seo-comando-dashboard` | Redirect o aviso | ⏳ |\n+| 6.B.4 | Redirect `seosupertool/` → panel | HTTP 302 + mensaje | ⏳ |\n+\n+### Fase 6.C — Portar seosupertool (1 mes)\n+\n+| ID | Módulo legacy | Destino | Estado |\n+|----|---------------|---------|--------|\n+| 6.C.1 | verificar-indexacion.php | Tab Command Center | ⏳ |\n+| 6.C.2 | gsc-analisis-duplicados.php | Tab Command Center | ⏳ |\n+| 6.C.3 | Informe PDF semanal | Cron + email | ⏳ |\n+\n+### Fase 6.D — Escala indexación\n+\n+| ID | Tarea | Verificación | Estado |\n+|----|-------|--------------|--------|\n+| 6.D.1 | Cron SG 4×/día `source=all` seed 5000 | `site_audit_cron_log` | ⏳ |\n+| 6.D.2 | Autofix batch 10 nocturno | `site_audit_autofix_log` | ⏳ |\n+| 6.D.3 | IndexNow tras autofix | Log IndexNow | ⏳ |\n+\n+**Criterio cierre Fase 6:** 6.B completo + cron prod estable 7 días.\n+\n+---\n+\n+## Fase 7 — API grid rendimiento (visitante móvil)\n+\n+| ID | Tarea | Archivo | Verificación | Estado |\n+|----|-------|---------|--------------|--------|\n+| 7.1 | Caché JSON 45 s home sin filtros | `includes/api_grid_fast.php` | `X-Grid-Cache: HIT` | ✅ código |\n+| 7.2 | URLs foto sin `is_file()` | `api_anuncios_grid.php` | TTFB API <300 ms 2ª req | ✅ código |\n+| 7.3 | Tracking en shutdown | `api_anuncios_grid.php` | JSON no bloqueado | ✅ código |\n+| 7.4 | Thumbs `t1` en móvil | `js/grid-filter-handler.js` | Imágenes más ligeras | ✅ código |\n+| 7.5 | Deploy + carpeta caché prod | operador | MISS→HIT documentado | ⏳ |\n+\n+Ref: `docs/API_ANUNCIOS_GRID_ANALISIS_2026-06-04.md`\n+\n+**Criterio cierre Fase 7:** 7.5 verificado en prod; API <300 ms HIT.\n+\n+---\n+\n+## Fase 8 — Tareas manuales operador (paralelo, no bloquea dev)\n+\n+Documento: `docs/TAREAS_MANUALES_OPERADOR_2026-06-04.md`\n+\n+| ID | Tarea | Estado |\n+|----|-------|--------|\n+| 8.1 | Extensiones PHP SiteGround | ⏳ |\n+| 8.2 | SFTP deploy archivos modificados | ⏳ |\n+| 8.3 | Crear `storage/cache/api_grid/` 755 | ⏳ |\n+| 8.4 | Purga caché SG tras deploy | ⏳ |\n+| 8.5 | Cron SEO Command Center token real | ⏳ |\n+| 8.6 | Verificar home móvil post-deploy | ⏳ |\n+| 8.7 | Panel estadísticas anunciante | ⏳ |\n+\n+---\n+\n+## Archivos prioritarios (ya identificados en transcript)\n+\n+```\n+templates/visitor_template.php\n+includes/sg_dynamic_cache.php\n+includes/filter_page_engine.php\n+filter-page.php\n+sitemap-filtros.php\n+landing-page.php\n+api_anuncios_grid.php\n+includes/api_grid_fast.php\n+ops/pagespeed-audit.php\n+ops/site-health-audit.php\n+ops/includes/pagespeed_audit_lib.php\n+gestion-anuncios-anunciantes/includes/seo_command_audit_lib.php\n+cron_seo_command_center.php\n+```\n+\n+---\n+\n+## Comandos de validación global\n+\n+```bash\n+# Salud + comparativa\n+php ops/site-health-audit.php --skip-links --compare=storage/audits/site-health-baseline.json\n+\n+# PageSpeed mobile + desktop\n+composer audit:pagespeed\n+\n+# Auditoría completa\n+composer audit:full\n+\n+# Syntax PHP archivos tocados\n+php -l includes/filter_page_engine.php\n+php -l filter-page.php\n+\n+# Tail logs (nunca leer entero)\n+Get-Content xzonas_cron_filter_pages.log -Tail 80\n+```\n+\n+---\n+\n+## Próxima acción (turno siguiente)\n+\n+**Iniciar Fase 2 pendiente:** completar **2.4** (HTML home <600 KB) al 100% antes de tocar 2.5 o avanzar a 2.b.\n+\n+---\n+\n+*Memoria agente: sincronizar con TodoWrite IDs `fase-2` … `fase-8` tras cada hito.*","linesAdded":321,"linesRemoved":0,"status":"pending"}],"transcriptPath":null,"notifyTitle":"Agente terminado","notifyBody":"Revisando el transcript del hilo anterior para entender el estado del trabajo y redactar el roadmap completo.\nConsolidan"},"at":1782777445875}]}
