|
| 1 | +# WebPerf Snippets — Plan de Mejoras Consolidado |
| 2 | + |
| 3 | +> Fusión de análisis realizados el 2026-03-30 por Claude, Codex y Gemini CLI. |
| 4 | +> Los ítems marcados con ★ son consenso entre al menos dos de los tres análisis. |
| 5 | +
|
| 6 | +--- |
| 7 | + |
| 8 | +## Resumen ejecutivo |
| 9 | + |
| 10 | +El proyecto tiene una base sólida: 47 snippets bien organizados, documentación visual con diagramas Mermaid, soporte de Agent Skills y paridad entre fuentes, páginas y artefactos generados. Las mejoras se agrupan en cinco vectores: |
| 11 | + |
| 12 | +1. **Robustez** — Evitar inconsistencias entre fuentes y artefactos generados |
| 13 | +2. **Consistencia editorial** — Homogeneizar la profundidad de cada página |
| 14 | +3. **Descubribilidad** — Mejorar el onboarding y la navegación por contexto |
| 15 | +4. **Expansión** — Nuevos snippets para APIs modernas |
| 16 | +5. **Medios y visuales** — Hacer el output comprensible a primera vista |
| 17 | + |
| 18 | +--- |
| 19 | + |
| 20 | +## Fase 1 — Robustez y mantenibilidad ★ |
| 21 | + |
| 22 | +**Objetivo:** Reducir el riesgo de inconsistencias entre contenido fuente y artefactos generados. |
| 23 | + |
| 24 | +### 1.1 Script de consistencia ★ |
| 25 | + |
| 26 | +Crear `scripts/check-consistency.js` expuesto como: |
| 27 | + |
| 28 | +```json |
| 29 | +"check:consistency": "node scripts/check-consistency.js" |
| 30 | +``` |
| 31 | + |
| 32 | +Debe validar: |
| 33 | +- Cada snippet tiene página MDX asociada (o excepción explícita) |
| 34 | +- Cada página tiene snippet asociado (o está marcada como página editorial) |
| 35 | +- `_meta.json` está alineado con los `.mdx` existentes |
| 36 | +- `skills/` y `dist/` no están desactualizados respecto a `snippets/` y `pages/` |
| 37 | +- Los conteos publicados en `README.md` y `SKILLS.md` no han quedado obsoletos |
| 38 | + |
| 39 | +### 1.2 Check de artefactos generados ★ |
| 40 | + |
| 41 | +```json |
| 42 | +"generate-skills:check": "node scripts/generate-skills.js && git diff --exit-code -- skills dist" |
| 43 | +``` |
| 44 | + |
| 45 | +Detecta si alguien modifica fuentes sin regenerar salidas. Corrige también la desalineación actual entre `package.json` (v1.2.0) y `skills/webperf/SKILL.md` (v1.1.0). |
| 46 | + |
| 47 | +### 1.3 Modelo explícito para páginas editoriales |
| 48 | + |
| 49 | +`Get-Your-Head-in-Order.mdx` es contenido editorial válido, pero no está formalizado. Opciones: |
| 50 | + |
| 51 | +- Frontmatter `type: guide` para páginas sin snippet asociado |
| 52 | +- Lista de excepciones explícitas en el check de consistencia |
| 53 | + |
| 54 | +Recomendación: usar frontmatter — es autodocumentado y legible por automatizaciones. |
| 55 | + |
| 56 | +### 1.4 CI para pull requests ★ |
| 57 | + |
| 58 | +Workflow de GitHub Actions en cada PR: |
| 59 | + |
| 60 | +```yaml |
| 61 | +- npm ci |
| 62 | +- npm run lint |
| 63 | +- npm run build |
| 64 | +- npm run check:consistency |
| 65 | +- npm run generate-skills:check |
| 66 | +``` |
| 67 | +
|
| 68 | +Es la mejora con mejor retorno inmediato: evita que errores de consistencia lleguen a `main`. |
| 69 | + |
| 70 | +--- |
| 71 | + |
| 72 | +## Fase 2 — Documentación y experiencia de contribución ★ |
| 73 | + |
| 74 | +**Objetivo:** Reducir la curva de entrada para nuevos contribuidores y consumidores. |
| 75 | + |
| 76 | +### 2.1 Plantilla estándar por página ★ |
| 77 | + |
| 78 | +Esqueleto mínimo para cada snippet: |
| 79 | + |
| 80 | +``` |
| 81 | +1. Descripción breve (2-3 párrafos) |
| 82 | +2. Tabla de umbrales (Good / Needs Improvement / Poor) — donde aplique |
| 83 | +3. Diagrama Mermaid (flujo o secuencia) |
| 84 | +4. Snippet ejecutable con botón de copia |
| 85 | +5. Explicación del output (qué significa cada campo) |
| 86 | +6. Causas comunes y qué hacer si el resultado es malo |
| 87 | +7. Ejemplo de integración RUM (al menos 1) |
| 88 | +8. Tabla de compatibilidad de navegadores |
| 89 | +9. Further Reading |
| 90 | +``` |
| 91 | + |
| 92 | +Páginas prioritarias a enriquecer: |
| 93 | + |
| 94 | +| Página | Qué le falta | |
| 95 | +|--------|-------------| |
| 96 | +| `LCP-Trail.mdx` | Tabla de campos, diagrama, sección de interpretación | |
| 97 | +| `LCP.mdx` | Ejemplo de integración RUM | |
| 98 | +| `FCP.mdx` | Diagrama de fases, tabla de causas comunes | |
| 99 | +| `LongTask.mdx` | Migración FID→INP, comparativa con LoAF | |
| 100 | +| `Scroll-Performance.mdx` | Tabla de umbrales, ejemplos de causas | |
| 101 | +| `Content-Visibility.mdx` | Diagrama before/after, casos de uso | |
| 102 | +| `Back-Forward-Cache.mdx` | Tabla de razones de fallo más comunes | |
| 103 | + |
| 104 | +### 2.2 Tabla de compatibilidad de APIs ★ |
| 105 | + |
| 106 | +En cada página, tabla de soporte real: |
| 107 | + |
| 108 | +| API | Chrome | Firefox | Safari | Edge | |
| 109 | +|-----|--------|---------|--------|------| |
| 110 | +| PerformanceObserver | ✅ 52 | ✅ 57 | ✅ 11 | ✅ 79 | |
| 111 | +| Long Animation Frames | ✅ 123 | ❌ | ❌ | ✅ 123 | |
| 112 | + |
| 113 | +Actualmente solo `INP.mdx` tiene esta tabla. Evita frustración cuando un snippet no devuelve datos. |
| 114 | + |
| 115 | +### 2.3 Documento de arquitectura |
| 116 | + |
| 117 | +Crear `docs/ARCHITECTURE.md` con: |
| 118 | + |
| 119 | +- Flujo: fuente → docs → skills → dist |
| 120 | +- Qué archivos son fuente de verdad vs. generados |
| 121 | +- Cuándo ejecutar `generate-skills` |
| 122 | +- Cómo se relacionan `pages/`, `snippets/`, `skills/` y `dist/` |
| 123 | + |
| 124 | +### 2.4 Guía de release |
| 125 | + |
| 126 | +Crear `docs/RELEASING.md`: |
| 127 | + |
| 128 | +- Cómo subir versión |
| 129 | +- Cómo regenerar skills |
| 130 | +- Cómo validar que `SKILL.md` usa la versión correcta |
| 131 | +- Qué assets genera el workflow de release |
| 132 | + |
| 133 | +### 2.5 Plantilla para nuevos snippets ★ |
| 134 | + |
| 135 | +Archivos `templates/snippet.js` y `templates/snippet-page.mdx` con la estructura mínima esperada. Futuro comando: |
| 136 | + |
| 137 | +```json |
| 138 | +"new:snippet": "node scripts/new-snippet.js" |
| 139 | +``` |
| 140 | + |
| 141 | +Evita errores de naming, estructura y quality bar en cada aportación nueva. |
| 142 | + |
| 143 | +### 2.6 Páginas índice por categoría |
| 144 | + |
| 145 | +Añadir páginas de entrada por categoría: |
| 146 | + |
| 147 | +- `CoreWebVitals/index.mdx` — Diagrama relacional LCP / INP / CLS. Cuándo afecta cada uno al score de PageSpeed |
| 148 | +- `Loading/index.mdx` — Jerarquía TTFB → FCP → LCP. Flujo de decisión: "¿qué medir primero?" |
| 149 | +- `Interaction/index.mdx` — INP como métrica principal, LoAF como herramienta de diagnóstico |
| 150 | +- `Media/index.mdx` — Impacto de imágenes y vídeos en LCP y CLS |
| 151 | + |
| 152 | +### 2.7 Guía de inicio rápido por perfil |
| 153 | + |
| 154 | +En `index.mdx` o como página separada: |
| 155 | + |
| 156 | +``` |
| 157 | +¿Eres...? |
| 158 | +├── Developer → LCP Sub-Parts + Resource Hints |
| 159 | +├── Analista → Core Web Vitals + TTFB |
| 160 | +├── DevOps → TTFB + Service Worker Analysis |
| 161 | +└── Diseñador → CLS + Image Element Audit |
| 162 | +``` |
| 163 | + |
| 164 | +### 2.8 Glosario técnico |
| 165 | + |
| 166 | +Crear `pages/glossary.mdx`: |
| 167 | +BPP, LoAF, hadRecentInput, TAO, TTFB sub-parts, Core Web Vitals vs. Lighthouse metrics, RUM vs. Lab data. |
| 168 | + |
| 169 | +--- |
| 170 | + |
| 171 | +## Fase 3 — Medios y documentación visual ★ |
| 172 | + |
| 173 | +**Objetivo:** Hacer el output comprensible a primera vista, especialmente para usuarios que llegan desde buscadores o IA. |
| 174 | + |
| 175 | +### 3.1 Capturas de output en DevTools ★ |
| 176 | + |
| 177 | +Para los snippets principales (`LCP`, `CLS`, `INP`, `TTFB`, `FCP`, `Long-Animation-Frames`, `Image-Element-Audit`): |
| 178 | + |
| 179 | +- Captura del output en consola (imagen o GIF animado) |
| 180 | +- Breve interpretación del resultado |
| 181 | +- Ejemplo de output "bueno" vs. "problemático" |
| 182 | + |
| 183 | +Formato recomendado: imágenes en Cloudinary integradas con `CldImage`. La infraestructura ya existe. |
| 184 | + |
| 185 | +### 3.2 Sección RUM integration en páginas clave ★ |
| 186 | + |
| 187 | +Replicar el patrón de `INP.mdx` (GA4, DataDog, New Relic) en: |
| 188 | +`LCP.mdx`, `CLS.mdx`, `TTFB.mdx`, `Long-Animation-Frames.mdx` |
| 189 | + |
| 190 | +### 3.3 Videos cortos por workflow ★ |
| 191 | + |
| 192 | +Priorizar vídeos de 30–90 segundos orientados a intención concreta: |
| 193 | + |
| 194 | +- "Cómo depurar TTFB lento" |
| 195 | +- "Cómo detectar render-blocking resources" |
| 196 | +- "Cómo investigar un LCP basado en imagen" |
| 197 | +- "Cómo usar WebPerf Skills con un agente" |
| 198 | +- "Cómo leer el output de INP" |
| 199 | + |
| 200 | +Un problema, una demo, una conclusión. La infraestructura Cloudinary ya está disponible. |
| 201 | + |
| 202 | +### 3.4 Playbooks / casos de uso reales |
| 203 | + |
| 204 | +Crear `pages/playbooks/`: |
| 205 | + |
| 206 | +- Auditar una landing lenta |
| 207 | +- Depurar terceros que bloquean render |
| 208 | +- Investigar mala experiencia móvil en red 3G |
| 209 | +- Analizar una página Next.js con exceso de hydration data |
| 210 | + |
| 211 | +Conecta el catálogo técnico con problemas reales y mejora la descubribilidad desde buscadores. |
| 212 | + |
| 213 | +### 3.5 Botón de "Demo Live" |
| 214 | + |
| 215 | +Implementar páginas de prueba diseñadas para fallar en una métrica concreta (imagen pesada sin optimizar para LCP, shifts de layout para CLS) vinculadas desde su snippet. Los usuarios pueden abrir la página y ejecutar el snippet al instante. |
| 216 | + |
| 217 | +--- |
| 218 | + |
| 219 | +## Fase 4 — Tooling interno |
| 220 | + |
| 221 | +**Objetivo:** Reducir trabajo manual y convertir el repo en un sistema más autosuficiente. |
| 222 | + |
| 223 | +### 4.1 `scripts/new-snippet.js` |
| 224 | + |
| 225 | +Genera automáticamente: |
| 226 | +- Archivo en `snippets/<Category>/` |
| 227 | +- Página en `pages/<Category>/` |
| 228 | +- Entrada en `_meta.json` |
| 229 | + |
| 230 | +### 4.2 Registro de snippets como fuente de verdad ★ |
| 231 | + |
| 232 | +Centralizar metadatos en `snippets-registry.json` o expandir `lib/snippets-registry.js` para que sea generado: |
| 233 | +- Imports, títulos, descripciones base, URLs |
| 234 | +- Genera `_meta.json` y tabla de contenidos en `README.md` |
| 235 | +- Proporciona API interna para Agent Skills |
| 236 | + |
| 237 | +### 4.3 `scripts/docs-stats.js` |
| 238 | + |
| 239 | +Genera estadísticas del proyecto: |
| 240 | +- Snippets por categoría |
| 241 | +- Páginas editoriales vs. páginas con snippet |
| 242 | +- Últimas incorporaciones |
| 243 | +- Cobertura de tablas de compatibilidad y capturas |
| 244 | + |
| 245 | +Útil para refrescar README o una página "Project Stats". |
| 246 | + |
| 247 | +### 4.4 Smoke tests para scripts críticos |
| 248 | + |
| 249 | +Tests básicos de filesystem y outputs esperados para: |
| 250 | +`generate-skills.js`, `install-skills.js`, `install-global.js`, `install-from-release.js`, futuro `check-consistency.js` |
| 251 | + |
| 252 | +### 4.5 Badges de salud en README |
| 253 | + |
| 254 | +- Última release |
| 255 | +- Estado del CI |
| 256 | +- Número de snippets |
| 257 | +- Licencia |
| 258 | + |
| 259 | +--- |
| 260 | + |
| 261 | +## Fase 5 — Nuevos snippets |
| 262 | + |
| 263 | +**Objetivo:** Cubrir APIs modernas donde el proyecto puede ganar diferenciación. |
| 264 | + |
| 265 | +### 5.1 Core Web Vitals |
| 266 | + |
| 267 | +| Snippet | API clave | Chrome mín. | |
| 268 | +|---------|-----------|-------------| |
| 269 | +| `INP-Attribution.js` | PerformanceObserver + LoAF | 123 | |
| 270 | +| `CLS-Source-Attribution.js` | LayoutShift attribution | 84 | |
| 271 | +| `LCP-Initiator-Chain.js` | Resource Timing + LoAF | 123 | |
| 272 | + |
| 273 | +### 5.2 Loading ★ |
| 274 | + |
| 275 | +| Snippet | API clave | Chrome mín. | |
| 276 | +|---------|-----------|-------------| |
| 277 | +| `Speculation-Rules-Audit.js` ★ | document.ruleSets | 109 | |
| 278 | +| `Fetch-Priority-Audit.js` | Resource Timing priority | 102 | |
| 279 | +| `Early-Hints-Detection.js` ★ | Resource Timing | 103 | |
| 280 | +| `Third-Party-Impact-Score.js` ★ | LoAF + Resource Timing | 123 | |
| 281 | +| `HTTP-Cache-Audit.js` ★ | Resource Timing cache | 52 | |
| 282 | +| `Compression-Audit.js` | Resource Timing encoding | 52 | |
| 283 | +| `Module-Preload-Audit.js` | Resource Timing + ES modules | 66 | |
| 284 | + |
| 285 | +### 5.3 Interaction |
| 286 | + |
| 287 | +| Snippet | API clave | Chrome mín. | |
| 288 | +|---------|-----------|-------------| |
| 289 | +| `INP-Long-Tasks-Correlation.js` | LoAF + INP | 123 | |
| 290 | +| `Pointer-Event-Latency.js` | Event Timing | 76 | |
| 291 | +| `Soft-Navigation-Tracking.js` ★ | Soft Navigations API (exp.) | 123 | |
| 292 | + |
| 293 | +### 5.4 Media |
| 294 | + |
| 295 | +| Snippet | API clave | Chrome mín. | |
| 296 | +|---------|-----------|-------------| |
| 297 | +| `Image-Format-Audit.js` | Resource Timing + DOM | 52 | |
| 298 | +| `Responsive-Images-Audit.js` | DOM inspection | 52 | |
| 299 | +| `Font-Display-Audit.js` ★ | CSS OM + Resource Timing | 52 | |
| 300 | +| `Font-Face-Detailed-Timing.js` ★ | FontFaceSet API | 35 | |
| 301 | +| `Image-CDN-Policy-Audit.js` | Resource Timing + DOM | 52 | |
| 302 | + |
| 303 | +### 5.5 Nueva categoría: Security & Privacy Performance |
| 304 | + |
| 305 | +| Snippet | API clave | Chrome mín. | |
| 306 | +|---------|-----------|-------------| |
| 307 | +| `Permissions-Policy-Audit.js` | document.featurePolicy | 74 | |
| 308 | +| `Cross-Origin-Isolation-Audit.js` | crossOriginIsolated | 87 | |
| 309 | + |
| 310 | +### 5.6 Nueva categoría: Resilience & Offline |
| 311 | + |
| 312 | +| Snippet | API clave | Chrome mín. | |
| 313 | +|---------|-----------|-------------| |
| 314 | +| `Service-Worker-Cache-Strategy.js` | SW Cache API | 40 | |
| 315 | +| `Offline-Fallback-Audit.js` | SW + Fetch | 40 | |
| 316 | + |
| 317 | +--- |
| 318 | + |
| 319 | +## Fase 6 — Mejoras en snippets existentes |
| 320 | + |
| 321 | +| Script | Mejora | |
| 322 | +|--------|--------| |
| 323 | +| `TTFB.js` | Añadir parsing de `Server-Timing` header | |
| 324 | +| `First-And-Third-Party-Script-Info.js` | Correlacionar con LoAF para indicar impacto en LCP/INP | |
| 325 | +| `Resource-Hints.js` | Verificar si preloads y prefetches se usaron realmente | |
| 326 | +| `Fonts-Preloaded-Loaded-and-used-above-the-fold.js` | Detectar font subsetting con `unicode-range` | |
| 327 | +| `Long-Animation-Frames.js` | Mini timeline ASCII en consola para identificar patrones | |
| 328 | + |
| 329 | +--- |
| 330 | + |
| 331 | +## Fase 7 — Internacionalización |
| 332 | + |
| 333 | +Dado que el autor y parte de la comunidad de WebPerf es hispanohablante, traducir la documentación al español aportaría valor diferencial. Configurar Nextra para `/en/` y `/es/` y traducir guías y explicaciones de métricas en fases. |
| 334 | + |
| 335 | +--- |
| 336 | + |
| 337 | +## Priorización |
| 338 | + |
| 339 | +### Alta prioridad — impacto inmediato |
| 340 | + |
| 341 | +1. ★ Corregir desalineación de versión `package.json` vs `SKILL.md` |
| 342 | +2. ★ `check-consistency.js` + `generate-skills:check` |
| 343 | +3. ★ CI para pull requests (lint + build + consistency + artifacts) |
| 344 | +4. ★ Capturas de output en consola para los 7 snippets principales |
| 345 | +5. ★ Enriquecer páginas con poco contenido (LCP-Trail, FCP, LongTask, Scroll-Performance) |
| 346 | +6. ★ `Speculation-Rules-Audit.js` — API moderna, alta demanda en 2025-2026 |
| 347 | +7. ★ `Third-Party-Impact-Score.js` — pregunta más frecuente en auditorías |
| 348 | + |
| 349 | +### Media prioridad — mejora la calidad global |
| 350 | + |
| 351 | +8. Páginas índice por categoría |
| 352 | +9. ★ RUM integration en LCP, CLS, TTFB |
| 353 | +10. ★ `HTTP-Cache-Audit.js` y `Fetch-Priority-Audit.js` |
| 354 | +11. ★ Plantilla para nuevos snippets + `new-snippet.js` |
| 355 | +12. `docs/ARCHITECTURE.md` y `docs/RELEASING.md` |
| 356 | +13. ★ Tabla de compatibilidad de APIs en cada página |
| 357 | +14. Glosario técnico |
| 358 | +15. Guía de inicio rápido por perfil |
| 359 | + |
| 360 | +### Baja prioridad — madurez del proyecto |
| 361 | + |
| 362 | +16. Testing de snippets (smoke tests + Playwright) |
| 363 | +17. Nueva categoría Security & Privacy Performance |
| 364 | +18. Nueva categoría Resilience & Offline |
| 365 | +19. Videos cortos por workflow |
| 366 | +20. Playbooks de casos de uso reales |
| 367 | +21. Botón de "Demo Live" |
| 368 | +22. Internacionalización (español) |
| 369 | +23. Snippet output schema (TypeScript types) |
| 370 | + |
| 371 | +--- |
| 372 | + |
| 373 | +## Quick wins muy concretos |
| 374 | + |
| 375 | +Acciones de menos de 1 hora cada una: |
| 376 | + |
| 377 | +- [ ] Corregir versión en `skills/webperf/SKILL.md` (1.1.0 → 1.2.0) |
| 378 | +- [ ] Añadir frontmatter `type: guide` a `Get-Your-Head-in-Order.mdx` |
| 379 | +- [ ] Añadir `npm run check:consistency` al script section de `package.json` |
| 380 | +- [ ] Añadir sección "Start here" en `README.md` |
| 381 | +- [ ] Añadir badges (release, CI status, snippet count) en `README.md` |
| 382 | +- [ ] Añadir tabla de compatibilidad a `LCP.mdx`, `CLS.mdx`, `TTFB.mdx` |
| 383 | +- [ ] Añadir al menos 3 capturas de consola en snippets clave |
| 384 | + |
| 385 | +--- |
| 386 | + |
| 387 | +*Fusión consolidada — 2026-04-05* |
0 commit comments