{"id":"cs-1782783090299-f95wcgt9","status":"done","createdAt":1782783090299,"finishedAt":1782783266788,"meta":{"projectName":"xzonassite","projectPath":"C:\\xampp\\htdocs\\xzonassite","messagePreview":"Consolida el CONOCIMIENTO del proyecto para uso futuro del agente.\n\nEntrega en Markdown:\n1. **Resumen ejecutivo** (5 lín","phaseId":"knowledge","missionId":null},"events":[{"event":"status","data":{"text":"Modo completo — hasta 80 herramientas, usa solo las necesarias"},"at":1782783090409},{"event":"status","data":{"text":"Agente"},"at":1782783090451},{"event":"agent","data":{"agentId":"agent-0efef04b-faf5-4b8d-ad68-3d6e5750094d","projectPath":"C:\\xampp\\htdocs\\xzonassite"},"at":1782783090451},{"event":"changes","data":{"sessionId":"cs-1782783090407-ng5a90","pending":0},"at":1782783090451},{"event":"status","data":{"text":"Procesando…"},"at":1782783091100},{"event":"text","data":{"chunk":"Explorando la estructura y archivos clave del proyecto para consolidar conocimiento preciso.\n"},"at":1782783266789},{"event":"tool_activity","data":{"activity":{"id":"tool_f179aa60-c592-4bde-8046-c85488aa524","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\.serena\\project.yml","detail":"","at":"2026-06-30T01:31:43.162Z"}},"at":1782783103162},{"event":"tool_activity","data":{"activity":{"id":"tool_1419418c-ad2a-41a8-9644-757554f040d","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-30T01:31:43.323Z"}},"at":1782783103323},{"event":"tool_activity","data":{"activity":{"id":"tool_45b430ba-9ae3-4686-927f-6ec8f0069ae","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-30T01:31:44.050Z"}},"at":1782783104050},{"event":"tool_activity","data":{"activity":{"id":"tool_1419418c-ad2a-41a8-9644-757554f040d","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-30T01:31:44.054Z"}},"at":1782783104054},{"event":"tool_activity","data":{"activity":{"id":"tool_c8a710eb-3302-49f2-8ac0-ffe0559c20a","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-30T01:31:44.346Z"}},"at":1782783104346},{"event":"tool_activity","data":{"activity":{"id":"tool_adda1301-1780-4614-aa46-a50945b9d93","name":"shell","status":"completed","summary":"shell","detail":"Get-ChildItem -Path \"C:\\xampp\\htdocs\\xzonassite\" -Directory | Select-Object -First 40 Name | Format-Table -HideTableHeaders","at":"2026-06-30T01:31:57.918Z"}},"at":1782783117918},{"event":"tool_activity","data":{"activity":{"id":"tool_07e43822-c5b7-4fed-9c4a-4d4e68e0515","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\README.md","detail":"","at":"2026-06-30T01:31:59.999Z"}},"at":1782783119999},{"event":"tool_activity","data":{"activity":{"id":"tool_47f0e18b-4a7c-4083-b8ea-66e2776d2c2","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\composer.json","detail":"","at":"2026-06-30T01:32:00.261Z"}},"at":1782783120261},{"event":"tool_activity","data":{"activity":{"id":"tool_622d49e9-26a1-4b2f-a6c2-6b01f675f6f","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\package.json","detail":"","at":"2026-06-30T01:32:00.502Z"}},"at":1782783120502},{"event":"tool_activity","data":{"activity":{"id":"tool_1886a608-c100-425c-a7f9-3beb9e60ae5","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\.htaccess","detail":"","at":"2026-06-30T01:32:00.812Z"}},"at":1782783120812},{"event":"tool_activity","data":{"activity":{"id":"tool_637d6878-ba34-421f-9385-cd536a0ca61","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\archivos\\conexion\\conexion.php","detail":"","at":"2026-06-30T01:32:01.168Z"}},"at":1782783121168},{"event":"tool_activity","data":{"activity":{"id":"tool_6eebcf55-09c0-416e-bd4e-14765e2556f","name":"shell","status":"completed","summary":"shell","detail":"Get-ChildItem -Path \"C:\\xampp\\htdocs\\xzonassite\" -Directory | Select-Object -Skip 40 Name | Format-Table -HideTableHeaders","at":"2026-06-30T01:32:14.833Z"}},"at":1782783134833},{"event":"tool_activity","data":{"activity":{"id":"tool_f42cfb09-9255-47d5-9eed-b67b6825aa4","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\docs\\deployment\\github-siteground-cicd.md","detail":"","at":"2026-06-30T01:32:22.246Z"}},"at":1782783142246},{"event":"tool_activity","data":{"activity":{"id":"tool_878cd0bc-3882-49df-a834-c703a10ddf2","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-30T01:32:22.626Z"}},"at":1782783142626},{"event":"tool_activity","data":{"activity":{"id":"tool_6ae4f10b-dd69-49ec-a214-62e17407662","name":"shell","status":"running","summary":"shell","detail":"Get-ChildItem -Path \"C:\\xampp\\htdocs\\xzonassite\\src\" -ErrorAction SilentlyContinue | Select-Object Name; Get-ChildItem -Path \"C:\\xampp\\htdocs\\xzonassite\\gestion-anuncios-anunciantes\" -Directory -Erro…","at":"2026-06-30T01:32:23.871Z"}},"at":1782783143871},{"event":"tool_activity","data":{"activity":{"id":"tool_9a7e3004-392c-4448-9b6c-cea6bc9a62f","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-30T01:32:34.240Z"}},"at":1782783154240},{"event":"tool_activity","data":{"activity":{"id":"tool_5eb9aa6c-4b66-46f0-8565-98c6e141b95","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\api\\v1\\README.md","detail":"","at":"2026-06-30T01:32:34.443Z"}},"at":1782783154443},{"event":"tool_activity","data":{"activity":{"id":"tool_9a7e3004-392c-4448-9b6c-cea6bc9a62f","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-30T01:32:34.551Z"}},"at":1782783154551},{"event":"tool_activity","data":{"activity":{"id":"tool_6ae4f10b-dd69-49ec-a214-62e17407662","name":"shell","status":"completed","summary":"shell","detail":"Get-ChildItem -Path \"C:\\xampp\\htdocs\\xzonassite\\src\" -ErrorAction SilentlyContinue | Select-Object Name; Get-ChildItem -Path \"C:\\xampp\\htdocs\\xzonassite\\gestion-anuncios-anunciantes\" -Directory -Erro…","at":"2026-06-30T01:32:36.076Z"}},"at":1782783156076},{"event":"tool_activity","data":{"activity":{"id":"tool_317097ef-57d5-40c2-9054-4c123b303f2","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\.serena\\memories\\xzonassite_estado.md","detail":"","at":"2026-06-30T01:32:46.014Z"}},"at":1782783166014},{"event":"tool_activity","data":{"activity":{"id":"tool_fac4f8e0-8091-49a5-bfae-8ff7c6fb5ee","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\.serena\\memories\\xzonassite_operacion_sin_ssh.md","detail":"","at":"2026-06-30T01:32:46.410Z"}},"at":1782783166410},{"event":"tool_activity","data":{"activity":{"id":"tool_dc34a553-6e34-4337-94e7-81f7d186bfc","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\config.php","detail":"","at":"2026-06-30T01:32:46.722Z"}},"at":1782783166722},{"event":"tool_activity","data":{"activity":{"id":"tool_a2790fbe-4b27-4c24-ba50-8a266bf83ba","name":"read","status":"completed","summary":"read: …pp\\htdocs\\xzonassite\\.serena\\memories\\reglas_operativas_usuario_2026-02-16.md","detail":"","at":"2026-06-30T01:32:47.262Z"}},"at":1782783167262},{"event":"tool_activity","data":{"activity":{"id":"tool_7dac0a51-5556-40da-a312-472e55b568e","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\docs\\refactor-fullstack-2026-06\\README.md","detail":"","at":"2026-06-30T01:32:47.831Z"}},"at":1782783167831},{"event":"tool_activity","data":{"activity":{"id":"tool_093e300b-9338-4bed-b901-daa4e99ae81","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\AGENTS.md","detail":"","at":"2026-06-30T01:32:52.095Z"}},"at":1782783172095},{"event":"tool_activity","data":{"activity":{"id":"tool_eecc638e-f982-4b32-97d4-7cfab2223e3","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\docs\\PROTOCOLO_HERRAMIENTAS_FRONTEND_OPERADOR.md","detail":"","at":"2026-06-30T01:32:52.777Z"}},"at":1782783172777},{"event":"tool_activity","data":{"activity":{"id":"tool_3d458250-e618-4027-aff9-4ebcf5db6e1","name":"grep","status":"running","summary":"grep: C:\\xampp\\htdocs\\xzonassite","detail":"","at":"2026-06-30T01:32:53.428Z"}},"at":1782783173428},{"event":"tool_activity","data":{"activity":{"id":"tool_4e57721e-8cc3-4adc-9fe7-ba5f52aef7e","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\xzonassite\\chat-unified-pwa\\README.md","detail":"","at":"2026-06-30T01:32:54.134Z"}},"at":1782783174134},{"event":"tool_activity","data":{"activity":{"id":"tool_3d458250-e618-4027-aff9-4ebcf5db6e1","name":"grep","status":"completed","summary":"grep: C:\\xampp\\htdocs\\xzonassite","detail":"","at":"2026-06-30T01:32:54.236Z"}},"at":1782783174236},{"event":"tool_activity","data":{"activity":{"id":"tool_3cb4dfda-45ed-4763-a4c7-f87d71d8a2a","name":"shell","status":"completed","summary":"shell","detail":"if (Test-Path \"C:\\xampp\\htdocs\\xzonassite\\src\") { Get-ChildItem \"C:\\xampp\\htdocs\\xzonassite\\src\" -Recurse -Directory | Select-Object -First 15 FullName } else { \"no src\" }; if (Test-Path \"C:\\xampp\\ht…","at":"2026-06-30T01:33:09.747Z"}},"at":1782783189747},{"event":"tool_activity","data":{"activity":{"id":"tool_b958881d-564c-445d-8b32-a6fcb8ef5bd","name":"shell","status":"running","summary":"shell","detail":"Get-ChildItem \"C:\\xampp\\htdocs\\xzonassite\\gestion-anuncios-anunciantes\" -Directory | Select-Object Name; git -C \"C:\\xampp\\htdocs\\xzonassite\" branch -a 2>$null | Select-Object -First 15","at":"2026-06-30T01:33:12.970Z"}},"at":1782783192970},{"event":"tool_activity","data":{"activity":{"id":"tool_505c8fd4-dffa-4a77-9d88-c9b0b7b40a5","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\xzonassite\\ops\\deploy\\rsync-exclude.txt","detail":"","at":"2026-06-30T01:33:23.523Z"}},"at":1782783203523},{"event":"tool_activity","data":{"activity":{"id":"tool_8fec5af3-2277-43ee-93ce-7176d46440b","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\xzonassite\\docs\\cursorCHATagent\\README_INDICE.md","detail":"","at":"2026-06-30T01:33:23.524Z"}},"at":1782783203524},{"event":"tool_activity","data":{"activity":{"id":"tool_7d3d3532-dbe2-48a2-9ce5-c7fc21c839d","name":"grep","status":"running","summary":"grep: C:\\xampp\\htdocs\\xzonassite\\includes","detail":"","at":"2026-06-30T01:33:23.527Z"}},"at":1782783203527},{"event":"tool_activity","data":{"activity":{"id":"tool_8fec5af3-2277-43ee-93ce-7176d46440b","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\docs\\cursorCHATagent\\README_INDICE.md","detail":"","at":"2026-06-30T01:33:28.232Z"}},"at":1782783208232},{"event":"tool_activity","data":{"activity":{"id":"tool_505c8fd4-dffa-4a77-9d88-c9b0b7b40a5","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\ops\\deploy\\rsync-exclude.txt","detail":"","at":"2026-06-30T01:33:28.243Z"}},"at":1782783208243},{"event":"tool_activity","data":{"activity":{"id":"tool_7d3d3532-dbe2-48a2-9ce5-c7fc21c839d","name":"grep","status":"completed","summary":"grep: C:\\xampp\\htdocs\\xzonassite\\includes","detail":"","at":"2026-06-30T01:33:28.516Z"}},"at":1782783208516},{"event":"tool_activity","data":{"activity":{"id":"tool_b958881d-564c-445d-8b32-a6fcb8ef5bd","name":"shell","status":"completed","summary":"shell","detail":"Get-ChildItem \"C:\\xampp\\htdocs\\xzonassite\\gestion-anuncios-anunciantes\" -Directory | Select-Object Name; git -C \"C:\\xampp\\htdocs\\xzonassite\" branch -a 2>$null | Select-Object -First 15","at":"2026-06-30T01:33:30.229Z"}},"at":1782783210229},{"event":"tool_activity","data":{"activity":{"id":"tool_0d7e915a-e393-41a8-9395-e05ca7eb7e7","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\zonas.php","detail":"","at":"2026-06-30T01:33:35.510Z"}},"at":1782783215510},{"event":"tool_activity","data":{"activity":{"id":"tool_ac244e3c-3f6b-4da9-8186-44a830431d6","name":"grep","status":"running","summary":"grep: C:\\xampp\\htdocs\\xzonassite","detail":"","at":"2026-06-30T01:33:35.938Z"}},"at":1782783215938},{"event":"tool_activity","data":{"activity":{"id":"tool_5bc9181b-e938-4b65-bdf0-ade1f744646","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\xzonassite\\api_anuncios_grid.php","detail":"","at":"2026-06-30T01:33:36.237Z"}},"at":1782783216237},{"event":"tool_activity","data":{"activity":{"id":"tool_ac244e3c-3f6b-4da9-8186-44a830431d6","name":"grep","status":"completed","summary":"grep: C:\\xampp\\htdocs\\xzonassite","detail":"","at":"2026-06-30T01:33:36.290Z"}},"at":1782783216290},{"event":"tool_activity","data":{"activity":{"id":"tool_5bc9181b-e938-4b65-bdf0-ade1f744646","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\xzonassite\\api_anuncios_grid.php","detail":"","at":"2026-06-30T01:33:36.370Z"}},"at":1782783216370},{"event":"text","data":{"chunk":"# xzonassite — Conocimiento consolidado del proyecto\n\n> **Proyecto:** `C:\\xampp\\htdocs\\xzonassite` · **Dominio:** [xzonasvalencia.com](https://xzonasvalencia.com)  \n> **Última consolidación:** 2026-06-30 · Optimizado para Serena / knowledge local\n\n---\n\n## 1. Resumen ejecutivo\n\nPortal web de alto volumen para **anuncios eróticos en Valencia por zonas y categorías** (escorts, masajes, travestis, etc.), con SEO local agresivo y panel de gestión para anunciantes y administradores. Stack principal: **PHP 8.2 + MySQL (mysqli, sin ORM) + JavaScript vanilla/jQuery**, front legacy con bundles minificados (`npm run minify:custom`, `build:grid-core`). Arquitectura híbrida: cientos de endpoints `api_*.php` en raíz, migración progresiva a `/api/v1/`, panel admin en `gestion-anuncios-anunciantes/`, chat PWA en `chat-unified-pwa/`. Configuración y secretos vía **`.env`** (`DB_*`, `SMTP_*`, `GOOGLE_*`, `OPENAI_*`). Despliegue oficial **GitHub Actions → SiteGround** (`develop`→staging, `main`→producción); producción **no se opera por SSH desde el agente** — solo herramientas UI del panel con informe `XZONAS_AGENT_REPORT`. QA obligatorio: `composer lint:php`, `analyse:phpstan`, `analyse:psalm`, `qa:full`.\n\n---\n\n## 2. Glosario\n\n| Término | Definición |\n|---------|------------|\n| **Anuncio** | Ficha publicada por un anunciante (fotos, texto, zona, categoría, visibilidad, chat). Tabla central del negocio. |\n| **Anunciante** | Usuario registrado que publica y gestiona anuncios (`ACCESO-ANUNCIANTE`, `MIS-ANUNCIOS`, `areaPrivada.php`). |\n| **Usuario / visitante** | Usuario final que navega, guarda favoritos y usa chat (`ACCESO-USUARIO`, `accesoWebUsers.php`). |\n| **Zona** | Barrio/distrito de Valencia para filtrar anuncios (ej. Ruzafa, Benimaclet). Geo + SEO local. |\n| **Categoría** | Tipo de servicio (chicas, chicos, travestis, masajes…). Impacta URLs SEO y filtros del grid. |\n| **Grid** | Cuadrícula Pinterest-style de anuncios en home y landings. API: `api_anuncios_grid.php` / `api_mobile_grid_v2.php`. |\n| **Créditos** | Moneda interna del anunciante para renovaciones, boosts y posicionamiento. |\n| **Boost / destacado** | Pago en créditos para subir visibilidad temporal del anuncio en el grid. |\n| **Renovación** | Extensión de vigencia del anuncio (manual o cron HTTP). Ranking en `includes/renovacion_ranking.php`. |\n| **Hub SEO** | Landing temática (`escorts-valencia`, `putas-valencia-valencia`, etc.) enrutada por `hub-seo-router.php` y `.htaccess`. |\n| **Panel / gestión** | `gestion-anuncios-anunciantes/` — backend admin, herramientas, SEO autopilot, métricas. |\n| **Herramientas frontend** | Pantallas en `gestion-anuncios-anunciantes/herramientas/` ejecutables en prod por el operador (sin SSH). |\n| **XZONAS_AGENT_REPORT** | Bloque copiable `=== XZONAS_AGENT_REPORT ===` … `=== END_XZONAS_AGENT_REPORT ===` para diagnóstico prod. |\n| **conectaDB / conectaBBDD** | Dos cadenas de conexión mysqli paralelas (portal vs panel); misma BD, implementaciones distintas. |\n| **XZONASSESSID** | Cookie/sesión propia del portal (además de OAuth Google/Apple). |\n| **Thumbs t0/t1/t2** | Variantes de imagen generadas al subir (`archivos/uploadImg.php`, `api/generate-thumbnails.php`). |\n| **SiteGround** | Hosting compartido de producción. Sin Node.js persistente; crons vía HTTP con token en header. |\n| **Serena** | MCP/LSP del agente (`.serena/project.yml`). Símbolos PHP/TS, memorias, edición quirúrgica. |\n\n---\n\n## 3. FAQ dev\n\n### ¿Cómo arranco en local?\n1. XAMPP (Apache + MySQL) apuntando a `C:\\xampp\\htdocs\\xzonassite`.  \n2. Copiar `.env.example` → `.env` (o `.env.local` para XAMPP con `root` sin password).  \n3. `composer install` y `npm install`.  \n4. Verificar `archivos/conexion/conexion.php` carga `config.php` correctamente.\n\n### ¿Dónde está la configuración de BD y secretos?\n- **`config.php`** (raíz): carga `.env` + `.env.local`, define constantes `DB_*`.  \n- **`archivos/conexion/conexion.php`**: conexión mysqli del portal.  \n- **`gestion-anuncios-anunciantes/funciones/`**: `conectaBBDD()` del panel.  \n- Nunca hardcodear claves; `.env` está en `.gitignore` y excluido del rsync.\n\n### ¿Cómo despliego a producción?\n- Flujo oficial: **`docs/deployment/github-siteground-cicd.md`**.  \n- `develop` → staging automático; `main` → producción.  \n- Workflows: `.github/workflows/deploy-siteground-*.yml`.  \n- Exclusiones: `ops/deploy/rsync-exclude.txt` (no sube `.env`, `uploads/`, `docs/`, etc.).  \n- Rollback: workflow `rollback-production-by-tag.yml`.  \n- **Ramas activas en repo:** `Dev`, `develop`, `master` (verificar cuál es la de release actual).\n\n### ¿Cómo opera el agente en producción sin SSH?\n- **Prohibido** pedir `php ops/*.php` o migraciones por terminal en SiteGround.  \n- **Obligatorio:** pantalla en `gestion-anuncios-anunciantes/herramientas/` → operador ejecuta en navegador → pega `XZONAS_AGENT_REPORT`.  \n- Docs: `docs/PROTOCOLO_HERRAMIENTAS_FRONTEND_OPERADOR.md`, `AGENTS.md`, `.serena/memories/xzonassite_operacion_sin_ssh.md`.\n\n### ¿Qué QA ejecuto tras cambiar código?\n```bash\ncomposer lint:php          # PHPCS\ncomposer analyse:phpstan   # análisis estático\ncomposer analyse:psalm     # análisis estático\ncomposer qa:full           # los tres anteriores\nnpm run minify:custom      # si tocas JS custom\nnpm run build:grid-core    # si tocas grid\nphp -l archivo.php         # syntax check puntual\n```\nEn tareas rápidas: al menos el check más cercano al área modificada.\n\n### ¿Cómo funcionan las APIs?\n- **Legacy:** `api_*.php` en raíz (ej. `api_anuncios_grid.php`, `api_detalle_anuncio.php`).  \n- **Nueva capa:** `/api/v1/` con wrappers de compatibilidad (`api/v1/README.md`).  \n- **CMS/SEO/admin:** `api_cms_*.php`, `api_seo_*.php`.  \n- Convención: `require_once` de `conexion.php`, headers JSON, `htmlspecialchars` en salida HTML.\n\n### ¿Cómo funciona auth y sesiones?\n- Sesión portal: **XZONASSESSID** + variables por rol.  \n- Admin panel: triple flag legacy (`admin_autenticado`, `adminAutorizado`, `admin_authenticated`).  \n- OAuth: Google ✅; Apple (código existe, credenciales opcionales).  \n- CSRF estricto en media; ver `.serena/memories/csrf_media_estricto_2026-02-19.md`.\n\n### ¿Dónde toco SEO y rutas?\n- **`.htaccess`** (~1300 líneas): canónicas, 301, hubs SEO, seguridad, PWA.  \n- **`hub-seo-router.php`**, landings en `seo-pages/`, sitemaps.  \n- Head term canónico: `/putas-valencia-valencia`. Host sin `www`.  \n- Crons HTTP: token en header `X-Cron-Token` o `Authorization: Bearer` (`includes/cron_gate.php`), **nunca** `?token=` en URL.\n\n---\n\n## 4. Checklist onboarding\n\n- [ ] Clonar repo en `C:\\xampp\\htdocs\\xzonassite` (o ruta XAMPP equivalente).\n- [ ] Leer `README.md` y `AGENTS.md` (5 min).\n- [ ] Configurar `.env` / `.env.local` con credenciales DB local.\n- [ ] `composer install` + `npm install`.\n- [ ] Verificar Apache sirve `https://localhost/xzonassite/` (o vhost propio).\n- [ ] Revisar índice agente: `docs/cursorCHATagent/README_INDICE.md`.\n- [ ] Consultar `docs/cursorCHATagent/TAREA_REGISTRO.md` antes de implementar (anti-duplicados).\n- [ ] Activar Serena en Cursor; revisar `.serena/project.yml` (QA, ignored_paths).\n- [ ] Ejecutar `composer qa:full` una vez para validar entorno.\n- [ ] Mapear áreas clave: `includes/`, `gestion-anuncios-anunciantes/`, `api/`, `js/`, `css/bundles/`.\n- [ ] Entender dualidad DB: `conectaDB()` vs `conectaBBDD()` — no unificar sin plan.\n- [ ] Memorizar regla prod: **herramientas UI, no SSH**.\n- [ ] Revisar `.htaccess` solo la sección relevante (no leer entero salvo tarea SEO).\n- [ ] Conocer deploy: `docs/deployment/github-siteground-cicd.md`.\n- [ ] No escanear recursivamente `vendor/`, `node_modules/`, `Core/`, `Dinamic/` sin petición explícita.\n- [ ] Logs grandes: `Get-Content -Tail 80` o lectura parcial; nunca `error.log` completo si >200 KB.\n\n---\n\n## 5. Prompts guardados\n\n### Bugfix\n\n```\n[Bugfix] En xzonassite (PHP 8.2), el endpoint api_XXX.php devuelve [error].\nArchivos sospechosos: [lista]. Analiza causa en includes/conexion y dependencias.\nImplementa fix mínimo sin romper rutas legacy. Ejecuta composer lint:php y php -l.\nResume: causa, cambio, riesgo de regresión.\n```\n\n```\n[Bugfix grid móvil] El grid en home no carga anuncios en iOS.\nRevisa api_anuncios_grid.php, js/grid-unificado-patch.js y build grid-core.\nTras editar JS: npm run build:grid-core. No tocar vendor/.\n```\n\n### Feature\n\n```\n[Feature] Añadir [funcionalidad] al panel gestion-anuncios-anunciantes/herramientas/.\nUI: Bootstrap 5 + admin-standalone-shell.css, cards con KPIs.\nSi requiere datos de prod: generar bloque XZONAS_AGENT_REPORT copiable.\nConsulta TAREA_REGISTRO.md antes de codificar.\n```\n\n```\n[Feature API] Nuevo endpoint en api/v1/ para [recurso].\nMantener wrapper legacy api_XXX.php → /api/v1/XXX.\nPrepared statements, JSON UTF-8, validación entrada. QA: composer analyse:phpstan.\n```\n\n### Refactor\n\n```\n[Refactor acotado] Unificar lógica duplicada entre [archivo A] y [archivo B].\nAlcance: solo estos archivos. Sin cambiar firmas públicas ni $_GET legacy.\nUsa find_referencing_symbols (Serena) antes/después. composer qa:full al cerrar.\n```\n\n```\n[Refactor .htaccess] Reorganizar bloque [nombre] en .htaccess sin cambiar comportamiento.\nVerifica 301 canónicas y hubs SEO existentes. Documenta reglas movidas en comentario.\n```\n\n### Deploy\n\n```\n[Deploy] Preparar cambios para staging (rama develop).\nLista archivos tocados, riesgos prod, y si requieren acción post-deploy (GSC, cron, caché).\nNo ejecutar deploy; solo checklist y verificación dry_run según github-siteground-cicd.md.\n```\n\n```\n[Rollback] El deploy de [fecha] rompió [X]. Identifica commit/tag anterior seguro.\nIndica pasos workflow rollback-production-by-tag.yml y qué validar tras rollback.\n```\n\n### QA\n\n```\n[QA full] Ejecuta composer qa:full y npm run minify:custom.\nReporta errores por archivo con línea. Corrige solo los bloqueantes del área [módulo].\nNo ampliar scope a warnings preexistentes no relacionados.\n```\n\n```\n[QA SEO post-deploy] Tras subir cambios SEO, checklist:\nsitemap-index.xml en GSC, landings paginación, manifest PWA, CrUX 28d.\nUsa docs/refactor-fullstack-2026-06/ como referencia. Sin SFTP manual salvo contingencia.\n```\n\n```\n[Auditoría salud] Ejecuta composer audit:site-health y audit:pagespeed local.\nResume hallazgos P0/P1. Para prod usa herramienta frontend del panel, no php ops/* en SiteGround.\n```\n\n---\n\n## Referencias rápidas (paths)\n\n| Recurso | Ruta |\n|---------|------|\n| Config / env | `config.php`, `.env` |\n| Conexión DB portal | `archivos/conexion/conexion.php` |\n| Funciones portal | `includes/functions.php` |\n| Panel admin | `gestion-anuncios-anunciantes/` |\n| Herramientas operador | `gestion-anuncios-anunciantes/herramientas/` |\n| Routing SEO | `.htaccess`, `hub-seo-router.php` |\n| APIs v1 | `api/v1/` |\n| Chat PWA | `chat-unified-pwa/` |\n| Deploy CI/CD | `docs/deployment/github-siteground-cicd.md` |\n| Protocolo agente | `AGENTS.md`, `docs/PROTOCOLO_HERRAMIENTAS_FRONTEND_OPERADOR.md` |\n| Serena config | `.serena/project.yml` |\n| Memorias Serena | `.serena/memories/xzonassite_estado.md` (estado feb; verificar vs repo actual) |\n\n---\n\n## Disciplina del agente (resumen Serena)\n\n1. Analizar antes de editar (`get_symbols_overview`, `find_symbol`, `find_referencing_symbols`).  \n2. Cambios quirúrgicos: `replace_symbol_body`, `insert_at_line`, `replace_lines`.  \n3. Si el requisito es ambiguo → preguntar, no asumir.  \n4. Tras cambios PHP/TS relevantes → QA indicado.  \n5. Prod SiteGround → UI operador + `XZONAS_AGENT_REPORT`, nunca SSH.  \n6. Lectura selectiva; no escanear masivamente git ni archivos modificados sin petición.  \n7. No grep recursivo en `vendor/`, `node_modules/`, `Core/`, `Dinamic/` salvo petición explícita.\n\n---\n\n*Documento listo para copiar a Serena (`write_memory`) o knowledge local del proyecto.*"},"at":1782783266789},{"event":"status","data":{"text":"Procesando…"},"at":1782783266769},{"event":"phase_saved","data":{"phaseId":"knowledge","progress":{"status":"done","completedAt":"2026-06-30T01:34:26.780Z","name":"Conocimiento","summary":"Explorando la estructura y archivos clave del proyecto para consolidar conocimiento preciso.\n# xzonassite — Conocimiento consolidado del proyecto\n\n> **Proyecto:** `C:\\xampp\\htdocs\\xzonassite` · **Dominio:** [xzonasvalencia.com](https://xzonasvalencia.com)  \n> **Última consolidación:** 2026-06-30 · Optimizado para Serena / knowledge local\n\n---\n\n## 1. Resumen ejecutivo\n\nPortal web de alto volumen para **anuncios eróticos en Valencia por zonas y categorías** (escorts, masajes, travestis, etc.), con SEO local agresivo y panel de gestión para anunciantes y administradores. Stack principal: **PHP 8.","fullText":"Explorando la estructura y archivos clave del proyecto para consolidar conocimiento preciso.\n# xzonassite — Conocimiento consolidado del proyecto\n\n> **Proyecto:** `C:\\xampp\\htdocs\\xzonassite` · **Dominio:** [xzonasvalencia.com](https://xzonasvalencia.com)  \n> **Última consolidación:** 2026-06-30 · Optimizado para Serena / knowledge local\n\n---\n\n## 1. Resumen ejecutivo\n\nPortal web de alto volumen para **anuncios eróticos en Valencia por zonas y categorías** (escorts, masajes, travestis, etc.), con SEO local agresivo y panel de gestión para anunciantes y administradores. Stack principal: **PHP 8.2 + MySQL (mysqli, sin ORM) + JavaScript vanilla/jQuery**, front legacy con bundles minificados (`npm run minify:custom`, `build:grid-core`). Arquitectura híbrida: cientos de endpoints `api_*.php` en raíz, migración progresiva a `/api/v1/`, panel admin en `gestion-anuncios-anunciantes/`, chat PWA en `chat-unified-pwa/`. Configuración y secretos vía **`.env`** (`DB_*`, `SMTP_*`, `GOOGLE_*`, `OPENAI_*`). Despliegue oficial **GitHub Actions → SiteGround** (`develop`→staging, `main`→producción); producción **no se opera por SSH desde el agente** — solo herramientas UI del panel con informe `XZONAS_AGENT_REPORT`. QA obligatorio: `composer lint:php`, `analyse:phpstan`, `analyse:psalm`, `qa:full`.\n\n---\n\n## 2. Glosario\n\n| Término | Definición |\n|---------|------------|\n| **Anuncio** | Ficha publicada por un anunciante (fotos, texto, zona, categoría, visibilidad, chat). Tabla central del negocio. |\n| **Anunciante** | Usuario registrado que publica y gestiona anuncios (`ACCESO-ANUNCIANTE`, `MIS-ANUNCIOS`, `areaPrivada.php`). |\n| **Usuario / visitante** | Usuario final que navega, guarda favoritos y usa chat (`ACCESO-USUARIO`, `accesoWebUsers.php`). |\n| **Zona** | Barrio/distrito de Valencia para filtrar anuncios (ej. Ruzafa, Benimaclet). Geo + SEO local. |\n| **Categoría** | Tipo de servicio (chicas, chicos, travestis, masajes…). Impacta URLs SEO y filtros del grid. |\n| **Grid** | Cuadrícula Pinterest-style de anuncios en home y landings. API: `api_anuncios_grid.php` / `api_mobile_grid_v2.php`. |\n| **Créditos** | Moneda interna del anunciante para renovaciones, boosts y posicionamiento. |\n| **Boost / destacado** | Pago en créditos para subir visibilidad temporal del anuncio en el grid. |\n| **Renovación** | Extensión de vigencia del anuncio (manual o cron HTTP). Ranking en `includes/renovacion_ranking.php`. |\n| **Hub SEO** | Landing temática (`escorts-valencia`, `putas-valencia-valencia`, etc.) enrutada por `hub-seo-router.php` y `.htaccess`. |\n| **Panel / gestión** | `gestion-anuncios-anunciantes/` — backend admin, herramientas, SEO autopilot, métricas. |\n| **Herramientas frontend** | Pantallas en `gestion-anuncios-anunciantes/herramientas/` ejecutables en prod por el operador (sin SSH). |\n| **XZONAS_AGENT_REPORT** | Bloque copiable `=== XZONAS_AGENT_REPORT ===` … `=== END_XZONAS_AGENT_REPORT ===` para diagnóstico prod. |\n| **conectaDB / conectaBBDD** | Dos cadenas de conexión mysqli paralelas (portal vs panel); misma BD, implementaciones distintas. |\n| **XZONASSESSID** | Cookie/sesión propia del portal (además de OAuth Google/Apple). |\n| **Thumbs t0/t1/t2** | Variantes de imagen generadas al subir (`archivos/uploadImg.php`, `api/generate-thumbnails.php`). |\n| **SiteGround** | Hosting compartido de producción. Sin Node.js persistente; crons vía HTTP con token en header. |\n| **Serena** | MCP/LSP del agente (`.serena/project.yml`). Símbolos PHP/TS, memorias, edición quirúrgica. |\n\n---\n\n## 3. FAQ dev\n\n### ¿Cómo arranco en local?\n1. XAMPP (Apache + MySQL) apuntando a `C:\\xampp\\htdocs\\xzonassite`.  \n2. Copiar `.env.example` → `.env` (o `.env.local` para XAMPP con `root` sin password).  \n3. `composer install` y `npm install`.  \n4. Verificar `archivos/conexion/conexion.php` carga `config.php` correctamente.\n\n### ¿Dónde está la configuración de BD y secretos?\n- **`config.php`** (raíz): carga `.env` + `.env.local`, define constantes `DB_*`.  \n- **`archivos/conexion/conexion.php`**: conexión mysqli del portal.  \n- **`gestion-anuncios-anunciantes/funciones/`**: `conectaBBDD()` del panel.  \n- Nunca hardcodear claves; `.env` está en `.gitignore` y excluido del rsync.\n\n### ¿Cómo despliego a producción?\n- Flujo oficial: **`docs/deployment/github-siteground-cicd.md`**.  \n- `develop` → staging automático; `main` → producción.  \n- Workflows: `.github/workflows/deploy-siteground-*.yml`.  \n- Exclusiones: `ops/deploy/rsync-exclude.txt` (no sube `.env`, `uploads/`, `docs/`, etc.).  \n- Rollback: workflow `rollback-production-by-tag.yml`.  \n- **Ramas activas en repo:** `Dev`, `develop`, `master` (verificar cuál es la de release actual).\n\n### ¿Cómo opera el agente en producción sin SSH?\n- **Prohibido** pedir `php ops/*.php` o migraciones por terminal en SiteGround.  \n- **Obligatorio:** pantalla en `gestion-anuncios-anunciantes/herramientas/` → operador ejecuta en navegador → pega `XZONAS_AGENT_REPORT`.  \n- Docs: `docs/PROTOCOLO_HERRAMIENTAS_FRONTEND_OPERADOR.md`, `AGENTS.md`, `.serena/memories/xzonassite_operacion_sin_ssh.md`.\n\n### ¿Qué QA ejecuto tras cambiar código?\n```bash\ncomposer lint:php          # PHPCS\ncomposer analyse:phpstan   # análisis estático\ncomposer analyse:psalm     # análisis estático\ncomposer qa:full           # los tres anteriores\nnpm run minify:custom      # si tocas JS custom\nnpm run build:grid-core    # si tocas grid\nphp -l archivo.php         # syntax check puntual\n```\nEn tareas rápidas: al menos el check más cercano al área modificada.\n\n### ¿Cómo funcionan las APIs?\n- **Legacy:** `api_*.php` en raíz (ej. `api_anuncios_grid.php`, `api_detalle_anuncio.php`).  \n- **Nueva capa:** `/api/v1/` con wrappers de compatibilidad (`api/v1/README.md`).  \n- **CMS/SEO/admin:** `api_cms_*.php`, `api_seo_*.php`.  \n- Convención: `require_once` de `conexion.php`, headers JSON, `htmlspecialchars` en salida HTML.\n\n### ¿Cómo funciona auth y sesiones?\n- Sesión portal: **XZONASSESSID** + variables por rol.  \n- Admin panel: triple flag legacy (`admin_autenticado`, `adminAutorizado`, `admin_authenticated`).  \n- OAuth: Google ✅; Apple (código existe, credenciales opcionales).  \n- CSRF estricto en media; ver `.serena/memories/csrf_media_estricto_2026-02-19.md`.\n\n### ¿Dónde toco SEO y rutas?\n- **`.htaccess`** (~1300 líneas): canónicas, 301, hubs SEO, seguridad, PWA.  \n- **`hub-seo-router.php`**, landings en `seo-pages/`, sitemaps.  \n- Head term canónico: `/putas-valencia-valencia`. Host sin `www`.  \n- Crons HTTP: token en header `X-Cron-Token` o `Authorization: Bearer` (`includes/cron_gate.php`), **nunca** `?token=` en URL.\n\n---\n\n## 4. Checklist onboarding\n\n- [ ] Clonar repo en `C:\\xampp\\htdocs\\xzonassite` (o ruta XAMPP equivalente).\n- [ ] Leer `README.md` y `AGENTS.md` (5 min).\n- [ ] Configurar `.env` / `.env.local` con credenciales DB local.\n- [ ] `composer install` + `npm install`.\n- [ ] Verificar Apache sirve `https://localhost/xzonassite/` (o vhost propio).\n- [ ] Revisar índice agente: `docs/cursorCHATagent/README_INDICE.md`.\n- [ ] Consultar `docs/cursorCHATagent/TAREA_REGISTRO.md` antes de implementar (anti-duplicados).\n- [ ] Activar Serena en Cursor; revisar `.serena/project.yml` (QA, ignored_paths).\n- [ ] Ejecutar `composer qa:full` una vez para validar entorno.\n- [ ] Mapear áreas clave: `includes/`, `gestion-anuncios-anunciantes/`, `api/`, `js/`, `css/bundles/`.\n- [ ] Entender dualidad DB: `conectaDB()` vs `conectaBBDD()` — no unificar sin plan.\n- [ ] Memorizar regla prod: **herramientas UI, no SSH**.\n- [ ] Revisar `.htaccess` solo la sección relevante (no leer entero salvo tarea SEO).\n- [ ] Conocer deploy: `docs/deployment/github-siteground-cicd.md`.\n- [ ] No escanear recursivamente `vendor/`, `node_modules/`, `Core/`, `Dinamic/` sin petición explícita.\n- [ ] Logs grandes: `Get-Content -Tail 80` o lectura parcial; nunca `error.log` completo si >200 KB.\n\n---\n\n## 5. Prompts guardados\n\n### Bugfix\n\n```\n[Bugfix] En xzonassite (PHP 8.2), el endpoint api_XXX.php devuelve [error].\nArchivos sospechosos: [lista]. Analiza causa en includes/conexion y dependencias.\nImplementa fix mínimo sin romper rutas legacy. Ejecuta composer lint:php y php -l.\nResume: causa, cambio, riesgo de regresión.\n```\n\n```\n[Bugfix grid móvil] El grid en home no carga anuncios en iOS.\nRevisa api_anuncios_grid.php, js/grid-unificado-patch.js y build grid-core.\nTras editar JS: npm run build:grid-core. No tocar vendor/.\n```\n\n### Feature\n\n```\n[Feature] Añadir [funcionalidad] al panel gestion-anuncios-anunciantes/herramientas/.\nUI: Bootstrap 5 + admin-standalone-shell.css, cards con KPIs.\nSi requiere datos de prod: generar bloque XZONAS_AGENT_REPORT copiable.\nConsulta TAREA_REGISTRO.md antes de codificar.\n```\n\n```\n[Feature API] Nuevo endpoint en api/v1/ para [recurso].\nMantener wrapper legacy api_XXX.php → /api/v1/XXX.\nPrepared statements, JSON UTF-8, validación entrada. QA: composer analyse:phpstan.\n```\n\n### Refactor\n\n```\n[Refactor acotado] Unificar lógica duplicada entre [archivo A] y [archivo B].\nAlcance: solo estos archivos. Sin cambiar firmas públicas ni $_GET legacy.\nUsa find_referencing_symbols (Serena) antes/después. composer qa:full al cerrar.\n```\n\n```\n[Refactor .htaccess] Reorganizar bloque [nombre] en .htaccess sin cambiar comportamiento.\nVerifica 301 canónicas y hubs SEO existentes. Documenta reglas movidas en comentario.\n```\n\n### Deploy\n\n```\n[Deploy] Preparar cambios para staging (rama develop).\nLista archivos tocados, riesgos prod, y si requieren acción post-deploy (GSC, cron, caché).\nNo ejecutar deploy; solo checklist y verificación dry_run según github-siteground-cicd.md.\n```\n\n```\n[Rollback] El deploy de [fecha] rompió [X]. Identifica commit/tag anterior seguro.\nIndica pasos workflow rollback-production-by-tag.yml y qué validar tras rollback.\n```\n\n### QA\n\n```\n[QA full] Ejecuta composer qa:full y npm run minify:custom.\nReporta errores por archivo con línea. Corrige solo los bloqueantes del área [módulo].\nNo ampliar scope a warnings preexistentes no relacionados.\n```\n\n```\n[QA SEO post-deploy] Tras subir cambios SEO, checklist:\nsitemap-index.xml en GSC, landings paginación, manifest PWA, CrUX 28d.\nUsa docs/refactor-fullstack-2026-06/ como referencia. Sin SFTP manual salvo contingencia.\n```\n\n```\n[Auditoría salud] Ejecuta composer audit:site-health y audit:pagespeed local.\nResume hallazgos P0/P1. Para prod usa herramienta frontend del panel, no php ops/* en SiteGround.\n```\n\n---\n\n## Referencias rápidas (paths)\n\n| Recurso | Ruta |\n|---------|------|\n| Config / env | `config.php`, `.env` |\n| Conexión DB portal | `archivos/conexion/conexion.php` |\n| Funciones portal | `includes/functions.php` |\n| Panel admin | `gestion-anuncios-anunciantes/` |\n| Herramientas operador | `gestion-anuncios-anunciantes/herramientas/` |\n| Routing SEO | `.htaccess`, `hub-seo-router.php` |\n| APIs v1 | `api/v1/` |\n| Chat PWA | `chat-unified-pwa/` |\n| Deploy CI/CD | `docs/deployment/github-siteground-cicd.md` |\n| Protocolo agente | `AGENTS.md`, `docs/PROTOCOLO_HERRAMIENTAS_FRONTEND_OPERADOR.md` |\n| Serena config | `.serena/project.yml` |\n| Memorias Serena | `.serena/memories/xzonassite_estado.md` (estado feb; verificar vs repo actual) |\n\n---\n\n## Disciplina del agente (resumen Serena)\n\n1. Analizar antes de editar (`get_symbols_overview`, `find_symbol`, `find_referencing_symbols`).  \n2. Cambios quirúrgicos: `replace_symbol_body`, `insert_at_line`, `replace_lines`.  \n3. Si el requisito es ambiguo → preguntar, no asumir.  \n4. Tras cambios PHP/TS relevantes → QA indicado.  \n5. Prod SiteGround → UI operador + `XZONAS_AGENT_REPORT`, nunca SSH.  \n6. Lectura selectiva; no escanear masivamente git ni archivos modificados sin petición.  \n7. No grep recursivo en `vendor/`, `node_modules/`, `Core/`, `Dinamic/` salvo petición explícita.\n\n---\n\n*Documento listo para copiar a Serena (`write_memory`) o knowledge local del proyecto.*"}},"at":1782783266782},{"event":"done","data":{"ok":true,"bridgeSessionId":"bs-1782783266775-ebiagw","agentId":"agent-0efef04b-faf5-4b8d-ad68-3d6e5750094d","runId":"run-6e423567-236c-46ce-86bd-19c84d36d84e","status":"finished","result":"# xzonassite — Conocimiento consolidado del proyecto\n\n> **Proyecto:** `C:\\xampp\\htdocs\\xzonassite` · **Dominio:** [xzonasvalencia.com](https://xzonasvalencia.com)  \n> **Última consolidación:** 2026-06-30 · Optimizado para Serena / knowledge local\n\n---\n\n## 1. Resumen ejecutivo\n\nPortal web de alto volumen para **anuncios eróticos en Valencia por zonas y categorías** (escorts, masajes, travestis, etc.), con SEO local agresivo y panel de gestión para anunciantes y administradores. Stack principal: **PHP 8.2 + MySQL (mysqli, sin ORM) + JavaScript vanilla/jQuery**, front legacy con bundles minificados (`npm run minify:custom`, `build:grid-core`). Arquitectura híbrida: cientos de endpoints `api_*.php` en raíz, migración progresiva a `/api/v1/`, panel admin en `gestion-anuncios-anunciantes/`, chat PWA en `chat-unified-pwa/`. Configuración y secretos vía **`.env`** (`DB_*`, `SMTP_*`, `GOOGLE_*`, `OPENAI_*`). Despliegue oficial **GitHub Actions → SiteGround** (`develop`→staging, `main`→producción); producción **no se opera por SSH desde el agente** — solo herramientas UI del panel con informe `XZONAS_AGENT_REPORT`. QA obligatorio: `composer lint:php`, `analyse:phpstan`, `analyse:psalm`, `qa:full`.\n\n---\n\n## 2. Glosario\n\n| Término | Definición |\n|---------|------------|\n| **Anuncio** | Ficha publicada por un anunciante (fotos, texto, zona, categoría, visibilidad, chat). Tabla central del negocio. |\n| **Anunciante** | Usuario registrado que publica y gestiona anuncios (`ACCESO-ANUNCIANTE`, `MIS-ANUNCIOS`, `areaPrivada.php`). |\n| **Usuario / visitante** | Usuario final que navega, guarda favoritos y usa chat (`ACCESO-USUARIO`, `accesoWebUsers.php`). |\n| **Zona** | Barrio/distrito de Valencia para filtrar anuncios (ej. Ruzafa, Benimaclet). Geo + SEO local. |\n| **Categoría** | Tipo de servicio (chicas, chicos, travestis, masajes…). Impacta URLs SEO y filtros del grid. |\n| **Grid** | Cuadrícula Pinterest-style de anuncios en home y landings. API: `api_anuncios_grid.php` / `api_mobile_grid_v2.php`. |\n| **Créditos** | Moneda interna del anunciante para renovaciones, boosts y posicionamiento. |\n| **Boost / destacado** | Pago en créditos para subir visibilidad temporal del anuncio en el grid. |\n| **Renovación** | Extensión de vigencia del anuncio (manual o cron HTTP). Ranking en `includes/renovacion_ranking.php`. |\n| **Hub SEO** | Landing temática (`escorts-valencia`, `putas-valencia-valencia`, etc.) enrutada por `hub-seo-router.php` y `.htaccess`. |\n| **Panel / gestión** | `gestion-anuncios-anunciantes/` — backend admin, herramientas, SEO autopilot, métricas. |\n| **Herramientas frontend** | Pantallas en `gestion-anuncios-anunciantes/herramientas/` ejecutables en prod por el operador (sin SSH). |\n| **XZONAS_AGENT_REPORT** | Bloque copiable `=== XZONAS_AGENT_REPORT ===` … `=== END_XZONAS_AGENT_REPORT ===` para diagnóstico prod. |\n| **conectaDB / conectaBBDD** | Dos cadenas de conexión mysqli paralelas (portal vs panel); misma BD, implementaciones distintas. |\n| **XZONASSESSID** | Cookie/sesión propia del portal (además de OAuth Google/Apple). |\n| **Thumbs t0/t1/t2** | Variantes de imagen generadas al subir (`archivos/uploadImg.php`, `api/generate-thumbnails.php`). |\n| **SiteGround** | Hosting compartido de producción. Sin Node.js persistente; crons vía HTTP con token en header. |\n| **Serena** | MCP/LSP del agente (`.serena/project.yml`). Símbolos PHP/TS, memorias, edición quirúrgica. |\n\n---\n\n## 3. FAQ dev\n\n### ¿Cómo arranco en local?\n1. XAMPP (Apache + MySQL) apuntando a `C:\\xampp\\htdocs\\xzonassite`.  \n2. Copiar `.env.example` → `.env` (o `.env.local` para XAMPP con `root` sin password).  \n3. `composer install` y `npm install`.  \n4. Verificar `archivos/conexion/conexion.php` carga `config.php` correctamente.\n\n### ¿Dónde está la configuración de BD y secretos?\n- **`config.php`** (raíz): carga `.env` + `.env.local`, define constantes `DB_*`.  \n- **`archivos/conexion/conexion.php`**: conexión mysqli del portal.  \n- **`gestion-anuncios-anunciantes/funciones/`**: `conectaBBDD()` del panel.  \n- Nunca hardcodear claves; `.env` está en `.gitignore` y excluido del rsync.\n\n### ¿Cómo despliego a producción?\n- Flujo oficial: **`docs/deployment/github-siteground-cicd.md`**.  \n- `develop` → staging automático; `main` → producción.  \n- Workflows: `.github/workflows/deploy-siteground-*.yml`.  \n- Exclusiones: `ops/deploy/rsync-exclude.txt` (no sube `.env`, `uploads/`, `docs/`, etc.).  \n- Rollback: workflow `rollback-production-by-tag.yml`.  \n- **Ramas activas en repo:** `Dev`, `develop`, `master` (verificar cuál es la de release actual).\n\n### ¿Cómo opera el agente en producción sin SSH?\n- **Prohibido** pedir `php ops/*.php` o migraciones por terminal en SiteGround.  \n- **Obligatorio:** pantalla en `gestion-anuncios-anunciantes/herramientas/` → operador ejecuta en navegador → pega `XZONAS_AGENT_REPORT`.  \n- Docs: `docs/PROTOCOLO_HERRAMIENTAS_FRONTEND_OPERADOR.md`, `AGENTS.md`, `.serena/memories/xzonassite_operacion_sin_ssh.md`.\n\n### ¿Qué QA ejecuto tras cambiar código?\n```bash\ncomposer lint:php          # PHPCS\ncomposer analyse:phpstan   # análisis estático\ncomposer analyse:psalm     # análisis estático\ncomposer qa:full           # los tres anteriores\nnpm run minify:custom      # si tocas JS custom\nnpm run build:grid-core    # si tocas grid\nphp -l archivo.php         # syntax check puntual\n```\nEn tareas rápidas: al menos el check más cercano al área modificada.\n\n### ¿Cómo funcionan las APIs?\n- **Legacy:** `api_*.php` en raíz (ej. `api_anuncios_grid.php`, `api_detalle_anuncio.php`).  \n- **Nueva capa:** `/api/v1/` con wrappers de compatibilidad (`api/v1/README.md`).  \n- **CMS/SEO/admin:** `api_cms_*.php`, `api_seo_*.php`.  \n- Convención: `require_once` de `conexion.php`, headers JSON, `htmlspecialchars` en salida HTML.\n\n### ¿Cómo funciona auth y sesiones?\n- Sesión portal: **XZONASSESSID** + variables por rol.  \n- Admin panel: triple flag legacy (`admin_autenticado`, `adminAutorizado`, `admin_authenticated`).  \n- OAuth: Google ✅; Apple (código existe, credenciales opcionales).  \n- CSRF estricto en media; ver `.serena/memories/csrf_media_estricto_2026-02-19.md`.\n\n### ¿Dónde toco SEO y rutas?\n- **`.htaccess`** (~1300 líneas): canónicas, 301, hubs SEO, seguridad, PWA.  \n- **`hub-seo-router.php`**, landings en `seo-pages/`, sitemaps.  \n- Head term canónico: `/putas-valencia-valencia`. Host sin `www`.  \n- Crons HTTP: token en header `X-Cron-Token` o `Authorization: Bearer` (`includes/cron_gate.php`), **nunca** `?token=` en URL.\n\n---\n\n## 4. Checklist onboarding\n\n- [ ] Clonar repo en `C:\\xampp\\htdocs\\xzonassite` (o ruta XAMPP equivalente).\n- [ ] Leer `README.md` y `AGENTS.md` (5 min).\n- [ ] Configurar `.env` / `.env.local` con credenciales DB local.\n- [ ] `composer install` + `npm install`.\n- [ ] Verificar Apache sirve `https://localhost/xzonassite/` (o vhost propio).\n- [ ] Revisar índice agente: `docs/cursorCHATagent/README_INDICE.md`.\n- [ ] Consultar `docs/cursorCHATagent/TAREA_REGISTRO.md` antes de implementar (anti-duplicados).\n- [ ] Activar Serena en Cursor; revisar `.serena/project.yml` (QA, ignored_paths).\n- [ ] Ejecutar `composer qa:full` una vez para validar entorno.\n- [ ] Mapear áreas clave: `includes/`, `gestion-anuncios-anunciantes/`, `api/`, `js/`, `css/bundles/`.\n- [ ] Entender dualidad DB: `conectaDB()` vs `conectaBBDD()` — no unificar sin plan.\n- [ ] Memorizar regla prod: **herramientas UI, no SSH**.\n- [ ] Revisar `.htaccess` solo la sección relevante (no leer entero salvo tarea SEO).\n- [ ] Conocer deploy: `docs/deployment/github-siteground-cicd.md`.\n- [ ] No escanear recursivamente `vendor/`, `node_modules/`, `Core/`, `Dinamic/` sin petición explícita.\n- [ ] Logs grandes: `Get-Content -Tail 80` o lectura parcial; nunca `error.log` completo si >200 KB.\n\n---\n\n## 5. Prompts guardados\n\n### Bugfix\n\n```\n[Bugfix] En xzonassite (PHP 8.2), el endpoint api_XXX.php devuelve [error].\nArchivos sospechosos: [lista]. Analiza causa en includes/conexion y dependencias.\nImplementa fix mínimo sin romper rutas legacy. Ejecuta composer lint:php y php -l.\nResume: causa, cambio, riesgo de regresión.\n```\n\n```\n[Bugfix grid móvil] El grid en home no carga anuncios en iOS.\nRevisa api_anuncios_grid.php, js/grid-unificado-patch.js y build grid-core.\nTras editar JS: npm run build:grid-core. No tocar vendor/.\n```\n\n### Feature\n\n```\n[Feature] Añadir [funcionalidad] al panel gestion-anuncios-anunciantes/herramientas/.\nUI: Bootstrap 5 + admin-standalone-shell.css, cards con KPIs.\nSi requiere datos de prod: generar bloque XZONAS_AGENT_REPORT copiable.\nConsulta TAREA_REGISTRO.md antes de codificar.\n```\n\n```\n[Feature API] Nuevo endpoint en api/v1/ para [recurso].\nMantener wrapper legacy api_XXX.php → /api/v1/XXX.\nPrepared statements, JSON UTF-8, validación entrada. QA: composer analyse:phpstan.\n```\n\n### Refactor\n\n```\n[Refactor acotado] Unificar lógica duplicada entre [archivo A] y [archivo B].\nAlcance: solo estos archivos. Sin cambiar firmas públicas ni $_GET legacy.\nUsa find_referencing_symbols (Serena) antes/después. composer qa:full al cerrar.\n```\n\n```\n[Refactor .htaccess] Reorganizar bloque [nombre] en .htaccess sin cambiar comportamiento.\nVerifica 301 canónicas y hubs SEO existentes. Documenta reglas movidas en comentario.\n```\n\n### Deploy\n\n```\n[Deploy] Preparar cambios para staging (rama develop).\nLista archivos tocados, riesgos prod, y si requieren acción post-deploy (GSC, cron, caché).\nNo ejecutar deploy; solo checklist y verificación dry_run según github-siteground-cicd.md.\n```\n\n```\n[Rollback] El deploy de [fecha] rompió [X]. Identifica commit/tag anterior seguro.\nIndica pasos workflow rollback-production-by-tag.yml y qué validar tras rollback.\n```\n\n### QA\n\n```\n[QA full] Ejecuta composer qa:full y npm run minify:custom.\nReporta errores por archivo con línea. Corrige solo los bloqueantes del área [módulo].\nNo ampliar scope a warnings preexistentes no relacionados.\n```\n\n```\n[QA SEO post-deploy] Tras subir cambios SEO, checklist:\nsitemap-index.xml en GSC, landings paginación, manifest PWA, CrUX 28d.\nUsa docs/refactor-fullstack-2026-06/ como referencia. Sin SFTP manual salvo contingencia.\n```\n\n```\n[Auditoría salud] Ejecuta composer audit:site-health y audit:pagespeed local.\nResume hallazgos P0/P1. Para prod usa herramienta frontend del panel, no php ops/* en SiteGround.\n```\n\n---\n\n## Referencias rápidas (paths)\n\n| Recurso | Ruta |\n|---------|------|\n| Config / env | `config.php`, `.env` |\n| Conexión DB portal | `archivos/conexion/conexion.php` |\n| Funciones portal | `includes/functions.php` |\n| Panel admin | `gestion-anuncios-anunciantes/` |\n| Herramientas operador | `gestion-anuncios-anunciantes/herramientas/` |\n| Routing SEO | `.htaccess`, `hub-seo-router.php` |\n| APIs v1 | `api/v1/` |\n| Chat PWA | `chat-unified-pwa/` |\n| Deploy CI/CD | `docs/deployment/github-siteground-cicd.md` |\n| Protocolo agente | `AGENTS.md`, `docs/PROTOCOLO_HERRAMIENTAS_FRONTEND_OPERADOR.md` |\n| Serena config | `.serena/project.yml` |\n| Memorias Serena | `.serena/memories/xzonassite_estado.md` (estado feb; verificar vs repo actual) |\n\n---\n\n## Disciplina del agente (resumen Serena)\n\n1. Analizar antes de editar (`get_symbols_overview`, `find_symbol`, `find_referencing_symbols`).  \n2. Cambios quirúrgicos: `replace_symbol_body`, `insert_at_line`, `replace_lines`.  \n3. Si el requisito es ambiguo → preguntar, no asumir.  \n4. Tras cambios PHP/TS relevantes → QA indicado.  \n5. Prod SiteGround → UI operador + `XZONAS_AGENT_REPORT`, nunca SSH.  \n6. Lectura selectiva; no escanear masivamente git ni archivos modificados sin petición.  \n7. No grep recursivo en `vendor/`, `node_modules/`, `Core/`, `Dinamic/` salvo petición explícita.\n\n---\n\n*Documento listo para copiar a Serena (`write_memory`) o knowledge local del proyecto.*","changeSessionId":"cs-1782783090407-ng5a90","pendingChanges":0,"changes":[],"transcriptPath":null,"notifyTitle":"Agente terminado","notifyBody":"Explorando la estructura y archivos clave del proyecto para consolidar conocimiento preciso.\n# xzonassite — Conocimiento"},"at":1782783266782}]}
