<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pablo IB | Tech Blog &amp; Second Brain</title><link>https://pabloib.com/</link><description>Recent content on Pablo IB | Tech Blog &amp; Second Brain</description><generator>Hugo</generator><language>es-es</language><lastBuildDate>Mon, 31 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://pabloib.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Cómo hice Fine-Tuning de Embeddings (BGE-M3) para mi Infraestructura de Agentes: +20.8% de Precisión y Lecciones de Hardware</title><link>https://pabloib.com/posts/2026-08-31-fine-tuning-bge-m3-embeddings-portfolio/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-08-31-fine-tuning-bge-m3-embeddings-portfolio/</guid><description>&lt;p&gt;Durante meses usé el modelo &lt;code&gt;BAAI/bge-m3&lt;/code&gt; genérico para la búsqueda semántica y la memoria de mis agentes en OpenViking.&lt;/p&gt;
&lt;p&gt;Funcionaba bien para conceptos generales. Pero en cuanto un agente preguntaba por nombres de contenedores internos (&lt;code&gt;CT110&lt;/code&gt;, &lt;code&gt;CT204&lt;/code&gt;), leyes de gobernanza (&lt;code&gt;Ley Universal 0&lt;/code&gt;), o flujos específicos de despliegue (&lt;code&gt;coolify-ops&lt;/code&gt;, &lt;code&gt;infisical-manager&lt;/code&gt;), el buscador devolvía fragmentos irrelevantes o documentación genérica.&lt;/p&gt;
&lt;p&gt;Decidí entrenar un modelo a medida para todo mi portfolio.&lt;/p&gt;
&lt;p&gt;El resultado: &lt;strong&gt;+20.85% de precisión (MRR@10)&lt;/strong&gt; y un &lt;strong&gt;91.2% de Recall en el top 10&lt;/strong&gt;. Pero el camino para ponerlo en producción me enseñó lecciones duras sobre la diferencia entre tener RAM libre y saturar una controladora de almacenamiento.&lt;/p&gt;</description></item><item><title>Me equivoqué sobre GLM-5.2 y sus effort levels</title><link>https://pabloib.com/posts/2026-06-16-glm-52-effort-levels-api-miente/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-06-16-glm-52-effort-levels-api-miente/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Retractación (2026-06-20).&lt;/strong&gt; La primera versión de este post se titulaba &lt;em&gt;&amp;ldquo;GLM-5.2 y el mito de los effort levels: cuando la API miente&amp;rdquo;&lt;/em&gt; y defendía que &lt;code&gt;reasoning_effort&lt;/code&gt; no existía en la API de Z.AI. &lt;strong&gt;Era falso.&lt;/strong&gt; Lo dejo abajo reescrito como lo que realmente pasó: me equivoqué, y la forma en que me equivoqué es más instructiva que mi conclusión original.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Hace unos días configuré GLM-5.2 en mi agente de coding. La prensa decía que tenía dos niveles de razonamiento — &lt;em&gt;High&lt;/em&gt; y &lt;em&gt;Max&lt;/em&gt; — y Z.ai recomendaba &lt;em&gt;Max&lt;/em&gt; para programar. Quería confirmar que el parámetro funcionaba antes de cablearlo.&lt;/p&gt;</description></item><item><title>token-optimizer en profundidad: Analytics y el detective de ghost tokens</title><link>https://pabloib.com/posts/2026-06-08-token-optimizer-en-profundidad/</link><pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-06-08-token-optimizer-en-profundidad/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Zero Trust Notice&lt;/strong&gt;: Este artículo sigue la metodología de investigación zero-trust. Los datos marcados como &amp;ldquo;VERIFICADO&amp;rdquo; tienen evidencia fresca. Los datos marcados como &amp;ldquo;NO VERIFICADO&amp;rdquo; solo aparecen en el artículo introductorio y NO se encontraron en fuentes primarias.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;token-optimizer es el detector de waste de tokens creado por Alex Greenshpun. Con &lt;strong&gt;1,218 estrellas&lt;/strong&gt; y plugins nativos para 4 plataformas, promete analytics de consumo por sesión, detección de ghost tokens y un dashboard en vivo.&lt;/p&gt;</description></item><item><title>mcp-compressor en profundidad: Atlassian Labs y el enigma del 70-97% sin benchmarks</title><link>https://pabloib.com/posts/2026-06-07-mcp-compressor-en-profundidad/</link><pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-06-07-mcp-compressor-en-profundidad/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Zero Trust Notice&lt;/strong&gt;: Este artículo sigue la metodología de investigación zero-trust. Los datos marcados como &amp;ldquo;VERIFICADO&amp;rdquo; tienen evidencia fresca. Los datos marcados como &amp;ldquo;NO VERIFICADO&amp;rdquo; solo aparecen en el artículo introductorio y NO se encontraron en fuentes primarias.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;mcp-compressor es el proyecto de Atlassian Labs para comprimir tool definitions de MCP servers. Con &lt;strong&gt;66 estrellas&lt;/strong&gt; y backing oficial de Atlassian, promete reducir el consumo de tokens por herramientas.&lt;/p&gt;
&lt;p&gt;Pero hay un problema: &lt;strong&gt;los números 70-97% NO están respaldados por benchmarks verificables&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Context-mode en profundidad: 98% de ahorro de contexto con Sandbox + SQLite + FTS5</title><link>https://pabloib.com/posts/2026-06-05-context-mode-en-profundidad/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-06-05-context-mode-en-profundidad/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Context Mode is an MCP server that sits between Claude Code and these outputs. 315 KB becomes 5.4 KB. 98% reduction.&amp;rdquo; — Mert Köseoğlu, Creador&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En 2026, context-mode es el framework de optimización de contexto más popular para agentes de IA: &lt;strong&gt;16,361 estrellas&lt;/strong&gt; en GitHub, &lt;strong&gt;1,180 forks&lt;/strong&gt;, soportado en &lt;strong&gt;15 plataformas&lt;/strong&gt; y desarrollado por &lt;strong&gt;Mert Köseoğlu&lt;/strong&gt; (mksglu), quien también mantiene el MCP Directory con 100K+ peticiones diarias.&lt;/p&gt;
&lt;p&gt;Pero ¿qué hace que context-mode funcione tan bien? No es magia — son &lt;strong&gt;4 soluciones integradas&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>Impacto del Offloading en la Inferencia Local: Análisis de Flash Attention y KV Cache</title><link>https://pabloib.com/posts/2026-06-05-flash-attention-y-kv-cache-no-son-magia/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-06-05-flash-attention-y-kv-cache-no-son-magia/</guid><description>&lt;p&gt;Ejecutar modelos de lenguaje de gran escala (LLMs) en hardware doméstico presenta retos arquitectónicos interesantes. Cuando intentamos correr un modelo de 30 mil millones de parámetros (30B) en una &lt;strong&gt;NVIDIA RTX 5080 de 16GB&lt;/strong&gt;, nos topamos de frente con un límite físico: el modelo excede la capacidad de la VRAM. Esto obliga al motor de inferencia a realizar &lt;em&gt;offloading&lt;/em&gt;, delegando el procesamiento de las capas excedentes a la CPU y la memoria RAM del sistema.&lt;/p&gt;</description></item><item><title>Ollama vs. llama.cpp: La Batalla por la VRAM en una RTX 5080</title><link>https://pabloib.com/posts/2026-06-05-ollama-vs-llama-cpp/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-06-05-ollama-vs-llama-cpp/</guid><description>&lt;p&gt;La soberanía computacional empieza por no depender de una API externa para pensar. Pero una vez que tienes el hardware (en mi caso, una flamante &lt;strong&gt;RTX 5080 de 16GB&lt;/strong&gt;), surge la duda eterna: ¿Ollama o llama.cpp puro?&lt;/p&gt;
&lt;p&gt;Hoy he realizado un &amp;ldquo;Versus&amp;rdquo; técnico para entender dónde están los límites de cada uno y por qué el &lt;strong&gt;offloading&lt;/strong&gt; es el factor decisivo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-hardware-de-pruebas"&gt;El Hardware de Pruebas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPU:&lt;/strong&gt; NVIDIA GeForce RTX 5080 (16GB VRAM)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU:&lt;/strong&gt; Intel Core Ultra 9 275HX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OS:&lt;/strong&gt; CachyOS (Arch-based)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kernel:&lt;/strong&gt; 7.0.11-1-cachyos&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="el-experimento"&gt;El Experimento&lt;/h2&gt;
&lt;p&gt;He comparado dos escenarios comunes usando el modelo &lt;strong&gt;Qwen3 (14B y 30B)&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>MCP Token Optimization: El juego no es quién tiene el vector más grande</title><link>https://pabloib.com/posts/2026-06-04-mcp-token-optimization/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-06-04-mcp-token-optimization/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Memory is no longer just a feature; it is core AI infrastructure.&amp;rdquo; — PowerDrill AI, 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En 2026 el problema del token optimization en MCP es brutal. Si conectas 10 servidores MCP a Claude Code, quemarás &lt;strong&gt;100K tokens&lt;/strong&gt; de contexto antes de escribir una línea de código. Un tercio del contexto de Sonnet 4.5, desaparecido.&lt;/p&gt;
&lt;p&gt;La comunidad reaccionó con tres estrategias:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Comprimir tool descriptions&lt;/strong&gt; → mcp-compressor (Atlassian Labs, 66 estrellas)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detectar y eliminar ghost tokens&lt;/strong&gt; → token-optimizer (1,216 estrellas)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sandboxear output + session continuity&lt;/strong&gt; → context-mode (16,361 estrellas 🔥)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La primera vez que leí estos nombres pensé: &lt;em&gt;&amp;ldquo;Es lo mismo con tres nombres&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Memoria para Agentes IA: Por qué OpenViking es un Context OS, no solo otra base vectorial</title><link>https://pabloib.com/posts/2026-06-01-memoria-para-agentes-ia-openviking-context-os/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-06-01-memoria-para-agentes-ia-openviking-context-os/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Memory is no longer just a feature; it is core AI infrastructure.&amp;rdquo; — PowerDrill AI, 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cuando un agente IA te olvida todo al cerrar la pestaña, la solución obvia parece una base vectorial: guardas embeddings y buscas por similitud semántica. Simple. Funcional. Pero insuficiente.&lt;/p&gt;
&lt;p&gt;En 2026, la categoría de &amp;ldquo;memoria para agentes&amp;rdquo; ha explotado en 6 campamentos arquitectónicos completamente distintos. Cada uno optimiza un failure mode diferente: olvido, retrieval drift, pérdida de estado, incoherencia de perfil, o colaboración entre agentes.&lt;/p&gt;</description></item><item><title>El fin de los 'Permission Denied': Gestión profesional de discos en Linux y Proxmox</title><link>https://pabloib.com/posts/2026-05-30-gestion-permisos-proxmox-lxc/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-30-gestion-permisos-proxmox-lxc/</guid><description>&lt;p&gt;Si alguna vez has intentado montar un disco USB en un servidor Linux (ya sea una Raspberry Pi, un Mini PC o un servidor Proxmox) para compartirlo con varios servicios como qBittorrent, Plex o Audiobookshelf, te habrás encontrado con el &amp;ldquo;muro de los permisos&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Descargas una película, pero no puedes borrarla desde tu explorador de archivos. El servidor de audiolibros no puede ver los archivos nuevos. Intentas arreglarlo con un &lt;code&gt;chmod 777&lt;/code&gt; (¡error!) y al día siguiente el problema vuelve.&lt;/p&gt;</description></item><item><title>Screenshots en Linux 2026: La transición X11 → Wayland</title><link>https://pabloib.com/posts/2026-05-18-screenshots-linux-wayland/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-18-screenshots-linux-wayland/</guid><description>&lt;h1 id="screenshots-en-linux-2026-la-transición-x11--wayland"&gt;Screenshots en Linux 2026: La transición X11 → Wayland&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Un análisis exhaustivo basado en encuestas de usuarios, issues de GitHub, foros de soporte y documentación oficial.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="-tabla-de-contenidos"&gt;&lt;span aria-hidden="true"&gt;📋 &lt;/span&gt;Tabla de Contenidos&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#introducci%C3%B3n-el-cambio-de-paradigma"&gt;Introducción: El cambio de paradigma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#la-realidad-seg%C3%BAn-los-datos"&gt;La realidad según los datos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#herramientas-para-wayland"&gt;Herramientas para Wayland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#herramientas-para-x11-en-decadencia"&gt;Herramientas para X11 (en decadencia)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#recomendaciones-por-entorno"&gt;Recomendaciones por entorno&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#problemas-documentados"&gt;Problemas documentados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#novedades-2026-actualizaci%C3%B3n-importante"&gt;Novedades 2026: Actualización importante&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusi%C3%B3n"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fuentes-y-evidencia"&gt;Fuentes y evidencia&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="introducción-el-cambio-de-paradigma"&gt;Introducción: El cambio de paradigma&lt;/h2&gt;
&lt;p&gt;El ecosistema de screenshots en Linux está en plena transición. Durante años, &lt;strong&gt;X11&lt;/strong&gt; ofreció herramientas maduras y estables. Pero con la adopción masiva de &lt;strong&gt;Wayland&lt;/strong&gt;, las herramientas antiguas están fallando y nuevas soluciones están emergiendo.&lt;/p&gt;</description></item><item><title>OpenClaw: cómo montar un asistente de IA self-hosted al que le hablas por Telegram</title><link>https://pabloib.com/posts/2026-05-17-openclaw-asistente-ia-self-hosted/</link><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-17-openclaw-asistente-ia-self-hosted/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; OpenClaw es un gateway self-hosted que conecta Telegram, Discord, WhatsApp y más a modelos de IA. Lo instalé en un container Podman, configuré acceso móvil por Tailscale, y en una tarde tenía un asistente respondiéndome por Telegram. Te cuento cómo, qué falló, y cómo lo arreglé.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="qué-es-openclaw"&gt;¿Qué es OpenClaw?&lt;/h2&gt;
&lt;p&gt;OpenClaw es un gateway de IA self-hosted. Lo instalas en tu máquina, lo conectas a tus canales de mensajería (Telegram, Discord, WhatsApp, Signal, Slack&amp;hellip;), y configuras qué modelo de IA usa. El gateway se queda corriendo 24/7, y tú le hablas desde donde quieras.&lt;/p&gt;</description></item><item><title>OpenClaw: cómo optimizar el contexto, la memoria y la seguridad (lo que dice Reddit y lo que funciona de verdad)</title><link>https://pabloib.com/posts/2026-05-17-openclaw-optimizacion-contexto-memoria-seguridad/</link><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-17-openclaw-optimizacion-contexto-memoria-seguridad/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Reduje el contexto inyectado de OpenClaw de 10.4 KB a 3.8 KB, activé memory-lancedb con embeddings locales, configuré context pruning, y limpié el security audit a 0 critical. La fuente: una guía de 33 capítulos en GitHub, 50+ hilos en Reddit, y mucho trial-and-error. Aquí va lo que funcionó.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="la-premisa-el-harness-importa-más-que-el-modelo"&gt;La premisa: el harness importa más que el modelo&lt;/h2&gt;
&lt;p&gt;La &lt;a href="https://github.com/OnlyTerp/openclaw-optimization-guide"&gt;guía de optimización de OnlyTerp&lt;/a&gt; (33 capítulos, 15K palabras, actualizada a mayo 2026) tiene una tesis clara:&lt;/p&gt;</description></item><item><title>OpenClaw: instalación oficial (Quadlet) vs distrobox — lo que la documentación no te cuenta</title><link>https://pabloib.com/posts/2026-05-17-openclaw-instalacion-oficial-vs-distrobox/</link><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-17-openclaw-instalacion-oficial-vs-distrobox/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; OpenClaw recomienda instalar con su script oficial (&lt;code&gt;run-openclaw-podman.sh&lt;/code&gt;) que usa Quadlet + &lt;code&gt;--userns=keep-id&lt;/code&gt;. Yo lo instalé en un container distrobox ya existente. Los dos funcionan, pero tienen trade-offs muy distintos en seguridad, permisos, y mantenimiento. Aquí va la comparativa real, no la de marketing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="las-dos-rutas"&gt;Las dos rutas&lt;/h2&gt;
&lt;h3 id="ruta-a-instalación-oficial-quadlet"&gt;Ruta A: Instalación oficial (Quadlet)&lt;/h3&gt;
&lt;p&gt;OpenClaw incluye scripts para Podman en su paquete npm. El proceso:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. Build de la imagen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./scripts/podman/setup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. Con Quadlet (systemd nativo)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./scripts/podman/setup.sh --quadlet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. Lanzar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./scripts/run-openclaw-podman.sh launch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esto crea:&lt;/p&gt;</description></item><item><title>OpenClaw: los mejores plugins y skills que sobreviven al filtro de seguridad (y los que no)</title><link>https://pabloib.com/posts/2026-05-17-openclaw-plugins-skills-guia/</link><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-17-openclaw-plugins-skills-guia/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; ClawHub tiene 13.000+ skills. Las cifras de maliciosos varían: 373 (awesome list), 820+ (AI Makers), 1,184+ (CyberDesserts), 341 (Koi Security). El skill #1 más descargado (&amp;ldquo;capability-evolver&amp;rdquo;) fue descubierto exfiltrando datos a Feishu/ByteDance con un token hardcoded. Y en marzo 2026 detectaron &lt;strong&gt;instaladores falsos&lt;/strong&gt; que imitaban el setup oficial. Investigué qué plugins y skills recomienda la comunidad real (no los posts de marketing), cruzando Reddit, Tavily, GitHub y foros de seguridad. Aquí va mi lista filtrada, más las reglas de seguridad que deberías seguir antes de instalar nada.&lt;/p&gt;</description></item><item><title>Design System Vivo</title><link>https://pabloib.com/internal/design-system/</link><pubDate>Sat, 16 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/design-system/</guid><description>&lt;h2 id="filosofía-the-architectural-editor"&gt;Filosofía: The Architectural Editor&lt;/h2&gt;
&lt;p&gt;Este design system es un framework editorial high-end para el IT profesional. Se aleja del &amp;ldquo;dashboard cluttered&amp;rdquo; y adopta un enfoque de &lt;strong&gt;Digital Gallery&lt;/strong&gt;: tratar el contenido técnico con la misma reverencia que una revista de lifestyle.&lt;/p&gt;
&lt;h3 id="principios"&gt;Principios&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;La tipografía es la UI&lt;/strong&gt; — No hay decorators, badges pesados ni bordes gruesos. La jerarquía visual se logra exclusivamente con peso, tamaño y spacing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Superficies con profundidad&lt;/strong&gt; — Cada &amp;ldquo;capa&amp;rdquo; de contenido se sienta sobre una &amp;ldquo;surface&amp;rdquo; (un shade de fondo sutil), creando profundidad sin sombras. Papel superpuesto, no tarjetas flotantes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El grid es sagrado&lt;/strong&gt; — Un baseline grid estricto alinea todo texto a ritmo de 8px. Sin elementos huérfanos, sin drift visual.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Color como señal, no decoración&lt;/strong&gt; — El color primary (&lt;code&gt;#00647c&lt;/code&gt; teal) se usa EXCLUSIVAMENTE para elementos interactivos, estados activos y acentos clave. Color aparece con propósito.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El breathing room es una feature&lt;/strong&gt; — Márgenes generosos, padding y gutters son el whitespace que hace el contenido premium. Nunca amontonar elementos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motion sirve al contenido&lt;/strong&gt; — Animación revela, no decora. Hover suave, fade transitions, sin bounce ni parallax.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tokens"&gt;Tokens&lt;/h2&gt;
&lt;h3 id="colores--primary--surface"&gt;Colores — Primary &amp;amp; Surface&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Token&lt;/th&gt;
 &lt;th&gt;Light&lt;/th&gt;
 &lt;th&gt;Dark&lt;/th&gt;
 &lt;th&gt;Uso&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;primary&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#00647c&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#00647c&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Botones, links activos, acentos&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;primary/10&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#00647c&lt;/code&gt; 10%&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#00647c&lt;/code&gt; 15%&lt;/td&gt;
 &lt;td&gt;Badge backgrounds&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;on-primary&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#ffffff&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#ffffff&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Texto sobre primary&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;surface&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#faf8ff&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Fondo principal&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;surface-container-low&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#f2f3ff&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;slate-900/50&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Card backgrounds&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;surface-container-highest&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#dae2fd&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;slate-800&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Tags, code pills&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;on-surface&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#131b2e&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#f1f5f9&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Headlines, body text&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;on-surface-variant&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#3e484d&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#94a3b8&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Descriptions, metadata&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;outline&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#6e797e&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Separadores, labels&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;outline-variant&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#bdc8ce&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Bordes sutiles&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="colores--usecase-badges"&gt;Colores — Usecase Badges&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Usecase&lt;/th&gt;
 &lt;th&gt;Clase Tailwind&lt;/th&gt;
 &lt;th&gt;Color&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;debugging&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-red-500/10 text-red-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🔴 Rojo&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;writing&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-blue-500/10 text-blue-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🔵 Azul&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;review&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-amber-500/10 text-amber-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🟡 Ámbar&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;validation&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-rose-500/10 text-rose-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🌹 Rosa&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ideation&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-violet-500/10 text-violet-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🟣 Violeta&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;redirect&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-orange-500/10 text-orange-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🟠 Naranja&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;content-structure&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-emerald-500/10 text-emerald-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🟢 Esmeralda&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;creative-thinking&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-fuchsia-500/10 text-fuchsia-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🩷 Fucsia&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tone-correction&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-cyan-500/10 text-cyan-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🩵 Cian&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;role-assignment&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-indigo-500/10 text-indigo-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🔷 Índigo&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;identity&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-teal-500/10 text-teal-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🫐 Teal&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;reasoning-activation&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bg-pink-500/10 text-pink-400&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🩷 Rosa claro&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="tipografía"&gt;Tipografía&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Token&lt;/th&gt;
 &lt;th&gt;Font&lt;/th&gt;
 &lt;th&gt;Peso&lt;/th&gt;
 &lt;th&gt;Uso&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;font-headline&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Plus Jakarta Sans&lt;/td&gt;
 &lt;td&gt;extrabold (800)&lt;/td&gt;
 &lt;td&gt;h1, h2, card titles&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;font-body&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Inter&lt;/td&gt;
 &lt;td&gt;regular (400)&lt;/td&gt;
 &lt;td&gt;Párrafos, descripciones&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;font-label&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Space Grotesk&lt;/td&gt;
 &lt;td&gt;bold (700)&lt;/td&gt;
 &lt;td&gt;Tags, badges, metadata, CTAs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;font-mono&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;System mono&lt;/td&gt;
 &lt;td&gt;regular&lt;/td&gt;
 &lt;td&gt;Code blocks, variables&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="spacing-8px-grid"&gt;Spacing (8px grid)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Token&lt;/th&gt;
 &lt;th&gt;Valor&lt;/th&gt;
 &lt;th&gt;Uso&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Section gap&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;mb-8&lt;/code&gt; (32px)&lt;/td&gt;
 &lt;td&gt;Entre secciones&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Card padding&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;p-5&lt;/code&gt; (20px)&lt;/td&gt;
 &lt;td&gt;Interior de cards&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Card gap&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gap-4&lt;/code&gt; (16px)&lt;/td&gt;
 &lt;td&gt;Entre cards en grid&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tag gap&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gap-1.5&lt;/code&gt; (6px)&lt;/td&gt;
 &lt;td&gt;Entre badges&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Footer padding&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;px-5 py-3&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Card footer&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="border-radius"&gt;Border Radius&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Token&lt;/th&gt;
 &lt;th&gt;Valor&lt;/th&gt;
 &lt;th&gt;Uso&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rounded-xl&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;8px&lt;/td&gt;
 &lt;td&gt;Cards, code blocks&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rounded-lg&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;4px&lt;/td&gt;
 &lt;td&gt;Botones, badges&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rounded-md&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;3px&lt;/td&gt;
 &lt;td&gt;Tags pequeños&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rounded-full&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;999px&lt;/td&gt;
 &lt;td&gt;Pills&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="componentes"&gt;Componentes&lt;/h2&gt;
&lt;h3 id="prompt-card-template"&gt;Prompt Card (Template)&lt;/h3&gt;
&lt;p&gt;Cards con campo &lt;code&gt;prompt&lt;/code&gt; en frontmatter. Muestran code preview con copy button.&lt;/p&gt;</description></item><item><title>ComfyUI para principiantes: tu primera imagen con SDXL paso a paso</title><link>https://pabloib.com/posts/2026-05-15-comfyui-primer-workflow-sdxl/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-15-comfyui-primer-workflow-sdxl/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; La interfaz de nodos de ComfyUI abruma al principio. Pero el workflow por defecto es más simple de lo que parece: cargas un modelo → escribes un prompt → generas. Te explico cada nodo y cada conexión para que no te pierdas.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="la-interfaz-de-comfyui-explicada"&gt;La interfaz de ComfyUI explicada&lt;/h2&gt;
&lt;p&gt;Cuando abres &lt;code&gt;http://127.0.0.1:8188&lt;/code&gt; por primera vez, ves un montón de cajas conectadas con flechas. Cada caja es un &lt;strong&gt;nodo&lt;/strong&gt; (un paso del proceso), y cada flecha es un &lt;strong&gt;cable&lt;/strong&gt; (datos que pasan de un paso al siguiente).&lt;/p&gt;</description></item><item><title>ComfyUI-Manager y custom nodes: amplía ComfyUI con ControlNet, upscalers y Flux</title><link>https://pabloib.com/posts/2026-05-15-comfyui-manager-custom-nodes/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-15-comfyui-manager-custom-nodes/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; ComfyUI tiene 3450+ extensiones vía ComfyUI-Manager. Te explico cómo instalarlo y los 5 custom nodes que merece la pena tener: ControlNet, upscalers, soporte Flux, workflow templates, y el inspector de nodos.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="qué-es-comfyui-manager"&gt;Qué es ComfyUI-Manager&lt;/h2&gt;
&lt;p&gt;Es el gestor de paquetes de ComfyUI. Desde la interfaz web puedes instalar, actualizar y desinstalar extensiones sin tocar la terminal. Es como el &lt;code&gt;pip&lt;/code&gt; pero con UI.&lt;/p&gt;
&lt;p&gt;Más de 3450 extensiones disponibles, categorizadas y con búsqueda.&lt;/p&gt;</description></item><item><title>Corte limpio — Olvídate de X</title><link>https://pabloib.com/prompts/2026-05-15-corte-limpio/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-05-15-corte-limpio/</guid><description>&lt;h1 id="-la-poda"&gt;&lt;span aria-hidden="true"&gt;🪓 &lt;/span&gt;La poda&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;El jardinero no riega la maleza. La corta.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;El asistente está profundizando en un tema que ya no es relevante. Quizás fue útil explorarlo, pero ahora distrae del objetivo.&lt;/p&gt;
&lt;h2 id="el-patrón"&gt;El patrón&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Olvidate de &amp;lt;rabbit hole&amp;gt;. &amp;lt;Redirigir al foco real&amp;gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ejemplos-de-la-sesión"&gt;Ejemplos de la sesión&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;olvidate del offload&amp;quot;&lt;/code&gt; → Cortó 15 minutos de discusión CUDA&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;olvidate estamos con ollama 13 hay otros motores&amp;quot;&lt;/code&gt; → Redirigió de CUDA 12.8 a comparar engines reales&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;no olvidate estamos con ollama&amp;quot;&lt;/code&gt; → Cortó optimización prematura&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="por-qué-funciona"&gt;Por qué funciona&lt;/h2&gt;
&lt;p&gt;El contexto del asistente es limitado. Cada línea sobre X es una línea que no está sobre Y. Cortar no es perder información — es &lt;strong&gt;proteger el foco&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Dividir y conquistar — No queremos indigestar</title><link>https://pabloib.com/prompts/2026-05-15-la-cana-dividir-conquistar/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-05-15-la-cana-dividir-conquistar/</guid><description>&lt;h1 id="-la-caña"&gt;&lt;span aria-hidden="true"&gt;🎋 &lt;/span&gt;La caña&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;La caña se dobla pero no se rompe. Cada post resiste solo, pero juntos son un bosque.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;El asistente produce un entregable largo (post, plan, documento) que intenta cubrir todo. Funcional pero indigesto.&lt;/p&gt;
&lt;h2 id="el-patrón"&gt;El patrón&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Esto es mucho. No queremos indigestar. Divídelo.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cada pieza = un concepto = autónoma.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Juntas = serie coherente.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ejemplos-de-la-sesión"&gt;Ejemplos de la sesión&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;no queremos indigestar&amp;quot;&lt;/code&gt; → Post de 311 líneas → 3 posts de 112-144 líneas&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;tu eres el editor pero yo hare de critico&amp;quot;&lt;/code&gt; → Describir posts antes de escribirlos, permitir feedback&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="el-principio"&gt;El principio&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Un concepto = un post.&lt;/strong&gt; Si necesitas explicar 3 cosas, son 3 posts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cada post es autónomo.&lt;/strong&gt; Se lee sin los otros.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Juntos forman una serie.&lt;/strong&gt; Links entre ellos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El lector elige su profundidad.&lt;/strong&gt; Lee 1 o lee 5.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="por-qué-funciona"&gt;Por qué funciona&lt;/h2&gt;
&lt;p&gt;El contexto del lector también es limitado. Un post de 300 líneas exige 15 minutos de atención. Tres posts de 120 exigen 5 minutos cada uno. El lector puede parar, volver, compartir uno solo. &lt;strong&gt;La modularidad es respeto por el tiempo del lector.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Editor y crítico — Asignar roles antes de crear</title><link>https://pabloib.com/prompts/2026-05-15-editor-y-critico/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-05-15-editor-y-critico/</guid><description>&lt;h1 id="-el-casting"&gt;&lt;span aria-hidden="true"&gt;🎭 &lt;/span&gt;El casting&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;El director no actúa. El crítico no dirige. Cada rol tiene su momento.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;Antes de que el asistente empiece a producir (escribir posts, código, planes). Definir quién hace qué.&lt;/p&gt;
&lt;h2 id="el-patrón"&gt;El patrón&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Asignar rol al asistente&amp;gt;: tú eres &amp;lt;rol&amp;gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Asignar rol al usuario&amp;gt;: yo soy &amp;lt;rol&amp;gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Definir la entrega&amp;gt;: primero &amp;lt;describir&amp;gt;, luego &amp;lt;producir&amp;gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ejemplos-de-la-sesión"&gt;Ejemplos de la sesión&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;tu eres el editor pero yo hare de critico&amp;quot;&lt;/code&gt; → El asistente describe 5 posts sin escribirlos. El usuario decide cuáles van.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;eres un bloger de IT... revisa nuestro about enseñar para aprender&amp;quot;&lt;/code&gt; → Contexto + identidad + propósito antes de crear.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="por-qué-funciona"&gt;Por qué funciona&lt;/h2&gt;
&lt;p&gt;Sin roles, el asistente produce y evalúa a la vez. &amp;ldquo;Aquí está el post y está bueno&amp;rdquo;. Con roles, la producción y la evaluación son fases separadas. El asistente describe, el usuario juzga. &lt;strong&gt;La separación elimina el sesgo de justificación.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>El precipicio VRAM: por qué tu modelo va a 7 tok/s en vez de 140</title><link>https://pabloib.com/posts/2026-05-15-vram-precipicio-140-vs-7-tok-s/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-15-vram-precipicio-140-vs-7-tok-s/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Si el modelo cabe en tu VRAM, va a 140 tok/s. Si no cabe, 7 tok/s. No hay punto medio. Y si le añades contexto largo, puede bajar a 0.9 tok/s. Lo medí todo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-dato"&gt;El dato&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Velocidad&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tok&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;140&lt;/span&gt; &lt;span class="err"&gt;┤&lt;/span&gt; &lt;span class="err"&gt;■&lt;/span&gt; &lt;span class="n"&gt;gemma4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e4b&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cabe&lt;/span&gt; &lt;span class="n"&gt;entero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="err"&gt;┤&lt;/span&gt; &lt;span class="err"&gt;■&lt;/span&gt; &lt;span class="n"&gt;qwen3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;14.8&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cabe&lt;/span&gt; &lt;span class="n"&gt;entero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="err"&gt;┤&lt;/span&gt; &lt;span class="err"&gt;■&lt;/span&gt; &lt;span class="n"&gt;qwen3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;coder&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;30.5&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="err"&gt;┤&lt;/span&gt; &lt;span class="err"&gt;■&lt;/span&gt; &lt;span class="n"&gt;gemma4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="err"&gt;┤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──────────────────────────────────────────&lt;/span&gt; &lt;span class="n"&gt;VRAM&lt;/span&gt; &lt;span class="n"&gt;usada&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;GB&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="n"&gt;GB&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="n"&gt;GB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;20x de diferencia.&lt;/strong&gt; No es una rampa. Es un precipicio.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="por-qué-pasa-esto"&gt;¿Por qué pasa esto?&lt;/h2&gt;
&lt;p&gt;Tu GPU tiene VRAM (GDDR7, ultra rápida). Tu sistema tiene RAM (DDR5, ~20x más lenta).&lt;/p&gt;</description></item><item><title>El refrán como prompt — Sabiduría comprimida como herramienta de razonamiento</title><link>https://pabloib.com/prompts/2026-05-15-refran-como-prompt/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-05-15-refran-como-prompt/</guid><description>&lt;h1 id="-el-código-fuente"&gt;&lt;span aria-hidden="true"&gt;🧬 &lt;/span&gt;El código fuente&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Un refrán es 1000 años de debugging en una línea.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="la-tesis"&gt;La tesis&lt;/h2&gt;
&lt;p&gt;Los refranes, proverbios, paradojas y conceptos densos son &lt;strong&gt;prompts naturales&lt;/strong&gt;. Evolucionaron durante milenios (refranes) o siglos (filosofía) o décadas (ingeniería) para comprimir un patrón de razonamiento en unas pocas palabras.&lt;/p&gt;
&lt;p&gt;Cuando dices &amp;ldquo;zero trust&amp;rdquo; a un ingeniero de seguridad, no describe una policy. Activa todo un framework de pensamiento: &amp;ldquo;no asumas, verifica siempre, el perímetro no existe, cada interacción requiere autenticación&amp;rdquo;. Una frase activa un modo cognitivo completo.&lt;/p&gt;</description></item><item><title>Enseñar para aprender — Tu segunda memoria</title><link>https://pabloib.com/prompts/2026-05-15-ensenar-para-aprender/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-05-15-ensenar-para-aprender/</guid><description>&lt;h1 id="-el-cuaderno"&gt;&lt;span aria-hidden="true"&gt;📓 &lt;/span&gt;El cuaderno&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;El que enseña aprende dos veces.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;Al inicio de un proyecto creativo (serie de posts, documentación, tutorial). Define &lt;strong&gt;quién eres, para quién escribes, y por qué&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="el-patrón"&gt;El patrón&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Definir identidad&amp;gt;: eres un &amp;lt;rol&amp;gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Definir propósito&amp;gt;: vamos a enseñar lo que hemos hecho.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Definir fuente&amp;gt;: revisa &amp;lt;material existente&amp;gt; para calibrar tono.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ejemplos-de-la-sesión"&gt;Ejemplos de la sesión&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;eres un bloger de IT, revisa nuestro about enseñar para aprender, vamos a enseñar a humanos lo que hemos hecho&amp;quot;&lt;/code&gt; → Cambió el tono de &amp;ldquo;guía técnica&amp;rdquo; a &amp;ldquo;crónica de aprendizaje&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;revisa nuestros post existentes para calzar perfecto&amp;quot;&lt;/code&gt; → Alineó con el formato y estilo del blog&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="por-qué-funciona"&gt;Por qué funciona&lt;/h2&gt;
&lt;p&gt;El asistente tiende a escribir como &lt;strong&gt;autoridad&lt;/strong&gt; — &amp;ldquo;aquí está la guía definitiva&amp;rdquo;. Pero los mejores posts de blog nacen de &lt;strong&gt;la experiencia, no de la autoridad&lt;/strong&gt;. &amp;ldquo;Enseñar para aprender&amp;rdquo; cambia el frame: el escritor es el primero en aprender, el lector acompaña.&lt;/p&gt;</description></item><item><title>Incubación creativa — El baño caliente</title><link>https://pabloib.com/prompts/2026-05-15-incubacion-creativa/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-05-15-incubacion-creativa/</guid><description>&lt;h1 id="-el-baño-caliente"&gt;&lt;span aria-hidden="true"&gt;🛁 &lt;/span&gt;El baño caliente&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;El agua caliente no resuelve problemas. Los disuelve.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;Después de una sesión intensa de trabajo técnico. Los datos están, el plan está, pero falta la perspectiva. El &amp;ldquo;por qué&amp;rdquo; detrás del &amp;ldquo;qué&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="el-patrón"&gt;El patrón&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Reconocer el trabajo hecho&amp;gt;. 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ahora descansa. 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Imagina que estás en &amp;lt;lugar relajante&amp;gt;. 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sin querer te surgen ideas. 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Reflexionas. Eres creativo pero crítico.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Herramientas: &lt;code&gt;think mode=&amp;quot;be_creative&amp;quot;&lt;/code&gt; con contexto personal.&lt;/p&gt;
&lt;h2 id="ejemplos-de-la-sesión"&gt;Ejemplos de la sesión&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;descansa, imagina que estas en un baño caliente... surgen ideas, reflexionas&amp;quot;&lt;/code&gt; → Cambió el plan de tests de &amp;ldquo;medio&amp;rdquo; a &amp;ldquo;combustible&amp;rdquo;. Reveló que Post 1 no necesitaba tests nuevos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;me gusta esa filosofia... siendo flexible como un junco una caña&amp;quot;&lt;/code&gt; → Capturó la esencia y la convirtió en principio rector.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="por-qué-funciona"&gt;Por qué funciona&lt;/h2&gt;
&lt;p&gt;El modo &amp;ldquo;productivo&amp;rdquo; del asistente genera planes, tablas, código. El modo &amp;ldquo;reflexivo&amp;rdquo; genera &lt;strong&gt;perspectiva&lt;/strong&gt;. La diferencia: el plan dice &amp;ldquo;cómo&amp;rdquo;. La perspectiva dice &amp;ldquo;por qué&amp;rdquo; y &amp;ldquo;para qué&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Instalar ComfyUI en una RTX 5080 con CachyOS: setup, lecciones y por qué Fooocus ya no sirve</title><link>https://pabloib.com/posts/2026-05-15-comfyui-rtx5080-setup-lecciones/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-15-comfyui-rtx5080-setup-lecciones/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Quise montar generación de imágenes local en mi RTX 5080. Fooocus estaba abandonado y me dio errores de dependencias. Investigué, diagnosticé el problema (Starlette 1.0 rompió la API de Gradio), y cambié a ComfyUI. Resultado: setup limpio con Python 3.12, PyTorch 2.12, CUDA 13, y SDXL base listo para generar.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-plan-original-fooocus--comfyui"&gt;El plan original: Fooocus &amp;#43; ComfyUI&lt;/h2&gt;
&lt;p&gt;La idea era simple: dos herramientas, un modelo SDXL compartido, outputs en carpetas separadas.&lt;/p&gt;</description></item><item><title>Inversión deliberada — Dale la vuelta</title><link>https://pabloib.com/prompts/2026-05-15-inversion-deliberada/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-05-15-inversion-deliberada/</guid><description>&lt;h1 id="-la-inversión"&gt;&lt;span aria-hidden="true"&gt;🔄 &lt;/span&gt;La inversión&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Si todos miran hacia el norte, mira al sur. No porque el norte esté mal, sino porque al sur no hay nadie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;El asistente propone una estructura, plan o enfoque que es correcto pero genérico. Funcional pero sin alma. La respuesta esperada.&lt;/p&gt;
&lt;h2 id="el-patrón"&gt;El patrón&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Directiva de pensamiento creativo&amp;gt;. Dale la vuelta.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Herramientas: &lt;code&gt;think mode=&amp;quot;be_creative&amp;quot;&lt;/code&gt;, &lt;code&gt;think mode=&amp;quot;red_team&amp;quot;&lt;/code&gt;, o simplemente &lt;code&gt;&amp;quot;dale la vuelta&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="ejemplos-de-la-sesión"&gt;Ejemplos de la sesión&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;/creative dale la vuelta&amp;quot;&lt;/code&gt; → De &amp;ldquo;cómo montar IA local&amp;rdquo; (tutorial) a &amp;ldquo;errores que me explotaron&amp;rdquo; (crónicas)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;esos titulos parecen hechos por un niño tonto&amp;quot;&lt;/code&gt; → De clickbait a técnico con respeto por la audiencia&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="por-qué-funciona"&gt;Por qué funciona&lt;/h2&gt;
&lt;p&gt;El primer impulso del asistente es el más común — probablemente el que cualquier otro asistente daría. Forzar la inversión no es rechazar lo obvio, es &lt;strong&gt;buscar lo que falta en el espacio de soluciones&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>InvokeAI: la alternativa a ComfyUI con interfaz simple para generación de imágenes</title><link>https://pabloib.com/posts/2026-05-15-invokeai-alternativa-simple/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-15-invokeai-alternativa-simple/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; ComfyUI es potente pero su interfaz de nodos no es para todo el mundo. InvokeAI (v6.12, activo) ofrece una experiencia similar a Midjourney: escribes un prompt, ajustas un par de sliders, y generas. Con canvas profesional para inpainting y outpainting. Aquí te cuento cuándo elegir cada uno.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-comfyui-abruma"&gt;El problema: ComfyUI abruma&lt;/h2&gt;
&lt;p&gt;Es real. La interfaz de nodos de ComfyUI es increíblemente potente, pero:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hay que entender qué hace cada nodo y cada conexión&lt;/li&gt;
&lt;li&gt;Un workflow básico tiene 5-6 nodos; uno avanzado puede tener 30+&lt;/li&gt;
&lt;li&gt;Si algo falla, tienes que rastrear el error por los cables&lt;/li&gt;
&lt;li&gt;No hay un botón simple de &amp;ldquo;generar imagen&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si tu uso es &amp;ldquo;quiero escribir un prompt y obtener una imagen bonita&amp;rdquo;, los nodos son overhead.&lt;/p&gt;</description></item><item><title>Know your audience — No somos niños tontos</title><link>https://pabloib.com/prompts/2026-05-15-know-your-audience/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-05-15-know-your-audience/</guid><description>&lt;h1 id="-la-diana"&gt;&lt;span aria-hidden="true"&gt;🎯 &lt;/span&gt;La diana&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Si apuntas a todos, no das a nadie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;El asistente produce contenido con el tono equivocado: demasiado simple, demasiado marketing, demasiado académico. Funcional pero fuera de target.&lt;/p&gt;
&lt;h2 id="el-patrón"&gt;El patrón&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Rechazar el tono actual con concreción&amp;gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Describir la audiencia real&amp;gt;: quiénes son, qué saben, qué han invertido.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Describir lo que quieren&amp;gt;: no entretenimiento, sino &amp;lt;necesidad real&amp;gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ejemplos-de-la-sesión"&gt;Ejemplos de la sesión&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;esos titulos parecen sacados de algo hecho por un niño tonto&amp;quot;&lt;/code&gt; → Rechazó clickbait&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;somos interesados en la informatica geeks gente que por lo menos se ha gastado la pasta en una 5070 y no sabe como usarla&amp;quot;&lt;/code&gt; → Definió audiencia: gente que ha gastado 400-1500€ en GPU y quiere ROI&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;y si pobre 5060&amp;quot;&lt;/code&gt; → Amplió la audiencia: no solo 5080/5090, también 5060 con 8GB&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="por-qué-funciona"&gt;Por qué funciona&lt;/h2&gt;
&lt;p&gt;El asistente tiende a escribir para &amp;ldquo;todo el mundo&amp;rdquo; — el denominador común más bajo. Pero el contenido excelente escribe para &lt;strong&gt;alguien específico&lt;/strong&gt;. La corrección de audiencia no es fastidio — es &lt;strong&gt;calibración del tono&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Mixture of Experts: cómo 30.000 millones de parámetros solo usan 3.000 millones por token</title><link>https://pabloib.com/posts/2026-05-15-moe-mixture-experts-30b-3b-explicado/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-15-moe-mixture-experts-30b-3b-explicado/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Un modelo MoE tiene muchos parámetros pero solo usa una fracción por token. Eso permite que modelos de 30B &amp;ldquo;piensen&amp;rdquo; como si fueran de 3B, pero con más conocimiento disponible. La trampa: todos los parámetros deben estar en memoria, aunque no se usen todos a la vez.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema"&gt;El problema&lt;/h2&gt;
&lt;p&gt;Un modelo tradicional (dense) procesa &lt;strong&gt;todos sus parámetros&lt;/strong&gt; para cada token que genera. Un modelo de 14B procesa 14B por token. Uno de 30B, 30B. Más parámetros = más calidad, pero también más memoria.&lt;/p&gt;</description></item><item><title>RTX 50xx e IA local: qué modelo instalar según tu GPU (con velocidades reales)</title><link>https://pabloib.com/posts/2026-05-15-rtx-50xx-ia-local-guia-modelos-vram/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-15-rtx-50xx-ia-local-guia-modelos-vram/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Tienes una RTX 50xx, quieres IA local, y no sabes qué modelo instalar. Aquí está la respuesta directa: tu GPU → tu modelo → tu comando.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="un-comando-para-empezar"&gt;Un comando para empezar&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Instalar Ollama (Arch / CachyOS)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S ollama-cuda
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now ollama
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Tu primer modelo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama pull gemma4:e4b
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama run gemma4:e4b &lt;span class="s2"&gt;&amp;#34;Hola, ¿me lees?&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si responde, ya tienes IA local. Sin Docker, sin Python, sin configuración.&lt;/p&gt;</description></item><item><title>Validación en cadena — Abogado del diablo</title><link>https://pabloib.com/prompts/2026-05-15-validacion-en-cadena/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-05-15-validacion-en-cadena/</guid><description>&lt;h1 id="-la-autopsia"&gt;&lt;span aria-hidden="true"&gt;🔬 &lt;/span&gt;La autopsia&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;No confíes en el plan. Confía en la verificación. La autopsia se hace antes de morir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;El asistente presenta un plan completo, una propuesta, o afirma algo con confianza. Antes de ejecutar, validar.&lt;/p&gt;
&lt;h2 id="el-patrón"&gt;El patrón&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;¿Estás seguro? &amp;lt;capa 1: verificación de hechos&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Revisa en internet &amp;lt;capa 2: benchmarking externo&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;¿Nos aporta algo? &amp;lt;capa 3: diferencial&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;¿Estamos alineados? &amp;lt;capa 4: coherencia&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mejoras &amp;lt;capa 5: optimización&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Audita, valida, justifica &amp;lt;capa 6: evidencia&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Abogado del diablo &amp;lt;capa 7: ataque desde el lado contrario&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;KISS &amp;lt;capa 8: simplicidad&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No hace falta usar todas las capas. Pero cada capa añade robustez.&lt;/p&gt;</description></item><item><title>Auditoría Frontend — pabloib.com</title><link>https://pabloib.com/internal/audits/frontend-audit-2026-05-12/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/audits/frontend-audit-2026-05-12/</guid><description>&lt;h1 id="auditoría-frontend--pabloibcom"&gt;Auditoría Frontend — pabloib.com&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-12
&lt;strong&gt;Alcance:&lt;/strong&gt; Layouts, CSS, patrones de diseño, mobile
&lt;strong&gt;Fuentes:&lt;/strong&gt; ui-ux-pro-max, web-design-guidelines, inspección de código
&lt;strong&gt;Estado:&lt;/strong&gt; Hallazgos — pendiente de triaje&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-crítico--overflow-horizontal-en-mobile"&gt;&lt;span aria-hidden="true"&gt;🔴 &lt;/span&gt;CRÍTICO — Overflow horizontal en mobile&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Síntoma:&lt;/strong&gt; El usuario puede hacer scroll horizontal en varias páginas.&lt;/p&gt;
&lt;h3 id="causas-raíz-identificadas"&gt;Causas raíz identificadas&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;#&lt;/th&gt;
 &lt;th&gt;Archivo&lt;/th&gt;
 &lt;th&gt;Problema&lt;/th&gt;
 &lt;th&gt;Severidad&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;head.html&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;body { min-height: max(884px, 100dvh) }&lt;/code&gt; — valor fijo 884px (estético, no causa overflow)&lt;/td&gt;
 &lt;td&gt;🟢 Bajo&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Filtros de categoría con &lt;code&gt;-mx-4&lt;/code&gt; (margen negativo) + &lt;code&gt;px-4&lt;/code&gt; + &lt;code&gt;overflow-x-auto&lt;/code&gt; — sangrado deliberado pero sin contenedor overflow-hidden&lt;/td&gt;
 &lt;td&gt;🟡 Medio&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Artículo destacado: &lt;code&gt;text-3xl ... md:text-5xl&lt;/code&gt; + &lt;code&gt;max-w-3xl&lt;/code&gt; sin &lt;code&gt;overflow-hidden&lt;/code&gt; — títulos largos desbordan en 375px&lt;/td&gt;
 &lt;td&gt;🟡 Medio&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;80+ líneas de &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; inline&lt;/strong&gt; en el template (filtros scroll) — debería ser CSS externo&lt;/td&gt;
 &lt;td&gt;🟡 Medio&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;about.html&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;grid-cols-3&lt;/code&gt; de stack items con emojis + texto — en 320px cada celda mide ~90px, texto cortado&lt;/td&gt;
 &lt;td&gt;🟡 Medio&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;6&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;baseof.html&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Sin &lt;code&gt;overflow-x: hidden&lt;/code&gt; en body/html&lt;/strong&gt; — ningún catch-all para overflow&lt;/td&gt;
 &lt;td&gt;🔴 Alto&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;7&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;prompts/list.html&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Cards con &lt;code&gt;min-w-max&lt;/code&gt; implícito por flex + texto de prompt sin truncar&lt;/td&gt;
 &lt;td&gt;🟡 Medio&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="fix-global-propuesto"&gt;Fix global propuesto&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* Añadir a head.html &amp;lt;style&amp;gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;overflow-x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;overflow-x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y reemplazar &lt;code&gt;min-height: max(884px, 100dvh)&lt;/code&gt; por &lt;code&gt;min-height: 100dvh&lt;/code&gt; (el 884px actual no causa overflow, solo es estético).&lt;/p&gt;</description></item><item><title>Auditoría profunda: HugoBlox (Kit)</title><link>https://pabloib.com/internal/evaluations/hugoblox-deep-audit-2026-05-12/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/evaluations/hugoblox-deep-audit-2026-05-12/</guid><description>&lt;h1 id="auditoría-profunda-hugoblox-kit"&gt;Auditoría profunda: HugoBlox (Kit)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-12
&lt;strong&gt;Repositorio:&lt;/strong&gt; &lt;a href="https://github.com/HugoBlox/kit"&gt;https://github.com/HugoBlox/kit&lt;/a&gt; (fork: &lt;a href="https://github.com/pabloalgo/kit-hugo"&gt;https://github.com/pabloalgo/kit-hugo&lt;/a&gt;)
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://hugoblox.com/docs/"&gt;https://hugoblox.com/docs/&lt;/a&gt;
&lt;strong&gt;Licencia:&lt;/strong&gt; MIT
&lt;strong&gt;Autor:&lt;/strong&gt; George Cushen / Lore Labs
&lt;strong&gt;Historia:&lt;/strong&gt; 9 años (Hugo Academic → Wowchemy → HugoBlox, 3 renombrados)
&lt;strong&gt;Stars:&lt;/strong&gt; 9.4K | &lt;strong&gt;Forks:&lt;/strong&gt; 2.9K | &lt;strong&gt;Sitios:&lt;/strong&gt; 150K+ (acumulados desde 2016)
&lt;strong&gt;Último commit:&lt;/strong&gt; 2 Mayo 2026 (hace 10 días)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="arquitectura-del-framework"&gt;Arquitectura del framework&lt;/h2&gt;
&lt;h3 id="estructura-de-módulos"&gt;Estructura de módulos&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kit/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── blox/ → CORE: layouts, partials, blocks, assets
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── archetypes/ → Front matter templates
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── assets/ → CSS core (Tailwind v4), JS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── blox/ → Block definitions (YAML schemas?)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── data/ → Default data files
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── i18n/ → Internationalization
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── layouts/ → 🧱 LAYOUTS ENGINE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── _partials/hbx/ → Block engine (resolve.html, sections.html)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── _markup/ → Render hooks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── _shortcodes/ → Shortcodes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── authors/ → Author profiles layout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── docs/ → Documentation section layout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── events/ → Events section layout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── faq/ → FAQ section layout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── landing/ → Landing page (block composer)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── publications/ → Publications section layout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ ├── questions/ → Q&amp;amp;A section layout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ └── slides/ → Slide deck layout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ └── schemas/ → JSON schemas for validation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── slides/ → Reveal.js slide module
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── integrations/netlify/ → Netlify deploy config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── templates/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── academic-cv/ → Template de referencia
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── config/_default/ → hugo.yaml, params.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── content/ → Demo content
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── go.mod → Solo 3 deps: blox + slides + netlify
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="block-engine--cómo-funciona"&gt;Block Engine — Cómo funciona&lt;/h3&gt;
&lt;p&gt;El sistema de bloques es el core de HugoBlox. Funciona así:&lt;/p&gt;</description></item><item><title>Evaluación: HugoBlox (Kit)</title><link>https://pabloib.com/internal/evaluations/hugoblox-eval-2026-05-12/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/evaluations/hugoblox-eval-2026-05-12/</guid><description>&lt;h1 id="evaluación-hugoblox-antes-wowchemy--hugo-academic"&gt;Evaluación: HugoBlox (antes Wowchemy / Hugo Academic)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-12
&lt;strong&gt;URL:&lt;/strong&gt; &lt;a href="https://hugoblox.com/"&gt;https://hugoblox.com/&lt;/a&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/HugoBlox/kit"&gt;https://github.com/HugoBlox/kit&lt;/a&gt;
&lt;strong&gt;Licencia:&lt;/strong&gt; MIT
&lt;strong&gt;Autor:&lt;/strong&gt; George Cushen / Lore Labs
&lt;strong&gt;Desde:&lt;/strong&gt; 2016 (9 años)
&lt;strong&gt;Stars:&lt;/strong&gt; 9.4K+ | &lt;strong&gt;Forks:&lt;/strong&gt; 2.9K | &lt;strong&gt;Sitios:&lt;/strong&gt; 150.000+&lt;/p&gt;
&lt;h2 id="qué-es"&gt;Qué es&lt;/h2&gt;
&lt;p&gt;Framework Hugo con sistema de bloques Tailwind, tipos de contenido estructurado, búsqueda Pagefind y opcionalmente IA generativa (Hugo Chat) y CMS visual (Ownable CMS para VS Code).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Antes se llamaba Wowchemy / Hugo Academic&lt;/strong&gt; — muy conocido en el mundo académico (investigadores, universidades). Renombrado a HugoBlox en 2024 con pivote hacia SaaS/landing pages.&lt;/p&gt;</description></item><item><title>Evaluación: Hugolify — Framework Hugo modular</title><link>https://pabloib.com/internal/evaluations/hugolify-eval-2026-05-12/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/evaluations/hugolify-eval-2026-05-12/</guid><description>&lt;h1 id="evaluación-hugolify--framework-hugo-modular"&gt;Evaluación: Hugolify — Framework Hugo modular&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-12
&lt;strong&gt;URL:&lt;/strong&gt; &lt;a href="https://www.hugolify.io/docs/"&gt;https://www.hugolify.io/docs/&lt;/a&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Hugolify/"&gt;https://github.com/Hugolify/&lt;/a&gt;
&lt;strong&gt;Licencia:&lt;/strong&gt; MIT
&lt;strong&gt;Autor:&lt;/strong&gt; Sébastien Moulène (@sebousan)&lt;/p&gt;
&lt;h2 id="qué-es"&gt;Qué es&lt;/h2&gt;
&lt;p&gt;Framework Hugo modular con sistema de bloques, tipos de contenido, taxonomías y multi-CMS. Piensa en él como un &amp;ldquo;WordPress de Hugo&amp;rdquo; — estructura modular, CMS integrado, bloques reutilizables.&lt;/p&gt;
&lt;h2 id="arquitectura"&gt;Arquitectura&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugolify-template (tu sitio)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── hugolify-theme → layouts, archetypes, i18n (sin CSS/JS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── hugolify-theme-bootstrap → Bootstrap 5 + SASS + JS (módulo de estilos)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── hugolify-admin → CMS config (Sveltia, Decap, Netlify, etc.)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── hugolify-theme-* → módulos de contenido que necesites
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Principio clave: &lt;strong&gt;el theme es framework-agnostic&lt;/strong&gt;. Solo proporciona layouts y templates. El CSS/JS viene de un módulo separado que puedes intercambiar (Bootstrap, design system propio, o incluso Tailwind).&lt;/p&gt;</description></item><item><title>Plan: Hugo Module Mounts para eliminar duplicación</title><link>https://pabloib.com/internal/plans/hugo-mounts-plan/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/hugo-mounts-plan/</guid><description>&lt;h1 id="plan-hugo-module-mounts-para-eliminar-duplicación-docs--contentinternal"&gt;Plan: Hugo Module Mounts para eliminar duplicación docs/ ↔ content/internal/&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-10
&lt;strong&gt;Estado:&lt;/strong&gt; Propuesto
&lt;strong&gt;Tipo:&lt;/strong&gt; Decisión arquitectónica (requiere ADR)&lt;/p&gt;
&lt;h2 id="problema"&gt;Problema&lt;/h2&gt;
&lt;p&gt;13 archivos duplicados entre &lt;code&gt;docs/&lt;/code&gt; (fuente para agentes/Obsidian) y &lt;code&gt;content/internal/&lt;/code&gt; (publicado por Hugo detrás de Cloudflare Access). Las copias ya divergieron. Sin mecanismo de sync, el drift empeora con el tiempo.&lt;/p&gt;
&lt;h2 id="decisión"&gt;Decisión&lt;/h2&gt;
&lt;p&gt;Usar &lt;strong&gt;Hugo module mounts&lt;/strong&gt; para que Hugo lea &lt;code&gt;docs/&lt;/code&gt; durante el build y lo sirva como contenido en &lt;code&gt;/internal/&lt;/code&gt;. Una sola fuente de verdad: &lt;code&gt;docs/&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Plan: Memoria del agente, laboratorio CMS y plantillas operativas</title><link>https://pabloib.com/internal/plans/agents-cms-lab-cleanup-plan/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/agents-cms-lab-cleanup-plan/</guid><description>&lt;h1 id="plan-memoria-del-agente-laboratorio-cms-y-plantillas-operativas"&gt;Plan: memoria del agente, laboratorio CMS y plantillas operativas&lt;/h1&gt;
&lt;p&gt;Fecha: 2026-05-09
Estado: actualizado — fases base implementadas, fase de templates pendiente&lt;/p&gt;
&lt;h2 id="objetivo"&gt;Objetivo&lt;/h2&gt;
&lt;p&gt;Dejar &lt;code&gt;/home/pablo/dev/projects/pabloib/AGENTS.md&lt;/code&gt; como una memoria corta, estable y útil para Pi, y mover el conocimiento específico a lugares reutilizables.&lt;/p&gt;
&lt;p&gt;El objetivo no es meter todo el conocimiento de Hugo, Sveltia, imágenes, WordPress y mantenimiento en &lt;code&gt;AGENTS.md&lt;/code&gt;, sino separar responsabilidades para reducir decisiones repetidas, errores y consumo de tokens.&lt;/p&gt;</description></item><item><title>Plan: Zonas Privadas</title><link>https://pabloib.com/internal/plans/private-zones-plan/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/private-zones-plan/</guid><description>&lt;h1 id="zona-privada--estado-actual-y-plan-de-activación"&gt;Zona Privada — Estado Actual y Plan de Activación&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-09
&lt;strong&gt;Proyecto:&lt;/strong&gt; pabloib.com (Hugo + Cloudflare Pages)
&lt;strong&gt;Documento:&lt;/strong&gt; Referencia para replicar en clientes&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-el-problema-que-resolvimos"&gt;1. El problema que resolvimos&lt;/h2&gt;
&lt;p&gt;El contenido interno del blog estaba &lt;strong&gt;accesible públicamente en producción&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;URL&lt;/th&gt;
 &lt;th&gt;Estado antes&lt;/th&gt;
 &lt;th&gt;Estado después&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pabloib.com/reports/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ Público (con informes internos visibles)&lt;/td&gt;
 &lt;td&gt;✅ No existe en producción&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pabloib.com/reports/2026-04-16-blog-corrections/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ Público (correcciones internas visibles)&lt;/td&gt;
 &lt;td&gt;✅ No existe en producción&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pabloib.com/members/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;🟡 No generado (tenía &lt;code&gt;draft: true&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;✅ No existe en producción&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Verificación:&lt;/strong&gt; &lt;code&gt;rm -rf public &amp;amp;&amp;amp; npm run build&lt;/code&gt; → 180 páginas (antes 183). Ni &lt;code&gt;reports/&lt;/code&gt; ni &lt;code&gt;members/&lt;/code&gt; se generan.&lt;/p&gt;</description></item><item><title>Postmortem: Migración Sveltia CMS + Page Bundles</title><link>https://pabloib.com/internal/postmortems/postmortem-sveltia-cms-2026-05-10/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/postmortems/postmortem-sveltia-cms-2026-05-10/</guid><description>&lt;h1 id="post-mortem-migración-sveltia-cms--page-bundles"&gt;Post-Mortem: Migración Sveltia CMS &amp;#43; Page Bundles&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-10
&lt;strong&gt;Sesión:&lt;/strong&gt; ~3 horas
&lt;strong&gt;Resultado:&lt;/strong&gt; CMS funcional con 26 posts visibles (Page Bundles)
&lt;strong&gt;Coste:&lt;/strong&gt; 3 reverts, 1 ADR incorrecto, 2 versiones de plan desperdiciadas&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="línea-de-tiempo"&gt;Línea de tiempo&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10:00 Instalamos Sveltia CMS. Funciona, pero solo ve flat files.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Probamos nested: depth: 1 → no funciona.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Revertimos Page Bundles → flat files.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CMS ve 26 posts. ✅
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10:45 El arquitecto dice que path: &amp;#34;{{slug}}/index&amp;#34; SÍ funciona.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Busco en GitHub — Discussion #190 lo confirma.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Actualizo planes (ADR-001, CMS-IMAGE-OPTIMIZATION-PLAN v2.0).
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Revertimos flat files → Page Bundles otra vez.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;11:30 CMS muestra solo 21 de 26 posts.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Empiezo a investigar sin datos reales:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ¿Drafts ocultos? → Añado view_filters
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ¿Permisos? → Todos normales
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ¿YAML corrupto? → Todo válido
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ¿Slug no coincide? → 13 discrepancias pero no es eso
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ¿Post fantasma? → &amp;#34;Builds reproducibles&amp;#34; pero no hay razón clara
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;12:30 Pido al usuario que abra la consola del navegador.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; El error está ahí desde el minuto 1:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; YAMLParseError: Nested mappings are not allowed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; content/posts/2026-04-12-skills-superpoderes-bajo-demanda/index.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;12:35 Corrijo 10 posts (--- pegado al body → salto de línea).
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Deploy. CMS muestra 26 posts. ✅
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tiempo perdido por no abrir la consola: ~90 minutos.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="el-bug"&gt;El bug&lt;/h2&gt;
&lt;h3 id="qué-era"&gt;Qué era&lt;/h3&gt;
&lt;p&gt;10 posts tenían el closing delimiter del front matter pegado al body:&lt;/p&gt;</description></item><item><title>Postmortem: Section Lists — Layout lookup, código muerto y sed salvaje</title><link>https://pabloib.com/internal/postmortems/postmortem-section-lists-2026-05-10/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/postmortems/postmortem-section-lists-2026-05-10/</guid><description>&lt;h1 id="postmortem-section-lists--layout-lookup-código-muerto-y-sed-salvaje"&gt;Postmortem: Section Lists — Layout lookup, código muerto y sed salvaje&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-10
&lt;strong&gt;Sesión:&lt;/strong&gt; Internal section list UX
&lt;strong&gt;Severidad:&lt;/strong&gt; Baja (no afectó producción, detectado en desarrollo)&lt;/p&gt;
&lt;h2 id="resumen"&gt;Resumen&lt;/h2&gt;
&lt;p&gt;Al implementar section lists para &lt;code&gt;/internal/&lt;/code&gt;, cometí 3 errores de diagnóstico que habrían roto el sitio si se hubieran deployado sin verificación.&lt;/p&gt;
&lt;h2 id="impacto"&gt;Impacto&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tiempo perdido: ~20 min debuggeando layout lookup incorrecto&lt;/li&gt;
&lt;li&gt;Tiempo perdido: ~5 min debuggeando partial invisible&lt;/li&gt;
&lt;li&gt;1 commit con description dentro de un code block (corregido antes de push)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="línea-de-tiempo"&gt;Línea de tiempo&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Afirmé: &amp;ldquo;&lt;code&gt;_default/list.html&lt;/code&gt; puede manejar subsecciones internas con &lt;code&gt;.CurrentSection&lt;/code&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Implementé bifurcación &lt;code&gt;$isInternalSubsection&lt;/code&gt; en &lt;code&gt;_default/list.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;No funcionaba — &lt;code&gt;/internal/evaluations/&lt;/code&gt; seguía mostrando el dashboard&lt;/li&gt;
&lt;li&gt;Intenté quitar &lt;code&gt;layout: internal&lt;/code&gt; de los &lt;code&gt;_index.md&lt;/code&gt; — tampoco funcionó&lt;/li&gt;
&lt;li&gt;Inyecté &lt;code&gt;&amp;lt;meta name=&amp;quot;dbg&amp;quot;&amp;gt;&lt;/code&gt; en ambos layouts y comparé HTML generado&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evidencia:&lt;/strong&gt; las 3 URLs usaban &lt;code&gt;internal/list.html&lt;/code&gt;, nunca &lt;code&gt;_default/list.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;La bifurcación era código muerto — Hugo prioriza &lt;code&gt;layouts/{section}/&lt;/code&gt; sobre &lt;code&gt;layouts/_default/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Corrección: mover la bifurcación a &lt;code&gt;layouts/internal/list.html&lt;/code&gt; (donde realmente se ejecuta)&lt;/li&gt;
&lt;li&gt;Escribí &lt;code&gt;section-list.html&lt;/code&gt; como partial con &lt;code&gt;{{ define &amp;quot;main&amp;quot; }}&lt;/code&gt; — invisible&lt;/li&gt;
&lt;li&gt;Corrección: quitar &lt;code&gt;define&lt;/code&gt;, partial puro&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed&lt;/code&gt; masivo reemplazó &lt;code&gt;description: &amp;quot;&amp;quot;&lt;/code&gt; dentro de un code block de ejemplo&lt;/li&gt;
&lt;li&gt;Corrección: &lt;code&gt;grep -n&lt;/code&gt; post-sed, revertir la línea 90&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="causa-raíz"&gt;Causa raíz&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Razonamiento sin evidencia.&lt;/strong&gt; Asumí el layout lookup de Hugo en vez de verificar con el HTML generado. Hugo no da errores cuando un template no se usa — simplemente lo ignora.&lt;/p&gt;</description></item><item><title>Roadmap — Pablo IB</title><link>https://pabloib.com/internal/plans/roadmap/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/roadmap/</guid><description>&lt;h1 id="roadmap--pablo-ib"&gt;Roadmap — Pablo IB&lt;/h1&gt;
&lt;h2 id="estado-2026-05-18"&gt;Estado: 2026-05-18&lt;/h2&gt;
&lt;h3 id="en-progreso"&gt;En progreso&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Validar Sveltia workflow local (F5.1+F5.2 del plan de auditoría)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; ADR para el sistema de filtros en &lt;code&gt;docs/decisions/&lt;/code&gt; (viola PROHIBICIÓN ESTRICTA)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="backlog--pwa"&gt;Backlog — PWA&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Install prompt personalizado&lt;/strong&gt;: Banner &amp;ldquo;Añadir a pantalla de inicio&amp;rdquo; con UX nativa en vez del prompt genérico de Chrome&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Cache de imágenes&lt;/strong&gt;: Estrategia Cache First para imágenes del blog (muchas son estáticas)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Periodic background sync&lt;/strong&gt;: Actualizar cache en segundo plano cuando el usuario visita&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Share target&lt;/strong&gt;: Permitir compartir URLs/texto hacia la app desde otras apps móviles&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Iconos adaptativos&lt;/strong&gt;: Iconos monocromáticos para Android 13+ themed icons&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="backlog--ux"&gt;Backlog — UX&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Burger menú en desktop&lt;/strong&gt;: Navegación completa para desktop&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Visibilidad de la sección prompts&lt;/strong&gt;: Mejorar discoverability desde la home&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Imágenes en posts&lt;/strong&gt;: Campo &lt;code&gt;image&lt;/code&gt; en Sveltia CMS (ver &lt;code&gt;CMS-IMAGE-OPTIMIZATION-PLAN.md&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Zonas privadas&lt;/strong&gt;: Ver &lt;code&gt;PRIVATE-ZONES-PLAN.md&lt;/code&gt; — ✅ HECHO (2026-05-12)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Hero card imagen&lt;/strong&gt;: Placeholder visual cuando no hay imagen destacada&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="backlog--técnico"&gt;Backlog — Técnico&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Migrar búsqueda Fuse.js → Pagefind&lt;/strong&gt;: Pagefind (Rust-based) reemplaza Fuse.js. Índice pre-build, lazy loading de fragmentos, stemming, filtros por categoría, ranking superior. Ya integrado en bazar-lab con CI pipeline (ver &lt;code&gt;bazar-lab/.github/workflows/&lt;/code&gt;). Migración: añadir paso &lt;code&gt;pagefind&lt;/code&gt; post-Hugo en CI, reemplazar UI de search en &lt;code&gt;main.js&lt;/code&gt;, eliminar JSON index. Ver ADR-009.&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;ADR-009&lt;/strong&gt;: Decisión Fuse.js → Pagefind (cuándo, por qué, pipeline CI)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;CF Workers auth para CMS&lt;/strong&gt;: Edición remota desde pabloib.com/admin/ — ✅ HECHO (2026-05-12)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Migración WP→Hugo&lt;/strong&gt;: Fase 2 pendiente (ver &lt;code&gt;WP-TO-HUGO-MIGRATION-PLAN.md&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="done"&gt;Done&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;2026-05-18 (v2.6.0):&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Runbook: Desarrollo Local</title><link>https://pabloib.com/internal/runbooks/desarrollo-local/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/runbooks/desarrollo-local/</guid><description>&lt;h1 id="runbook-desarrollo-local-pre-producción"&gt;Runbook: Desarrollo Local (Pre-producción)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Propósito:&lt;/strong&gt; Workflow obligatorio antes de hacer push a GitHub o deploy a Cloudflare Pages.
&lt;strong&gt;Regla de oro:&lt;/strong&gt; Todo se valida en local primero. Cero pushes ciegos.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="workflow-secuencial"&gt;Workflow secuencial&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. npm run dev → Levanta servidor local (puerto 1315)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. Validar en navegador → http://localhost:1315/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. validate-content.sh → Escudo automático de contenido
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. npm run build → Build de producción (minificado)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. git add + commit → Solo si 3 y 4 pasan
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Nunca saltar pasos. Nunca push si 3 o 4 fallan.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Runbook: Resolver problemas de Sveltia CMS</title><link>https://pabloib.com/internal/runbooks/resolver-problemas-sveltia-cms/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/runbooks/resolver-problemas-sveltia-cms/</guid><description>&lt;h1 id="runbook-resolver-problemas-de-sveltia-cms"&gt;Runbook: resolver problemas de Sveltia CMS&lt;/h1&gt;
&lt;p&gt;Estado: operativo (workflow local)
Última revisión: 2026-05-10&lt;/p&gt;
&lt;h2 id="modo-de-operación"&gt;Modo de operación&lt;/h2&gt;
&lt;p&gt;Sveltia funciona en &lt;strong&gt;workflow local&lt;/strong&gt; sin auth. Ver AGENTS.md sección &amp;ldquo;CMS y laboratorio&amp;rdquo;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev → http://localhost:1315/admin/index.html → Work with Local Repository
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No requiere CF Workers, OAuth, ni &lt;code&gt;base_url&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="cuándo-usar-este-runbook"&gt;Cuándo usar este runbook&lt;/h2&gt;
&lt;p&gt;Usar este runbook cuando el CMS de &lt;code&gt;/home/pablo/dev/projects/pabloib/static/admin/&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no muestra posts;&lt;/li&gt;
&lt;li&gt;no guarda cambios;&lt;/li&gt;
&lt;li&gt;no carga imágenes;&lt;/li&gt;
&lt;li&gt;muestra errores de autenticación;&lt;/li&gt;
&lt;li&gt;parece incoherente con el contenido que existe en disco;&lt;/li&gt;
&lt;li&gt;falla después de cambiar &lt;code&gt;content/posts/&lt;/code&gt;, &lt;code&gt;static/admin/config.yml&lt;/code&gt;, CSP o Cloudflare.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="regla-principal"&gt;Regla principal&lt;/h2&gt;
&lt;p&gt;Sveltia CMS es una SPA. Cuando algo falla, mirar primero el navegador.&lt;/p&gt;</description></item><item><title>Auditoría de Arquitectura — pabloib.com</title><link>https://pabloib.com/internal/audits/architecture-audit-2026-05-09/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/audits/architecture-audit-2026-05-09/</guid><description>&lt;h1 id="auditoría-de-arquitectura--pabloibcom"&gt;Auditoría de Arquitectura — pabloib.com&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-09&lt;br&gt;
&lt;strong&gt;Versión auditada:&lt;/strong&gt; v2.5.0 (con posts no releaseados en &lt;code&gt;master&lt;/code&gt;)&lt;br&gt;
&lt;strong&gt;Auditor:&lt;/strong&gt; Arquitecto IT (vía Pi)&lt;br&gt;
** Método:** Inspección directa de archivos, config y git history&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-de-dónde-venimos-contexto-y-decisiones"&gt;1. ¿De dónde venimos? (Contexto y Decisiones)&lt;/h2&gt;
&lt;h3 id="11-motivación-de-la-estructura-actual"&gt;1.1 Motivación de la estructura actual&lt;/h3&gt;
&lt;p&gt;El proyecto nació el &lt;strong&gt;2026-03-25&lt;/strong&gt; (v1.0.0) como un blog personal Hugo con el tema &lt;strong&gt;Paper&lt;/strong&gt; (submodule Git). La evolución fue rápida y orientada a iterar sobre funcionalidad visible:&lt;/p&gt;</description></item><item><title>Cómo duplicar la RAM de tu Linux con zram y swap comprimida (sin comprar nada)</title><link>https://pabloib.com/posts/2026-05-09-como-duplicar-ram-linux-zram-swap/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-09-como-duplicar-ram-linux-zram-swap/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Configuré zram + swap en disco + systemd-oomd en mi Linux y pasé de 32 GB a 64 GB de memoria efectiva. Lo probé con stress-ng allocando 22 GB extra hasta verificar que funciona. No compré nada.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="es-esto-para-ti"&gt;¿Es esto para ti?&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tu RAM&lt;/th&gt;
 &lt;th&gt;¿Te ayuda?&lt;/th&gt;
 &lt;th&gt;Por qué&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;4 GB&lt;/td&gt;
 &lt;td&gt;✅ Mucho&lt;/td&gt;
 &lt;td&gt;zram puede darte el equivalente a 6-8 GB. Cambia la experiencia por completo.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;8-16 GB&lt;/td&gt;
 &lt;td&gt;✅ Bastante&lt;/td&gt;
 &lt;td&gt;Ideal para esta configuración. Firefox, IDEs y Docker notan la diferencia.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;32 GB&lt;/td&gt;
 &lt;td&gt;✅ Sí&lt;/td&gt;
 &lt;td&gt;Mi caso. Docker + IDEs + Firefox = se llena. Con 64 GB efectivos va sobrado.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;64+ GB&lt;/td&gt;
 &lt;td&gt;⚠️ Poco&lt;/td&gt;
 &lt;td&gt;Probablemente no necesitas esto. A menos que uses VMs pesadas o compilación masiva.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="cómo-saber-si-ya-tienes-zram"&gt;¿Cómo saber si ya tienes zram?&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;swapon --show
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si ves una línea con &lt;code&gt;/dev/zram0&lt;/code&gt;, tu distro ya lo tiene habilitado. Pero probablemente esté mal configurado. Sigue leyendo.&lt;/p&gt;</description></item><item><title>RAM → zram → swap en disco: cómo montar un sistema de swap por capas y probarlo con stress-ng</title><link>https://pabloib.com/posts/2026-05-09-swap-por-capas-stress-ng/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-09-swap-por-capas-stress-ng/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Crea un swapfile de 16 GB con &lt;code&gt;chattr +C&lt;/code&gt; (Btrfs) y ponle prioridad 50 en fstab. El kernel usará zram primero y desbordará al disco solo cuando zram se llene. Lo probé con stress-ng: 22 GB extra absorbidos, sistema volvió a la normalidad sin reiniciar.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;zram comprime en RAM. El swapfile escribe en disco. Juntos crean un sistema de memoria por capas: lo activo en RAM, lo tibio en zram, lo frío en disco.&lt;/p&gt;</description></item><item><title>Swappiness 180: el valor que hace funcionar zram (y la regla udev que te lo estaba impidiendo)</title><link>https://pabloib.com/posts/2026-05-09-swappiness-180-zram/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-09-swappiness-180-zram/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Crea &lt;code&gt;/etc/sysctl.d/99-vm-zram-parameters.conf&lt;/code&gt; con &lt;code&gt;vm.swappiness = 180&lt;/code&gt; y los otros 3 parámetros. Luego busca si tu distro tiene reglas udev o archivos sysctl que lo sobrescriban — ese fue mi problema.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Si solo quieres que funcione&lt;/strong&gt;, copia estos comandos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/sysctl.d/99-vm-zram-parameters.conf &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;vm.swappiness = 180
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;vm.watermark_boost_factor = 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;vm.watermark_scale_factor = 125
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;vm.page-cluster = 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl --system
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Luego verifica: &lt;code&gt;cat /proc/sys/vm/swappiness&lt;/code&gt; debe mostrar &lt;strong&gt;180&lt;/strong&gt;. Si muestra otro valor, sigue leyendo — tienes un conflicto.&lt;/p&gt;</description></item><item><title>systemd-oomd y Docker limits: lo que nadie te cuenta para proteger tu sistema</title><link>https://pabloib.com/posts/2026-05-09-systemd-oomd-docker-limits/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-09-systemd-oomd-docker-limits/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Habilita systemd-oomd — protege tu escritorio matando procesos selectivamente cuando la memoria falla. Si usas Docker, pon límites de memoria a tus containers — sin límite, un container con fuga puede comerse toda la RAM del host.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Todo lo anterior — zram, sysctl, swap por capas — da más margen. Pero si un proceso crece 10 GB por una fuga de memoria, solo hay dos cosas que pueden salvar tu sesión: un OOM killer inteligente y containers con límites.&lt;/p&gt;</description></item><item><title>zram: mitad de RAM, algoritmo zstd y por qué tu distro lo tiene mal configurado</title><link>https://pabloib.com/posts/2026-05-09-zram-mitad-ram-zstd/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-05-09-zram-mitad-ram-zstd/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Pon &lt;code&gt;zram-size = ram / 2&lt;/code&gt; en &lt;code&gt;/etc/systemd/zram-generator.conf&lt;/code&gt;, usa zstd, y reinicia. Tu distro probablemente tiene zram al 100% de RAM, que es demasiado agresivo.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;¿Qué es zram?&lt;/strong&gt; Es un módulo del kernel que crea swap comprimida dentro de tu RAM. Piensa en ello como una nevera que comprime la basura para que quepa más. No necesitas disco — comprime y descomprime en memoria. Con un ratio de ~3.5:1, 16 GB de zram solo consumen ~4.5 GB de RAM física.&lt;/p&gt;</description></item><item><title>Evaluación: Context-Mode para Pi Coding Agent</title><link>https://pabloib.com/internal/evaluations/context-mode-eval-2026-05-06/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/evaluations/context-mode-eval-2026-05-06/</guid><description>&lt;h1 id="evaluación-context-mode-para-pi-coding-agent"&gt;Evaluación: Context-Mode para Pi Coding Agent&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-06&lt;br&gt;
&lt;strong&gt;Autor:&lt;/strong&gt; Portfolio Manager (project-manager)&lt;br&gt;
&lt;strong&gt;Revisión:&lt;/strong&gt; ✅ Aprobada por Orchestrator SAVA (SAVA-3125)&lt;br&gt;
&lt;strong&gt;Decisión:&lt;/strong&gt; Piloto en storygen-ai + pabloib + timetracker → evaluar extensión a savoury&lt;br&gt;
&lt;strong&gt;Fecha revisión resultados:&lt;/strong&gt; ~2026-05-20 (2 semanas)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="descripción-de-la-extensión"&gt;Descripción de la Extensión&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Campo&lt;/th&gt;
 &lt;th&gt;Valor&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Nombre&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;context-mode&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;URL Pi.dev&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://pi.dev/packages/context-mode"&gt;https://pi.dev/packages/context-mode&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Repositorio&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/mksglu/context-mode"&gt;https://github.com/mksglu/context-mode&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;npm&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;npm:context-mode&lt;/code&gt; v1.0.111&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Autor&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Mert Koseoglu (mksglu)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Licencia&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Elastic-2.0 (no open source)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Tipo&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;extension + skill + MCP server&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Tamaño&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;2.8 MB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Descargas&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;54.3K/mes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Estrellas&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;13.5K GitHub stars&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Plataformas&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;14 (incluyendo Pi Coding Agent)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="qué-hace"&gt;¿Qué hace?&lt;/h3&gt;
&lt;p&gt;Context-mode es un servidor MCP que optimiza el uso del contexto (context window) de los LLM en agentes de coding. Ataca 4 problemas:&lt;/p&gt;</description></item><item><title>RTK prometía ahorrar un 80% de tokens. Dos horas después lo desactivé</title><link>https://pabloib.com/posts/2026-04-28-la-optimizacion-prematura-de-tokens-es-una-trampa/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-28-la-optimizacion-prematura-de-tokens-es-una-trampa/</guid><description>&lt;p&gt;Es como comprar un deshumidificador para la nevera sin abrirla primero.
No sabes si hay condensación. No sabes si la necesitas.
Pero el envoltorio dice &amp;ldquo;elimina el 80% de la humedad&amp;rdquo; y lo compras.
Hace unos días hice exactamente eso, pero con tokens.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-señuelo-del-80"&gt;El señuelo del 80%&lt;/h2&gt;
&lt;p&gt;RTK (Rust Token Killer) es un proxy CLI que comprime la salida de comandos antes de que llegue al contexto del modelo. &lt;code&gt;git status&lt;/code&gt; de 120 tokens a 30. &lt;code&gt;cargo test&lt;/code&gt; con 262 tests passing de 4.800 tokens a 11. Los números son ridículamente buenos.&lt;/p&gt;</description></item><item><title>Hermes vs Agent Zero: no son rivales, son complementarios</title><link>https://pabloib.com/posts/2026-04-21-hermes-vs-agent-zero-dos-agentes-complementarios/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-21-hermes-vs-agent-zero-dos-agentes-complementarios/</guid><description>&lt;p&gt;Llevo semanas leyendo documentación de dos agentes de IA que prometen lo mismo — ser tu copiloto inteligente — pero que en la práctica son tan distintos como un bisturí y un martillo. Ambos cortan. No querrás usar el mismo para todo.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nous-research/hermes"&gt;Hermes Agent&lt;/a&gt; viene de Nous Research, un lab con modelos propios. &lt;a href="https://github.com/agent0ai/agent-zero"&gt;Agent Zero&lt;/a&gt; es proyecto comunitario open-source. Ambos en Python, ambos extensibles, ambos con memoria persistente. Y ahí terminan las similitudes.&lt;/p&gt;</description></item><item><title>Auditar y mejorar un AGENTS.md</title><link>https://pabloib.com/prompts/2026-04-17-review-agents-md/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-04-17-review-agents-md/</guid><description>&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;Cuando tienes un archivo &lt;code&gt;AGENTS.md&lt;/code&gt; (o &lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;.cursorrules&lt;/code&gt;, etc.) que quieres auditar. Útil antes de onboarding de nuevos agentes, tras cambios de arquitectura, o cuando notas que el agente ignora instrucciones que creías haber documentado.&lt;/p&gt;
&lt;h2 id="variables"&gt;Variables&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Qué poner&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;agents-md&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El contenido completo del archivo AGENTS.md&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;contexto-proyecto&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Lenguaje, framework, tipo de proyecto, tamaño del equipo&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;herramienta-agente&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Pi, Claude Code, Cursor, Copilot, u otro agente&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="notas-de-uso"&gt;Notas de uso&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Si el archivo es muy largo, puedes pedir que el análisis se centre en secciones específicas.&lt;/li&gt;
&lt;li&gt;Este prompt está optimizado para Claude y GPT-4; con modelos más pequeños, puede ser necesario simplificar las secciones de análisis.&lt;/li&gt;
&lt;li&gt;La &amp;ldquo;versión mejorada&amp;rdquo; que genera es un punto de partida, no un reemplazo directo. Revísala antes de aplicar.&lt;/li&gt;
&lt;li&gt;Si usas un sistema con múltiples archivos de instrucciones (como Pi con &lt;code&gt;.pi/&lt;/code&gt;), incluye la ruta relativa de cada archivo para que el agente entienda la jerarquía.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ejemplo-de-uso"&gt;Ejemplo de uso&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Eres un experto en configuración de agentes de IA para proyectos de software. Analiza el siguiente archivo de instrucciones de agente y propón mejoras concretas.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Archivo a auditar:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# AGENTS.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;## Stack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hugo v0.159.2, Tailwind CSS v3.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;## Comandos
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev, npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;## Reglas
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No editar themes/paper/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[... resto del archivo]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Contexto del proyecto:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Blog estático Hugo desplegado en Cloudflare Pages. Un solo mantenedor. Usa Pi como agente.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Herramienta/agente utilizado:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pi (pi-coding-agent)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[... resto del prompt]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Debugging TypeScript: rastreo de errores y fixes</title><link>https://pabloib.com/prompts/2026-04-17-debugging-typescript/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-04-17-debugging-typescript/</guid><description>&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;Cuando tienes un error de TypeScript que no resuelves rápido: mensajes crípticos del compilador, fallos de inferencia de tipos, o bugs en runtime que podrían estar relacionados con el sistema de tipos. Especialmente útil cuando el error cruza varios archivos o involucra generics complejos.&lt;/p&gt;
&lt;h2 id="variables"&gt;Variables&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Qué poner&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;error&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El mensaje de error completo del compilador o runtime&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;stack&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El stack trace si existe (puede ir vacío si no aplica)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;contexto&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Versión de TypeScript, framework, tipo de proyecto (Node, Deno, app frontend)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;código-relacionado&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Los archivos o fragmentos de código involucrados en el error&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="notas-de-uso"&gt;Notas de uso&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Si el error está en un test, incluye el código del test además del código que testea.&lt;/li&gt;
&lt;li&gt;Para errores de tipos genéricos complejos, incluye las definiciones de interfaces o types relevantes.&lt;/li&gt;
&lt;li&gt;Si usas un framework (Next.js, Nest, etc.), menciónalo en el contexto para obtener fixes alineados con sus convenciones.&lt;/li&gt;
&lt;li&gt;El prompt pide el fix mínimo; si necesitas una refactorización más amplia, pídelo explícitamente en un segundo mensaje.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ejemplo-de-uso"&gt;Ejemplo de uso&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Eres un experto en TypeScript. Analiza el siguiente error y propón una solución.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Error:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Type &amp;#39;string | undefined&amp;#39; is not assignable to type &amp;#39;string&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Type &amp;#39;undefined&amp;#39; is not assignable to type &amp;#39;string&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Stack trace:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;src/utils/format.ts:12:5 - error TS2322
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Contexto del proyecto:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TypeScript 5.4, Next.js 14 App Router, strict mode habilitado
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Código relacionado:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;function formatUser(user: { name?: string }): string {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return user.name; // error aquí
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sigue este proceso:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[... resto del prompt]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Estructurar un post técnico en español</title><link>https://pabloib.com/prompts/2026-04-17-estructurar-post-tecnico/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/prompts/2026-04-17-estructurar-post-tecnico/</guid><description>&lt;h2 id="cuándo-usarlo"&gt;Cuándo usarlo&lt;/h2&gt;
&lt;p&gt;Cuando quieres escribir un artículo técnico en español y necesitas una estructura sólida antes de empezar a redactar. Especialmente útil para posts de blog, guías o tutoriales donde el contenido técnico necesita estar bien organizado sin sacrificar la narrativa.&lt;/p&gt;
&lt;h2 id="variables"&gt;Variables&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Qué poner&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;tema&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El tema concreto del artículo&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;audiencia&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Nivel técnico de los lectores (junior, mid, senior, generalista)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;objetivo&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Qué debe poder hacer el lector tras leer el artículo&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;referencias&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Links, docs, o contexto adicional relevante&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="notas-de-uso"&gt;Notas de uso&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;El prompt genera primero el outline y espera tu validación. Esto es intencional: te da control antes de generar el contenido completo.&lt;/li&gt;
&lt;li&gt;Para artículos de opinión, quita la sección de &amp;ldquo;Ejemplos de código&amp;rdquo; y añade &amp;ldquo;Argumentos a favor y en contra&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Para tutoriales paso a paso, especifica &amp;ldquo;formato tutorial&amp;rdquo; en el objetivo para que el outline tenga numeración clara.&lt;/li&gt;
&lt;li&gt;Si tu blog tiene convenciones específicas (front matter, longitud de párrafos, uso de imágenes), añádelas en &amp;ldquo;referencias&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;El prompt pide estimación de longitud: útil para planificar si el post encaja en tu calendario editorial.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ejemplo-de-uso"&gt;Ejemplo de uso&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Eres un editor técnico experto en contenido en español. Ayúdame a estructurar un post técnico completo.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Tema:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cómo configurar un agente de código con Pi para un proyecto Hugo existente
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Audiencia:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Desarrolladores que ya usan Hugo y quieren integrar Pi como asistente de código. Nivel mid-senior.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Objetivo del artículo:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Que el lector pueda configurar Pi en su proyecto Hugo en menos de 30 minutos, entendiendo cada archivo de configuración.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;**Referencias:**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Blog personal en Hugo v0.159.2 con tema Paper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Deploy en Cloudflare Pages
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- CSP estricta, sin inline scripts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[... resto del prompt]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Auditoría Profunda V3 — PabloIB</title><link>https://pabloib.com/internal/audits/auditoria_profunda_v3/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/audits/auditoria_profunda_v3/</guid><description>&lt;h1 id="auditoría-profunda-v3--pabloib"&gt;AUDITORÍA PROFUNDA V3 — PabloIB&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-10
&lt;strong&gt;Metodología:&lt;/strong&gt; Zero Trust — cada hallazgo respaldado por comando ejecutado desde disco
&lt;strong&gt;Alcance:&lt;/strong&gt; Contrato de datos, escudo de validación, código muerto, infraestructura auth
&lt;strong&gt;Agente:&lt;/strong&gt; Pi (auditoría ejecutada secuencialmente, sin saltar pasos)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="paso-1-contrato-de-datos--layouts-vs-sveltia-cms"&gt;PASO 1: Contrato de Datos — Layouts vs Sveltia CMS&lt;/h2&gt;
&lt;h3 id="comandos-ejecutados"&gt;Comandos ejecutados&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1A: Extraer todos los .Params de página que los layouts piden&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -rhE &lt;span class="s1"&gt;&amp;#39;\.Params\.[a-zA-Z0-9_]+&amp;#39;&lt;/span&gt; layouts/ &lt;span class="p"&gt;|&lt;/span&gt; grep -v &lt;span class="s1"&gt;&amp;#39;\.Site\.Params&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/.*\.Params\.\([a-zA-Z0-9_]*\).*/\1/&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort &lt;span class="p"&gt;|&lt;/span&gt; uniq
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1B: Contexto exacto de cada uso&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -rn &lt;span class="s1"&gt;&amp;#39;\.Params\.&amp;#39;&lt;/span&gt; layouts/ &lt;span class="p"&gt;|&lt;/span&gt; grep -v &lt;span class="s1"&gt;&amp;#39;\.Site\.Params&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1C: Campos definidos en Sveltia (colección posts)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 → yaml.safe_load → collections&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;posts&lt;span class="o"&gt;]&lt;/span&gt;.fields&lt;span class="o"&gt;[]&lt;/span&gt;.name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1D: Verificar qué layouts usan cada param huérfano&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -rn &lt;span class="s2"&gt;&amp;#34;\.Params\.&lt;/span&gt;&lt;span class="nv"&gt;$param&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; layouts/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1E: Verificar qué posts/prompts reales usan esos params&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -l &lt;span class="s2"&gt;&amp;#34;^&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&amp;#34;&lt;/span&gt; content/posts/*/index.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -l &lt;span class="s2"&gt;&amp;#34;^&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;field&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&amp;#34;&lt;/span&gt; content/prompts/*.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="resultado-variables-que-los-layouts-piden-pero-sveltia-no-provee"&gt;Resultado: Variables que los layouts piden pero Sveltia NO provee&lt;/h3&gt;
&lt;h4 id="variables-de-posts-layout-compartido-singlehtml-indexhtml-listhtml"&gt;Variables de POSTS (layout compartido: single.html, index.html, list.html)&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Layouts que la piden&lt;/th&gt;
 &lt;th&gt;En Sveltia&lt;/th&gt;
 &lt;th&gt;Posts reales que la usan&lt;/th&gt;
 &lt;th&gt;Impacto&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;single.html:37-39&lt;/code&gt;, &lt;code&gt;index.html:68-70&lt;/code&gt;, &lt;code&gt;head.html:44&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ AUSENTE&lt;/td&gt;
 &lt;td&gt;1 de 26 posts&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;CRÍTICO&lt;/strong&gt; — posts sin imagen hero, cards vacías, sin OG image&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;noindex&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;head.html:77&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ AUSENTE&lt;/td&gt;
 &lt;td&gt;0 de 26&lt;/td&gt;
 &lt;td&gt;Bajo — solo útil para páginas específicas&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;faq&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;jsonld.html:19&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ AUSENTE&lt;/td&gt;
 &lt;td&gt;0 de 26&lt;/td&gt;
 &lt;td&gt;Bajo — schema FAQ enriquecido no disponible desde CMS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="variables-de-prompts-layout-dedicado-promptslisthtml-promptssinglehtml"&gt;Variables de PROMPTS (layout dedicado: prompts/list.html, prompts/single.html)&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Layouts que la piden&lt;/th&gt;
 &lt;th&gt;En Sveltia (colección prompts)&lt;/th&gt;
 &lt;th&gt;Prompts reales&lt;/th&gt;
 &lt;th&gt;Impacto&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;usecase&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;prompt-metadata.html:2&lt;/code&gt;, &lt;code&gt;prompts/list.html:26&lt;/code&gt;, &lt;code&gt;related-section.html:11&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ AUSENTE&lt;/td&gt;
 &lt;td&gt;3 de 3&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;ALTO&lt;/strong&gt; — todos los prompts lo usan, Sveltia no lo expone&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;models&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;prompt-metadata.html:8&lt;/code&gt;, &lt;code&gt;prompts/list.html:60&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ AUSENTE&lt;/td&gt;
 &lt;td&gt;3 de 3&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;ALTO&lt;/strong&gt; — metadata de modelos no editable desde CMS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;prompt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;prompts/list.html:46&lt;/code&gt;, &lt;code&gt;prompts/single.html:49&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ AUSENTE&lt;/td&gt;
 &lt;td&gt;3 de 3&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;ALTO&lt;/strong&gt; — el contenido principal del prompt no editable desde CMS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;variables&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;prompts/list.html:56&lt;/code&gt;, &lt;code&gt;prompts/single.html:37&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ AUSENTE&lt;/td&gt;
 &lt;td&gt;3 de 3&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;ALTO&lt;/strong&gt; — variables del prompt no gestionables&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;related_posts&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;prompts/single.html:87&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ AUSENTE&lt;/td&gt;
 &lt;td&gt;3 de 3&lt;/td&gt;
 &lt;td&gt;Medio — links a posts no editables&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;related_prompts&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;prompts/single.html:84&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;❌ AUSENTE&lt;/td&gt;
 &lt;td&gt;3 de 3&lt;/td&gt;
 &lt;td&gt;Medio — links a prompts no editables&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="hallazgo-crítico-sveltia-prompts-es-completamente-inútil"&gt;Hallazgo crítico: Sveltia Prompts es completamente inútil&lt;/h3&gt;
&lt;p&gt;La colección prompts en Sveltia solo expone: &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;tags&lt;/code&gt;, &lt;code&gt;draft&lt;/code&gt;, &lt;code&gt;body&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Plan: WordPress → Hugo</title><link>https://pabloib.com/internal/plans/wp-to-hugo-migration-plan/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/wp-to-hugo-migration-plan/</guid><description>&lt;h1 id="plan-de-implementación-wordpress--hugo-laboratorio-pabloibcom"&gt;Plan de Implementación: WordPress → Hugo (Laboratorio pabloib.com)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-09
&lt;strong&gt;Versión:&lt;/strong&gt; 2.0 — Revisión arquitectónica tras hallazgos de Fase 2
&lt;strong&gt;Estado:&lt;/strong&gt; Fase 1 completada, Fase 2 en progreso (CMS instalado, ajustando modelo de contenido)
&lt;strong&gt;Propósito:&lt;/strong&gt; Validar en pabloib.com un flujo de trabajo reproducible para migrar clientes de WordPress a Hugo + Cloudflare&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="objetivo"&gt;Objetivo&lt;/h2&gt;
&lt;p&gt;Convertir pabloib.com en una &lt;strong&gt;plantilla funcional&lt;/strong&gt; que demuestre que un cliente WordPress puede:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Editar contenido desde un panel web sin tocar Git&lt;/li&gt;
&lt;li&gt;Subir imágenes desde su móvil que se sirvan optimizadas (WebP/AVIF)&lt;/li&gt;
&lt;li&gt;Mantener SEO, seguridad y rendimiento sin plugins&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Las decisiones aquí documentadas se replicarán en cada migración de cliente.&lt;/p&gt;</description></item><item><title>Extensiones — Pi que se programa a sí mismo</title><link>https://pabloib.com/posts/2026-04-12-extensiones-pi-que-se-programa-a-si-mismo/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-12-extensiones-pi-que-se-programa-a-si-mismo/</guid><description>&lt;p&gt;Las skills le dan instrucciones a Pi. Las extensiones le dan &lt;strong&gt;código ejecutable&lt;/strong&gt;. Son módulos TypeScript que pueden registrar tools custom, interceptar llamadas, modificar el contexto, y crear componentes en la UI. Y la parte más alucinante: Pi puede escribir sus propias extensiones, recargarlas, y probarlas. Todo en vivo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="skills-vs-extensiones-cuándo-usar-cuál"&gt;Skills vs Extensiones: ¿Cuándo usar cuál?&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;Skills&lt;/th&gt;
 &lt;th&gt;Extensiones&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Formato&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Markdown (SKILL.md)&lt;/td&gt;
 &lt;td&gt;TypeScript (.ts)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Qué hace&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Da instrucciones al modelo&lt;/td&gt;
 &lt;td&gt;Ejecuta código real&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Puede&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Guiar comportamiento, definir pasos&lt;/td&gt;
 &lt;td&gt;Registrar tools, interceptar eventos, crear UI&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;No puede&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Ejecutar código, interceptar llamadas&lt;/td&gt;
 &lt;td&gt;— (puede hacer todo)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Complejidad&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Baja&lt;/td&gt;
 &lt;td&gt;Media-alta&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Recarga&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/reload&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/reload&lt;/code&gt; (hot-reload)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Cuándo usar&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Flujos de trabajo, convenciones&lt;/td&gt;
 &lt;td&gt;Automatización, integraciones, tools custom&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Regla práctica:&lt;/strong&gt; Si puedes describirlo en texto, usa una skill. Si necesitas ejecutar código o interceptar eventos, usa una extensión.&lt;/p&gt;</description></item><item><title>Gestión de contexto y sesiones</title><link>https://pabloib.com/posts/2026-04-12-gestion-de-contexto-y-sesiones/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-12-gestion-de-contexto-y-sesiones/</guid><description>&lt;p&gt;El contexto es el recurso más valioso cuando trabajas con agentes de IA. Pi tiene mecanismos sofisticados para gestionarlo: compaction automática, sesiones con estructura de árbol, y navegación temporal. Entender cómo funciona te permite mantener sesiones productivas durante horas sin degradación.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-del-contexto-finito"&gt;El problema del contexto finito&lt;/h2&gt;
&lt;p&gt;Los modelos de lenguaje tienen una ventana de contexto fija. Pi usa esa ventana para:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;┌──────────────────────────────────────┐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt; &lt;span class="n"&gt;definitions&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;900&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;AGENTS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Skills&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;┌──&lt;/span&gt; &lt;span class="n"&gt;Conversation&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="err"&gt;──────────┐&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Tu&lt;/span&gt; &lt;span class="n"&gt;primer&lt;/span&gt; &lt;span class="n"&gt;mensaje&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Respuesta&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;Pi&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bash&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt; &lt;span class="n"&gt;líneas&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Respuesta&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;Pi&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Tu&lt;/span&gt; &lt;span class="n"&gt;segundo&lt;/span&gt; &lt;span class="n"&gt;mensaje&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;edit&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;sigue&lt;/span&gt; &lt;span class="n"&gt;creciendo&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──────────────────────────────────┘&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└──────────────────────────────────────┘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;típico&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Cada tool call y su resultado consume tokens.&lt;/strong&gt; Un &lt;code&gt;read&lt;/code&gt; de un archivo largo puede consumir miles de tokens. Una sesión de 2 horas puede llegar a 150k+ tokens.&lt;/p&gt;</description></item><item><title>Patrones avanzados — Multi-agente y automatización</title><link>https://pabloib.com/posts/2026-04-12-patrones-avanzados-multi-agente-y-automatizacion/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-12-patrones-avanzados-multi-agente-y-automatizacion/</guid><description>&lt;p&gt;Pi es minimalista en su core, pero poderoso en sus modos de uso. Más allá de la sesión interactiva, puedes orquestar múltiples agentes, automatizar tareas, y embeber Pi en tus propias aplicaciones. Este artículo cubre los 5 patrones agentic principales, subagentes, y el SDK para integración programática.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="los-5-patrones-agentic"&gt;Los 5 patrones agentic&lt;/h2&gt;
&lt;p&gt;La investigación en agentes de IA ha identificado patrones recurrentes. Pi los soporta todos, pero no los impone. Tú eliges.&lt;/p&gt;</description></item><item><title>Pi desde cero — Instalación y primera sesión</title><link>https://pabloib.com/posts/2026-04-12-pi-desde-cero-instalacion-y-primera-sesion/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-12-pi-desde-cero-instalacion-y-primera-sesion/</guid><description>&lt;p&gt;Si nunca usaste un agente de código en la terminal, este artículo es para ti. Vamos a instalar Pi, configurarlo y tener una sesión funcional en menos de 10 minutos. Sin jerga, sin prerrequisitos imposibles.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="qué-es-pi-y-por-qué-debería-importarte"&gt;¿Qué es Pi y por qué debería importarte?&lt;/h2&gt;
&lt;p&gt;Pi es un agente de código que vive en tu terminal. No es un chatbot. No es un IDE con IA integrada. Es un asistente que &lt;strong&gt;lee, escribe, edita y ejecuta código directamente en tu proyecto&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Plan: CMS + Optimización de Imágenes</title><link>https://pabloib.com/internal/plans/cms-image-optimization-plan/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/cms-image-optimization-plan/</guid><description>&lt;h1 id="plan-cms--optimización-de-imágenes"&gt;Plan: CMS &amp;#43; Optimización de Imágenes&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Proyecto:&lt;/strong&gt; pabloib.com (laboratorio → servicio de migración)
&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-10
&lt;strong&gt;Versión:&lt;/strong&gt; 2.0 — Arquitectura revisada tras descubrimiento de &lt;code&gt;path: &amp;quot;{{slug}}/index&amp;quot;&lt;/code&gt;
&lt;strong&gt;Estado:&lt;/strong&gt; En progreso (pasos A1-A4 completados, A5-A7 revirtiendo)
&lt;strong&gt;Dependencias:&lt;/strong&gt; Ninguna (plan independiente del plan general de migración)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-cambio-de-arquitectura-respecto-a-v10"&gt;&lt;span aria-hidden="true"&gt;⚠&lt;/span&gt;️ Cambio de arquitectura respecto a v1.0&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;v1.0 decía:&lt;/strong&gt; Flat files + R2 + Cloudflare Transformations
&lt;strong&gt;v2.0 cambia a:&lt;/strong&gt; Page Bundles + Sveltia &lt;code&gt;path&lt;/code&gt; + Hugo image processing + R2 como alternativa&lt;/p&gt;</description></item><item><title>Skills — Superpoderes bajo demanda</title><link>https://pabloib.com/posts/2026-04-12-skills-superpoderes-bajo-demanda/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-12-skills-superpoderes-bajo-demanda/</guid><description>&lt;p&gt;Pi viene con 4 tools y un system prompt de 100 tokens. ¿Cómo haces que haga cosas avanzadas sin inflar el core? La respuesta es &lt;strong&gt;skills&lt;/strong&gt;: paquetes de instrucciones que se cargan bajo demanda, solo cuando se necesitan. Y son un estándar abierto: funcionan en Pi, Claude Code, Codex, y más.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="qué-es-una-skill"&gt;¿Qué es una skill?&lt;/h2&gt;
&lt;p&gt;Una skill es un directorio con un archivo &lt;code&gt;SKILL.md&lt;/code&gt; que contiene instrucciones especializadas. Cuando Pi necesita hacer algo específico (auditar tu configuración, automatizar deploys, generar diagramas), &lt;strong&gt;carga la skill relevante al vuelo&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Tu AGENTS.md — Contexto que el agente entiende</title><link>https://pabloib.com/posts/2026-04-12-tu-agents-md-contexto-que-el-agente-entiende/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-12-tu-agents-md-contexto-que-el-agente-entiende/</guid><description>&lt;p&gt;La diferencia entre un agente que te entiende y uno que no está en un archivo: &lt;code&gt;AGENTS.md&lt;/code&gt;. Es donde le dices a Pi cómo funciona tu proyecto, qué convenciones sigues y qué esperar de él. Sin él, Pi adivina. Con él, Pi sabe.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-del-contexto"&gt;El problema del contexto&lt;/h2&gt;
&lt;p&gt;Cuando abres ChatGPT y preguntas &amp;ldquo;corrige este bug&amp;rdquo;, necesitas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copiar el código&lt;/li&gt;
&lt;li&gt;Explicar la estructura del proyecto&lt;/li&gt;
&lt;li&gt;Mencionar las convenciones&lt;/li&gt;
&lt;li&gt;Aclarar qué framework usas&lt;/li&gt;
&lt;li&gt;Especificar la versión de Node&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Cada vez.&lt;/strong&gt; En cada mensaje. En cada sesión.&lt;/p&gt;</description></item><item><title>Builds reproducibles en Hugo con npx</title><link>https://pabloib.com/posts/2026-04-04-builds-reproducibles-hugo-npx/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-04-builds-reproducibles-hugo-npx/</guid><description>&lt;p&gt;Fijar la versión de Hugo en &lt;code&gt;package.json&lt;/code&gt; con &lt;code&gt;npx&lt;/code&gt; elimina dependencias de binarios globales y garantiza builds reproducibles. Tu local, CI y cualquier desarrollador obtienen el mismo resultado.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-binarios-globales"&gt;El problema: binarios globales&lt;/h2&gt;
&lt;p&gt;Instalación típica de Hugo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Instalación global&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install hugo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# O descargar binario manual&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/gohugoio/hugo/releases/download/v0.159.2/hugo_extended_0.159.2_linux-amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dpkg -i hugo_extended_0.159.2_linux-amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;El problema:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// package.json (antes)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo server --buildDrafts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo --minify&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;¿Qué versión de Hugo usa &lt;code&gt;npm run dev&lt;/code&gt;?&lt;/p&gt;</description></item><item><title>Debugging con Pi: del stack trace al fix</title><link>https://pabloib.com/posts/2026-04-04-debugging-con-pi-del-stack-trace-al-fix/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-04-04-debugging-con-pi-del-stack-trace-al-fix/</guid><description>&lt;p&gt;Lo que nadie te dice: Pi es mejor para debugging que tu IDE. Veo el stack trace, leo el código, encuentro el root cause y propongo el fix — todo en el mismo contexto, sin cambiar de ventana.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-debugging-sin-pi"&gt;El problema: debugging sin Pi&lt;/h2&gt;
&lt;p&gt;Debugging típico en VS Code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="n"&gt;runtime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Copy&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Paste&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="n"&gt;Google&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;stackoverflow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;4.&lt;/span&gt; &lt;span class="n"&gt;Abrir&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tabs&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;SO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;5.&lt;/span&gt; &lt;span class="n"&gt;Leer&lt;/span&gt; &lt;span class="n"&gt;respuestas&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;muchas&lt;/span&gt; &lt;span class="n"&gt;obsoletas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;6.&lt;/span&gt; &lt;span class="n"&gt;Encontrar&lt;/span&gt; &lt;span class="n"&gt;una&lt;/span&gt; &lt;span class="n"&gt;prometedora&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;7.&lt;/span&gt; &lt;span class="n"&gt;Abrir&lt;/span&gt; &lt;span class="n"&gt;archivo&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="n"&gt;VS&lt;/span&gt; &lt;span class="n"&gt;Code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;8.&lt;/span&gt; &lt;span class="n"&gt;Buscar&lt;/span&gt; &lt;span class="n"&gt;función&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;9.&lt;/span&gt; &lt;span class="n"&gt;Analizar&lt;/span&gt; &lt;span class="n"&gt;contexto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;10.&lt;/span&gt; &lt;span class="n"&gt;Proponer&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;11.&lt;/span&gt; &lt;span class="n"&gt;Probar&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;12.&lt;/span&gt; &lt;span class="n"&gt;Volver&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;si&lt;/span&gt; &lt;span class="n"&gt;falló&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;El problema:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;30+ minutos para un bug simple&lt;/li&gt;
&lt;li&gt;Context switching constante (IDE ↔ navegador ↔ terminal)&lt;/li&gt;
&lt;li&gt;SO answers obsoletas (Python 2.7 cuando usas 3.11)&lt;/li&gt;
&lt;li&gt;Stack traces largos que no entiendes&lt;/li&gt;
&lt;li&gt;Perder el hilo del por qué llegaste ahí&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con Pi, todo esto cambia.&lt;/p&gt;</description></item><item><title>Ant Colony: cuando un agente no es suficiente</title><link>https://pabloib.com/posts/2026-03-25-ant-colony-cuando-un-agente-no-es-suficiente/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-03-25-ant-colony-cuando-un-agente-no-es-suficiente/</guid><description>&lt;p&gt;Después de usar agentes de IA durante meses, me di cuenta de algo obvio que nadie te dice: cuando un solo agente se ahoga en tu código, no necesitas un mejor modelo. Necesitas más agentes.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-del-agente-único"&gt;El problema del agente único&lt;/h2&gt;
&lt;p&gt;Imagina que le pides a un solo desarrollador:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Migra todo el proyecto de CommonJS a ESM, actualiza imports, exports, tests, y documentación&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ese desarrollador va a:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abrir 50 archivos uno por uno&lt;/li&gt;
&lt;li&gt;Mantener en la cabeza el estado de cada archivo&lt;/li&gt;
&lt;li&gt;Olvidar qué cambió en el archivo #3 cuando está en el #27&lt;/li&gt;
&lt;li&gt;No poder verificar todos los cambios sin ejecutar todo el proyecto&lt;/li&gt;
&lt;li&gt;Tomar semanas, cansarse, cometer errores&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Los agentes de IA tienen el mismo problema. Son excelentes para &lt;strong&gt;tareas unitarias&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>Cómo configurar Pi para proyectos TypeScript</title><link>https://pabloib.com/posts/2026-03-25-como-configurar-pi-para-proyectos-typescript/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-03-25-como-configurar-pi-para-proyectos-typescript/</guid><description>&lt;p&gt;Lo que nadie te dice: Pi está &lt;strong&gt;construido en TypeScript&lt;/strong&gt;. Configurarlo para proyectos TypeScript no es una configuración especial — es su modo NATIVO.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-mito-pi-es-para-javascript"&gt;El mito: “Pi es para JavaScript”&lt;/h2&gt;
&lt;p&gt;He escuchado esto muchas veces:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Pi es para proyectos JavaScript/Node.js. Para TypeScript, necesitas otra cosa.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Esto es falso.&lt;/strong&gt; Pi está construido en TypeScript desde el inicio.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pi-ai → LLM communication (TypeScript)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pi-agent-core → Agent loop (TypeScript)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pi-coding-agent → Full CLI (TypeScript)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No es que Pi &amp;ldquo;soporta&amp;rdquo; TypeScript. Es que &lt;strong&gt;Pi está hecho de TypeScript&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Del caos al orden: gestionando contexto con Pi</title><link>https://pabloib.com/posts/2026-03-25-del-caos-al-orden-gestionando-contexto-con-pi/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-03-25-del-caos-al-orden-gestionando-contexto-con-pi/</guid><description>&lt;p&gt;Las sesiones de IA son como una pila de platos: pones uno, otro, otro&amp;hellip; eventualmente la pila se cae. Pi tiene 3 sistemas para manejar esto, y juntos transformaron el caos de mis sesiones en orden predecible.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-sesiones-gigantes-que-se-pierden"&gt;El problema: sesiones gigantes que se pierden&lt;/h2&gt;
&lt;p&gt;Imagina esta sesión típica:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;09:00 - Empiezas a trabajar en una feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10:30 - Agregas funcionalidad A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;11:00 - Bug report, lo arreglas
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;12:00 - Meeting, pausas
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;13:00 - Vuelves, arreglas otro bug
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;14:30 - Alguien pregunta sobre el proyecto
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;15:00 - Respondes, sigues con la feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;16:00 - Refactorizas algo relacionado
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;17:00 - Feature casi terminada
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;17:30 - Terminas, pruebas, commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;El problema:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Mis 10 extensiones favoritas de Pi</title><link>https://pabloib.com/posts/2026-03-25-mis-10-extensiones-favoritas-de-pi/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-03-25-mis-10-extensiones-favoritas-de-pi/</guid><description>&lt;p&gt;Después de usar Pi durante 6 meses en proyectos reales, estas son las extensiones que realmente cambian mi desarrollo. No son las más populares ni las más nuevas. Son las que &lt;strong&gt;realmente uso todos los días&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="mi-regla-no-instalar-extensiones-por-instalar"&gt;Mi regla: no instalar extensiones por instalar&lt;/h2&gt;
&lt;p&gt;La tienda de paquetes de Pi tiene 100+ extensiones. Instalé todas, probé todas, y me di cuenta de algo:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La mayoría son para el 0.1% de los casos.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Prompt engineering para agentes de código</title><link>https://pabloib.com/posts/2026-03-25-prompt-engineering-para-agentes-de-codigo/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-03-25-prompt-engineering-para-agentes-de-codigo/</guid><description>&lt;p&gt;2026 trajo un cambio que nadie está hablando: el prompt engineering tradicional está muriendo. Lo que reemplaza no es &amp;ldquo;mejor prompting&amp;rdquo;, es &lt;strong&gt;context engineering + agentes&lt;/strong&gt;. Y tu terminal es el mejor lugar para hacerlo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-el-prompt-gigante-de-2024"&gt;El problema: “El prompt gigante de 2024”&lt;/h2&gt;
&lt;p&gt;Si has usado ChatGPT/Claude en 2024, sabes el patrón:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Prompt de 500 líneas:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &amp;#34;Eres un desarrollador senior con 15 años de experiencia...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &amp;#34;Siempre usa TypeScript...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &amp;#34;Sigue SOLID, Clean Code, DDD...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &amp;#34;El proyecto está en /ruta/al/proyecto...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &amp;#34;La arquitectura es...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &amp;#34;Los archivos son...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &amp;#34;La convención es...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &amp;#34;Cuando encuentres error, haz X, Y, Z...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- [otras 450 líneas...]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;El problema:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Serena vs OneTool: ¿cuándo usar cada uno?</title><link>https://pabloib.com/posts/2026-03-25-serena-vs-onetool-cuando-usar-cada-uno/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-03-25-serena-vs-onetool-cuando-usar-cada-uno/</guid><description>&lt;p&gt;Dos de las herramientas más poderosas en mi stack. Pero usar ambas al mismo tiempo es como llevar un cuchillo de chef y un martillo a la misma cocina. Aquí cuándo usar cada una.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-dos-herramientas-cuál-usar"&gt;El problema: dos herramientas, ¿cuál usar?&lt;/h2&gt;
&lt;p&gt;Durante un tiempo tenía este flujo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Necesito buscar una función en mi código
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;¿Uso Serena o OneTool?&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pruebo con Serena → funciona pero es lento
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pruebo con OneTool → es más rápido pero no encuentra símbolos
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Termino usando grep en bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El problema: &lt;strong&gt;no sabía cuál era la herramienta correcta para cada tarea&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Sobre mí</title><link>https://pabloib.com/about/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/about/</guid><description>&lt;p&gt;Desarrollador, escritor y eterno aprendiz. Este blog es mi segunda memoria refinada.&lt;/p&gt;</description></item><item><title>Por qué Pi cambió mi workflow de desarrollo</title><link>https://pabloib.com/posts/2026-03-23-pi-cambio-mi-workflow/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://pabloib.com/posts/2026-03-23-pi-cambio-mi-workflow/</guid><description>&lt;p&gt;Después de meses usando agentes de IA para programar, descubrí que la diferencia no está en el modelo, sino en cuánto contexto puede acceder. Esto cambió todo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-problema-que-no-sabía-que-tenía"&gt;El problema que no sabía que tenía&lt;/h2&gt;
&lt;p&gt;Durante meses, mi workflow con IA era:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Encuentro un bug&lt;/li&gt;
&lt;li&gt;Copio el código relevante&lt;/li&gt;
&lt;li&gt;Lo pego en ChatGPT/Claude&lt;/li&gt;
&lt;li&gt;Explico el contexto (otra vez)&lt;/li&gt;
&lt;li&gt;Recibo una sugerencia&lt;/li&gt;
&lt;li&gt;La copio de vuelta a mi editor&lt;/li&gt;
&lt;li&gt;Pruebo&amp;hellip; no funciona&lt;/li&gt;
&lt;li&gt;Repito desde paso 3&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;El problema:&lt;/strong&gt; Estaba gastando más tiempo en copy-paste y explicando contexto que programando.&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/evaluations/cockpit-cms-eval-2026-05-14/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/evaluations/cockpit-cms-eval-2026-05-14/</guid><description>&lt;h1 id="evaluación-cockpit-cms--sovereign-headless-content-platform"&gt;Evaluación: Cockpit CMS — Sovereign Headless Content Platform&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-14
&lt;strong&gt;URL:&lt;/strong&gt; &lt;a href="https://getcockpit.com"&gt;https://getcockpit.com&lt;/a&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/Cockpit-HQ/Cockpit"&gt;https://github.com/Cockpit-HQ/Cockpit&lt;/a&gt;
&lt;strong&gt;Licencia:&lt;/strong&gt; MIT
&lt;strong&gt;Autor:&lt;/strong&gt; Artur Heinze (aheinze) — desarrollador principal, Cockpit-HQ
&lt;strong&gt;Estado:&lt;/strong&gt; v2.14.0 (Mar 2026), maduro, 61 releases&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="qué-es"&gt;Qué es&lt;/h2&gt;
&lt;p&gt;CMS headless self-hosted. No es Git-based — tiene su propia base de datos (SQLite o MongoDB) y expone el contenido via API REST + GraphQL. El frontend se construye aparte y consume la API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; Es un CMS &lt;strong&gt;headless&lt;/strong&gt;, no un Git-based CMS. No edita archivos en un repo. Gestiona contenido en su propia DB y lo sirve via API.&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/evaluations/pages-cms-eval-2026-05-14/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/evaluations/pages-cms-eval-2026-05-14/</guid><description>&lt;h1 id="evaluación-pages-cms--git-based-cms-para-sitios-estáticos"&gt;Evaluación: Pages CMS — Git-based CMS para sitios estáticos&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-14
&lt;strong&gt;URL:&lt;/strong&gt; &lt;a href="https://pagescms.org"&gt;https://pagescms.org&lt;/a&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/pagescms/pagescms"&gt;https://github.com/pagescms/pagescms&lt;/a&gt;
&lt;strong&gt;Licencia:&lt;/strong&gt; MIT
&lt;strong&gt;Autor:&lt;/strong&gt; Vincent Battaglia (hunvreus) — desarrollador individual
&lt;strong&gt;Estado:&lt;/strong&gt; v0.x (pre-1.0), activo, desarrollo continuo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="qué-es"&gt;Qué es&lt;/h2&gt;
&lt;p&gt;CMS open-source para sitios estáticos almacenados en repos GitHub. Edita archivos del repo directamente — no hay base de datos de contenido separada. Es una app web completa (Next.js + PostgreSQL) que actúa como interfaz entre el editor y GitHub.&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/evaluations/payload-cms-eval-2026-05-14/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/evaluations/payload-cms-eval-2026-05-14/</guid><description>&lt;h1 id="evaluación-payload-cms--nextjs-native-headless-cms"&gt;Evaluación: Payload CMS — Next.js native headless CMS&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-14
&lt;strong&gt;URL:&lt;/strong&gt; &lt;a href="https://payloadcms.com"&gt;https://payloadcms.com&lt;/a&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/payloadcms/payload"&gt;https://github.com/payloadcms/payload&lt;/a&gt;
&lt;strong&gt;Licencia:&lt;/strong&gt; MIT
&lt;strong&gt;Adquirido por:&lt;/strong&gt; Figma (Jun 2025)
&lt;strong&gt;Stars:&lt;/strong&gt; 33K
&lt;strong&gt;Estado:&lt;/strong&gt; v3.x, activo, equipo absorbido por Figma&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="qué-es"&gt;Qué es&lt;/h2&gt;
&lt;p&gt;Framework fullstack Next.js + headless CMS. Se instala dentro de tu &lt;code&gt;/app&lt;/code&gt; folder de Next.js. Admin panel React autogenerado, API REST + GraphQL autogeneradas, tipos TypeScript autogenerados.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No es Git-based.&lt;/strong&gt; Contenido vive en base de datos (D1, PostgreSQL, MongoDB).&lt;/p&gt;
&lt;h2 id="arquitectura"&gt;Arquitectura&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Editor&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Payload&lt;/span&gt; &lt;span class="n"&gt;Admin&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;React&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="n"&gt;REST&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;GraphQL&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;D1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Postgres&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Mongo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Frontend&lt;/span&gt; &lt;span class="n"&gt;Next&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;directa&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sin&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;Payload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Deploy en Cloudflare (one-click):&lt;/strong&gt;&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/plans/blog-ia-local-prompt-library-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/blog-ia-local-prompt-library-plan/</guid><description>&lt;h1 id="plan-serie-ia-local--prompt-library-multilingüe"&gt;Plan: Serie IA Local &amp;#43; Prompt Library Multilingüe&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Proyecto dual:&lt;/strong&gt; Blog posts sobre IA local en RTX 50xx + Biblioteca de prompts basada en refranes, paradojas y conceptos técnicos multilingües.
&lt;strong&gt;Creado:&lt;/strong&gt; 2026-05-15
&lt;strong&gt;Principio:&lt;/strong&gt; Cada post genera prompts. Cada prompt genera posts. Los dos tracks se alimentan mutuamente.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="los-dos-tracks"&gt;Los dos tracks&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Track A: Posts IA Local Track B: Prompt Library
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;───────────────────── ──────────────────────
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Post 1 → Tabla por GPU ──→ Prompt: La caña (dividir)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Post 2 → VRAM cliff ──→ Prompt: La autopsia (verificar)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Post 3 → MoE explicado ──→ Prompt: El baño caliente (perspectiva)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Post 4 → Tests calidad ──→ Prompt: La diana (audiencia)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Post 5 → CUDA 13 gap ──→ Prompt: La poda (cortar)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Prompt: La inversión (dar la vuelta)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Prompt: El casting (roles)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Prompt: Enseñar para aprender
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Prompt: El refrán como prompt ★
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;El post estrella es el que une ambos tracks:&lt;/strong&gt; &amp;ldquo;El refrán como prompt&amp;rdquo; — un post que es a la vez contenido del blog y manifiesto de la prompt library.&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/plans/hugolify-lab-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/hugolify-lab-plan/</guid><description>&lt;h1 id="hugolify-lab--plan-de-implementación"&gt;Hugolify Lab — Plan de implementación&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For agentic workers:&lt;/strong&gt; REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (&lt;code&gt;- [ ]&lt;/code&gt;) syntax for tracking.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Montar un prototipo Hugolify funcional en &lt;code&gt;hugolify.lab.pabloib.com&lt;/code&gt; como primer experimento del laboratorio de frameworks para clientes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Architecture:&lt;/strong&gt; Repo independiente &lt;code&gt;hugolify-lab&lt;/code&gt; con Hugo modules (theme + admin + posts), deploy a Cloudflare Pages como subdominio de pabloib.com. Sveltia CMS configurado para edición visual de bloques.&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/plans/image-prompts-integration-ideas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/image-prompts-integration-ideas/</guid><description>&lt;h1 id="ideas-para-prompt-library-desde-repos-de-prompts"&gt;Ideas para Prompt Library desde Repos de Prompts&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-18
&lt;strong&gt;Origen:&lt;/strong&gt; Revisión de repos similares sobre prompting&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Repos analizados:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/devanshug2307/Awesome-AI-Image-Prompts"&gt;https://github.com/devanshug2307/Awesome-AI-Image-Prompts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agentpedia.codes/image-prompts"&gt;https://agentpedia.codes/image-prompts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/linshenkx/prompt-optimizer"&gt;https://github.com/linshenkx/prompt-optimizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CyberAlbSecOP/Awesome_GPT_Super_Prompting"&gt;https://github.com/CyberAlbSecOP/Awesome_GPT_Super_Prompting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-análisis-de-recursos"&gt;&lt;span aria-hidden="true"&gt;📊 &lt;/span&gt;Análisis de recursos&lt;/h2&gt;
&lt;h3 id="awesome-ai-image-prompts-github"&gt;Awesome-AI-Image-Prompts (GitHub)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Características:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1000+ prompts curados para IA de imágenes&lt;/li&gt;
&lt;li&gt;Formato JSON copy-ready&lt;/li&gt;
&lt;li&gt;Multi-modelo: DALL-E, Midjourney, Imagen, Flux, ChatGPT Image, Stable Diffusion&lt;/li&gt;
&lt;li&gt;Categorías: 3D miniatures, product photography, portraits, character design&lt;/li&gt;
&lt;li&gt;Estructura: prompts estructurados, listos para copiar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Enfoque:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prompts especializados para generación de imágenes&lt;/li&gt;
&lt;li&gt;Énfasis en calidad visual y consistencia&lt;/li&gt;
&lt;li&gt;Optimizado para diferentes modelos de IA&lt;/li&gt;
&lt;li&gt;Formato técnico y reproducible&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="agentpedia-codes---image-prompts"&gt;Agentpedia Codes - Image Prompts&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Características:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/plans/local-ai-quality-test-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/local-ai-quality-test-plan/</guid><description>&lt;h1 id="plan-de-tests-de-calidad--modelos-ia-local-rtx-5080-16gb"&gt;Plan de Tests de Calidad — Modelos IA Local (RTX 5080 16GB)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Objetivo:&lt;/strong&gt; Generar datos únicos de calidad por modelo para la serie de posts &amp;ldquo;IA local en tu GPU&amp;rdquo; en pabloib.com.
&lt;strong&gt;Creado:&lt;/strong&gt; 2026-05-15
&lt;strong&gt;Estado:&lt;/strong&gt; Pendiente de ejecución
&lt;strong&gt;Principio:&lt;/strong&gt; KISS. 3 tests. 1 sesión. Datos suficientes para tablas comparativas en posts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="por-qué-no-17-tests"&gt;Por qué no 17 tests&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Razón&lt;/th&gt;
 &lt;th&gt;Detalle&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Reinventamos HumanEval mal&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;HumanEval, SWE-Bench, LiveCodeBench ya existen con miles de modelos evaluados&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;akitaonrails&lt;/strong&gt; tiene rubric 0-100 con 8 dimensiones, automatizado, 50+ modelos&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Scoring subjetivo&lt;/strong&gt; no es reproducible — KISS exige binario (funciona / no funciona)&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Puzzles lógicos contaminados&lt;/strong&gt; — el de las cajas está en el training data de todos&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Contexto largo ya lo tenemos&lt;/strong&gt; — Anexo B con números hard&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Vision ya lo testeamos&lt;/strong&gt; — bazar-lab, 5 imágenes, 2 modelos&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;4 horas para blog posts&lt;/strong&gt; = ROI negativo&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;7 sesiones = procrastinación garantizada&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="lo-que-nadie-tiene-nuestro-diferencial"&gt;Lo que NADIE tiene (nuestro diferencial)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;✅ Benchmarks velocidad RTX 5080 — ya tenemos (Anexo A)&lt;/li&gt;
&lt;li&gt;✅ Offload por contexto 4K→128K — ya tenemos (Anexo B)&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Calidad en español&lt;/strong&gt; — NADIE testea esto. Los leaderboards son 100% inglés.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Decisión práctica &amp;ldquo;qué modelo para qué&amp;rdquo;&lt;/strong&gt; — necesitamos anécdotas reales&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="los-3-tests"&gt;Los 3 tests&lt;/h2&gt;
&lt;h3 id="test-1--coding-práctico-el-que-ya-funcionó"&gt;Test 1 — Coding práctico (el que ya funcionó)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Por qué:&lt;/strong&gt; Ya hicimos uno con qwen3-coder-30b (refactor Rust). Funcionó. Ahora lo repetimos con los demás.&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/plans/pwa-10-plan-2026-05-18/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/pwa-10-plan-2026-05-18/</guid><description>&lt;h1 id="plan-pwa-1010--de-7-a-casi-perfecto"&gt;Plan: PWA 10/10 — De 7 a casi perfecto&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-18
&lt;strong&gt;Proyecto:&lt;/strong&gt; &lt;code&gt;/home/pablo/dev/projects/pabloib&lt;/code&gt;
&lt;strong&gt;Puerto dev:&lt;/strong&gt; &lt;code&gt;1688&lt;/code&gt; (Hugo corriendo, PID 758190)
&lt;strong&gt;Modelo destino:&lt;/strong&gt; Cualquier modelo (instrucciones explícitas, sin ambigüedad)
&lt;strong&gt;Score actual:&lt;/strong&gt; 7/10 → &lt;strong&gt;Target:&lt;/strong&gt; 9.5/10&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="reglas-obligatorias"&gt;Reglas OBLIGATORIAS&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rutas absolutas SIEMPRE.&lt;/strong&gt; Nunca &lt;code&gt;../&lt;/code&gt; ni &lt;code&gt;./&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NO tocar&lt;/strong&gt; &lt;code&gt;/public/&lt;/code&gt;, &lt;code&gt;/static/css/output.css&lt;/code&gt;, &lt;code&gt;themes/paper/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NO usar &lt;code&gt;pkill -f &amp;quot;hugo server&amp;quot;&lt;/code&gt;&lt;/strong&gt; — mata todos los proyectos. Matar solo por PID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugo YA ESTÁ CORRIENDO en puerto 1688&lt;/strong&gt; (PID 758190). NO arrancar otro. Usar &lt;code&gt;kill 758190&lt;/code&gt; solo si necesitas reiniciarlo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leer archivo ANTES de editarlo.&lt;/strong&gt; Siempre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Después de cada fase:&lt;/strong&gt; ejecutar &lt;code&gt;npm run build&lt;/code&gt; y verificar 0 errors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commits:&lt;/strong&gt; Conventional Commits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NO hacer push&lt;/strong&gt; hasta el final.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pi-lens HTML formatter rompe Hugo comments &lt;code&gt;{{- /* ... */ -}}&lt;/code&gt;&lt;/strong&gt;: Si formateas HTML, ejecutar &lt;code&gt;git checkout -- layouts/&lt;/code&gt; después.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NO formatear archivos HTML&lt;/strong&gt; de layouts/ con herramientas automáticas.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="orden-de-ejecución"&gt;Orden de ejecución&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FASE 1 → Self-host fonts (ISSUE-005 + ISSUE-006) — el salto más grande (7→8)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FASE 2 → Iconos completos (ISSUE-012) — installability (8→8.5)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FASE 3 → Maskable + monochrome icons (ISSUE-011 + ISSUE-013) — (8.5→9)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FASE 4 → Install prompt + standalone detection (ISSUE-014 + ISSUE-015) — (9→9.5)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FASE 5 → Screenshots reales + Lighthouse audit — (9.5→casi 10)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FASE 6 → Build + verify + commit + push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="fase-1-self-host-fonts-issue-005--issue-006"&gt;FASE 1: Self-host fonts (ISSUE-005 &amp;#43; ISSUE-006)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;El problema:&lt;/strong&gt; Google Fonts y Material Symbols se cargan de CDN. Offline: sin tipografía, sin iconos. Todo se ve roto.&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/plans/pwa-fix-plan-2026-05-18/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/pwa-fix-plan-2026-05-18/</guid><description>&lt;h1 id="plan-corregir-15-issues-pwa--pabloibcom"&gt;Plan: Corregir 15 Issues PWA — pabloib.com&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-18
&lt;strong&gt;Fuente:&lt;/strong&gt; Auditoría PWA paranoid (Zero Trust, multinivel)
&lt;strong&gt;Proyecto:&lt;/strong&gt; &lt;code&gt;/home/pablo/dev/projects/pabloib&lt;/code&gt;
&lt;strong&gt;Puerto dev:&lt;/strong&gt; &lt;code&gt;1688&lt;/code&gt; (&lt;code&gt;hugo server --port 1688 --bind 0.0.0.0&lt;/code&gt;)
&lt;strong&gt;Modelo destino:&lt;/strong&gt; Cualquier modelo (instrucciones explícitas, sin ambigüedad)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="reglas-obligatorias"&gt;Reglas OBLIGATORIAS&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rutas absolutas SIEMPRE.&lt;/strong&gt; Nunca &lt;code&gt;../&lt;/code&gt; ni &lt;code&gt;./&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NO tocar&lt;/strong&gt; &lt;code&gt;/public/&lt;/code&gt; (se regenera con &lt;code&gt;hugo&lt;/code&gt;), &lt;code&gt;/static/css/output.css&lt;/code&gt; (generado por PostCSS), ni &lt;code&gt;themes/paper/&lt;/code&gt; (submódulo).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NO usar &lt;code&gt;pkill -f &amp;quot;hugo server&amp;quot;&lt;/code&gt;&lt;/strong&gt; — mata todos los proyectos. Matar solo por PID: &lt;code&gt;kill $PID&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verificar puerto libre&lt;/strong&gt; antes de arrancar: &lt;code&gt;ss -tlnp | grep 1688&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leer archivo ANTES de editarlo.&lt;/strong&gt; Si no leíste el archivo actual, no lo edites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Después de cada fase:&lt;/strong&gt; ejecutar &lt;code&gt;npm run build&lt;/code&gt; y verificar 0 errores.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commits:&lt;/strong&gt; Conventional Commits. Un commit por fase.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NO hacer push&lt;/strong&gt; hasta el final. Acumular commits y verificar todo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pi-lens HTML formatter rompe comentarios Hugo &lt;code&gt;{{- /* ... */ -}}&lt;/code&gt;&lt;/strong&gt;: Si formateas HTML, ejecutar &lt;code&gt;git checkout -- layouts/&lt;/code&gt; después para restaurar.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="orden-de-ejecución"&gt;Orden de ejecución&lt;/h2&gt;
&lt;p&gt;Las fases están ordenadas por dependencia. NO saltar fases.&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/plans/pwa-optimization-plan-2026-05-20/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/pwa-optimization-plan-2026-05-20/</guid><description>&lt;h1 id="pwa-optimization-plan"&gt;PWA Optimization Plan&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-20
&lt;strong&gt;Estado:&lt;/strong&gt; Pendiente de aprobación
&lt;strong&gt;Scope:&lt;/strong&gt; manifest.json, head.html, sw.js&lt;/p&gt;
&lt;h2 id="auditoría"&gt;Auditoría&lt;/h2&gt;
&lt;p&gt;Fuentes consultadas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;web.dev/learn/pwa (service workers, manifest, caching)&lt;/li&gt;
&lt;li&gt;MDN Web Docs (manifest spec, offline service workers)&lt;/li&gt;
&lt;li&gt;W3C Manifest Specification (w3c.github.io/manifest)&lt;/li&gt;
&lt;li&gt;Chrome Lighthouse PWA audit criteria (developer.chrome.com/docs/lighthouse/pwa)&lt;/li&gt;
&lt;li&gt;GitHub: justinribeiro/blog-pwa (Hugo + PWA reference)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resultado"&gt;Resultado&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Severidad&lt;/th&gt;
 &lt;th&gt;Count&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;CRITICAL&lt;/td&gt;
 &lt;td&gt;0 ✅ (instalabilidad cubierta)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;HIGH&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MEDIUM&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;LOW&lt;/td&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="corrección-vs-auditoría-inicial"&gt;Corrección vs auditoría inicial&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;apple-touch-icon&lt;/code&gt; YA EXISTE en head.html:216 → eliminado (falso positivo)&lt;/li&gt;
&lt;li&gt;Total real: 2 HIGH, 2 MEDIUM, 4 LOW&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="high-2--instalabilidadidentidad"&gt;HIGH (2) — Instalabilidad/identidad&lt;/h2&gt;
&lt;h3 id="pwa-1-falta-campo-id-en-manifest"&gt;PWA-1: Falta campo id en manifest&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Archivo:&lt;/strong&gt; &lt;code&gt;static/manifest.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuente:&lt;/strong&gt; W3C Manifest Spec + web.dev/learn/pwa/web-app-manifest&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problema:&lt;/strong&gt; Sin &lt;code&gt;id&lt;/code&gt;, Chrome usa &lt;code&gt;start_url&lt;/code&gt; como identidad de la PWA. Si &lt;code&gt;start_url&lt;/code&gt; cambia (ej. de &lt;code&gt;/?source=pwa&lt;/code&gt; a &lt;code&gt;/&lt;/code&gt;), la PWA se duplica en el dispositivo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Añadir &lt;code&gt;&amp;quot;id&amp;quot;: &amp;quot;/&amp;quot;&lt;/code&gt; antes de &lt;code&gt;start_url&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verificación:&lt;/strong&gt; &lt;code&gt;grep '&amp;quot;id&amp;quot;' static/manifest.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pwa-2-falta-meta-apple-mobile-web-app-title"&gt;PWA-2: Falta meta apple-mobile-web-app-title&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Archivo:&lt;/strong&gt; &lt;code&gt;layouts/partials/head.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuente:&lt;/strong&gt; web.dev + Safari Web Content Guide&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problema:&lt;/strong&gt; iOS muestra el nombre largo o la URL en home screen sin este meta tag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Añadir &lt;code&gt;&amp;lt;meta name=&amp;quot;apple-mobile-web-app-title&amp;quot; content=&amp;quot;PabloIB&amp;quot;&amp;gt;&lt;/code&gt; después de &lt;code&gt;apple-mobile-web-app-status-bar-style&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verificación:&lt;/strong&gt; &lt;code&gt;grep apple-mobile-web-app-title layouts/partials/head.html&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="medium-2--iconos"&gt;MEDIUM (2) — Iconos&lt;/h2&gt;
&lt;h3 id="pwa-3-sin-icono-maskable-de-192px"&gt;PWA-3: Sin icono maskable de 192px&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Archivo:&lt;/strong&gt; &lt;code&gt;static/manifest.json&lt;/code&gt; + nuevo &lt;code&gt;static/icon-maskable-192.png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuente:&lt;/strong&gt; web.dev — &amp;ldquo;provide maskable in 192+512&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problema:&lt;/strong&gt; Android usa maskable para adaptive icons. Solo existe 512px maskable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Generar &lt;code&gt;icon-maskable-192.png&lt;/code&gt; desde &lt;code&gt;icon-maskable-512.png&lt;/code&gt; con ImageMagick/convert + añadir entry al manifest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verificación:&lt;/strong&gt; &lt;code&gt;ls -la static/icon-maskable-192.png&lt;/code&gt; + &lt;code&gt;grep maskable-192 static/manifest.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pwa-4-iconos-legacy-redundantes"&gt;PWA-4: Iconos legacy redundantes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Archivo:&lt;/strong&gt; &lt;code&gt;static/manifest.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuente:&lt;/strong&gt; web.dev — &amp;ldquo;legacy sizes no longer necessary&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problema:&lt;/strong&gt; Iconos de 72, 96, 128, 144, 152px ya no se necesitan. Hacen el manifest más pesado sin beneficio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Eliminar iconos &amp;lt; 180px del manifest. Mantener 8 icons:
&lt;ul&gt;
&lt;li&gt;180 (apple-touch-icon)&lt;/li&gt;
&lt;li&gt;192 any&lt;/li&gt;
&lt;li&gt;192 maskable (nuevo, PWA-3)&lt;/li&gt;
&lt;li&gt;384&lt;/li&gt;
&lt;li&gt;512 any&lt;/li&gt;
&lt;li&gt;512 maskable&lt;/li&gt;
&lt;li&gt;192 monochrome&lt;/li&gt;
&lt;li&gt;512 monochrome&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verificación:&lt;/strong&gt; &lt;code&gt;cat static/manifest.json | python3 -c &amp;quot;import json,sys; d=json.load(sys.stdin); print(len(d['icons']), 'icons')&amp;quot;&lt;/code&gt; → debe dar 8&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="low-4--service-worker-refactor"&gt;LOW (4) — Service Worker refactor&lt;/h2&gt;
&lt;h3 id="pwa-5-cache-dinámico-fifo--lru"&gt;PWA-5: Cache dinámico FIFO → LRU&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Archivo:&lt;/strong&gt; &lt;code&gt;static/sw.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuente:&lt;/strong&gt; web.dev/learn/pwa/caching&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problema:&lt;/strong&gt; FIFO evicta páginas populares igual que las no visitadas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix:&lt;/strong&gt; En cada &lt;code&gt;cache.put()&lt;/code&gt;, hacer &lt;code&gt;cache.delete(request)&lt;/code&gt; primero y luego &lt;code&gt;cache.put()&lt;/code&gt;. Así las entradas accedidas recientemente quedan al final y sobreviven a la poda.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verificación:&lt;/strong&gt; Revisar que todas las funciones de caché hacen delete+put&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pwa-6-sin-ttl-en-cache-dinámico"&gt;PWA-6: Sin TTL en cache dinámico&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Archivo:&lt;/strong&gt; &lt;code&gt;static/sw.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuente:&lt;/strong&gt; web.dev/learn/pwa/caching — &amp;ldquo;when to cache&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problema:&lt;/strong&gt; HTML/JSON cacheados dinámicamente pueden servir contenido semanas viejo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Añadir timestamp en header custom (&lt;code&gt;x-cache-time&lt;/code&gt;) al cachear. En &lt;code&gt;caches.match()&lt;/code&gt;, comparar con &lt;code&gt;Date.now()&lt;/code&gt;. Si excede MAX_AGE → refetch.
&lt;ul&gt;
&lt;li&gt;HTML: 24h max age&lt;/li&gt;
&lt;li&gt;JSON (search index): 1h max age&lt;/li&gt;
&lt;li&gt;CSS/JS: sin TTL (se actualizan por SWR, PWA-7)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verificación:&lt;/strong&gt; Comprobar que &lt;code&gt;x-cache-time&lt;/code&gt; header aparece en respuestas cacheadas&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pwa-7-cachefirst--stalewhilerevalidate-para-cssjs"&gt;PWA-7: cacheFirst → StaleWhileRevalidate para CSS/JS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Archivo:&lt;/strong&gt; &lt;code&gt;static/sw.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuente:&lt;/strong&gt; web.dev/learn/pwa/caching — &amp;ldquo;serving while updating&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problema:&lt;/strong&gt; CSS/JS en cache-first puro no se actualizan hasta que el SW cambia de versión. Si un CSS cambia entre deploys, el usuario ve el viejo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Reemplazar &lt;code&gt;cacheFirst()&lt;/code&gt; para CSS/JS con &lt;code&gt;staleWhileRevalidate()&lt;/code&gt;: servir cache inmediatamente, fetch en background y actualizar cache. El usuario ve contenido rápido PERO se actualiza entre visitas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verificación:&lt;/strong&gt; En Playwright, servir CSS viejo desde cache, verificar que background fetch actualiza&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pwa-8-15-fonts-precacheados--cache-on-first-use"&gt;PWA-8: 15 fonts precacheados → cache-on-first-use&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Archivo:&lt;/strong&gt; &lt;code&gt;static/sw.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuente:&lt;/strong&gt; web.dev — &amp;ldquo;cache on first use, not on install&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problema:&lt;/strong&gt; &lt;code&gt;cache.addAll()&lt;/code&gt; descarga 15 woff2 (~200KB) antes de activar el SW. En 3G, retrasa el install.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Mover fonts de &lt;code&gt;STATIC_ASSETS&lt;/code&gt; a caché por primer uso. Las fonts son static assets → &lt;code&gt;staleWhileRevalidate&lt;/code&gt; las cachea al primer acceso. Solo precachear: CSS, JS, manifest, offline, favicon, placeholder (9 entradas vs 25 actuales).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verificación:&lt;/strong&gt; &lt;code&gt;grep -c woff2 static/sw.js&lt;/code&gt; → debe dar 0&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="orden-de-ejecución"&gt;Orden de ejecución&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PWA-1 + PWA-2&lt;/strong&gt; → 2 edits triviales en manifest.json + head.html&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PWA-3&lt;/strong&gt; → &lt;code&gt;convert&lt;/code&gt; para generar icon-maskable-192.png + edit manifest&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PWA-4&lt;/strong&gt; → limpiar manifest icons (eliminar 5 entradas legacy)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PWA-5 + PWA-6 + PWA-7 + PWA-8&lt;/strong&gt; → rewrite de cache strategies en sw.js&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build + Playwright verify&lt;/strong&gt; → 0 errores, SW registra, offline funciona&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="archivos-tocados"&gt;Archivos tocados&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;static/manifest.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;layouts/partials/head.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/sw.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/icon-maskable-192.png&lt;/code&gt; (nuevo)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="criterios-de-aceptación"&gt;Criterios de aceptación&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;manifest.json&lt;/code&gt; tiene campo &lt;code&gt;&amp;quot;id&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;head.html&lt;/code&gt; tiene &lt;code&gt;&amp;lt;meta name=&amp;quot;apple-mobile-web-app-title&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;icon-maskable-192.png&lt;/code&gt; existe y está en manifest&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Manifest tiene exactamente 8 icons (sin legacy)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; SW usa StaleWhileRevalidate para CSS/JS&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; SW usa LRU eviction (delete+put)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; SW tiene TTL para HTML (24h) y JSON (1h)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; STATIC_ASSETS tiene 0 fonts (solo CSS/JS/manifest/offline/favicon)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Hugo build: 0 errores&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Playwright: 0 console errors&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; SW registra correctamente en &lt;code&gt;?pwa=1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title/><link>https://pabloib.com/internal/plans/similar-prompt-repos-analysis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/plans/similar-prompt-repos-analysis/</guid><description>&lt;h1 id="análisis-de-repos-similares-sobre-prompting"&gt;Análisis de repos similares sobre prompting&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Fecha:&lt;/strong&gt; 2026-05-18
&lt;strong&gt;Origen:&lt;/strong&gt; Revisión de GitHub topics &amp;ldquo;prompt-engineering&amp;rdquo; y &amp;ldquo;prompt-library&amp;rdquo;&lt;/p&gt;
&lt;h2 id="-resumen-ejecutivo"&gt;&lt;span aria-hidden="true"&gt;📊 &lt;/span&gt;Resumen ejecutivo&lt;/h2&gt;
&lt;p&gt;He encontrado &lt;strong&gt;9 repos principales&lt;/strong&gt; que estudian el prompting desde diferentes enfoques:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;prompts.chat&lt;/strong&gt; (f/awesome-chatgpt-prompts) — La biblioteca de prompts más grande del mundo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PromptKit&lt;/strong&gt; (Microsoft) — Framework de prompts ingenieriles con componentes composables&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LangGPT&lt;/strong&gt; — Framework de prompts estructurados (10,000+ stars)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt Optimizer&lt;/strong&gt; — Herramienta de optimización de prompts con MCP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Awesome_GPT_Super_Prompting&lt;/strong&gt; — 3000+ stars: jailbreaks, security, adversarial prompting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Awesome-AI-Image-Prompts&lt;/strong&gt; — 1000+ prompts para generación de imágenes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentpedia Image Prompts&lt;/strong&gt; — 874 items con galería visual&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Langfuse&lt;/strong&gt; — Plataforma LLM con management de prompts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MLflow&lt;/strong&gt; — Plataforma AI con tracking de prompts&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="-top-repos-analizados"&gt;&lt;span aria-hidden="true"&gt;🏆 &lt;/span&gt;Top repos analizados&lt;/h2&gt;
&lt;h3 id="1-promptschat--la-biblioteca-de-prompts-más-grande-del-mundo"&gt;1. prompts.chat — La biblioteca de prompts más grande del mundo&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;URL:&lt;/strong&gt; &lt;a href="https://github.com/f/prompts.chat"&gt;https://github.com/f/prompts.chat&lt;/a&gt; (formerly Awesome ChatGPT Prompts)
&lt;strong&gt;Stars:&lt;/strong&gt; 143k+
&lt;strong&gt;Cita académica:&lt;/strong&gt; 40+ citas en Google Scholar
&lt;strong&gt;Reconocimiento:&lt;/strong&gt; Forbes, Harvard, Columbia University&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/postmortems/readme/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/postmortems/readme/</guid><description>&lt;h1 id="postmortems"&gt;Postmortems&lt;/h1&gt;
&lt;p&gt;Registro blameless de fallos, incidentes y sesiones donde el diagnóstico costó más de lo esperado.&lt;/p&gt;
&lt;p&gt;Inspiración: cultura SRE — documentar impacto, línea de tiempo, causa raíz, factores contribuyentes y acciones preventivas.&lt;/p&gt;
&lt;h2 id="formato-recomendado"&gt;Formato recomendado&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-md" data-lang="md"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Postmortem: Nombre
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Resumen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Impacto
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Línea de tiempo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Causa raíz
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Factores contribuyentes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Qué funcionó
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Qué no funcionó
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Acciones preventivas
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Cambios en runbooks/AGENTS/plans
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="regla"&gt;Regla&lt;/h2&gt;
&lt;p&gt;Un postmortem no busca culpables. Busca cambiar el sistema para que el fallo sea más difícil de repetir.&lt;/p&gt;</description></item><item><title/><link>https://pabloib.com/internal/runbooks/management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/runbooks/management/</guid><description>&lt;h1 id="runbook--gestión-de-pabloibcom"&gt;Runbook — Gestión de pabloib.com&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Objetivo: tener un set mínimo de comandos y rituales repetibles para operar el blog sin pensar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="tldr-lo-diario"&gt;TL;DR (lo diario)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/pablo/dev/projects/pabloib
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make deps &lt;span class="c1"&gt;# solo si cambió package-lock.json o entorno nuevo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Antes de commitear/pushear:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/pablo/dev/projects/pabloib
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make validate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="comandos-makefile"&gt;Comandos (Makefile)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make help&lt;/code&gt; — lista de targets.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make dev&lt;/code&gt; — Tailwind watch + Hugo server (ver &lt;code&gt;package.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make validate&lt;/code&gt; — valida contenido (front matter y estructura).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make build&lt;/code&gt; — build producción (&lt;code&gt;static/css/output.css&lt;/code&gt; minificado + Hugo &lt;code&gt;--minify&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make clean&lt;/code&gt; — limpia artefactos (&lt;code&gt;public/&lt;/code&gt;, &lt;code&gt;resources/&lt;/code&gt;, &lt;code&gt;static/css/output.css&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make audit&lt;/code&gt; — auditorías rápidas (stack + posts si aplica).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ritual-de-cambios-contenido"&gt;Ritual de cambios (contenido)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Pull por si el CMS remoto comiteó:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/pablo/dev/projects/pabloib
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Editar contenido en &lt;code&gt;content/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Validar + build.&lt;/li&gt;
&lt;li&gt;Commit (Conventional Commits) + push.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="ritual-de-cambios-layouttema"&gt;Ritual de cambios (layout/tema)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Evitar tocar &lt;code&gt;themes/paper/&lt;/code&gt; (submodule).&lt;/li&gt;
&lt;li&gt;Overrides solo en &lt;code&gt;layouts/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Si hay decisión de arquitectura: crear ADR en &lt;code&gt;/home/pablo/dev/projects/pabloib/docs/decisions/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notas"&gt;Notas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No editar &lt;code&gt;/home/pablo/dev/projects/pabloib/public/&lt;/code&gt; manualmente.&lt;/li&gt;
&lt;li&gt;Puerto dev actual (según README): &lt;code&gt;http://localhost:1315&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title/><link>https://pabloib.com/internal/runbooks/readme/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pabloib.com/internal/runbooks/readme/</guid><description>&lt;h1 id="runbooks"&gt;Runbooks&lt;/h1&gt;
&lt;p&gt;Procedimientos tácticos y repetibles. Un runbook debe reducir carga cognitiva: comandos concretos, pasos verificables, criterios de cierre.&lt;/p&gt;
&lt;h2 id="formato-recomendado"&gt;Formato recomendado&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-md" data-lang="md"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Runbook: Nombre
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Cuándo usarlo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Evidencia inicial necesaria
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Pasos
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Verificación
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Rollback
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Errores comunes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="runbooks-disponibles"&gt;Runbooks disponibles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RESOLVER-PROBLEMAS-SVELTIA-CMS.md&lt;/code&gt; — CMS no muestra posts, no guarda, falla auth/CSP o lanza errores de parsing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="runbooks-candidatos"&gt;Runbooks candidatos&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CONTENT-VALIDATION.md&lt;/code&gt; — validar Page Bundles, front matter y drafts.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DEPLOYMENT.md&lt;/code&gt; — build, push y verificación Cloudflare Pages.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CREATE-POST.md&lt;/code&gt; — crear post manual/CMS sin romper Sveltia.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>