Resumen de lo cerrado, lo que está en cola y lo bloqueado. Lo actualiza Claude cada sesión. Si ves algo desactualizado, pídele que lo cambie.
sec-ironcoach dentro del Index (vista desktop con sidebar lateral) y el archivo standalone IronCoach.html aparte (mobile-first con bottom-nav tipo app). Como el patrón de uso real es móvil para registrar y desktop para visión panorámica, se planteó opción A (widget-resumen del Index + enlace al standalone) que requería subir el standalone al mismo Cloudflare Pages para compartir localStorage por dominio. Tras explicar implicaciones técnicas, Guille decide opción D propia: descartar el standalone entero, quedarse SOLO con sec-ironcoach del Index aunque no tenga bottom-nav, y replicar el "polish-recipe" del Centro sesión 3 sobre Iron Coach. Cero standalone, una sola fuente de verdad. Pase 1 — polish base: bloques hermanos GSAP (stagger entry de cards .ic-weight-card, .card, .ic-meal-summary, .ic-level-card, .ic-stat, .roadmap-strip con stagger 0.04, duration 0.55, ease power3.out, clearProps:all + animateCounter 0→N en 16 IDs preservando prefijo/sufijo, mismo helper que el Centro) + VanillaTilt en widgets pequeños (max:8, scale 1.01, glare:false, perspective 1200, desactivado en touch); 18 emojis del HTML estático sustituidos por iconos Tabler webfont (ti-barbell, ti-home, ti-clipboard-list, ti-tools-kitchen-2, ti-user, ti-meat, ti-bowl-chopsticks, ti-leaf-2, ti-flame, ti-bolt, ti-target-arrow, ti-medal, ti-sparkles, ti-bulb); strip al pie de la sección con BUILD v48 + 3 KPIs (nivel/racha gym/kcal hoy) alimentados desde renderIronCoach(); fix crítico en línea 8246 cambiando textContent a innerHTML para que el icono Tabler del finish-btn sobreviva al render (si no, se reinyectaba el emoji 💪 cada vez que se llamaba renderIronCoach). Pase 2 — feedback Guille: 6 ajustes pedidos directos sin maquillaje, todos legítimos. (1) link "ver hoja de ruta" del strip de Iron Coach sobraba (en el Centro tiene sentido, aquí no); fuera, grid 3 → 2 cols. (2) Tabs HOY/RUTINA/COMIDA/PERFIL "sosos, iconos sin color" — cierto, los iconos Tabler estaban monocromos sin glow; segundo pase con color por data-ic-tab (HOY verde · RUTINA naranja · COMIDA dorado · PERFIL morado), icono 16px con drop-shadow tintado al hover (scale 1.1), activo glass tintado del color propio del tab con borde semitransparente y box-shadow glow. (3) "Tilt solo en peso corporal" — yo había metido .card grandes y .ic-food-card en el selector; .card grandes fuera (efecto 3D queda raro en cards anchas), solo se mantiene en widgets pequeños (weight-card, level-card, stat, meal-sum-cell, food-card). (4) "Macros pegada a Entreno" — bloque nuevo 1d ESPACIADO + POLISH PROFUNDO que aumenta gap del .ic-grid 14→18px, margin-top de .card 14→22px (anulando inline styles con !important), padding interno de cards a 20px, margin-bottom de tabs 18→22px. (5) Finish-btn verde chillón → rediseño glass: gradient con color-mix(in srgb, accent X%, transparent) 18%→6%, borde semitransparente 35%, icono ti-barbell a 20px con drop-shadow, hover con glow + el icono hace scale(1.15) rotate(-6deg). (6) RUTINA/COMIDA/PERFIL "sosos del todo" — polish profundo: día-activo glass tintado (no verde solid), botones plantilla con glass + tinte por variante, rangos PERFIL con glass background y gradient horizontal hacia --r-color en current, badges unlocked con glow dorado más fuerte + scale al hover, food-cards con hover verde + cursor pointer. Hallazgo "finish-btn no funciona": NO es bug, es estado persistido. icWorkout.finished se guarda en localStorage por día y se autoresetea cuando cambia todayISO() (línea 8348 en loadICWorkout). Guille lo había marcado en el test del pase 1, por eso el botón aparecía con cursor not-allowed. Acordado esperar a mañana (reset automático), sin tocar JS para evitar meter regresiones. Validación: HTML parse 0 errores, llaves CSS 1253/1253 balanceadas, tags <style> 1/1 y <script> 15/15 (eran 13 en v47, +2 nuevos bloques hermanos para sec-ironcoach), 11588 (v47) → 11961 (v48), +373 líneas netas. Aprendizajes canonizados v48: (a) los bloques hermanos (GSAP + Tilt) para distintas secciones son el patrón correcto en este Index — evita selectores monstruosos y aísla regresiones; (b) color-mix(in srgb, X N%, transparent) es la herramienta clave del "polish glass tintado" en este design system, sustituye gradients sólidos chillones por glass que respira; (c) textContent sobre elementos con HTML hijo (iconos Tabler) los borra silenciosamente — usar innerHTML cuando el contenido es <i> + texto, asumir que renderXXX() reescribe; (d) estado persistido por día (icWorkout.finished) genera "bugs" aparentes tras tests — informar al usuario antes de tocar lógica de reset; (e) tilt 3D en cards anchas queda visualmente raro, restringir a widgets pequeños como hace el Centro. Frente "Iron Coach Polish" cerrado al 100%. Lo que era "Fase 2 con standalone" (rings SVG, XP toasts, level-up burst, modal con presets) queda descartado por decisión de Guille. Lo que era "Fase 3" (propagación del design system al resto de dashboards) sigue en cola para sesiones siguientes.IronCoach.html usando la estética del Index"; lo que quería era "trabajar la sección sec-ironcoach que vive DENTRO del Index". Cagada confirmada por Guille, ~25% de contexto quemado en el archivo equivocado. Decisión inmediata: dividir el frente en fases para no quedarse a medias y para que la cagada no contamine el resto. Plan de fases acordado: Fase 1 (esta sesión) = refactor visual B+C+D solo CSS · Fase 2 (próxima sesión v48) = añadir features del standalone (rings SVG circulares, modal de comida con presets, XP toasts animados, level-up overlay con burst) · Fase 3 (v49+) = propagar al resto de dashboards (Pattnip, Communitas, Winrate, MedicoPC, Cursos, BuJo, Full Stack, IA, glosario, bitácora, check-in). Estrategia técnica Fase 1: en vez de tocar las ~840 líneas de definiciones originales de .ic-* (líneas 784-1755 del index), añadir un bloque de overrides al final del bloque "1b OVERRIDES B+C+D (v40)" con cabecera "1c OVERRIDES B+C+D · IRON COACH (v47)" (~410 líneas), siguiendo el mismo patrón quirúrgico que usó v40 para el Centro. Ventajas: cero riesgo de romper las definiciones base, fácil de revertir si algo no encaja, los selectores con prefijo #sec-ironcoach + !important donde toca evitan cualquier sangrado a otras secciones. Piezas trasplantadas: (1) header de la sección a glass con backdrop-blur 20px + saturate 140% + hover con borde verde; (2) tabs HOY/RUTINA/COMIDA/PERFIL a glass con tab activo en accent verde y glow; (3) .card dentro de sec-ironcoach a glass con hover translateY-2px + borde verde; (4) .ic-weight-card con tinte dorado glass premium + hover gold; (5) .ic-meal-summary, .ic-food-card, .ic-meal-row, .ic-stat todas a glass con sus hovers respectivos; (6) .ic-day-btn del editor de rutina a glass con activo verde glow; (7) .ic-level-card del perfil con tinte dorado glass premium (igual lógica que weight-card); (8) .ic-badge.unlocked con glass dorado premium, .ic-badge.locked con glass gris atenuado; (9) inputs de formularios (rutina + catálogo + meals) con focus accent glow; (10) pomo-btn dentro de Iron Coach (botones rápidos de comida) a glass. Tipografía propagada: labels, metas y valores numéricos en JetBrains Mono uppercase con letter-spacing 0.14em (patrón --bcd-mono-dim); nombres y títulos en Geist; ic-cal-num y stats values con font-variant-numeric tabular-nums para que no salten al actualizar. Lo que NO se tocó: cero cambios en HTML del cuerpo de sec-ironcoach (líneas 6178-6376), cero cambios en JS (todas las funciones de Iron Coach intactas), las definiciones base de .ic-* en sus tres bloques (HOY/RUTINA/COMIDA) quedan como fallback debajo de los overrides — si algún día se quita el bloque v47 todo vuelve al estado v46 sin perder nada. Validación: HTML parse 0 errores, llaves CSS balanceadas (1197 abren / 1197 cierran), tags <style> y <script> balanceados, 11178 (v46) → 11588 (v47), +410 líneas netas. Iron Coach standalone (IronCoach.html de v47 sesión, archivo erróneo) queda en outputs como referencia visual por decisión de Guille — no se enlaza desde el Centro. Frente "propagación B+C+D · Iron Coach Fase 1" cerrado al 100%. Quedan Fase 2 y Fase 3 en cola.guille-centro.netlify.app por "exceeded credit limit" del plan free — pantalla "Site not available" con CTA a Billing. Causa probable: sistema de créditos de Netlify (no solo ancho de banda, también minutos de build × decenas de pushes v23→v45 + bots rastreando la URL pública). Restauración automática hasta 1 jun, riesgo de repetición. Decisión: migrar a Cloudflare Pages (ancho de banda ilimitado + builds ilimitados en plan free, sirven el 20% de internet, absorber bots les es trivial). Opciones descartadas: GitHub Pages requiere GH Pro $4/mes para repos privados, opción de hacer el repo público rechazada, esperar al reset de Netlify sin migrar deja el problema sin resolver. Rescate de datos crítico: localStorage atado al dominio, los datos de Netlify NO se mueven solos al dominio nuevo. Backup del Centro local con botón 💾 (24KB JSON) + rescate de los datos de Netlify desde F12 → Application → Local Storage → guille-centro.netlify.app (13 claves cdm_* intactas aunque el sitio estuviera pausado, el navegador conserva localStorage independientemente del estado del servidor). Script de rescate: snippet de Console que itera localStorage, filtra claves cdm_* excluyendo snapshots/meta, empaqueta como {exportedAt, data:{...}} compatible con el botón 📥 Importar nativo, y descarga JSON con timestamp. Deploy en Cloudflare: cuenta ya existente (vinculada a communitasanimal.com + Worker mcp-personal) → Workers & Pages → Create application → Pages → Import existing Git repository → GitHub App Cloudflare Workers and Pages instalada con acceso solo a centro-de-mando (siguiendo principio de mínimo permiso) → Framework preset None (HTML puro, sin build) → Build command y output vacíos → branch main → Deploy. URL final: centro-de-mando-7hq.pages.dev. Bucle UX de Cloudflare: tras instalar la GitHub App, la pantalla de selección de repo no se refrescaba (bug visual conocido). Workaround: F5 + pinchar "Connect GitHub" otra vez, esta vez como ya estaba autorizado pasó directo al selector con centro-de-mando visible. Importación de datos: en la URL nueva, sidebar → 📥 Importar → JSON rescatado → "Importadas 13 claves" → reload → Centro completo restaurado. Solo Gastos vacío (probable detalle de formato en esa clave concreta, Guille decidió rellenarlo a mano antes que pelearse). App de escritorio reapuntada: la PWA instalada via Chrome → Install as app apuntaba a Netlify. Reinstalación desde la URL nueva + borrado del acceso directo viejo. Aprendizajes canonizados v46: (1) plan free de Netlify tiene créditos, no solo bandwidth — sitios con pushes frecuentes + URLs públicas + bots agotan cuota; (2) Cloudflare Pages es la alternativa correcta para HTML estático con repos privados gratis; (3) localStorage sobrevive a la pausa del servidor — F12 funciona como ruta de emergencia; (4) la GitHub App de Cloudflare tiene un bucle visual tras la primera autorización, F5 lo resuelve. Cierre: Centro v45 ya desplegado en Cloudflare desde el push de anoche, app de escritorio funcionando, sin sustos de cuota a futuro.worldmonitor.app (la herramienta de Elie Habib, ex-CEO Anghami, que tiene globo 3D Three.js + 65+ fuentes + AI briefs + cámaras live). Bloqueo: worldmonitor.app envía X-Frame-Options: DENY, el iframe se queda en gris con icono de documento roto. Pivote: hacer un "homenaje" multi-fuente con piezas que sí se dejan embeber, ~15-20% de la funcionalidad del original. Stack final añadido: globe.gl desde jsdelivr (wrapper de Three.js, ~120kb) — no requiere cargar Three aparte. Layout: header con DEFCON 4 + reloj UTC vivo (segundo a segundo) · fila 1 con globo 3D (3fr) + panel TOP 8 países por índice de inestabilidad (1fr) · fila 2 con Liveuamap full width · fila 3 con Windy embed + lista USGS terremotos · fila 4 con 3 webcams YouTube · footer CTA gigante al worldmonitor.app real. Globo 3D: earth-dark.jpg de three-globe + atmósfera azul + 14 puntos pulsantes (8 hotspots con score + 6 zonas de monitoreo) · capa de rings propagándose desde cada punto con velocidad y tamaño según tier (crítico/alto/medio) · auto-rotación lenta 0.4 · controles completos rotación libre 0–π polar · vista inicial lat 0 lng 30 altitude 3.5 con re-centrado a 400ms para evitar bug de dimensiones 0 al init. Panel hotspots: Rusia 89 / Irán 85 / Ucrania 82 / Sudán 78 / Yemen 72 / Siria 68 / Líbano 60 / Myanmar 58, con barras coloreadas por tier. USGS terremotos: el iframe del mapa daba problemas, pivote a fetch del GeoJSON público 2.5_day.geojson y render de lista con magnitud (color según tier), lugar, hora "ago" — más útil que el iframe. Sidebar: grupo nuevo "Vigilar" con botón rojo c-red (clase ya existía en CSS desde antes, solo se aplicó) — el routing entre secciones se enganchó automático por el patrón data-section="vigilancia". YouTube embeds frágiles: live_stream?channel=ID falla cuando el canal no está emitiendo en vivo (Error 153). Pivote a IDs específicos de webcams 24/7 estables (Shibuya Tokyo, Brooklyn→Manhattan, Jackson Hole) con botón ↗ siempre visible para fallback. Aprendizajes técnicos canonizados: (1) X-Frame-Options/CSP bloquea casi todos los dashboards comerciales — verificar antes de prometer iframes; (2) globe.gl con flex:1 en contenedor da dimensiones 0 al init y el globo aparece descentrado, usar altura calc/fija; (3) YouTube live_stream?channel= es inherentemente frágil para producción, video IDs directos son más estables; (4) USGS GeoJSON público es la forma robusta de mostrar terremotos sin iframe. Honestidad con Guille: aclarado al principio que worldmonitor.app es trabajo de un equipo full time durante un año, no se iguala en una sesión — la versión homenaje es ~15-20% del original pero pulida y útil. Validación: HTML parse 0 errores, 10408 (v44) → 11178 (v45), +770 líneas netas, 13 scripts sin errores de sintaxis. Frente "Vigilancia · Mundo" cerrado al 100%..r-fav (estrella vacía ☆ por defecto, llena ★ con .is-fav, animación favPop), JS de toggle con persistencia en localStorage.centroFavs (array de URLs), y repintado de marcadas al cargar. Lo único que faltaba era que el grid de atajos del Centro leyera esos favoritos. Pieza nueva: bloque "Atajos personalizables" (~70 líneas JS) con función renderShortcuts() que lee centroFavs, busca cada URL favorita en #sec-recursos .res-link para extraer emoji (.r-ico) y nombre (.r-name), y rellena hasta 8 slots; si quedan huecos, completa con 4 atajos fijos de fallback (Bootcamp ⚡ / Gemini IA 💎 / Gmail 📧 / YouTube ▶️) sin duplicar URLs. Decisión arquitectónica C+ con relleno: favoritos primero, fallback rellena hasta 8, así el día 1 (sin favoritos) ves los 4 fijos y según marcas estrellas el bloque se rellena con lo tuyo — coste cero de UX inicial. HTML: grid de 4 hardcoded sustituido por <div id="shortcutsGrid"> vacío que rellena el JS. CSS: nth-child rotando 4 colores (orange/cyan/pink/gold) ahora en 8 slots con :nth-child(8n+N) + soporte emoji nativo en .shortcut-icon con glow tintado del color del slot vía filter: drop-shadow(color-mix(--s-color, transparent)). Integración: el callback del toggle de ★ en Recursos ahora llama a window.cdmRenderShortcuts() tras guardar — cambio instantáneo en el Centro sin recargar. Bug cazado y corregido en vivo: la primera versión usaba selector [href="${url}"] (atributo literal del HTML) pero el sistema de favoritos guarda con card.href (URL normalizada por el navegador que añade / a dominios). Resultado: los favoritos guardados con / no matcheaban con los atributos sin /, render solo pintaba el fallback. Fix: Array.from(...).find(c => c.href === url). Validación: HTML parse 0 errores, 10342 (v43) → 10408 (v44), +66 líneas netas, 11 scripts sin errores de sintaxis. Verificado por Guille en console: marcó 2 favoritos (Claude, Lovable), aparecen como atajos 1-2, fallback rellena slots 3-6. Frente "atajos personalizables" cerrado al 100%..schedule th/td/.row-label + key huérfana schedule: 'cdm_schedule_v1' del objeto STORAGE + localStorage.removeItem('cdm_schedule_v1') idempotente añadido tras STORAGE para limpiar el navegador. GSAP activado: stagger de entrada en 24 cards (widgets + today-cards + shortcuts + cal-days + countdowns + roadmap-strip) con y:24, duration:0.55, stagger:0.04, ease:power3.out, clearProps:all + contadores animados 0→N en 10 IDs (wCheckin, wStreak, wTasks, wTasksDone, todayGastosTotal, todayIdeasCount, cd1..cd4) con helper que preserva prefijo/sufijo (mantiene " días", " €", "d"). Disparo con setTimeout(150) para dar tiempo a renders iniciales. VanillaTilt activado en 20 cards (widgets + today-cards + cal-days + countdowns) con max:8, speed:400, glare:false, scale:1.01, perspective:1200, desactivado en touch. 14 emojis sustituidos por iconos Tabler webfont en el Centro (🏠⏰📅🔥✅⭐💪💰💡📚⚡💎📧▶️ → ti-home/clock/calendar-event/flame/checks/star-filled/barbell/coin/bulb/book/bolt/diamond/mail/brand-youtube). Iconos coloreados + glow tintado: widgets heredan --w-color, today-cards heredan --tc-color, atajos con 4 colores por nth-child (orange/cyan/pink/gold) + scale 1.08 al hover. Lenis descartado: el scroll real vive en <main> (html/body con overflow:hidden), Lenis sin wrapper bloqueaba scroll entero — coste-beneficio negativo en un panel no narrativo. tsParticles descartado: hay polvo casero (~50 líneas vanilla, canvas #particles-bg, 40 puntos con --particle-color) que ya cumple esa función con coste cero. Hoja de ruta strip al pie del Centro: card glass horizontal con 3 KPIs (34 cerrados / 4 en cola / 100% frente 1) + meta "BUILD v43 · FRENTE 1 CERRADO" + link a esta hoja, responsive 720px apilado. Validación: HTML parse 0 errores, 9773 (v42) → 10342 (v43), +569 líneas netas. Frente 1 al 100%. Centro listo como design system maestro para propagar a los dashboards.cdm_tasks_v1) no tienen campo fecha — Guille decidió quitar esa fuente del calendario (opción A) en lugar de inventar shapes o forzar un campo nuevo. Resultado: 2 fuentes automáticas + 1 manual, no 3 fuentes como originalmente. Fuente check-in dominical 17:00: punto verde fijo cada domingo. Fuente entreno IronCoach: lee ironcoach:state.currentPhase y pinta el split correspondiente (Push/Pull/Legs en phase1, Push A/B + Pull A/B + Legs en phase2+) en cada día. Fuente eventos manuales: CRUD completo via modal glass (título + fecha + hora opcional + 4 colores), storage propio cdm_calendar_events_v1, click en evento → editar/borrar. Diseño: cards de día con --bcd-glass-bg + borde radius 12px + hover lift -2px con borde verde + glow · día actual con acento lateral 3px verde + número grande con text-shadow tintado · dots de 6px con glow del color · leyenda check-in/entreno/manual al pie · responsive 720px a 2 columnas. Validación: HTML parse 0 errores, 9773 → 10151 líneas (+378), tabla schedule eliminada, JS huérfano que iteraba la tabla eliminado también. Storage cdm_schedule_v1 queda huérfano (no se lee ni se escribe). Deuda mínima: CSS legacy .schedule th/td (~30 líneas) sigue en el bloque global pero no rompe nada (selectores muertos). Limpieza en sesión 3 polish. Frente 1 sube al ~75%.#sec-centro de las 5 today-cards (Prioritarias / Entreno / Gastos / Ideas / Formación): glass cards con backdrop-filter: blur(20px) saturate(140%) + borde radius 16px + padding 18px + min-height 152px · acento lateral de 3px con --tc-color (gold/pink/orange/cyan/cyan según nth-child, manteniendo identificador visual de cada card) · hover lift -2px con borde verde --bcd-glass-border-hover y glow · cabecera .lbl con letter-spacing 0.14em y color --bcd-mono · números grandes con text-shadow tintado de --tc-color y font-variant-numeric: tabular-nums · barras .today-bar más finas (4px) con glow del color · botón "Revisar →" de ideas en estilo glass cyan · responsive 720px con today-grid en 1 columna. Cero HTML modificado, 100% override CSS con selector #sec-centro .today-*. Decisión clave de la sesión sobre el Horario Semanal: tras tres opciones presentadas (A skin, B simplificada, B completa), Guille pidió B completa — sustituir la tabla 4x7 contenteditable por calendario nuevo con cards de día + dots de eventos automáticos de 3 fuentes (tareas con fecha del Centro, check-in dominical 17:00 fijo, entrenos planificados de IronCoach) + UI para añadir eventos manuales. Ejecución aplazada a sesión 2b en chat NUEVO (decisión de Guille: cerrar limpio aquí en zona verde para no tirar la decisión a un cierre amarillo). Validación HTML parse 0 errores, +104 líneas (de 9669 a 9773). Subimos del ~40% al ~50% del frente 1.<head> (Tabler Icons + GSAP + VanillaTilt + Lenis, ~85kb gzip vía jsdelivr) · 18 variables CSS --bcd-* añadidas a :root dark Y light (conviven con las viejas) · .layout reestructurado a grid 2 filas (34px top bar + 1fr) con grid-areas · <header class="top-bar"> nuevo cruzando sidebar+main con dot ONLINE pulsante verde, badge "PLAN A · FULL STACK", reloj vivo y fecha en JetBrains Mono uppercase. 1b (override visual #sec-centro): aurora animada global (3 manchas radiales blureadas con drift 28s) · spotlight cursor (radial 260px verde sigue el ratón vía requestAnimationFrame, desactivado en touch) · hero glass card (Geist 30px + sub JetBrains Mono) · widget HORA grande oculto (redundante con top bar) · 3 widgets restantes en glass cards con stat-num gigantes coloreados (cyan/naranja/morado) + lift+borde verde al hover · atajos rápidos en glass card grid 4 cols con mismo patrón hover. Estrategia quirúrgica: CSS puro sólo, cero HTML modificado del cuerpo Centro (solo se añadió <header> y los overrides van con selector #sec-centro para no afectar otras secciones). HTML parsea limpio, tags balanceados, validado por Guille en navegador.<head> preparado en HANDOFF v39 listo para copiar-pegar al arrancar producción..res-link que tenía r-arr pero NO tenía r-fav, se insertó el span <span class="r-fav" role="button" aria-label="Marcar favorito"></span> antes del r-arr. 126 cards modificadas exactamente. Resultado: 169/169/169 (cards/estrellas/flechas). CSS y JS de favoritos ya estaban globales desde v37 sin necesidad de tocar, solo se añadió el span en HTML. Frente entero de "estrella en Recursos" CERRADO al fin (era el último resto del frente v37)..r-name) y descripción (data-desc). Normaliza tildes y mayúsculas (NFD + lowercase). Oculta cards no coincidentes Y también las categorías cuyas cards estén todas ocultas. Botón ✕ para limpiar (solo visible si hay texto). Tecla Esc también limpia. Contador en vivo: "48 de 169 herramientas" / "0 resultados" en verde. Mensaje "Ningún recurso coincide" en caja punteada cuando vacío. Placeholder explícito. CSS con variables del index (respeta tema claro/oscuro). +144 líneas additivas (sin tocar nada existente). Balance llaves CSS = 0. JS valida con new Function() sin errores.res-link existente sin tocar CSS de las 126 viejas. Reparto: 🤖 Chat +2 · 🤖 Código +3 · 🤖 Imagen/vídeo/voz +5 · 🤖 Estudio +1 · 💻 Desarrollo +8 · 🎓 Formación +4 · 🎨 Diseño +7 · ✍️ Escritura (categoría nueva, 5 cards) · 💼 Trabajo Plan B +7 · 📱 Personal +1. Header actualizado ~125 → ~168 enlaces. Cada card nueva lleva una ☆ a la izquierda de la flecha ↗: click → ★ dorada, persiste en localStorage con clave centroFavs. Las 126 viejas siguen exactamente igual (estrella en ellas queda pa próxima sesión). +123 líneas en index, balance de llaves CSS = 0, JS parsea limpio. Filtro venta activa respetado: fuera Taplio/Waalaxy/Dripify/Supergrow/ViralBrain/Raycast.res-link actual. Filtro de aversión a venta activa aplicado limpio (fuera 8 herramientas de outreach masivo). Material listo que se ejecutó en v37.dashboard_communitas.html, dashboard_cursos.html y medicopc_docs.html ya tenían back-link al Centro (textos diferentes: "← Centro de Mando" / "← Centro" / "← volver al Centro"). Decisión v33 confirmada: NO unificar los 3 textos.chocitagaming-artguille-personal privada") ya estaba cumplido. La cuenta privada del Centro es chocitagaming-art (existe desde v24, primer push). El plan v34 mencionaba un guille-personal nuevo, pero Guille aclaró que es el mismo concepto y ya está montado. Pieza 4/4 del plan backup v34 oficialmente cerrada. Ritual git push dominical sigue vigente.Sem X / 30 · Fase Y · Z% · A/B tareas con barra de progreso. Patrón canonizado: post-it compartido entre archivos del Centro. dashboard_fullstack.html escribe en localStorage la key cdm_fullstack_summary tras cada cambio (saveState + renderHeader). El index lee y renderiza. Cero duplicación de lógica entre archivos, escalable a futuras cards (Iron Coach, Marca, Cursos). +84 líneas en index, +37 en dashboard_fullstack. Validado sintaxis JS en ambos. Push hecho.--gc verde del padre): blindado con setProperty('color', ..., 'important'). Balance 0 = gris neutro. (2) Histórico mensual con altura mínima 6% para barras con valor > 0: evita que barras pequeñas (132€ de gasto) queden aplastadas frente a barras enormes (4780€ de ingreso). Commit conjunto, push hecho.dashboard_IA.html entre "Plan por fases" y "Cómo trabajo": card dorada con el Asistente IA personal como hito final de la especialización. Lleva pitch en una frase, por qué es Plan B y no parche, los 3 criterios para que sea 10/10 de CV (historia, demo 60 seg, README serio) y estado. +135 líneas, commit f702c05. Cierra el "contenido pendiente de meter" que arrastraba Banco de Ideas.3281c47. Quedan Fase 2 (recurrentes) y Fase 3 (presupuestos) en cola..layout. Fix: mover #backdrop dentro de .layout para compartir contexto con el aside. Validado en DevTools móvil.guille-centro.netlify.app en vivo, deploy automático desde GitHub. Desbloqueó Marca en vivo, móvil y PWA. Datos migrados con backup + import.git add . && git commit -m "update [fecha]" && git push con fecha auto. Feedback 1.4s.chocitagaming-art/centro-de-mando · 15 archivos versionados · ritual git push dominical activo./showcase con datos fake reales que enseña el Centro funcionando sin exponer vida privada. Más README serio del proyecto (arquitectura, decisiones, capturas) + vídeo demo 60s. Convierte el Centro en proyecto bandera de CV por encima de Pattnip/Communitas (regla v32: historia + demo + README = 10/10). Nota v39: con el rediseño B+C+D el modo escaparate va a quedar MUCHO mejor visualmente, mejora el atractivo del vídeo demo.dashboard_IA.html, no depende de esto.res-link le gusta, no quería romper lo que funcionaba. Material listo si algún día se quiere recuperar (CSS y propuesta en HANDOFF v36). Por defecto NO se ejecuta — Guille decide si lo descarta del todo o lo reactiva.