Listado de proyectos
El visitante puede ver los proyectos marcados como visibles, con stack, descripción y enlaces.
src/pages/index.astrosrc/components/home/ProyectosIndice.astro146 requerimientos funcionales agrupados por módulo, con prioridad, estado real de implementación y su origen en el código. 140 de 146 ya están implementados en producción. Filtra por estado o prioridad, o busca por ID, título o ruta.
No hay requerimientos que coincidan con los filtros.
El visitante puede ver los proyectos marcados como visibles, con stack, descripción y enlaces.
src/pages/index.astrosrc/components/home/ProyectosIndice.astroPágina individual por proyecto con metadata estructurada (JSON-LD), breadcrumbs y pestaña de observabilidad si tiene monitor asociado.
src/pages/projects/[slug].astroEl visitante puede enviar un mensaje que queda asociado a un cliente (si el email coincide) y visible en el CRM.
src/pages/api/contact.tsVista pública con uptime de 30 días, incidentes activos y latencia en tiempo real (EKG) por servicio monitoreado.
src/pages/statussrc/pages/api/statusSecciones públicas /tools y /notes con artículos técnicos y mocks de herramientas internas.
src/pages/toolssrc/pages/notesListado público de certificaciones vigentes/expiradas y línea de tiempo de hitos educativos.
src/pages/certificationsEvolutionTimeline.astroJSON-LD, sitemap, RSS, notificación IndexNow y manifest de PWA en cada publicación.
src/pages/rss.xmlscripts/indexnowVersión pública sin credenciales del panel admin con datos ficticios, para que cualquiera recorra el producto sin cuenta.
src/pages/demo.astrosrc/lib/demo.tsAsyncLocalStorage en src/db/index.tsEl visitante descarga el CV desde /contact mediante un token de un solo uso (ventana de 5 min) emitido tras capturar una huella de dispositivo.
src/pages/api/cvcv_downloadsRutas educativas ("Linux Real" y otras) con labs cronometrados por nivel (Inicial/Intermedio/Avanzado); el visitante marca cada lab como completado y el progreso persiste entre visitas.
src/lib/education-paths.tseducation_lab_progressPágina /paginas-web dirigida a negocios locales y emprendedores no técnicos: tres planes con precio visible, preguntas frecuentes y contacto por WhatsApp o formulario.
src/pages/paginas-web.astro; los precios salen de src/data/tarifario.ts (desde el 1 oct 2026)el mismo que usa el cotizador (RF-211)La página de contacto ofrece, además del formulario, un enlace para agendar una llamada sin intercambio previo de correos.
src/pages/contact.astroLas páginas públicas de marca, las notas técnicas, el LAB y el contenido de proyectos existen bajo el prefijo /en con contenido traducido, selector de idioma que conserva la página actual y hreflang recíproco. El español sigue siendo el idioma canónico, sin prefijo.
src/i18n/ (configroutingformatlocalizebilingualesen)src/pages/en/src/content/notes/{esen}/src/lib/notes.tssrc/middleware.tsUn visitante cuyo navegador declara preferencia por el inglés ve una invitación discreta a cambiar de idioma; la URL nunca cambia de contenido por sí sola.
src/components/LanguageSuggestModal.astroPágina /capacitacion-ia con los programas de formación publicados desde el panel (formato, nivel, duración, objetivos de aprendizaje, temario desplegable y nota de precio), el proceso de trabajo en cuatro pasos, preguntas frecuentes y contacto por WhatsApp o formulario.
src/pages/capacitacion-ia.astrotraining_programs (isPublic)src/lib/capacitacion/repo.tsRepositorio general de guías, prompts, plantillas, checklists y presentaciones en /capacitacion, con detalle por recurso en /capacitacion/[slug], contenido en markdown renderizado en el servidor y contador de lecturas.
src/pages/capacitacion/src/lib/capacitacion/{repomarkdowntipos}.tstraining_resourcesLos recursos marcados "con código" solo aparecen a quien canjeó en /capacitacion/acceso el código que se dicta al cerrar una capacitación; el canje entrega un pase firmado por 30 días, sin correo ni cuenta.
src/lib/capacitacion/{accesspase}.tssrc/pages/api/capacitacion/acceso.tstraining_access_codesTRAINING_ACCESS_SECRETEl mismo cuestionario antes y después de la formación, entregado por enlace firmado por cohorte, con informe de delta por grupo y por tema.
docs/plan-capacitacion.md (Fase 2); reutilizaría training_access_codes como identificador de cohorte.La página /automatizaciones publica lo que corre solo: los workflows de GitHub Actions con el resultado de su última corrida en main, las tareas programadas con horario, origen y qué se pierde si dejan de correr, y los automatismos que dispara el propio tráfico.
src/pages/automatizaciones.astrosrc/data/automatizaciones.tscron_runsCualquier visitante escribe un dominio y recibe doce diagnósticos en vivo contra ese sitio: alcanzabilidad, certificado TLS, redirección a HTTPS, cabeceras de seguridad, DNS, vencimiento del dominio por RDAP, robots.txt, sitemap.xml, meta SEO, peso y recursos de la página, Lighthouse vía PageSpeed Insights y una heurística de accesibilidad. Cada prueba llega por streaming en cuanto termina, con estado (pass/warn/fail/info), resumen y detalle.
src/lib/diagnostics.ts (la bateríasin dependencias externas: fetch + node:tls + node:dns)src/pages/api/lab/site-check.ts (endpoint público)src/pages/lab/site-check/index.astro y su cascarón en src/pages/en/Demostración pública en /lab/fingerprint: se crea una sala con un enlace corto y su QR, cada dispositivo que entra aporta su huella (señales del recolector propio más el hash de FingerprintJS para contrastar precisión) y el tablero /lab/fingerprint/[room]/board las va mostrando en vivo, con los bits de entropía de cada una y el contador de revisitas que enseña lo que hace de esto una demostración y no una lámina: volver en incógnito o borrando cookies no estrena dispositivo, incrementa el contador del mismo.
src/lib/fingerprint.ts (salas y registro)src/pages/api/lab/fp/src/pages/lab/fingerprint/ y su cascarón en src/pages/en/tablas fp_rooms y fp_devicesLa portada se comporta como un instrumento vivo: un terreno de isolíneas en WebGL que levanta un pico bajo el cursor, emite un pulso con cada clic y se aplana al hacer scroll hasta continuar en la cinta de señales; un índice cinético de proyectos con ventana flotante y portadas generativas para los que no tienen captura; el proceso de trabajo como un pipeline de CI que se recorre con el scroll; tarjetas de expertise con pantallas animadas (grafo de servicios que escala, cascada de red con el LCP, suite de tests corriendo); la huella dactilar del visitante dibujada en la sección del laboratorio; y un bento con luz que sigue al cursor, odómetros y la hora de Bogotá en vivo.
src/pages/index.astrosrc/components/home/ (ProyectosIndiceProcesoPipelineExpertiseVivoLabHuella)src/lib/motion/ (camaraisolineasportadasportadas-glpipelineexpertisehuellahuella-glglslefectos)src/styles/portada.cssEl panel público de ingeniería deja de ser una rejilla de tarjetas con el detalle escondido tras el cursor. El hero es un osciloscopio que mide LA VISITA ACTUAL con las mismas APIs de la telemetría del sitio (web-vitals, Navigation y Resource Timing): repite la carga como una traza de bytes recibidos con sus fases (red, servidor, descarga, pintado) y las marcas de TTFB, FCP y LCP, la ubica frente a la distribución de los visitantes reales ("más rápida que el X % de las visitas") y mide el INP con la primera interacción. Debajo, cinco medidores con el histograma real de cada métrica, la aguja del p75 y el punto de la visita; el último run del CI recorrido etapa por etapa (push, tests y build, despliegue, verificación en producción, con el rollback automático a la vista) junto a la tira de los últimos 20 runs; la disponibilidad como una tira de 90 días, un día por barra, con los huecos sin datos visibles y lectura por día bajo el cursor; y enlaces a las fuentes con vistas previas vivas.
src/pages/engineering.astrosrc/components/engineering/InstrumentoVisita.astrosrc/lib/motion/ (medicioninstrumentoengineeringlandingefectos)src/components/CardPopover.astrosrc/lib/presentacion/puntero.ts (desplazamientoPanel)La vitrina pública de seguridad deja de ser texto y tarjetas iguales. El hero es un "filtro de capas": las peticiones cruzan de izquierda a derecha las capas de defensa del sitio y cada una termina donde el sistema la dejaría de verdad. Todas son grises hasta el clasificador (una petición hostil no se distingue hasta que alguien la inspecciona); ahí la hostil se marca y, según su categoría, se frena (lista de bloqueo y límite de tasa), cae a la bitácora o queda atrapada en un señuelo, mientras el cron horario barre la bitácora y devuelve bloqueos al clasificador. Un punto "tú" cruza limpio hasta el sitio, el cursor lee cada punto (categoría y destino) con el tiempo casi detenido, y un clic lanza un sondeo simulado que se ve detectado y registrado. Debajo, el panel en vivo con cifras que ruedan, barras con el mismo código de color del filtro y la tendencia levantándose detrás de un barrido; los hallazgos corregidos como una línea de commits que, al bajar, cierra cada hallazgo (el problema se tacha, la corrección se destapa y el commit real se enciende); los controles vigentes con una demostración cada uno (firma que rechaza un evento alterado, secreto cifrado en el formato real de la bóveda, sesión revalidada en cada petición, inyección que viaja como parámetro); y la metodología como tres pasos unidos.
src/pages/security.astrosrc/components/security/ (FiltroCapasHallazgosCommitsControlesVivos)src/lib/motion/ (filtrofiltro-lienzosecuritylandingefectos)src/lib/security/vitrina.tssrc/data/hallazgos-seguridad.tsLa página de herramientas deja de ser siete tarjetas iguales con maquetas quietas. El hero es un "circuito de operación": el sitio con sus tres franjas (middleware, rutas, /admin), lo que llega desde fuera (tráfico, despliegues) y lo que lo vigila y avisa (monitor, celular, portal del cliente), unidos solo por los cables que existen en el código. Sobre ese mapa corren en bucle cuatro escenarios con su bitácora: un experimento de caos (el flag rompe /tienda, el monitor lo detecta, la alerta llega al celular, /status publica el incidente y el pánico lo apaga), un deploy roto (el health check contra el sitio real falla y el pipeline revierte solo), un sondeo hostil (gris hasta que el clasificador lo inspecciona, límite de tasa, frenado antes de las rutas, bloqueo escalonado y alerta por anomalía) y un proyecto nuevo (un servicio mueve el P&L y deja su credencial cifrada, y el hito llega al portal). Cada estación de herramienta lleva a su caso. Debajo, en escritorio, el texto de cada caso corre a la izquierda y una ventana fija a la derecha muestra la herramienta del caso que se está leyendo, haciendo lo que su texto afirma: el monitor ve una página que responde 200 con el contenido equivocado y el presupuesto de error baja, el P&L normaliza ciclos y monedas y recalcula el margen al pagarse una factura, el seguimiento cierra lo interno en la vista del cliente, la bóveda cifra y rechaza un byte alterado, el pipeline revierte al último deploy sano, el caos rompe /tienda sin tocar /admin y el SIEM escala el bloqueo de un origen reincidente mientras el detector marca una anomalía. En móvil cada escena va dentro de su caso, bajo el título.
src/pages/tools.astrosrc/components/tools/ (CircuitoOperacionEscenaCaso)src/lib/motion/ (circuitocircuito-vivotools-escenastools-datoslanding)src/lib/crypto.ts (encryptWithdecryptWith)El laboratorio deja de ser una lista de tarjetas con cifras. El hero es un "banco de ensayo": tres emisores (navegador, pasarela, motor de caos), las cinco defensas de la pasarela (llave única, evento ya visto, transición legal, versión, transacción) y la máquina de estados de un pago. Sobre ese banco se reproducen los cinco experimentos que registra lab_experiments (doble clic, webhook duplicado, webhook tardío, carrera aprobado/rechazado y caída de BD a mitad de transacción): cada evento viaja hasta la defensa que lo decide, las transiciones aplicadas se dibujan en verde, las negadas en rojo con ✕ y las que nunca hicieron COMMIT en ámbar, y el registro (pagos, estado, versión, eventos) cambia al ritmo del experimento. El sello final lo ponen las corridas reales, no la reproducción. Debajo, los KPIs forman una sola franja con odómetros; el pipeline es una pista por corrida que una luz recorre etapa por etapa (calidad, deploy, health check) y los rollbacks vuelven por su desvío; los hallazgos de seguridad arrancan todos en "abiertos" y viajan a donde terminaron; las pruebas de carga dibujan la escalera real de la última corrida de estrés (ofrecido, servido sin error y p95 por escalón, dónde se rompe, qué sostiene y cuánto tardó en volver); cada contador de la pasarela nombra la defensa que lo neutralizó con el mismo número del banco; y el analizador de sitios enseña sus 12 pruebas corriendo en paralelo y llegando en desorden.
src/pages/lab/index.astrosrc/components/lab/ (BancoEnsayoPistaPipelineCicloHallazgosEscaleraCarga)src/lib/motion/ (ensayoensayo-vivopistalab-datoslabefectos)El índice de notas deja de ser una columna de tarjetas iguales. El hero pone al lado del titular "Decisiones, no tutoriales" una ficha que recorre las decisiones de las notas reales: aparece el problema, la opción descartada se tacha y la elegida se escribe letra a letra, sobre el mapa generativo de la nota (isolíneas sembradas con su slug, el lenguaje de la portada) que se transforma de una nota a la siguiente; avanza sola, se pausa al apuntarla o enfocarla y tiene botón de pausa y controles. Debajo, una bitácora por meses con un riel que se enciende al bajar, el mismo mapa de cada nota como miniatura, tiempo de lectura y filtros por cuatro familias temáticas (seguridad, operación, calidad, arquitectura) que reacomodan la lista y quedan en la URL (?tema=). Cada artículo gana su mapa en la cabecera, "la decisión, en corto" antes del texto, un índice lateral que marca la sección que se lee con los minutos que quedan (barra superior en móvil) y tres notas relacionadas por enlaces reales y etiquetas.
src/pages/notes/index.astrosrc/pages/notes/[slug].astrosrc/components/notes/ (FichaDecisionBitacoraNotasDecisionCorta)src/lib/notes-meta.tssrc/lib/notes.ts (notaVista)src/lib/motion/ (notasficha-vivabitacoralecturaportadas-gl)campo decision en src/content.config.tsEl registro de actividad deja de ser cuatro cifras, un gráfico de barras y una lista. El hero es un "reloj de sesiones": una fila por día de los últimos 30 (hora de Colombia) y 24 horas de ancho, con cada commit como un punto en su hora (cian los públicos, gris y sin nombre los privados). Un cabezal recorre el mes de arriba abajo: los commits de cada día caen en su hora y enseguida los que quedan a menos de 90 min se funden en una sesión, dibujada desde 30 min antes del primero, mientras las cifras de arriba (trabajo profundo de 7 y 30 días, commits) se van sumando con lo que se dibuja; al terminar, la racha se enciende día a día y sube el histograma de commits por hora del día. Cada cifra es un interruptor que ilumina en el reloj lo que cuenta (la semana desde su hora exacta, las sesiones del mes, los commits o los días de la racha), y bajo el cursor (o el dedo) se lee el commit con su mensaje, la sesión con su duración o el día. Debajo, la bitácora: una barra de commits del mes por proyecto que es también su filtro (lo privado, un solo segmento sin nombre), filtros por tipo de cambio leídos del prefijo del commit, días con su franja de sesiones y enlace a cada commit en GitHub, y los commits nuevos entran arriba solos mientras la página sigue abierta.
src/pages/log.astrosrc/components/log/ (RelojSesionesBitacoraCommits)src/lib/actividad.ts (reglas compartidas con el endpoint)src/lib/motion/ (relojreloj-lienzologlog-datoslanding)src/pages/api/github/activity.tsLa página deja de ser tres listados de tarjetas. El hero es una "partitura" de las tareas programadas: un renglón por job y una marca por cada ejecución real de las últimas 24 h, con el pulso de cada 5 min como textura, los diarios como notas sobre su hora declarada y cada silencio mayor a lo tolerado como un tramo teñido con su duración. Apuntar un renglón lee la corrida, el hueco o el resumen del job. Un simulacro reproduce el corte del 7 sep 2026 sobre los datos de hoy: las tareas del programador externo se callan, los silencios crecen y el aviso llega cuando el vigilante de verdad llegaría (con la corrida diaria de uptime-check que lo hospeda), con el texto real del push. Los workflows se leen con un selector de eventos (push, pull request, domingo, a mano) que despierta solo los que declara cada YAML, con las etapas de CI y la verificación de tres chequeos que solo corre en push a main; la insignia de cada fila es la última corrida real en GitHub. La tabla de crons suma un medidor de silencio consumido y sigue contando con el reloj de quien mira. Los seis automatismos del producto tienen cada uno su escena ilustrativa. De paso corrige que siete de once tareas salieran "sin registro": la página lee ahora un rango de 48 h de la bitácora en vez de las últimas 150 filas (~9 h).
src/pages/automatizaciones.astrosrc/components/automatizaciones/ (PartituraDisparadoresCIEscenaAutomatismo)src/lib/motion/ (partiturapartitura-vivadisparosautomatizacionesautomatizaciones-escenas)etapas e id de escena en src/data/automatizaciones.tsLa entrada del laboratorio deja de ser una lista con una casilla. El hero pone junto al titular la huella dactilar del visitante, dibujada con el shader de la portada, y la lee en dos tiempos: al cargar solo lo que cualquier sitio lee sin pedir nada (pantalla, zona horaria, idioma, núcleos, plataforma, vendor de la GPU) y, al marcar el consentimiento, se suman canvas, audio y fuentes y la misma huella se transforma en la completa; si se retira el sí, vuelve a la parcial. Cada línea de "qué vamos a recolectar" muestra sus señales como puntos (llenos cuando ya se leyeron) y su estado (leída, n de m, espera tu sí, solo dentro de la sala), y un medidor de 38 marcas enciende los bits leídos con el "1 en N" que se deduce. En el tablero cada dispositivo que entra a la sala trae su huella en SVG, dibujada cresta a cresta desde su identificador; cuando el mismo dispositivo vuelve, una línea de lectura barre su huella, las crestas pasan a ember y la tarjeta dice "reconocido de nuevo" mientras sube el contador de revisitas. Con la sala vacía, una huella fantasma con la línea de lectura esperando. El cierre "cómo defenderte" es una comprobación con cuatro dispositivos de ejemplo: sin defensa (cuatro huellas distintas), incógnito (la cookie se borra y las huellas no cambian), Tor Browser (las cuatro convergen en la misma) y Firefox con resistFingerprinting (la rejilla de precisión junta algunas, no todas); el conteo "N de 4 huellas distintas" se calcula sobre lo que se dibuja.
src/pages/lab/fingerprint/index.astrosrc/pages/lab/fingerprint/[room]/board.astrosrc/components/HuellaVisor.astro (marco compartido con la portada)src/components/lab/HuellaCrestas.astrosrc/lib/motion/ (fingerprint-salafingerprint-entradafingerprint-svgfingerprint-defensas)collectBasicSignals en src/lib/fingerprint-client.tsDurante todo octubre (hora de Bogotá) la portada lleva seis fantasmas que cruzan el primer pantallazo despacio, flotando, en blanco violáceo y violeta. Se dibujan como curvas de nivel (el contorno y dos anillos interiores que respiran desfasados), el lenguaje de isolíneas del hero, con la cola ondeando y ojos que parpadean, y pasan por detrás del terreno y del velo del texto, así que nunca tapan el contenido. Reaccionan al visitante: los ojos siguen al cursor, huyen con inercia y se vuelven transparentes si se les acerca, con el cursor quieto vuelven curiosos sin llegar a tocarlo, y un clic asusta a los cercanos (saltan con la boca abierta, se desvanecen y reaparecen más lejos). Un séptimo, tímido, espera fuera de un borde y solo se asoma cuando el puntero lleva unos segundos quieto; se esconde en cuanto algo se mueve. Se encienden el 1 de octubre y se apagan el 1 de noviembre solos, sin desplegar nada. En móvil son tres y más pequeños.
src/components/Fantasmas.astrosrc/lib/temporada.tssrc/layouts/BaseLayout.astro (solo en la portadaen los dos idiomas)La página de la etapa productiva SENA deja de ser un tablero de tarjetas iguales. La banda de estado y la barra del cronograma se funden en una cinta de días: una raya por día de la etapa, más cortas los fines de semana, en ember los festivos colombianos, en cyan la entrega de cada bitácora (con el último hábil marcado cuando el cierre cae en domingo o festivo), en violeta las ventanas de visita, y en lima hoy. Al entrar, las rayas se levantan, un cabezal recorre lo transcurrido hasta hoy mientras el contador del día rueda, y los corchetes de las bitácoras y las etiquetas de las visitas se dibujan. Apuntar un día (o recorrerlo con las flechas) lo lee: fecha, día de la etapa, bitácora en curso, entrega adelantada, visita y motivo si es inhábil. En celular la cinta se parte en seis filas, una por mes de bitácora, con un blanco de unos 10 px por día. La calculadora rearma esa misma cinta con la fecha de otro aprendiz, y cada fila de la tabla de bitácoras lleva su miniatura. El pago se imprime renglón a renglón con las cifras rodando, el asunto generado cae en una bandeja de ejemplo del instructor que lo encuentra con la búsqueda por el comienzo del asunto (y apaga los que no tienen el formato), y los documentos de cierre marcados entran como páginas a un PDF que se sella al estar completo. De paso corrige que la página midiera 635 px de ancho en un celular de 390 px.
src/pages/ep.astrosrc/components/ep/ (CintaEtapaBandejaInstructorCarpetaCierre)src/lib/motion/ (cinta-epepep-datos)La página de contacto conserva su diseño, sus textos y su formulario, y gana movimiento: la etiqueta /contact se traza, el titular se destapa de abajo arriba conservando su degradado, la columna izquierda y el formulario entran escalonados, las pistas de cada campo aparecen cuando cambia su estado (no con cada tecla), el contador de campos gira al cambiar, el botón de enviar se inclina hacia el cursor y late mientras viaja el envío, y el mensaje de estado se destapa al llegar.
src/pages/contact.astro (solo atributos data-*)src/lib/motion/contacto.tsPágina pública, en español y en inglés, con lo que cambió en el sitio semana a semana, sacado de los commits reales de main y enlazado a cada commit en GitHub. Solo salen funciones nuevas, arreglos y mejoras de rendimiento; cada semana muestra sus 20 cambios más recientes y el resto en un desplegable.
src/lib/changelog.ts (puro)src/lib/changelog-github.tssrc/pages/changelog.astrosrc/pages/en/changelog.astrosrc/components/changelog/Fila.astroPágina pública, en español y en inglés, con el camino de una petición capa por capa (cliente, borde, middleware de seguridad, aplicación, datos y tareas en segundo plano). Cada pieza explica su porqué en dos líneas y enlaza a su versión viva y a la nota que la cuenta; cierra con los servicios externos, las decisiones con su trade-off y los límites conocidos del diseño.
src/pages/architecture.astrosrc/pages/en/architecture.astrobloque architecture de src/i18n/es.ts y en.tsEl diagrama de capas de /architecture se recorre: se elige quién llega (un visitante, un escáner, un atajo por /en/admin, el panel, un cliente del portal o la demo pública) y un punto de luz baja capa por capa hasta donde el sitio lo deja llegar de verdad, mientras la lista de pasos de al lado se enciende al mismo ritmo y una consola muestra la petición y su código. Dos interruptores rompen el sensor de seguridad o Turso y la petición se vuelve a lanzar: fail-open en el sensor, 503 en el panel, modo respaldo en /status, login en el portal. Las decisiones con caso propio enlazan a su recorrido. En escritorio el diagrama queda fijo y el scroll pasa los casos; en móvil, pestañas.
src/components/architecture/TrazadorPeticiones.astrosrc/lib/motion/trazado.ts (guionsolo servidor)src/lib/motion/trazado-html.ts (marcado compartido)src/lib/motion/arquitectura.ts (motion)src/pages/architecture.astrobloque architecture.trazador de src/i18n/es.ts y en.tsLa portada le habla al cliente y no a la disciplina: el titular dice "Tu página, tu app o tu sistema, a la medida." en una grotesca condensada de color plano (sin la cursiva serif ni el degradado anteriores), y debajo van tres líneas de venta (qué puedes pedir, cómo se trabaja, y los tres clientes ya en línea con enlace a su sitio real). A la derecha, sobre el terreno de isolíneas, un campo "Cuéntame qué necesitas": la persona escribe su idea y recibe al momento lo que haría Mike, en cuánto tiempo y el rango de precio, con la cifra calculada rodando como odómetro y la marca "Calculado con el tarifario". Puede mandarle el resumen a Mike por WhatsApp o "Seguir preguntando", que abre la burbuja con esa misma conversación.
src/pages/index.astro (hero y script del cotizador)src/styles/portada.csssrc/lib/asesor/prompt.ts (página "inicio")src/lib/asesor/traspaso.ts (puroisomorfo)src/components/WhatsappFab.astro (oyente del traspaso)src/data/trabajos-reales.ts (clientes compartidos con /paginas-web)fuente @fontsource-variable/archivobloques home.hero y home.cotizador de src/i18n/es.ts y en.tsEl titular fijo del hero ("Tu página, tu app o tu sistema, a la medida.") y sus líneas de venta se reemplazan por cinco cuadros que rotan solos: páginas web (el primero, el que ve todo el que entra), software a la medida, capacitación en IA, IA para tu negocio y apps móviles. Cada cuadro trae su titular, un dato real (precio desde, horas y cupo, plazo), su prueba (los clientes en línea, el chat de la propia página) y su botón principal, que lleva a la página del servicio, abre el chat del asesor o enfoca el cotizador. El cambio es línea por línea, como un rótulo de placas. La rotación se detiene con el cursor sobre el texto, con el teclado dentro del hero, con la pestaña oculta o con el hero fuera de pantalla, y hay un botón de pausa que aparece al llegar con el teclado. El ejemplo del cotizador sigue al cuadro a la vista.
src/pages/index.astro (marcado y script del hero)src/lib/hero-servicios.ts (cuadros con cifras del tarifariopuro)src/lib/motion/rotacion.ts (reloj con pausas acumuladaspuro)src/styles/portada.cssAPP_NATIVA_SEMANAS en src/data/tarifario.tsbloque home.hero de src/i18n/es.ts y en.tssrc/lib/asesor/conocimiento.ts (el asesor recibe los cinco cuadros)El administrador inicia sesión con su cuenta de GitHub; solo los logins en la allowlist obtienen acceso.
auth.config.tssrc/lib/auth.tsTodas las rutas /admin y /api/admin exigen sesión válida; sin sesión, redirige a login.
src/middleware.tssrc/lib/security/paths.ts (withoutTrailingSlash)El administrador ve las sesiones activas por dispositivo (IP, user-agent, última actividad) y puede revocarlas.
src/pages/admin/sessions.astroadmin_sessionssrc/lib/device-sessions.ts (recordSession)src/middleware.tsEl administrador puede cerrar su sesión desde cualquier página del panel.
src/pages/api/authAlta, edición y archivo de proyectos con estado, fechas, stack, cliente asociado y visibilidad pública.
src/pages/admin/projectsprojectsAlta y edición de clientes con datos de contacto y notas internas.
src/pages/admin/clients.astroclientsEl administrador ve, marca como leídos y responde mensajes recibidos por el formulario público.
src/pages/admin/messages.astromessagesRegistro de llamadas, reuniones, notas y tareas pendientes por cliente/proyecto, con recordatorios (nextAction/dueDate).
src/pages/admin/seguimiento.astrointeractionsDocumento de alcance por proyecto con objetivo, presupuesto estimado/acordado, horas e ítems (requerimiento/entregable/exclusión).
src/pages/admin/briefingsbriefingsbriefing_itemsRegistro de contactos (cliente, PM, dev, QA, diseño) asociados a un proyecto.
project_contactsRegistro de decisiones técnicas por proyecto con contexto, decisión, justificación y alternativas consideradas; opcionalmente públicas.
project_adrsBiblioteca de decks HTML autónomos y sesiones de proyección: pantalla principal, control remoto desde el celular y vista del público en sincronía por PIN corto servido en la raíz del dominio.
src/lib/present/*src/pages/admin/presentacionessrc/pages/present/[sessionId]src/pages/remote/[sessionId]src/pages/[pin]decks/deck_slidesPanel único en /admin/capacitacion para el banco de recursos (alta, edición con previsualización del markdown y borrado), el catálogo de programas y los códigos de grupo (generación, revocación y reactivación), con cifras de material publicado, borradores, lecturas y canjes.
src/pages/admin/capacitacion/src/pages/api/admin/capacitacion/training_programstraining_resourcestraining_access_codesUn asistente de IA que conoce proyectos, clientes, cuentas de cobro, pagos recibidos, vencimientos de dominios y servicios, mensajes, páginas vigiladas, finanzas, seguimiento y la documentación del sitio. Responde preguntas en lenguaje natural desde la terminal y desde la caja del dashboard (RF-219), y prepara trabajo (cuentas de cobro en borrador, cambios de proyectos e hitos, pendientes de seguimiento, cotizaciones), pero toda escritura la aprueba el administrador viendo el cambio. En la terminal delega la seguridad en el analista del micro-SIEM (RF-613); para cotizar deja la propuesta en Plano (RF-211).
docs/plan-asistente.md. Fase 2 (6 oct 2026terminalsolo consulta): agents/asistente/ (npm run asistente) y las consultas de src/lib/asistente/herramientas/con el analista de RF-613 como subagente sin bloqueo. Fases 4 y 7 (6 oct 2026): tres consultas nuevas (pagos_recibidosvencimientosbuscar_en_panel); la escritura crear_cuenta_cobro en src/lib/asistente/escrituras/ (prepara con computeCuentaCobro y validateCuentaCobrocrea con createCuentaCobrosiempre en borrador); el motor del panel src/lib/asistente/motor-api.ts sobre el bucle del analista (lib/analista/bucle.ts)generalizado para varias escrituras con aprobación; conversaciones en asistente_conversaciones (migración 0044) y rutas /api/admin/asistente y /api/admin/asistente/decision. Fase 5 (6 oct 2026): cuatro escrituras más en src/lib/asistente/escrituras/ (actualizar_proyectoactualizar_hitoregistrar_seguimientomarcar_mensaje_leido) con una tarjeta común de antes y después (escrituras/cambio.ts); la regla de hitos que avisa al cliente pasó a src/lib/portal/hitos.tscompartida con PATCH /api/admin/portal/hitos.Capacidad del asistente (RF-210): el administrador pega el mensaje de un cliente que pide precio y el asistente deja una propuesta en borrador en Plano (RF-214), leída por la IA de Plano (RF-216), con el rango de precio del motor y las preguntas que faltan. Nunca escribe al cliente ni ofrece descuentos; crear la propuesta lo aprueba el administrador viendo el texto que se va a leer, y revisarla y enviarla sigue siendo suyo. Las capacitaciones no van a Plano: se remiten a su precio publicado.
docs/plan-asistente.md (Capacidad 1). Fase 1 entregada el 1 oct 2026: src/data/tarifario.tssrc/lib/asistente/calculo-cotizacion.tsguardia.ts y limpieza.ts (tests/asistente-*.test.ts). Fase 3 (6 oct 2026): la escritura crear_propuesta en src/lib/asistente/escrituras/propuesta.tssobre crearPropuestala lectura del chat y armarPropuesta de src/lib/plano/. Decisión de Mike del 6 oct 2026: en vez del subagente cotizador y el briefing que proponía el planun solo lugar para cotizar.En todo el sitio, la burbuja de WhatsApp ofrece además resolver dudas con un agente de IA que responde sobre los servicios (planes, tiempos, pagos, capacitación), calcula un precio estimado con el tarifario y termina abriendo WhatsApp con el resumen ya escrito. WhatsApp sigue siendo la opción principal y la IA nunca es paso obligatorio.
src/components/WhatsappFab.astrosrc/lib/asesor/ (conocimientoherramientasbuclepromptcostopresupuestomotor)src/pages/api/asesor.tsisAsesorPath en src/lib/security/paths.ts y src/middleware.ts. Plan: docs/plan-asistente.md (Capacidad 3 y Fase 8).Cuando el asesor público (RF-212) da un precio, prepara el WhatsApp u ofrece el formulario de contacto, avisa a Mike por ntfy con enlace a la conversación y le pide a la persona su WhatsApp por si Mike no alcanza a entrar. Mike la lee en vivo desde el panel y, si escribe, el asesor se calla y sus mensajes le llegan al visitante en el mismo chat de la burbuja.
src/lib/asesor/vivo.ts (puro) y vivo-db.tssrc/pages/api/asesor.tssrc/pages/api/asesor/conversacion.tssrc/pages/admin/asesor/ y src/pages/api/admin/asesor/[id].tssrc/components/WhatsappFab.astro; tablas asesor_conversaciones y asesor_mensajes (migraciones 0039 y 0040). Plan: docs/plan-asistente.md"Asesor en vivo".En /admin/plano se arma la propuesta de un proyecto: componentes de la tabla con prioridad (esencial, recomendado, extra), preguntas por componente que cierran el rango de horas dentro de lo aprobado, tres versiones automáticas, precio a ofrecer (techo del rango) con porcentaje de certeza, mapa de contacto (quién habla, aprueba y paga, canal, horario y tiempos de respuesta de ambos lados), biblioteca de cláusulas con texto formal y en cristiano, encaje con los gastos de vida y la carga semanal, versiones congeladas con huella SHA-256 y diferencias entre versiones, y PDF.
src/pages/admin/plano/src/components/plano/constructor.tssrc/lib/plano/ (propuestaincertidumbreencajediffpdfdb)src/data/plano.tssrc/data/clausulas.tspropuestaspropuesta_versionesEl plan de pagos sale del monto: dos pagos hasta un corte, tres hasta otro y cuatro por encima, atados a entregas. Cuotas con recargo mensual en cuota fija (sistema francés), comparadas con la tasa de usura que Mike escribe cada mes; descuento por contado opcional. Vencimientos en días hábiles de Colombia, corridos a la quincena si paga una persona, o calculados con el ciclo de radicación y pago si paga una empresa. Todo editable en /admin/plano/ajustes con vista previa.
src/lib/plano/pagos.tssrc/lib/plano/fechas.tssrc/data/plano.tssrc/pages/admin/plano/ajustes.astroapp_settings (plano_reglas)Claude (Opus 5.5, salida estructurada) lee la conversación con el cliente y arma el borrador: solo componentes de la tabla, con la frase literal del cliente que justifica cada uno y las preguntas que faltan. Una segunda función revisa la propuesta como el cliente más exigente: ambigüedades, alcance que puede crecer sin pagarse y pre-mortem.
src/lib/plano/ia/ (motorchatrevision)src/pages/api/admin/plano/[id]/ia.tsEl cliente recibe /propuesta/<token>: su proyecto dibujado como un plano donde cada componente es una habitación (construida si está incluida, punteada si se puede agregar), perillas que Mike habilita (versión, forma de pago, piezas sueltas) recalculadas en el servidor desde la versión enviada, qué cambió desde la versión anterior, condiciones en cristiano con el texto formal a un clic, aceptación electrónica con nombre y documento (Ley 527 de 1999) y constancia SHA-256, y pago del anticipo con Wompi.
src/pages/propuesta/[token].astrosrc/components/plano/vista-render.tssrc/lib/plano/publico.tssrc/lib/plano/aceptacion.tssrc/pages/api/propuesta/[token]/Al aprobarse el anticipo, la propuesta se convierte sola en cliente, proyecto, hitos con fechas, cuentas de cobro en borrador de los pagos restantes e invitación al portal. En las propuestas aceptadas se anotan las horas reales por componente y Plano sugiere si la tabla se queda corta o larga respecto del colchón (con tres mediciones o más).
src/lib/plano/conversion.tssrc/lib/plano/aprende.tssrc/pages/api/payments/webhook.tssrc/pages/api/admin/plano/[id]/horas.tspropuesta_horasEl dashboard del panel abre con un saludo y una caja "Pregunta o busca algo", al estilo de la portada de Notion. Mientras se escribe, busca sin IA y sin costo páginas del panel, clientes, proyectos, cuentas de cobro, facturas, briefings y propuestas. Con Enter le pregunta al asistente (RF-210), que responde en la misma página con los pasos que dio y enlaces a donde verlo, y puede proponer una cuenta de cobro que se aprueba desde una tarjeta con los totales calculados por el servidor. Ctrl+K abre la misma búsqueda desde cualquier página del panel.
src/components/admin/AsistenteCaja.astroasistente-cliente.ts y buscador-cliente.ts; PaletaPanel.astro (Ctrl+K) en AdminLayout; menú compartido en src/data/panel-nav.ts; búsqueda en src/lib/asistente/buscar.ts (puro) y buscar-db.tsexpuesta en GET /api/admin/buscar; conversaciones recientes desde asistente_conversacionespurgadas a los 30 días por el cron de seguridad.La ruta /cotiza lleva a /admin/cotiza. Con la sesión admin abierta se entra directo; sin ella, con un PIN de 4 dígitos que solo abre las rutas de Cotiza y no muestra el resto del panel.
docs/plan-cotiza.md (Fase 06 oct 2026): src/lib/cotiza/acceso.ts (alcancecookiefrenos)src/lib/cotiza/pin-db.ts (hash en app_settingscontadores en rate_limit_buckets)gate en src/middleware.ts/cotiza/cotiza/entrar/api/cotiza/{pinsalir}CotizaLayout y la sección del PIN en /admin/settings (/api/admin/settings/cotiza-pin).Cotiza encargos de consultoría (logística, comercio exterior, compras, operaciones) por entregables contables con tarifa por nivel de complejidad, cupos incluidos (reuniones, rondas de cambios, horario de atención) y adicionales a tarifa pactada. El precio base queda congelado al enviarse; lo nuevo nunca lo modifica.
docs/plan-cotiza.md. Fase 1 (6 oct 2026): src/lib/cotiza/motor.tspuro e isomorfocon reglas en src/data/cotiza.ts; plan de pagos con tramoPara/repartir de lib/plano/pagos.ts. Fase 2: congelado con huella en src/lib/cotiza/db.ts (cotiza_encargosmigración 0045).Cada encargo registra las solicitudes del cliente (fecha, canal, dentro del alcance, cupo o adicional, fuera de horario) y las reuniones con sus minutos y su resumen escrito, y descuenta los cupos.
docs/plan-cotiza.md (Fase 26 oct 2026): src/lib/cotiza/{encargodb}.ts/api/admin/cotiza/encargos/admin/cotiza y /admin/cotiza/<id>; tablas cotiza_solicitudescotiza_reunionescotiza_rondas y cotiza_adicionales (migración 0045). Dictado por voz en los campos largos: src/lib/cotiza/dictado.tscon micrófono permitido solo en las páginas de Cotiza.Convierte un pedido vago en alcance (entregables, exclusiones, supuestos y preguntas previas), clasifica las solicitudes nuevas contra el alcance firmado con respuesta y orden de cambio en borrador, y redacta el resumen de cada reunión.
docs/plan-cotiza.md (Fase 36 oct 2026): src/lib/cotiza/ia.ts (promptsesquemasvalidación) y /api/admin/cotiza/encargos/<id>/iasobre pedirJson de src/lib/plano/ia/motor.ts.El cliente ve en un enlace privado la propuesta, los cupos que le quedan, la bitácora y los adicionales pendientes, y los aprueba o rechaza con constancia antes de que se hagan.
docs/plan-cotiza.md (Fase 46 oct 2026): src/lib/cotiza/enlace.ts/acuerdo/<token>/api/acuerdo/<token>acción enlace en /api/admin/cotiza/encargos/<id>; columnas de la migración 0046.Apartado /admin/marketing para escribir campañas de correo con vista previa en vivo, enviarse una prueba y dispararlas a la lista de suscriptores. La lista solo tiene gente que pidió entrar: formulario público /novedades y casilla opcional de /contact (las dos con doble confirmación por correo) y casilla de la cuenta del portal. Cada correo lleva su enlace de baja, y la cola respeta el horario de la Ley 2300, una promoción por persona por semana y un cupo diario que deja sitio a los correos del portal.
src/lib/marketing (reglas.tscontenido.tstokens.tsenvio.tsdb.ts)src/pages/admin/marketingsrc/pages/novedadessrc/pages/api/marketingsrc/pages/api/admin/marketingsrc/pages/api/cron/marketing-envio.ts; tablas marketing_suscriptoresmarketing_campanasmarketing_envios (migración 0047)Alta de cobros por proyecto/cliente con estado (cobrado/pendiente/proyectado) y fecha de vencimiento.
src/pages/admin/finances.astrofinancesRegistro de costos de servicios (hosting, dominio, DB, etc.) con quién paga y cuánto se le factura al cliente, para calcular la rentabilidad real.
src/pages/admin/costs.astroproject_servicessrc/lib/pnl.tsSecrets de servicios (API keys, tokens) cifrados con AES-256-GCM en reposo, revelados on-demand vía fetch autenticado.
src/lib/crypto.tsproject_services.secretsRegistro cifrado de variables de entorno por ambiente (producción/staging/dev) para cada proyecto gestionado.
project_env_varsDescubrimiento automático de fecha de expiración vía RDAP y alerta por email/push antes del vencimiento.
src/pages/admin/domains.astrosrc/lib/domains.tsDesde el celular se configura monto y teléfono, se previsualiza el mensaje y se envía por WhatsApp; el cliente paga en la pasarela existente a través de un link corto público /c/[code].
src/pages/cobrar.astrosrc/pages/c/[code].astrosrc/lib/cobros*.tsEl cliente consulta sus pagos en /mis-pagos mediante un link firmado incluido en el mensaje de WhatsApp; la consulta manual por número muestra datos enmascarados.
src/pages/mis-pagos.astrosrc/lib/mis-pagos.tsDesde /admin/cuentas-cobro se crean, emiten, anulan y descargan en PDF cuentas de cobro de persona natural no responsable de IVA, con serie propia CC-AAAA-NNN, valor en letras, leyendas normativas y datos bancarios.
src/pages/admin/cuentas-cobro/src/pages/api/admin/cuentas-cobro/src/lib/cuentas-cobro.tssrc/lib/cuentas-cobro-db.tssrc/lib/cuenta-cobro-pdf.tsmigración 0030El formulario de una cuenta de cobro nueva permite crear el deudor ahí mismo, y avisa de forma accionable cuando la ficha elegida no tiene NIT: deja crear el borrador, no deja emitirlo, y enlaza al sitio donde se completa.
src/pages/admin/cuentas-cobro/index.astro/api/admin/clientsLa cuenta de cobro calcula retención en la fuente (honorarios y servicios, según sea declarante o no) y ReteICA sobre el subtotal, aplicando la base mínima en UVT, y muestra el neto estimado sin alterar el bruto cobrado.
src/lib/cuentas-cobro.ts (computeRetentionsparseCuentaCobroConfig)/admin/settingsapp_settingsEl panel suma lo emitido en el año en cuentas de cobro y lo compara contra las 3.500 UVT del art. 437 par. 3 ET, con aviso al 70 %, alerta al 90 % y advertencia explícita al superarlo.
src/lib/cuentas-cobro.ts (topeIva)src/lib/cuentas-cobro-db.ts (topeIvaDelAnio)/admin/cuentas-cobroDesde /admin/infra se ve qué costaría el stack propio (Vercel, Turso, Claude y Google Workspace) con el uso de hoy y con el de tres escenarios de crecimiento: cuota incluida por dimensión, porcentaje consumido, excedente facturable y, sobre todo, en qué dimensión se rompe primero cada plan gratuito.
src/lib/infra-stack.ts (catálogo de planes y cálculomódulo puro e isomorfo)src/pages/admin/infra.astro; las tarifas de excedente de Vercel se reutilizan de src/lib/computo/tarifas.tsDesde /admin/resumen se ve, mes a mes, lo que sale del bolsillo en tres secciones: infraestructura, suscripciones de trabajo y costos de vida, con total en USD y COP, promedio mensual, variación contra el mes anterior y una proyección de 12 meses (cinco atrás, seis adelante) para ver venir los meses pesados. Los costos de vida se llevan en /admin/vida: una plantilla de gastos fijos (arriendo, servicios, suscripciones personales) y un registro de lo gastado de verdad cada mes, fijos y variables, que se compara con lo presupuestado por categoría.
src/lib/resumen-mensual.ts (cálculomódulo puro)src/lib/vida.ts (catálogo y validación)living_costs y living_expenses (migración 0034)categoría subscription en project_servicessrc/pages/admin/resumen.astrosrc/pages/admin/vida.astrosrc/pages/api/admin/vida/{fijosgastos}.tsUn archivo único y sin dependencias (instrumentacion/medidor.ts) que se copia al proyecto del cliente, se engancha como middleware de Astro o de Express o envuelve un handler web, y mide lo que la función ve: CPU activa del proceso, memoria por tiempo con peticiones en curso, invocaciones y bytes de respuesta. Lo acumula por hora y lo envía cada 10 minutos, firmado con HMAC por proyecto, a /api/computo/ingest, que lo aplica de forma atómica e idempotente.
instrumentacion/medidor.tsinstrumentacion/medidor.mjs y medidor.cjs (versiones JavaScript generadas por scripts/build-medidor.mjs)src/pages/api/computo/ingest.tssrc/lib/computo/lote.tssrc/lib/computo/firma.tscompute_usage_hourly y compute_batches (migración 0031)Desde /admin/computo se ve cuánto de la cuota Hobby de la cuenta llevan consumido los proyectos medidos en el mes, por dimensión y por proyecto, con proyección al cierre y la fecha en que se agotaría. Un aviso por ntfy sale al cruzar el 70, el 90 y el 100 %, o cuando la proyección pasa del 100 %, una vez por umbral y por mes. El mismo panel da de alta los proyectos medidos: genera o rota el secreto del medidor (se muestra una sola vez) y pausa o reanuda la medición.
src/lib/computo/cuota.ts (módulo puro)src/lib/computo/avisos.tssrc/lib/computo/store.ts (consumoDelMes)src/pages/api/cron/computo-rollup.tssrc/pages/api/admin/computo/proyectos.tssrc/pages/admin/computo.astroEn /admin/computo, a partir de una estimación en términos de visitas (páginas vistas, qué parte pasa por una función, peso por visita, CPU y duración por render) y con plantillas de landing estática, sitio SSR y tienda, el cotizador calcula el consumo mensual del cliente, qué parte de la cuota gratis se comería, si cabe junto a lo que la cuenta ya proyecta, cuánto costaría en Pro y una cuota mensual sugerida en USD y COP.
src/lib/computo/cotizador.ts (módulo puro e isomorfo)src/pages/admin/computo.astroEl cliente entra a /portal con email y contraseña, con recuperación por email y aceptación de invitación; el sistema de sesiones es propio y no comparte nada con el del administrador.
src/lib/portal/*portal_sessionssrc/pages/portalNinguna consulta del portal acepta el identificador de cliente desde el request: siempre sale de la sesión y viaja en el WHERE aunque ya haya un id de proyecto.
src/lib/portal/projects.tsrequirePortalSession()El cliente ve sus facturas con estado y vencimiento, y descarga cada una en PDF.
src/pages/portal/facturassrc/pages/api/portal/facturasHilos de conversación por proyecto entre el cliente y el administrador, con estado de leído. Cada hilo nuevo y cada respuesta del cliente avisan al administrador por push y por correo, con enlace directo a la conversación en el panel.
src/pages/portal/mensajessrc/pages/admin/portalsrc/pages/api/portal/mensajes (avisos vía sendPush y sendEmail de src/lib/notify.ts)El cliente ve los documentos compartidos y el avance por hitos de su proyecto.
src/pages/portal/documentossrc/pages/portal/index.astroEl administrador puede ver el portal como un cliente concreto para dar soporte, sin poder escribir nada en su nombre.
src/middleware.tssrc/pages/admin/portalLa información del portal (notificaciones, mensajes, facturas, salud del proyecto) se refresca sola mientras la pestaña está visible, sin recargar.
src/lib/portal/live.ts · src/pages/api/portal/live.ts · script de PortalLayout.astroEl cliente ve una línea de tiempo de lo que ha pasado en sus proyectos (hitos, facturas, mensajes), con filtro por tipo y paginación.
src/lib/portal/activity.ts · src/components/portal/ActivityFeed.astro · src/pages/portal/actividad.astro · src/pages/admin/portal/actividad.astroUn tenant marcado como demo permite recorrer el portal sin ser cliente, con re-siembra automática por cron.
src/pages/api/portal/demo.tssrc/pages/api/cron/portal-demo-reseed.tsLa pantalla /login, a la que lleva el botón de entrar del sitio, sirve a los dos públicos con un selector de dos pestañas: Cliente (correo y contraseña del portal) y Admin (GitHub o llave de seguridad). Abre en Cliente por defecto, en Admin cuando el middleware rebota a alguien desde una ruta del panel, y recuerda en el navegador la pestaña elegida a mano.
src/pages/login.astrosrc/components/portal/LoginForm.astro (compartido con /portal/login)src/components/Navbar.astroEndpoint público de salud que ejerce la cadena real de dependencias del portal, sondeado por el motor de uptime propio para que el portal aparezca en /status como cualquier otro servicio.
src/lib/portal/health.tssrc/pages/api/portal/health.tsscripts/register-portal-monitor.mjsChecks HTTP periódicos (cron externo) por servicio, con umbral de latencia degradada y validación de contenido esperado.
monitorssrc/pages/api/cronAgrupación automática de caídas consecutivas (primer fallo → primer éxito) con causa y duración.
monitor_incidentsCálculo de SLI/SLO configurable (objetivo % y ventana en días) por monitor, con presupuesto de error restante.
src/pages/admin/lab/slo.astrosrc/lib/slo.tsAlertas push (ntfy.sh) ante caídas de monitores, vencimientos de dominio y anomalías de seguridad.
src/lib/notify.tsCaptura de Core Web Vitals de visitantes reales, sin PII, para calcular p75 públicos.
web_vitalssrc/lib/vitals.tsVerificación periódica de expiración de certificado TLS por monitor con badge de alerta.
monitors.sslExpiresAtCada cron que pasa la autenticación deja una fila con el job, si salió bien, cuánto tardó y un resumen corto del resultado; /automatizaciones muestra la última corrida de cada uno.
src/lib/cron-runs.ts (conRegistroregistrarCronRun)cron_runssrc/pages/api/cron/*Cada cron del catálogo declara su cadencia esperada; si deja de aparecer en la bitácora más de lo que se le tolera, sale una alerta por push y correo diciendo qué job es, desde cuándo calla y quién debería estar disparándolo. /automatizaciones marca el mismo estado en la tabla.
src/lib/cron-silencio.ts (módulo puro: toleranciadeduplicación de avisos y throttling)src/lib/cron-runs.ts (ultimasCorridassilenciosPorAvisar)enganchado en src/pages/api/cron/uptime-check.ts; cadencia declarada en src/data/automatizaciones.ts (campo cadaMin)Cada lunes a las 7:00 de Bogotá un cron junta la semana anterior (disponibilidad por sitio, incidentes, ataques por tipo, bloqueos, tareas programadas, integración continua y gasto del analista), Claude la redacta en un resumen corto y el titular llega al celular. Se guarda el historial de 12 semanas y se ve en /admin/semana, con un botón para generarlo a mano.
src/lib/resumen-semanal.ts (puro)src/lib/resumen-semanal-db.tssrc/lib/resumen-semanal-ia.tssrc/lib/resumen-semanal-servicio.tssrc/pages/api/cron/resumen-semanal.tssrc/pages/api/admin/semana.tssrc/pages/admin/semana.astrosrc/lib/cron-largos.tsRegistro de runs de CI (GitHub Actions) con tests, cobertura, health check post-deploy y rollback automático si falla.
ci_runssrc/pages/admin/lab/pipeline.astroCobros con clave de idempotencia única, máquina de estados sin retrocesos y bitácora de eventos de webhook (incl. duplicados y fuera de orden).
paymentspayment_eventssrc/lib/payments.tsInyección de fallos reales (500, 503, latencia) por ruta con TTL obligatorio y kill-switch de pánico; /admin y /api/auth excluidos por código.
chaos_flagssrc/lib/chaos.tsBitácora de experimentos del LAB con resultado esperado vs. real, como evidencia para sustentación.
lab_experimentsEscenarios de carga y estrés contra endpoints críticos: escalera de niveles de concurrencia, punto de quiebre, recuperación tras la saturación y consumo de CPU/heap del proceso.
lab/k6/carga.js (ítem 5 del checklist)lab/k6/estres.js (ítem 6)lab/k6/lib/perfil.jssrc/pages/api/lab/proceso.tssrc/lib/lab/load-test.ts (parser puro)load_test_runssrc/pages/api/lab/ingest.ts (kind load_test)src/pages/admin/lab/load.astro.github/workflows/load-test.ymlAnálisis estático de seguridad (npm audit + CodeQL) y auditoría de accesibilidad (axe-core sobre Playwright) que ingieren sus hallazgos al panel del LAB.
security_findingssrc/lib/lab/findings.ts.github/workflows/security.yml y a11y.ymlMedición de la calidad real de la suite mediante mutantes (Stryker) y congelado de la forma de las respuestas de API con esquemas Zod.
stryker.config.jsonsrc/lib/lab/mutation.tssrc/lib/contracts.tsEscaneo dinámico baseline contra el deployment de preview, con el reporte JSON ingerido como hallazgos del LAB junto a los de SAST.
.github/workflows/dast.ymlparseZapReport en src/lib/lab/findings.tsLa página /pay separa "Pagar un servicio" de "Apoyar mi trabajo", pide nombre, correo y concepto, y muestra quién recibe el pago, los medios disponibles, qué llega después y a quién escribir si algo falla. El checkout de Wompi se abre con nombre y correo ya prellenados, y al volver, /pay/gracias muestra si el pago quedó aprobado, pendiente o rechazado (con reintento cuando aplica), en vez de dar las gracias a ciegas.
src/pages/pay.astrosrc/pages/pay/gracias.astrosrc/lib/pay-form.tssrc/lib/pay-result.tssrc/pages/api/payments/resultado.tspayments.payer_name y payer_message (migración 0032)Un agente que corre en un contenedor de Anthropic clona el repositorio, ejecuta npm audit, los tests y astro check, mide los headers del sitio publicado y entrega un informe priorizado que cruza los avisos del CI con el código real. Llega por webhook a /admin/lab/security y al celular; abrir un issue o un PR exige aprobación humana desde el panel.
agents/vigia/ (agenteentornomemoria y deployment versionados con ant apply; IDs en claude-lock.json)src/lib/vigia/ (informe y desenlace purossesion.ts)src/pages/api/managed/webhook.tssrc/pages/api/admin/vigia/decision.tssección #vigia de src/pages/admin/lab/security.astrotabla vigia_corridas (migración 0048)Clasificación de cada request por firmas conocidas (OWASP) de forma síncrona y no bloqueante en el middleware.
src/lib/security/sensor.tsclassify.tsBloqueo (manual o automático) de IPs con TTL obligatorio y respuesta 403 seca; sin bloqueos eternos.
blocked_ipssrc/lib/security/blocklist.tsLímite de tasa por clave respaldado en base de datos, que sobrevive a redeploys (reemplaza la implementación en memoria).
rate_limit_bucketssrc/lib/security/ratelimit-durable.tsAgregados horarios/diarios de eventos de seguridad por categoría para tendencias y detección de anomalías.
security_rollupsDetector estadístico (z-score sobre baseline de 30 días) de picos, patrones nuevos, anomalías geográficas y ráfagas de error.
security_anomaliessrc/lib/security/anomaly.tsVista en /admin con eventos, anomalías y acciones de respuesta (bloquear IP, marcar revisado).
src/pages/admin/security.astrosrc/pages/api/admin/security.tsEl TTL de bloqueo escala con la reincidencia (1h → 24h → 7d) leyendo el contador hits de blocked_ips; un hit a un honeypot bloquea la IP inline en el middleware, sin depender solo del cron de auto-block.
src/lib/security/blocklist.ts (blockIpEscalated)src/middleware.tsEl botón de bloqueo masivo del panel bloquea todas las IPs con eventos de seguridad recientes, excepto las propias: la IP del request que lo dispara y las de las sesiones admin no revocadas.
src/lib/security/autoblock.ts (selectBulkBlockIpsblockAllAttackerIps)src/pages/api/admin/security.tsArchivo único sin dependencias que se copia al proyecto de un cliente, clasifica sus requests con las mismas firmas del micro-SIEM, agrega en memoria y envía lotes firmados a la ingesta de seguridad.
docs/plan-siem-multiproyecto.md (Fase 2); instrumentacion/sensor.tshermano de instrumentacion/medidor.ts.Endpoint que recibe lotes de eventos ya clasificados desde los proyectos vigilados, autenticados con HMAC por proyecto, y los guarda con su project_id.
docs/plan-siem-multiproyecto.md (Fases 3 y 4); clon estructural de POST /api/computo/ingestcon migración aditiva 0036 (project_id nullable e índice compuesto).Una IP delatada en cualquier proyecto vigilado queda bloqueada en todos, limitando la propagación a las categorías donde el falso positivo es imposible por diseño.
docs/plan-siem-multiproyecto.md (secciones 6 y 7Fase 7); blocked_ips ya tiene la IP como clave primariaasí que la tabla es global sin cambios.Los inicios de sesión al panel (y sus intentos fallidos), el revelado de la bóveda y de variables de entorno, ver como cliente, la revocación de sesiones, los backups, las llaves y los cambios de bloqueo quedan en el micro-SIEM, y el panel de seguridad los enseña en su propia sección. Ese rastro no cuenta como amenaza en ninguna vista.
src/lib/security/audit.ts (AUDIT_CATEGORIES)src/lib/security/events.ts (recordAdminEvent)src/pages/admin/security.astrosrc/pages/security.astrosrc/lib/pulso-publico.tssrc/lib/security/rollup.tssrc/lib/security/autoblock.tsUn agente de IA (Claude Opus 5.5) lee el micro-SIEM con seis herramientas propias, decide qué investigar, explica lo que encontró en lenguaje claro y puede PROPONER bloqueos, que siempre aprueba o rechaza el administrador. Vive en /admin/analista en producción, con historial (que marca si el análisis fue automático, desde la terminal o desde el panel), retoma de un bloqueo pendiente aunque se cierre la pestaña, y transmisión en vivo de cada paso.
src/lib/analista/ (bucle.ts: bucle propio con pausa ante bloquear_origen; herramientas.ts: las seis herramientas sin atarse a un motor; motor-api.ts; ejecuciones.ts: tabla analista_ejecucionesreclamo atómico y tope de 24 h; seudonimos.ts; credencial.ts; detalle-origen.ts: la IP real y su detalle para quien decide)src/pages/admin/analista.astrosrc/pages/api/admin/analista/*prototipo con la Claude Agent SDK en agents/analista-siem/ (npm run analista)análisis de cada mañana en src/pages/api/cron/analista-matutino.tsmigraciones drizzle/0037_free_darkhawk.sql y 0038_curvy_pretty_boy.sql (origen de cada análisis)Snapshot periódico de la base de datos subido a Vercel Blob vía cron, más creación manual desde el panel.
src/lib/backup.tssrc/pages/api/cron/backup.ts (automático)src/pages/api/admin/backup.ts y src/pages/admin/backup.astro (manual y listado)Configuración clave-valor (tasas de cambio, moneda base) editable desde el panel.
app_settingssrc/pages/admin/settings.astroRequerimientos, casos de uso, historias, diagramas UML y BPMN, kanban, guía de testing, verificación y validación, y estado del pipeline en vivo, navegables desde /docs.
src/pages/docssrc/data/documentacion.tstesting.tsvyv.tsiteraciones-portfolio.tsPágina pública que muestra el estado real de la última corrida del pipeline etapa por etapa (push, tests, e2e, build, deploy, verificación), en vez de un diagrama estático.
src/pages/docs/pipeline-en-vivo.astrosrc/lib/lab/pipeline-live.tssrc/pages/api/lab/pipeline-live.tsLos cuatro procesos de negocio (cobro de campo, acceso al portal de clientes, respuesta de seguridad y ciclo de monitoreo) modelados en notación BPMN con carriles por participante, compuertas, eventos y temporizadores, más la explicación de los cinco tipos de compuerta y la tabla de tiempos de cada proceso, navegables desde /docs.
src/pages/docs/diagrama-bpmn.astrosrc/pages/docs/bpmn-imprimible.astrosrc/data/bpmn.tssrc/lib/bpmn-layout.tssrc/components/Bpmn{DiagramShape}.astroscripts/export-bpmn.mjsLa vista de red del sistema como diagrama de despliegue (nodos «device»/«executionEnvironment», artefactos y caminos de comunicación con protocolo), las cuatro interacciones principales como diagramas de comunicación con numeración decimal, y tres flujos de control internos como diagramas de actividades con particiones, bifurcación concurrente y bucle de reintento. Incluye la corrección de /docs/diagrama-componentes, que era un flowchart de despliegue sin ninguna interfaz declarada, a un diagrama de componentes UML real con conectores de ensamblaje.
src/pages/docs/diagrama-{desplieguecomunicacionactividadescomponentes}.astrosrc/data/{desplieguecomunicacionactividadescomponentes}.tssrc/lib/uml-{deploymentcommunicationactivitycomponent}.tssrc/components/uml/*.astroPanel privado que mide la práctica real sobre un stack en aprendizaje (el primero, .NET/C#): registro de sesiones con minutos, tema y bitácora; racha de días consecutivos; meta semanal de horas; temario con hitos por área; logros derivados; y mapa de calor de los últimos seis meses. Multi-track: añadir otra tecnología es una fila, no una migración.
src/pages/admin/aprendizaje.astrosrc/lib/skills.tssrc/data/track-dotnet.tsskill_tracks/skill_sessions/skill_milestonessrc/pages/api/admin/skills/*Panel admin con el historial completo de descargas del CV (IP, user-agent, referer) y detección de revisitas del mismo dispositivo.
src/pages/admin/lab/cv-downloads.astrocv_downloadsLa evidencia medida de la última corrida completa de la suite, publicada en /docs/ejecucion-pruebas: total de pruebas y fallos, duración por nivel (unitario contra integración), distribución logarítmica de tiempos, las 12 pruebas más lentas y la tabla de los archivos con su tiempo individual. Un generador convierte el reporte JUnit de Vitest en una instantánea versionada y, en paralelo, en un informe HTML autocontenido para entregar o proyectar.
scripts/report-tests.mjssrc/data/ejecucion-pruebas.{jsonts}src/pages/docs/ejecucion-pruebas.astro; consumido también por METRICAS_REFERENCIANIVELES y PIRAMIDE en src/data/testing.tsPágina /docs/reportes-pruebas que documenta qué log emite el runner y en qué formato: los 7 reporters de Vitest (default, verbose, dot, tap-flat, junit, json, html) con la salida real de cada uno, cuáles escriben archivo y cuáles solo consola, la anatomía de un fallo en consola y en XML, y la tabla de equivalencias con el instrumental de Java (Surefire, JaCoCo, PIT).
src/data/reportes-pruebas.tssrc/pages/docs/reportes-pruebas.astroPágina /docs/diagrama-red con la topología de producción expresada como zonas de confianza (Internet, perímetro, cómputo, datos gestionados, terceros salientes), los hosts de cada una y los flujos dirigidos entre ellas, cada cruce de frontera con su protocolo, su puerto y la tabla de controles que atraviesa.
src/pages/docs/diagrama-red.astrosrc/data/red.tssrc/lib/red-layout.tssrc/components/uml/NetworkDiagram.astroPantalla de mando en /sustentacion/control: avanza y retrocede la presentación desde el teléfono, muestra las notas de narración del beat en curso, el cronómetro contra la duración estimada y un selector para saltar a cualquiera de los doce beats.
src/pages/sustentacion/control.astrosrc/lib/sustentacion/mando.tssrc/lib/sustentacion/control.tssrc/lib/sustentacion/obedecer.tssrc/pages/api/sustentacion/comando.tssrc/pages/api/sustentacion/estado.tssrc/pages/api/sustentacion/guion.tsLa pantalla que ve el jurado en /sustentacion: grafo de la arquitectura dibujado en canvas 2D que se revela por capas, HUD de la corrida de estrés con la curva real, matriz de trazabilidad a la que vuelan los nodos, demo del portal en vivo dentro de un iframe, pipeline de CI/CD y checklist de entregables. Vestíbulo con el PIN y el QR del público antes de empezar.
src/pages/sustentacion.astrosrc/lib/sustentacion/escena.tssrc/data/sustentacion-escena.tssrc/data/sustentacion-datos.jsonsrc/pages/admin/sustentacion.astroLa pantalla /presentacion monta el bundle exportado en un iframe y /remote lo gobierna desde el teléfono: siguiente, anterior, salto directo y la posición real del mazo, con el estado compartido por /api/presentacion.
src/pages/presentacion.astrosrc/pages/remote/index.astrosrc/pages/api/presentacion.tssrc/lib/presentacion/mapa.tssrc/lib/presentacion/estado.tsLos tres beats del mazo que proyectan una página viva dentro de un iframe (la demo del portal, /status, /engineering) se pueden recorrer desde el teléfono: dos botones ↑/↓ que ocupan el sitio de la rejilla de saltos mientras la diapositiva tenga algo que desplazar, con repetición al mantener pulsado y una barra de progreso de la página proyectada.
src/lib/presentacion/desplazamiento.tssrc/pages/api/presentacion.tssrc/pages/presentacion.astrosrc/pages/remote/index.astroPágina /docs/planteamiento con el planteamiento del problema (síntomas observados con su evidencia y su consecuencia, causas que los explican y delimitación en las tres dimensiones), la justificación por ejes y los objetivos general y específicos, cada objetivo con su indicador, su meta, su forma de verificación y los requisitos que lo realizan.
src/data/planteamiento.tssrc/pages/docs/planteamiento.astrodocs/planteamiento-del-problema.mdVentana del portátil del ponente que separa los dos papeles que /presentacion hacía a la vez: conduce el mazo (descubre su forma, publica la posición real y obedece el destino que pide el celular) y además deja TOCAR la página viva que enmarca la diapositiva, que es lo que permite entrar a la demo del portal y navegar el panel delante del jurado. Suma teclado propio (flechas, espacio, Home/End y dígitos para salto directo), rueda del ratón que publica el desplazamiento donde lo publica el pulgar, espejo de la URL del iframe para que la sala vea la página que se está tocando, espejo del PUNTERO (el elemento que el ponente señala con el ratón dentro de esa página se enciende igual en cada equipo de la sala, con su hover, el panel de detalle de las cards de /engineering y una flecha dibujada encima), espejo del ECO (lo que el ponente ESCRIBE en la página viva y el resultado que le contesta el servidor cuando no pasa por una navegación, que es el caso del diagnóstico público de un sitio en /lab/site-check), y una isla flotante con el cronómetro de la sustentación.
src/pages/present-admin.astrosrc/pages/presentacion.astro (el seguidorque aplica espejo y puntero)src/lib/presentacion/lienzo.tssrc/lib/presentacion/espejo.tssrc/lib/presentacion/puntero.tssrc/lib/presentacion/eco.tssrc/pages/lab/site-check/index.astro (implementa el contrato ESPEJO_VIVO)src/components/CardPopover.astrosrc/lib/presentacion/cronometro.tssrc/lib/presentacion/desplazamiento.tssrc/pages/api/presentacion.tsConsola retráctil en la ventana que conduce la presentación, con tres estados que se ciclan con la tecla P y se recuerdan entre recargas: oculto (el mazo a pantalla completa), barra (una franja con reloj, desvío, posición, título de la diapositiva y estado del enlace) y consola (guion completo con la nota de la diapositiva siguiente, ritmo contra las duraciones estimadas del guion, rejilla de saltos sobre la forma real del mazo, URL de la página viva con atajos para volver a la demo del portal, /status o /engineering, botones de desplazamiento y tres acciones de rescate). Sustituye la necesidad de mirar el celular mientras se conduce desde el portátil: hasta aquí el guion y la rejilla solo existían en /remote.
src/lib/presentacion/panel.ts (modosíndice del mazoritmosalud del enlace y atajos)src/pages/present-admin.astro (la vista y el cableado)src/lib/presentacion/guion.tsAl llegar a la última diapositiva del mazo, la ventana que conduce la presentación (/present-admin) espera cinco segundos y navega sola a /presentacion-end, la página que se comparte cuando la sustentación ya terminó. Como el mazo acaba en la lámina de preguntas, lo que queda en pantalla durante el turno de preguntas es el cierre con los enlaces a la documentación, las cifras del kanban y el contacto. La cuenta se cancela con cualquier movimiento que salga de la última diapositiva y avisa antes de irse.
src/lib/presentacion/cierre.ts (las reglas)src/pages/present-admin.astro (el temporizador y el aviso)src/lib/presentacion/panel.ts (el estado cerrando de la salud del enlace)La página pública /presentacion-end reúne, para mandarla DESPUÉS de la sustentación en vivo, los enlaces a la documentación del proyecto, un corte de en-números sacado en vivo del kanban y un cierre con contacto. Traducida a /en, indexable y con la navegación normal del sitio.
src/pages/presentacion-end.astrosrc/pages/en/presentacion-end.astrosrc/i18n/es.tssrc/i18n/en.ts (presentacionEnd)src/i18n/routing.ts (TRANSLATED_ROUTES)src/lib/present/reserved.ts¿Cambiar a inglés?
Tu navegador está en inglés. Puedo mostrarte el sitio en ese idioma.
Soy una IA. Mike confirma todo por WhatsApp.
Hola. Soy el asistente con IA de Mike: te ayudo con dudas sobre los planes, los tiempos y los pagos, y puedo calcularte un precio estimado. Lo que te diga, Mike lo confirma por WhatsApp.