[{"data":1,"prerenderedAt":806},["ShallowReactive",2],{"home-projects":3,"home-case-studies":301},[4,150],{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":8,"summary":10,"stack":11,"repo":19,"demo":20,"year":21,"role":22,"featured":23,"order":24,"body":25,"_type":144,"_id":145,"_source":146,"_file":147,"_stem":148,"_extension":149},"\u002Fes\u002Fprojects\u002Fmnemo","projects",false,"","Mnemo","Flashcards con repetición espaciada para mi propio estudio — el contenido vive en Markdown versionado con git, el estado SRS (SM-2 de Anki) en Postgres. Live en su propio subdominio, full-serverless en el free tier.",[12,13,14,15,16,17,18],"TypeScript","Next.js 15","Cloudflare Workers","Prisma","PostgreSQL (Neon)","Vitest","pnpm monorepo","https:\u002F\u002Fgithub.com\u002FFabrizio-Alvarez\u002Fmnemo","https:\u002F\u002Fmnemo.falvarez.dev",2026,"Autor",true,1,{"type":26,"children":27,"toc":137},"root",[28,37,43,61,67,115,121,126,132],{"type":29,"tag":30,"props":31,"children":33},"element","h2",{"id":32},"descripción-general",[34],{"type":35,"value":36},"text","Descripción general",{"type":29,"tag":38,"props":39,"children":40},"p",{},[41],{"type":35,"value":42},"Una app personal de estudio con tarjetas, estilo Anki. El contenido — 8 mazos,\n256 tarjetas — vive en archivos Markdown versionados con git; el estado de\nrepetición espaciada (algoritmo SM-2 de Anki) vive en Postgres. Está en uso real\ndiario, y eso mantiene honesta cada decisión de diseño.",{"type":29,"tag":38,"props":44,"children":45},{},[46,52,54],{"type":29,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":35,"value":51},"Live:",{"type":35,"value":53}," ",{"type":29,"tag":55,"props":56,"children":59},"a",{"href":20,"rel":57},[58],"nofollow",[60],{"type":35,"value":20},{"type":29,"tag":30,"props":62,"children":64},{"id":63},"arquitectura-monorepo-hexagonal",[65],{"type":35,"value":66},"Arquitectura: monorepo hexagonal",{"type":29,"tag":68,"props":69,"children":70},"ul",{},[71,87,105],{"type":29,"tag":72,"props":73,"children":74},"li",{},[75,85],{"type":29,"tag":47,"props":76,"children":77},{},[78],{"type":29,"tag":79,"props":80,"children":82},"code",{"className":81},[],[83],{"type":35,"value":84},"@mnemo\u002Fdomain",{"type":35,"value":86}," — el parser de Markdown y el scheduler SM-2 como TypeScript\npuro: 67 tests, sin base de datos, sin framework. El paquete viaja intacto a\ncualquier runtime.",{"type":29,"tag":72,"props":88,"children":89},{},[90,95,97,103],{"type":29,"tag":47,"props":91,"children":92},{},[93],{"type":35,"value":94},"Contenido ≠ estado",{"type":35,"value":96}," como decisión central: los ",{"type":29,"tag":79,"props":98,"children":100},{"className":99},[],[101],{"type":35,"value":102},".md",{"type":35,"value":104}," son la fuente de verdad;\nla base de datos es derivada e idempotente — el seed se puede re-correr en\ncualquier momento sin perder el estado de scheduling.",{"type":29,"tag":72,"props":106,"children":107},{},[108,113],{"type":29,"tag":47,"props":109,"children":110},{},[111],{"type":35,"value":112},"Full-serverless en el free tier",{"type":35,"value":114},": Cloudflare Workers (vía OpenNext) + Neon\nPostgres, dominio propio, CI\u002FCD en cada push (GitHub Actions).",{"type":29,"tag":30,"props":116,"children":118},{"id":117},"más-allá-de-las-flashcards-modo-quiz",[119],{"type":35,"value":120},"Más allá de las flashcards: modo quiz",{"type":29,"tag":38,"props":122,"children":123},{},[124],{"type":35,"value":125},"Un modo quiz didáctico donde cada pregunta trae distractores plausibles escritos a\nmano y una explicación conceptual del \"por qué\" — las respuestas incorrectas\nenseñan en lugar de solo fallar. Los modos son extensiones del mismo dominio, no\napps separadas: extensibilidad hecha carne.",{"type":29,"tag":30,"props":127,"children":129},{"id":128},"por-qué-este-proyecto",[130],{"type":35,"value":131},"Por qué este proyecto",{"type":29,"tag":38,"props":133,"children":134},{},[135],{"type":35,"value":136},"Es el proyecto que más uso y el que muestra el arco completo: modelado de dominio\n(SM-2, parsing de contenido), un monorepo real con límites estrictos, y operación\nen producción en mi propio dominio — deployado, monitoreado, y a US$0\u002Fmes.",{"title":8,"searchDepth":138,"depth":138,"links":139},2,[140,141,142,143],{"id":32,"depth":138,"text":36},{"id":63,"depth":138,"text":66},{"id":117,"depth":138,"text":120},{"id":128,"depth":138,"text":131},"markdown","content:es:projects:mnemo.md","content","es\u002Fprojects\u002Fmnemo.md","es\u002Fprojects\u002Fmnemo","md",{"_path":151,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":152,"description":8,"summary":153,"stack":154,"repo":161,"demo":8,"year":162,"role":22,"featured":23,"order":138,"body":163,"_type":144,"_id":298,"_source":146,"_file":299,"_stem":300,"_extension":149},"\u002Fes\u002Fprojects\u002Fsupermarket-stock","Sistema de Stock de Supermercado","Backend de gestión de inventario para una cadena de supermercados, construido en Laravel con un núcleo framework-agnostic y domain-driven. El dominio se testea por completo sin Laravel — PHP puro.",[155,156,157,158,159,160],"Laravel 11","PHP 8.3","PostgreSQL","Pest","Docker","GitHub Actions","https:\u002F\u002Fgithub.com\u002FFabrizio-Alvarez\u002FEjercicio-Arquitectura",2025,{"type":26,"children":164,"toc":292},[165,169,174,180,185,194,237,249,255,283,287],{"type":29,"tag":30,"props":166,"children":167},{"id":32},[168],{"type":35,"value":36},{"type":29,"tag":38,"props":170,"children":171},{},[172],{"type":35,"value":173},"Un servicio backend para gestionar el stock de un supermercado: productos, niveles\nde stock, movimientos (recepciones, ventas, ajustes) y las reglas asociadas. Es\nprimero un estudio de arquitectura y segundo un servicio funcional — construido\npara demostrar un núcleo PHP limpio, framework-agnostic, capaz de sobrevivir a un\ncambio de framework.",{"type":29,"tag":30,"props":175,"children":177},{"id":176},"arquitectura-ddd-en-capas",[178],{"type":35,"value":179},"Arquitectura: DDD en capas",{"type":29,"tag":38,"props":181,"children":182},{},[183],{"type":35,"value":184},"El código está estructurado de forma que la lógica de negocio nunca dependa de\nLaravel:",{"type":29,"tag":38,"props":186,"children":187},{},[188],{"type":29,"tag":189,"props":190,"children":193},"img",{"alt":191,"src":192},"DDD en capas","\u002Fdiagrams\u002Fsupermarket-stock-ddd.svg",[],{"type":29,"tag":68,"props":195,"children":196},{},[197,207,217,227],{"type":29,"tag":72,"props":198,"children":199},{},[200,205],{"type":29,"tag":47,"props":201,"children":202},{},[203],{"type":35,"value":204},"Dominio",{"type":35,"value":206}," — PHP puro. Entidades, value objects y servicios de dominio. Sin\nimports del framework, sin Eloquent, sin HTTP. Esta es la parte que se testea\nde forma aislada.",{"type":29,"tag":72,"props":208,"children":209},{},[210,215],{"type":29,"tag":47,"props":211,"children":212},{},[213],{"type":35,"value":214},"Aplicación",{"type":35,"value":216}," — casos de uso (handlers) que orquestan el dominio y declaran\ntransacciones y side effects como interfaces.",{"type":29,"tag":72,"props":218,"children":219},{},[220,225],{"type":29,"tag":47,"props":221,"children":222},{},[223],{"type":35,"value":224},"Infraestructura",{"type":35,"value":226}," — repositorios Eloquent, adaptadores del framework y\nclientes de terceros que implementan las interfaces de la capa de Aplicación.",{"type":29,"tag":72,"props":228,"children":229},{},[230,235],{"type":29,"tag":47,"props":231,"children":232},{},[233],{"type":35,"value":234},"Presentación",{"type":35,"value":236}," — una REST API que expone los casos de uso.",{"type":29,"tag":38,"props":238,"children":239},{},[240,242,247],{"type":35,"value":241},"Lo más importante es el ",{"type":29,"tag":47,"props":243,"children":244},{},[245],{"type":35,"value":246},"dominio testeado sin el framework",{"type":35,"value":248},": si Laravel\ndesapareciera mañana, las reglas de negocio y sus tests pasarían en verde.",{"type":29,"tag":30,"props":250,"children":252},{"id":251},"qué-incluye",[253],{"type":35,"value":254},"Qué incluye",{"type":29,"tag":68,"props":256,"children":257},{},[258,263,268,273,278],{"type":29,"tag":72,"props":259,"children":260},{},[261],{"type":35,"value":262},"Catálogo de productos y proyecciones de niveles de stock.",{"type":29,"tag":72,"props":264,"children":265},{},[266],{"type":35,"value":267},"Movimientos de stock como un ledger append-only con invariantes de dominio (sin\nstock negativo, totales consistentes).",{"type":29,"tag":72,"props":269,"children":270},{},[271],{"type":35,"value":272},"Endpoints REST para las operaciones comunes, validados en el límite.",{"type":29,"tag":72,"props":274,"children":275},{},[276],{"type":35,"value":277},"Un suite de tests en Pest que cubre las reglas del dominio y el comportamiento\nde la API.",{"type":29,"tag":72,"props":279,"children":280},{},[281],{"type":35,"value":282},"Entorno local dockerizado y un pipeline de GitHub Actions que ejecuta los tests\nen cada push.",{"type":29,"tag":30,"props":284,"children":285},{"id":128},[286],{"type":35,"value":131},{"type":29,"tag":38,"props":288,"children":289},{},[290],{"type":35,"value":291},"Trabajo día a día en PHP, así que quise tener un proyecto público que muestre cómo\npienso el diseño de backend en ese lenguaje: límites claros, invariantes enforced\nen el dominio, e infraestructura como detalle. DDD sobre un dominio real (aunque\nchico) es más honesto que otra demo CRUD más.",{"title":8,"searchDepth":138,"depth":138,"links":293},[294,295,296,297],{"id":32,"depth":138,"text":36},{"id":176,"depth":138,"text":179},{"id":251,"depth":138,"text":254},{"id":128,"depth":138,"text":131},"content:es:projects:supermarket-stock.md","es\u002Fprojects\u002Fsupermarket-stock.md","es\u002Fprojects\u002Fsupermarket-stock",[302,474,638],{"_path":303,"_dir":304,"_draft":7,"_partial":7,"_locale":8,"title":305,"description":8,"area":306,"summary":307,"order":24,"body":308,"_type":144,"_id":471,"_source":146,"_file":472,"_stem":473,"_extension":149},"\u002Fes\u002Fcase-studies\u002Fqa-transformation","case-studies","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.",{"type":26,"children":309,"toc":464},[310,326,334,340,345,351,392,398,421,427,432,438],{"type":29,"tag":311,"props":312,"children":313},"blockquote",{},[314],{"type":29,"tag":38,"props":315,"children":316},{},[317,319,324],{"type":35,"value":318},"Extracto sanitizado de trabajo comercial en ",{"type":29,"tag":47,"props":320,"children":321},{},[322],{"type":35,"value":323},"Salutte2 (Alephoo HDE)",{"type":35,"value":325}," — un SaaS\nde historia clínica electrónica usado en 5 países. No se divulga código propietario.",{"type":29,"tag":38,"props":327,"children":328},{},[329],{"type":29,"tag":189,"props":330,"children":333},{"alt":331,"src":332},"Flujo E2E asistido por IA","\u002Fdiagrams\u002Fqa-flow.svg",[],{"type":29,"tag":30,"props":335,"children":337},{"id":336},"contexto",[338],{"type":35,"value":339},"Contexto",{"type":29,"tag":38,"props":341,"children":342},{},[343],{"type":35,"value":344},"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":29,"tag":30,"props":346,"children":348},{"id":347},"lo-que-hice",[349],{"type":35,"value":350},"Lo que hice",{"type":29,"tag":68,"props":352,"children":353},{},[354,364,374],{"type":29,"tag":72,"props":355,"children":356},{},[357,362],{"type":29,"tag":47,"props":358,"children":359},{},[360],{"type":35,"value":361},"Migré el suite de tests backend a Pest",{"type":35,"value":363}," — ~64.000 líneas de tests en 600+ archivos —\nestableciendo la práctica moderna de testing del equipo.",{"type":29,"tag":72,"props":365,"children":366},{},[367,372],{"type":29,"tag":47,"props":368,"children":369},{},[370],{"type":35,"value":371},"Diseñé e implementé una metodología E2E en Playwright asistida por un AI agent",{"type":35,"value":373}," —\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":29,"tag":72,"props":375,"children":376},{},[377,382,384,390],{"type":29,"tag":47,"props":378,"children":379},{},[380],{"type":35,"value":381},"Levanté CI en GitHub Actions",{"type":35,"value":383}," (con ",{"type":29,"tag":79,"props":385,"children":387},{"className":386},[],[388],{"type":35,"value":389},"actionlint",{"type":35,"value":391},") y consolidé el monitoreo de errores\nen Sentry.",{"type":29,"tag":30,"props":393,"children":395},{"id":394},"decisiones-que-vale-la-pena-defender",[396],{"type":35,"value":397},"Decisiones que vale la pena defender",{"type":29,"tag":68,"props":399,"children":400},{},[401,411],{"type":29,"tag":72,"props":402,"children":403},{},[404,409],{"type":29,"tag":47,"props":405,"children":406},{},[407],{"type":35,"value":408},"Pest sobre PHPUnit",{"type":35,"value":410}," — 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":29,"tag":72,"props":412,"children":413},{},[414,419],{"type":29,"tag":47,"props":415,"children":416},{},[417],{"type":35,"value":418},"E2E asistido por IA como metodología, no como algo puntual",{"type":35,"value":420}," — 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":29,"tag":30,"props":422,"children":424},{"id":423},"resultado",[425],{"type":35,"value":426},"Resultado",{"type":29,"tag":38,"props":428,"children":429},{},[430],{"type":35,"value":431},"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":29,"tag":30,"props":433,"children":435},{"id":434},"evidencia-metadatos-públicos-de-prs",[436],{"type":35,"value":437},"Evidencia (metadatos públicos de PRs)",{"type":29,"tag":68,"props":439,"children":440},{},[441,446,459],{"type":29,"tag":72,"props":442,"children":443},{},[444],{"type":35,"value":445},"PR #13594 — migración a Pest (~64k líneas).",{"type":29,"tag":72,"props":447,"children":448},{},[449,451,457],{"type":35,"value":450},"PR #13782 — ",{"type":29,"tag":79,"props":452,"children":454},{"className":453},[],[455],{"type":35,"value":456},"feat(e2e): AI agent E2E testing methodology",{"type":35,"value":458}," (+48k líneas).",{"type":29,"tag":72,"props":460,"children":461},{},[462],{"type":35,"value":463},"PR #13645 — migración completa de E2E + unit a Pest.",{"title":8,"searchDepth":138,"depth":138,"links":465},[466,467,468,469,470],{"id":336,"depth":138,"text":339},{"id":347,"depth":138,"text":350},{"id":394,"depth":138,"text":397},{"id":423,"depth":138,"text":426},{"id":434,"depth":138,"text":437},"content:es:case-studies:qa-transformation.md","es\u002Fcase-studies\u002Fqa-transformation.md","es\u002Fcase-studies\u002Fqa-transformation",{"_path":475,"_dir":304,"_draft":7,"_partial":7,"_locale":8,"title":476,"description":8,"area":477,"summary":478,"order":138,"body":479,"_type":144,"_id":635,"_source":146,"_file":636,"_stem":637,"_extension":149},"\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":26,"children":480,"toc":628},[481,494,502,506,511,517,570,574,597,601,606,610],{"type":29,"tag":311,"props":482,"children":483},{},[484],{"type":29,"tag":38,"props":485,"children":486},{},[487,488,492],{"type":35,"value":318},{"type":29,"tag":47,"props":489,"children":490},{},[491],{"type":35,"value":323},{"type":35,"value":493},". No se\ndivulga código propietario.",{"type":29,"tag":38,"props":495,"children":496},{},[497],{"type":29,"tag":189,"props":498,"children":501},{"alt":499,"src":500},"Flujo de idempotencia de webhook","\u002Fdiagrams\u002Fpayments-webhook.svg",[],{"type":29,"tag":30,"props":503,"children":504},{"id":336},[505],{"type":35,"value":339},{"type":29,"tag":38,"props":507,"children":508},{},[509],{"type":35,"value":510},"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":29,"tag":30,"props":512,"children":514},{"id":513},"lo-que-construí",[515],{"type":35,"value":516},"Lo que construí",{"type":29,"tag":68,"props":518,"children":519},{},[520,530,548,558],{"type":29,"tag":72,"props":521,"children":522},{},[523,528],{"type":29,"tag":47,"props":524,"children":525},{},[526],{"type":35,"value":527},"MercadoPago QR + webhook",{"type":35,"value":529}," — un flujo de pago con UX de bloqueo, ingesta de\nwebhooks, idempotencia y verificación de firma (+16.000 líneas, 94 archivos).",{"type":29,"tag":72,"props":531,"children":532},{},[533,538,540],{"type":29,"tag":47,"props":534,"children":535},{},[536],{"type":35,"value":537},"Integración HC → RIS",{"type":35,"value":539}," — puente entre la historia clínica electrónica y un\nsistema radiológico externo (RIS Eden) mediante client + factory + controllers\n",{"type":29,"tag":68,"props":541,"children":542},{},[543],{"type":29,"tag":72,"props":544,"children":545},{},[546],{"type":35,"value":547},"tests (+7.7k\u002F-3k líneas).",{"type":29,"tag":72,"props":549,"children":550},{},[551,556],{"type":29,"tag":47,"props":552,"children":553},{},[554],{"type":35,"value":555},"Facturación electrónica con Facturacion.Cl",{"type":35,"value":557}," — habilitó la operación de la\nplataforma en Chile (un nuevo mercado).",{"type":29,"tag":72,"props":559,"children":560},{},[561,563,568],{"type":35,"value":562},"Un ",{"type":29,"tag":47,"props":564,"children":565},{},[566],{"type":35,"value":567},"patrón de integración",{"type":35,"value":569}," 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":29,"tag":30,"props":571,"children":572},{"id":394},[573],{"type":35,"value":397},{"type":29,"tag":68,"props":575,"children":576},{},[577,587],{"type":29,"tag":72,"props":578,"children":579},{},[580,585],{"type":29,"tag":47,"props":581,"children":582},{},[583],{"type":35,"value":584},"Idempotencia + verificación de firma primero.",{"type":35,"value":586}," 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":29,"tag":72,"props":588,"children":589},{},[590,595],{"type":29,"tag":47,"props":591,"children":592},{},[593],{"type":35,"value":594},"Client + factory para el bridge RIS",{"type":35,"value":596}," — adapter intercambiable para que la\nhistoria clínica electrónica no quede hard-coupled a un único vendor\nradiológico.",{"type":29,"tag":30,"props":598,"children":599},{"id":423},[600],{"type":35,"value":426},{"type":29,"tag":38,"props":602,"children":603},{},[604],{"type":35,"value":605},"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":29,"tag":30,"props":607,"children":608},{"id":434},[609],{"type":35,"value":437},{"type":29,"tag":68,"props":611,"children":612},{},[613,618,623],{"type":29,"tag":72,"props":614,"children":615},{},[616],{"type":35,"value":617},"PR #13461 — MercadoPago QR + webhook (+16k\u002F-5k líneas).",{"type":29,"tag":72,"props":619,"children":620},{},[621],{"type":35,"value":622},"PR #13424 — Integración HC → RIS Eden (+7.7k\u002F-3k).",{"type":29,"tag":72,"props":624,"children":625},{},[626],{"type":35,"value":627},"PR #13105 — Facturación electrónica con Facturacion.Cl.",{"title":8,"searchDepth":138,"depth":138,"links":629},[630,631,632,633,634],{"id":336,"depth":138,"text":339},{"id":513,"depth":138,"text":516},{"id":394,"depth":138,"text":397},{"id":423,"depth":138,"text":426},{"id":434,"depth":138,"text":437},"content:es:case-studies:payments-integrations.md","es\u002Fcase-studies\u002Fpayments-integrations.md","es\u002Fcase-studies\u002Fpayments-integrations",{"_path":639,"_dir":304,"_draft":7,"_partial":7,"_locale":8,"title":640,"description":8,"area":641,"summary":642,"order":643,"body":644,"_type":144,"_id":803,"_source":146,"_file":804,"_stem":805,"_extension":149},"\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":26,"children":645,"toc":796},[646,659,667,671,676,680,723,727,750,754,759,763],{"type":29,"tag":311,"props":647,"children":648},{},[649],{"type":29,"tag":38,"props":650,"children":651},{},[652,653,657],{"type":35,"value":318},{"type":29,"tag":47,"props":654,"children":655},{},[656],{"type":35,"value":323},{"type":35,"value":658}," — 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":29,"tag":38,"props":660,"children":661},{},[662],{"type":29,"tag":189,"props":663,"children":666},{"alt":664,"src":665},"Optimización de query lenta: 30s a ~2s","\u002Fdiagrams\u002Fperf-query.svg",[],{"type":29,"tag":30,"props":668,"children":669},{"id":336},[670],{"type":35,"value":339},{"type":29,"tag":38,"props":672,"children":673},{},[674],{"type":35,"value":675},"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":29,"tag":30,"props":677,"children":678},{"id":347},[679],{"type":35,"value":350},{"type":29,"tag":68,"props":681,"children":682},{},[683,693,703,713],{"type":29,"tag":72,"props":684,"children":685},{},[686,691],{"type":29,"tag":47,"props":687,"children":688},{},[689],{"type":35,"value":690},"Reducí queries críticas de base de datos de >30s a ~2s (~15×)",{"type":35,"value":692}," reescribiéndolas\ny agregando los índices correctos — la métrica más citada de este trabajo.",{"type":29,"tag":72,"props":694,"children":695},{},[696,701],{"type":29,"tag":47,"props":697,"children":698},{},[699],{"type":35,"value":700},"Diagnosticué y corregí incidentes de caché corrupto",{"type":35,"value":702}," y fortalecí el camino de\ncaché.",{"type":29,"tag":72,"props":704,"children":705},{},[706,711],{"type":29,"tag":47,"props":707,"children":708},{},[709],{"type":35,"value":710},"100+ deploys y hotfixes a producción",{"type":35,"value":712},", incluyendo respuesta a incidentes\nurgentes.",{"type":29,"tag":72,"props":714,"children":715},{},[716,721],{"type":29,"tag":47,"props":717,"children":718},{},[719],{"type":35,"value":720},"Centralicé el monitoreo de errores en Sentry",{"type":35,"value":722}," para que las regresiones se\ndetecten inmediatamente en lugar de por reportes de usuarios.",{"type":29,"tag":30,"props":724,"children":725},{"id":394},[726],{"type":35,"value":397},{"type":29,"tag":68,"props":728,"children":729},{},[730,740],{"type":29,"tag":72,"props":731,"children":732},{},[733,738],{"type":29,"tag":47,"props":734,"children":735},{},[736],{"type":35,"value":737},"Medir y después optimizar.",{"type":35,"value":739}," La mejora de 30s→2s provino de identificar las\nqueries ofensoras reales (mediante análisis de slow queries), no de indexación\nespeculativa.",{"type":29,"tag":72,"props":741,"children":742},{},[743,748],{"type":29,"tag":47,"props":744,"children":745},{},[746],{"type":35,"value":747},"Tratar el acceso a producción como una skill de primera",{"type":35,"value":749}," — hotfixes\ndisciplinados, chicos y reversibles bajo presión, sin heroicos.",{"type":29,"tag":30,"props":751,"children":752},{"id":423},[753],{"type":35,"value":426},{"type":29,"tag":38,"props":755,"children":756},{},[757],{"type":35,"value":758},"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":29,"tag":30,"props":760,"children":761},{"id":434},[762],{"type":35,"value":437},{"type":29,"tag":68,"props":764,"children":765},{},[766,779,784],{"type":29,"tag":72,"props":767,"children":768},{},[769,771,777],{"type":35,"value":770},"PR #13795 — ",{"type":29,"tag":79,"props":772,"children":774},{"className":773},[],[775],{"type":35,"value":776},"Production mejoras slow queries",{"type":35,"value":778},".",{"type":29,"tag":72,"props":780,"children":781},{},[782],{"type":35,"value":783},"PR #13468 — fix de caché corrupto.",{"type":29,"tag":72,"props":785,"children":786},{},[787,789,795],{"type":35,"value":788},"100+ PRs etiquetados ",{"type":29,"tag":79,"props":790,"children":792},{"className":791},[],[793],{"type":35,"value":794},"Production",{"type":35,"value":778},{"title":8,"searchDepth":138,"depth":138,"links":797},[798,799,800,801,802],{"id":336,"depth":138,"text":339},{"id":347,"depth":138,"text":350},{"id":394,"depth":138,"text":397},{"id":423,"depth":138,"text":426},{"id":434,"depth":138,"text":437},"content:es:case-studies:performance-reliability.md","es\u002Fcase-studies\u002Fperformance-reliability.md","es\u002Fcase-studies\u002Fperformance-reliability",1788209838046]