[{"data":1,"prerenderedAt":525},["ShallowReactive",2],{"case-studies-list":3},[4,193,357],{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":8,"area":10,"summary":11,"order":12,"body":13,"_type":187,"_id":188,"_source":189,"_file":190,"_stem":191,"_extension":192},"\u002Fes\u002Fcase-studies\u002Fqa-transformation","case-studies",false,"","Transformación de QA: migración a Pest + E2E asistido por IA","Testing & quality","Modernicé la práctica de testing de un codebase PHP maduro — migré el suite backend a Pest y construí una metodología E2E en Playwright asistida por IA.",1,{"type":14,"children":15,"toc":179},"root",[16,36,45,52,57,63,107,113,136,142,147,153],{"type":17,"tag":18,"props":19,"children":20},"element","blockquote",{},[21],{"type":17,"tag":22,"props":23,"children":24},"p",{},[25,28,34],{"type":26,"value":27},"text","Extracto sanitizado de trabajo comercial en ",{"type":17,"tag":29,"props":30,"children":31},"strong",{},[32],{"type":26,"value":33},"Salutte2 (Alephoo HDE)",{"type":26,"value":35}," — un SaaS\nde historia clínica electrónica usado en 5 países. No se divulga código propietario.",{"type":17,"tag":22,"props":37,"children":38},{},[39],{"type":17,"tag":40,"props":41,"children":44},"img",{"alt":42,"src":43},"Flujo E2E asistido por IA","\u002Fdiagrams\u002Fqa-flow.svg",[],{"type":17,"tag":46,"props":47,"children":49},"h2",{"id":48},"contexto",[50],{"type":26,"value":51},"Contexto",{"type":17,"tag":22,"props":53,"children":54},{},[55],{"type":26,"value":56},"Un codebase PHP grande y maduro (CodeIgniter 3, jQuery) con una suite de tests acotada\ne inconsistente. Las regresiones se detectaban tarde, y el QA manual era el bottleneck\nantes de cada release.",{"type":17,"tag":46,"props":58,"children":60},{"id":59},"lo-que-hice",[61],{"type":26,"value":62},"Lo que hice",{"type":17,"tag":64,"props":65,"children":66},"ul",{},[67,78,88],{"type":17,"tag":68,"props":69,"children":70},"li",{},[71,76],{"type":17,"tag":29,"props":72,"children":73},{},[74],{"type":26,"value":75},"Migré el suite de tests backend a Pest",{"type":26,"value":77}," — ~64.000 líneas de tests en 600+ archivos —\nestableciendo la práctica moderna de testing del equipo.",{"type":17,"tag":68,"props":79,"children":80},{},[81,86],{"type":17,"tag":29,"props":82,"children":83},{},[84],{"type":26,"value":85},"Diseñé e implementé una metodología E2E en Playwright asistida por un AI agent",{"type":26,"value":87}," —\nun harness reutilizable (helpers compartidos, configuración, validación por módulo\npiloto) que genera y mantiene cobertura end-to-end. ~+48.000 líneas, 1.414 archivos.",{"type":17,"tag":68,"props":89,"children":90},{},[91,96,98,105],{"type":17,"tag":29,"props":92,"children":93},{},[94],{"type":26,"value":95},"Levanté CI en GitHub Actions",{"type":26,"value":97}," (con ",{"type":17,"tag":99,"props":100,"children":102},"code",{"className":101},[],[103],{"type":26,"value":104},"actionlint",{"type":26,"value":106},") y consolidé el monitoreo de errores\nen Sentry.",{"type":17,"tag":46,"props":108,"children":110},{"id":109},"decisiones-que-vale-la-pena-defender",[111],{"type":26,"value":112},"Decisiones que vale la pena defender",{"type":17,"tag":64,"props":114,"children":115},{},[116,126],{"type":17,"tag":68,"props":117,"children":118},{},[119,124],{"type":17,"tag":29,"props":120,"children":121},{},[122],{"type":26,"value":123},"Pest sobre PHPUnit",{"type":26,"value":125}," — feedback más rápido y una API fluida que redujo la fricción de\nescribir tests, lo cual pesó más para la adopción que la paridad cruda.",{"type":17,"tag":68,"props":127,"children":128},{},[129,134],{"type":17,"tag":29,"props":130,"children":131},{},[132],{"type":26,"value":133},"E2E asistido por IA como metodología, no como algo puntual",{"type":26,"value":135}," — los agentes generan y\nmantienen los specs; el equipo es dueño del harness. La ganancia es cobertura sostenida,\nno un único test generado.",{"type":17,"tag":46,"props":137,"children":139},{"id":138},"resultado",[140],{"type":26,"value":141},"Resultado",{"type":17,"tag":22,"props":143,"children":144},{},[145],{"type":26,"value":146},"Modernicé la práctica de testing del equipo y reduje el esfuerzo de QA manual por ciclo de\nrelease, acelerando la cadencia de releases para un producto que sirve a decenas de miles\nde usuarios.",{"type":17,"tag":46,"props":148,"children":150},{"id":149},"evidencia-metadatos-públicos-de-prs",[151],{"type":26,"value":152},"Evidencia (metadatos públicos de PRs)",{"type":17,"tag":64,"props":154,"children":155},{},[156,161,174],{"type":17,"tag":68,"props":157,"children":158},{},[159],{"type":26,"value":160},"PR #13594 — migración a Pest (~64k líneas).",{"type":17,"tag":68,"props":162,"children":163},{},[164,166,172],{"type":26,"value":165},"PR #13782 — ",{"type":17,"tag":99,"props":167,"children":169},{"className":168},[],[170],{"type":26,"value":171},"feat(e2e): AI agent E2E testing methodology",{"type":26,"value":173}," (+48k líneas).",{"type":17,"tag":68,"props":175,"children":176},{},[177],{"type":26,"value":178},"PR #13645 — migración completa de E2E + unit a Pest.",{"title":8,"searchDepth":180,"depth":180,"links":181},2,[182,183,184,185,186],{"id":48,"depth":180,"text":51},{"id":59,"depth":180,"text":62},{"id":109,"depth":180,"text":112},{"id":138,"depth":180,"text":141},{"id":149,"depth":180,"text":152},"markdown","content:es:case-studies:qa-transformation.md","content","es\u002Fcase-studies\u002Fqa-transformation.md","es\u002Fcase-studies\u002Fqa-transformation","md",{"_path":194,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":195,"description":8,"area":196,"summary":197,"order":180,"body":198,"_type":187,"_id":354,"_source":189,"_file":355,"_stem":356,"_extension":192},"\u002Fes\u002Fcase-studies\u002Fpayments-integrations","Pagos e integraciones de terceros","Integrations","Pagos MercadoPago QR, facturación electrónica multi-país y bridges RIS\u002FLIS — idempotencia y verificación de firma como defaults.",{"type":14,"children":199,"toc":347},[200,213,221,225,230,236,289,293,316,320,325,329],{"type":17,"tag":18,"props":201,"children":202},{},[203],{"type":17,"tag":22,"props":204,"children":205},{},[206,207,211],{"type":26,"value":27},{"type":17,"tag":29,"props":208,"children":209},{},[210],{"type":26,"value":33},{"type":26,"value":212},". No se\ndivulga código propietario.",{"type":17,"tag":22,"props":214,"children":215},{},[216],{"type":17,"tag":40,"props":217,"children":220},{"alt":218,"src":219},"Flujo de idempotencia de webhook","\u002Fdiagrams\u002Fpayments-webhook.svg",[],{"type":17,"tag":46,"props":222,"children":223},{"id":48},[224],{"type":26,"value":51},{"type":17,"tag":22,"props":226,"children":227},{},[228],{"type":26,"value":229},"Un producto de historia clínica electrónica en expansión hacia nuevos flujos de\npago y sistemas externos. Cada integración debía ser confiable bajo condiciones\nreales: reintentos, eventos duplicados, verificación de firma y fallos parciales.",{"type":17,"tag":46,"props":231,"children":233},{"id":232},"lo-que-construí",[234],{"type":26,"value":235},"Lo que construí",{"type":17,"tag":64,"props":237,"children":238},{},[239,249,267,277],{"type":17,"tag":68,"props":240,"children":241},{},[242,247],{"type":17,"tag":29,"props":243,"children":244},{},[245],{"type":26,"value":246},"MercadoPago QR + webhook",{"type":26,"value":248}," — un flujo de pago con UX de bloqueo, ingesta de\nwebhooks, idempotencia y verificación de firma (+16.000 líneas, 94 archivos).",{"type":17,"tag":68,"props":250,"children":251},{},[252,257,259],{"type":17,"tag":29,"props":253,"children":254},{},[255],{"type":26,"value":256},"Integración HC → RIS",{"type":26,"value":258}," — puente entre la historia clínica electrónica y un\nsistema radiológico externo (RIS Eden) mediante client + factory + controllers\n",{"type":17,"tag":64,"props":260,"children":261},{},[262],{"type":17,"tag":68,"props":263,"children":264},{},[265],{"type":26,"value":266},"tests (+7.7k\u002F-3k líneas).",{"type":17,"tag":68,"props":268,"children":269},{},[270,275],{"type":17,"tag":29,"props":271,"children":272},{},[273],{"type":26,"value":274},"Facturación electrónica con Facturacion.Cl",{"type":26,"value":276}," — habilitó la operación de la\nplataforma en Chile (un nuevo mercado).",{"type":17,"tag":68,"props":278,"children":279},{},[280,282,287],{"type":26,"value":281},"Un ",{"type":17,"tag":29,"props":283,"children":284},{},[285],{"type":26,"value":286},"patrón de integración",{"type":26,"value":288}," reutilizable (client, signature\u002Fidempotency,\nretry) aplicado a webhooks y APIs externas, más integraciones de validación de\ncobertura de obras sociales (brokers de obras sociales).",{"type":17,"tag":46,"props":290,"children":291},{"id":109},[292],{"type":26,"value":112},{"type":17,"tag":64,"props":294,"children":295},{},[296,306],{"type":17,"tag":68,"props":297,"children":298},{},[299,304],{"type":17,"tag":29,"props":300,"children":301},{},[302],{"type":26,"value":303},"Idempotencia + verificación de firma primero.",{"type":26,"value":305}," Los webhooks se re-envían;\nuna idempotency key faltante significa doble cobro o doble procesamiento.\nTomo \"la integración recibirá eventos duplicados o malformados\" como el\ndefault.",{"type":17,"tag":68,"props":307,"children":308},{},[309,314],{"type":17,"tag":29,"props":310,"children":311},{},[312],{"type":26,"value":313},"Client + factory para el bridge RIS",{"type":26,"value":315}," — adapter intercambiable para que la\nhistoria clínica electrónica no quede hard-coupled a un único vendor\nradiológico.",{"type":17,"tag":46,"props":317,"children":318},{"id":138},[319],{"type":26,"value":141},{"type":17,"tag":22,"props":321,"children":322},{},[323],{"type":26,"value":324},"Nueva capacidad de pago y expansión a nuevos mercados (Chile), más una capa de\nintegración más robusta reutilizada por conexiones de terceros posteriores —\npara un producto que opera en Argentina, Chile, Colombia, México y República\nDominicana.",{"type":17,"tag":46,"props":326,"children":327},{"id":149},[328],{"type":26,"value":152},{"type":17,"tag":64,"props":330,"children":331},{},[332,337,342],{"type":17,"tag":68,"props":333,"children":334},{},[335],{"type":26,"value":336},"PR #13461 — MercadoPago QR + webhook (+16k\u002F-5k líneas).",{"type":17,"tag":68,"props":338,"children":339},{},[340],{"type":26,"value":341},"PR #13424 — Integración HC → RIS Eden (+7.7k\u002F-3k).",{"type":17,"tag":68,"props":343,"children":344},{},[345],{"type":26,"value":346},"PR #13105 — Facturación electrónica con Facturacion.Cl.",{"title":8,"searchDepth":180,"depth":180,"links":348},[349,350,351,352,353],{"id":48,"depth":180,"text":51},{"id":232,"depth":180,"text":235},{"id":109,"depth":180,"text":112},{"id":138,"depth":180,"text":141},{"id":149,"depth":180,"text":152},"content:es:case-studies:payments-integrations.md","es\u002Fcase-studies\u002Fpayments-integrations.md","es\u002Fcase-studies\u002Fpayments-integrations",{"_path":358,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":359,"description":8,"area":360,"summary":361,"order":362,"body":363,"_type":187,"_id":522,"_source":189,"_file":523,"_stem":524,"_extension":192},"\u002Fes\u002Fcase-studies\u002Fperformance-reliability","Performance y confiabilidad bajo carga","Performance","Reducí una query crítica de base de datos de 30s a ~2s, fortalecí un camino de caché corrupto, y ejecuté 100+ hotfixes a producción con cambios disciplinados y reversibles.",3,{"type":14,"children":364,"toc":515},[365,378,386,390,395,399,442,446,469,473,478,482],{"type":17,"tag":18,"props":366,"children":367},{},[368],{"type":17,"tag":22,"props":369,"children":370},{},[371,372,376],{"type":26,"value":27},{"type":17,"tag":29,"props":373,"children":374},{},[375],{"type":26,"value":33},{"type":26,"value":377}," — un SaaS\nde historia clínica electrónica donde algunas clínicas procesan hasta 30.000\nturnos\u002Fdía. No se divulga código propietario.",{"type":17,"tag":22,"props":379,"children":380},{},[381],{"type":17,"tag":40,"props":382,"children":385},{"alt":383,"src":384},"Optimización de query lenta: 30s a ~2s","\u002Fdiagrams\u002Fperf-query.svg",[],{"type":17,"tag":46,"props":387,"children":388},{"id":48},[389],{"type":26,"value":51},{"type":17,"tag":22,"props":391,"children":392},{},[393],{"type":26,"value":394},"A escala, algunas queries lentas y un par de incidentes de caché corrupto\ndegradaron la experiencia en las clínicas de mayor volumen. La confiabilidad es\ncrítica en software de salud — un flujo de turnos degradado bloquea a los\npacientes.",{"type":17,"tag":46,"props":396,"children":397},{"id":59},[398],{"type":26,"value":62},{"type":17,"tag":64,"props":400,"children":401},{},[402,412,422,432],{"type":17,"tag":68,"props":403,"children":404},{},[405,410],{"type":17,"tag":29,"props":406,"children":407},{},[408],{"type":26,"value":409},"Reducí queries críticas de base de datos de >30s a ~2s (~15×)",{"type":26,"value":411}," reescribiéndolas\ny agregando los índices correctos — la métrica más citada de este trabajo.",{"type":17,"tag":68,"props":413,"children":414},{},[415,420],{"type":17,"tag":29,"props":416,"children":417},{},[418],{"type":26,"value":419},"Diagnosticué y corregí incidentes de caché corrupto",{"type":26,"value":421}," y fortalecí el camino de\ncaché.",{"type":17,"tag":68,"props":423,"children":424},{},[425,430],{"type":17,"tag":29,"props":426,"children":427},{},[428],{"type":26,"value":429},"100+ deploys y hotfixes a producción",{"type":26,"value":431},", incluyendo respuesta a incidentes\nurgentes.",{"type":17,"tag":68,"props":433,"children":434},{},[435,440],{"type":17,"tag":29,"props":436,"children":437},{},[438],{"type":26,"value":439},"Centralicé el monitoreo de errores en Sentry",{"type":26,"value":441}," para que las regresiones se\ndetecten inmediatamente en lugar de por reportes de usuarios.",{"type":17,"tag":46,"props":443,"children":444},{"id":109},[445],{"type":26,"value":112},{"type":17,"tag":64,"props":447,"children":448},{},[449,459],{"type":17,"tag":68,"props":450,"children":451},{},[452,457],{"type":17,"tag":29,"props":453,"children":454},{},[455],{"type":26,"value":456},"Medir y después optimizar.",{"type":26,"value":458}," La mejora de 30s→2s provino de identificar las\nqueries ofensoras reales (mediante análisis de slow queries), no de indexación\nespeculativa.",{"type":17,"tag":68,"props":460,"children":461},{},[462,467],{"type":17,"tag":29,"props":463,"children":464},{},[465],{"type":26,"value":466},"Tratar el acceso a producción como una skill de primera",{"type":26,"value":468}," — hotfixes\ndisciplinados, chicos y reversibles bajo presión, sin heroicos.",{"type":17,"tag":46,"props":470,"children":471},{"id":138},[472],{"type":26,"value":141},{"type":17,"tag":22,"props":474,"children":475},{},[476],{"type":26,"value":477},"UX materialmente mejor en clínicas de alto volumen y detección y resolución de\nincidentes más rápida en toda la plataforma.",{"type":17,"tag":46,"props":479,"children":480},{"id":149},[481],{"type":26,"value":152},{"type":17,"tag":64,"props":483,"children":484},{},[485,498,503],{"type":17,"tag":68,"props":486,"children":487},{},[488,490,496],{"type":26,"value":489},"PR #13795 — ",{"type":17,"tag":99,"props":491,"children":493},{"className":492},[],[494],{"type":26,"value":495},"Production mejoras slow queries",{"type":26,"value":497},".",{"type":17,"tag":68,"props":499,"children":500},{},[501],{"type":26,"value":502},"PR #13468 — fix de caché corrupto.",{"type":17,"tag":68,"props":504,"children":505},{},[506,508,514],{"type":26,"value":507},"100+ PRs etiquetados ",{"type":17,"tag":99,"props":509,"children":511},{"className":510},[],[512],{"type":26,"value":513},"Production",{"type":26,"value":497},{"title":8,"searchDepth":180,"depth":180,"links":516},[517,518,519,520,521],{"id":48,"depth":180,"text":51},{"id":59,"depth":180,"text":62},{"id":109,"depth":180,"text":112},{"id":138,"depth":180,"text":141},{"id":149,"depth":180,"text":152},"content:es:case-studies:performance-reliability.md","es\u002Fcase-studies\u002Fperformance-reliability.md","es\u002Fcase-studies\u002Fperformance-reliability",1788209838100]