/* global React, COPY, SiteHeader, SiteFooter, POSTS */ const { useState, useEffect } = React; /* ============================================================ SERVICES PAGE — deep dive on three practices ============================================================ */ const SERVICE_DETAIL = { es: [ { id: "credit", n: "/01", tag: "RIESGO", title: "Riesgo de Crédito & NIIF 9", lead: "Modelos de Pérdida Crediticia Esperada calibrados a tu portafolio real, no a un benchmark genérico.", body: "Desde la estimación de probabilidad de incumplimiento (PD) hasta severidad (LGD) y exposición (EAD). Documentación lista para auditoría desde el día uno, con cuadernos reproducibles que tu equipo puede mantener.", deliverables: [ "Modelo PCE calibrado y backtested", "Documento técnico para revisores fiscales", "Cuadernos Python reproducibles", "Sesiones de transferencia con tu equipo", ], stack: ["Python", "Pandas", "scikit-learn", "Matplotlib", "Jupyter"], time: "8–14 semanas", }, { id: "audit", n: "/02", tag: "AUDITORÍA", title: "Acompañamiento en Auditorías", lead: "Defensa técnica frente a Big Four, revisores fiscales y entes de control. Hablamos su idioma porque venimos de ahí.", body: "Acompañamos walkthroughs, respondemos a observaciones, preparamos al equipo para sustentaciones, y ayudamos a remediar hallazgos. Foco en NIIF 9, riesgo de crédito y procesos automatizados.", deliverables: [ "Walkthroughs documentados", "Respuestas a observaciones de auditoría", "Memos técnicos por tema", "Sesiones de sustentación con el comité", ], stack: ["NIIF 9", "SFC", "Big Four protocols", "Memos técnicos"], time: "Por proyecto · típico 4–8 semanas", }, { id: "auto", n: "/03", tag: "AUTOMATIZACIÓN", title: "Automatización & Software a Medida", lead: "Reemplazamos hojas de cálculo y procesos manuales por software propio integrado a tu stack actual.", body: "Construimos pipelines de datos, dashboards operativos, conectores con sistemas legacy y herramientas internas a la medida. Cada entrega industrializada con monitoreo, logs y documentación.", deliverables: [ "Pipelines ETL versionados", "Dashboards con métricas operativas", "APIs internas para tu equipo", "Documentación + handoff", ], stack: ["Python", "FastAPI", "Postgres", "Airflow", "Streamlit"], time: "6–16 semanas según alcance", }, ], en: [ { id: "credit", n: "/01", tag: "RISK", title: "Credit Risk & IFRS 9", lead: "Expected Credit Loss models calibrated to your real portfolio, not a generic benchmark.", body: "From PD estimation through LGD and EAD. Audit-ready documentation from day one, with reproducible notebooks your team can maintain.", deliverables: ["Calibrated, backtested ECL model", "Technical memo for auditors", "Reproducible Python notebooks", "Knowledge-transfer sessions"], stack: ["Python", "Pandas", "scikit-learn", "Matplotlib", "Jupyter"], time: "8–14 weeks", }, { id: "audit", n: "/02", tag: "AUDIT", title: "Audit Support", lead: "Technical defense before Big Four, statutory auditors, and regulators. We speak their language.", body: "We support walkthroughs, respond to observations, prepare your team for committee sessions, and help remediate findings. Focus on IFRS 9, credit risk, and automated processes.", deliverables: ["Documented walkthroughs", "Responses to audit observations", "Topic memos", "Committee defense sessions"], stack: ["IFRS 9", "Regulators", "Big Four protocols", "Technical memos"], time: "Per engagement · typical 4–8 weeks", }, { id: "auto", n: "/03", tag: "AUTOMATION", title: "Automation & Custom Software", lead: "We replace spreadsheets and manual workflows with proprietary software integrated to your current stack.", body: "We build data pipelines, ops dashboards, connectors to legacy systems, and bespoke internal tools. Every shipped piece is industrialized with monitoring, logs and docs.", deliverables: ["Versioned ETL pipelines", "Ops dashboards with key metrics", "Internal APIs for your team", "Documentation + handoff"], stack: ["Python", "FastAPI", "Postgres", "Airflow", "Streamlit"], time: "6–16 weeks depending on scope", }, ], }; function ServicesPage({ lang }) { const items = SERVICE_DETAIL[lang]; return (
{lang === "es" ? "Servicios · Tres prácticas" : "Services · Three practices"}

{lang === "es" ? <>Una sola filosofía: software ejecutable que mueve métricas. : <>One philosophy: executable software that moves metrics.}

{lang === "es" ? "Riesgo, automatización y producto. Cada práctica entrega artefactos que tu equipo puede usar y mantener — no un PDF de 80 páginas." : "Risk, automation, and product. Each practice ships artifacts your team can use and maintain — not an 80-page PDF."}

{items.map((s, i) => (
{s.tag}

{s.title}

{s.lead}

{s.body}

{lang === "es" ? "Entregables" : "Deliverables"}

    {s.deliverables.map((d, j) =>
  • {d}
  • )}

Stack

{s.stack.map((x) => {x})}

{lang === "es" ? "Tiempo típico" : "Typical timeline"}

{s.time}

))}
); } /* ============================================================ CONVIVE PRODUCT PAGE ============================================================ */ function ConvivePage({ lang }) { const isES = lang === "es"; return (
{isES ? "Caso de estudio · Producto" : "Case study · Product"}

Convive IA {isES ? "no es un chatbot." : "is not a chatbot."}

{isES ? "Es un asistente que trabaja para el administrador 24/7, directamente desde WhatsApp. Centraliza, categoriza y registra todo lo que hoy pasa por canales dispersos." : "It's an assistant that works for the property manager 24/7, directly from WhatsApp. It centralizes, categorizes and records everything that today happens across scattered channels."}

{isES ? "Pedir una demo" : "Request a demo"} {isES ? "Ver el problema" : "See the problem"}
{isES ? "El problema" : "The problem"}

{isES ? "Administrar consorcios hoy es un cuello de botella humano." : "Property management today is a human bottleneck."}

{isES ? "DOLOR" : "PAIN"}

{isES ? "Saturación de canales" : "Channel overload"}

{isES ? "Grupos de WhatsApp, mail, llamadas. Todo entra a la vez, todo a la misma persona." : "WhatsApp groups, mail, calls. Everything pours in at once, to the same person."}

{isES ? "DOLOR" : "PAIN"}

{isES ? "Operación manual" : "Manual ops"}

{isES ? "Tareas repetitivas, copy-paste entre planillas, sin trazabilidad." : "Repetitive tasks, copy-paste between sheets, no traceability."}

{isES ? "DOLOR" : "PAIN"}

{isES ? "Expectativa imposible" : "Impossible expectation"}

{isES ? "Vecinos que esperan respuesta inmediata. La buena voluntad no alcanza." : "Residents expect immediate replies. Good will isn't enough."}

{isES ? "Cómo funciona" : "How it works"}

{isES ? "Todo entra por WhatsApp. Nada se pierde." : "It all comes in through WhatsApp. Nothing falls through."}

01

{isES ? "El vecino escribe" : "Resident writes"}

{isES ? "Reclamo, consulta, cualquier cosa." : "Issue, question, anything."}

02

{isES ? "Convive responde al instante" : "Convive responds instantly"}

{isES ? "Clasifica, registra, hace seguimiento." : "Classifies, records, follows up."}

03

{isES ? "Activa el circuito" : "Triggers the loop"}

{isES ? "Notifica proveedores, coordina visitas, mide NPS." : "Notifies vendors, schedules visits, measures NPS."}

{isES ? "Lo que cambia" : "What changes"}

{isES ? "No es eficiencia. Es un cambio en cómo se trabaja." : "It's not efficiency. It's a change in how the work happens."}

{isES ? "Antes" : "Before"}

  • {isES ? "Todo dependía del administrador" : "Everything depended on the manager"}
  • {isES ? "Cuellos de botella permanentes" : "Permanent bottlenecks"}
  • {isES ? "Servicio se detenía si el admin no estaba" : "Service stopped when the manager was off"}
  • {isES ? "Sin trazabilidad ni datos" : "No traceability, no data"}

{isES ? "Ahora" : "Now"}

  • {isES ? "El sistema trabaja para el administrador" : "The system works for the manager"}
  • {isES ? "Operación 24/7 sin perder calidad" : "24/7 operation without losing quality"}
  • {isES ? "Trazabilidad completa de cada caso" : "Full traceability of every case"}
  • {isES ? "Datos para tomar decisiones" : "Data to make decisions"}
); } /* ============================================================ BLOG INDEX ============================================================ */ function BlogPage({ lang }) { const isES = lang === "es"; const cats = isES ? ["Todos", "NIIF 9", "Producto", "Automatización", "Tendencias"] : ["All", "IFRS 9", "Product", "Automation", "Trends"]; const [active, setActive] = useState(cats[0]); return (
{isES ? "Bitácora · Notas de campo" : "Field notes · Journal"}

{isES ? <>Lo que escribimos cuando no estamos construyendo. : <>What we write when we're not building.}

{isES ? "Pensamiento técnico, casos anonimizados y bitácora de producto. Sin SEO bait, sin listicles." : "Technical thinking, anonymized cases, and product journals. No SEO bait, no listicles."}

{cats.map((c) => ( ))}
{/* Featured */}
{POSTS[0].cat}

{POSTS[0].title[lang]}

{POSTS[0].excerpt[lang]}

{POSTS[0].date} · {POSTS[0].read} · J. Guerrero
{POSTS.slice(1).concat(POSTS).map((p, i) => ( {String(i + 2).padStart(2, "0")}
{p.cat} {p.date}

{p.title[lang]}

{p.read}
))}
); } /* ============================================================ BLOG POST (single) ============================================================ */ function BlogPostPage({ lang }) { const isES = lang === "es"; return (
NIIF 9 2026-04-22 · 9 min · J. Guerrero

{isES ? "Calibrar PCE sin caer en sobreajuste: cinco señales tempranas" : "Calibrating ECL without overfitting: five early signals"}

{isES ? "Notas de campo después de tres recalibraciones consecutivas. Lo que aprendimos de los modelos que se veían bien en backtest pero fallaron en out-of-sample." : "Field notes after three back-to-back recalibrations. What we learned from models that looked great in backtest but failed out-of-sample."}

COVER · 16:9 · MODEL DRIFT VISUALIZATION

{isES ? "Hace seis meses heredamos un modelo PCE de un cliente del sector real. En el papel funcionaba: AUC de 0.87 en backtest, residuos centrados, todas las métricas que un revisor fiscal querría ver. Tres meses después, las pérdidas reales se desviaban un 31% del expected loss provisionado." : "Six months ago we inherited an ECL model from a real-sector client. On paper it worked: 0.87 AUC in backtest, centered residuals, every metric a statutory auditor would want to see. Three months later, actuals drifted 31% from the provisioned expected loss."}

{isES ? "El modelo no estaba mal especificado. Estaba sobreajustado a un régimen económico que ya no era el régimen actual. Esa distinción es importante porque cambia completamente el remediation plan." : "The model wasn't mis-specified. It was overfit to an economic regime that was no longer the current regime. That distinction matters because it changes the remediation plan entirely."}

{isES ? "Cinco señales tempranas que aprendimos a buscar" : "Five early signals we learned to look for"}

{isES ? "1. La curva de calibración pasa por (0,0) y (1,1) demasiado limpio" : "1. The calibration curve passes through (0,0) and (1,1) too cleanly"}

{isES ? "Cuando un modelo predice con precisión perfecta los extremos de la distribución pero falla en el medio, es señal de que el split de entrenamiento tenía un balance demasiado conveniente. La distribución real del portafolio no se ve así." : "When a model predicts the distribution tails with perfect precision but fails in the middle, the training split had a too-convenient balance. Real portfolio distributions don't look like that."}

{isES ? "2. El feature importance está concentrado en 1–2 variables" : "2. Feature importance is concentrated in 1–2 variables"}

{isES ? "Especialmente si esas variables son macros (PIB, desempleo). Cuando el régimen macro cambia, el modelo entero se mueve. Buscamos modelos donde las top-5 features tengan importancia comparable." : "Especially if those variables are macros (GDP, unemployment). When the macro regime shifts, the whole model moves. We look for models where the top-5 features have comparable importance."}

{isES ? "Un modelo que se ve perfecto en backtest pero está concentrado en dos features macro no es un buen modelo. Es un modelo que no ha visto suficientes regímenes." : "A model that looks perfect in backtest but concentrates on two macro features isn't a good model. It's a model that hasn't seen enough regimes."}

{isES ? "3. La estabilidad temporal es plana" : "3. Temporal stability is flat"}

{isES ? "Si entrenas el mismo modelo en ventanas rolling de 12 meses y los coeficientes apenas se mueven, no es una buena señal. Es una señal de que el modelo está copiando ruido constante, no señal." : "If you train the same model on rolling 12-month windows and the coefficients barely move, that's not good news. It means the model is copying constant noise, not signal."}

{isES ? "4. El intercept tiene magnitud no trivial" : "4. The intercept carries non-trivial magnitude"}

{isES ? "Un intercept que aporta más del 15% al log-odds promedio es una bandera roja. Significa que las features no están explicando el comportamiento; el intercept está absorbiendo varianza no modelada." : "An intercept contributing more than 15% to mean log-odds is a red flag. It means features aren't explaining behavior; the intercept is absorbing unmodeled variance."}

{isES ? "5. El error en out-of-time es asimétrico" : "5. Out-of-time error is asymmetric"}

{isES ? "Cuando el modelo subestima sistemáticamente en períodos recientes pero acierta en períodos antiguos, no es ruido. Es drift. Y el drift no se arregla recalibrando — se arregla repensando la especificación." : "When the model systematically underestimates in recent periods but nails older ones, it's not noise. It's drift. And drift isn't fixed by recalibrating — it's fixed by rethinking the specification."}

{isES ? "Qué hacemos cuando vemos estas señales" : "What we do when we see these signals"}

{isES ? "Lo primero es ser honestos con el cliente: el modelo necesita más que un ajuste de parámetros. Lo segundo es proponer un experimento contenido — usualmente cuatro semanas — donde probamos una especificación alternativa contra la base. Si la alternativa gana en out-of-time, industrializamos. Si no, descartamos rápido." : "First, be honest with the client: the model needs more than a parameter tweak. Second, propose a contained experiment — usually four weeks — where we test an alternative specification against the baseline. If the alternative wins out-of-time, we industrialize. If not, we kill it fast."}

{isES ? "Esa es la parte que más le cuesta a los equipos que vienen de una práctica tradicional de auditoría: el permiso explícito de descartar. Pero sin ese permiso, no hay forma de iterar rápido." : "That's the hardest part for teams coming from a traditional audit practice: explicit permission to discard. Without that permission, you can't iterate fast."}


JG

Julián Guerrero

{isES ? "Founder · Riesgo de Crédito" : "Founder · Credit Risk"}

{isES ? "Relacionados" : "Related"}

{POSTS.slice(1).map((p, i) => ( {p.cat}
{p.title[lang]}
{p.date} · {p.read}
))}
); } /* ============================================================ CONTACT PAGE ============================================================ */ function ContactPage({ lang }) { const isES = lang === "es"; const t = COPY[lang].contact; return (
{t.eyebrow}

{t.title} {t.titleEm} {t.titleEnd}

{ e.preventDefault(); alert(isES ? "Recibido. Volvemos en 48h." : "Got it. We'll reply in 48h."); }}>