El registro de trabajo
Lo que estoy construyendo, lanzando, leyendo y compartiendo. Actualizado cada par de semanas.
ago 2026BUILDVitals: el camino para que el teléfono lea los datos de salud por su cuenta, opens in new tabSe construyó la tubería para que el teléfono lea los datos de salud directamente del almacén de salud de Android y los envíe al dashboard — la pieza que a futuro elimina al intermediario entre el reloj y la app. Leer ese almacén requiere código nativo, así que la app pasó a una compilación de desarrollo propia que sí lo permite. Se añadió un traductor que convierte el formato de Android al del dashboard, con pruebas detrás; el permiso para enviar datos quedó separado del que se usa para notificaciones, de modo que cada uno se administra por su cuenta; y hay una pantalla de diagnóstico que muestra una sincronización paso a paso. Dos preguntas de diseño pasan por la revisión de diseño antes de que esto llegue a una pantalla de usuario. Lo siguiente es manual: instalar la app y confirmar que los datos llegan.
ago 2026BUILDVitals: primera app de Android instalable, opens in new tabLa app dejó de ser código y pasó a ser un archivo que se instala en un teléfono: la primera compilación de Android salió en verde. Llegar ahí pidió cuatro pasadas de ajuste sobre los cimientos del proyecto — íconos generados con una herramienta de verdad, la configuración de empaquetado devuelta a sus valores estándar, las dependencias que faltaban declaradas, y la autoverificación de fechas y horas conectada para que también corra en las compilaciones reales y no solo en desarrollo. Con eso, la comprobación de zona horaria ya corre dentro de la app instalada y el riesgo que abría esta fase queda cerrado para Android.
ago 2026BUILDVitals: arranca la app de teléfono — primero Android, iPhone después, opens in new tabArrancó la app de teléfono. Una decisión quedó tomada y escrita de entrada: por ahora solo Android — no hay un iPhone aquí para probar, así que iPhone espera su turno. Antes de escribir la app se probó en un dispositivo real lo que más importa en un dashboard de salud: que las fechas y las horas sean exactas. El dashboard muestra todo en hora de Panamá, y los teléfonos manejan zonas horarias con un componente que algunas compilaciones traen recortado para ahorrar espacio. El formateo de hora se reescribió para no depender de él en absoluto, y las doce comprobaciones pasaron en el teléfono, no en un simulador. El esqueleto de la app ya está de pie: cuatro pestañas abajo y la navegación funcionando.
jul 2026SHIPVitals: los datos de salud ahora coinciden con el reloj, y el peso entra por primera vez, opens in new tabUna pasada de precisión sobre los datos que alimentan el dashboard. Los datos de sueño ahora se guardan bajo el mismo día que usa Google, que los fecha según la mañana en que te despiertas — el dashboard los fechaba según la noche en que te dormiste, y ahora ambos hablan el mismo idioma. El dato de recuperación cardíaca pasó a leerse del resumen diario oficial en vez de un flujo crudo, y ahora coincide con lo que muestra la app del reloj: 273.6 contra 274. El peso y la grasa corporal quedaron conectados a la sincronización por primera vez. Y la conexión con Google ahora avisa cuando algo no llega, en lugar de dar por buena una respuesta vacía: cualquier hueco futuro se ve de inmediato.
jul 2026SHIPVitals: base lista para las apps nativas — un solo repositorio, datos con origen controlado, opens in new tabDos piezas grandes quedaron terminadas y funcionando en producción. Primero: todo el código se reorganizó en un monorepo — la web y las futuras apps de teléfono ahora viven juntas y van a compartir lógica en vez de duplicarla. Segundo: la puerta de entrada de los datos de salud ahora reconoce de qué fuente viene cada dato y decide qué hacer con él — escribirlo, observarlo en paralelo o descartarlo — lo que permite migrar de la web a las apps por etapas, sin perder ni duplicar nada. Once mejoras en total, todas verificadas en producción.
jul 2026SHIPSolaar: routing de modelos fijado a Claude Opus 5 / Sonnet 5, con ajuste de esfuerzo por agente, opens in new tabLa asignación de modelo de cada agente ahora se resuelve contra el catálogo vivo de Claude en vez de una suposición desactualizada: opus → claude-opus-5, sonnet → claude-sonnet-5, cada uno ajustado con su propio nivel de esfuerzo — xhigh para agentes de generación de código, high para agentes de razonamiento profundo, medium para síntesis y reportes. El agente de Seguridad incorporó un fallback de rechazo obligatorio, ya que los clasificadores de ciberseguridad más fuertes de Opus 5 pueden fallar en trabajo legítimo de threat-modelling. Detecté mi propia regresión en scripts/lint-model-routing.py antes del merge — una tabla reformateada rompió el chequeo de pre-push que cruza el tier de cada wrapper de agente — y luego empujé la política de routing actualizada a los 16 proyectos inscritos.
jun 2026SHIPSolaar: nuevo agente Creative Director, separado de UX, opens in new tabUn nuevo agente Creative Director ahora corre la ideación creativa — mood, metáfora, dirección visual — antes de que UX operacionalice la dirección elegida en tokens y specs. Genera tres direcciones divergentes, el Architect corre un análisis de viabilidad, y un nuevo Checkpoint 1.5 fija la dirección antes de que arranque el trabajo de UX. La Regla 10 ahora traza un límite duro: UX no debe inventar la dirección creativa desde cero, y el Creative Director no debe definir tokens ni specs de componentes.
jun 2026SHIPVitals: navegación por línea de tiempo, en todo el sistema, opens in new tabCada métrica de salud ahora se mueve por fecha, no solo la foto de hoy. Sueño, ritmo cardíaco, actividad, cuerpo — un solo modelo de navegación en toda la app.
jun 2026SHIPSolaar: background-claim-gate de la Regla 19, iniciativa Mac mini self-hosted, opens in new tabRegla 19 codificada y forzada: un hook Stop lee el transcript del turno y bloquea cualquier respuesta que afirme que un trabajo está 'corriendo en segundo plano' cuando no se lanzó ninguna tarea real — las afirmaciones async fantasma ya no pueden pasar. El mismo gate fue endurecido contra falsos positivos en meta-discusión. También se abrió la iniciativa del Mac mini self-hosted: plan de adopción del estratega, varias revisiones del arquitecto, y un starter kit de home-infra para correr un LLM localmente con fallbacks cloud rankeados de Cloudflare Workers AI / AI Gateway.
jun 2026SHIPVitals: seguimiento de siestas, opens in new tabLas siestas ahora se ingieren y se muestran de extremo a extremo. El backend las retiene como hermano sleep.naps[] en vez de mezclarlas en el bloque principal de sueño, preservando la distinción entre sueño nocturno y siestas diurnas. La UI las expone como línea de siesta en el tile, una tarjeta de siestas en /sleep y una tendencia — entregado contra un veredicto de UX que definió cómo deben leerse las siestas junto al sueño principal de la noche.
jun 2026SHIPSolaar: hook worktree-gate, migración a labeler v5, opens in new tabUn hook worktree-gate ahora bloquea escrituras que escapan de un worktree de git hacia el checkout principal — cerrando la clase de error 'escribí en main, no en el worktree', que resultó ser un problema de renderizado de ruta absoluta, no de CWD. También se migró labeler.yml al esquema actions/labeler@v5 (label → changed-files → any-glob-to-any-file).
jun 2026SHIPSolaar: harness de regresión de comportamiento, auto-labeler de PRs, registro SECRETS, topes de blast-radius en Sentinel, opens in new tabLas reglas se volvieron testeables. Un harness de regresión de comportamiento corre escenarios contra las Reglas 10/11/12 para que un fix no pueda regresar en silencio — con correcciones multiplataforma para crashes de hooks en Windows, piping de prompts por stdin y auth de suscripción. Entregado junto a: un auto-labeler de PRs por ruta de archivo modificado, un registro SECRETS.md, configuración de stale-bot, un chequeo advisory de doc-drift en pre-push, una plantilla de PR específica por regla, y topes de blast-radius en Sentinel con un nuevo comando health-all.
jun 2026SHIPVitals: detección de ronquidos en dispositivo, reconexión Fitbit de 3 estados, corrección SpO₂, opens in new tabDetección de ronquidos de primera mano que corre 100% en el dispositivo — YAMNet TFLite en el watcher de Android clasifica el audio sin subir nada (Fase 6), conectado en el dashboard como esquema, tipos, ingest y señal del briefing matutino, luego expuesto como toggle de ajustes y línea en el tile de sueño. Reconexión de Fitbit reconstruida como UI de conexión de 3 estados con botón de reconexión que se transforma y seguimiento de revocación de token. SpO₂ corregido para leer el resumen daily-oxygen-saturation, alineado con el soporte de métodos de la especificación.
jun 2026SHIPSolaar: hooks PreToolUse pr-push-gate y secret-read-gate, gates advisory para Reglas 17/5b/16, opens in new tabTres reglas de incidentes de producción recibieron enforcement mecánico. pr-push-gate rechaza un push a una rama fusionada o equivocada; secret-read-gate bloquea lecturas de archivos .env antes de que ocurran. Se añadieron gates advisory para la Regla 17 (validar hechos contra la fuente), la Regla 5b (leer antes de preguntar) y la Regla 16 (los planes no se guardan hasta estar en git), más un checklist de Windows, telemetría, backfill de tests y una pasada de lint de Python.
jun 2026SHIPVitals: corrección de timing del briefing nocturno, 10 hojas explicativas de métricas, opens in new tabEl briefing nocturno tenía un bug de timing — la generación corría antes de que llegaran los datos durante la noche, produciendo reportes vacíos; se corrigió el timing y se reactivó la ingestión de Google Health. Diez métricas recibieron hojas explicativas con ícono de info, para que un número como HRV o esfuerzo venga con una explicación en lenguaje claro de qué significa y por qué importa. También se escribió el spec/plan/tareas de detección de ronquidos que se entregó cuatro días después.
jun 2026SHIPSolaar: endurecimiento del design-extractor, CI con lint-wrap, opens in new tabSe quitó la herramienta Bash del agente design-extractor — parsea enlaces compartidos y escribe tokens, así que el acceso a shell era superficie de ataque innecesaria — y se añadió un paso lint-wrap a CI para estandarizar cómo corre el lint en toda la flota de agentes.
jun 2026SHIPVitals: Diario de Ciclo + Registro Diario, tercera pasada de traducción, Coach con locale, opens in new tabNueva función de Diario reconstruida fielmente desde un diseño ZIP — Diario de Ciclo y Registro Diario con tarjeta de fase, banner de fase, ilustraciones SVG de escala Bristol, renombrado de cycle-mood y conexión completa a la API (más una corrección de migración que elimina un prefijo public. sobrante). La tercera pasada de i18n tradujo navegación, tendencias, tarjetas, recuperación, pasos/activo/calorías, niveles de esfuerzo y etiquetas intradía — y el Coach ahora recibe el locale del usuario para responder en su idioma. También se conectó un botón de sync de Fitbit muerto en SettingsSheet.
jun 2026SHIPVitals: soporte de español — infraestructura + primeras dos pasadas de traducción, opens in new tabSe levantó el i18n completo al español desde cero: infraestructura más la capa de UI, luego una segunda pasada que cubrió cuerpo, entrenamientos e insights. Siguieron correcciones de QA — atributo html lang, etiquetas de corazón — junto a dos arreglos de fiabilidad: proteger los deltas de NightSnapshot ante noches no consecutivas, y mostrar el briefing de la noche anterior después de medianoche en vez de un estado en blanco.
jun 2026SHIPVitals: Recovery Ring, Motor de Esfuerzo, Monitor de Estrés, opens in new tabTres días, una transformación. Puntaje de recuperación (0–100) calculado desde HRV, FC en reposo y sueño — mostrado como un anillo luminoso en Today. Motor de esfuerzo completo en escala 0–21 con gráfico intradiario cada 15 minutos. Monitor de Estrés que clasifica el estado autonómico (Óptimo / Equilibrado / Bajo). Assessments semanales: resumen de 7 días, Índice de Healthspan e Insights de Correlación. La frecuencia respiratoria tenía tres bugs apilados — filtro incorrecto, parser equivocado, desfase de zona horaria que descartaba datos de las 10 PM Panamá fuera de la ventana UTC. Todo corregido, dos semanas rellenadas. Coach reconstruido como chat real: anclado abajo, tablas markdown.
jun 2026SHIPSolaar: Reglas 16–18, routing gate estructural, pr-state-gate.py, corrección sync lefthook, opens in new tabTres reglas codificadas desde tres incidentes reales: los planes no comprometidos en git son invisibles para cualquier otra herramienta; nunca afirmar un hecho de API por inferencia — leer la especificación; el orquestador coordina, no implementa — ahora forzado por routing-gate.py, un hook que bloquea ediciones de archivos fuente si no se ha invocado el agente especialista correcto. También: pr-state-gate.py reemplaza el script bash en Python puro (sin WSL), y el script de sync fue corregido para no propagar lefthook.yml a los 14 repos hijo.
may 2026SHIPVitals: rediseño completo con Claude Design — 50 pull requests, marca ring+pulse, WCAG AA, Coach, Tendencias, opens in new tabReconstrucción visual completa sobre una especificación de Claude Design — auditoría de 22 componentes, 50 pull requests, sistema de tokens dark-first con WCAG AA en tres temas. Nuevo logo-mark ring+pulse, SplashScreen de 6 keyframes, iconos PWA reconstruidos, MetricTile con flechas de delta con color, PageHeader compartido con deltas día a día, banda de referencia SpO₂ en cada gráfico. Pantalla Coach añadida: respuestas Claude en streaming, renderizado markdown, diseño keyboard-safe. Pantalla Tendencias renovada: selector de período, medias reales de 30 días, mini-sparklines.
may 2026SHIPVitals: Google Health API — ingestión de Fitbit, fuentes de datos duales, pipeline de mediana SpO₂, opens in new tabAñadido soporte para Fitbit vía OAuth2 de Google Health API — segunda ruta de ingestión junto a la app compañera de Galaxy Watch, mismo esquema, agnóstico al dispositivo. Cinco tipos de datos vitales solo soportan el endpoint list (no dailyRollUp); esa es una restricción de soporte de métodos en la especificación, no inferible del cuerpo del error 400. SpO₂ almacenado como mediana diaria para resistir lecturas erróneas del sensor; las pipelines de Samsung y Google Health de-colisionadas para que ninguna sobreescriba a la otra.
may 2026SHIPTrend Intelligence: dos verticales, cuatro fuentes de datos en vivo, briefing estratégico completoDos verticales dedicadas — alimentos y bebidas y nutrición para mascotas — desde un solo codebase, cada una con su propia experiencia de búsqueda y output a nivel de marca. Cuatro fuentes de datos corren en paralelo: Firecrawl (3 búsquedas simultáneas en ángulos regional, global e industrial), Google Trends (interés de búsqueda de 12 meses en 9 países — CR, GT, DO, PR, PA, SV, HN, NI, JM — con señales de dirección y consultas en alza), YouTube (principales videos en español de los últimos 6 meses por vistas) y Reddit (conversaciones de consumidores vía Google Custom Search). Cada consulta genera un briefing completo en menos de 3 minutos: tres tendencias clasificadas (Alto Momentum / En Ascenso / Emergente) con benchmarks globales, señales emergentes con contexto interregional, tres estadísticas clave y una cita de consumidor, recomendaciones estratégicas, frecuencia de consumo, ocasiones de uso, tres a cinco recetas con enfoque regional y una oportunidad por marca. Chips de país con código de color — verde, ámbar, gris — con hint de término de búsqueda cuando los bajos scores se deben a la terminología. Export a impresión/PDF con un clic. Historial completo de búsquedas por vertical.
may 2026SHIPSolaar: de herramienta de scaffolding a socio de entrega continua, opens in new tabNueve mejoras en tres fases. Fase 1 — Fundación: seis arquetipos de pipeline (landing page hasta SaaS completo) permiten al Estratega saltarse pasos irrelevantes; el Mapa de Peligros captura landmines, convenciones no obvias y restricciones absolutas en un archivo acumulativo que todos los agentes leen al abrir sesión. Fase 2 — Capa de Inteligencia: la Base de Conocimiento del Cliente reemplaza archivos de tokens puntuales con un historial por cliente de decisiones de stack, librerías aprobadas, perfil de riesgo y lecciones acumuladas; el Seguimiento de Activación de Reglas revisa las 14 reglas de incidentes de producción al cerrar sesión; la Detección de Convenciones escanea commits y notas para heredar lo aprendido sin redescubrirlo. Fase 3 — Nuevos Agentes: Architect Review (Paso 4.5) verifica seis propiedades estructurales antes de la revisión de seguridad; el Centinela de Producción obtiene el estado de Vercel, Sentry y Lighthouse tras cada despliegue y expone advertencias antes de abrir cualquier sesión.
may 2026BUILDSolaar: agente de monitoreo, scaffold nativo Android, Feature Sprint, opens in new tabTres nuevos agentes esta semana. El agente de Monitoreo conecta Sentry, error boundaries y analíticas en cada scaffold antes del primer despliegue — observable y desplegable son ahora el mismo paso. El agente Android Native nació a raíz de seis fallos consecutivos de CI durante el inicio de Balboa Finance: versiones de Gradle escritas desde memoria. Ahora consulta Maven Central en vivo antes de escribir una sola versión de dependencia. El agente Feature Sprint ejecuta un bucle spec → plan → tareas en 'feature <nombre>': primero preguntas de aclaración, luego tareas ejecutables por sesión. Además: el orden de caché de prompts ahorra entre un 60–80% de tokens en pasos paralelos; la Regla 14 trata los ítems sin marcar en un checklist como afirmaciones a validar contra git log.
may 2026SHIPClaudio AI: entrada por voz, imágenes y seis nuevas herramientas agénticasMicrófono de voz con el reconocedor de voz del sistema. Imágenes adjuntas: base64 → multimodal de Claude con vista previa en miniatura y snackbar de error de decodificación. Seis nuevas herramientas: create_calendar_event, draft_email, update_task, snooze_task, get_calendar_events y generate_work_plan. Todas siguen el patrón proponer-y-confirmar — Claude sugiere, tú confirmas, la app ejecuta. El historial de chat persiste 24 horas; la conversación anterior se restaura al abrir la app.
may 2026SHIPClaudio Android: backend migrado a SupabaseSe reemplazó toda la capa de datos de Notion con Supabase. Migración de esquema Room v7→8: columnas id volátiles, notionLastEditedAt renombrado a remoteLastEditedAt, todas las filas marcadas como PENDING_WRITE. SyncEngine reconectado; un MigrationWorker sube todos los datos cacheados localmente a Supabase en el primer inicio y luego los limpia. La validación de credenciales se trasladó a la primera sincronización — la validación en vivo al arrancar era poco fiable.
may 2026BUILDBalboa FinanceAsistente financiero personal — reconstrucción nativa en Android. Kotlin + Compose + supabase-kt 3.6.0 + WorkManager gestiona la sincronización offline-first de forma nativa; n8n descartado en favor de alternativas propias de la plataforma. El inicio a través de Solaar expuso de inmediato una brecha en el orquestador: versiones de Gradle escritas desde memoria, a veces con 6–12 meses de retraso. Seis fallos consecutivos de CI impulsaron el agente Android Native Scaffold y la matriz de compatibilidad con AGP 9.x. Siguiente: fase de diseño UX/UI.
may 2026SHIPControl TowerDashboard personal de uso de Claude Code integrado en mariansan.io. Consumo de tokens por proyecto — input, output, caché, coste, sesiones y turnos. API de ingesta en Supabase, auth por cookie HMAC-SHA256, desglose diario con Recharts y selector de rango, y dos scripts de sincronización: Admin API de Anthropic para cuentas de organización, SQLite local para los demás.
may 2026SHIPClaudio AI: Fase 3 — calendario, email, herramientas de borradoAsk Claudio ya tiene las cuatro herramientas agénticas de la Fase 3: create_calendar_event (con asistentes), draft_email vía Gmail OAuth2, borrar tarea y borrar iniciativa. Además, botón para resetear el límite diario. Sonnet 3.5 gestiona el uso agéntico de herramientas; Haiku 4.5 el parsing de tareas.
may 2026BUILDVeggieCorner: pipeline de imágenes migrado a servidor MCP, opens in new tabfal.media bloquea las peticiones servidor a servidor y Vercel agotaba el tiempo en generate + upload. Migré todo el pipeline fal.ai → Cloudinary a un servidor MCP local por stdio. Sin timeouts, visibilidad completa de errores, sin limitaciones de entorno de Vercel.
may 2026BUILDClaudio Android: bloqueo de tareas duplicadasDoble capa en Ask Claudio: el system prompt verifica tareas existentes antes de llamar a create_task; el ViewModel bloquea en Room DB si existe coincidencia de nombre y muestra un mensaje claro. También corregidos tres errores de compilación en tests (campos DAO ausentes, aridad de constructor).
may 2026SHIPCulinary Intelligence: listo para demoInteligencia de mercado con IA para tendencias de alimentos y bebidas en Centroamérica y el Caribe. Escribe una categoría — 'Bebidas Funcionales', 'Snacks Proteicos' — y obtén un briefing completo: scoring de momentum, señales emergentes, insights de consumidor, recomendaciones estratégicas y oportunidades por marca. Búsqueda paralela con Firecrawl + Claude Sonnet. Demo el 12 de mayo.
may 2026BUILDSolaar: comandos init / sync / bucle meta-retro, opens in new tabAñadí 'init' (crear proyecto local sin GitHub), 'sync' (incorporar el orquestador a un proyecto existente), guardias de sesión para worktrees, bucle meta-retro para análisis de patrones, Regla 12 (verificar estado del PR antes de hacer push) y extensión de la Regla 10 (los cambios de design tokens requieren aprobación del agente UX).
may 2026BUILDClaudio Android: corrección UX de ProyectosSe eliminó Proyectos del selector de modo de vista — era el único punto de acceso a esa pantalla, por lo que quitarlo ocultaba silenciosamente una función clave. Proyectos se reconectó como destino de navegación independiente, siempre accesible. La corrección surgió de una consulta al agente UX que detectó la dependencia de navegación antes de que el cambio se publicara.
may 2026SHIPVitals: rebrand, actualización en vivo, pulido visual, opens in new tabRebrand a 'Vitals by mariansan' — nuevo wordmark, logo ECG pulse-V, manifiesto PWA y metadatos. Actualización en vivo con FCM trigger + Supabase Realtime, saludo adaptado al momento del día, navbar con cristal esmerilado, tarjetas hairline y tokens de color de Apple Health. FCM cierra el ciclo: la PWA activa una sincronización inmediata del watcher bajo demanda.
may 2026BUILDVitals: n8n reemplazado con Vercel Cron, fiabilidad de generación, opens in new tabn8n reemplazado por Vercel Cron Jobs para la generación programada de briefings — sin orquestador de workflows externo. Corregida una condición de carrera en generation_lock, añadidos null-guards, generación de Claude movida dentro de after() para sobrevivir al timeout de respuesta de Vercel, RLS reforzado en generation_lock y cabecera Idempotency-Key añadida a la carga del watcher.
abr 2026SHIPVitals, opens in new tabDashboard de salud personal para Galaxy Watch: app Android → n8n → Claude Sonnet → Supabase → PWA en Next.js. Briefing diario con IA sobre sueño, ritmo cardíaco, actividad y datos corporales.
abr 2026SHIPClaudio para AndroidApp de productividad personal construida con Kotlin + Compose. Notion es la base de datos; Claudio es la interfaz móvil — briefings diarios con IA, gestión completa de tareas, seguimiento de proyectos y asistente conversacional.
abr 2026BUILDPrototipando un generador de briefings con Claude para uso personalRastrea distintas fuentes de noticias y temas, y entrega un briefing personal.
abr 2026BUILDConectando un agente de revisión semanal a mi stack de calendarioLee la semana pasada, saca a la luz patrones que se me escaparían, redacta el resumen del viernes en mi voz.
abr 2026TALKMasterclass sobre asistentes y agentes de IA.
abr 2026SHIPVeggie Corner, opens in new tabLa base de mi recetario personal está lista.
abr 2026READEnterprise Design ThinkingIntentando superar los retos de innovar a escala corporativa.