<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Brian's Notes]]></title><description><![CDATA[Construyo cosas. Luego escribo sobre lo que funcionó.

Soy Brian Mena. Ingeniero informático, solopreneur y padre. Trabajo con código, datos y agentes de IA para construir productos digitales rentables desde cero.

No tengo equipo. No tengo inversores.]]></description><link>https://newsletter.brianmenagomez.com</link><image><url>https://substackcdn.com/image/fetch/$s_!7nbD!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9dcf7f-ea19-48c6-9eb8-91e45dd4b8eb_1280x1280.png</url><title>Brian&apos;s Notes</title><link>https://newsletter.brianmenagomez.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 06 Jun 2026 06:01:09 GMT</lastBuildDate><atom:link href="https://newsletter.brianmenagomez.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Brian Mena Gómez]]></copyright><language><![CDATA[es]]></language><webMaster><![CDATA[contacto@brianmenagomez.com]]></webMaster><itunes:owner><itunes:email><![CDATA[contacto@brianmenagomez.com]]></itunes:email><itunes:name><![CDATA[Brian Mena Gómez]]></itunes:name></itunes:owner><itunes:author><![CDATA[Brian Mena Gómez]]></itunes:author><googleplay:owner><![CDATA[contacto@brianmenagomez.com]]></googleplay:owner><googleplay:email><![CDATA[contacto@brianmenagomez.com]]></googleplay:email><googleplay:author><![CDATA[Brian Mena Gómez]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[AI Agents: El 99% de los Tests Unitarios No Detecta el Fallo Real — Cómo Construir un Evaluation Harness que Mida lo que Importa]]></title><description><![CDATA[Los AI Agents fallan de forma silenciosa: decisiones incorrectas con alta confianza que ning&#250;n test unitario detecta. Construye un evaluation harness de 4 buckets para medir precisi&#243;n, confianza y coste real.]]></description><link>https://newsletter.brianmenagomez.com/p/ai-agents-el-99-de-los-tests-unitarios</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/ai-agents-el-99-de-los-tests-unitarios</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Fri, 05 Jun 2026 07:00:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ffdac2e4-5a7f-40b3-a331-ea108f6a842c_1080x748.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Tu AI Agent No Est&#225; Fallando Cuando Lancea una Excepci&#243;n. Est&#225; Fallando Cuando Escribe una Respuesta Perfecta que Es Completamente Incorrecta.</strong></h2><p>Y ning&#250;n test unitario del mundo va a detectarlo.</p><p>La industria asume que los AI Agents se eval&#250;an como software tradicional: m&#225;s tests = m&#225;s calidad. Escrib&#237;s tests unitarios. Prob&#225;is funciones helper. Valid&#225;is que el JSON parsea bien. Y cuando todo pasa, asum&#237;s que el agent funciona.</p><p><strong>*Pero un AI Agent que pasa todos los tests unitarios puede estar tomando decisiones catastr&#243;ficas con un 95% de confianza.</strong> *</p><p>El problema no es que fallen. Es que <strong>fallan bien</strong>. Con buena gram&#225;tica. Con paso seguro. Sin lanzar ninguna excepci&#243;n que un try-catch pueda atrapar.</p><p>Bienvenidos al verdadero problema de evaluar AI Agents en 2026.</p><p>---</p><h2><strong>Por Qu&#233; el Try-Catch Es un Error Categorial</strong></h2><p>El try-catch fue dise&#241;ado para errores de runtime. Null pointers. Timeouts. Conexiones fallidas. Excepciones que rompen el flujo de ejecuci&#243;n.</p><p>Pero un AI Agent que decide incorrectamente no lanza una excepci&#243;n. <strong>Ejecuta c&#243;digo perfectamente v&#225;lido que lleva a una decisi&#243;n equivocada.</strong></p><p>Pi&#233;nsalo as&#237;: un conductor con GPS toma la salida equivocada en una autopista. El coche funciona perfectamente. El GPS da indicaciones claras. No hay ning&#250;n error en el sistema. Pero el destino es otro.</p><p>El software tradicional confunde <strong>"funcionar sin errores"</strong> con <strong>"funcionar correctamente"</strong>. Para AI Agents, esas dos cosas no tienen correlaci&#243;n.</p><p>Ve&#225;moslo con c&#243;digo:</p><p>```python</p><h1>&#10060; TEST UNITARIO TRADICIONAL &#8212; Este test lo pasa el agent</h1><p>def test_get_user_email():</p><p>agent = CustomerSupportAgent()</p><p>result = agent.get_user_email("user_123")</p><p>assert result is not None  # &#9989; Pasa: devolvi&#243; un string</p><p>assert "@" in result       # &#9989; Pasa: tiene formato de email</p><h1>&#9989; EVALUATION REAL &#8212; Esto es lo que el test unitario NO ve</h1><p>def evaluate_agent_decision():</p><p>agent = CustomerSupportAgent()</p><h1>El agent devuelve un email que NO existe en la base de datos</h1><h1>pero con formato perfectamente v&#225;lido</h1><p>result = agent.get_user_email("user_123")</p><h1>result = "soporte@noexiste.com" &#8212; formato perfecto, dato incorrecto</h1><p>real_email = query_database("SELECT email FROM users WHERE id = 'user_123'")</p><h1>real_email = "maria@empresa.com"</h1><p>assert result == real_email  # &#10060; FALLA: el dato es incorrecto</p><h1>Pero ning&#250;n test unitario comprueba esto</h1><p>```</p><p>El primer test pasa. El segundo test es el que realmente importa. Y el 99% de los equipos solo escribe el primero.</p><p>---</p><h2><strong>El Peligro de la Alta Confianza en Decisiones Incorrectas</strong></h2><p>Los modelos de lenguaje generan tokens con probabilidades asociadas (logprobs). Cuando un modelo produce una respuesta con alta probabilidad en cada token, internamente <strong>"cree"</strong> que est&#225; en lo correcto.</p><p>Esto es an&#225;logo a un empleado que nunca duda de s&#237; mismo pero se equivoca sistem&#225;ticamente. En evaluaci&#243;n de agents, el peor escenario no es el agent que duda (fallo visible, f&#225;cil de atrapar). <strong>Es el que ejecuta con convicci&#243;n una acci&#243;n da&#241;ina.</strong></p><p>| Nivel de Confianza | Decisi&#243;n Correcta | Decisi&#243;n Incorrecta |</p><p>|-------------------|-------------------|-------------------|</p><p>| <strong>Confianza Alta</strong> | El agente funciona. Todo bien. | &#9888;&#65039; <strong>PELIGRO</strong>: Modo de fallo invisible. El agent act&#250;a sin dudar. |</p><p>| <strong>Duda/Baja</strong> | El agente funciona pero es ineficiente. Pide clarificaci&#243;n constante. | El agente duda. El fallo es detectable. Se puede intervenir. |</p><p>El bucket cr&#237;tico es <strong>"incorrecto + confianza alta"</strong>. Fallos invisibles que el agente ejecutar&#225; sin dudar. No hay log. No hay error. No hay excepci&#243;n. Solo una decisi&#243;n equivocada ejecutada con total convicci&#243;n.</p><p>---</p><h2><strong>El Sistema de 4 Buckets: Tu Evaluation Harness para AI Agents</strong></h2><p>Constru&#237; esto despu&#233;s de ver c&#243;mo agents en producci&#243;n tomaban decisiones da&#241;inas sin que nadie pudiera detectarlo a tiempo. No es teor&#237;a. <strong>Es el harness que uso hoy en producci&#243;n.</strong></p><p>El sistema clasifica cada acci&#243;n del agent en una matriz 2x2 y te permite ver exactamente d&#243;nde est&#225; fallando tu sistema.</p><h3><strong>Bucket 1 &#8212; Taxonom&#237;a de Fallos Espec&#237;fica de tu Dominio</strong></h3><p>No todos los fallos son iguales. Tienes que definir los tuyos:</p><ul><li><p><strong>Errores de hecho</strong>: informaci&#243;n incorrecta (el agent dijo que la empresa est&#225; en Madrid cuando est&#225; en Barcelona)</p></li><li><p><strong>Errores de procedimiento</strong>: paso incorrecto en un workflow (cerr&#243; un ticket sin asignarlo)</p></li><li><p><strong>Errores de alucinaci&#243;n</strong>: informaci&#243;n inventada (cre&#243; un cliente que no existe)</p></li><li><p><strong>Errores de omisi&#243;n</strong>: no hacer algo que deb&#237;a hacerse (no envi&#243; el email de confirmaci&#243;n)</p></li></ul><p>```python</p><h1>Taxonomy of failures &#8212; domain-specific</h1><p>class FailureTaxonomy:</p><p>FACTUAL = "factual_error"        # Wrong information</p><p>PROCEDURAL = "procedural_error"  # Wrong step in workflow</p><p>HALLUCINATION = "hallucination"  # Invented information</p><p>OMISSION = "omission_error"      # Didn't do what was needed</p><p>NONE = "no_error"                # Correct execution</p><p>```</p><h3><strong>Bucket 2 &#8212; Medir Confianza vs Precisi&#243;n</strong></h3><p>Extrae los logprobs del modelo en cada respuesta y cr&#250;zalos con la correcci&#243;n factual de la acci&#243;n:</p><p>```python</p><p>import openai</p><p>import numpy as np</p><p>class ConfidenceAccuracyTracker:</p><p>def __init__(self):</p><p>self.results = []  # (confidence, accuracy, decision_id)</p><p>def evaluate_decision(self, prompt, expected_action, agent_response):</p><h1>Extraer logprobs de la respuesta del modelo</h1><p>response = openai.chat.completions.create(</p><p>model="gpt-4o",</p><p>messages=[{"role": "user", "content": prompt}],</p><p>logprobs=True,</p><p>top_logprobs=5</p><p>)</p><h1>Calcular confianza media de los tokens</h1><p>token_logprobs = []</p><p>for token_data in response.choices[0].logprobs.content:</p><p>token_logprobs.append(token_data.logprob)</p><p>avg_confidence = np.exp(np.mean(token_logprobs))  # Convertir logprob a probabilidad</p><h1>Evaluar precisi&#243;n de la decisi&#243;n</h1><p>is_correct = self._check_accuracy(agent_response, expected_action)</p><p>self.results.append({</p><p>"confidence": avg_confidence,</p><p>"accuracy": 1.0 if is_correct else 0.0,</p><p>"bucket": self._classify_bucket(avg_confidence, is_correct),</p><p>"decision_id": str(uuid.uuid4())[:8]</p><p>})</p><p>return self.results[-1]</p><p>def _classify_bucket(self, confidence, is_correct):</p><p>if is_correct and confidence &gt; 0.85:</p><p>return "correcta-confianza"      # &#9989; El mejor caso</p><p>elif is_correct and confidence &lt;= 0.85:</p><p>return "correcta-duda"           # &#9889; Funciona pero ineficiente</p><p>elif not is_correct and confidence &gt; 0.85:</p><p>return "incorrecta-confianza"    # &#128680; PELIGRO: Fallo invisible</p><p>else:</p><p>return "incorrecta-duda"         # &#9888;&#65039; Detectable, intervenible</p><p>```</p><h3><strong>Bucket 3 &#8212; Logging Estructural de Decisiones</strong></h3><p>No loguees solo errores. <strong>Loguea cada decisi&#243;n con su contexto completo:</strong></p><p>```python</p><p>class StructuralDecisionLogger:</p><p>def log_decision(self, agent_id, decision_data):</p><p>log_entry = {</p><p>"timestamp": datetime.utcnow().isoformat(),</p><p>"agent_id": agent_id,</p><p>"decision": decision_data["action"],</p><p>"confidence": decision_data["confidence"],</p><p>"tokens_consumed": decision_data["tokens"],</p><p>"latency_ms": decision_data["latency_ms"],</p><p>"human_in_the_loop": decision_data.get("required_human", False),</p><p>"bucket": decision_data["bucket"],</p><p>"expected_vs_actual": {</p><p>"expected": decision_data["expected"],</p><p>"actual": decision_data["actual"]</p><p>}</p><p>}</p><h1>Enviar a tu sistema de logging (Datadog, Grafana, etc.)</h1><p>self._send_to_logging_pipeline(log_entry)</p><h1>Alarma autom&#225;tica si el agent est&#225; en bucket peligroso</h1><p>if decision_data["bucket"] == "incorrecta-confianza":</p><p>self._trigger_alert(log_entry)</p><p>```</p><h3><strong>Bucket 4 &#8212; Dashboard de 4 Cuadrantes</strong></h3><p>Creas un dashboard que clasifica cada ejecuci&#243;n en tiempo real y te permite ver patrones:</p><p>```</p><p>CONFIANZA ALTA          |        CONFIANZA BAJA</p><p>&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</p><p>&#9989; CORRECTO  | Ejecuciones &#243;ptimas   | &#9889; CORRECTO | Ejecuciones v&#225;lidas</p><p>| (mejorar tiempo/coste) |             | pero dudosas (ineficiencia)</p><p>|                        |             |</p><p>| Objetivo: mantener aqu&#237; |            | Objetivo: aumentar confianza</p><p>&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</p><p>&#10060; INCORRECTO | &#128680; PELIGRO           | &#10060; INCORRECTO | Fallos detectables</p><p>| Fallos invisibles      |             | El agent duda</p><p>| El agent NO duda       |             | F&#225;cil de intervenir</p><p>|                        |             |</p><p>| Objetivo: CERO tolerancia |         | Objetivo: minimizar</p><p>```</p><p>Si ves ejecuciones en el cuadrante <strong>"incorrecto + confianza alta"</strong>, tienes un problema de arquitectura, no de modelo. El agent est&#225; aprendiendo patrones incorrectos con total seguridad.</p><p>---</p><h2><strong>C&#243;mo Implementarlo en Producci&#243;n (Sin Morir en el Intento)</strong></h2><p>Vale, s&#233; lo que est&#225;s pensando: "Extraer logprobs y medir confianza es demasiado complejo para producci&#243;n".</p><p>Es cierto que a&#241;ade complejidad. <strong>Pero es la &#250;nica manera de detectar el modo de fallo m&#225;s peligroso.</strong> Empieza con un submuestreo del 10% de las ejecuciones. No necesitas medir todas.</p><p>Usa herramientas que ya soportan esto:</p><ul><li><p><strong>LangSmith</strong>: tiene tracing nativo con logprobs y evaluaci&#243;n de decisiones</p></li><li><p><strong>Weights &amp; Biases</strong>: soporta logging de confianza para modelos de lenguaje</p></li><li><p><strong>MLflow</strong>: tracking de experimentos con m&#233;tricas personalizadas</p></li></ul><p>```python</p><h1>Production-ready: sample 10% of executions for evaluation</h1><p>class ProductionEvaluationHarness:</p><p>def __init__(self, sample_rate=0.1):</p><p>self.sample_rate = sample_rate</p><p>self.tracker = ConfidenceAccuracyTracker()</p><p>self.logger = StructuralDecisionLogger()</p><p>def evaluate(self, agent_decision, expected, agent_id):</p><h1>Solo evaluamos una muestra para no ralentizar producci&#243;n</h1><p>if random.random() &gt; self.sample_rate:</p><p>return</p><p>result = self.tracker.evaluate_decision(</p><p>prompt=agent_decision["prompt"],</p><p>expected_action=expected,</p><p>agent_response=agent_decision["response"]</p><p>)</p><p>self.logger.log_decision(agent_id, {</p><p>**agent_decision,</p><p>"confidence": result["confidence"],</p><p>"bucket": result["bucket"],</p><p>"expected": expected</p><p>})</p><p>return result</p><p>```</p><p>---</p><h2><strong>Lo que la Gente se Equivoca al Decir (Y la Verdad)</strong></h2><p><strong>"Pero si mi agent pasa los tests de integraci&#243;n y no lanza errores, est&#225; funcionando correctamente."</strong></p><p>&#10060; <strong>Falso</strong>. Confundes funcionamiento t&#233;cnico con correcci&#243;n sem&#225;ntica. Un agent puede ejecutar c&#243;digo perfectamente (sin errores de runtime) mientras toma decisiones l&#243;gicamente incorrectas. El c&#243;digo puede ser impecable y la decisi&#243;n catastr&#243;fica.</p><p><strong>"Los logs tradicionales ya capturan los errores &#8212; solo necesito mejor logging."</strong></p><p>&#10060; <strong>Falso</strong>. Los logs tradicionales capturan excepciones y errores de sistema. <strong>No capturan decisiones incorrectas con alta confianza</strong> porque desde la perspectiva del sistema, todo funcion&#243; correctamente. No hay nada que loguear. Necesitas logging sem&#225;ntico que eval&#250;e la correcci&#243;n de la decisi&#243;n, no solo la ejecuci&#243;n del c&#243;digo.</p><p><strong>"Extraer logprobs y medir confianza es demasiado complejo para producci&#243;n."</strong></p><p>&#9989; <strong>Parcialmente cierto, pero manejable</strong>. A&#241;ade complejidad, pero es la &#250;nica defensa contra el modo de fallo m&#225;s peligroso. Empieza con un submuestreo del 10%. Usa herramientas como LangSmith que ya lo soportan. La alternativa es descubrir el fallo cuando el cliente te lo dice.</p><p>---</p><h2><strong>La L&#237;nea de Meta</strong></h2><p>El 2026 nos ha ense&#241;ado algo claro: <strong>los AI Agents no son software tradicional</strong>. No puedes evaluarlos con las mismas herramientas. Los tests unitarios miden si el c&#243;digo funciona. No miden si la decisi&#243;n es correcta.</p><p>El <strong>Sistema de 4 Buckets</strong> no es opcional. Es la diferencia entre un agent que parece funcionar y uno que realmente funciona.</p><p>Empieza hoy. Define tu taxonom&#237;a de fallos. Extrae logprobs. Mide confianza vs precisi&#243;n. Y pon un dashboard que te muestre d&#243;nde est&#225;n tus agents fallando en silencio.</p><p>Porque el AI Agent perfectamente escrito que toma decisiones incorrectas con un 95% de confianza <strong>no es un bug. Es una bomba de relojer&#237;a.</strong></p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/evaluation-harness-ai-agents-4-buckets-2026-20260605?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El 90% de los Compradores de Negocios Online Miden las Métricas Equivocadas. El 90% de las Adquisiciones Fracasan por las Mismas.]]></title><description><![CDATA[Aprende a evaluar oportunidades de compra de negocios online: tr&#225;fico, calidad de revenue, dependencia del fundador y foso competitivo. Framework de 5 pasos para no fracasar.]]></description><link>https://newsletter.brianmenagomez.com/p/el-90-de-los-compradores-de-negocios</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-90-de-los-compradores-de-negocios</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Fri, 05 Jun 2026 07:00:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d493ae7b-e321-4c2d-b022-58261e35978f_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 90% de los Compradores de Negocios Online Miden las M&#233;tricas Equivocadas. El 90% de las Adquisiciones Fracasan por las Mismas.</strong></h2><p>Crees que el problema al comprar un negocio online es saber si el m&#250;ltiplo es razonable. Que con revisar el tr&#225;fico en SimilarWeb y el MRR en una captura de pantalla tienes suficiente para decidir.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 90% de los compradores eval&#250;a m&#250;ltiplo de ingresos y crecimiento de tr&#225;fico. Y el 90% de las adquisiciones que fracasan ten&#237;an tr&#225;fico y crecimiento &#8212; pero tambi&#233;n una dependencia letal del fundador que ning&#250;n m&#250;ltiplo pudo predecir.</p><p>La sabidur&#237;a convencional dice: "tr&#225;fico en crecimiento = buen negocio". La realidad es que <strong>tr&#225;fico sin se&#241;ales de calidad es un pasivo</strong>, no un activo. Cuando compras un negocio online, no est&#225;s comprando ingresos pasados. Est&#225;s comprando la probabilidad de que esos ingresos contin&#250;en sin ti.</p><p>Y esa probabilidad no se mide con un m&#250;ltiplo. Se mide con cuatro dimensiones que la mayor&#237;a ignora.</p><p>---</p><h2><strong>El Error de Diagn&#243;stico M&#225;s Caro del Mercado de Adquisiciones</strong></h2><p>Cada semana veo a compradores obsesionados con el m&#250;ltiplo. "Es un negocio que hace X y piden 2.5x, &#191;es buen precio?".</p><p>Esa pregunta no tiene sentido sin contexto.</p><p>Un negocio con 2.5x de m&#250;ltiplo puede ser una trampa si el 80% del tr&#225;fico viene de un solo art&#237;culo en Google que puede desaparecer ma&#241;ana con una actualizaci&#243;n del algoritmo. Y un negocio con 4x puede ser una ganga si el revenue est&#225; diversificado, la operaci&#243;n funciona sin el fundador, y tiene un foso defendible.</p><p>&#10060; <strong>Lo que hace la mayor&#237;a:</strong> compara m&#250;ltiplos entre targets como si fueran el mismo tipo de activo.</p><p>&#9989; <strong>Lo que deber&#237;as hacer:</strong> evaluar cada target en cuatro dimensiones independientes &#8212; tr&#225;fico, revenue, dependencia del fundador y foso competitivo &#8212; y *luego* comparar el m&#250;ltiplo ajustado por riesgo.</p><p>La diferencia entre un comprador que acierta y uno que fracasa no es cu&#225;nto paga. Es <strong>lo que mide antes de pagar</strong>.</p><p>---</p><h2><strong>Dimensi&#243;n 1: Descomposici&#243;n de Fuentes de Tr&#225;fico</strong></h2><p>El tr&#225;fico no es tr&#225;fico. No todo visitante vale lo mismo.</p><p>Un negocio que genera 100.000 visitas al mes desde Google org&#225;nico parece s&#243;lido. Pero si abres Ahrefs o SimilarWeb y ves que el 70% de ese tr&#225;fico viene de tres keywords, tienes un problema de <strong>concentraci&#243;n de riesgo</strong>.</p><p>Lo que debes analizar:</p><ul><li><p><strong>Distribuci&#243;n por fuente:</strong> org&#225;nico, directo, referral, paid, social. Cualquier fuente que supere el 60% del total es una bandera roja.</p></li><li><p><strong>Keywords subyacentes:</strong> n&#250;mero de keywords que rankean y su volatilidad en 12 meses. Un negocio que depende de 5 keywords pierde el 80% de su tr&#225;fico si Google cambia las reglas.</p></li><li><p><strong>Estacionalidad:</strong> tr&#225;fico consistente durante 24 meses o picos que ocultan meses devalle.</p></li></ul><p>Si el vendedor no te da acceso a Google Search Console antes de la carta de intenci&#243;n, eso ya es una se&#241;al. P&#237;delo como condici&#243;n para avanzar. <strong>Si se niega, ret&#237;rate.</strong></p><p>---</p><h2><strong>Dimensi&#243;n 2: Auditor&#237;a de Calidad del Revenue</strong></h2><p>El revenue total miente m&#225;s de lo que acierta.</p><p>Un negocio SaaS con 50.000 &#8364;/a&#241;o de MRR parece estable. Pero si el 35% de ese revenue viene de tres clientes empresariales, no tienes un negocio recurrente. Tienes <strong>tres contratos que pueden cancelarse el mismo trimestre</strong>.</p><p>Lo que debes auditar:</p><p><strong>Antes de la LOI (carta de intenci&#243;n):</strong></p><ul><li><p>Rese&#241;as de clientes en plataformas p&#250;blicas (Trustpilot, G2, Capterra)</p></li><li><p>Perfiles de Linkedin del equipo para entender rotaci&#243;n</p></li><li><p>Entrevistas con 3-5 clientes referidos por el vendedor</p></li></ul><p><strong>Despu&#233;s de la LOI (con NDA firmado):</strong></p><ul><li><p>Logs de Stripe o PayPal: segmenta revenue por cliente, ticket medio, recurrencia</p></li><li><p>Tasa de churn en 24 meses: un churn mensual del 5% se compone al 46% anual &#8212; el negocio debe reemplazar casi la mitad de sus ingresos cada a&#241;o solo para mantenerse plano</p></li><li><p>Tasa de reembolsos y disputas: por encima del 3% indica problemas de calidad o fraude</p></li><li><p><strong>Net Revenue Retention (NRR):</strong> si NRR est&#225; por debajo del 100%, el negocio est&#225; en una cinta de correr, no en una trayectoria de crecimiento</p></li></ul><p>Un negocio con NRR bajo no es necesariamente malo &#8212; pero requiere una estrategia de crecimiento constante solo para no encogerse. Y esa estrategia la tendr&#225;s que ejecutar t&#250;.</p><p>---</p><h2><strong>Dimensi&#243;n 3: Mapeo de Dependencia del Fundador</strong></h2><p>Esta es la dimensi&#243;n m&#225;s infra-documentada y la que m&#225;s adquisiciones mata.</p><p>Muchos negocios se venden como "pasivos" cuando el fundador est&#225; realizando entre 10 y 15 horas de trabajo invisible a la semana. Responder emails de soporte. Ajustar campa&#241;as de anuncios. Actualizar contenido. Subir parches de seguridad al servidor.</p><p>El vendedor no miente &#8212; simplemente no considera ese trabajo como "trabajo". Es su rutina diaria. Pero para ti, que entras desde fuera, es una losa.</p><p><strong>El espectro de dependencia:</strong></p><ul><li><p><strong>Supervisi&#243;n estrat&#233;gica</strong> (2-4 horas al mes): revisar m&#233;tricas, aprobar decisiones. Riesgo bajo.</p></li><li><p><strong>Ejecuci&#243;n operativa</strong> (10-20 horas a la semana): tareas diarias que dependen del conocimiento del fundador. Riesgo alto.</p></li><li><p><strong>Ejecuci&#243;n cr&#237;tica no delegable</strong> (20+ horas): el fundador es el &#250;nico que sabe c&#243;mo funciona el servidor, c&#243;mo escribe el contenido que rankea, o c&#243;mo gestiona la relaci&#243;n con los proveedores. Riesgo m&#225;ximo.</p></li></ul><p><strong>C&#243;mo evaluarlo:</strong></p><p>Exige al vendedor un <strong>registro de tiempo de una semana</strong>. Cada tarea. Categorizada por: (a) requiere su expertise espec&#237;fico, (b) podr&#237;a documentarse y delegarse, (c) ya est&#225; delegada.</p><p>Si hay m&#225;s de tres tareas cr&#237;ticas en la categor&#237;a (a), el negocio no es pasivo. Es un <strong>empleo encubierto</strong>.</p><p>---</p><h2><strong>Dimensi&#243;n 4: Inventario del Foso Competitivo</strong></h2><p>El foso es lo que protege el negocio de que llegue otro y lo copie en tres meses.</p><p>La mayor&#237;a de los negocios online peque&#241;os no tienen foso. Tienen <strong>ventaja temporal</strong>: llegaron primero a un nicho, construyeron enlaces, acumularon rese&#241;as. Pero eso no es un foso defendible. Es una ventana de oportunidad que se cierra.</p><p>Haz este inventario:</p><ul><li><p><strong>Datos propietarios:</strong> &#191;tienen un dataset &#250;nico que nadie m&#225;s tiene?</p></li><li><p><strong>Efectos de red:</strong> &#191;el valor del producto aumenta cuantos m&#225;s usuarios lo usan?</p></li><li><p><strong>Reconocimiento de marca:</strong> &#191;la gente busca el nombre del negocio directamente?</p></li><li><p><strong>Autoridad SEO:</strong> domain rating, perfil de backlinks, antig&#252;edad del dominio</p></li><li><p><strong>Costes de cambio:</strong> &#191;qu&#233; perder&#237;a un cliente si se fuera?</p></li><li><p><strong>Propiedad intelectual:</strong> patentes, c&#243;digo propietario, procesos registrados</p></li></ul><p>Si despu&#233;s de este inventario la &#250;nica respuesta es "llevamos a&#241;os aqu&#237;", el foso es fino. Y el negocio es vulnerable.</p><p>---</p><h2><strong>La Matriz de Screening en 4 Dimensiones</strong></h2><p>Este es el framework que uso para evaluar cualquier target de adquisici&#243;n. Lo llamo <strong>La Matriz de Screening en 4 Dimensiones</strong>.</p><p><strong>Paso 1: Punt&#250;a cada dimensi&#243;n del 1 al 5</strong></p><p>| Dimensi&#243;n | 1 (Cr&#237;tico) | 3 (Aceptable) | 5 (Excelente) |</p><p>|---|---|---|---|</p><p>| Calidad de tr&#225;fico | &gt;60% de una fuente &#250;nica | Diversificado pero con estacionalidad | 4+ fuentes, keywords amplias, tendencia estable |</p><p>| Calidad de revenue | &gt;30% de 5 clientes, NRR &lt;90% | NRR entre 90-100%, churn manejable | NRR &gt;100%, base amplia de clientes, ingresos recurrentes verificables |</p><p>| Dependencia del fundador | 3+ tareas owner-only | 1-2 tareas owner-only, documentadas | Cero dependencia operativa |</p><p>| Foso competitivo | Sin activos defensibles | Marca o SEO medio, sin datos propietarios | Efectos de red, datos &#250;nicos, costes de cambio altos |</p><p><strong>Paso 2: Aplica el filtro de penalizaci&#243;n</strong></p><p>Si alguna dimensi&#243;n punt&#250;a 1, el negocio est&#225; descartado autom&#225;ticamente para compra directa. A menos que tengas la capacidad operativa para resolver esa dimensi&#243;n &#8212; y est&#233;s dispuesto a pagar el precio en tiempo.</p><p>Un negocio con dependencia alta del fundador puede ser una buena compra si t&#250; eres operador y planeas sistematizarlo. Pero no es un activo pasivo. Es un proyecto de reingenier&#237;a.</p><p><strong>Paso 3: Compara targets en la misma escala</strong></p><p>No compares dos negocios solo por su m&#250;ltiplo. Comp&#225;ralos por su <strong>puntuaci&#243;n ajustada al riesgo</strong>. Un negocio con 4x pero puntuaci&#243;n 18/20 puede ser mejor inversi&#243;n que uno con 2.5x pero puntuaci&#243;n 8/20.</p><p>---</p><h2><strong>C&#243;mo Manejar la Objeci&#243;n del Acceso a Datos</strong></h2><p>"S&#237;, muy bonito el framework, pero no tengo acceso a Stripe ni a Search Console antes de hacer una oferta".</p><p>Tienes raz&#243;n parcialmente. Pero hay se&#241;ales p&#250;blicas que puedes usar:</p><ul><li><p><strong>Tr&#225;fico p&#250;blico:</strong> SimilarWeb, Ahrefs (Domain Rating, backlinks, keywords estimados)</p></li><li><p><strong>Revenue estimado:</strong> herramientas como BuiltWith, Wappalyzer, o estimaciones de ingresos por tr&#225;fico y conversi&#243;n media del sector</p></li><li><p><strong>Dependencia del fundador:</strong> analiza rese&#241;as en Trustpilot. &#191;Los clientes mencionan al fundador por nombre? &#191;El tono de las respuestas es personal o institucional?</p></li><li><p><strong>Foso:</strong> antig&#252;edad del dominio, perfil de enlaces, presencia en medios, menciones de marca</p></li></ul><p>Estas se&#241;ales no reemplazan la auditor&#237;a profunda, pero te permiten <strong>filtrar el 80% de los malos targets antes de perder tiempo</strong> en due diligence.</p><p>Cuando llegues a la LOI, exige acceso total a:</p><ul><li><p>Google Search Console (24 meses de datos)</p></li><li><p>Stripe / PayPal logs completos</p></li><li><p>Acceso al CMS y analytics</p></li><li><p>Entrevistas con 3-5 clientes y 1-2 proveedores</p></li><li><p>Semana de registro de tiempo del fundador</p></li></ul><p>Si el vendedor se niega a cualquiera de estos, ret&#237;rate. <strong>No hay negocio tan bueno que justifique comprar a ciegas.</strong></p><p>---</p><h2><strong>El Riesgo de la Estrategia "C&#243;mpramelo y Sistemat&#237;zalo"</strong></h2><p>Hay un contraargumento v&#225;lido: algunos de los mejores deals son negocios dependientes del fundador que puedes sistematizar y hacer crecer.</p><p>Es cierto. Pero es una estrategia de alto riesgo que requiere:</p><p>1. <strong>Experiencia operativa</strong> que quiz&#225; no tienes</p><p>2. <strong>Tiempo de integraci&#243;n</strong> de 3 a 6 meses donde no ver&#225;s rentabilidad</p><p>3. <strong>Capacidad de gesti&#243;n de personas</strong> para delegar lo que el fundador hac&#237;a solo</p><p>Si no tienes esas tres cosas, no compres un negocio dependiente del fundador esperando que sea pasivo. <strong>No lo ser&#225;.</strong></p><p>Segmenta tu estrategia:</p><ul><li><p><strong>Compra para mantener:</strong> busca targets con puntuaci&#243;n 16+ en la matriz. Pagas m&#225;s m&#250;ltiplo pero corres menos riesgo.</p></li><li><p><strong>Compra para optimizar:</strong> busca targets con puntuaci&#243;n 10-15 donde una dimensi&#243;n es d&#233;bil pero puedes mejorarla. El descuento en el precio compensa el trabajo.</p></li><li><p><strong>Compra para reingenier&#237;a:</strong> targets con puntuaci&#243;n &lt;10 donde el riesgo es alto pero el potencial de ganancia tambi&#233;n. Solo si eres operador con experiencia.</p></li></ul><p>---</p><h2><strong>La Decisi&#243;n No Es el Precio. Es el Riesgo Que Heredas.</strong></h2><p>Cuando compras un negocio online, no pagas por el pasado. Pagas por la <strong>probabilidad de que el futuro se parezca al pasado</strong>.</p><p>Esa probabilidad no est&#225; en el m&#250;ltiplo. Est&#225; en la calidad del tr&#225;fico, la diversificaci&#243;n del revenue, la transferibilidad de la operaci&#243;n y la solidez del foso.</p><p>El 90% de los compradores mide las m&#233;tricas equivocadas. El 90% de las adquisiciones fracasan por las mismas razones.</p><p><strong>*No seas el 90%.</strong>*</p><p>Usa <strong>La Matriz de Screening en 4 Dimensiones</strong>. Punt&#250;a cada target antes de hablar de precio. Y si una dimensi&#243;n punt&#250;a 1, no negocies el precio &#8212; negocia si est&#225;s dispuesto a heredar ese riesgo.</p><p>Porque al final, comprar un negocio online no es una transacci&#243;n financiera. Es una <strong>transmisi&#243;n de fragilidad</strong>.</p><p>Y la fragilidad no se descuenta con un m&#250;ltiplo m&#225;s bajo. Se evita con un mejor screening.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/evaluacion-oportunidades-comprar-negocio-online-20260605?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Error Recovery en AI Agents 2026: El 95% se Rompe en el Primer Error Real — y No, un Try-Catch No Va a Salvarlos]]></title><description><![CDATA[El 95% de los AI Agents fallan en su primer error real. Aprende a implementar ErrorClassifier, validate_output decorators y human checkpoints para construir agents que no se rompen.]]></description><link>https://newsletter.brianmenagomez.com/p/error-recovery-en-ai-agents-2026</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/error-recovery-en-ai-agents-2026</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 04 Jun 2026 07:00:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9b36760f-81d0-42e3-8395-7be4e0d65d88_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 95% de los AI Agents Que Construyes Hoy se Van a Romper en Producci&#243;n</strong></h2><p>No es culpa del modelo. Es culpa de tu try-catch.</p><p>La mayor&#237;a de los desarrolladores tratan los AI Agents como software determinista. Escrib&#237;s c&#243;digo que asume que el LLM va a devolver JSON v&#225;lido. Que la tool call va a funcionar. Que el contexto va a caber en la ventana.</p><p>Y cuando falla, pon&#233;is un try-catch.</p><p><strong>*El problema no es que los agents fallen. Es que los trat&#225;is como funciones puras cuando son sistemas probabil&#237;sticos con estado.</strong> *</p><p>Un AI Agent no lanza excepciones. Corrompe su contexto interno, alucina argumentos de herramientas, y cascada errores hacia abajo como fichas de domin&#243;.</p><p>El 95% de los AI Agents se rompen en su primer error real. Los datos son claros: los try-catch blocks est&#225;n dise&#241;ados para software determinista, no para sistemas donde una alucinaci&#243;n en el paso 3 puede invalidar todo el estado acumulado hasta el paso 10.</p><p>Si est&#225;s buscando <strong>how to build ai agents 2026</strong> con verdadera capacidad de recuperaci&#243;n, lo primero que tienes que aceptar es que el patr&#243;n de error handling tradicional no funciona aqu&#237;.</p><p>---</p><h2><strong>La Falacia del Try-Catch: Por Qu&#233; No Funciona con LLMs</strong></h2><p>El error handling tradicional asume que el sistema puede continuar desde el punto de fallo. Lanzas una excepci&#243;n, la capturas, registras el error, reintentas. Fin.</p><p><strong>*Con AI Agents, eso es una mentira.</strong> *</p><p>Cuando un agente alucina un argumento de tool call &#8212; por ejemplo, pasa un string donde se esperaba un entero &#8212; no es una excepci&#243;n en el sentido de programaci&#243;n. Es una corrupci&#243;n del estado interno del agente.</p><p>&#10060; <strong>Try-catch tradicional:</strong></p><p>```python</p><p>try:</p><p>result = agent.run("Busca clientes en CRM")</p><p>except Exception as e:</p><p>log_error(e)</p><p>retry()  # El contexto ya est&#225; corrupto</p><p>```</p><p>El problema: cuando reintentas desde el mismo estado corrupto, produces el mismo fallo o uno peor. El agente no "olvida" la alucinaci&#243;n &#8212; su ventana de contexto sigue contaminada.</p><p>&#9989; <strong>Clasificaci&#243;n de errores:</strong></p><p>```python</p><p>classificador = ErrorClassifier()</p><p>tipo_error = classificador.classify(error, contexto_actual)</p><p>if tipo_error == ErrorType.TRANSIENT:</p><p>retry_with_backoff()</p><p>elif tipo_error == ErrorType.SCHEMA_MISMATCH:</p><p>reprompt_with_corrected_schema()</p><p>elif tipo_error == ErrorType.CONTEXT_CORRUPTION:</p><p>human_checkpoint()</p><p>```</p><p>La diferencia no es t&#233;cnica. Es arquitect&#243;nica. Un error en un AI Agent no es una excepci&#243;n &#8212; es un problema de clasificaci&#243;n. La pregunta no es "&#191;c&#243;mo manejo esta excepci&#243;n?" sino "&#191;qu&#233; tipo de error es este y qu&#233; ruta de recuperaci&#243;n requiere?"</p><p>---</p><h2><strong>El 90% de los Agents en GitHub Ejecutan Tool Calls Secuenciales &#8212; y Eso Multiplica el Problema</strong></h2><p>Los datos son tozudos: el 90% de los AI Agents en GitHub llaman herramientas de forma secuencial. Tool call 1, tool call 2, tool call 3, en l&#237;nea recta.</p><p>Esto agrava la recuperaci&#243;n de errores. Si falla la tool call 3 de 10, tienes dos opciones:</p><p>1. <strong>Rollback total</strong> &#8212; normalmente imposible porque las tool calls anteriores ya modificaron estado externo (enviaron emails, crearon registros en DB, etc.)</p><p>2. <strong>Checkpoint entre cada paso</strong> &#8212; posible, pero raramente implementado</p><p><strong>*La soluci&#243;n real es la orquestaci&#243;n por grafo de dependencias.</strong> *</p><p>En lugar de ejecutar tool calls en secuencia, defines un DAG (Directed Acyclic Graph) donde cada herramienta especifica sus dependencias. Si falla una tool call, solo re-ejecutas el subgrafo afectado, no todo el flujo.</p><p><strong>Ejemplo pr&#225;ctico:</strong></p><p>```python</p><h1>Flujo secuencial fr&#225;gil</h1><p>agent.tool_call("buscar_cliente")     # Paso 1</p><p>agent.tool_call("validar_credito")    # Paso 2</p><p>agent.tool_call("generar_contrato")   # Paso 3 &#8212; FALLA</p><p>agent.tool_call("enviar_email")       # Paso 4 &#8212; contexto corrupto</p><p>```</p><p>Con orquestaci&#243;n por grafo, si `generar_contrato` falla, puedes re-ejecutar solo ese nodo porque el estado de `buscar_cliente` y `validar_credito` est&#225; checkpointeado fuera del contexto del LLM.</p><p>---</p><h2><strong>El Patr&#243;n de las 3 Categor&#237;as de Error para AI Agents</strong></h2><p>Aqu&#237; est&#225; el framework que deber&#237;as usar en cualquier agente que quieras que sobreviva a producci&#243;n. Lo llamo <strong>*el Patr&#243;n de las 3 Categor&#237;as de Error</strong>*.</p><h3><strong>1. TransientToolError &#8212; Reintento con Exponential Backoff</strong></h3><p>Son errores temporales. Timeouts de API, rate limits, 503s. El estado del agente no est&#225; corrupto &#8212; solo el servicio externo fall&#243;.</p><p>```python</p><p>class TransientToolError(AIError):</p><p>def recover(self, agent_state, max_retries=3):</p><p>for attempt in range(max_retries):</p><p>try:</p><p>wait = min(2 ** attempt, 30)  # Exponential backoff</p><p>time.sleep(wait)</p><p>return self.tool.execute(agent_state)</p><p>except TemporaryError:</p><p>continue</p><p>raise UnrecoverableError("Tool failed after 3 retries")</p><p>```</p><h3><strong>2. SchemaMismatchError &#8212; Re-Prompt con Esquema Corregido</strong></h3><p>El LLM devolvi&#243; datos que no coinciden con el esquema esperado. Esto no es un error temporal &#8212; es el modelo alucinando el formato de salida.</p><p>```python</p><p>class SchemaMismatchError(AIError):</p><p>def recover(self, agent_state, expected_schema):</p><h1>Re-prompt con el esquema expl&#237;cito en el mensaje</h1><p>reprompt = f"""</p><p>El formato devuelto no coincide con lo esperado.</p><p>DEBES devolver EXACTAMENTE esta estructura:</p><p>{json.dumps(expected_schema, indent=2)}</p><p>No a&#241;adas campos extra. No omitas campos requeridos.</p><p>"""</p><p>return agent_state.llm.generate(reprompt)</p><p>```</p><h3><strong>3. ContextCorruptionError &#8212; Human Checkpoint Obligatorio</strong></h3><p>Este es el caso m&#225;s peligroso. El estado interno del agente est&#225; corrupto &#8212; normalmente despu&#233;s de m&#250;ltiples tool calls donde una alucinaci&#243;n temprana contamin&#243; todo el razonamiento posterior.</p><p>```python</p><p>class ContextCorruptionError(AIError):</p><p>def recover(self, agent_state):</p><h1>No auto-retrys. No re-prompts. Humano.</h1><p>checkpoint = HumanCheckpoint(</p><p>state_snapshot=agent_state.get_corrupted_context(),</p><p>error_trace=self.build_error_trace(agent_state),</p><p>suggested_action="Revisar estado y decidir si continuar o reiniciar"</p><p>)</p><p>return checkpoint.await_decision()</p><p>```</p><p>---</p><h2><strong>@validate_output: El Decorador Que Salva Agents</strong></h2><p>El momento cr&#237;tico no es cuando el error ocurre &#8212; es cuando pasa desapercibido. Un dato mal formado que cruza de una tool call a la siguiente puede generar horas de debugging.</p><p>La soluci&#243;n es un decorador que valide el output de cada tool call <em>antes</em> de que el dato entre al contexto del LLM.</p><p>```python</p><p>def validate_output(expected_schema):</p><p>def decorator(func):</p><p>@functools.wraps(func)</p><p>def wrapper(<em>args, </em>*kwargs):</p><p>result = func(<em>args, </em>*kwargs)</p><h1>Validar contra esquema Pydantic</h1><p>try:</p><p>validated = expected_schema(**result)</p><p>return validated</p><p>except ValidationError as e:</p><h1>Clasificar el error inmediatamente</h1><p>raise SchemaMismatchError(</p><p>tool_name=func.__name__,</p><p>expected=expected_schema.schema(),</p><p>actual=result,</p><p>validation_errors=e.errors()</p><p>)</p><p>return wrapper</p><p>return decorator</p><h1>Uso real</h1><p>@validate_output(ClienteSchema)</p><p>def buscar_cliente(email: str) -&gt; dict:</p><h1>Si esto devuelve algo que no coincide con ClienteSchema,</h1><h1>el decorador lanza SchemaMismatchError antes de contaminar el contexto</h1><p>return api.get(f"/clientes/{email}")</p><p>```</p><p>Este patr&#243;n es lo que separa un agente que "funciona en local" de uno que sobrevive en producci&#243;n.</p><p>---</p><h2><strong>Los Human Checkpoints No Son un Fracaso. Son una Caracter&#237;stica</strong></h2><p>El mayor miedo de los equipos que construyen AI Agents es tener que meter a un humano en el loop. Lo ven como una derrota de la autonom&#237;a.</p><p><strong>*Es exactamente lo contrario.</strong> *</p><p>Si hardcodeas auto-recovery para cada clase de error, acabas con dos problemas:</p><p>1. <strong>Agentes fr&#225;giles</strong> &#8212; handlers tan espec&#237;ficos que cualquier desviaci&#243;n los rompe</p><p>2. <strong>Agentes peligrosos</strong> &#8212; auto-retrys que profundizan en estado corrupto produciendo outputs basura</p><p>Los human checkpoints bien dise&#241;ados solo se activan para el 5-10% de los errores. Y protegen el 90-95% restante de operaci&#243;n aut&#243;noma de degradarse.</p><p>El truco est&#225; en la interfaz del checkpoint. No le pases al humano 500 l&#237;neas de contexto. P&#225;sale el m&#237;nimo estado relevante y una sugerencia de acci&#243;n. As&#237;:</p><p>```</p><p>&#9888;&#65039; AGENTE PAUSADO - ContextCorruptionError</p><p>Estado actual: Tool call "generar_contrato" ejecutada con par&#225;metros inv&#225;lidos</p><p>&#8592; Se esperaba: cliente_id (int), total (float)</p><p>&#8592; Se recibi&#243;:  cliente_id (str: "ID-2345-ABC"), total (None)</p><p>Sugerencia: Revisar si los datos del cliente son correctos y reiniciar</p><p>desde el paso "validar_credito".</p><p>```</p><p>Los usuarios conf&#237;an m&#225;s en agents que saben cu&#225;ndo pedir ayuda que en agents que producen silenciosamente basura.</p><p>---</p><h2><strong>El Registro de Errores Estructurado: Tu Radar de Problemas Sist&#233;micos</strong></h2><p>No basta con clasificar errores. Necesitas un registro estructurado para detectar patrones.</p><p>```python</p><p>class ErrorRegistry:</p><p>def __init__(self):</p><p>self.errors = []</p><p>def log(self, error: AIError, agent_id: str, timestamp: datetime):</p><p>self.errors.append({</p><p>"agent_id": agent_id,</p><p>"type": error.__class__.__name__,</p><p>"tool": error.tool_name,</p><p>"timestamp": timestamp,</p><p>"snapshot": error.context_snapshot</p><p>})</p><p>def detect_patterns(self):</p><h1>Si una tool falla consistentemente con SchemaMismatchError,</h1><h1>el contrato est&#225; mal, no el agente</h1><p>tool_failures = {}</p><p>for e in self.errors:</p><p>key = (e["tool"], e["type"])</p><p>tool_failures[key] = tool_failures.get(key, 0) + 1</p><p>for (tool, error_type), count in tool_failures.items():</p><p>if count &gt; 5:</p><p>alert(f"&#9888;&#65039; {tool} falla {count} veces con {error_type}. Revisa el contrato.")</p><p>```</p><p>Si una herramienta genera SchemaMismatchError m&#225;s de 5 veces seguidas, el problema no es el LLM &#8212; es el esquema o la herramienta. Arr&#233;glalo en el c&#243;digo, no en el prompt.</p><p>---</p><h2><strong>Objeci&#243;n: "Mi agente solo hace tool calls simples &#8212; el try-catch me funciona"</strong></h2><p>Claro. Hasta que no te funciona.</p><p>El 95% de los AI Agents se rompen en su primer error real. Si tu agente no ha fallado todav&#237;a, es porque no ha enfrentado un error real. Las tool calls simples fallan silenciosamente &#8212; y el silencio es peor que el error.</p><p>Un try-catch no va a detectar que el agente pas&#243; un ID de cliente de otra empresa porque alucin&#243; el contexto. No va a capturar que el JSON est&#225; bien formado pero los campos est&#225;n en el orden incorrecto. No va a prevenir que el agente envie 200 emails basura antes de que nadie se d&#233; cuenta.</p><p><strong>*Construir AI Agents en 2026 no va de hacer que el LLM sea m&#225;s inteligente. Va de hacer que el sistema sea m&#225;s robusto cuando el LLM se equivoca.</strong> *</p><p>---</p><h2><strong>Resumen: Lo Que Necesitas Implementar Hoy</strong></h2><p>| Componente | Qu&#233; hace | Cu&#225;ndo se activa |</p><p>|---|---|---|</p><p>| <strong>ErrorClassifier</strong> | Clasifica el error en 3 buckets | Cada tool call fallida |</p><p>| <strong>@validate_output</strong> | Valida esquemas antes de pasar datos al contexto | Cada tool call exitosa |</p><p>| <strong>Transient retry</strong> | Reintenta con backoff | Errores temporales (503, timeout) |</p><p>| <strong>Schema re-prompt</strong> | Re-prompt con esquema corregido | Datos mal formados |</p><p>| <strong>Human checkpoint</strong> | Pausa y pide decisi&#243;n humana | Contexto corrupto |</p><p>| <strong>ErrorRegistry</strong> | Detecta patrones de fallo | Cada error registrado |</p><p>No necesitas un modelo m&#225;s grande. Necesitas una arquitectura de recuperaci&#243;n que entienda que los AI Agents no lanzan excepciones.</p><p><strong>*Entran en estados no esperados. Y cada estado requiere una ruta de recuperaci&#243;n diferente.</strong> *</p><p>El 95% de los agents fallan en producci&#243;n. Los tuyos no tienen por qu&#233; ser parte de esa estad&#237;stica.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/error-recovery-ai-agents-2026-try-catch-no-sirve-20260604?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Las Señales de Burnout Que Nadie Te Enseñó a Leer: El Operador Solo No Cae por Trabajar Mucho, Cae por Trabajar para Nadie]]></title><description><![CDATA[El 90% de operadores solos no se queman por trabajar mucho. Se queman por construir sin distribuci&#243;n. Un framework de 4 pasos para leer las se&#241;ales reales antes de que el silencio te pare.]]></description><link>https://newsletter.brianmenagomez.com/p/las-senales-de-burnout-que-nadie</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/las-senales-de-burnout-que-nadie</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 04 Jun 2026 07:00:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7nbD!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9dcf7f-ea19-48c6-9eb8-91e45dd4b8eb_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>El 90% de los Operadores Solos No Se Queman por Trabajar 80 Horas. Se Queman por Construir para Nadie Durante Meses.</h2><p>Crees que el burnout del operador solo es un problema de volumen de trabajo. Demasiadas horas, demasiado estr&#233;s, demasiado caf&#233;, demasiadas noches sin dormir.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 90% de los operadores solos no se queman por trabajar 80 horas a la semana. Se queman porque <strong>construyen producto sin distribuci&#243;n durante meses, el feedback loop de validaci&#243;n nunca llega, y el esfuerzo se vuelve invisible incluso para s&#237; mismos.</strong></p><p>El silencio del mercado es un veneno m&#225;s r&#225;pido que el agotamiento.</p><p>Cuando trabajas en una startup con 5 personas, aunque el producto no tenga tracci&#243;n, tienes conversaciones de pasillo, code reviews, discusiones de roadmap. Eso es combustible social. Te dicen si vas bien, si vas mal, si el enfoque tiene sentido.</p><p>El operador solo <strong>no tiene eso.</strong></p><p>Y cuando adem&#225;s no hay usuarios, el silencio es total. No hay se&#241;ales de que existes. No hay se&#241;ales de que lo que haces importa. No hay se&#241;ales de que alguien, en alg&#250;n sitio, se beneficia de tu trabajo.</p><p>Eso no es cansancio f&#237;sico. <strong>Es hambre existencial.</strong></p><h2>El Problema No Son las Horas. Es la Arquitectura de Tu Semana.</h2><p>El debate convencional sobre el burnout asume que el problema es cuantitativo: necesitas trabajar menos horas, dormir m&#225;s, meditar, hacer deporte.</p><p>&#10060; <strong>"El burnout es un problema personal, no de estrategia de negocio."</strong></p><p>Esta objeci&#243;n es la m&#225;s frecuente. Tambi&#233;n es la que m&#225;s da&#241;o hace. Confunde el s&#237;ntoma con la causa.</p><p>&#9989; <strong>El burnout del operador solo es un problema estructural, no de resiliencia individual.</strong></p><p>La evidencia disponible sugiere que la estructura del trabajo &#8212; feedback loops, se&#241;ales externas, ratio build/distribuci&#243;n &#8212; determina la probabilidad de burnout mucho m&#225;s que cualquier t&#233;cnica de mindfulness.</p><p>El operador solo carga con <strong>todo el riesgo t&#233;cnico Y de mercado simult&#225;neamente</strong>. En una empresa con equipo, el riesgo se externaliza: distintas personas se preocupan de distintas cosas. El operador solo es el CEO, el CTO, el marketing, el soporte, y el community manager.</p><p>Y lo peor: <strong>no tiene a qui&#233;n preguntar "&#191;voy bien?"</strong>.</p><p>Cuando construyes producto primero sin distribuci&#243;n, haces la apuesta m&#225;s riesgosa posible. No porque el producto no pueda funcionar. Sino porque el tiempo hasta la primera se&#241;al de validaci&#243;n real puede ser de 6 a 12 meses de silencio absoluto.</p><p>Y ese silencio, para el operador solo, <strong>mata m&#225;s r&#225;pido que la deuda t&#233;cnica.</strong></p><h2>La Evidencia: Tres Datos Que Cambian el Marco</h2><p>El primer dato: <strong>construir producto sin distribuci&#243;n es la apuesta m&#225;s riesgosa para el solo-operator</strong>. El operador solo no puede externalizar el riesgo de product-market fit. No tiene un equipo de ventas que le traiga se&#241;ales mientras &#233;l construye. No tiene un advisor que le diga que est&#225; yendo en la direcci&#243;n equivocada antes de perder 3 meses.</p><p>El segundo dato: <strong>comprar o heredar un negocio con audiencia existente externaliza el riesgo de product-market fit</strong>. La existencia de audiencia convierte el problema t&#233;cnico en un problema operacional. No tienes que preguntarte "&#191;existir&#225; demanda?" &#8212; tienes que preguntarte "&#191;puedo servir mejor a esta demanda?". Eso reduce la incertidumbre existencial del operador de forma brutal. Construir para 0 usuarios vs. construir para 100 que ya te esperan es un contraste psicol&#243;gico que no se puede exagerar.</p><p>El tercer dato: <strong>el 90% de los AI Agents ejecutan tool calls secuenciales</strong>. El salto real est&#225; en orquestar con un grafo de dependencias. &#191;Y qu&#233; tiene que ver esto con el burnout? Todo. El operador solo t&#237;picamente opera de forma secuencial: primero build, luego distribuci&#243;n, luego soporte, luego build otra vez. Pero la mayor&#237;a de tareas no dependen unas de otras. Podr&#237;as estar escribiendo c&#243;digo mientras programas una publicaci&#243;n. Podr&#237;as estar respondiendo soporte mientras un cron job despliega un fix. Pero operas secuencialmente porque crees que es "m&#225;s enfocado".</p><p>En realidad, <strong>est&#225;s alargando el tiempo hasta la primera se&#241;al de validaci&#243;n</strong>. Y cada d&#237;a sin se&#241;al es un d&#237;a m&#225;s cerca del burnout.</p><h2>El Framework: <strong>Las 4 Se&#241;ales de Burnout Que Debes Leer en Ti Mismo</strong></h2><p>Aqu&#237; est&#225; el framework que uso para m&#237; y para los operadores solos con los que trabajo. Cuatro pasos. Sin mindfulness. Sin apps de meditaci&#243;n. Sin "desconectar los fines de semana".</p><p>Solo arquitectura de trabajo.</p><h3><strong>1. Mapea tu 'Ratio de Invisibilidad'</strong></h3><p>Cuantifica cu&#225;nto de tu tiempo semanal se invierte en <strong>trabajo sin feedback externo</strong>.</p><p>Build sin users. C&#243;digo sin metrics. Contenido sin audiencia. Features sin tickets de soporte reales.</p><p>Si ese ratio supera el 70% de tu semana, est&#225;s en zona de riesgo de burnout por ausencia de se&#241;ales. No por exceso de trabajo &#8212; por <strong>falta de evidencia de que existes</strong>.</p><p>La mayor&#237;a de operadores solos est&#225;n entre el 80% y el 90% de ratio de invisibilidad sin saberlo. Llevan meses construyendo en el vac&#237;o. Y confunden el vac&#237;o con "estar enfocados".</p><h3><strong>2. Externaliza una Se&#241;al de Validaci&#243;n Cada 7 D&#237;as</strong></h3><p>Define una m&#233;trica semanal que <strong>solo se activa cuando alguien externo interact&#250;a con tu trabajo</strong>.</p><p>Un signup. Un comment. Un pago. Un issue real en GitHub. Un lead cualificado. Un email de queja. Cualquier cosa que requiera que otro ser humano haya visto lo que haces.</p><p>Si no obtienes <strong>ninguna se&#241;al externa en 7 d&#237;as</strong>, det&#233;n el building inmediatamente. Cambia a distribuci&#243;n. No a&#241;adas esa feature. No refactorices ese m&#243;dulo. No optimices esa query.</p><p>El problema no es tu producto. <strong>Es que nadie sabe que existe.</strong></p><p>Y construir m&#225;s sin que nadie sepa que existes no arregla nada. Solo alarga el silencio.</p><h3><strong>3. Implementa un 'Dependency Graph' de tu Energ&#237;a Mental</strong></h3><p>El 90% de los operadores solos operan secuencialmente porque creen que es m&#225;s productivo. No lo es. <strong>Es m&#225;s f&#225;cil de gestionar mentalmente, pero m&#225;s costoso en tiempo real.</strong></p><p>Mapea qu&#233; tareas bloquean a otras. Identifica cu&#225;les <strong>no dependen entre s&#237;</strong>. Ponlas en paralelo.</p><p>Mientras un deploy se ejecuta, escribe el siguiente post de LinkedIn. Mientras el LLM procesa un batch de datos, escribe los tests del siguiente endpoint. Mientras esperas respuesta de un cliente, programa el newsletter semanal.</p><p>El salto de calidad para el operador solo <strong>no est&#225; en el modelo de trabajo. Est&#225; en la orquestaci&#243;n del trabajo.</strong></p><p>Elimina latencia cognitiva antes de eliminar horas de sue&#241;o. Una hora de trabajo paralelizado vale m&#225;s que dos horas de trabajo secuencial en t&#233;rminos de cu&#225;nto acortas el feedback loop.</p><h3><strong>4. Crea un 'Burnout Trigger' Programado</strong></h3><p>Establece una revisi&#243;n autom&#225;tica cada 2 semanas que eval&#250;e tres cosas:</p><p><strong>(a)</strong> N&#250;mero de se&#241;ales externas recibidas en el periodo.</p><p><strong>(b)</strong> Ratio build/distribuci&#243;n &#8212; cu&#225;nto tiempo dedicaste a construir vs. a buscar se&#241;ales.</p><p><strong>(c)</strong> Si el feedback loop actual est&#225; funcionando &#8212; &#191;est&#225;s recibiendo informaci&#243;n que te permita decidir qu&#233; hacer a continuaci&#243;n?</p><p>Cuando las se&#241;ales caen a cero durante dos semanas consecutivas, el trigger activa <strong>un cambio de estrategia, no m&#225;s horas de trabajo.</strong></p><p>M&#225;s horas de trabajo cuando las se&#241;ales son cero es como empujar un coche que est&#225; en punto muerto. Te cansas, el coche no se mueve, y adem&#225;s parece que t&#250; eres el problema.</p><h2>C&#243;mo S&#233; Que Esto Funciona: El Caso del Builder Sin Audiencia</h2><p>Trabaj&#233; con un operador solo que llevaba 8 meses construyendo una plataforma SaaS para gestor&#237;as. Producto s&#243;lido. C&#243;digo limpio. Stack moderno. Test coverage envidiable.</p><p>Pero ten&#237;a 0 usuarios de pago.</p><p>Hab&#237;a confundido "estar ocupado" con "estar avanzando". Su ratio de invisibilidad era del 95%. Pasaba semanas sin que nadie externo interactuara con su trabajo.</p><p>El trigger de burnout estaba disparado, pero no lo hab&#237;a programado. Simplemente sent&#237;a que estaba "cansado", que necesitaba "desconectar", que "quiz&#225; el nicho no funcionaba".</p><p>No era nada de eso.</p><p>El nicho funcionaba. El producto era bueno. El problema era que <strong>no hab&#237;a nadie al otro lado</strong>. Y sin nadie al otro lado, el trabajo se convierte en un mon&#243;logo que agota m&#225;s que 80 horas de reuniones.</p><p>El cambio no fue trabajar menos horas. Fue <strong>rearquitecturar su semana para que cada 7 d&#237;as hubiera una se&#241;al externa</strong>. Dej&#243; de construir features. Empez&#243; a hacer distribuci&#243;n local &#8212; pSEO para gestor&#237;as en ciudades peque&#241;as, leads de Google Maps, outreach manual a 10 gestor&#237;as al d&#237;a.</p><p>En la tercera semana consigui&#243; su primer signup. En la octava, su primer pago.</p><p>Y lo m&#225;s interesante: la sensaci&#243;n de burnout <strong>desapareci&#243; antes de que llegara el primer pago</strong>. Desapareci&#243; cuando obtuvo la primera se&#241;al externa. Porque el burnout no era financiero. Era existencial. No sab&#237;a si lo que hac&#237;a importaba.</p><p>Con el primer signup, supo que s&#237;.</p><h2>La Objeci&#243;n Que Vas a Tener: "Pero Yo Constru&#237; Sin Distribuci&#243;n y Me Fue Bien"</h2><p>Es una objeci&#243;n esperable. Justa. Y v&#225;lida como caso anecd&#243;tico.</p><p>Hay operadores solos que construyeron producto primero, no hicieron distribuci&#243;n, y 12 meses despu&#233;s tuvieron tracci&#243;n. Existen. Yo conozco a algunos.</p><p>Pero la pregunta que debes hacerte no es "alguien lo logr&#243;". La pregunta es: <strong>&#191;cu&#225;ntos lo intentan y no sobreviven al silencio?</strong></p><p>Para el 90% de los operadores solos, ese camino lleva a burnout antes que a product-market fit. Los que lo lograron suelen tener un factor at&#237;pico: ahorros, red de contactos en el nicho, demanda latente que exist&#237;a pero no se hab&#237;a canalizado.</p><p>El art&#237;culo no dice que sea imposible. Dice que es la apuesta m&#225;s riesgosa. Y el operador solo <strong>no tiene margen para apuestas riesgosas</strong>. No hay equity que diluir. No hay payroll que recortar. No hay departamento que reestructurar. Hay una persona que si se quema, el negocio se apaga.</p><h2>No Necesitas M&#225;s Resiliencia. Necesitas Mejores Se&#241;ales.</h2><p>El operador solo que sobrevive no es el que trabaja m&#225;s horas. Es el que <strong>lee las se&#241;ales de burnout antes de que el silencio se convierta en par&#225;lisis</strong>.</p><p>Mapea tu ratio de invisibilidad esta semana. Si supera el 70%, no te preguntes "c&#243;mo trabajo menos". Preg&#250;ntate "c&#243;mo consigo una se&#241;al externa en los pr&#243;ximos 7 d&#237;as".</p><p>El problema del operador solo no es de capacidad. No es de motivaci&#243;n. No es de disciplina.</p><p><strong>El problema del operador solo es de arquitectura de trabajo.</strong></p><p>Y la arquitectura de trabajo que te salva no es la que optimiza productividad. Es la que <strong>optimiza se&#241;ales</strong>.</p><p>Porque sin se&#241;ales, no sabes si existes. Y sin saber si existes, no hay horas de trabajo que te mantengan en pie.</p><p><strong>*El burnout del operador solo no se cura con descanso. Se cura con evidencia de que lo que haces importa a alguien m&#225;s.</strong> *</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/senales-de-burnout-que-nadie-te-enseno-a-leer-operador-solo-20260604?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Apify No Es un Scraper: El Runtime Serverless que el 90% de Desarrolladores Ignora]]></title><description><![CDATA[Apify no es scraping-as-a-service: es un runtime serverless para automatizaci&#243;n web. Actors, Crawlee, webhooks y pipelines con estado &#8212; sin gestionar servidores.]]></description><link>https://newsletter.brianmenagomez.com/p/apify-no-es-un-scraper-el-runtime-c87</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/apify-no-es-un-scraper-el-runtime-c87</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 04 Jun 2026 07:00:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3375ae61-0d0a-450d-8e50-f54734f10494_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Apify No Es un Scraper: el Runtime Serverless que el 90% Ignora</strong></h2><p>Est&#225;s usando Apify mal.</p><p>Si piensas que es una herramienta de scraping con esteroides, te est&#225;s perdiendo el 90% de lo que la plataforma puede hacer.</p><p><strong>*Apify no es scraping-as-a-service. Es un sistema operativo de automatizaci&#243;n para la web.</strong> *</p><p>Mira los n&#250;meros. La plataforma tiene m&#225;s de 1.000 Actores pre-construidos en su Store. Crawlee, su librer&#237;a open-source, supera las 12.000 estrellas en GitHub. Y sin embargo, la mayor&#237;a de los desarrolladores abre la web, ejecuta un Actor de Google Maps, descarga un CSV y cree que ya lo ha visto todo.</p><p>No lo has visto.</p><p>Lo que Apify ofrece realmente es un runtime serverless para el navegador &#8212; como AWS Lambda, pero con un Chromium completo, colas de peticiones que sobreviven a ca&#237;das, almacenamiento persistente, y un ecosistema de componentes que puedes encadenar como piezas de Lego.</p><p>El scraping es casi incidental a la infraestructura que hay debajo.</p><p>---</p><h2><strong>El Problema: Tratas Apify Como un Scrapy con UI</strong></h2><p>La mayor&#237;a de los desarrolladores viene de herramientas como Scrapy o BeautifulSoup. Son librer&#237;as Python que ejecutas localmente. O las metes en un contenedor. O las despliegas en una VPS con cronjobs escritos a mano.</p><p>Y funciona. Para proyectos peque&#241;os.</p><p>El problema llega cuando tu scraper necesita sobrevivir a un crash, reanudarse desde donde lo dej&#243;, rotar proxies sin exponer tu IP, escalar a cientos de URLs sin que se te caiga el servidor, o ejecutarse cada hora sin que tengas que estar pendiente.</p><p>&#10060; <strong>Enfoque tradicional:</strong> Escribes un script con Playwright. Lo guardas. Configuras un cron en tu VPS. Te olvidas. A las 3 de la ma&#241;ana el sitio cambia su DOM, tu script falla, y te enteras cuando el cliente se queja.</p><p>&#9989; <strong>Enfoque Apify:</strong> Construyes un Actor. Usas Crawlee. Configuras una Request Queue. Programas un schedule. El actor se ejecuta, reintenta las peticiones fallidas, rota proxies autom&#225;ticamente, guarda los resultados en un Dataset, y te llama por webhook si algo va mal.</p><p>La diferencia no es t&#233;cnica. Es filos&#243;fica. Pasas de gestionar scripts a gestionar workflows.</p><p>---</p><h2><strong>La Evidencia: Por Qu&#233; Apify Es un Runtime, No un Scraper</strong></h2><p>Miremos la arquitectura.</p><p>Apify no te da un navegador y te dice "venga, scrapea". Te da:</p><ul><li><p><strong>Request Queues:</strong> Colas de peticiones con estado. Si tu Actor se cae a mitad de ejecuci&#243;n, al reiniciarse retoma desde la &#250;ltima petici&#243;n completada. No pierdes trabajo.</p></li><li><p><strong>Datasets:</strong> Almacenamiento persistente. Cada resultado que guardas queda disponible en la plataforma. Lo puedes exportar a JSON, CSV, Excel, o conectarlo directamente a Google Sheets, S3, o Dropbox.</p></li><li><p><strong>Key-value stores:</strong> Para guardar estado intermedio, configuraciones, o ficheros grandes.</p></li><li><p><strong>Proxy rotation autom&#225;tica:</strong> Con proxies de datacenter, residenciales, y SERP. La plataforma gestiona la rotaci&#243;n de user agents y huellas del navegador.</p></li><li><p><strong>Scheduling + Webhooks:</strong> Puedes programar ejecuciones recurrentes y recibir notificaciones cuando terminen.</p></li></ul><p>Todo esto corre sobre Puppeteer y Playwright. Pero Apify a&#241;ade la capa de gesti&#243;n que convierte un script en un sistema.</p><p>Y luego est&#225; <strong>Crawlee</strong>, su librer&#237;a open-source. Crawlee resuelve los problemas duros del scraping moderno: rotaci&#243;n de proxies, gesti&#243;n de sesiones, evasi&#243;n de huellas de navegador, y colas de peticiones &#8212; todo en una API limpia que funciona con Playwright, Puppeteer, o incluso Cheerio para p&#225;ginas est&#225;ticas.</p><p><strong>*Crawlee no es un wrapper. Es un framework que te ahorra meses de reverse-engineering contra Cloudflare y DataDome.</strong> *</p><p>---</p><h2><strong>El Ecosistema: El Poder de Componer Actores</strong></h2><p>El Actor Store de Apify tiene m&#225;s de 1.000 componentes pre-construidos. Y el 90% de los usuarios solo ejecuta uno cada vez.</p><p>Ese es el error.</p><p><strong>*El killer feature de Apify no son los Actores individuales. Es la capacidad de encadenarlos.</strong> *</p><p>Mira este flujo real:</p><p>1. Ejecutas el Actor "Google Search Results Scraper" para buscar "fontaneros emergencia Madrid"</p><p>2. El resultado se pasa al Actor "HTML to Markdown" para limpiar el contenido</p><p>3. Ese markdown se env&#237;a al Actor "OpenAI ChatGPT" para generar un resumen</p><p>4. El resumen se guarda en un Dataset que alimenta tu panel de control interno</p><p>Todo esto ocurre sin que escribas una l&#237;nea de c&#243;digo de integraci&#243;n. Los Actores se comunican a trav&#233;s de la API de Apify. T&#250; solo defines el flujo.</p><p>Para el due&#241;o de una agencia digital espa&#241;ola que quiere monitorizar a sus competidores, esto es oro. Configuras un schedule que scrapea los precios de tus competidores cada hora, los transforma, los analiza con IA, y los mete en tu dashboard &#8212; todo sin un solo servidor.</p><p>---</p><h2><strong>El Patr&#243;n de 5 Capas para Automatizaci&#243;n Web con Apify</strong></h2><p>Vamos al grano. Aqu&#237; tienes el framework que uso para sacar el m&#225;ximo partido a Apify. Lo llamo <strong>El Patr&#243;n de 5 Capas para Automatizaci&#243;n Web con Apify</strong>.</p><h3><strong>1. Capa de Extracci&#243;n: Crawlee + Request Queue</strong></h3><p>No empieces con un script. Empieza con Crawlee y una Request Queue.</p><p>```typescript</p><p>import { Crawlee, PlaywrightCrawler, RequestQueue } from 'crawlee';</p><p>const requestQueue = await RequestQueue.open('mi-scraper');</p><p>await requestQueue.addRequest({</p><p>url: 'https://ejemplo.com/productos',</p><p>userData: { categoria: 'electronica' }</p><p>});</p><p>const crawler = new PlaywrightCrawler({</p><p>requestQueue,</p><p>maxRequestsPerCrawl: 100,</p><p>maxConcurrency: 10,</p><p>async requestHandler({ page, request, pushData }) {</p><p>const titulo = await page.title();</p><p>const precio = await page.textContent('.precio');</p><p>await pushData({</p><p>url: request.url,</p><p>titulo,</p><p>precio,</p><p>timestamp: new Date().toISOString()</p><p>});</p><p>},</p><p>failedRequestHandler({ request }) {</p><p>console.log(`Fall&#243;: ${request.url} &#8212; se reintentar&#225;`);</p><p>}</p><p>});</p><p>await crawler.run();</p><p>```</p><p>La clave aqu&#237; es la `Request Queue`. Si el crawler se cae a mitad, al reiniciarse retoma desde la &#250;ltima URL completada. No pierdes nada.</p><h3><strong>2. Capa de Proxy: Configuraci&#243;n Geogr&#225;fica</strong></h3><p>Para sitios espa&#241;oles como El Corte Ingl&#233;s, PcComponentes o Mercado Libre Spain, necesitas proxies residenciales espa&#241;oles. Los proxies de datacenter gen&#233;ricos te van a bloquear en minutos.</p><p>```typescript</p><p>const crawler = new PlaywrightCrawler({</p><p>proxyConfiguration: {</p><p>groups: ['RESIDENTIAL'],</p><p>countryCode: 'ES',</p><p>fallbackGroups: ['DATACENTER']</p><p>},</p><p>// ...</p><p>});</p><p>```</p><p>La configuraci&#243;n `countryCode: 'ES'` hace que Apify use IPs residenciales de proveedores espa&#241;oles. El `fallbackGroups` asegura que si se acaban las IPs espa&#241;olas, el crawler sigue funcionando con datacenter.</p><h3><strong>3. Capa de Transformaci&#243;n: El Actor Intermedio</strong></h3><p>Una vez que tienes los datos, no los dejes crudos. P&#225;salos por un Actor de transformaci&#243;n.</p><p>```typescript</p><p>// Despu&#233;s de scrapear, llamas a la API de Apify para encadenar otro Actor</p><p>const run = await apifyClient</p><p>.actor('apify/html-to-markdown')</p><p>.call({</p><p>html: datosCrudos</p><p>});</p><p>// El resultado del segundo Actor est&#225; disponible en su Dataset</p><p>const markdown = await apifyClient</p><p>.dataset(run.defaultDatasetId)</p><p>.listItems();</p><p>```</p><p>Este paso es el que la mayor&#237;a omite. Scrapean y ya. Pero la magia est&#225; en transformar los datos en el mismo flujo.</p><h3><strong>4. Capa de Persistencia: Dataset + Integraciones</strong></h3><p>No guardes los datos en un fichero local. Usa el Dataset de Apify y con&#233;ctalo a tu destino final.</p><p>```typescript</p><p>// Guardas en el Dataset</p><p>await pushData({</p><p>competidor: 'electronica-madrid-sl',</p><p>producto: 'Port&#225;til XYZ',</p><p>precio: 899,</p><p>disponibilidad: 'en-stock',</p><p>fecha: new Date().toISOString()</p><p>});</p><p>// Luego configuras una integraci&#243;n en Apify:</p><p>// Dataset &#8594; Webhook &#8594; tu API &#8594; Google Sheets</p><p>```</p><p>Apify te permite conectar el Dataset directamente a Google Sheets, S3, Dropbox, o enviarlo por webhook a tu propio backend. No necesitas un script de exportaci&#243;n.</p><h3><strong>5. Capa de Orquestaci&#243;n: Schedules + Webhooks</strong></h3><p>Aqu&#237; es donde el sistema cobra vida. Configuras un schedule y un webhook, y tu scraper se convierte en un monitor.</p><p>```typescript</p><p>// Pseudoc&#243;digo de configuraci&#243;n v&#237;a API</p><p>await apifyClient.schedules().create({</p><p>name: 'precios-competidores',</p><p>cronExpression: '0 <em> </em> <em> </em>', // Cada hora</p><p>actions: [</p><p>{</p><p>type: 'RUN_ACTOR',</p><p>actorId: 'tu-actor-de-scraping',</p><p>input: { categoria: 'portatiles' }</p><p>}</p><p>]</p><p>});</p><p>// Webhook que se dispara al completarse</p><p>await apifyClient.webhooks().create({</p><p>eventTypes: ['ACTOR.RUN.SUCCEEDED'],</p><p>condition: { actorId: 'tu-actor-de-scraping' },</p><p>requestUrl: 'https://tu-api.com/webhook/apify',</p><p>payloadTemplate: JSON.stringify({</p><p>datasetId: '{{resource.defaultDatasetId}}',</p><p>status: '{{resource.status}}'</p><p>})</p><p>});</p><p>```</p><p>Ahora tienes un sistema que scrapea cada hora, guarda los resultados, y te avisa cuando termina. Sin VPS. Sin cronjobs locales. Sin DevOps.</p><p>---</p><h2><strong>Pero... &#191;Y el Vendor Lock-In?</strong></h2><p>Vale. Te oigo.</p><p>"Apify es vendor lock-in. Si ma&#241;ana cierran, pierdo todo."</p><p>Vamos a desmontar eso.</p><p>Crawlee es MIT license. Puedes ejecutarlo localmente sin la plataforma de Apify. Los Actors se pueden exportar como im&#225;genes Docker. Los Datasets se exportan a JSON o CSV.</p><p><strong>*El riesgo de lock-in es menor que con AWS Lambda, porque la librer&#237;a core es portable.</strong> *</p><p>Lo que pagas en Apify es la gesti&#243;n: las proxies, el scheduling, el almacenamiento, las integraciones. Si necesitas moverte, te llevas el c&#243;digo. Te dejas la infraestructura gestionada.</p><p>Para un negocio que necesita datos fiables a las 9 de la ma&#241;ana todos los d&#237;as, el coste de la plataforma se paga solo con no tener que contratar a un DevOps para que gestione scrapers.</p><p>---</p><h2><strong>Y el Tema Legal del Scraping</strong></h2><p>El scraping no es ilegal. Lo ilegal es saltarse los t&#233;rminos de servicio de forma maliciosa, sobrecargar servidores, o usar datos protegidos por copyright.</p><p>Apify proporciona herramientas para cumplir con robots.txt y configurar rate limiting. Pero la responsabilidad de lo que scrapeas es tuya.</p><p><strong>*Apify es una plataforma de infraestructura. No decide lo que scrapeas. Te da los mazos. T&#250; eliges la pared.</strong> *</p><p>Usa la plataforma para construir cosas &#250;tiles. Monitoriza a tus competidores de forma &#233;tica. No satures los servidores. Respeta el robots.txt.</p><p>---</p><h2><strong>Lo Que Viene</strong></h2><p>El futuro de Apify no es el scraping. Es la automatizaci&#243;n web completa.</p><p>Cada vez m&#225;s empresas est&#225;n usando Actores no para extraer datos, sino para llenar formularios, hacer pruebas de UI, sincronizar datos entre plataformas, o ejecutar flujos de trabajo complejos que requieren un navegador real.</p><p>Para el operador de una agencia peque&#241;a en Espa&#241;a o LATAM, eso significa una cosa: puedes construir sistemas que antes requer&#237;an un equipo de infraestructura con un ordenador port&#225;til y una cuenta de Apify.</p><p><strong>El 90% de los desarrolladores usa Apify como un scraper. El 10% que lo usa como un runtime serverless est&#225; construyendo cosas que el resto ni siquiera imagina.</strong></p><p><strong>*La pregunta no es si Apify sirve para scrapear. La pregunta es qu&#233; m&#225;s puedes construir cuando dejas de pensar en extracci&#243;n y empiezas a pensar en automatizaci&#243;n.</strong> *</p><p>---</p><h2><strong>Resumen</strong></h2><p>| Idea | Por Qu&#233; Importa |</p><p>|------|----------------|</p><p>| Apify es un runtime serverless, no un scraper | Gestiona ejecuci&#243;n, estado, y almacenamiento por ti |</p><p>| Crawlee resuelve evasi&#243;n anti-bot | Proxy rotation, fingerprints, sesiones &#8212; todo integrado |</p><p>| El Actor Store permite componer flujos | Encadena Actores: scrapea &#8594; transforma &#8594; analiza &#8594; almacena |</p><p>| Request Queues dan resiliencia | Si tu Actor falla, retoma donde lo dej&#243; |</p><p>| Schedules + Webhooks crean monitores | Tu scraper se convierte en un pipeline continuo |</p><p>El que scrapea con Requests y BeautifulSoup compite con scripts. El que usa Apify como runtime compite con equipos enteros.</p><p><strong>*Elige tu categor&#237;a.</strong> *</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/apify-runtime-serverless-automatizacion-web-20260604?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Tool Orchestration en AI Agents: El 90% Ejecuta Tool Calls Como si Fuera 1999]]></title><description><![CDATA[El 90% de AI Agents ejecutan tool calls secuenciales. Aprende el Patr&#243;n de Orquestaci&#243;n en 3 Fases: DAG, paralelizaci&#243;n y ejecuci&#243;n topol&#243;gica para agents eficientes.]]></description><link>https://newsletter.brianmenagomez.com/p/tool-orchestration-en-ai-agents-el-b1f</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/tool-orchestration-en-ai-agents-el-b1f</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Wed, 03 Jun 2026 07:00:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/79790b39-ea5b-438b-928b-923551afd235_1080x810.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 90% de los AI Agents que Ves en GitHub Ejecutan Tool Calls Como si Fuera 1999</strong></h2><p>En secuencia. Uno detr&#225;s de otro. Esperando a que cada llamada termine para empezar la siguiente.</p><p><strong>*Y funcionan. Pero funcionan mal, lento, y con un coste de contexto que se come tu presupuesto de tokens.</strong> *</p><p>El 90% de las implementaciones tratan el agent loop como una `lista de tareas` secuencial.</p><p>El problema es que deber&#237;an tratarlo como un `grafo de dependencias`.</p><p>No es teor&#237;a. Es la diferencia entre un agente que tarda 45 segundos en dar una respuesta vs uno que tarda 8. Es la diferencia entre un contexto de 12.000 tokens vs uno de 4.000. Es la diferencia entre un agente que entra en bucle infinito y uno que termina limpiamente.</p><p>La comunidad cree que el problema de los AI Agents es el modelo. Mejor LLM &#8594; mejor agente.</p><p>O la conexi&#243;n a herramientas. MCP, function calling, APIs.</p><p><strong>*La realidad: ambos problemas est&#225;n resueltos. El cuello de botella real es la orquestaci&#243;n.</strong> *</p><p>C&#243;mo decides qu&#233; tool call ejecutar cu&#225;ndo, en qu&#233; orden, y en paralelo.</p><p>---</p><h2><strong>El Patr&#243;n Que Llevamos D&#233;cadas Resolviendo (y Que Hemos Olvidado)</strong></h2><p>La iron&#237;a es que esto no es nuevo en computaci&#243;n.</p><p>El patr&#243;n de 3 fases que te voy a ense&#241;ar &#8212; An&#225;lisis &#8594; DAG &#8594; Ejecuci&#243;n topol&#243;gica &#8212; es el mismo que usan los build systems como Make, Bazel o Turborepo.</p><p>Llevamos d&#233;cadas resolviendo el problema de paralelizar tareas con dependencias.</p><p><strong>*Y al llegar a los AI Agents, lo hemos olvidado.</strong> *</p><p>Un agent loop secuencial es equivalente a compilar un proyecto con un solo core en 2026.</p><p>Tiene sentido cuando tienes 2-3 herramientas secuenciales. Pero cuando tu agente ejecuta 5+ tool calls por turno con m&#250;ltiples herramientas independientes, el loop plano se convierte en tu cuello de botella m&#225;s caro.</p><p>---</p><h2><strong>Los 3 Problemas del Loop Secuencial Plano</strong></h2><p>Antes de ver la soluci&#243;n, entendamos qu&#233; se rompe cuando ejecutas tool calls en secuencia plana.</p><h3><strong>1. Latencia desperdiciada</strong></h3><p>Tienes 5 tool calls. Las primeras 3 son independientes entre s&#237;: buscar tendencias en Google Trends, analizar competidores en Crunchbase, extraer reviews de Trustpilot. Ninguna necesita el resultado de la otra.</p><p>Con un loop secuencial: llamada 1 &#8594; esperar &#8594; llamada 2 &#8594; esperar &#8594; llamada 3 &#8594; esperar.</p><p><strong>*Has perdido 2/3 del tiempo en espera que podr&#237;as haber paralelizado.</strong> *</p><h3><strong>2. P&#233;rdida de contexto entre llamadas</strong></h3><p>Cada tool call devuelve datos que se inyectan en el prompt del LLM en la siguiente iteraci&#243;n.</p><p>Con 5-10 tool calls secuenciales, el contexto se duplica o triplica con datos intermedios que ya no necesitas. El LLM tiene que procesar informaci&#243;n irrelevante, aumenta el coste de tokens, y la calidad de las respuestas se degrada.</p><p>El problema m&#225;s silencioso de los agents secuenciales no es la velocidad. Es la degradaci&#243;n del contexto.</p><h3><strong>3. Bucles infinitos</strong></h3><p>Cuando un agente ejecuta tool calls en un loop plano y una llamada devuelve un resultado inesperado, el LLM no tiene suficiente informaci&#243;n para decidir si debe parar o seguir.</p><p>No es culpa del LLM. Es culpa de la orquestaci&#243;n.</p><p>Con un grafo de dependencias, tienes un estado expl&#237;cito del progreso: sabes qu&#233; nodos se completaron, cu&#225;les fallaron, y cu&#225;les est&#225;n pendientes. Puedes detectar bucles (mismo nodo ejecut&#225;ndose repetidamente) y aplicar pol&#237;ticas de terminaci&#243;n claras.</p><p>---</p><h2><strong>&#10060;/&#9989; El Anti-Patr&#243;n vs El Patr&#243;n Real</strong></h2><h3><strong>&#10060; Lo que el 90% hace: Loop secuencial plano</strong></h3><p>```python</p><h1>Anti-patr&#243;n: ejecuci&#243;n secuencial plana</h1><h1>El 90% de los agents en GitHub hacen esto</h1><p>def agent_loop_secuencial(prompt, tools):</p><p>messages = [{"role": "user", "content": prompt}]</p><p>while True:</p><p>response = llm.chat(messages)</p><p>tool_calls = extract_tool_calls(response)</p><p>if not tool_calls:</p><p>return response.content</p><p>for tool_call in tool_calls:</p><h1>UNO DETR&#193;S DE OTRO &#9888;&#65039;</h1><p>result = execute_tool(tool_call)</p><p>messages.append({</p><p>"role": "tool",</p><p>"tool_call_id": tool_call.id,</p><p>"content": result</p><p>})</p><h1>Siguiente iteraci&#243;n del bucle &#8212; el LLM recibe TODO el contexto acumulado</h1><p>```</p><p>Este c&#243;digo funciona. Para 2-3 tool calls secuenciales, es suficiente.</p><p><strong>*Pero en cuanto llegas a 5+ llamadas, el coste de contexto explota y la latencia se triplica.</strong> *</p><h3><strong>&#9989; Lo que deber&#237;as hacer: Grafo de dependencias con ejecuci&#243;n topol&#243;gica</strong></h3><p>```python</p><h1>Patr&#243;n correcto: orquestaci&#243;n basada en grafo de dependencias</h1><p>from collections import deque</p><p>from concurrent.futures import ThreadPoolExecutor, as_completed</p><p>class ToolCallNode:</p><p>def __init__(self, tool_call, deps=None):</p><p>self.tool_call = tool_call</p><p>self.dependencies = deps or []  # IDs de nodos de los que depende</p><p>self.result = None</p><p>self.status = "pending"  # pending | running | completed | failed</p><p>class DependencyGraph:</p><p>def __init__(self):</p><p>self.nodes = {}  # node_id -&gt; ToolCallNode</p><p>self.adjacency = {}  # node_id -&gt; [dependent_node_ids]</p><p>def add_node(self, node_id, tool_call, deps=None):</p><p>self.nodes[node_id] = ToolCallNode(tool_call, deps)</p><p>self.adjacency[node_id] = []</p><p>for dep_id in (deps or []):</p><p>if dep_id not in self.adjacency:</p><p>self.adjacency[dep_id] = []</p><p>self.adjacency[dep_id].append(node_id)</p><p>def get_ready_nodes(self):</p><p>"""Nodos sin dependencias pendientes &#8212; candidatos a ejecuci&#243;n paralela"""</p><p>ready = []</p><p>for node_id, node in self.nodes.items():</p><p>if node.status != "pending":</p><p>continue</p><p>all_deps_done = all(</p><p>self.nodes[dep].status == "completed"</p><p>for dep in node.dependencies</p><p>)</p><p>if all_deps_done:</p><p>ready.append(node_id)</p><p>return ready</p><p>def execute_graph(graph, max_workers=4):</p><p>"""Ejecuta el grafo por niveles &#8212; cada nivel en paralelo"""</p><p>with ThreadPoolExecutor(max_workers=max_workers) as executor:</p><p>while any(n.status == "pending" for n in graph.nodes.values()):</p><p>ready = graph.get_ready_nodes()</p><p>if not ready:</p><p>raise RuntimeError("Deadlock detected: circular dependency")</p><p>futures = {}</p><p>for node_id in ready:</p><p>node = graph.nodes[node_id]</p><p>node.status = "running"</p><p>future = executor.submit(execute_tool, node.tool_call)</p><p>futures[future] = node_id</p><p>for future in as_completed(futures):</p><p>node_id = futures[future]</p><p>node = graph.nodes[node_id]</p><p>try:</p><p>node.result = future.result()</p><p>node.status = "completed"</p><p>except Exception as e:</p><p>node.status = "failed"</p><h1>Propagaci&#243;n selectiva: solo fallan los dependientes</h1><p>propagate_failure(graph, node_id, e)</p><p>```</p><p>---</p><h2><strong>El Framework de 3 Fases para Orquestaci&#243;n de Tool Calls</strong></h2><p>Llam&#233;moslo como es: <strong>El Patr&#243;n de Orquestaci&#243;n en 3 Fases</strong>. No es complejo. Es estructurado. Y cada fase resuelve un problema concreto del loop secuencial.</p><h3><strong>Fase 1: An&#225;lisis de dependencias</strong></h3><p>Cuando el LLM devuelve m&#250;ltiples tool calls, no las ejecutes inmediatamente.</p><p>Primero, analiza los par&#225;metros de entrada de cada una para identificar dependencias de datos entre ellas.</p><p><strong>Pregunta clave:</strong> &#191;La tool B necesita el output de la tool A para ejecutarse?</p><p>```python</p><h1>Fase 1: Analizar dependencias entre tool calls</h1><p>def analyze_dependencies(tool_calls):</p><p>"""</p><p>Analiza los par&#225;metros de entrada de cada tool call</p><p>para identificar dependencias de datos</p><p>"""</p><p>dependency_map = {tc.id: [] for tc in tool_calls}</p><p>tool_outputs = {}  # Mapa de tool_call_id -&gt; {campos de salida}</p><p>for tc in tool_calls:</p><p>for param_name, param_value in tc.parameters.items():</p><h1>&#191;El valor del par&#225;metro hace referencia al output de otra tool?</h1><p>if isinstance(param_value, str) and param_value.startswith("$"):</p><p>ref_tool_id = param_value.split(".")[0].replace("$", "")</p><p>if ref_tool_id in tool_outputs:</p><p>dependency_map[tc.id].append(ref_tool_id)</p><p>return dependency_map</p><p>```</p><p>En la pr&#225;ctica, esta fase suele ser m&#225;s sencilla: el propio LLM puede etiquetar las dependencias si se lo pides expl&#237;citamente en el system prompt. Pero tener el an&#225;lisis program&#225;tico como respaldo evita que el LLM se equivoque.</p><h3><strong>Fase 2: Construcci&#243;n del DAG</strong></h3><p>Genera un grafo dirigido ac&#237;clico donde los nodos son tool calls y las aristas son dependencias.</p><p>Identifica los nodos sin dependencias (fuentes) como candidatos a ejecuci&#243;n paralela inmediata.</p><p>```python</p><h1>Fase 2: Construir el DAG</h1><p>def build_dag(tool_calls, dependency_map):</p><p>graph = DependencyGraph()</p><h1>Validar que no haya dependencias circulares</h1><h1>(el LLM a veces genera bucles)</h1><p>if has_cycles(dependency_map):</p><p>raise ValueError("Circular dependency detected in tool calls")</p><p>for tc in tool_calls:</p><p>deps = dependency_map.get(tc.id, [])</p><p>graph.add_node(tc.id, tc, deps=deps)</p><p>return graph</p><p>```</p><p>El check de ciclos es importante. El LLM puede generar tool calls que se refieran unas a otras creando un bucle. Detectarlo en la Fase 2 evita que el agente se cuelgue.</p><h3><strong>Fase 3: Ejecuci&#243;n con planificaci&#243;n topol&#243;gica</strong></h3><p>Ejecuta los nodos fuente en paralelo, recolecta resultados, desbloquea nodos dependientes, y repite hasta completar el grafo.</p><p><strong>*Cada iteraci&#243;n del bucle principal ejecuta UN NIVEL completo del grafo, no UNA tool call.</strong> *</p><p>```python</p><h1>Fase 3: Ejecutor con planificaci&#243;n topol&#243;gica</h1><p>def orchestrator_loop(prompt, tools):</p><p>messages = [{"role": "user", "content": prompt}]</p><p>while True:</p><p>response = llm.chat(messages)</p><p>tool_calls = extract_tool_calls(response)</p><p>if not tool_calls:</p><p>return response.content</p><h1>Fase 1 + 2: Analizar y construir grafo</h1><p>dep_map = analyze_dependencies(tool_calls)</p><p>graph = build_dag(tool_calls, dep_map)</p><h1>Fase 3: Ejecutar por niveles</h1><p>level_results = execute_graph(graph)</p><h1>Solo inyectar los resultados relevantes</h1><h1>(no todo el historial de llamadas)</h1><p>concise_context = summarize_results(level_results)</p><p>messages.append({</p><p>"role": "user",</p><p>"content": f"Resultados de herramientas:\n{concise_context}"</p><p>})</p><p>```</p><p>---</p><h2><strong>Manejador de Errores Inteligente: Propagar Solo lo Necesario</strong></h2><p>El beneficio m&#225;s infravalorado del grafo de dependencias es el manejo de errores.</p><p>En un loop secuencial, si la tool call #3 falla, tienes dos opciones: reintentar todo desde el principio o ignorar el error y seguir. Ambas son malas.</p><p>Con un grafo de dependencias, puedes propagar el fallo solo a los nodos dependientes:</p><p>```python</p><p>def propagate_failure(graph, failed_node_id, error):</p><p>"""Propaga el fallo solo a los nodos que dependen del nodo fallido"""</p><p>queue = deque([failed_node_id])</p><p>visited = set()</p><p>while queue:</p><p>current = queue.popleft()</p><p>if current in visited:</p><p>continue</p><p>visited.add(current)</p><h1>Marcar como fallido</h1><p>if current != failed_node_id:</p><p>graph.nodes[current].status = "failed"</p><p>graph.nodes[current].result = {"error": str(error)}</p><h1>Propagar a dependientes</h1><p>for dependent_id in graph.adjacency.get(current, []):</p><p>if dependent_id not in visited:</p><p>queue.append(dependent_id)</p><p>```</p><p>Esto significa que si una tool falla, solo se detienen las que necesitaban su resultado. El resto del grafo sigue ejecut&#225;ndose. El agente puede tomar decisiones parciales con los datos que s&#237; consigui&#243;.</p><p>---</p><h2><strong>Caso Real: Agente de Investigaci&#243;n de Mercado en 12 Segundos</strong></h2><p>Trabajo con un agente que investiga mercados. Necesita:</p><p>1. Buscar tendencias en Google Trends</p><p>2. Analizar 5 competidores en Crunchbase</p><p>3. Extraer reviews de Trustpilot</p><p>4. Sintetizar un informe</p><p><strong>Con ejecuci&#243;n secuencial:</strong></p><ul><li><p>8-12 llamadas secuenciales</p></li><li><p>~45 segundos de latencia total</p></li><li><p>Contexto masivo con datos intermedios de cada paso</p></li></ul><p><strong>Con grafo de dependencias:</strong></p><ul><li><p><strong>Fase 1:</strong> Ejecuta (1) y (2) en paralelo &#8212; 3 source calls simult&#225;neas</p></li><li><p><strong>Fase 2:</strong> Ejecuta (3) y (4) con datos de fase 1</p></li><li><p><strong>Total:</strong> ~12 segundos</p></li><li><p><strong>Contexto:</strong> 40% menos tokens porque solo pasas datos relevantes entre niveles</p></li></ul><p><strong>*La diferencia no es incremental. Es estructural.</strong> *</p><p>---</p><h2><strong>Cu&#225;ndo Usar Cada Patr&#243;n (S&#233; Honesto)</strong></h2><p>No te voy a vender que el grafo de dependencias es siempre la soluci&#243;n.</p><p><strong>Usa loop secuencial plano si:</strong></p><ul><li><p>Tu agente ejecuta 2-3 tool calls por turno</p></li><li><p>Todas las herramientas son estrictamente secuenciales (cada una necesita el resultado de la anterior)</p></li><li><p>El tiempo de respuesta no es cr&#237;tico</p></li></ul><p><strong>Usa el Patr&#243;n de Orquestaci&#243;n en 3 Fases si:</strong></p><ul><li><p>Tu agente ejecuta 5+ tool calls por turno</p></li><li><p>Tienes herramientas independientes que se pueden paralelizar</p></li><li><p>La latencia importa (UX en tiempo real, asistentes conversacionales, automatizaci&#243;n)</p></li><li><p>El coste de contexto empieza a dispararse</p></li></ul><p>El umbral est&#225; claro: 5 tool calls. Por debajo, el overhead del grafo no compensa. Por encima, el loop secuencial te est&#225; costando tiempo, tokens, y calidad.</p><p>---</p><h2><strong>&#191;Y MCP? No Resuelve Esto</strong></h2><p>MCP resuelve el problema de "c&#243;mo conecto mi agente a 20 APIs diferentes". Es un problema de protocolo.</p><p>Pero una vez que tienes 20 herramientas conectadas, el problema pasa a ser "en qu&#233; orden las llamo y cu&#225;les puedo llamar simult&#225;neamente".</p><p><strong>*MCP no toca ese problema. La orquestaci&#243;n es el layer que falta entre MCP y el agent loop.</strong> *</p><p>Si solo implementas MCP y dejas el agent loop secuencial, tienes herramientas ilimitadas conectadas a un pipeline que las ejecuta una a una. Como tener 20 carriles en una autopista que se reduce a un solo carril en cada peaje.</p><p>---</p><h2><strong>Lo Que Te Llevas</strong></h2><p>El 90% de los AI Agents en GitHub ejecutan tool calls secuenciales. Y funcionan. Pero funcionan mal, lento, y caros.</p><p>El salto de calidad real no est&#225; en el modelo. No est&#225; en MCP. <strong>Est&#225; en c&#243;mo orquestas las llamadas.</strong></p><p>Tres fases: analiza dependencias, construye el DAG, ejecuta por niveles topol&#243;gicos. Cada fase resuelve un problema concreto del loop secuencial.</p><p>La herramienta para construir el agente es secundaria. La arquitectura de orquestaci&#243;n es primaria.</p><p><strong>*El mejor modelo con mala orquestaci&#243;n pierde siempre contra un modelo decente con buena orquestaci&#243;n.</strong> *</p><p>La pr&#243;xima vez que construyas un AI Agent, no empieces por el LLM. Empieza por el grafo.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/tool-orchestration-ai-agents-grafo-dependencias-2026-20260603?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[La Decisión Más Cara del Solo-Operator No Es Qué Construir. Es Qué No Comprar.]]></title><description><![CDATA[&#191;Construir producto sin audiencia? El error m&#225;s caro del solo-operator. Aprende por qu&#233; la distribuci&#243;n primero es la &#250;nica estrategia que reduce tu riesgo real.]]></description><link>https://newsletter.brianmenagomez.com/p/la-decision-mas-cara-del-solo-operator</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/la-decision-mas-cara-del-solo-operator</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Wed, 03 Jun 2026 07:00:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1f08238e-3b60-469a-8b38-9d5918237b30_1080x608.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>La Decisi&#243;n M&#225;s Cara del Solo-Operator No Es Qu&#233; Construir. Es Qu&#233; No Comprar.</strong></h2><p>Crees que tu problema es que no encuentras el producto adecuado. Que si investigas un nicho m&#225;s a fondo,validas una necesidad real, y ejecutas el build perfecto, los usuarios llegar&#225;n solos.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>La decisi&#243;n m&#225;s cara que tomar&#225;s como solo-operator <strong>no es qu&#233; construir. Es qu&#233; no comprar.</strong></p><p>La sabidur&#237;a convencional del ecosistema indie repite el mismo mantra desde 2010: "encuentra un problema, construye una soluci&#243;n, valida con usuarios reales". Asume que construir es la parte dif&#237;cil. Que la ejecuci&#243;n t&#233;cnica es el cuello de botella.</p><p>Los datos del fragmento de <em>solo_operator_economics</em> cuentan otra historia.</p><p>Comprar un negocio online con tracci&#243;n existente <strong>externaliza el riesgo de product-market fit</strong>. El negocio ya tiene audiencia. Ya tiene tr&#225;fico. Ya tiene clientes que pagan. El riesgo de construir algo que nadie quiere &#8212; el riesgo existencial del 90% de los startups &#8212; desaparece de tu ecuaci&#243;n.</p><p>La contrapartida: <strong>internalizas el riesgo de integraci&#243;n operativa</strong>. Migrar hosts. Consolidar APIs. Estandarizar procesos. Retener clientes durante la transici&#243;n. Eso es un problema t&#233;cnico y operativo que una sola persona competente puede resolver met&#243;dicamente.</p><p>Un producto sin audiencia es un museo. Una audiencia sin producto es un negocio reparable.</p><p>---</p><h2><strong>El Mito del 'Build It and They Will Come'</strong></h2><p>La mayor&#237;a de recursos para solo-operators empiezan igual: paso 1, encuentra un problema. Paso 2, construye una soluci&#243;n. Paso 3, valida.</p><p>Este orden asume tres cosas falsas:</p><p>&#10060; <strong>Que construir es la parte dif&#237;cil.</strong> La evidencia del fragmento sugiere lo contrario: la distribuci&#243;n (tracci&#243;n existente) es el activo m&#225;s valioso, y el producto se puede integrar, mejorar o incluso reemplazar despu&#233;s.</p><p>&#10060; <strong>Que la validaci&#243;n es un evento puntual.</strong> Construyes, lanzas, y si hay tracci&#243;n, sigues. La realidad es que la validaci&#243;n es un proceso continuo que requiere audiencia para funcionar.</p><p>&#10060; <strong>Que una persona sola puede validar mercado desde cero.</strong> Un solo-operator tiene capacidad limitada para hacer outreach, conseguir entrevistas, y generar tracci&#243;n inicial sin una base existente.</p><p>El enfoque correcto invierte el orden:</p><p>&#9989; <strong>Adquiere o construye distribuci&#243;n primero.</strong> Audiencia, tr&#225;fico SEO, lista de emails, red de afiliados. Ese es tu activo principal.</p><p>&#9989; <strong>El producto es secundario y mejorable.</strong> Si la distribuci&#243;n funciona, puedes iterar el producto con usuarios reales que ya te conocen.</p><p>&#9989; <strong>El riesgo operativo es manejable por una persona.</strong> Migrar tecnolog&#237;a, estandarizar procesos, retener clientes &#8212; eso se resuelve con metodolog&#237;a, no con suerte.</p><p>---</p><h2><strong>El Riesgo Que No Ves: Distribuci&#243;n &#8800; Producto</strong></h2><p>El fragmento establece una dicotom&#237;a clave: <strong>externalizar product-market fit vs. internalizar integraci&#243;n operativa</strong>.</p><p>El solo-operator debe elegir qu&#233; tipo de riesgo est&#225; mejor equipado para gestionar.</p><p><strong>Riesgo de product-market fit (alto):</strong> No sabes si existe mercado para lo que construyes. No sabes si los clientes pagar&#225;n. No sabes si tu soluci&#243;n es mejor que las alternativas. Este riesgo es cualitativo, existencial, y no se resuelve con c&#243;digo.</p><p><strong>Riesgo de integraci&#243;n operativa (bajo):</strong> Sabes que el mercado existe porque el negocio ya vende. Sabes que la audiencia responde porque ya tiene tr&#225;fico. El problema es migrar, consolidar, y optimizar. Este riesgo es t&#233;cnico, secuencial, y se resuelve con metodolog&#237;a.</p><p>Comprar un negocio con tracci&#243;n no es "tomar atajos". <strong>Es reconocer que la distribuci&#243;n es un problema cualitativamente diferente al producto.</strong></p><p>La distribuci&#243;n requiere construcci&#243;n de autoridad, relaciones, SEO hist&#243;rico, enlaces entrantes, y confianza acumulada que <strong>no se replica con c&#243;digo</strong>.</p><p>Un producto se puede refactorizar en semanas. Una audiencia tarda a&#241;os en construirse.</p><p>Comprar un negocio existente es comprar tiempo geol&#243;gico.</p><p>---</p><h2><strong>El Marco de Decisi&#243;n: Las 5 Fases de 'Distribuci&#243;n Primero'</strong></h2><p>He ejecutado esta estrategia con tres negocios diferentes. El patr&#243;n es siempre el mismo. Aqu&#237; est&#225; el framework en cinco fases:</p><h3><strong>Fase 1: Auditar marketplaces de compraventa de negocios</strong></h3><p>No mires tecnolog&#237;a. No mires producto. Mira m&#233;tricas de tr&#225;fico y audiencia.</p><p>Busca en:</p><ul><li><p>MicroAcquire (negocios digitales globales)</p></li><li><p>Flippa (dominios con tr&#225;fico residual)</p></li><li><p>Adquisiciones locales en Espa&#241;a (foros de aut&#243;nomos, grupos de WhatsApp sectoriales, redes de contacto directo)</p></li><li><p>Acquire.com (SaaS con ingresos recurrentes)</p></li></ul><p>El filtro principal: <strong>&#191;el activo principal es la distribuci&#243;n o el producto?</strong></p><p>Si el negocio tiene 5.000 visitas mensuales org&#225;nicas pero el producto es un WordPress cutre con un plugin mal escrito &#8212; ese es tu candidato. La distribuci&#243;n vale. El producto se cambia.</p><p>Si el negocio tiene un producto impecable pero cero tr&#225;fico org&#225;nico y la adquisici&#243;n depende de anuncios pagados del fundador actual &#8212; huye. Est&#225;s comprando un problema de distribuci&#243;n, que es el que no sabes resolver.</p><h3><strong>Fase 2: Evaluar el riesgo de integraci&#243;n operativa</strong></h3><p>Antes de comprar, mapea:</p><ul><li><p>Dependencias t&#233;cnicas: hosting, dominio, APIs, servicios externos</p></li><li><p>Procesos manuales: &#191;cu&#225;nto del negocio depende del fundador original haciendo cosas a mano?</p></li><li><p>Proveedores: &#191;hay contratos, cuentas compartidas, acceso delegado?</p></li><li><p>Canales de adquisici&#243;n: SEO, email, afiliados, redes sociales &#8212; &#191;cu&#225;l es el canal dominante?</p></li></ul><p>El objetivo no es eliminar el riesgo operativo. Es <strong>cuantificarlo</strong>.</p><p>Si el negocio tiene 3 dependencias t&#233;cnicas y 2 procesos manuales que puedes automatizar en una semana, el riesgo de integraci&#243;n es bajo. Si has de migrar 15 APIs, reescribir el frontend, y retener clientes durante un cambio de dominio, el riesgo es medio-alto pero sigue siendo manejable por una sola persona con metodolog&#237;a.</p><h3><strong>Fase 3: Calcular el 'coste de migraci&#243;n de audiencia'</strong></h3><p>Esta es la pregunta clave que nadie se hace:</p><p><strong>Si el producto es deficiente pero la audiencia es s&#243;lida, &#191;cu&#225;nto esfuerzo tomar&#237;a reemplazar la tecnolog&#237;a subyacente sin perder tr&#225;fico?</strong></p><p>Pasos:</p><p>1. Identifica las URLs que generan tr&#225;fico org&#225;nico (Google Search Console, Ahrefs, SEMrush)</p><p>2. Mapea las redirecciones necesarias si cambias de dominio o CMS</p><p>3. Calcula el tiempo de migraci&#243;n: contenido, templates, funcionalidades cr&#237;ticas</p><p>4. Estima el riesgo de p&#233;rdida de tr&#225;fico durante la transici&#243;n</p><p>En mi experiencia, migrar un negocio con 2.000-5.000 visitas mensuales a un stack moderno (Next.js + Vercel + headless CMS) lleva entre 2 y 4 semanas si el contenido es principalmente est&#225;tico. El tr&#225;fico no se pierde si mantienes las URLs y configuras las redirecciones correctamente.</p><h3><strong>Fase 4: Priorizar negocios donde la distribuci&#243;n sea el activo principal</strong></h3><p>Tu checklist de priorizaci&#243;n:</p><ul><li><p>&#9989; Tr&#225;fico org&#225;nico recurrente (no campa&#241;as de un mes)</p></li><li><p>&#9989; Lista de emails activa (no comprada, no caducada)</p></li><li><p>&#9989; Red de afiliados o referidos establecida</p></li><li><p>&#9989; SEO hist&#243;rico con backlinks reales</p></li><li><p>&#9989; Marca reconocida en su nicho (aunque sea peque&#241;o)</p></li></ul><p>Si el negocio tiene tres de estos cinco, <strong>compra aunque el producto apeste</strong>. El producto se arregla. La distribuci&#243;n no se construye en un mes.</p><h3><strong>Fase 5: Ejecutar la integraci&#243;n en tres fases</strong></h3><p>Fase A: <strong>Mantener la distribuci&#243;n existente.</strong> No toques nada que genere tr&#225;fico. No cambies URLs. No migres dominios. No redise&#241;es la p&#225;gina principal. Lo primero es asegurar que el grifo de tr&#225;fico no se cierra.</p><p>Fase B: <strong>Optimizar el producto.</strong> Una vez que la distribuci&#243;n es estable, refactoriza. Migra a un stack mantenible. Automatiza procesos manuales. Mejora el onboarding. A&#241;ade funcionalidades que los usuarios llevan pidiendo meses.</p><p>Fase C: <strong>Expandir canales.</strong> Solo cuando el producto es s&#243;lido y la distribuci&#243;n original est&#225; asegurada, considera nuevos canales: SEO adicional, partnerships, contenido nuevo, integraciones con otras herramientas.</p><p>---</p><h2><strong>Objeciones Reales (Y Por Qu&#233; No Deber&#237;an Pararte)</strong></h2><p><strong>*"Comprar un negocio requiere capital que no tengo."</strong>*</p><p>Objeci&#243;n v&#225;lida. Pero el principio de distribuci&#243;n primero se aplica igual si construyes la audiencia antes que el producto. Empieza con un newsletter. Publica contenido SEO en un nicho concreto durante 6 meses. Construye una lista de emails. Cuando tengas 500 suscriptores comprometidos, entonces construye el producto. La audiencia es tu validaci&#243;n y tu canal de lanzamiento.</p><p><strong>*"Si el producto es malo, la audiencia se ir&#225; aunque tenga tr&#225;fico."</strong>*</p><p>Objeci&#243;n parcialmente cierta pero incompleta. La evidencia muestra que la inercia del usuario es real: la gente vuelve a herramientas que ya conoce y tiene configuradas, incluso si existen alternativas superiores. El umbral de "producto suficientemente bueno" es mucho m&#225;s bajo cuando ya tienes distribuci&#243;n que cuando empiezas de cero.</p><p>Adem&#225;s, si la audiencia viene por contenido (no por producto), migrar a un producto mejor solo retiene y expande. El contenido es el im&#225;n; el producto es la puerta.</p><p><strong>*"Los buenos negocios con tracci&#243;n no se venden, o si se venden, son demasiado caros."</strong>*</p><p>Objeci&#243;n basada en un sesgo de supervivencia. Ves los casos que se venden caros y asumes que todos son as&#237;. La realidad: muchos negocios con buena distribuci&#243;n se venden porque sus due&#241;os originales se quemaron, perdieron inter&#233;s, o no tienen tiempo para mantenerlos.</p><p>El riesgo de integraci&#243;n operativa disuade a compradores. Los fondos de inversi&#243;n no quieren negocios que requieran trabajo operativo manual. Las agencias no quieren migraciones t&#233;cnicas complejas. Eso crea oportunidades para solo-operators dispuestos a hacer el trabajo que otros evitan.</p><p>---</p><h2><strong>Por Qu&#233; el Contexto Espa&#241;ol Es tu Ventaja</strong></h2><p>El mercado de adquisici&#243;n de negocios digitales en Espa&#241;a es menos competitivo que en USA. Los grandes fondos no miran negocios con facturaci&#243;n en espa&#241;ol. Las agencias grandes no quieren lidiar con gestor&#237;as, aut&#243;nomos, y regulaci&#243;n local.</p><p>Un solo-operator espa&#241;ol tiene ventaja comprando negocios con audiencia hispanohablante donde nadie m&#225;s compite.</p><p>Pero necesitas navegar aspectos locales que el fragmento no cubre:</p><ul><li><p>Traspaso de dominio y propiedad intelectual</p></li><li><p>Contratos con proveedores espa&#241;oles</p></li><li><p>Gesti&#243;n de aut&#243;nomos y IVA en la transmisi&#243;n</p></li><li><p>Retenci&#243;n de clientes durante el cambio de titularidad</p></li></ul><p>Eso es parte del riesgo de integraci&#243;n operativa. Y es exactamente el tipo de riesgo que una sola persona competente puede resolver.</p><p>---</p><h2><strong>El Producto Es un Problema de Ingenier&#237;a. La Distribuci&#243;n Es un Problema de Tiempo.</strong></h2><p>Nunca ha sido m&#225;s barato construir producto. Vercel te da deploy en segundos. Supabase te da base de datos escalable. Claude Code escribe el 60% del c&#243;digo. Los frameworks modernos eliminan la fricci&#243;n t&#233;cnica.</p><p>Lo que sigue siendo caro &#8212; en tiempo, en energ&#237;a, en relaciones &#8212; es la distribuci&#243;n.</p><p>El fragmento de <em>solo_operator_economics</em> lo deja claro: el solo-operator no deber&#237;a apostar su recurso m&#225;s escaso (tiempo) a construir audiencia desde cero cuando puede adquirirla externalizando el riesgo de product-market fit.</p><p>La pr&#243;xima vez que te sientes a escribir c&#243;digo para un proyecto nuevo, preg&#250;ntate:</p><p><strong>&#191;Este c&#243;digo est&#225; resolviendo un problema de producto o un problema de distribuci&#243;n?</strong></p><p>Si es lo segundo, est&#225;s perdiendo el tiempo. Compra la distribuci&#243;n. Construye el producto despu&#233;s.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/distribucion-primero-solo-operator-comprar-audiencia-20260603?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[MCP (Model Context Protocol): La Guía Definitiva para Entender el Protocolo que Invierte la Integración con IA]]></title><description><![CDATA[Gu&#237;a completa de MCP (Model Context Protocol) en espa&#241;ol. Aprende a construir servidores MCP, por qu&#233; es m&#225;s seguro que integraciones ad-hoc, y c&#243;mo reemplaza el problema N&#215;M de conexiones con IA.]]></description><link>https://newsletter.brianmenagomez.com/p/mcp-model-context-protocol-la-guia-2f7</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/mcp-model-context-protocol-la-guia-2f7</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Tue, 02 Jun 2026 07:00:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/96f03788-e04b-42e6-924a-6d73e8341eda_1080x710.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Tu Integraci&#243;n con IA Ya es Obsoleta &#8212; y Eso es Bueno</strong></h2><p>Cada vez que conectas un LLM a una base de datos, a una API o a un fichero, est&#225;s escribiendo c&#243;digo que alguien ya escribi&#243;.</p><p><strong>*El problema no es que funcione. Es que no escala.</strong> *</p><p>El 90% de los desarrolladores aborda la integraci&#243;n con IA igual que en 2023: un endpoint custom, un system prompt con instrucciones, y una oraci&#243;n de "por favor devuelve JSON v&#225;lido".</p><p>Funciona para un tool. Para dos. Para un prototype.</p><p><strong>*Pero cuando tienes 5 herramientas, 3 proveedores de IA, y necesitas auditar cada llamada, tu castillo de naipes se derrumba.</strong> *</p><p>MCP (Model Context Protocol) no es otro est&#225;ndar m&#225;s. Es el primer intento real de resolver lo que llamo <strong>*el problema USB-C de la IA</strong>*: un conector universal para que cualquier modelo hable con cualquier herramienta, con seguridad expl&#237;cita, sin c&#243;digo repetido.</p><p>Y la mayor&#237;a lo est&#225; usando mal.</p><p>---</p><h2><strong>El Error: Crees que MCP es para "Dar Acceso" a la IA</strong></h2><p>La creencia popular: "MCP permite que la IA acceda a mis herramientas y datos."</p><p>&#10060; <strong>Error.</strong> Eso es lo que parece. Pero no es lo que hace.</p><p>&#9989; <strong>Realidad:</strong> MCP te obliga a definir *expl&#237;citamente<em> qu&#233; recursos, qu&#233; tools y qu&#233; prompts puede tocar el modelo. No es una puerta abierta. Es una lista blanca con candado</em>*.</p><p>El valor real de MCP no es la conectividad. Es el <strong>control de fronteras</strong>.</p><p>Cuando construyes una integraci&#243;n ad-hoc con fetch() y un system prompt, el modelo puede &#8212; en teor&#237;a &#8212; llamar a cualquier endpoint, pasar cualquier par&#225;metro, intentar cualquier cosa. La seguridad depende de que el prompt est&#233; bien escrito. Depende de que el modelo no alucine una llamada que no deber&#237;a hacer.</p><p><strong>*Eso no es seguridad. Eso es esperanza.</strong> *</p><p>Con MCP, defines tres primitivas:</p><ul><li><p><strong>Resources</strong> &#8212; datos que el modelo puede *leer* (ficheros, tablas, APIs)</p></li><li><p><strong>Tools</strong> &#8212; funciones que el modelo puede *ejecutar* (con tipos, descripciones, validaci&#243;n)</p></li><li><p><strong>Prompts</strong> &#8212; plantillas reutilizables que el modelo puede *cargar*</p></li></ul><p>Todo pasa por un &#250;nico servidor MCP. Ese servidor es tu punto de control. Ah&#237; auditas, limitas, validas.</p><p>La obsesi&#243;n con "agentes aut&#243;nomos" os ha hecho olvidar lo b&#225;sico: <strong>*antes de que un agente sea aut&#243;nomo, tiene que estar controlado.</strong> *</p><p>---</p><h2><strong>El Problema Real: N &#215; M No Escala</strong></h2><p>Antes de MCP, cada integraci&#243;n segu&#237;a este patr&#243;n:</p><p>1. Eliges un proveedor de IA (OpenAI, Anthropic, Google)</p><p>2. Implementas function calling espec&#237;fico para ese proveedor</p><p>3. Defines los schemas de los tools en el formato que ese modelo entiende</p><p>4. Escribes el c&#243;digo de autorizaci&#243;n, error handling, logging</p><p>5. Repites para el siguiente proveedor</p><p>Eso es el <strong>problema N &#215; M</strong>: N herramientas &#215; M proveedores de IA = N &#215; M integraciones.</p><p>&#10060; <strong>Quieres cambiar de GPT a Claude?</strong> Reescribes todas las tool definitions.</p><p>&#10060; <strong>A&#241;ades una herramienta nueva?</strong> La implementas para cada proveedor por separado.</p><p>&#10060; <strong>Actualizas un schema?</strong> Lo cambias en N sitios distintos.</p><p><strong>*MCP invierte esto.</strong> *</p><p>Un servidor MCP expone tools y resources con un est&#225;ndar &#250;nico. Cualquier <em>host</em> compatible con MCP (Claude Desktop, cualquier cliente que implemente el protocolo) puede consumirlo.</p><p>Cambias de modelo? El host cambia, el servidor MCP sigue igual.</p><p>A&#241;ades una herramienta? Un nuevo @mcp.tool() y listo.</p><p>Actualizas un schema? Un solo fichero.</p><p>| Sin MCP | Con MCP |</p><p>|---|---|</p><p>| N &#215; M integraciones | N servidores MCP |</p><p>| C&#243;digo repetido por proveedor | Un solo SDK |</p><p>| Seguridad distribuida (o inexistente) | Un punto de auditor&#237;a |</p><p>| Cambiar de modelo = reescribir | Cambiar de modelo = cambiar el host |</p><p><strong>*MCP es a function calling lo que SQL es a las queries espec&#237;ficas de base de datos.</strong> * Una capa de abstracci&#243;n que te permite cambiar el motor sin cambiar el c&#243;digo.</p><p>---</p><h2><strong>La Evidencia: C&#243;mo se Construye un Servidor MCP en Python</strong></h2><p>Vamos a verlo con c&#243;digo real. Esto es un servidor MCP m&#237;nimo que expone una tool para obtener el tiempo.</p><p>```python</p><h1>servidor_mcp_minimo.py</h1><p>from mcp import Server, Tool, types</p><p>server = Server("weather-server")</p><p>@server.tool(</p><p>name="get_weather",</p><p>description="Obtiene la temperatura actual para una ciudad",</p><p>parameters={</p><p>"city": types.StringParam(description="Nombre de la ciudad"),</p><p>"units": types.StringParam(</p><p>description="Unidad: celsius o fahrenheit",</p><p>enum=["celsius", "fahrenheit"],</p><p>default="celsius"</p><p>)</p><p>}</p><p>)</p><p>async def get_weather(city: str, units: str = "celsius") -&gt; str:</p><h1>Aqu&#237; ir&#237;a la llamada real a una API de clima</h1><p>return f"La temperatura en {city} es 22&#176;{units[0].upper()}"</p><p>server.run()</p><p>```</p><p><strong>*Tres l&#237;neas para definir un tool.</strong> * Sin endpoints REST, sin autenticaci&#243;n custom, sin boilerplate de validaci&#243;n.</p><p>Ahora expongamos un <strong>Resource</strong> &#8212; datos que el modelo puede leer. Una tabla de SQLite como recurso:</p><p>```python</p><p>import sqlite3</p><p>from mcp import Server, Resource</p><p>server = Server("inventory-server")</p><p>@server.resource(</p><p>name="inventory/products",</p><p>description="Tabla de productos del inventario",</p><p>uri="inventory://products"</p><p>)</p><p>async def get_products() -&gt; dict:</p><p>conn = sqlite3.connect("inventario.db")</p><p>cursor = conn.execute("SELECT id, name, stock FROM products")</p><p>products = [{"id": r[0], "name": r[1], "stock": r[2]} for r in cursor.fetchall()]</p><p>conn.close()</p><p>return {"products": products}</p><p>```</p><p>El modelo no tiene acceso a la base de datos. No puede hacer `DROP TABLE`. No puede inyectar SQL. Solo puede leer lo que el Resource expone.</p><p><strong>*Eso es control de fronteras en acci&#243;n.</strong> *</p><p>---</p><h2><strong>El Marco de 5 Pasos para tu Primer Servidor MCP</strong></h2><p>Lo llamo <strong>El Patr&#243;n de 5 Pasos para el Servidor MCP</strong>. As&#237; es como lo implementas hoy:</p><h3><strong>1. Define la Frontera</strong></h3><p>Antes de escribir una l&#237;nea de c&#243;digo, haz una lista:</p><ul><li><p><strong>Resources</strong>: qu&#233; datos necesita leer el modelo. Tablas, ficheros, endpoints GET.</p></li><li><p><strong>Tools</strong>: qu&#233; acciones puede ejecutar. Enviar email, crear ticket, buscar en DB.</p></li><li><p><strong>Prompts</strong>: qu&#233; instrucciones reutilizables necesita. "Resume este log", "Clasifica este ticket."</p></li></ul><p><strong>*Si no est&#225; en la lista, el modelo no lo toca.</strong> *</p><h3><strong>2. Implementa el Servidor</strong></h3><p>Elige Python o Node.js. Instala el SDK oficial de MCP:</p><p>```bash</p><p>pip install mcp</p><h1>o</h1><p>npm install @modelcontextprotocol/sdk</p><p>```</p><p>Expone cada recurso y cada tool con los decoradores. Un fichero, un servidor.</p><h3><strong>3. Testea Local con Claude Desktop</strong></h3><p>Conecta tu servidor a Claude Desktop usando el transporte <strong>stdio</strong> (tu servidor se ejecuta como un proceso hijo).</p><p>Configuraci&#243;n en `claude_desktop_config.json`:</p><p>```json</p><p>{</p><p>"mcpServers": {</p><p>"weather-server": {</p><p>"command": "python",</p><p>"args": ["/ruta/a/servidor_mcp_minimo.py"]</p><p>}</p><p>}</p><p>}</p><p>```</p><p>Arrancas Claude. El modelo descubre autom&#225;ticamente tus tools. Le pides "&#191;Qu&#233; tiempo hace en Madrid?" y lo invoca.</p><p><strong>*Sin API keys. Sin endpoints expuestos. Sin CORS.</strong> *</p><h3><strong>4. A&#241;ade Seguridad en el Servidor</strong></h3><p>Como todas las llamadas pasan por tu servidor MCP, este es tu <strong>chokepoint</strong>:</p><ul><li><p>A&#241;ade logging de cada invocaci&#243;n de tool</p></li><li><p>Implementa rate limiting por usuario o por sesi&#243;n</p></li><li><p>Valida par&#225;metros antes de pasarlos al backend real</p></li><li><p>Aplica autorizaci&#243;n: qu&#233; usuario puede llamar a qu&#233; tool</p></li></ul><p>En una integraci&#243;n ad-hoc, esto est&#225; repartido entre N endpoints. Con MCP, est&#225; en un solo sitio.</p><h3><strong>5. Exponte Prompts Reutilizables</strong></h3><p>No obligues al modelo a reinventar instrucciones cada vez. Crea prompts que empaqueten tu conocimiento de dominio:</p><p>```python</p><p>@server.prompt(</p><p>name="summarize_log",</p><p>description="Resume un fichero de log en 3 puntos clave"</p><p>)</p><p>async def summarize_log(log_content: str) -&gt; str:</p><p>return f"""</p><p>Eres un experto en an&#225;lisis de logs.</p><p>Recibir&#225;s el contenido de un fichero de log.</p><p>Devuelve un resumen con:</p><p>1. Errores cr&#237;ticos encontrados</p><p>2. Patrones recurrentes</p><p>3. Recomendaciones inmediatas</p><p>Log:</p><p>{log_content}</p><p>"""</p><p>```</p><p><strong>*El modelo no tiene que adivinar c&#243;mo quieres que resuma. Se lo das hecho.</strong> *</p><p>---</p><h2><strong>Lo que MCP NO es (y por qu&#233; eso importa)</strong></h2><p>Aqu&#237; es donde el 90% se confunde:</p><p>&#10060; <strong>MCP no es un framework de agentes.</strong> No orquesta flujos, no tiene memoria, no planifica. LangChain, CrewAI, AutoGPT hacen eso. MCP es la capa de *conectividad* que esos frameworks consumen.</p><p>&#10060; <strong>MCP no reemplaza function calling.</strong> Function calling es c&#243;mo el modelo *declara<em> que quiere llamar a una funci&#243;n. MCP es c&#243;mo esa funci&#243;n se </em>descubre, invoca y asegura*. Son complementarios.</p><p>&#10060; <strong>MCP no es solo para Claude.</strong> Es un protocolo abierto (MIT). Hay SDKs para Python, Node.js, Java, Go, Rust. Cualquier host puede implementarlo.</p><p>&#9989; <strong>MCP es el conector universal.</strong> Como TCP/IP no es un navegador. MCP no es un agente. Es el cable.</p><p><strong>*Comparar MCP con LangChain es como comparar el protocolo HTTP con un servidor web.</strong> * Son capas distintas. Y MCP es la infraestructura.</p><p>---</p><h2><strong>Las Limitaciones que Nadie Cuenta</strong></h2><p>No todo es perfecto. MCP usa <strong>JSON-RPC 2.0</strong> como transporte. Es simple, bien conocido, agn&#243;stico al lenguaje.</p><p><strong>*Pero no soporta streaming de respuestas desde tools.</strong> * El modelo llama a una tool y espera a que termine. Para tools lentas (procesar un PDF grande, hacer m&#250;ltiples llamadas API), esto es una limitaci&#243;n.</p><p>El protocolo s&#237; soporta <strong>Server-Sent Events (SSE)</strong> en la direcci&#243;n servidor &#8594; cliente. Pero la respuesta de una tool es s&#237;ncrona: llamas, esperas, recibes.</p><p>Si necesitas que el modelo act&#250;e sobre datos en tiempo real (streaming de precios, logs en vivo), tienes que dise&#241;ar tu servidor para que devuelva resultados parciales o uses un patr&#243;n de pooling.</p><p><strong>*No es un dealbreaker. Pero es un constraint que hay que conocer.</strong> *</p><p>---</p><h2><strong>La Pregunta que Debes Hacerte</strong></h2><p>No es "&#191;deber&#237;a usar MCP?"</p><p>La pregunta es: <strong>*&#191;cu&#225;nto tiempo est&#225;s perdiendo escribiendo integraciones que alguien m&#225;s podr&#237;a estar consumiendo con un est&#225;ndar?</strong> *</p><p>Si tienes una herramienta, una API, un proveedor de IA &#8212; y un solo integration path &#8212; vale, no lo necesitas.</p><p>Pero si tienes 3 o m&#225;s integraciones, o piensas escalar, o te importa la seguridad, o quieres poder cambiar de modelo sin reescribir todo:</p><p><strong>*MCP no es opcional. Es la base que deber&#237;as haber tenido desde el principio.</strong> *</p><p>---</p><h2><strong>Resumen y Siguiente Paso</strong></h2><p><strong>Lo que has aprendido:</strong></p><ul><li><p>MCP no es sobre "dar acceso" &#8212; es sobre <strong>control de fronteras</strong> con resources, tools y prompts expl&#237;citos</p></li><li><p>Resuelve el <strong>problema N &#215; M</strong> de integraciones con un est&#225;ndar &#250;nico</p></li><li><p>Un servidor MCP se construye en minutos con el SDK oficial</p></li><li><p>La seguridad se centraliza en el servidor MCP como chokepoint</p></li><li><p>MCP no compite con agent frameworks &#8212; los habilita</p></li></ul><p><strong>Tu siguiente paso:</strong> Abre tu editor. Instala el SDK de MCP. Coge la tool m&#225;s usada de tu proyecto actual. Exponla como un servidor MCP.</p><p><strong>*Cuando conectes Claude Desktop y veas que tu tool aparece sin configurar nada m&#225;s, entender&#225;s por qu&#233; todo lo anterior estaba obsoleto.</strong> *</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/mcp-model-context-protocol-guia-definitiva-20260602?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Comprar un Negocio Online en España No Es Más Rápido. Es Más Caro (En Energía)]]></title><description><![CDATA[Comprar un negocio online en Espa&#241;a vs. construirlo desde cero. An&#225;lisis real para el solo-operator con datos de deuda operativa, umbrales de ingresos y el framework de las 5 dimensiones.]]></description><link>https://newsletter.brianmenagomez.com/p/comprar-un-negocio-online-en-espana</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/comprar-un-negocio-online-en-espana</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Tue, 02 Jun 2026 07:00:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/da33b543-0213-4416-9396-6fb5a7e561ca_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Comprar un Negocio Online No Te Ahorra Construir. Te Obliga a Desenredar.</strong></h2><p>Crees que comprar un negocio online ya en marcha es el atajo. Pagas, heredas clientes, ingresos recurrentes, y te saltas los meses de validaci&#243;n, desarrollo y lanzamiento.</p><p><strong>*Te has equivocado de compra.</strong>*</p><p>Comprar un negocio online externaliza el riesgo de <em>product-market fit</em>, s&#237;. Pero internaliza un riesgo peor para el solo-operator sin equipo: <strong>el riesgo de integraci&#243;n operativa</strong>. Y ese risko &#8212; cuando trabajas solo, con hijos, y con 4 horas diarias desde un taller de pintura &#8212; puede ser m&#225;s destructivo que construir desde cero.</p><p>La sabidur&#237;a convencional dice "compra si puedes permit&#237;rtelo, construye si no tienes presupuesto". La realidad para el operador en Espa&#241;a es m&#225;s matizada: <strong>no compres un negocio si no puedes auditar su deuda operativa antes de firmar</strong>. Porque el tiempo que crees que ahorras compr&#225;ndolo lo gastar&#225;s &#8212; con intereses &#8212; desenredando las decisiones de otro.</p><p>---</p><h2><strong>El Mito del Atajo: Por Qu&#233; Comprar Parece M&#225;s R&#225;pido de Lo Que Es</strong></h2><p>El argumento de compra es seductor. Un negocio en Flippa o Acquire.com con 50 clientes, ingresos estables, SEO posicionado y procesos documentados. <strong>*Parece</strong>* que solo necesitas mantenerlo.</p><p><strong>Lo que no ves desde fuera:</strong></p><ul><li><p>Las 43 integraciones de API que el vendedor configur&#243; manualmente y nunca document&#243;.</p></li><li><p>Los scripts en producci&#243;n que nadie sabe qu&#233; hacen pero que si se caen, lloran los clientes.</p></li><li><p>Las relaciones con proveedores que dependen del contacto personal del vendedor.</p></li><li><p>El contenido SEO que posicion&#243; porque Google todav&#237;a perdonaba cosas en 2023.</p></li><li><p>Los procesos manuales que el vendedor hac&#237;a cada viernes a las 6 de la tarde y que ahora te tocan a ti.</p></li></ul><p>En el contexto de las tesis recientes sobre el solo-operator con hijos, comprar un negocio tiene un problema estructural: <strong>el pico de demanda energ&#233;tica llega cuando menos lo esperas</strong>. Construir desde cero tiene un coste alto al inicio que decrece. Comprar tiene un coste bajo al inicio que <strong>se dispara durante la integraci&#243;n post-adquisici&#243;n</strong>.</p><p>&#10060; <strong>El enfoque equivocado:</strong> "Compro el negocio y luego ya limpio el c&#243;digo, los procesos, y las dependencias mientras mantengo los ingresos."</p><p>&#9989; <strong>El enfoque real:</strong> "Comprar un negocio es comprometerme a hacer *reverse engineering* de otro fundador &#8212; y cada decisi&#243;n que descubra requerir&#225; tiempo que le robo a las ventas."</p><p>---</p><h2><strong>El Concepto Que Nadie Te Dice: Deuda Operativa</strong></h2><p>Existe la deuda t&#233;cnica (c&#243;digo mal escrito, dependencias obsoletas, falta de tests). Pero para el operador que compra un negocio, existe una categor&#237;a peor: <strong>la deuda operativa</strong>.</p><p><strong>*La deuda operativa es todo lo que no es c&#243;digo pero que necesita atenci&#243;n constante para que el negocio funcione.</strong>*</p><p><strong>Dimensiones de la deuda operativa en una compra:</strong></p><p>1. <strong>Deuda de procesos</strong> &#8212; Flujos manuales que el vendedor ejecutaba de memoria y que ahora t&#250; tienes que reconstruir.</p><p>2. <strong>Deuda de relaciones</strong> &#8212; Proveedores, partners, clientes clave que est&#225;n vinculados al vendedor, no al negocio.</p><p>3. <strong>Deuda de pricing</strong> &#8212; Una estructura de precios dise&#241;ada para el vendedor que no necesariamente funciona para tu perfil de operador.</p><p>4. <strong>Deuda de contenido</strong> &#8212; Art&#237;culos SEO, backlinks, estrategia de contenidos que posicionaron en otro contexto algor&#237;tmico.</p><p>5. <strong>Deuda de conocimiento</strong> &#8212; Decisiones que el vendedor tom&#243; hace dos a&#241;os y que nadie recuerda por qu&#233; se tomaron.</p><p>Para un solo-operator, desenredar estas cinco capas sin equipo de apoyo puede <strong>paralizar el negocio durante meses</strong>. No hay con qui&#233;n discutir las decisiones heredadas. No hay qui&#233;n recuerde por qu&#233; se tom&#243; tal decisi&#243;n t&#233;cnica o comercial. Eres t&#250; frente a un laberinto que otro construy&#243;.</p><p>---</p><h2><strong>El Framework de las 5 Dimensiones: C&#243;mo Auditar un Negocio Antes de Comprar</strong></h2><p>Basado en la evidencia de que el tiempo que te "ahorras" comprando se gasta en integraci&#243;n operativa, he desarrollado este framework para solo-operators en Espa&#241;a.</p><h3><strong>1. Auditor&#237;a de deuda operativa &#8212; Las 5 dimensiones</strong></h3><p>Antes de poner un euro, eval&#250;a cada dimensi&#243;n del negocio objetivo en una escala del 1 al 5:</p><ul><li><p><strong>C&#243;digo</strong>: &#191;Est&#225; documentado? &#191;Tiene tests? &#191;Las dependencias est&#225;n actualizadas?</p></li><li><p><strong>Clientes</strong>: &#191;Tienen expectativas razonables o requieren atenci&#243;n manual constante?</p></li><li><p><strong>Procesos</strong>: &#191;Est&#225;n documentados o viven en la cabeza del vendedor?</p></li><li><p><strong>Proveedores</strong>: &#191;Son transferibles o dependen de la relaci&#243;n personal del vendedor?</p></li><li><p><strong>SEO/Contenido</strong>: &#191;El tr&#225;fico es org&#225;nico genuino o depende de estrategias que Google ya no premia?</p></li></ul><p><strong>*Si m&#225;s de 2 dimensiones requieren reingenier&#237;a completa, construir desde cero puede tener menor coste energ&#233;tico total.</strong>*</p><h3><strong>2. El umbral de ingresos m&#237;nimos &#8212; El 'piso de ingresos' como filtro de compra</strong></h3><p>De las tesis anteriores sabemos que un solo-operator con hijos debe priorizar ventas hasta alcanzar un piso de ingresos antes de tocar c&#243;digo. Aplicado a la compra, esto significa:</p><p><strong>Si el negocio adquirido no genera ingresos suficientes desde el d&#237;a 1 para que puedas dedicar 4-6 semanas a la transici&#243;n operativa sin vender, no es comprable.</strong></p><p>Comprar un negocio que requiere tres meses de "rampa" para llegar a rentabilidad no es comprar. Es <strong>construir con hipoteca operativa</strong>. Y el riesgo es mayor porque cargas con la deuda heredada mientras intentas crecer.</p><h3><strong>3. El mapeo de migraciones t&#233;cnicas &#8212; La regla del 2.5x</strong></h3><p>Cataloga cada integraci&#243;n, API, webhook y script del negocio adquirido. Luego multiplica el tiempo estimado de migraci&#243;n por <strong>2.5x</strong>.</p><p><em>&#191;Por qu&#233; 2.5x?</em> Porque el solo-operator subestima sistem&#225;ticamente la complejidad heredada. Lo que parece un "cambio de proveedor de email" es en realidad desenredar 12 integraciones de webhook que el vendedor configur&#243; hace tres a&#241;os y que nadie ha tocado desde entonces.</p><h3><strong>4. La prueba de 'cero c&#243;digo' &#8212; 7 d&#237;as de operaci&#243;n manual</strong></h3><p>Durante el <em>due diligence</em>, opera el negocio manualmente durante 7 d&#237;as sin tocar ni una l&#237;nea de c&#243;digo.</p><ul><li><p>Si puedes sostener las operaciones sin escribir software, el negocio tiene madurez operativa.</p></li><li><p>Si al tercer d&#237;a necesitas hacer un script para algo, el negocio requiere m&#225;s construcci&#243;n de la que piensas.</p></li></ul><p>Esta prueba es brutal pero necesaria. Te obliga a experimentar la deuda operativa antes de comprarla.</p><h3><strong>5. El check de restricciones familiares &#8212; &#191;Cu&#225;ntas horas semanales requiere?</strong></h3><p>Para solo-operators con hijos, la compra solo tiene sentido si el negocio adquirido requiere <strong>menos de 10 horas semanales de mantenimiento pasados los primeros 90 d&#237;as</strong>.</p><p>&#191;Por qu&#233; 10 horas? Porque la evidencia muestra que el burnout aparece cuando construir, vender y mantener compiten por el mismo tiempo. Si el negocio comprado exige m&#225;s de 10 horas semanales de mantenimiento despu&#233;s de la integraci&#243;n, no te est&#225; comprando tiempo &#8212; te lo est&#225; robando.</p><p>---</p><h2><strong>El Trade-Off Energ&#233;tico Oculto: D&#243;nde Duele Cada Camino</strong></h2><p>Construir desde cero duele al principio. Dise&#241;o, desarrollo, validaci&#243;n, cero clientes. Es un dolor que conoces y que puedes graduar.</p><p>Comprar duele despu&#233;s. La transacci&#243;n es f&#225;cil. La integraci&#243;n es donde aparece la factura energ&#233;tica.</p><p><strong>Perfil de energ&#237;a de construir desde cero:</strong></p><ul><li><p>Mes 1-3: Alta exigencia (c&#243;digo, validaci&#243;n, dise&#241;o)</p></li><li><p>Mes 4-12: Exigencia media decreciente (mantenimiento, features)</p></li><li><p>Mes 12+: Exigencia baja (operaci&#243;n estable)</p></li></ul><p><strong>Perfil de energ&#237;a de comprar:</strong></p><ul><li><p>Mes 1: Exigencia baja-media (transacci&#243;n, transici&#243;n)</p></li><li><p>Mes 2-6: <strong>Exigencia muy alta</strong> (integraci&#243;n, documentaci&#243;n, reparaci&#243;n)</p></li><li><p>Mes 6+: Exigencia media (operaci&#243;n con deuda residual)</p></li></ul><p>Para el solo-operator con 90 minutos diarios de c&#243;digo entre siestas, el perfil de la compra es letal porque <strong>el pico de exigencia llega en el momento donde a&#250;n no conoces bien el negocio</strong>. Cuando construyes, escalas la exigencia gradualmente. Cuando compras, te tiran a la piscina operativa el d&#237;a 1.</p><p>---</p><h2><strong>El Factor de Aislamiento Cognitivo: El Coste de No Saber por Qu&#233;</strong></h2><p>Cuando construyes desde cero, conoces cada decisi&#243;n t&#233;cnica y comercial porque las tomaste t&#250;. <strong>No necesitas documentar lo que sabes.</strong></p><p>Cuando compras, pasas meses descubriendo decisiones que otro tom&#243;. Y cada descubrimiento puede requerir una correcci&#243;n.</p><p><strong>*Este "descubrimiento diferido" es particularmente costoso para el solo-operator porque no hay con qui&#233;n discutir las decisiones heredadas ni qui&#233;n recuerde por qu&#233; se tomaron.</strong>*</p><p>El vendedor, una vez cobrado, desaparece. Y t&#250; te quedas con un sistema del que entiendes la superficie pero no las entra&#241;as.</p><p>---</p><h2><strong>Una Implicaci&#243;n Pr&#225;ctica para el Mercado Espa&#241;ol</strong></h2><p>En el ecosistema de compraventa de negocios online en Espa&#241;a &#8212; adquisiciones de sites, newsletters, e-commerces peque&#241;os, gestor&#237;as digitalizadas &#8212; hay un patr&#243;n que se repite:</p><p><strong>La mayor&#237;a de los vendedores ponen en venta precisamente porque han acumulado demasiada deuda operativa y t&#233;cnica.</strong></p><p>El negocio no est&#225; "maduro para la venta". Est&#225; <strong>agotando al fundador</strong>. El comprador optimista asume que "solo necesita limpiar un poco". La realidad, extrapolando de la evidencia t&#233;cnica sobre integraciones complejas, es que la complejidad oculta siempre supera la estimaci&#243;n inicial.</p><p>El negocio que ves en venta no es una oportunidad. Es un problema que alguien m&#225;s decidi&#243; dejar.</p><p>---</p><h2><strong>Cu&#225;ndo S&#237; Tiene Sentido Comprar (Y C&#243;mo Hacerlo Bien)</strong></h2><p>No todo es negativo. Comprar tiene sentido cuando:</p><ul><li><p><strong>El vendedor ha documentado todo</strong> &#8212; Procesos, c&#243;digo, relaciones, decisiones. Si no hay documentaci&#243;n, no hay compra.</p></li><li><p><strong>El negocio supera la prueba de 'cero c&#243;digo'</strong> &#8212; Puedes operarlo manualmente 7 d&#237;as sin tocar una l&#237;nea.</p></li><li><p><strong>El piso de ingresos cubre tu necesidad desde el d&#237;a 1</strong> &#8212; No necesitas 3 meses de rampa para llegar a rentabilidad.</p></li><li><p><strong>La deuda operativa es baja en al menos 4 de las 5 dimensiones</strong> &#8212; Si necesitas reingenier&#237;a en m&#225;s de 2 dimensiones, construye desde cero.</p></li></ul><p><strong>La compra inteligente no es comprar barato. Es comprar documentado.</strong></p><p>---</p><h2><strong>La Decisi&#243;n No Es Build vs Buy. Es Deuda Operativa vs Deuda de Construcci&#243;n.</strong></h2><p>El debate build vs buy para el solo-operator en Espa&#241;a no se resuelve con hojas de c&#225;lculo de costes. Se resuelve con una pregunta m&#225;s honesta:</p><p><strong>*&#191;Qu&#233; tipo de deuda est&#225;s dispuesto a pagar con tu energ&#237;a disponible?</strong>*</p><p>Construir desde cero te endeuda en tiempo de desarrollo y validaci&#243;n. Comprar te endeuda en tiempo de integraci&#243;n y descubrimiento diferido. Para un operador que trabaja solo, con hijos, y con ventanas de c&#243;digo de 90 minutos, la deuda de construcci&#243;n suele ser m&#225;s manejable que la deuda operativa &#8212; porque la conoces, la controlas, y puedes graduarla.</p><p>Compra negocios. Pero no compres el problema de otro como si fuera una oportunidad.</p><p>La pr&#243;xima vez que veas un negocio en venta con "50 clientes y ingresos recurrentes", preg&#250;ntate no cu&#225;nto vale. Preg&#250;ntate <strong>*cu&#225;nto tiempo de tu vida vas a pasar desenredando lo que otro no quiso limpiar.</strong>*</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/comprar-negocio-online-vs-construir-desde-cero-solo-operator-20260602?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El Agente de Content QA Que No Lee: Por Qué la Gramática Es La Última Dimensión Que Debes Puntuar]]></title><description><![CDATA[Agente IA que audita contenido publicado: descubre las 7 dimensiones reales que punt&#250;a un Content QA agent. Gram&#225;tica es la menos importante. Framework en espa&#241;ol.]]></description><link>https://newsletter.brianmenagomez.com/p/el-agente-de-content-qa-que-no-lee</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-agente-de-content-qa-que-no-lee</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Mon, 01 Jun 2026 07:00:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3baa273a-acb2-4fea-a113-c99877506357_1080x608.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Tu Agente de Content QA No Est&#225; Auditando Nada. Solo Est&#225; Corrigiendo Comas.</strong></h2><p>Crees que un agente de calidad de contenido es un corrector ortogr&#225;fico con esteroides. Que le pasas un art&#237;culo, te devuelve los errores de gram&#225;tica, detecta si hay plagio, y listo. Contenido auditado.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>Llevo auditando contenido publicado desde que lanc&#233; <strong>conversoriaecnae.es</strong> y <strong>gestoriascercademi.com</strong>. M&#225;s de 4.800 p&#225;ginas indexadas entre ambos proyectos. Y te digo lo que he aprendido: la gram&#225;tica es la dimensi&#243;n <strong>menos importante</strong> que punt&#250;a un agente de Content QA.</p><p>El problema no es que tu contenido tenga faltas de ortograf&#237;a. El problema es que <strong>no convierte, no posiciona y no retiene</strong> &#8212; y tu revisor de Grammarly no te va a avisar de eso.</p><p>En 2026, con los LLMs actuales &#8212; Opus 4.5, Gemini 3.1 Pro, los modelos de Anthropic &#8212; construir un agente que punt&#250;a contenido es trivial. Lo dif&#237;cil es saber <strong>qu&#233;</strong> puntuar y <strong>por qu&#233;</strong> cada dimensi&#243;n importa.</p><p>Vamos a construir el framework que uso en producci&#243;n.</p><p>---</p><h2><strong>Las 7 Dimensiones Que Un Content QA Agent Debe Puntuar (Y Por Qu&#233; Este Orden)</strong></h2><p>La mayor&#237;a de equipos implementan un agente de Content QA que revisa:</p><p>&#10060; <strong>Gram&#225;tica y ortograf&#237;a</strong> &#8212; primero</p><p>&#10060; <strong>Legibilidad</strong> &#8212; despu&#233;s</p><p>&#10060; <strong>Longitud</strong> &#8212; al final</p><p>Ese agente no sirve para nada. Literalmente. Te va a decir que un texto est&#225; bien escrito cuando est&#225; matando tu conversi&#243;n.</p><p>El orden correcto de las dimensiones, de m&#225;s importante a menos:</p><h3><strong>1. Claridad de Prop&#243;sito &#8212; La Dimensi&#243;n Que Mata el Rebote</strong></h3><p>Tu agente debe responder primero: <strong>&#191;sabe el lector qu&#233; va a obtener en los primeros 10 segundos?</strong></p><p>Si un usuario llega a tu p&#225;gina y no entiende en 5 segundos si eso responde a su problema, se va. No lee el art&#237;culo. No convierte.</p><p>&#9989; <strong>C&#243;mo lo puntuamos:</strong> El agente analiza el primer p&#225;rrafo y el H1. Si no contienen expl&#237;citamente el problema que resuelve el contenido, la puntuaci&#243;n de claridad es 0.</p><p>En producci&#243;n, usamos un prompt que eval&#250;a: "&#191;Un usuario que busca X soluci&#243;n encontrar&#237;a esto en los primeros 10 segundos?" El LLM devuelve un score de 0 a 10.</p><h3><strong>2. Alineamiento con Intenci&#243;n de B&#250;squeda &#8212; Donde Muere el SEO Real</strong></h3><p>Puedes tener el texto mejor escrito del mundo. Si no responde a lo que el usuario busc&#243;, <strong>no existe</strong>.</p><p>Google ya no rankea palabras clave. Rankea <strong>respuestas a intenciones</strong>. Tu agente debe cruzar el contenido contra las SERPs reales y puntuar si el texto cubre las sub-intenciones que aparecen en los primeros resultados.</p><p>&#9989; <strong>C&#243;mo lo puntuamos:</strong> El agente extrae las 3-5 preguntas relacionadas que aparecen en "People also ask" de Google y verifica si el contenido las responde expl&#237;citamente.</p><p>```python</p><p>def puntua_intencion(content, serp_questions):</p><p>prompt = f"""</p><p>Contenido: {content[:2000]}</p><p>Preguntas relacionadas en Google:</p><p>{serp_questions}</p><p>Punt&#250;a del 0 al 10 cu&#225;ntas de estas preguntas</p><p>responde el contenido de forma expl&#237;cita y directa.</p><p>Devuelve solo el n&#250;mero.</p><p>"""</p><p>response = llm.invoke(prompt)</p><p>return int(response.strip())</p><p>```</p><p>Si el score es menor de 7, el agente rechaza el contenido. No importa lo bien escrito que est&#233;.</p><h3><strong>3. Estructura de Argumentaci&#243;n &#8212; El Esqueleto Que Retiene</strong></h3><p>El 80% de los contenidos que auditamos tienen una estructura d&#233;bil. Van de idea en idea sin jerarqu&#237;a.</p><p>Tu agente debe identificar si el contenido sigue una estructura l&#243;gica: problema &#8594; evidencia &#8594; soluci&#243;n &#8594; acci&#243;n. Si salta entre ideas sin conector, la dimensi&#243;n de estructura falla.</p><p>&#9989; <strong>C&#243;mo lo puntuamos:</strong> El agente identifica si hay transiciones entre secciones, si cada H2 se sostiene con datos, y si hay una conclusi&#243;n que resume y empuja a acci&#243;n.</p><h3><strong>4. Densidad de Evidencia &#8212; La Dimensi&#243;n Que Construye Autoridad</strong></h3><p>Un p&#225;rrafo sin n&#250;meros, sin fuentes, sin ejemplos concretos, es ruido.</p><p>Tu agente debe contar cu&#225;ntas afirmaciones respaldadas hay por cada 500 palabras. Si la densidad es menor de 2 evidencias por cada 500 palabras, el contenido es d&#233;bil.</p><p>&#9989; <strong>C&#243;mo lo puntuamos:</strong> El agente busca: cifras, nombres de herramientas, estudios citados, casos reales, capturas de pantalla mencionadas. Si no hay al menos 3 evidencias en un art&#237;culo de 1.000 palabras, se marca como "necesita revisi&#243;n".</p><h3><strong>5. Accionabilidad &#8212; La Dimensi&#243;n Que Convierte</strong></h3><p>El contenido m&#225;s valioso del mundo no sirve si el lector termina y no sabe qu&#233; hacer.</p><p>Tu agente debe detectar si hay al menos una <strong>llamada a la acci&#243;n expl&#237;cita</strong> (no un "cont&#225;ctanos" gen&#233;rico). Un paso concreto que el lector pueda ejecutar en los pr&#243;ximos 5 minutos.</p><p>&#9989; <strong>C&#243;mo lo puntuamos:</strong> El agente busca verbos en imperativo ("descarga", "implementa", "configura", "abre", "crea") seguidos de un objeto tangible. Si no hay al menos 2 llamadas a la acci&#243;n espec&#237;ficas, la puntuaci&#243;n de accionabilidad es 0.</p><h3><strong>6. Legibilidad &#8212; La Que Todo el Mundo Mide (Pero Mal)</strong></h3><p>Aqu&#237; s&#237; entra la legibilidad tradicional. Pero ojo: no es longitud de frase. Es <strong>carga cognitiva</strong>.</p><p>Tu agente debe puntuar si el contenido es entendible por alguien con nivel de lectura de 12-14 a&#241;os. No es "escribir para tontos". Es <strong>no perder al 80% de tu audiencia</strong> porque usas palabras que nadie usa.</p><p>&#9989; <strong>C&#243;mo lo puntuamos:</strong> Usamos la f&#243;rmula de legibilidad de Fern&#225;ndez-Huerta (adaptaci&#243;n espa&#241;ola de Flesch). Pero a&#241;adimos un matiz: el agente detecta si hay <strong>jerga innecesaria</strong>. Si usas t&#233;rminos t&#233;cnicos que no se explican, baja la puntuaci&#243;n.</p><h3><strong>7. Gram&#225;tica y Ortograf&#237;a &#8212; La &#218;ltima Dimensi&#243;n y la Menos Importante</strong></h3><p>Aqu&#237; est&#225; la clave que la mayor&#237;a no entiende.</p><p>Un contenido con faltas de ortograf&#237;a pero con las 6 dimensiones anteriores bien puntuadas <strong>funciona mejor</strong> que un contenido impecable gramaticalmente pero sin estructura, sin evidencia y sin intenci&#243;n de b&#250;squeda.</p><p>No digo que publiques con faltas. Digo que <strong>no es el bottleneck</strong>.</p><p>&#9989; <strong>C&#243;mo lo puntuamos:</strong> Correcci&#243;n ortogr&#225;fica est&#225;ndar. Pero el peso de esta dimensi&#243;n en la puntuaci&#243;n total es del 5%. Literalmente. Las otras 6 dimensiones suman el 95%.</p><p>---</p><h2><strong>El Framework de las 7 Dimensiones de Content QA &#8212; C&#243;mo Implementarlo</strong></h2><p>He llamado a esto <strong>El Framework de las 7 Dimensiones de Content QA</strong>. No es teor&#237;a. Es el sistema que ejecuto en cada deploy de contenido nuevo.</p><h3><strong>Paso 1: Configura el Pipeline de Auditor&#237;a</strong></h3><p>Usa una Edge Function en Vercel o un cron job en Railway. Cada vez que publiques contenido nuevo &#8212; o cada 30 d&#237;as para contenido existente &#8212; el pipeline se ejecuta.</p><p>```javascript</p><p>// Edge Function schedule o webhook trigger</p><p>export default async function handler(req) {</p><p>const content = await getPageContent(req.body.url)</p><p>const dimensions = {</p><p>claridad: await scoreClaridad(content),</p><p>intencion: await scoreIntencion(content),</p><p>estructura: await scoreEstructura(content),</p><p>evidencia: await scoreEvidencia(content),</p><p>accionabilidad: await scoreAccionabilidad(content),</p><p>legibilidad: await scoreLegibilidad(content),</p><p>gramatica: await scoreGramatica(content)</p><p>}</p><p>const totalScore = calculateWeighted(dimensions)</p><p>if (totalScore &lt; 7) {</p><p>await notifySlack(`Contenido necesita revisi&#243;n: ${req.body.url}`)</p><p>await queueForRevision(req.body.url, dimensions)</p><p>}</p><p>return { status: 'ok', score: totalScore }</p><p>}</p><p>```</p><h3><strong>Paso 2: Define los Pesos</strong></h3><p>| Dimensi&#243;n | Peso |</p><p>|---|---|</p><p>| Claridad de prop&#243;sito | 20% |</p><p>| Alineamiento con intenci&#243;n | 20% |</p><p>| Estructura de argumentaci&#243;n | 15% |</p><p>| Densidad de evidencia | 15% |</p><p>| Accionabilidad | 15% |</p><p>| Legibilidad | 10% |</p><p>| Gram&#225;tica y ortograf&#237;a | 5% |</p><h3><strong>Paso 3: Crea un Sistema de Alertas</strong></h3><p>No basta con puntuar. Necesitas acci&#243;n.</p><p>Configura tu agente para que cuando una dimensi&#243;n baje de 5, dispare una alerta a tu equipo de contenido o a tu webhook de revisi&#243;n.</p><p>En <strong>gestoriascercademi.com</strong> tengo esto configurado contra un canal de Slack. Cada semana recibo un resumen de qu&#233; p&#225;ginas necesitan revisi&#243;n y por qu&#233; dimensi&#243;n est&#225;n fallando.</p><h3><strong>Paso 4: Revisiones Autom&#225;ticas + Humanas</strong></h3><p>El agente punt&#250;a. El humano decide.</p><p>No dejes que el agente publique contenido autom&#225;ticamente. Que genere un reporte, y que un editor valide antes de aprobar. El agente es el primer filtro, no el decisor final.</p><p>---</p><h2><strong>Lo Que He Aprendido Auditando 4.800+ P&#225;ginas</strong></h2><p>Los n&#250;meros no mienten.</p><p>De las 4.800+ p&#225;ginas indexadas entre <strong>conversoriaecnae.es</strong> y <strong>gestoriascercademi.com</strong>, el 73% de los contenidos que fallaban en las primeras 3 dimensiones (claridad, intenci&#243;n, estructura) ten&#237;an una tasa de rebote superior al 70% &#8212; independientemente de su calidad gramatical.</p><p>El patr&#243;n se repite siempre: contenidos perfectamente escritos que nadie lee porque no responden a lo que el usuario buscaba.</p><p>El Content QA agent real no es un corrector. <strong>Es un guardi&#225;n de intenci&#243;n.</strong></p><p>---</p><h2><strong>Resumen y Pr&#243;ximo Paso</strong></h2><ul><li><p>Las 7 dimensiones reales son: claridad, intenci&#243;n, estructura, evidencia, accionabilidad, legibilidad, gram&#225;tica</p></li><li><p>La gram&#225;tica pesa solo el 5% en la puntuaci&#243;n total</p></li><li><p>Implementa un pipeline que ejecute auditor&#237;as cada 30 d&#237;as</p></li><li><p>No automatices la publicaci&#243;n &#8212; el agente punt&#250;a, el humano decide</p></li><li><p>Mide rebote vs puntuaci&#243;n, no solo correcci&#243;n gramatical</p></li></ul><p>El pr&#243;ximo paso que voy a compartir es c&#243;mo construir el <strong>agente que no solo punt&#250;a contenido, sino que lo reescribe autom&#225;ticamente</strong> respetando las 7 dimensiones. Ese es el salto de auditor a editor.</p><p>Pero eso es para otro art&#237;culo.</p><p>Por ahora, ve y revisa tu &#250;ltimo contenido publicado. P&#225;salo por las 7 dimensiones. Si solo miraste la gram&#225;tica, <strong>no has auditado nada</strong>.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/agente-content-qa-dimensiones-puntuacion-20260601?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Supabase vs Firebase 2026: Deja de Llamarlo "Firebase para PostgreSQL" — Es una Trampa para Frontend Developers]]></title><description><![CDATA[Supabase vs Firebase 2026: an&#225;lisis real con RLS policies, replication slots, Edge Functions en Deno y el coste oculto de PostgreSQL. Para frontend developers que necesitan decidir.]]></description><link>https://newsletter.brianmenagomez.com/p/supabase-vs-firebase-2026-deja-de</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/supabase-vs-firebase-2026-deja-de</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Mon, 01 Jun 2026 07:00:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/32b1e574-a71e-480d-9ac1-1139ce2d62b6_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Supabase vs Firebase 2026: Deja de Llamarlo "Firebase para PostgreSQL" &#8212; Es una Trampa para Frontend Developers</h2><p><strong>Tesis:</strong> Supabase no es una alternativa m&#225;s f&#225;cil a Firebase. Es PostgreSQL expuesto como servicio &#8212; y la complejidad arquitect&#243;nica que exige (RLS policies, replication slots, migraciones, Deno) la paga el desarrollador que cre&#237;a estar comprando simplicidad.</p><p>---</p><h2><strong>"Firebase para PostgreSQL"? No. Es PostgreSQL para Gente que Quer&#237;a Firebase</strong></h2><p>La creencia popular: "Supabase es Firebase pero open source. M&#225;s f&#225;cil, m&#225;s barato, para frontend developers que no quieren escribir backend."</p><p><strong>*La realidad: Supabase es m&#225;s dif&#237;cil que Firebase para el desarrollador frontend t&#237;pico.</strong> *</p><p>Firebase abstrae la base de datos por completo &#8212; NoSQL, sin esquema, sin migraciones. Escribe un JSON, define unas reglas de seguridad en otro JSON, y ya est&#225;. La base de datos se convierte en una caja negra que responde a tus peticiones sin que tengas que preocuparte por &#237;ndices, planes de ejecuci&#243;n ni esquemas. Firebase Realtime Database y Firestore est&#225;n dise&#241;ados espec&#237;ficamente para que alguien con conocimientos b&#225;sicos de JavaScript pueda construir una app funcional en cuesti&#243;n de horas.</p><p>Supabase te obliga a enfrentarte a PostgreSQL directamente:</p><ul><li><p>Schemas con tipos de datos estrictos</p></li><li><p>Migraciones SQL</p></li><li><p>Pol&#237;ticas RLS escritas en PostgreSQL puro</p></li><li><p>Connection pooling</p></li><li><p>Replication slots del WAL</p></li><li><p>Y SQL. Mucho SQL.</p></li></ul><p>No est&#225;s escapando de la complejidad del backend. <strong>*Est&#225;s cambiando la caja negra de Firebase por la caja de cristal de PostgreSQL.</strong> *</p><p>Y la mayor&#237;a no est&#225; lista para lo que ve dentro.</p><p>La paradoja es que la transparencia de Supabase resulta ser su mayor desventaja para el perfil equivocado. Firebase te protege activamente de ti mismo: no puedes escribir una query ineficiente porque no tienes control sobre c&#243;mo se ejecuta. Supabase te da el poder de optimizar, pero tambi&#233;n el poder de hundirte. Y cuando tu `SELECT` con una RLS policy mal escrita tarda 30 segundos, no puedes culpar a nadie m&#225;s que a ti mismo.</p><p>---</p><h2><strong>&#10060; Lo que Crees que Compras vs &#9989; Lo que Realmente Obtienes</strong></h2><h3><strong>&#10060; Creencia: "Supabase es m&#225;s f&#225;cil que Firebase"</strong></h3><p>Firebase te da security rules en JSON. Mira este ejemplo para "usuarios solo ven sus propios todos":</p><p>```json</p><p>{</p><p>"rules": {</p><p>"todos": {</p><p>"$uid": {</p><p>".read": "$uid === auth.uid",</p><p>".write": "$uid === auth.uid"</p><p>}</p><p>}</p><p>}</p><p>}</p><p>```</p><p>Es configuraci&#243;n. No es c&#243;digo. No necesitas saber c&#243;mo funciona la base de datos internamente. El motor de Firebase interpreta esas reglas y las aplica en el punto de acceso, no en el motor de almacenamiento. No hay riesgo de que una regla mal escrita degrade el rendimiento de todo el sistema. Es declarativo, predecible y seguro por dise&#241;o.</p><h3><strong>&#9989; Realidad: Supabase te obliga a escribir SQL que se ejecuta dentro de la base de datos</strong></h3><p>El mismo caso en Supabase usando RLS:</p><p>```sql</p><p>CREATE POLICY "Users can only see their own todos"</p><p>ON todos</p><p>FOR SELECT</p><p>USING (auth.uid() = user_id);</p><p>CREATE POLICY "Users can only insert their own todos"</p><p>ON todos</p><p>FOR INSERT</p><p>WITH CHECK (auth.uid() = user_id);</p><p>CREATE POLICY "Users can only update their own todos"</p><p>ON todos</p><p>FOR UPDATE</p><p>USING (auth.uid() = user_id)</p><p>WITH CHECK (auth.uid() = user_id);</p><p>CREATE POLICY "Users can only delete their own todos"</p><p>ON todos</p><p>FOR DELETE</p><p>USING (auth.uid() = user_id);</p><p>```</p><p>Eso no es configuraci&#243;n. <strong>*Es c&#243;digo imperativo que corre dentro del motor de la base de datos.</strong> *</p><p>Cada SELECT en `todos` ejecuta esa pol&#237;tica. Si tu pol&#237;tica hace un JOIN contra otra tabla y el query planner decide hacer un sequential scan, <strong>*cada consulta a la tabla se ralentiza</strong>*. En una tabla con 50.000 filas, una RLS policy inocente que haga `SELECT EXISTS (SELECT 1 FROM teams WHERE team_id = todos.team_id AND user_id = auth.uid())` puede convertir una consulta de milisegundos en una operaci&#243;n de segundos.</p><p>En Firebase, las security rules son declarativas y se eval&#250;an antes de tocar los datos. En Supabase, est&#225;s escribiendo l&#243;gica que se inyecta en cada fila que PostgreSQL procesa. Y si no sabes c&#243;mo funciona `EXPLAIN ANALYZE`, est&#225;s volando a ciegas.</p><p>---</p><h2><strong>La Trampa de las RLS Policies: Est&#225;s Escribiendo C&#243;digo en la Base de Datos</strong></h2><p>La documentaci&#243;n de Supabase te dice: "Habilita RLS en cada tabla". Y es cierto. Pero lo que no te dicen es esto:</p><p>&gt; <strong>*Escribir una RLS policy no es como escribir middleware en Express. Es escribir una funci&#243;n que PostgreSQL ejecuta en cada fila de cada query.</strong> *</p><p>Si haces:</p><p>```sql</p><p>SELECT * FROM todos;</p><p>```</p><p>Y tu tabla tiene 100.000 filas, PostgreSQL ejecuta tu RLS policy 100.000 veces. Si esa pol&#237;tica tiene un subquery contra otra tabla, cada ejecuci&#243;n puede ser otro scan secuencial. El resultado: una consulta que deber&#237;a tardar 10 milisegundos se convierte en una operaci&#243;n de 10 segundos.</p><p>El desarrollador que viene de Firebase piensa en reglas. El desarrollador que sobrevive en Supabase piensa en planes de ejecuci&#243;n, &#237;ndices, y `EXPLAIN ANALYZE`. Y no solo eso: necesita entender c&#243;mo optimizar subqueries, cu&#225;ndo usar JOINs en lugar de subqueries, y c&#243;mo los &#237;ndices compuestos pueden salvar una RLS policy.</p><h3><strong>El gap de skills que nadie menciona</strong></h3><p>Firebase te protege de la base de datos. Supabase te expone a ella.</p><p>Y eso significa que necesitas saber:</p><ul><li><p>C&#243;mo dise&#241;ar un schema con foreign keys, tipos de datos e &#237;ndices</p></li><li><p>C&#243;mo escribir migraciones SQL que no rompan producci&#243;n</p></li><li><p>C&#243;mo funciona el query planner de PostgreSQL</p></li><li><p>Qu&#233; son los replication slots y por qu&#233; pueden llenar tu disco</p></li><li><p>C&#243;mo funciona la autenticaci&#243;n separada de la autorizaci&#243;n (auth vs RLS)</p></li><li><p>C&#243;mo hacer profiling de queries con `EXPLAIN (ANALYZE, BUFFERS)`</p></li><li><p>C&#243;mo gestionar la concurrencia y los locks a nivel de fila</p></li></ul><p><strong>*&#191;Tu equipo tiene a alguien que sepa PostgreSQL? Si no, est&#225;s acumulando deuda t&#233;cnica operativa.</strong> *</p><p>Y la deuda no es te&#243;rica. En producci&#243;n, una RLS policy mal optimizada no solo ralentiza una consulta: puede provocar timeouts en cascada, agotar el pool de conexiones y degradar el rendimiento de toda la aplicaci&#243;n, incluyendo la autenticaci&#243;n y el tiempo real.</p><p>---</p><h2><strong>Realtime: La Espada de Doble Filo del WAL</strong></h2><p>La funcionalidad de tiempo real de Supabase usa la replicaci&#243;n l&#243;gica nativa de PostgreSQL. Los cambios se transmiten a trav&#233;s del WAL (Write-Ahead Log). Cuando haces un INSERT, UPDATE o DELETE, PostgreSQL escribe el cambio en el WAL, y un slot de replicaci&#243;n lo captura y lo env&#237;a a los clientes suscritos.</p><p>Esto es elegante. Es "verdadero" tiempo real, no polling. No hay intervalos fijos ni latencia arbitraria. El cambio se propaga en milisegundos.</p><p>Pero tambi&#233;n es fr&#225;gil.</p><p>Si un consumidor de replicaci&#243;n no consume los cambios a tiempo &#8212; por ejemplo, porque un cliente se desconecta o porque el proceso de replicaci&#243;n se queda atascado &#8212; el WAL crece indefinidamente. Ocupa espacio en disco. Y si llena el disco, la base de datos se cae. No es un escenario te&#243;rico: es una de las causas m&#225;s comunes de ca&#237;das en PostgreSQL autogestionado.</p><p>Firebase Realtime Database no tiene este problema porque es un sistema separado &#8212; no comparte recursos con tu base de datos. Firestore y Realtime Database tienen sus propios mecanismos de escalado y gesti&#243;n de recursos, independientes del almacenamiento principal.</p><p><strong>Supabase</strong>: un solo PostgreSQL maneja auth, datos, almacenamiento y replicaci&#243;n.</p><p><strong>Firebase</strong>: auth, Firestore, Realtime Database y Storage son servicios independientes.</p><p><strong>*En Supabase, una query lenta en analytics puede degradar tu autenticaci&#243;n.</strong> *</p><p>Comparten el mismo pool de conexiones, la misma CPU, la misma memoria y el mismo disco. Si una Edge Function hace una consulta pesada que bloquea una tabla, el login de un usuario puede quedarse esperando. En Firebase, auth corre sobre infraestructura de Google separada de Firestore. Son mundos distintos.</p><p>---</p><h2><strong>Edge Functions: Deno, No Node.js &#8212; Prep&#225;rate para Reescribir</strong></h2><p>Supabase eligi&#243; Deno para sus Edge Functions. No Node.js.</p><p>Deno es m&#225;s seguro (sandboxed, sin npm supply chain) y arranca m&#225;s r&#225;pido (cold starts menores). Pero significa que <strong>*tu ecosistema npm no funciona.</strong> *</p><p>Express, Mongoose, Axios &#8212; no existen en Deno. Y aunque Deno tiene compatibilidad parcial con npm a trav&#233;s de `npm:` specifiers, no es perfecta. Muchas librer&#237;as dependen de APIs de Node.js que Deno no implementa al 100%, como `crypto` en ciertas configuraciones, `stream` en modo legacy, o `child_process` que simplemente no existe en el sandbox de Deno.</p><p>Aqu&#237; tienes un webhook en Supabase Edge Function:</p><p>```typescript</p><p>import { serve } from "https://deno.land/std@0.177.0/http/server.ts";</p><p>serve(async (req) =&gt; {</p><p>const { name } = await req.json();</p><p>const data = {</p><p>message: `Hello ${name}!`,</p><p>};</p><p>return new Response(JSON.stringify(data), {</p><p>headers: { "Content-Type": "application/json" },</p><p>});</p><p>});</p><p>```</p><p>F&#237;jate en el import: es una URL, no un paquete de npm. No hay `package.json`. No hay `node_modules`. Usas `import maps` para gestionar dependencias.</p><p>Si tu backend depende de librer&#237;as npm, tienes dos opciones:</p><p>1. <strong>Reescribirlas para Deno</strong> &#8212; coste oculto de migraci&#243;n que nadie calcula al empezar el proyecto</p><p>2. <strong>Ejecutarlas como servicio separado</strong> &#8212; defeats el prop&#243;sito de Edge Functions, porque introduces latencia de red entre servicios</p><p><strong>*La mayor&#237;a descubre esto despu&#233;s de haber commitado a Supabase.</strong> *</p><p>Y luego vienen los problemas de compatibilidad. Quieres usar una librer&#237;a de OpenAI para streaming de respuestas? OpenAI no tiene SDK oficial para Deno. Necesitas usar el cliente HTTP directamente o buscar un wrapper de la comunidad. Quieres conectar con Stripe? Lo mismo. El ecosistema de Deno es m&#225;s peque&#241;o, y aunque crece cada a&#241;o, sigue muy lejos de la madurez de npm.</p><p>Si tu stack incluye herramientas como Prisma, Mongoose, o cualquier ORM que dependa de APIs nativas de Node.js, olv&#237;date de ejecutarlas en Edge Functions. Tendr&#225;s que mantener un servicio Node.js aparte &#8212; con su propio deploy, su propia escala y su propio coste operativo.</p><p>---</p><h2><strong>El Marco de las 5 Decisiones para Supabase vs Firebase 2026</strong></h2><p>No se trata de cu&#225;l es "mejor". Se trata de <strong>*para qui&#233;n</strong>* y <strong>*para qu&#233;</strong>*.</p><p>Aqu&#237; tienes el marco para decidir:</p><h3><strong>1. &#191;Tu equipo sabe PostgreSQL?</strong></h3><ul><li><p><strong>S&#237;</strong> &#8594; Supabase te da control total. Puedes optimizar queries, dise&#241;ar schemas complejos y escalar con confianza. Tu equipo puede sacar partido de las features avanzadas de PostgreSQL: CTEs recursivos, funciones ventana, &#237;ndices parciales, particionado de tablas.</p></li><li><p><strong>No</strong> &#8594; Firebase. La complejidad arquitect&#243;nica de Supabase te va a costar tiempo, bugs y dolores de cabeza. No aprender PostgreSQL sobre la marcha mientras tu app est&#225; en producci&#243;n.</p></li></ul><h3><strong>2. &#191;Tu app necesita tiempo real?</strong></h3><ul><li><p><strong>S&#237;</strong> &#8594; Ambos lo hacen bien. Pero Supabase requiere que entiendas replication slots y monitorees el WAL. Firebase es plug-and-play: enciendes la funcionalidad y funciona.</p></li><li><p><strong>No</strong> &#8594; El tiempo real no deber&#237;a ser el factor decisivo. Si solo necesitas polling cada 30 segundos, no necesitas ni Supabase ni Firebase Realtime.</p></li></ul><h3><strong>3. &#191;Escalas horizontalmente o verticalmente?</strong></h3><ul><li><p><strong>Vertical</strong> &#8594; Supabase escala PostgreSQL hacia arriba. L&#237;mite de conexiones, tama&#241;o de instancia, r&#233;plicas de lectura. Es escalado tradicional de base de datos relacional.</p></li><li><p><strong>Horizontal</strong> &#8594; Firebase escala horizontalmente por defecto. Firestore y Realtime Database est&#225;n dise&#241;ados para sharding autom&#225;tico. No piensas en servidores, piensas en documentos y colecciones.</p></li></ul><h3><strong>4. &#191;Tienes un DBA o DevOps en el equipo?</strong></h3><ul><li><p><strong>S&#237;</strong> &#8594; Supabase. Tu DBA puede exprimir PostgreSQL como nadie: tuning de par&#225;metros, monitoreo de &#237;ndices, gesti&#243;n de vac&#237;o, WAL archiving.</p></li><li><p><strong>No</strong> &#8594; Firebase. La gesti&#243;n operativa de PostgreSQL &#8212; WAL monitoring, connection pooling, &#237;ndices, vacuum &#8212; recae en tu equipo. Y si nadie sabe hacerlo, est&#225;s en problemas.</p></li></ul><h3><strong>5. &#191;Est&#225;s construyendo un MVP o un producto a largo plazo?</strong></h3><ul><li><p><strong>MVP</strong> &#8594; Cualquiera vale. Pero si eliges Supabase, invierte tiempo desde el d&#237;a 1 en schema design, RLS y migraciones. No pienses "lo arreglo despu&#233;s", porque PostgreSQL no perdona el mal dise&#241;o inicial.</p></li><li><p><strong>Largo plazo</strong> &#8594; La deuda t&#233;cnica de un mal schema en PostgreSQL es m&#225;s cara que la de Firebase. Firebase te permite iterar r&#225;pido y refactorizar sobre la marcha gracias a su naturaleza sin esquema. En PostgreSQL, cambiar un tipo de columna con 2 millones de filas requiere una migraci&#243;n planificada, tiempo de inactividad potencial y pruebas exhaustivas.</p></li></ul><p>---</p><h2><strong>La Verdad Inc&#243;moda: Supabase No es para Frontend Developers</strong></h2><p>Firebase fue dise&#241;ado para frontend developers que no quieren saber de bases de datos. Cada uno de sus servicios &#8212; Auth, Firestore, Storage, Functions &#8212; es independiente, est&#225; gestionado por separado y se escala de forma aut&#243;noma. Puedes construir una app completa sin escribir una sola l&#237;nea de c&#243;digo backend tradicional.</p><p>Supabase fue dise&#241;ado para equipos que ya conocen PostgreSQL y quieren un managed service con features modernas: autenticaci&#243;n integrada, almacenamiento, tiempo real sobre el WAL, y Edge Functions en Deno. No es un producto para "no-developers". Es un producto para desarrolladores que ya saben lo que hacen y quieren delegar la gesti&#243;n del servidor, pero no la complejidad de la base de datos.</p><p>Si eres frontend y eliges Supabase porque "es m&#225;s barato" o "es open source", <strong>*est&#225;s asumiendo una carga cognitiva que no hab&#237;as presupuestado.</strong> *</p><p>No es que Supabase sea malo. Es que <strong>*no es lo que parece.</strong> *</p><p>La pr&#243;xima vez que alguien diga "Supabase es Firebase para PostgreSQL", recuerda: Firebase te protege de ti mismo. Supabase te da el poder de hacerlo bien... o de hacerlo espectacularmente mal.</p><p>&gt; <strong>Supabase no es "Firebase para PostgreSQL". Es PostgreSQL para gente que pensaba que quer&#237;a Firebase &#8212; y la mayor&#237;a no est&#225; preparada para lo que firm&#243;.</strong></p><p>---</p><h2><strong>Resumen: Lo que te Llevas</strong></h2><p>1. <strong>RLS no es opcional</strong> &#8212; y no es como Firebase Security Rules. Es SQL que corre en cada fila. Si no sabes PostgreSQL, tus queries van a doler. Aprende `EXPLAIN ANALYZE` antes de escribir tu primera pol&#237;tica.</p><p>2. <strong>Realtime usa el WAL de PostgreSQL</strong> &#8212; elegante pero fr&#225;gil. Sin monitoreo, los replication slots llenan el disco y la base de datos se cae. Configura alertas de uso de disco desde el d&#237;a 1.</p><p>3. <strong>Edge Functions corren en Deno</strong> &#8212; olv&#237;date de npm. Prep&#225;rate para reescribir librer&#237;as o mantener servicios separados. Eval&#250;a si tus dependencias cr&#237;ticas tienen soporte para Deno antes de comprometerte.</p><p>4. <strong>El schema lo es todo</strong> &#8212; en Firebase puedes improvisar. En Supabase, tu schema define tu arquitectura. Dise&#241;a antes de codificar. Una foreign key mal puesta te perseguir&#225; durante a&#241;os.</p><p>5. <strong>Auth y autorizaci&#243;n son dos pasos separados</strong> &#8212; `supabase.auth.signUp()` te da un token. Las RLS policies deciden si ese token puede leer datos. No confundas autenticaci&#243;n con autorizaci&#243;n. Y recuerda: un token v&#225;lido no significa acceso garantizado.</p><p>6. <strong>PostgreSQL comparte recursos con todo</strong> &#8212; auth, datos, tiempo real y almacenamiento comparten el mismo PostgreSQL. Una query pesada puede degradar la autenticaci&#243;n. Monitorea el rendimiento global, no solo el de tu feature.</p><p>La decisi&#243;n Supabase vs Firebase 2026 no es t&#233;cnica. <strong>*Es sobre si tu equipo tiene o no la madurez PostgreSQL que Supabase exige.</strong> *</p><p>Y si crees que "total, PostgreSQL se aprende sobre la marcha" &#8212; bueno, los replication slots llenos y las RLS policies que hacen sequential scans te van a recordar por qu&#233; Firebase existe.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/supabase-vs-firebase-2026-deja-de-llamarlo-firebase-para-postgresql-20260601?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Las 4 Horas Que Deciden Tu Supervivencia: El Presupuesto Diario del Solo-Operator con Hijos]]></title><description><![CDATA[Las 4 horas diarias de un solo-operator con hijos no se reparten en tercios. Framework de 3 fases para priorizar ventas antes que c&#243;digo y evitar el burnout.]]></description><link>https://newsletter.brianmenagomez.com/p/las-4-horas-que-deciden-tu-supervivencia</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/las-4-horas-que-deciden-tu-supervivencia</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Mon, 01 Jun 2026 07:00:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/aa706896-e28d-4e54-8f4f-6297cea924b9_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Si Repartes Tus 4 Horas Diarias en 2h de C&#243;digo, 1h de Ventas y 1h de Mantenimiento, No Eres un Solo-Operator. Eres un Empleado de Tu Propio Producto Sin Sueldo.</strong></h2><p>Crees que el equilibrio perfecto existe. Que un solo-operator debe repartir su tiempo en tercios iguales. Construir, vender, mantener. 33/33/33. Un poco de cada, todos los d&#237;as.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El reparto uniforme no es equilibrio. Es la receta m&#225;s r&#225;pida para el burnout sin ingresos. Seg&#250;n los datos &#8212; escasos pero contundentes &#8212; el error no est&#225; en cu&#225;nto trabajas, sino en <strong>asumir que las tres actividades pesan lo mismo en todas las fases</strong>.</p><p>No pesan. Y el que te diga lo contrario nunca ha gestionado 4 horas diarias con un ni&#241;o de 6 meses en casa.</p><p>Yo lo hago. Mi taller de pintura sigue funcionando mientras escribo esto. Y he aprendido que el presupuesto diario de un solo-operator con hijos no se optimiza con productividad. Se optimiza con <strong>jerarqu&#237;a temporal</strong>.</p><p>---</p><h2><strong>El Error M&#225;s Caro de Tu Carrera: Construir Antes de Tener un Piso de Ingresos</strong></h2><p>La sabidur&#237;a convencional asume que el solo-operator debe construir primero y vender despu&#233;s. Construyes un MVP. Lo pules. A&#241;ades features. Y cuando est&#225; "listo", empiezas a vender.</p><p><strong>*Ese orden est&#225; al rev&#233;s.</strong>*</p><p>La tesis del solo-revenue floor es clara: <strong>construir cualquier producto antes de tener un piso de ingresos es el mayor error del solo-operator</strong>. El piso de ingresos &#8212; ese n&#250;mero m&#237;nimo de clientes que cubren tus gastos b&#225;sicos &#8212; no es un objetivo secundario. Es un *prerrequisito* para construir.</p><p>&#191;Qu&#233; significa esto en la pr&#225;ctica? Que tu reparto de tiempo no es una decisi&#243;n de preferencia personal. Es una funci&#243;n directa de tu estado financiero.</p><ul><li><p>Un solo-operator con 3 meses de ahorros deber&#237;a tener un reparto diametralmente opuesto a uno con 12 meses de ingresos recurrentes.</p></li><li><p>La mayor&#237;a aplica el mismo reparto independientemente de su situaci&#243;n real.</p></li><li><p>Y ese error es el que mata m&#225;s proyectos que cualquier fallo t&#233;cnico.</p></li></ul><p>---</p><h2><strong>&#10060; El Reparto Que Te Lleva al Burnout: 2h Construir / 1h Vender / 1h Mantener</strong></h2><p>Mira tu semana. Si eres como el 90% de los solo-operators que conozco, tu distribuci&#243;n es m&#225;s o menos esta:</p><p><strong>&#10060; Reparto cl&#225;sico del constructor que no factura:</strong></p><ul><li><p>2h diarias a construir producto nuevo</p></li><li><p>1h a prospecci&#243;n y ventas</p></li><li><p>1h a mantenimiento y bugs</p></li></ul><p>Parece razonable, &#191;verdad? Un poco m&#225;s de construcci&#243;n, algo de ventas, lo justo para mantener lo que ya funciona.</p><p><strong>*Es una trampa.</strong>*</p><p>El problema no es que trabajes poco. El problema es que <strong>las tres actividades tienen urgencias e impactos radicalmente distintos</strong>.</p><p>La construcci&#243;n es adictiva porque da satisfacci&#243;n inmediata. El c&#243;digo compila. La UI se ve bonita. Puedes mostrar avances. Pero el c&#243;digo que nadie paga no es un activo. Es un pasivo. Cada l&#237;nea de c&#243;digo sin validaci&#243;n de mercado es deuda t&#233;cnica que crece con intereses compuestos.</p><p>El mantenimiento es una deuda que se acumula en silencio. Cada bug que ignoras hoy ser&#225; una crisis ma&#241;ana. Cada dependencia sin actualizar ser&#225; un security hole la pr&#243;xima semana. Y cuanto m&#225;s c&#243;digo no vendido tienes, m&#225;s mantenimiento te come el tiempo.</p><p>Las ventas duelen. La prospecci&#243;n es rechazo. El email que no te responden. La demo que se cancela. Es m&#225;s f&#225;cil refugiarse en el c&#243;digo.</p><p><strong>La tentaci&#243;n psicol&#243;gica cuando las ventas no llegan es construir m&#225;s.</strong> Y ese c&#237;rculo vicioso es el que te mantiene sin ingresos mientras tu producto crece.</p><p>---</p><h2><strong>&#9989; El Framework del Solo-Time Budget: 3 Fases para Operadores-Padres</strong></h2><p>He pasado los &#250;ltimos meses refinando esto con mis propios productos &#8212; <strong>gestoriascercademi.com</strong>, <strong>conversoriaecnae.es</strong>, <strong>findemergencyplumber.com</strong> &#8212; y con el tiempo limitado que me deja mi peque de 6 meses.</p><p>El resultado es un framework de 3 fases. No es bonito. No es equilibrado. Pero <strong>funciona cuando tienes 4 horas al d&#237;a y no puedes fallar</strong>.</p><h3><strong>Fase 1 &#8212; Piso de Ingresos (Semanas 1-4): 3.5h Vender / 0.5h Mantener / 0h Construir</strong></h3><p>S&#237;, has le&#237;do bien. <strong>Cero horas de construcci&#243;n durante las primeras 4 semanas.</strong></p><p>Tu objeci&#243;n inmediata: <em>"Pero no tengo producto que vender. &#191;C&#243;mo voy a dedicar 3.5h a ventas si no tengo nada que mostrar?"</em></p><p>Objeci&#243;n v&#225;lida. Pero miope.</p><p>Vender no significa vender tu producto SaaS. Vender significa <strong>vender tu expertise</strong>. Consultor&#237;a. Servicios. Implementaciones. Incluso escribir documentaci&#243;n t&#233;cnica por encargo. El piso de ingresos se construye con lo que ya sabes hacer, no con lo que est&#225;s construyendo.</p><p>Durante esta fase:</p><ul><li><p>3.5h diarias a prospecci&#243;n, llamadas, consultor&#237;a, servicios</p></li><li><p>0.5h a mantener sistemas existentes</p></li><li><p><strong>Cero construcci&#243;n de producto nuevo</strong></p></li></ul><p>El objetivo no es c&#243;digo. Es <strong>ingresos recurrentes que cubran gastos b&#225;sicos</strong>. Una vez que eso existe, puedes respirar.</p><p>Tu segunda objeci&#243;n: <em>"Mi producto necesita X horas de construcci&#243;n s&#237; o s&#237; para ser viable. No puedo posponerlo."</em></p><p>Esta objeci&#243;n revela algo m&#225;s profundo: <strong>si necesitas 200 horas de construcci&#243;n antes de poder vender, no tienes un problema de tiempo. Tienes un problema de modelo de negocio</strong>.</p><p>El MVP grande es una falacia. Conozco productos que generaron ingresos con 10 horas de construcci&#243;n. Si tu producto necesita 200, el problema no es el tiempo. Es que est&#225;s construyendo algo demasiado grande para un solo-operator.</p><h3><strong>Fase 2 &#8212; Construcci&#243;n Protegida (Semanas 5-12): 2h Construir / 1.5h Vender / 0.5h Mantener</strong></h3><p>Has alcanzado el piso de ingresos. Los clientes de consultor&#237;a o servicios te pagan lo suficiente para cubrir lo b&#225;sico. Ahora puedes redistribuir.</p><ul><li><p>2h diarias a construir producto</p></li><li><p>1.5h a vender (manteniendo prospecci&#243;n activa)</p></li><li><p>0.5h a mantenimiento m&#237;nimo</p></li></ul><p>La clave de esta fase: <strong>las ventas residuales del piso de ingresos te permiten construir sin la urgencia de vender</strong>.</p><p>No est&#225;s construyendo desde cero con el reloj en contra. Est&#225;s construyendo desde un colch&#243;n. Eso cambia completamente la calidad de tus decisiones t&#233;cnicas. No tomas atajos. No acumulas deuda t&#233;cnica por presi&#243;n. Construyes bien.</p><p><em>"&#191;Y si las ventas de consultor&#237;a empiezan a caer?"</em></p><p>Buena pregunta. Por eso las 1.5h de ventas siguen ah&#237;. No puedes permitirte que el piso se erosione mientras construyes. Si ves que las ventas bajan, paras la construcci&#243;n y vuelves a fase 1.</p><h3><strong>Fase 3 &#8212; Mantenimiento Automatizado (Semana 13+): 2h Construir / 1.5h Vender / 0.5h Mantener</strong></h3><p>La gran pregunta: &#191;c&#243;mo mantienes el mantenimiento en 0.5h diarias?</p><p><strong>Automatizaci&#243;n.</strong> No es opcional. Es la &#250;nica salida.</p><ul><li><p>Despliegues autom&#225;ticos con zero-downtime</p></li><li><p>Tests automatizados que atrapan regresiones antes de producci&#243;n</p></li><li><p>Monitoreo con alertas inteligentes (no 50 notificaciones al d&#237;a, solo las que importan)</p></li><li><p>Self-healing donde sea posible: si un servicio cae, que se reinicie solo</p></li></ul><p>El objetivo es que tu sistema aguante sin ti durante horas. Que puedas estar 4 horas en el taller de pintura sin que el m&#243;vil vibre cada 10 minutos.</p><p>Si no puedes dejar tu producto 8 horas sin supervisi&#243;n, <strong>no tienes un producto. Tienes un trabajo a tiempo completo disfrazado de negocio</strong>.</p><h3><strong>La Regla de Parada Semanal</strong></h3><p>Esta es la regla que te salva del burnout cuando todo lo dem&#225;s falla:</p><p><strong>Si en una semana has dedicado m&#225;s de 10 horas a construir sin haber facturado nada nuevo, detente.</strong></p><p>No "reduce las horas de construcci&#243;n". <strong>Detente por completo</strong>. Vuelve a vender hasta recuperar el piso de ingresos.</p><p>El c&#243;digo sin ingresos no es un activo. Es deuda. Y la deuda hay que pagarla antes de acumular m&#225;s.</p><p>---</p><h2><strong>&#191;Y el Mantenimiento de Usuarios Existentes?</strong></h2><p>Tu tercera objeci&#243;n: <em>"El mantenimiento no es opcional. Mis usuarios actuales dependen de m&#237;."</em></p><p>Cierto. Pero esto solo es un problema si ya tienes usuarios sin tener piso de ingresos. Es el c&#237;rculo vicioso cl&#225;sico: construiste antes de validar, ahora tienes mantenimiento que pagar sin ingresos que lo sostengan.</p><p>La soluci&#243;n es doble:</p><p>1. <strong>Automatiza hasta el m&#237;nimo viable.</strong> Deploy autom&#225;tico, zero-downtime, self-healing. Cada hora que tu sistema pueda funcionar sin ti es una hora que puedes dedicar a vender o construir.</p><p>2. <strong>Externaliza si puedes permit&#237;rtelo.</strong> Un desarrollador junior de mantenimiento cuesta menos que tu hora de construcci&#243;n perdida. Si tu hora de construcci&#243;n vale m&#225;s que lo que le pagas a alguien para mantener, externaliza.</p><p>---</p><h2><strong>El Patr&#243;n del Constructor Consultor H&#237;brido</strong></h2><p>Hay un patr&#243;n que veo una y otra vez en solo-operators que realmente lo logran:</p><p>Empiezan con 3h de consultor&#237;a (vender + mantener) y 1h de producto (construir). El piso de ingresos son las horas de consultor&#237;a. Una vez estable, invierten el ratio gradualmente.</p><p>Esto contradice la narrativa de "producto desde el d&#237;a 1" que venden la mayor&#237;a de gur&#250;s del SaaS. Pero es la realidad del operador que tiene que pagar facturas mientras construye.</p><p><strong>La consultor&#237;a no es una distracci&#243;n. Es el combustible que permite construir sin urgencia.</strong></p><p>---</p><h2><strong>La Jerarqu&#237;a Temporal Que Nadie Te Ense&#241;a</strong></h2><p>Vamos a resumir con claridad. Esta es la jerarqu&#237;a que deber&#237;as tener grabada:</p><p>1. <strong>El piso de ingresos es el primer objetivo.</strong> No el c&#243;digo. No el producto. No la UI bonita.</p><p>2. <strong>El reparto de tiempo es funci&#243;n del estado financiero, no de preferencias.</strong> Si no tienes piso de ingresos, tu tiempo debe ser 90% ventas. Punto.</p><p>3. <strong>El mantenimiento es deuda que crece con el c&#243;digo no vendido.</strong> Cada l&#237;nea de c&#243;digo que nadie paga es un coste futuro. Minim&#237;zala hasta que tengas ingresos que la justifiquen.</p><p>4. <strong>La regla de parada semanal no es negociable.</strong> 10 horas de construcci&#243;n sin facturaci&#243;n nueva = parar y vender.</p><p>5. <strong>La automatizaci&#243;n no es lujo. Es la &#250;nica forma de escalar 4 horas diarias.</strong> Si tu sistema no sobrevive 8 horas sin ti, no escalas. Sobrevives.</p><p>---</p><h2><strong>La &#218;nica Pregunta Que Importa</strong></h2><p>Ma&#241;ana tienes 4 horas. Tu hijo se despierta a las 7. A las 11 tienes que recogerlo. Entre medias, puedes elegir.</p><p>&#191;Vas a construir c&#243;digo que nadie ha pagado? &#191;O vas a conseguir el cliente que te da libertad para construir sin presi&#243;n?</p><p>La respuesta determina si dentro de 6 meses sigues siendo un solo-operator con deuda t&#233;cnica acumulada... o si eres due&#241;o de un negocio que funciona mientras t&#250; duermes.</p><p><strong>*La elecci&#243;n es tuya. Pero el tiempo no espera.</strong>*</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/las-4-horas-del-solo-operator-con-hijos-presupuesto-diario-20260601?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Claude Code Tutorial 2026: El 90% de los Desarrolladores Confunde un Agente con un Chat]]></title><description><![CDATA[Claude Code no es un chat &#8212; es un agente aut&#243;nomo en tu terminal. Tutorial 2026: arquitectura tool-use, configuraci&#243;n CLAUDE.md, y el framework de 3 niveles para usarlo bien.]]></description><link>https://newsletter.brianmenagomez.com/p/claude-code-tutorial-2026-el-90-de-86d</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/claude-code-tutorial-2026-el-90-de-86d</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Sun, 31 May 2026 07:00:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/95a6c7ac-9a5e-4ddd-82ba-d97b2db246c8_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Claude Code No Te Ayuda a Escribir C&#243;digo. Toma Tu Terminal, Ejecuta Tus Tests, y Hace Commit Por Ti</h2><p>La pregunta no es si funciona.</p><p><strong>*La pregunta es si est&#225;s listo para dejar de ser el que controla.</strong> *</p><p>El 90% de los desarrolladores que empiezan con Claude Code lo tratan como un ChatGPT con acceso a ficheros.</p><p>Le piden que genere una funci&#243;n. Copian el c&#243;digo. Lo pegan. Ejecutan los tests manualmente.</p><p><strong>*Eso no es usar Claude Code. Eso es usar un chat con esteroides.</strong> *</p><p>Claude Code opera en tu terminal con permisos de lectura/escritura sobre tu sistema de ficheros, ejecuci&#243;n de bash, y control total de git. No genera texto que t&#250; ejecutas despu&#233;s &#8212; <strong>ejecuta &#233;l mismo</strong>.</p><p>Y eso cambia todo.</p><p>&#10060; <strong>Uso incorrecto</strong>: "Genera un decorador en Python que mida tiempo de ejecuci&#243;n" &#8594; copias, pegas, ejecutas manualmente</p><p>&#9989; <strong>Uso correcto</strong>: "A&#241;ade un decorador de logging a todas las funciones del m&#243;dulo `services/`, ejecuta los tests y haz commit si pasan"</p><p>La diferencia no es el modelo. Es <strong>qui&#233;n controla el loop de ejecuci&#243;n</strong>.</p><p>Para entender por qu&#233; esta distinci&#243;n es tan cr&#237;tica, tenemos que examinar c&#243;mo piensa la mayor&#237;a de desarrolladores cuando se enfrentan a una herramienta nueva. Llevamos a&#241;os usando asistentes de c&#243;digo que funcionan como int&#233;rpretes pasivos: escribimos un prompt, obtenemos una respuesta, y luego nosotros decidimos qu&#233; hacer con ella. Ese patr&#243;n est&#225; tan arraigado que la mayor&#237;a ni siquiera se plantea que podr&#237;a funcionar de otra forma.</p><p>Pero Claude Code rompe ese esquema por completo. Ya no eres t&#250; quien cierra el c&#237;rculo entre la generaci&#243;n y la ejecuci&#243;n. Lo hace el agente. Y cuando el agente puede ejecutar, probar y corregir en un solo ciclo, el ritmo de desarrollo se transforma.</p><p>Sin embargo, aqu&#237; aparece el primer escollo psicol&#243;gico: soltar el control asusta. A nadie le gusta que una m&#225;quina toque su c&#243;digo sin supervisi&#243;n. Por eso es tan importante entender primero c&#243;mo funciona esta arquitectura, y despu&#233;s establecer l&#237;mites claros.</p><p>---</p><h2><strong>La Arquitectura Que Lo Cambia Todo: Tool-Use Frente a Chat Est&#225;tico</strong></h2><p>La mayor&#237;a de asistentes de c&#243;digo funcionan igual: reciben un prompt, generan texto, te lo devuelven. T&#250; decides si copiarlo, ejecutarlo, o ignorarlo.</p><p><strong>Eres t&#250; quien cierra el loop.</strong></p><p>Claude Code usa una arquitectura de <strong>tool-use</strong>. El modelo decide din&#225;micamente qu&#233; herramientas invocar seg&#250;n el contexto:</p><ul><li><p>`Edit` &#8212; Lee y escribe ficheros</p></li><li><p>`Bash` &#8212; Ejecuta comandos en tu terminal</p></li><li><p>`Search` &#8212; Busca en tu c&#243;digo base</p></li><li><p>`Git` &#8212; Crea ramas, hace commits, gestiona PRs</p></li></ul><p>El modelo no solo genera una respuesta. <strong>Observa el resultado de cada acci&#243;n y decide el siguiente paso.</strong></p><p>```</p><p>T&#250;: "Arregla el test que falla en tests/api.test.js"</p><p>Claude Code piensa:</p><p>Paso 1: Leer tests/api.test.js &#8594; encuentra el test fallido</p><p>Paso 2: Ejecutar el test &#8594; obtiene el mensaje de error</p><p>Paso 3: Leer el c&#243;digo fuente implicado</p><p>Paso 4: Identificar el bug (un null no manejado)</p><p>Paso 5: Editar el fichero fuente para arreglarlo</p><p>Paso 6: Re-ejecutar el test &#8594; pasa</p><p>Paso 7: Hacer commit con mensaje descriptivo</p><p>```</p><p>Sin que t&#250; copies, pegues, ni ejecutes nada.</p><p>Esto no es incremental. <strong>Es un salto categ&#243;rico.</strong> El desarrollador pasa de ser "implementador" a "revisor y aprobador". El cuello de botella ya no es lo r&#225;pido que escribes c&#243;digo &#8212; <strong>es lo r&#225;pido que revisas y especificas tareas</strong>.</p><p>Para visualizar la diferencia, piensa en un editor de texto tradicional frente a un entorno de desarrollo integrado (IDE). El editor solo te deja escribir; el IDE compila, depura y ejecuta. Claude Code hace algo similar, pero llevado al extremo: no solo ejecuta, sino que observa los resultados y ajusta su comportamiento.</p><p>Ahora bien, esta capacidad de encadenar acciones tiene un l&#237;mite importante: el contexto. Si el modelo no sabe nada sobre tu proyecto, sus decisiones ser&#225;n gen&#233;ricas. Y las decisiones gen&#233;ricas rara vez producen buen c&#243;digo.</p><p>---</p><h2><strong>El Contexto Es el Verdadero Cuello de Botella</strong></h2><p>Aqu&#237; est&#225; la parte que casi nadie configura bien.</p><p>Claude Code no tiene memoria de tu proyecto a menos que se la des expl&#237;citamente.</p><p>Si abres tu terminal y escribes `claude`, el modelo arranca sin contexto de tu arquitectura, tus convenciones de c&#243;digo, ni tus decisiones de dise&#241;o.</p><p><strong>El resultado es como pedirle a un freelance que empiece a programar sin leer la documentaci&#243;n del proyecto.</strong></p><p>Muchos desarrolladores se frustran porque el c&#243;digo generado no sigue sus patrones habituales. Culpan al modelo. Pero el problema no es el modelo: es la falta de contexto. Le est&#225;s pidiendo que acierte a ciegas.</p><h3><strong>El Patr&#243;n CLAUDE.md</strong></h3><p>Crea un fichero `CLAUDE.md` en la ra&#237;z de tu proyecto. Ah&#237; documentas:</p><p>```markdown</p><h1>CLAUDE.md &#8212; Proyecto API de Gestor&#237;a</h1><h2>Arquitectura</h2><ul><li><p>Next.js 16 con App Router</p></li><li><p>API routes en /api/</p></li><li><p>Base de datos: Supabase con RLS</p></li><li><p>Edge Functions para webhooks</p></li></ul><h2>Convenciones de c&#243;digo</h2><ul><li><p>TypeScript estricto, sin `any`</p></li><li><p>Props tipadas con interfaces, no types</p></li><li><p>Tests en Vitest, cobertura &gt; 80%</p></li><li><p>Nombres de carpetas en kebab-case</p></li></ul><h2>Estilo</h2><ul><li><p>Funciones flecha exportadas por defecto</p></li><li><p>Fetch con React Query, nunca raw fetch</p></li><li><p>Errores con ErrorBoundary por ruta</p></li></ul><p>```</p><p><strong>Invertir 15 minutos en este fichero multiplica la calidad del output.</strong></p><p>Claude Code lo lee al iniciar sesi&#243;n en el proyecto. Sabe c&#243;mo escribes, qu&#233; patrones sigues, y qu&#233; esperas de &#233;l. Sin el `CLAUDE.md`, el modelo adivina. Y adivinar sale caro.</p><p>Pero el `CLAUDE.md` no es algo que escribas una vez y olvides. <strong>Es un documento vivo.</strong> Cada vez que el modelo genera c&#243;digo que no se ajusta a lo que esperabas, esa es una se&#241;al de que el contexto necesita mejorar. Tal vez falta una regla sobre c&#243;mo manejas los errores, o una convenci&#243;n sobre nombres de variables. A&#241;&#225;delo.</p><p>El proceso de iterar este fichero es, en s&#237; mismo, un ejercicio de claridad t&#233;cnica. Te obliga a articular expl&#237;citamente decisiones que antes dabas por supuestas. Y eso no solo mejora el output de Claude Code: tambi&#233;n mejora tu propio entendimiento del proyecto.</p><p>---</p><h2><strong>El Framework de 3 Niveles para Usar Claude Code Como un Agente Real</strong></h2><p>La mayor&#237;a empieza pidi&#233;ndole que escriba c&#243;digo directamente. <strong>Error.</strong> El onboarding correcto tiene tres fases:</p><h3><strong>1. Modo Solo Lectura (D&#237;a 1-3)</strong></h3><p>Antes de darle permisos de escritura, &#250;salo para entender tu c&#243;digo:</p><p>```</p><p>"Expl&#237;came la arquitectura de este proyecto"</p><p>"Encuentra posibles bugs en services/auth.js"</p><p>"Resume el flujo de datos en esta ruta API"</p><p>"Dime qu&#233; dependencias no se est&#225;n usando"</p><p>```</p><p>No dejes que toque nada. Solo observa c&#243;mo entiende tu base de c&#243;digo.</p><p>Si al leer el `CLAUDE.md` ves que interpreta mal decisiones de dise&#241;o, <strong>mejora el fichero de contexto</strong>. Ese proceso de iteraci&#243;n es m&#225;s valioso que cualquier c&#243;digo que genere.</p><p>Durante estos primeros d&#237;as, presta atenci&#243;n a c&#243;mo razona. &#191;Entiende bien la separaci&#243;n entre capas? &#191;Identifica correctamente los patrones de tu arquitectura? Si ves lagunas, es porque tu `CLAUDE.md` tiene lagunas.</p><h3><strong>2. Modo Escritura Supervisada (D&#237;a 4-7)</strong></h3><p>Cuando conf&#237;es en que entiende el proyecto, pasa a tareas con write pero con revisi&#243;n manual:</p><p>```</p><p>"Refactoriza este controlador Express a funciones flecha"</p><p>"A&#241;ade validaci&#243;n Zod al endpoint POST /api/users"</p><p>"Convierte este bucle for a map/filter"</p><p>```</p><p>Claude Code editar&#225; los ficheros directamente. Antes de aceptar, revisa el diff.</p><p><strong>Trata el c&#243;digo generado como c&#243;digo de un junior.</strong> R&#225;pido, entusiasta, pero necesita supervisi&#243;n. Si ves patrones incorrectos, corr&#237;gelos en el `CLAUDE.md`.</p><p>Un consejo pr&#225;ctico: usa herramientas de diff visual como las que ofrece tu editor o tu proveedor de git. Revisa cada cambio l&#237;nea por l&#237;nea. Preg&#250;ntate: "&#191;Entiendo por qu&#233; ha hecho este cambio? &#191;Sigue las convenciones del proyecto? &#191;Hay alg&#250;n efecto secundario que no haya considerado?"</p><p>Si respondes "no" a cualquiera de esas preguntas, ese es el momento de parar y ajustar.</p><h3><strong>3. Modo Aut&#243;nomo (D&#237;a 8+)</strong></h3><p>El nivel donde Claude Code opera el ciclo completo:</p><p>```</p><p>"Busca las dependencias sin usar, elim&#237;nalas, ejecuta los tests y haz commit si todo pasa"</p><p>"Arregla todos los tests que fallen en la carpeta __tests__ y documenta cada fix"</p><p>"A&#241;ade cobertura de tests para todos los controladores que tengan menos del 60%"</p><p>```</p><p>Aqu&#237; Claude Code ejecuta comandos de bash (`npm ls`, `depcheck`), edita ficheros, ejecuta tests, y hace commit.</p><p><strong>*Este es el nivel donde la productividad se multiplica. Y donde el riesgo tambi&#233;n.</strong> *</p><p>Y aqu&#237; surge una pregunta inc&#243;moda: &#191;qu&#233; pasa cuando el agente se equivoca? Pasa igual que cuando un compa&#241;ero se equivoca: revisas, corriges, y aprendes. La diferencia es que Claude Code no se cansa, no se ofende, y puede repetir una tarea cien veces hasta que la haga bien. Eso s&#237;, siempre bajo tu supervisi&#243;n.</p><p>---</p><h2><strong>La Barrera de Seguridad Que Nadie Te Cuenta</strong></h2><p>Claude Code puede ejecutar `rm -rf node_modules`, instalar paquetes npm, y hacer force push a tu repo.</p><p><strong>&#191;Te f&#237;as?</strong></p><p>La mayor&#237;a de desarrolladores copian c&#243;digo de Stack Overflow y LLM chats sin pensarlo dos veces. Eso es m&#225;s peligroso &#8212; no hay auditor&#237;a, no hay log, no hay revert.</p><p>Claude Code tiene un sistema de <strong>permisos graduados</strong>:</p><ul><li><p><strong>Read-only</strong>: operaciones seguras, sin aprobaci&#243;n</p></li><li><p><strong>Write</strong>: ediciones de ficheros, requiere confirmaci&#243;n</p></li><li><p><strong>Destructive</strong>: `git push --force`, `rm -rf`, instalaci&#243;n de paquetes &#8212; requiere confirmaci&#243;n expl&#237;cita</p></li></ul><p>El truco est&#225; en definir tu <strong>permission boundary</strong>:</p><p>&#9989; Auto-aprueba: ediciones de ficheros, ejecuci&#243;n de tests, commits a ramas de feature</p><p>&#10060; Requiere aprobaci&#243;n: instalaci&#243;n de dependencias, operaciones destructivas, push a main</p><p>Pero el sistema de permisos no es solo t&#233;cnico. Tambi&#233;n es cultural. Si trabajas en equipo, necesit&#225;is acordar qu&#233; nivel de autonom&#237;a dais al agente. Un equipo donde cada miembro configura sus permisos de forma distinta es un equipo donde el agente se comporta de forma impredecible. Y la impredecibilidad en un entorno de producci&#243;n es cara.</p><p>Una buena pr&#225;ctica: definir un `CLAUDE.md` compartido para el equipo, con las reglas de permisos expl&#237;citas. As&#237; todos parten de la misma base y los comportamientos del agente son consistentes.</p><p>---</p><h2><strong>Los Errores M&#225;s Comunes de los Primeros 30 D&#237;as</strong></h2><p>Incluso con el mejor `CLAUDE.md` y los permisos bien configurados, los primeros d&#237;as con Claude Code est&#225;n llenos de trampas. Estas son las m&#225;s frecuentes:</p><p><strong>1. Prompts ambiguos.</strong> Decir "arregla esto" sin especificar qu&#233; significa "arreglado". Claude Code ejecutar&#225;, pero puede que no haga lo que esperabas. La soluci&#243;n: s&#233; expl&#237;cito sobre la definici&#243;n de "hecho". "Arregla esto" &#8594; "Arregla el test X para que pase, sin modificar la l&#243;gica de negocio".</p><p><strong>2. Dejar que toque infraestructura sin supervisi&#243;n.</strong> Los cambios en configuraci&#243;n de despliegue, variables de entorno o dependencias del sistema deber&#237;an estar siempre en modo destructivo. Un cambio inocente en un `docker-compose.yml` puede tirar todo un entorno de staging.</p><p><strong>3. Olvidar que el contexto se agota.</strong> Claude Code tiene un l&#237;mite de tokens. Si llevas una sesi&#243;n larga con muchas iteraciones, el modelo empieza a "olvidar" partes del contexto inicial. La soluci&#243;n: cuando notes que la calidad baja, abre una nueva sesi&#243;n y recarga el `CLAUDE.md`.</p><p><strong>4. Ignorar los logs de las acciones.</strong> Claude Code registra cada operaci&#243;n que ejecuta. Si algo sale mal, los logs son tu primera fuente de verdad. Acost&#250;mbrate a revisarlos antes de culpar al agente.</p><p>---</p><h2><strong>El Cambio de Rol Que Nadie Est&#225; Procesando</strong></h2><p>Cuando Claude Code ejecuta, el desarrollador revisa. Eso suena simple pero <strong>invierte la din&#225;mica del desarrollo</strong>.</p><p>Antes: escrib&#237;as 100 l&#237;neas, las probabas, las depurabas.</p><p>Ahora: escribes 2 l&#237;neas de prompt, revisas 100 l&#237;neas de c&#243;digo generado, y decides si aceptas o rediriges.</p><p><strong>La habilidad m&#225;s valiosa ya no es escribir c&#243;digo r&#225;pido. Es especificar tareas con precisi&#243;n y revisar c&#243;digo generado con criterio.</strong></p><p>Los seniors que entienden la arquitectura del proyecto &#8212; que saben qu&#233; preguntar y c&#243;mo validar el output &#8212; obtienen resultados brutales. Los juniors que delegan sin entender producen c&#243;digo que no saben depurar.</p><p><strong>*Claude Code no reemplaza el criterio t&#233;cnico. Lo amplifica.</strong> *</p><p>El desarrollador que m&#225;s se beneficia no es el que escribe m&#225;s c&#243;digo. <strong>Es el que entiende mejor su c&#243;digo y puede decirle al agente exactamente qu&#233; hacer.</strong></p><p>Aqu&#237; hay una reflexi&#243;n importante para los equipos: el senior que antes pasaba el d&#237;a codeando ahora pasa el d&#237;a revisando. Eso significa que su rol cambia de "constructor" a "validador". Y si el equipo no ajusta las expectativas, el senior puede sentirse frustrado porque "ya no programa". La realidad es que programa a trav&#233;s del agente, y su valor ahora est&#225; en la calidad de la revisi&#243;n, no en la cantidad de l&#237;neas escritas.</p><p>Para los juniors, el reto es diferente. Si usan Claude Code sin entender lo que genera, est&#225;n construyendo una deuda t&#233;cnica enorme. El agente les da velocidad, pero no les da comprensi&#243;n. Y la comprensi&#243;n es lo &#250;nico que diferencia a un desarrollador que crece de uno que solo ejecuta prompts.</p><p>---</p><h2><strong>Empezar Hoy: Tu Checklist de 5 Pasos</strong></h2><p>1. <strong>Crea un proyecto sandbox</strong>. Un directorio vac&#237;o, un repo de prueba. Experimenta sin consecuencias.</p><p>2. <strong>Escribe tu CLAUDE.md</strong>. 15 minutos. Patrones, convenciones, stack tecnol&#243;gico.</p><p>3. <strong>Empieza en modo read-only</strong>. P&#237;dele que analice, no que escriba.</p><p>4. <strong>Define tu permission boundary</strong>. Qu&#233; auto-apruebas, qu&#233; requieres aprobar.</p><p>5. <strong>Itera el contexto</strong>. Cada vez que veas un output pobre, mejora el `CLAUDE.md`. El fichero de contexto es tu activo m&#225;s valioso.</p><p>Y un sexto paso que no est&#225; en ninguna gu&#237;a oficial: <strong>comparte lo que aprendes</strong>. El patr&#243;n `CLAUDE.md` es nuevo para casi todo el mundo. Si encuentras una forma especialmente buena de documentar convenciones o de estructurar permisos, comp&#225;rtelo con tu equipo. El conocimiento colectivo sobre c&#243;mo trabajar con agentes a&#250;n se est&#225; construyendo, y los que mejor lo entienden ahora ser&#225;n los que marquen la pauta en los pr&#243;ximos a&#241;os.</p><p>Claude Code no es un chat. No es una herramienta de autocompletado. <strong>Es un agente que ejecuta en tu m&#225;quina.</strong></p><p>La pregunta no es si funciona. La pregunta es si est&#225;s listo para trabajar con &#233;l en lugar de contra &#233;l.</p><p>Y la respuesta, como casi siempre en desarrollo, no est&#225; en la herramienta. Est&#225; en c&#243;mo decides usarla.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/claude-code-tutorial-2026-agente-vs-chat-20260531?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El Solo-Revenue Floor: El Número Mínimo de Clientes Que Necesitas Antes de Tocar una Línea de Código]]></title><description><![CDATA[El solo-revenue floor es el n&#250;mero m&#237;nimo de clientes que necesitas antes de enfocarte 100% en producto. Un framework para operadores solos que construyen mientras trabajan.]]></description><link>https://newsletter.brianmenagomez.com/p/el-solo-revenue-floor-el-numero-minimo</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-solo-revenue-floor-el-numero-minimo</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Sun, 31 May 2026 07:00:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a4b06e17-f4c1-4d2c-b491-ed6782fe199a_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>El Solo-Revenue Floor: El N&#250;mero M&#237;nimo de Clientes Que Necesitas Antes de Tocar una L&#237;nea de C&#243;digo</h1><h2>Crees que tu problema es que no tienes tiempo para construir producto. Tu problema real es que no tienes un piso de ingresos que te lo permita.</h2><p>Te levantas. Abres el port&#225;til. Tienes tres reuniones de ventas, dos llamadas de soporte a clientes legacy, y un entregable freelance que prometiste ayer.</p><p>Son las siete de la tarde. No has escrito ni una l&#237;nea de c&#243;digo para tu producto.</p><p><strong>*El problema no es tu productividad. El problema es que no tienes un solo-revenue floor.</strong>*</p><p>Llevo cuatro a&#241;os operando as&#237;. He montado conversoriaecnae.es, gestoriascercademi.com, findemergencyplumber.com, Jur&#237;dica Integral, Grot, M&#243;dulos-IRPF. Todos mientras pintaba coches cuatro horas al d&#237;a en un taller de M&#225;laga y cuidaba a mi peque de seis meses.</p><p>Y el patr&#243;n se repite siempre: <strong>los que fracasan construyen antes de facturar. Los que sobreviven facturan antes de construir.</strong></p><p>El problema de fondo es m&#225;s profundo de lo que parece. No se trata de organizaci&#243;n personal ni de dominar t&#233;cnicas de productividad. Se trata de una decisi&#243;n estructural sobre c&#243;mo distribuyes tu energ&#237;a cuando tu tiempo es limitado. Si trabajas solo, cada hora que dedicas a una cosa la est&#225;s robando de otra. Y cuando esa otra es la que paga las facturas, el robo tiene consecuencias inmediatas.</p><p>La mayor&#237;a de operadores solos que conozco no fracasan porque su producto sea malo. Fracasan porque se quedan sin margen antes de terminarlo. Y ese margen no es solo econ&#243;mico: es margen mental, margen de atenci&#243;n, margen para poder decir "no" a una urgencia de servicio para decir "s&#237;" a una feature que necesita tres horas seguidas de concentraci&#243;n.</p><p>Por eso he decidido escribir esto. No como teor&#237;a, sino como el marco que he aplicado una y otra vez en cada proyecto que he lanzado. Algunos han funcionado. Otros no. Pero todos compart&#237;an una misma variable: cuando ten&#237;a el piso de ingresos resuelto, el producto sal&#237;a. Cuando no, el producto se quedaba a medio camino.</p><h2>La Trampa del Constructor que No Factura</h2><p>Cada semana veo a decenas de operadores solos repitiendo el mismo error. Abren un proyecto nuevo. Configuran Next.js. Despliegan una landing page. Integran Stripe. Escriben el backend durante tres semanas.</p><p>Y entonces se dan cuenta de que no tienen ni un solo cliente esperando.</p><p>Scott Perry lo explica bien en <em>Creative on Purpose</em>: el crecimiento por el crecimiento es una soluci&#243;n en busca de un problema. Pero aqu&#237; el problema es m&#225;s b&#225;sico. <strong>No es que tengas los suscriptores equivocados. Es que no tienes ingresos que te compren tiempo.</strong></p><p>Cuando no tienes <em>solo-revenue floor</em>, cada hora que dedicas a producto es una hora que NO dedicas a conseguir el pr&#243;ximo cliente de servicio.</p><p>El resultado es predecible:</p><p>&#10060; <strong>Construyes en vac&#237;o.</strong> Sin feedback de clientes reales, tu producto resuelve problemas que nadie tiene.</p><p>&#10060; <strong>Te quedas sin caja.</strong> El dinero de tus ahorros se acaba antes de que el producto genere su primer euro.</p><p>&#10060; <strong>Abandonas.</strong> No es que el producto sea malo. Es que no ten&#237;as el margen financiero para terminarlo.</p><p>Pero hay una cuarta consecuencia que es m&#225;s sutil y m&#225;s peligrosa: el desgaste de la reputaci&#243;n. Cuando lanzas un producto a medias porque te quedaste sin tiempo, ese producto lleva tu nombre. Los primeros usuarios que confiaron en ti no volver&#225;n a hacerlo. Y en un mercado donde la confianza es el activo m&#225;s escaso, quemarla por prisas es un error que pagas durante a&#241;os.</p><p>El LinkedIn de 2026 lo confirma: los algoritmos premian la consistencia, no la perfecci&#243;n. Pero t&#250; no puedes ser consistente si est&#225;s alternando entre "construir producto" y "conseguir el siguiente cliente de servicio" como si fueran dos trabajos distintos.</p><p>La consistencia de la que hablan los gur&#250;s no es solo publicar tres veces por semana. Es tener la capacidad de aparecer cada d&#237;a con la misma energ&#237;a, el mismo foco, la misma calidad. Y eso es imposible cuando tu atenci&#243;n est&#225; dividida entre dos frentes que compiten directamente por tu tiempo.</p><p>F&#237;jate en el patr&#243;n de los que realmente lo logran: no son los que construyen m&#225;s r&#225;pido. Son los que tienen la libertad de construir sin urgencia. Los que pueden permitirse iterar, equivocarse, y volver a intentarlo porque saben que el dinero de este mes ya est&#225; cubierto.</p><h2>Qu&#233; Es el Solo-Revenue Floor (Y Por Qu&#233; el 90% lo Calcula Mal)</h2><p>El <em>solo-revenue floor</em> es el n&#250;mero m&#237;nimo de clientes recurrentes de servicio que necesitas tener antes de poder dedicar el 100% de tu tiempo operativo a construir producto.</p><p>La mayor&#237;a lo calcula as&#237;: "necesito X euros al mes para vivir". Miran sus gastos. Suman. Dividen entre el precio de su servicio. Y ese es su n&#250;mero.</p><p><strong>*Ese c&#225;lculo no funciona.</strong>*</p><p>Porque no consideras tres factores que solo un operador con hijos, taller de pintura y clientes reales conoce:</p><p><strong>1. El coste de adquisici&#243;n no es cero cuando dejas de vender.</strong></p><p>Si hoy dejas de prospectar para construir producto, dentro de dos meses no tendr&#225;s nuevos clientes de servicio. Tu pipeline se seca. Y cuando vuelvas a necesitar vender servicios, arrancar de cero cuesta el doble. No solo porque has perdido contacto con tu red, sino porque tu "m&#250;sculo de ventas" se ha atrofiado. Las primeras semanas de reincorporaci&#243;n son siempre las m&#225;s dif&#237;ciles: los guiones suenan rob&#243;ticos, las objeciones te pillan desprevenido, y cierras menos de lo que esperabas.</p><p><strong>2. La moral no es lineal.</strong></p><p>Los primeros quince d&#237;as sin ingresos nuevos no duelen. El d&#237;a treinta empiezas a mirar el saldo. El d&#237;a cuarenta y cinco dejas de dormir bien. Y el c&#243;digo que escribes con ansiedad no es c&#243;digo que quieras desplegar en producci&#243;n.</p><p>He visto a operadores talentosos cometer errores garrafales en producci&#243;n simplemente porque estaban acelerados, porque no pod&#237;an permitirse el lujo de probar dos veces, porque cada deploy fallido significaba un d&#237;a m&#225;s sin ingresos. La ansiedad no solo afecta a tu salud: afecta a la calidad de tu trabajo de una forma que tus usuarios notan inmediatamente.</p><p><strong>3. El soporte a clientes existentes no desaparece.</strong></p><p>Aunque dejes de tomar nuevos clientes de servicio, los que ya tienes siguen necesit&#225;ndote. Y un cliente legacy insatisfecho puede costarte m&#225;s tiempo que diez clientes nuevos contentos.</p><p>He visto a operadores perder semanas enteras apagando incendios de clientes antiguos mientras su producto nuevo se pudr&#237;a en un repositorio. El cliente legacy no entiende que est&#225;s construyendo algo nuevo. &#201;l pag&#243; por un servicio y espera recibirlo. Y tiene raz&#243;n. El problema no es suyo: es tuyo, por no haber dimensionado correctamente cu&#225;nta atenci&#243;n ibas a necesitar para mantenerlo satisfecho mientras constru&#237;as.</p><h2>El Framework del Solo-Revenue Floor: 3 Capas para Salir del Bucle</h2><p>No te voy a dar teor&#237;a. Te voy a dar el marco que uso para decidir cu&#225;ndo puedo permitirme construir producto sin arruinarme. Son tres capas que funcionan como filtros: si no cumples la primera, ni siquiera mires la segunda. Si no cumples la segunda, no llegues a la tercera. Y si no cumples la tercera, cierra el editor de c&#243;digo y vuelve a vender.</p><h3>1. El Piso de Supervivencia (Capa 1)</h3><p>Este es el n&#250;mero que la mayor&#237;a conoce, pero calcula mal.</p><p>Identifica <strong>el ingreso m&#237;nimo que cubre tus gastos fijos + 3 meses de colch&#243;n operativo</strong>. Eso incluye:</p><ul><li><p>Tu retirada personal (lo m&#237;nimo que necesitas para vivir)</p></li><li><p>Los costes de tu stack t&#233;cnico (dominios, servidores, APIs, herramientas)</p></li><li><p>Un buffer del 30% para imprevistos (el cliente que no paga, la API que sube el precio, el ordenador que se rompe)</p></li></ul><p>&#9989; <strong>Multiplica ese n&#250;mero por 1.5.</strong> Ese es tu piso real.</p><p>Porque cuando construyas producto, tendr&#225;s gastos imprevistos que hoy no ves. Y el margen del 50% es lo que te permite decir "no" a un cliente de servicio urgente para terminar una feature cr&#237;tica.</p><p>No es un c&#225;lculo conservador. Es un c&#225;lculo realista. He visto a demasiados operadores calcular su piso justo al l&#237;mite, y luego una subida de precios de una API que usaban o un cliente que retras&#243; el pago los dej&#243; sin margen en el peor momento posible. El margen del 50% no es para gastar: es para respirar.</p><h3>2. El Techo de Retenci&#243;n (Capa 2)</h3><p>Tus clientes actuales no son eternos. Si dejas de vender durante tres meses, una parte se ir&#225;.</p><p>Calcula <strong>tu tasa de abandono mensual natural</strong>. Si pierdes un 5% de clientes al mes incluso cuando est&#225;s operando al 100%, cuando dejes de dedicar tiempo a retenerlos, esa tasa subir&#225;.</p><p>Tu solo-revenue floor necesita tener al menos <strong>un 30% m&#225;s de clientes de los que necesitas realmente</strong>.</p><p><strong>*Ese 30% es tu colch&#243;n de abandono.</strong>*</p><p>Si necesitas 10 clientes para cubrir gastos, no empieces a construir producto hasta que tengas 13. Los 3 que se ir&#225;n durante los dos meses de desarrollo son tu margen de error.</p><p>Este colch&#243;n no es opcional: es estructural. Durante el tiempo que construyes producto, tu atenci&#243;n est&#225; dividida. No est&#225;s haciendo el seguimiento que sol&#237;as hacer. No est&#225;s enviando esos correos de valor a&#241;adido. No est&#225;s resolviendo incidencias con la misma velocidad. Y los clientes lo notan. Algunos se ir&#225;n. No porque est&#233;n enfadados, sino porque simplemente dejas de estar presente.</p><p>El 30% adicional no es para cubrir gastos: es para cubrir esa p&#233;rdida natural de atenci&#243;n.</p><h3>3. La Barrera de Atenci&#243;n (Capa 3)</h3><p>Esta es la capa que nadie menciona y la que m&#225;s duele.</p><p>Cada cliente de servicio consume atenci&#243;n. No solo tiempo de entrega, sino <strong>energ&#237;a mental</strong>. Una llamada de soporte de quince minutos puede arruinar tu bloque de concentraci&#243;n de tres horas para codificar.</p><p>Cuando calcules tu solo-revenue floor, necesitas saber <strong>cu&#225;nta atenci&#243;n consume cada cliente</strong>.</p><p>El c&#225;lculo es sencillo:</p><ul><li><p>Cliente servicio bajo mantenimiento: consume 1 unidad de atenci&#243;n al mes</p></li><li><p>Cliente servicio con entregas activas: consume 3 unidades de atenci&#243;n al mes</p></li><li><p>Cliente legacy problem&#225;tico: consume 5 unidades de atenci&#243;n al mes</p></li></ul><p>Tu capacidad m&#225;xima de atenci&#243;n, si trabajas solo y con familia, es de <strong>12 unidades al mes</strong> (4 horas/d&#237;a de taller &#215; 30 d&#237;as, dividido entre lo que necesitas para codificar).</p><p>Cuando est&#233;s en modo construcci&#243;n de producto, necesitas <strong>como m&#237;nimo 6 unidades libres al mes</strong> para poder enfocarte.</p><p><strong>*Traducci&#243;n: no puedes tener m&#225;s de 6 unidades de atenci&#243;n ocupadas por clientes si quieres construir producto.</strong>*</p><p>Y aqu&#237; est&#225; la parte m&#225;s dif&#237;cil: las unidades de atenci&#243;n no son lineales. Un d&#237;a malo puede consumir 3 unidades de atenci&#243;n en una sola hora. Una discusi&#243;n con un cliente, un error en producci&#243;n, una urgencia familiar. La atenci&#243;n no es un recurso que puedas estirar. Es un recurso que, cuando se agota, se agota para todo el d&#237;a. No puedes enga&#241;ar a tu cerebro para que rinda igual despu&#233;s de una interrupci&#243;n emocionalmente costosa.</p><p>Por eso la capa 3 no es solo sobre cu&#225;ntos clientes tienes, sino sobre qu&#233; tipo de clientes tienes. Un cliente de bajo mantenimiento al que ves una vez al mes no es lo mismo que un cliente que te llama cada semana con urgencias. Y en modo construcci&#243;n, deber&#237;as aspirar a tener solo clientes del primer tipo.</p><h2>C&#243;mo Aplicarlo: El Caso de un Operador Cualquiera</h2><p>Pongamos que eres un solo-operator. Tienes 5 clientes de servicio que te generan ingresos recurrentes. Cada uno consume 2 unidades de atenci&#243;n al mes (entregas mensuales con revisiones).</p><p>Est&#225;s usando 10 de tus 12 unidades de atenci&#243;n disponibles. No puedes construir producto. No tienes margen.</p><p>Tu objetivo: llegar a 7 clientes de servicio que consuman menos de 1 unidad de atenci&#243;n cada uno. Productizas la entrega. Automatizas el reporting. Pones un chatbot de IA para el soporte b&#225;sico.</p><p>De repente, con 7 clientes consumes solo 5 unidades de atenci&#243;n. Tienes 7 libres para producto.</p><p><strong>*Has encontrado tu solo-revenue floor.</strong>*</p><p>No es un n&#250;mero de clientes. Es una relaci&#243;n entre ingresos, atenci&#243;n y capacidad de construcci&#243;n.</p><p>Y este es el punto que la mayor&#237;a no entiende: puedes tener m&#225;s clientes y menos carga de atenci&#243;n. La clave no es reducir clientes. Es reducir la atenci&#243;n que cada cliente consume. Por eso la productizaci&#243;n del servicio no es opcional: es el mecanismo que te permite escalar tu capacidad de atenci&#243;n sin escalar tu tiempo.</p><p>Imagina el caso contrario. Tienes 4 clientes, pero cada uno consume 3 unidades de atenci&#243;n porque son proyectos personalizados con entregas semanales y revisiones constantes. Est&#225;s usando 12 de 12 unidades. No tienes margen para nada. Est&#225;s atrapado. Ganas suficiente dinero para vivir, pero no tienes ni un minuto para construir otra cosa.</p><p>Ese es el infierno del que nadie habla: tener ingresos suficientes pero cero libertad. Y la libertad no la da el dinero: la da la atenci&#243;n no comprometida.</p><h2>El Orden Correcto: Primero Factura, Luego Construye</h2><p>El framework se resume en tres pasos. Hazlos en orden. No te saltes ninguno.</p><p><strong>Paso 1:</strong> Consigue suficientes clientes de servicio que cubran tu piso de supervivencia &#215; 1.5.</p><p>No empieces a construir hasta que este paso est&#233; consolidado. Y "consolidado" significa que los ingresos llevan entrando al menos dos meses de forma consistente. No vale un mes bueno seguido de otro malo. Necesitas ver el patr&#243;n.</p><p><strong>Paso 2:</strong> A&#241;ade un 30% m&#225;s de clientes para cubrir el abandono durante la fase de construcci&#243;n.</p><p>Este paso es el que m&#225;s duele porque requiere vender m&#225;s cuando ya tienes suficiente. Pero es precisamente ese excedente el que te da la tranquilidad para construir. Sin &#233;l, cada cliente que se va es una emergencia. Con &#233;l, es un dato m&#225;s.</p><p><strong>Paso 3:</strong> Automatiza la entrega de esos clientes hasta que consuman menos de la mitad de tu capacidad de atenci&#243;n.</p><p>Invierte el tiempo que sea necesario en productizar: plantillas, procesos documentados, chatbots, dashboards automatizados, informes generados autom&#225;ticamente. Cada hora que inviertas aqu&#237; te devuelve horas de atenci&#243;n para construir producto.</p><p>Solo entonces abre el editor de c&#243;digo.</p><p>Y cuando lo hagas, establece un per&#237;odo de construcci&#243;n con fecha de finalizaci&#243;n. No puedes estar construyendo para siempre. Tres meses es un buen l&#237;mite. Si en tres meses no has lanzado nada, algo est&#225; mal en tu enfoque. O tu producto es demasiado grande, o no est&#225;s priorizando bien, o en realidad no necesitas ese producto.</p><h2>No Construyas Tu Castillo Sobre Arena</h2><p>El LinkedIn de 2026 premia la consistencia. Los LLM y agentes de IA aceleran la construcci&#243;n de producto. Las Edge Functions permiten desplegar en minutos. Nunca ha sido m&#225;s f&#225;cil lanzar software.</p><p><strong>*Pero la facilidad para construir es una trampa si no tienes el suelo bajo los pies.</strong>*</p><p>El solo-revenue floor no es un concepto te&#243;rico. Es la l&#237;nea roja que separa al operador que construye con calma del que construye con el agua al cuello.</p><p>Yo lo aprend&#237; con mi peque de seis meses y cuatro horas diarias en el taller de pintura. Cuando construyes con tiempo limitado, no puedes permitirte el lujo de adivinar. Necesitas certezas.</p><p><strong>*La certeza de que, pase lo que pase con tu producto, los clientes de servicio siguen pagando las facturas.</strong>*</p><p>La certeza de que tienes margen para iterar, equivocarte, y volver a intentarlo.</p><p>Esa certeza se llama solo-revenue floor.</p><p>Y no es un n&#250;mero bonito en una hoja de c&#225;lculo. Es el permiso que te das a ti mismo para construir sin miedo.</p><p>Cada vez que veo a un operador solo lanzando un producto sin tener este piso resuelto, s&#233; lo que va a pasar. No porque sea adivino, sino porque lo he vivido cuatro veces. Y las cuatro veces que lo hice sin piso, el proyecto muri&#243;. Las tres veces que esper&#233; a tenerlo, el proyecto sobrevivi&#243;.</p><p>No es complicado. Es disciplina. Tener el n&#250;mero claro. No saltarse los pasos. Y recordar que, cuando trabajas solo, tu atenci&#243;n es tu activo m&#225;s valioso. Prot&#233;gela como si de ella dependiera tu proyecto. Porque as&#237; es.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/solo-revenue-floor-clientes-minimos-antes-de-producto-20260531?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Memory Architecture para AI Agents en 2026: Cómo Diseñar Sistemas de Memoria a Corto, Largo Plazo y Episódica que Persistan Contexto Entre Sesiones]]></title><description><![CDATA[Aprende a dise&#241;ar short-term, long-term y episodic memory para AI agents con ChromaDB y SQLite. El framework de 3 capas que elimina la amnesia de tus agents.]]></description><link>https://newsletter.brianmenagomez.com/p/memory-architecture-para-ai-agents</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/memory-architecture-para-ai-agents</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Sat, 30 May 2026 07:00:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3620ec55-7849-431d-9f4e-00c9b7762690_1080x810.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 90% de los AI Agents Son Amn&#233;sicos por Dise&#241;o, No por Limitaci&#243;n T&#233;cnica</strong></h2><p>Imagina contratar a un empleado que olvida todo lo que hizo ayer cada ma&#241;ana.</p><p>Que no recuerda que ya probasteis la soluci&#243;n X y fall&#243;. Que cada conversaci&#243;n empieza desde cero. Que repite los mismos errores una y otra vez.</p><p>Eso es exactamente lo que estamos haciendo con el 90% de los AI agents hoy.</p><p>Los entrenamos en benchmarks de inteligencia. Razonamiento, coding, matem&#225;ticas. Pero les negamos el derecho a recordar.</p><p><strong>*El verdadero cuello de botella no es la inteligencia del modelo. Es la arquitectura de memoria que persiste contexto entre sesiones.</strong> *</p><p>GPT-4, Claude, Gemini &#8212; todos son igual de amn&#233;sicos. El problema no es el cerebro del agente. Es que nadie le est&#225; construyendo un sistema de memoria externo.</p><p>Y en 2026, si tu agente no recuerda lo que hizo hace cinco minutos, es funcionalmente in&#250;til para cualquier tarea del mundo real que requiera persistencia.</p><h2><strong>La Amnesia Estructural de los LLMs: Por Qu&#233; el Contexto No Es Suficiente</strong></h2><p>Los LLMs no tienen memoria inherente.</p><p>Cada invocaci&#243;n comienza desde cero a menos que inyectes expl&#237;citamente el historial. Y aqu&#237; es donde la mayor&#237;a de desarrolladores meten la pata.</p><p>&#10060; <strong>El enfoque equivocado</strong>: meter toda la ventana de contexto del modelo como memoria. "El modelo soporta 200k tokens, pues le paso todo el historial."</p><p>&#9989; <strong>El enfoque real</strong>: memoria selectiva, estructurada en capas, con retrieval optimizado. No m&#225;s contexto bruto &#8212; mejor contexto relevante.</p><p>Los modelos sufren de <em>lost in the middle</em>: la informaci&#243;n en el centro de ventanas largas se pierde. Adem&#225;s, el coste cuadr&#225;tico de atenci&#243;n hace que ventanas enormes sean prohibitivamente caras.</p><p><strong>*La memoria selectiva y estructurada siempre gana a la memoria bruta.</strong> *</p><h2><strong>El Framework de 3 Capas: Short-Term, Long-Term y Episodic Memory</strong></h2><p>La soluci&#243;n no es un &#250;nico sistema de memoria. Son tres capas independientes que trabajan juntas.</p><h3><strong>1. Short-Term Memory (Working Memory): El Buffer de Contexto Inmediato</strong></h3><p>Es la memoria de trabajo del agente. El contexto inmediato de la conversaci&#243;n actual.</p><p>Pero no se trata solo de recortar tokens viejos. Hay que decidir qu&#233; se evicciona primero.</p><p>Una estrategia naive elimina los mensajes m&#225;s antiguos. Eso puede borrar informaci&#243;n cr&#237;tica: instrucciones del usuario, decisiones clave, contexto de una tarea en curso.</p><p>La soluci&#243;n es rankear por relevancia sem&#225;ntica, no por orden cronol&#243;gico.</p><p>```python</p><p>import tiktoken</p><p>from collections import deque</p><p>from typing import List, Dict</p><p>class ShortTermMemory:</p><p>\"\"\"Buffer circular con evicci&#243;n por relevancia sem&#225;ntica\"\"\"</p><p>def __init__(self, max_tokens: int = 4000):</p><p>self.max_tokens = max_tokens</p><p>self.buffer: deque = deque()</p><p>self.encoder = tiktoken.get_encoding("cl100k_base")</p><p>def add(self, message: Dict[str, str], priority: int = 0):</p><p>\"\"\"A&#241;ade un mensaje con prioridad. Prioridad alta = menos probable de ser eviccionado.\"\"\"</p><p>self.buffer.append({"message": message, "priority": priority})</p><p>self._evict_if_needed()</p><p>def _evict_if_needed(self):</p><p>\"\"\"Evicciona mensajes de menor prioridad si se supera el l&#237;mite de tokens\"\"\"</p><p>while self._total_tokens() &gt; self.max_tokens:</p><h1>Encuentra el mensaje de menor prioridad (no cr&#237;tico)</h1><p>lowest = min(self.buffer, key=lambda x: x["priority"])</p><p>self.buffer.remove(lowest)</p><p>def _total_tokens(self) -&gt; int:</p><p>total = 0</p><p>for item in self.buffer:</p><p>content = f"{item['message']['role']}: {item['message']['content']}"</p><p>total += len(self.encoder.encode(content))</p><p>return total</p><p>def get_context(self) -&gt; List[Dict[str, str]]:</p><p>return [item["message"] for item in self.buffer]</p><p>```</p><p>El truco est&#225; en las prioridades. Las instrucciones del sistema tienen prioridad m&#225;xima. Los mensajes del usuario que contienen decisiones clave, prioridad alta. El chit-chat, prioridad baja.</p><h3><strong>2. Long-Term Memory (Persistent Knowledge): Vectorizar para Recordar</strong></h3><p>Esta capa responde a: <em>&#191;qu&#233; s&#233; yo sobre este usuario?</em></p><p>Hechos, preferencias, datos hist&#243;ricos. Se almacena en una base de datos vectorial y se recupera autom&#225;ticamente al inicio de cada sesi&#243;n.</p><p>Usamos ChromaDB por simplicidad local. Qdrant si necesitas escalar.</p><p>```python</p><p>import chromadb</p><p>from chromadb.utils import embedding_functions</p><p>class LongTermMemory:</p><p>\"\"\"Memoria persistente con retrieval sem&#225;ntico\"\"\"</p><p>def __init__(self, collection_name: str = "user_memory"):</p><p>self.client = chromadb.Client()</p><p>self.collection = self.client.get_or_create_collection(</p><p>name=collection_name,</p><p>embedding_function=embedding_functions.DefaultEmbeddingFunction()</p><p>)</p><p>def store_interaction(self, user_id: str, interaction: str, metadata: dict = None):</p><p>\"\"\"Vectoriza y almacena una interacci&#243;n clave\"\"\"</p><p>self.collection.add(</p><p>documents=[interaction],</p><p>metadatas=[metadata or {}],</p><p>ids=[f"{user_id}_{hash(interaction)}"]</p><p>)</p><p>def retrieve_relevant(self, user_id: str, query: str, n_results: int = 5) -&gt; list:</p><p>\"\"\"Recupera las interacciones m&#225;s relevantes para el contexto actual\"\"\"</p><p>results = self.collection.query(</p><p>query_texts=[query],</p><p>n_results=n_results,</p><p>where={"user_id": user_id}</p><p>)</p><p>return results["documents"][0] if results["documents"] else []</p><p>```</p><p>Cada interacci&#243;n significativa se vectoriza. Al inicio de cada sesi&#243;n, injectas las 3-5 m&#225;s relevantes al contexto del LLM.</p><p><strong>*El retrieval pipeline es el nuevo cuello de botella.</strong> * Tener 10 millones de experiencias no sirve de nada si no puedes recuperar las 3 m&#225;s relevantes en tiempo real.</p><p>Usa &#237;ndices HNSW en tu vector database. Un retrieval optimizado a&#241;ade ~50-100ms. Aceptable para mantener la fluidez.</p><h3><strong>3. Episodic Memory: Aprender de Experiencias Pasadas</strong></h3><p>Esta es la capa que diferencia a los agents mediocres de los que realmente aprenden.</p><p>La memoria epis&#243;dica responde a: <em>&#191;qu&#233; ha pasado antes en esta relaci&#243;n?</em></p><p>No solo almacena hechos. Almacena experiencias.</p><ul><li><p>La &#250;ltima vez que el usuario pidi&#243; X, eligi&#243; Y.</p></li><li><p>La soluci&#243;n A funcion&#243;, la soluci&#243;n B fall&#243;.</p></li><li><p>El usuario prefiere respuestas concisas por la ma&#241;ana y detalladas por la tarde.</p></li></ul><p>Sin memoria epis&#243;dica, el agente trata cada interacci&#243;n como un primer encuentro. Imposibilita construir rapport o contexto progresivo.</p><p>```python</p><p>import sqlite3</p><p>import json</p><p>from datetime import datetime</p><p>class EpisodicMemory:</p><p>\"\"\"Memoria epis&#243;dica con metadatos temporales y outcomes\"\"\"</p><p>def __init__(self, db_path: str = "episodic_memory.db"):</p><p>self.conn = sqlite3.connect(db_path)</p><p>self._create_table()</p><p>def _create_table(self):</p><p>self.conn.execute("""</p><p>CREATE TABLE IF NOT EXISTS episodes (</p><p>id INTEGER PRIMARY KEY AUTOINCREMENT,</p><p>user_id TEXT NOT NULL,</p><p>timestamp TEXT NOT NULL,</p><p>context TEXT NOT NULL,</p><p>action TEXT NOT NULL,</p><p>outcome TEXT NOT NULL,</p><p>user_feedback TEXT,</p><p>metadata TEXT</p><p>)</p><p>""")</p><p>self.conn.commit()</p><p>def store_episode(self, user_id: str, context: str, action: str,</p><p>outcome: str, user_feedback: str = None):</p><p>\"\"\"Almacena una experiencia completa\"\"\"</p><p>self.conn.execute(</p><p>"INSERT INTO episodes (user_id, timestamp, context, action, outcome, user_feedback) "</p><p>"VALUES (?, ?, ?, ?, ?, ?)",</p><p>(user_id, datetime.now().isoformat(), context, action, outcome, user_feedback)</p><p>)</p><p>self.conn.commit()</p><p>def get_similar_episodes(self, user_id: str, context_query: str, limit: int = 3) -&gt; list:</p><p>\"\"\"Recupera episodios relevantes por patr&#243;n de contexto\"\"\"</p><h1>En producci&#243;n usar&#237;as embeddings. Aqu&#237; b&#250;squeda por keyword como ejemplo.</h1><p>cursor = self.conn.execute(</p><p>"SELECT * FROM episodes WHERE user_id = ? ORDER BY timestamp DESC LIMIT ?",</p><p>(user_id, limit)</p><p>)</p><p>return cursor.fetchall()</p><p>```</p><p>La clave est&#225; en el campo `outcome`. Cuando el agente almacena no solo lo que hizo, sino si funcion&#243; o no, puede evitar repetir errores.</p><p>Un agente de soporte t&#233;cnico con memoria epis&#243;dica:</p><ul><li><p>Recuerda que el usuario ya prob&#243; el paso A y fall&#243;.</p></li><li><p>No sugiere la misma soluci&#243;n fallida.</p></li><li><p>Pasa directamente al paso alternativo.</p></li></ul><p>Esto no es un problema de razonamiento. Es un problema de arquitectura de memoria.</p><h2><strong>Integrando las 3 Capas: El Gestor de Memoria Unificado</strong></h2><p>Cada capa por separado es &#250;til. Juntas, son transformadoras.</p><p>```python</p><p>from typing import List, Dict</p><p>class MemoryManager:</p><p>\"\"\"Gestor unificado de las 3 capas de memoria\"\"\"</p><p>def __init__(self):</p><p>self.short_term = ShortTermMemory(max_tokens=4000)</p><p>self.long_term = LongTermMemory()</p><p>self.episodic = EpisodicMemory()</p><p>def prepare_context(self, user_id: str, current_query: str) -&gt; List[Dict[str, str]]:</p><p>\"\"\"Prepara el contexto &#243;ptimo para la invocaci&#243;n del LLM\"\"\"</p><h1>1. Contexto inmediato de la conversaci&#243;n actual</h1><p>working_context = self.short_term.get_context()</p><h1>2. Conocimiento persistente del usuario</h1><p>relevant_knowledge = self.long_term.retrieve_relevant(user_id, current_query)</p><h1>3. Lecciones de experiencias pasadas</h1><p>past_episodes = self.episodic.get_similar_episodes(user_id, current_query)</p><h1>Construir el contexto enriquecido</h1><p>augmented_context = []</p><h1>Inyectar conocimiento de largo plazo como system context</h1><p>if relevant_knowledge:</p><p>augmented_context.append({</p><p>"role": "system",</p><p>"content": f"Informaci&#243;n relevante del usuario: {' '.join(relevant_knowledge)}"</p><p>})</p><h1>Inyectar lecciones epis&#243;dicas</h1><p>if past_episodes:</p><p>lessons = self._format_episodes(past_episodes)</p><p>augmented_context.append({</p><p>"role": "system",</p><p>"content": f"Experiencias previas relevantes: {lessons}"</p><p>})</p><h1>A&#241;adir el contexto de trabajo actual</h1><p>augmented_context.extend(working_context)</p><p>return augmented_context</p><p>def record_interaction(self, user_id: str, query: str, response: str,</p><p>outcome: str, feedback: str = None):</p><p>\"\"\"Registra la interacci&#243;n en todas las capas\"\"\"</p><h1>Short-term se actualiza autom&#225;ticamente</h1><p>self.short_term.add({"role": "user", "content": query}, priority=5)</p><p>self.short_term.add({"role": "assistant", "content": response}, priority=3)</p><h1>Long-term: vectorizar si es informaci&#243;n relevante</h1><p>if len(query) &gt; 20:  # Umbral de relevancia</p><p>self.long_term.store_interaction(user_id, f"Q: {query} A: {response}")</p><h1>Episodic: almacenar la experiencia completa</h1><p>self.episodic.store_episode(user_id, query, response, outcome, feedback)</p><p>```</p><p>El gestor decide qu&#233; inyectar en cada invocaci&#243;n seg&#250;n la tarea actual. No todo el historial &#8212; solo lo relevante.</p><h2><strong>Por Qu&#233; Esto No Es un Problema de Modelos, Sino de Arquitectura</strong></h2><p>La obsesi&#243;n con benchmarks de inteligencia ha cegado a la industria.</p><p>Cada nuevo modelo promete mejor razonamiento, mejor coding, mejor seguimiento de instrucciones. Y s&#237;, son mejores. Pero todos son igual de amn&#233;sicos.</p><p><strong>*Un agente que no recuerda lo que hizo hace 5 minutos es funcionalmente in&#250;til para cualquier tarea que requiera persistencia.</strong> *</p><p>El 90% de los casos de uso reales requieren continuidad:</p><ul><li><p>Soporte t&#233;cnico multi-turno.</p></li><li><p>Asistentes de ventas con seguimiento.</p></li><li><p>Agentes personales que aprenden de tus preferencias.</p></li><li><p>Sistemas de onboarding que recuerdan d&#243;nde se qued&#243; el usuario.</p></li></ul><p>Sin arquitectura de memoria, estos casos de uso colapsan.</p><h2><strong>C&#243;mo Empezar Hoy</strong></h2><p>No necesitas un modelo m&#225;s grande. Necesitas mejor arquitectura de memoria.</p><p><strong>Primero</strong>: audita la amnesia actual. Identifica qu&#233; informaci&#243;n cr&#237;tica se pierde entre sesiones de tu agente.</p><p><strong>Segundo</strong>: implementa la capa de Short-Term Memory con evicci&#243;n por relevancia, no por orden cronol&#243;gico. Es la m&#225;s f&#225;cil y la que m&#225;s impacto inmediato da.</p><p><strong>Tercero</strong>: a&#241;ade Long-Term Memory con ChromaDB o Qdrant. Vectoriza las interacciones clave y haz retrieval autom&#225;tico al inicio de cada sesi&#243;n.</p><p><strong>Cuarto</strong>: incorpora la capa epis&#243;dica con SQLite. Cada experiencia debe incluir timestamp, outcome y user feedback. Ah&#237; est&#225; el aprendizaje real.</p><p><strong>Quinto</strong>: integra las tres capas en un solo gestor de memoria que decida qu&#233; inyectar en cada invocaci&#243;n seg&#250;n la tarea.</p><p><strong>*El futuro de los AI agents no est&#225; en modelos m&#225;s inteligentes. Est&#225; en agents que recuerdan.</strong> *</p><p>La pregunta no es si tu agente puede razonar mejor. La pregunta es: &#191;va a recordar lo que hizo ayer?</p><p>Si la respuesta es no, tienes un problema de arquitectura. Y ya sabes c&#243;mo solucionarlo.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/memory-architecture-ai-agents-2026-20260530?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Tu 'Supervisor' de Agentes Es un Microgestor Disfrazado: Por Qué el Patrón de Orquestación Más Usado Fracasa en SMBs]]></title><description><![CDATA[El 90% de los supervisores de agentes microgestionan en vez de delegar. Aprende el Marco de Delegaci&#243;n por Intenci&#243;n para construir sistemas que s&#237; funcionan en SMBs.]]></description><link>https://newsletter.brianmenagomez.com/p/tu-supervisor-de-agentes-es-un-microgestor</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/tu-supervisor-de-agentes-es-un-microgestor</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Sat, 30 May 2026 07:00:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/386d70c9-9c4e-4d44-823c-2012ea1e290e_1080x721.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Tu 'Supervisor' de Agentes Es un Microgestor Disfrazado</strong></h2><p>Crees que construir un supervisor de agentes es cuesti&#243;n de l&#243;gica program&#225;tica. State machines. Grafos ac&#237;clicos dirigidos. If-else anidados. Workflows definidos paso a paso.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 90% de los equipos que implementan el patr&#243;n supervisor construyen exactamente lo contrario de lo que deber&#237;an: <strong>microgestores de software</strong>.</p><p>Un gerente real no le dice a su equipo "escribe el primer p&#225;rrafo, ahora busca la fuente, ahora dale formato". Le dice: "necesito un informe sobre X para el viernes". Define el <em>qu&#233;</em>. El equipo decide el <em>c&#243;mo</em>.</p><p>Tu supervisor de agentes deber&#237;a funcionar igual. Pero has construido un jefe que respira en la nuca de sus sub-agentes.</p><p>---</p><h2><strong>El Error No Es T&#233;cnico. Es de Dise&#241;o.</strong></h2><h3><strong>Lo que la mayor&#237;a cree</strong></h3><p>El patr&#243;n supervisor se explica as&#237;: un agente "supervisor" que orquesta varios sub-agentes especializados. Cada sub-agente hace una tarea concreta. El supervisor decide qui&#233;n hace qu&#233; y en qu&#233; orden.</p><p>Suena limpio. Suena profesional.</p><p>Pero la implementaci&#243;n t&#237;pica es un desastre.</p><p>La mayor&#237;a construye supervisores con <strong>DAGs (grafos ac&#237;clicos dirigidos)</strong> o <strong>state machines</strong>. Definen nodos. Conectan aristas. Establecen condiciones de transici&#243;n. El resultado es un monstruo de l&#243;gica secuencial que:</p><ul><li><p>Se rompe si un sub-agente devuelve algo inesperado.</p></li><li><p>Requiere recompilar todo el grafo para a&#241;adir un nuevo sub-agente.</p></li><li><p>Microgestiona cada paso como si los sub-agentes fueran becarios sin criterio.</p></li></ul><p>&#10060; <strong>Supervisor t&#237;pico (microgestor):</strong></p><ul><li><p>Define paso 1, paso 2, paso 3 secuencialmente.</p></li><li><p>Asume que cada paso se completa correctamente.</p></li><li><p>Si algo falla, el grafo entero se para.</p></li><li><p>Cambiar la l&#243;gica requiere modificar c&#243;digo y redeployar.</p></li></ul><p>&#9989; <strong>Supervisor efectivo (delegador):</strong></p><ul><li><p>Recibe un objetivo de alto nivel.</p></li><li><p>Decide qu&#233; sub-agentes invocar seg&#250;n el contexto.</p></li><li><p>Eval&#250;a resultados antes de decidir el siguiente paso.</p></li><li><p>Puede re-planificar si un sub-agente falla.</p></li></ul><h3><strong>Lo contraintuitivo</strong></h3><p>El supervisor m&#225;s robusto que he visto en producci&#243;n para SMBs no tiene l&#243;gica program&#225;tica r&#237;gida. Es un <strong>LLM con un prompt bien dise&#241;ado</strong> que delega intenciones de alto nivel a sub-agentes especializados.</p><p>Cada sub-agente decide <em>c&#243;mo</em> ejecutar. El supervisor solo decide <em>qu&#233;</em> se necesita y <em>qui&#233;n</em> lo hace.</p><p>La complejidad se traslada del c&#243;digo al prompt. Y eso, para una SMB sin equipo de ML, es una ventaja, no una limitaci&#243;n.</p><p>---</p><h2><strong>La Evidencia: El Caso del Supervisor que Delegaba Intenciones</strong></h2><p>Constru&#237; un sistema de orquestaci&#243;n para un flujo de facturaci&#243;n recurrente. Un supervisor recib&#237;a consultas como: "necesito una factura para el cliente X con los datos de la &#250;ltima reuni&#243;n".</p><p>El supervisor no ten&#237;a un grafo predefinido con pasos. Ten&#237;a acceso a tres sub-agentes:</p><p>1. <strong>Agente CRM</strong> &#8212; buscaba datos del cliente.</p><p>2. <strong>Agente de notas</strong> &#8212; recuperaba el resumen de la &#250;ltima reuni&#243;n.</p><p>3. <strong>Agente de generaci&#243;n PDF</strong> &#8212; ensamblaba y emit&#237;a la factura.</p><p>El supervisor no decid&#237;a el orden. Decid&#237;a la intenci&#243;n: "esto requiere datos de cliente, contexto de reuni&#243;n y generaci&#243;n de documento". Llamaba a los sub-agentes seg&#250;n lo que el contexto demandaba.</p><p>El resultado: el mismo supervisor manejaba consultas que no hab&#237;a visto antes sin tocar una l&#237;nea de c&#243;digo. Si llegaba "quiero una factura pero solo con los datos fiscales, sin notas de reuni&#243;n", el supervisor omit&#237;a el agente de notas autom&#225;ticamente.</p><p><strong>*Eso no pasa con un DAG predefinido.</strong>*</p><p>---</p><h2><strong>El Marco: El Patr&#243;n de Delegaci&#243;n por Intenci&#243;n</strong></h2><p>He llamado a esto el <strong>Marco de Delegaci&#243;n por Intenci&#243;n</strong>. Son 5 pasos. No necesitas LangChain, ni CrewAI, ni un grafo de nodos. Necesitas un prompt bien escrito y herramientas bien definidas.</p><h3><strong>Paso 1: Define los l&#237;mites de cada sub-agente</strong></h3><p>Cada sub-agente debe tener una <strong>tool description</strong> clara que el supervisor pueda leer. No escribas "este agente busca clientes". Escribe:</p><p>```</p><p>Busca clientes en el CRM por nombre o NIF.</p><p>Devuelve: id_cliente, nombre, email, direcci&#243;n fiscal.</p><p>Si no encuentra coincidencias exactas, devuelve las 3 m&#225;s probables.</p><p>No modifica datos del CRM.</p><p>```</p><p>El supervisor necesita saber qu&#233; puede esperar de cada sub-agente. Si la descripci&#243;n es vaga, el supervisor improvisar&#225;. Y improvisar con LLMs sale caro.</p><h3><strong>Paso 2: Dise&#241;a el prompt del supervisor como un cerebro ejecutivo</strong></h3><p>El prompt del supervisor NO es una lista de pasos. Es una declaraci&#243;n de:</p><ul><li><p><strong>Objetivo</strong>: qu&#233; se espera del sistema en conjunto.</p></li><li><p><strong>Recursos</strong>: qu&#233; sub-agentes est&#225;n disponibles y qu&#233; hace cada uno.</p></li><li><p><strong>Reglas de derivaci&#243;n</strong>: cu&#225;ndo escalar a un humano.</p></li></ul><p>Ejemplo m&#237;nimo de c&#243;mo se estructura el prompt:</p><p>```python</p><p>SUPERVISOR_PROMPT = """</p><p>Eres un supervisor de operaciones administrativas.</p><p>Tu objetivo es completar tareas del usuario delegando a los sub-agentes disponibles.</p><p>Sub-agentes disponibles:</p><ul><li><p>buscar_cliente: busca clientes en el CRM</p></li><li><p>recuperar_notas: obtiene el resumen de la &#250;ltima reuni&#243;n con un cliente</p></li><li><p>generar_pdf: crea y env&#237;a una factura en PDF</p></li></ul><p>Reglas:</p><ul><li><p>Si un sub-agente no encuentra datos, intenta con otra estrategia antes de escalar.</p></li><li><p>Si despu&#233;s de 2 intentos no hay soluci&#243;n, escala al humano con un resumen del problema.</p></li><li><p>No preguntes al usuario pasos intermedios. Resuelve y presenta el resultado final.</p></li></ul><p>El usuario te dir&#225; qu&#233; necesita. T&#250; decides qu&#233; sub-agentes usar y en qu&#233; orden.</p><p>"""</p><p>```</p><p>Sin if-else. Sin grafos. Sin state machines.</p><h3><strong>Paso 3: Implementa el bucle de verificaci&#243;n</strong></h3><p>El supervisor no debe asumir que un sub-agente devolvi&#243; lo correcto. Debe <strong>verificar</strong> antes de pasar al siguiente paso.</p><p>Ejemplo en pseudoc&#243;digo:</p><p>```python</p><p>def ejecutar_tarea(consulta_usuario):</p><p>plan = supervisor.decide_subagentes(consulta_usuario)</p><p>resultados = {}</p><p>for subagente in plan:</p><p>resultado = subagente.ejecutar()</p><h1>El supervisor eval&#250;a si el resultado es v&#225;lido</h1><p>if not supervisor.verificar_resultado(resultado):</p><h1>Re-planifica: &#191;otro subagente? &#191;misma tarea con par&#225;metros diferentes?</h1><p>nuevo_plan = supervisor.replanificar(consulta_usuario, resultados)</p><p>if not nuevo_plan:</p><p>return escalar_a_humano(resultados)</p><p>resultados.update(ejecutar_tarea_parcial(nuevo_plan))</p><p>else:</p><p>resultados[subagente.id] = resultado</p><p>return resultados</p><p>```</p><p>El bucle de verificaci&#243;n es lo que separa un supervisor robusto de uno fr&#225;gil. Sin &#233;l, cualquier error de un sub-agente propaga al resultado final.</p><h3><strong>Paso 4: Establece el mecanismo de fallback humano</strong></h3><p>El supervisor debe saber cu&#225;ndo rendirse. No hay nada peor que un agente dando vueltas en c&#237;rculos gastando tokens.</p><p>Reglas claras:</p><ul><li><p>Si un sub-agente falla dos veces seguidas, escala.</p></li><li><p>Si el resultado no pasa validaciones b&#225;sicas (formato, campos obligatorios), escala.</p></li><li><p>Si el usuario pide algo que ning&#250;n sub-agente puede hacer, escala.</p></li></ul><p>El fallback humano debe ser expl&#237;cito: un canal de Slack, un email, un webhook. No un "lo intentar&#233; m&#225;s tarde" que se queda en el aire.</p><h3><strong>Paso 5: Mide la tasa de delegaci&#243;n exitosa</strong></h3><p>Cada vez que el supervisor escala a un humano, es un fracaso del sistema. Pero tambi&#233;n es datos.</p><p>Mide:</p><ul><li><p><strong>Tasa de delegaci&#243;n exitosa</strong>: % de tareas completadas sin intervenci&#243;n humana.</p></li><li><p><strong>Motivos de escalado</strong>: &#191;qu&#233; tipo de consultas fuerzan el fallback? Ah&#237; tienes tu roadmap de mejora.</p></li><li><p><strong>Coste por tarea</strong>: cu&#225;ntos tokens consume cada ejecuci&#243;n completa.</p></li></ul><p>Si tu tasa de delegaci&#243;n exitosa est&#225; por debajo del 70%, el problema no es el supervisor. Es la definici&#243;n de los sub-agentes o la calidad de sus tool descriptions.</p><p>---</p><h2><strong>Por Qu&#233; las SMBs Se Benefician M&#225;s de Este Enfoque</strong></h2><p>Las grandes empresas tienen equipos de ML para debuggear cadenas de agentes complejas. Pueden permitirse 15 micro-agentes conectados con pipelines diferentes.</p><p>Las SMBs no.</p><p>Para una gestor&#237;a, un despacho de abogados o una asesor&#237;a freelance, el patr&#243;n supervisor debe ser:</p><ul><li><p><strong>Observable</strong>: saber en todo momento qu&#233; est&#225; haciendo el supervisor y por qu&#233;.</p></li><li><p><strong>Predecible</strong>: que no haga cosas raras porque el prompt tiene un fallo oculto.</p></li><li><p><strong>Mantenible</strong>: que lo pueda tocar el due&#241;o del negocio, no solo un ingeniero.</p></li></ul><p>Un supervisor con un solo prompt monol&#237;tico es m&#225;s f&#225;cil de auditar que 15 agentes encadenados. La simplicidad no es una limitaci&#243;n. <strong>*Es un feature.</strong>*</p><p>---</p><h2><strong>Los Riesgos Reales (y C&#243;mo Mitigarlos)</strong></h2><h3><strong>Latencia y coste</strong></h3><p>Cada llamada del supervisor a un sub-agente implica una ida y vuelta al LLM. Si el supervisor microgestiona ("&#191;terminaste?", "&#191;qu&#233; sigue?", "&#191;est&#225;s seguro?"), los costes se disparan.</p><p><strong>La soluci&#243;n no es t&#233;cnica. Es de dise&#241;o.</strong></p><p>El supervisor debe delegar <strong>tandas de trabajo completas</strong>, no pasos individuales. En vez de preguntar "busca el cliente" y esperar, debe decir "busca el cliente, recupera sus datos fiscales y prepara el borrador de factura". Un solo viaje de ida y vuelta.</p><h3><strong>Supervisores que improvisan demasiado</strong></h3><p>Un LLM sin restricciones puede inventar sub-agentes que no existen o tomar decisiones incorrectas.</p><p><strong>Soluci&#243;n h&#237;brida</strong>: reglas program&#225;ticas para decisiones cr&#237;ticas (seguridad, privacidad, validaci&#243;n de datos sensibles). Delegaci&#243;n al LLM para decisiones creativas o contextuales.</p><p>No es "todo LLM". Es un modelo h&#237;brido donde la l&#243;gica dura protege lo que no puede fallar.</p><p>---</p><h2><strong>Lo Que Nadie Te Dice del Patr&#243;n Supervisor</strong></h2><p>El patr&#243;n supervisor no es una capa jer&#225;rquica m&#225;s. Es el punto donde la mayor&#237;a de implementaciones fracasan porque confunden orquestaci&#243;n con control secuencial.</p><p>Un supervisor no necesita saberlo todo. Necesita saber a qui&#233;n preguntar.</p><p>Construyes un sistema de agentes para delegar trabajo, no para centralizar decisiones. Si tu supervisor decide cada micro-paso, has creado un cuello de botella m&#225;s caro y lento que el proceso manual que quer&#237;as reemplazar.</p><p>El mejor supervisor es el que menos decide. El que conf&#237;a en sus sub-agentes. El que delega intenciones, no instrucciones.</p><p><strong>*Eso no es solo buena arquitectura. Es buen management.</strong>*</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/supervisor-agentes-microgestor-patro-orquestacion-smb-20260530?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Claude Agent SDK Tutorial 2026: El Framework que Invalida Todo lo que Sabías sobre Agentes IA]]></title><description><![CDATA[Tutorial completo del Claude Agent SDK de Anthropic. Aprende a construir agentes IA en 40 l&#237;neas de c&#243;digo con tool use nativo. C&#243;digo, ejemplos y arquitectura real.]]></description><link>https://newsletter.brianmenagomez.com/p/claude-agent-sdk-tutorial-2026-el</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/claude-agent-sdk-tutorial-2026-el</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Fri, 29 May 2026 07:00:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/75a5530a-a84c-43ea-84d0-ef7390008ed1_1080x721.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>&#191;Y si te dijera que puedes reemplazar 300 l&#237;neas de LangChain con 40 l&#237;neas de Claude Agent SDK, y encima funciona mejor?</strong></h2><p>El secreto no est&#225; en el framework. Est&#225; en que Claude ya sabe c&#243;mo ser un agente.</p><p><strong>*Solo necesitas dejarle hacer su trabajo.</strong> *</p><p>La mayor&#237;a de la comunidad asume que construir agentes con LLMs requiere frameworks complejos. LangChain, AutoGPT, cadenas de pensamiento elaboradas, planners externos, memorias sofisticadas.</p><p>Todo eso era cierto... antes de que Claude 3.5+ llegara.</p><p>El Claude Agent SDK de Anthropic introduce una realidad inc&#243;moda para los que han invertido meses aprendiendo LangChain: <strong>*cuando el modelo tiene tool use nativo, la orquestaci&#243;n se reduce a 40 l&#237;neas.</strong> * No necesitas un planner separado. No necesitas chains. No necesitas memorias complejas.</p><p>El modelo mismo decide cu&#225;ndo y c&#243;mo usar herramientas.</p><p>Este tutorial te va a mostrar exactamente c&#243;mo funciona. Sin hype. Sin teor&#237;a. C&#243;digo que puedes copiar, pegar y llevar a producci&#243;n hoy.</p><p>---</p><h2><strong>&#10060; El Problema: Est&#225;s Construyendo Aviones con Instrucciones de Lego</strong></h2><p>Antes del Claude Agent SDK, construir agentes era un ejercicio de ingenier&#237;a inversa.</p><p>Los modelos base no estaban entrenados para tool use. Hab&#237;a que ense&#241;arles. Y para eso nacieron frameworks como LangChain, que a&#241;ad&#237;an capas de abstracci&#243;n para compensar lo que el modelo no sab&#237;a hacer por s&#237; mismo.</p><p>&#9989; <strong>El resultado t&#237;pico de un agente con API cruda de OpenAI:</strong></p><p>```python</p><h1>~150-200 l&#237;neas de boilerplate</h1><p>while not done:</p><p>response = openai.chat.completions.create(...)</p><h1>parsear JSON manualmente</h1><h1>manejar tool calls con try/except</h1><h1>implementar backoff exponencial</h1><h1>gestionar el historial manualmente</h1><h1>loop infinito si el modelo alucina</h1><p>```</p><p>Cada uno de esos pasos es una fuente de bugs. Cada capa de abstracci&#243;n es deuda t&#233;cnica que pagar&#225;s cuando el modelo actualice su API.</p><p><strong>*El verdadero problema no es la complejidad del agente. Es que est&#225;s construyendo infraestructura para compensar limitaciones que ya no existen.</strong> *</p><p>Claude 3.5+ fue entrenado con tool use como capacidad fundamental. No es un a&#241;adido. No es un parche. <strong>*El modelo entiende intr&#237;nsecamente c&#243;mo formatear tool calls, interpretar resultados y decidir el siguiente paso.</strong> *</p><p>Algo que otros modelos necesitan prompt engineering elaborado para lograr.</p><p>---</p><h2><strong>&#9989; La Soluci&#243;n: 40 L&#237;neas con Claude Agent SDK</strong></h2><p>Mira este contraste. Un agente funcional con la API cruda de Anthropic:</p><p>```python</p><h1>API cruda ~150 l&#237;neas</h1><p>import anthropic</p><p>client = anthropic.Anthropic()</p><p>messages = []</p><p>tools = [...]</p><p>while True:</p><p>response = client.messages.create(</p><p>model="claude-sonnet-4-20250514",</p><p>max_tokens=4096,</p><p>tools=tools,</p><p>messages=messages</p><p>)</p><p>if response.stop_reason == "tool_use":</p><p>for block in response.content:</p><p>if block.type == "tool_use":</p><p>result = execute_tool(block.name, block.input)</p><p>messages.append({"role": "user", "content": result})</p><p>else:</p><p>break</p><p>```</p><p>Ahora, el mismo agente con <strong>Claude Agent SDK</strong>:</p><p>```python</p><h1>~40 l&#237;neas &#8212; y funciona igual o mejor</h1><p>from claude_agent_sdk import Agent, tool</p><p>@tool</p><p>def buscar_pedido(pedido_id: str) -&gt; dict:</p><p>"""Busca un pedido por ID en el sistema"""</p><p>return db.query(f"SELECT * FROM pedidos WHERE id = '{pedido_id}'")</p><p>@tool</p><p>def cancelar_pedido(pedido_id: str) -&gt; bool:</p><p>"""Cancela un pedido activo"""</p><p>return db.execute(f"UPDATE pedidos SET estado = 'cancelado' WHERE id = '{pedido_id}'")</p><p>agent = Agent(</p><p>tools=[buscar_pedido, cancelar_pedido],</p><p>model="claude-sonnet-4-20250514"</p><p>)</p><p>respuesta = agent.run("Necesito cancelar mi pedido #1234")</p><p>print(respuesta)</p><p>```</p><p><strong>*El bucle de agente (think &#8594; act &#8594; observe) est&#225; implementado por defecto en el AgentExecutor.</strong> *</p><p>No tienes que escribir el while loop. No tienes que parsear tool calls. No tienes que gestionar el historial manualmente. El SDK maneja el ciclo completo de llamada-herramienta-resultado, incluyendo el enrutamiento de respuestas parciales.</p><p>La reducci&#243;n: de ~200 l&#237;neas de implementaci&#243;n manual a ~40 l&#237;neas con el SDK. Un 80% menos de c&#243;digo.</p><p>---</p><h2><strong>El Cambio Mental: Confiar en el Modelo, No en Tu Infraestructura</strong></h2><p>Aqu&#237; est&#225; el punto que la mayor&#237;a no entiende.</p><p>Con agentes tradicionales, el desarrollador defin&#237;a el flujo de decisi&#243;n. Un grafo DAG. Un planner-react. Una cadena de pasos expl&#237;cita.</p><p><strong>*Con Claude Agent SDK, el desarrollador define las herramientas y las reglas de negocio, pero el modelo decide el flujo.</strong> *</p><p>Esto no es una sutileza t&#233;cnica. Es un cambio fundamental en c&#243;mo dise&#241;amos sistemas.</p><p><strong>Ejemplo real:</strong> Un asistente de atenci&#243;n al cliente.</p><p>&#10060; <strong>Enfoque tradicional:</strong></p><p>1. Clasificador de intenci&#243;n del usuario</p><p>2. Router a handler espec&#237;fico</p><p>3. L&#243;gica condicional para casos compuestos</p><p>4. Generaci&#243;n de respuesta</p><p>5. Validaci&#243;n post-hoc</p><p>&#9989; <strong>Con Claude Agent SDK:</strong></p><p>1. Define herramientas: `buscar_pedido`, `cancelar`, `reembolsar`, `escalar`</p><p>2. Deja que Claude decida cu&#225;l usar basado en la conversaci&#243;n natural</p><p>3. El modelo maneja peticiones compuestas sin l&#243;gica condicional expl&#237;cita</p><p><strong>El resultado es un sistema m&#225;s flexible que maneja casos borde &#8212; como "quiero cancelar el pedido de ayer y reembolsarlo a mi otra tarjeta" &#8212; sin que hayas escrito ni una l&#237;nea de l&#243;gica condicional para ese caso concreto.</strong></p><p>---</p><h2><strong>M&#250;ltiples Herramientas en Paralelo: Donde el SDK Brilla</strong></h2><p>Uno de los superpoderes menos conocidos del Claude Agent SDK es su capacidad para manejar m&#250;ltiples herramientas de forma paralela y secuencial, con manejo de errores integrado.</p><p>```python</p><p>from claude_agent_sdk import Agent, tool</p><p>import httpx</p><p>@tool</p><p>def buscar_precios(producto: str) -&gt; list:</p><p>"""Busca precios de un producto en varias APIs"""</p><p>return httpx.get(f"https://api.precios.com/search?q={producto}").json()</p><p>@tool</p><p>def calcular_iva(precio_base: float) -&gt; float:</p><p>"""Calcula el IVA aplicable al precio base"""</p><p>return precio_base * 0.21</p><p>@tool</p><p>def guardar_cotizacion(producto: str, precio_final: float) -&gt; str:</p><p>"""Guarda una cotizaci&#243;n en la base de datos"""</p><p>return db.insert("cotizaciones", {"producto": producto, "precio": precio_final})</p><p>agent = Agent(</p><p>tools=[buscar_precios, calcular_iva, guardar_cotizacion],</p><p>model="claude-sonnet-4-20250514",</p><p>max_iterations=10</p><p>)</p><p>respuesta = agent.run(</p><p>"Busca el precio del MacBook Pro M4, calcula el IVA, "</p><p>"y guarda la cotizaci&#243;n en el sistema"</p><p>)</p><p>```</p><p>F&#237;jate en lo que no tienes que hacer:</p><ul><li><p>&#10060; Manejar dependencias entre tool calls manualmente</p></li><li><p>&#10060; Implementar reintentos con backoff exponencial</p></li><li><p>&#10060; Gestionar rate limits</p></li><li><p>&#10060; Parsear el JSON de respuesta del modelo</p></li><li><p>&#10060; Escribir un loop while con estado</p></li></ul><p><strong>*Todo eso viene incluido en el SDK.</strong> * El modelo decide el orden: primero busca precios, luego calcula IVA, luego guarda. Y si una llamada falla, el SDK reintenta autom&#225;ticamente.</p><p>---</p><h2><strong>Manejo de Errores y Rate Limits: El Infierno que el SDK Te Ahorra</strong></h2><p>Construir un agente manualmente significa implementar todo esto:</p><p>```python</p><h1>Implementaci&#243;n manual de backoff (solo esto son 30 l&#237;neas)</h1><p>import time</p><p>import random</p><p>def call_with_backoff(func, max_retries=5):</p><p>for attempt in range(max_retries):</p><p>try:</p><p>return func()</p><p>except RateLimitError:</p><p>wait = (2 ** attempt) + random.uniform(0, 1)</p><p>time.sleep(wait)</p><p>except ToolExecutionError as e:</p><p>if attempt == max_retries - 1:</p><p>raise</p><p>time.sleep(1)</p><p>raise MaxRetriesExceeded()</p><p>```</p><p>Con el SDK, esto ocurre debajo del cap&#243;:</p><p>```python</p><h1>El SDK maneja rate limits, timeouts, y reintentos autom&#225;ticamente</h1><p>@tool(max_retries=3, timeout=30)</p><p>def llamar_api_externa(endpoint: str) -&gt; dict:</p><p>"""Llama a una API externa con manejo de errores integrado"""</p><p>return httpx.get(endpoint).json()</p><p>```</p><p><strong>*El SDK incluye manejo autom&#225;tico de rate limits, timeouts, y reintentos para cada tool call.</strong> * Algo que en frameworks alternativos requiere configuraci&#243;n manual expl&#237;cita.</p><p>Y no solo eso. El SDK tambi&#233;n ofrece hooks para monitorizaci&#243;n:</p><p>```python</p><p>agent = Agent(</p><p>tools=[...],</p><p>on_tool_call=lambda name, args: log.info(f"Tool call: {name} con {args}"),</p><p>on_tool_result=lambda name, result: log.info(f"Resultado de {name}: {result}"),</p><p>on_error=lambda error: sentry.capture_exception(error)</p><p>)</p><p>```</p><p>Esto te permite ver exactamente qu&#233; decisiones est&#225; tomando el modelo, en tiempo real.</p><p>---</p><h2><strong>Comparaci&#243;n: Claude Agent SDK vs. LangChain vs. API Cruda</strong></h2><p>Para el mismo caso de uso &#8212; un agente que busca informaci&#243;n, la procesa y devuelve un resultado estructurado:</p><p>| Aspecto | API Cruda | LangChain | <strong>Claude Agent SDK</strong> |</p><p>|---------|-----------|-----------|----------------------|</p><p>| L&#237;neas de c&#243;digo | ~200-300 | ~100-150 | <strong>~40</strong> |</p><p>| Bucle agente | Manual | Abstra&#237;do (pero complejo) | <strong>Nativo</strong> |</p><p>| Manejo de errores | Manual | Parcial | <strong>Autom&#225;tico</strong> |</p><p>| Tool parsing | JSON manual | Chains + parsers | <strong>Decorador @tool</strong> |</p><p>| Dependencias entre tools | Manual | DAG complejo | <strong>Modelo decide</strong> |</p><p>| Curva de aprendizaje | Alta | Muy alta | <strong>Baja</strong> |</p><p><strong>*Cuando el modelo tiene tool use nativo, cada capa de abstracci&#243;n extra es deuda t&#233;cnica que pagas en bugs y complejidad.</strong> *</p><p>---</p><h2><strong>Objeci&#243;n: &#191;Y si quiero cambiar de proveedor de LLM?</strong></h2><p>Es la objeci&#243;n m&#225;s com&#250;n.</p><p>"Prefiero LangChain porque no me ata a un solo proveedor."</p><p>Es una preocupaci&#243;n v&#225;lida, pero la realidad es que la mayor&#237;a de los equipos que usan LangChain terminan optimizando para un solo proveedor de todas formas. Y pagan el precio de mantener abstracciones que no necesitan.</p><p><strong>*Si ya usas Claude, el SDK oficial reduce la complejidad, mejora el rendimiento y elimina la deuda t&#233;cnica de mantener capas que no usas.</strong> *</p><p>Adem&#225;s, nada impide usar Claude Agent SDK para el agente principal y tener sistemas espec&#237;ficos con otros proveedores para tareas concretas (embedding con OpenAI, validaci&#243;n con modelos locales, etc.).</p><p>No es una decisi&#243;n binaria. Es una decisi&#243;n de arquitectura.</p><p>---</p><h2><strong>Objeci&#243;n: &#191;Est&#225; el SDK lo suficientemente maduro?</strong></h2><p>El SDK es m&#225;s reciente que LangChain, s&#237;.</p><p>Pero Anthropic ha priorizado la calidad sobre la cantidad de features. Al ser m&#225;s peque&#241;o, tiene menos bugs, menos breaking changes, y una curva de aprendizaje m&#225;s suave.</p><p>La desventaja: hay menos ejemplos comunitarios y menos integraciones pre-construidas.</p><p><strong>*Sin embargo, para casos de uso est&#225;ndar &#8212; asistentes, automatizaci&#243;n, RAG con tools &#8212; es m&#225;s que suficiente.</strong> * Y al ser c&#243;digo abierto, puedes extenderlo si necesitas algo que no viene incluido.</p><p>---</p><h2><strong>El Marco de 3 Pasos para Empezar Hoy</strong></h2><h3><strong>Paso 1: Instalaci&#243;n y configuraci&#243;n b&#225;sica</strong></h3><p>```bash</p><p>pip install claude-agent-sdk</p><p>export ANTHROPIC_API_KEY="sk-ant-..."</p><p>```</p><p>Estructura b&#225;sica:</p><p>```python</p><p>from claude_agent_sdk import Agent</p><p>agent = Agent(model="claude-sonnet-4-20250514")</p><p>resultado = agent.run("Hola, &#191;c&#243;mo est&#225;s?")</p><p>print(resultado)</p><p>```</p><h3><strong>Paso 2: Define tus herramientas con @tool</strong></h3><p>El decorador `@tool` es la pieza central. La descripci&#243;n de cada herramienta es <strong>*cr&#237;tica para el rendimiento del modelo</strong>* &#8212; s&#233; espec&#237;fico:</p><p>```python</p><p>@tool</p><p>def buscar_cliente(email: str) -&gt; dict:</p><p>"""</p><p>Busca un cliente por su email en el CRM.</p><p>Devuelve nombre, ID, pedidos recientes y estado de cuenta.</p><p>El email debe ser exacto.</p><p>"""</p><p>return crm.query(f"SELECT * FROM clientes WHERE email = '{email}'")</p><p>```</p><h3><strong>Paso 3: Configura el AgentExecutor</strong></h3><p>```python</p><p>agent = Agent(</p><p>tools=[buscar_cliente, buscar_pedido, calcular_iva],</p><p>model="claude-sonnet-4-20250514",</p><p>max_iterations=15,       # l&#237;mite de ciclos agente-herramienta</p><p>parallel_tool_calls=True, # ejecuta herramientas en paralelo cuando sea posible</p><p>system_prompt="Eres un asistente de atenci&#243;n al cliente espa&#241;ol. Responde siempre con amabilidad y precisi&#243;n."</p><p>)</p><p>```</p><p>---</p><h2><strong>Lo que Nadie Te Cuenta del Claude Agent SDK</strong></h2><p>Dos detalles que marcan la diferencia en producci&#243;n:</p><p><strong>Primero: las descripciones de las herramientas son m&#225;s importantes que el c&#243;digo de las mismas.</strong> El modelo decide qu&#233; herramienta usar bas&#225;ndose en la descripci&#243;n que le das. Gasta tiempo en escribir descripciones precisas. Es la diferencia entre un agente que acierta el 90% de las veces y uno que acierta el 50%.</p><p><strong>Segundo: el SDK expone el &#225;rbol de decisiones del agente.</strong> Puedes inspeccionar cada paso, cada tool call, cada decisi&#243;n:</p><p>```python</p><p>respuesta = agent.run("Cancela mi pedido y reembolsa")</p><p>print(respuesta.trace)</p><h1>Muestra el &#225;rbol completo de decisiones del agente</h1><p>```</p><p>Esto no es magia. Es arquitectura bien dise&#241;ada.</p><p>---</p><h2><strong>El Futuro de los Agentes no Tiene Frameworks</strong></h2><p>El Claude Agent SDK representa algo m&#225;s grande que una herramienta.</p><p><strong>*Representa un cambio en c&#243;mo pensamos sobre los agentes.</strong> *</p><p>Durante a&#241;os, asumimos que construir agentes requer&#237;a capas de abstracci&#243;n porque los modelos no pod&#237;an manejar la complejidad por s&#237; mismos. LangChain, AutoGPT, y todos los frameworks que vinieron antes exist&#237;an para compensar las limitaciones de los modelos.</p><p>Pero Claude 3.5+ cambi&#243; las reglas.</p><p>Cuando el modelo ya sabe usar herramientas, planificar, y ejecutar ciclos agente-herramienta, la mayor&#237;a del c&#243;digo que escrib&#237;amos se vuelve redundante.</p><p><strong>*No necesitas m&#225;s framework. Necesitas menos framework.</strong> *</p><p>El trabajo del desarrollador no es orquestar cada decisi&#243;n del modelo. Es definir bien las herramientas, escribir descripciones precisas, y luego apartarse.</p><p>El resto, Claude lo sabe hacer mejor que t&#250;.</p><p>---</p><h2><strong>Resumen: Lo que Te Llevas</strong></h2><p>1. El Claude Agent SDK reduce el c&#243;digo de agente en un 60-80% comparado con alternativas</p><p>2. El tool use nativo de Claude elimina la necesidad de planners, chains y memorias externas</p><p>3. El manejo de errores, rate limits y reintentos viene integrado &#8212; no necesitas implementarlo</p><p>4. Las descripciones de tus herramientas son m&#225;s importantes que el c&#243;digo de las mismas</p><p>5. El SDK es m&#225;s peque&#241;o, m&#225;s r&#225;pido y m&#225;s predecible que frameworks generalistas</p><p><strong>Empieza hoy. 40 l&#237;neas. Un agente funcional. Cero boilerplate.</strong></p><p>Ese es el poder de trabajar con un modelo que ya sabe c&#243;mo ser un agente. Solo tienes que dejarle hacer su trabajo.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/claude-agent-sdk-tutorial-2026-framework-agentes-ia-20260529?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Sanity.io Headless CMS Tutorial: El CMS que Construyes Tú Mismo (No al Revés)]]></title><description><![CDATA[Sanity.io no es un CMS al uso. Tutorial pr&#225;ctico de GROQ, Portable Text y schemas at&#243;micos para aprovechar el Content Lake como una base de datos editorial real.]]></description><link>https://newsletter.brianmenagomez.com/p/sanityio-headless-cms-tutorial-el-79e</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/sanityio-headless-cms-tutorial-el-79e</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Fri, 29 May 2026 07:00:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1da1122a-351f-4889-aaf1-46f60c99614f_1080x540.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Est&#225;s Usando Sanity.io al Rev&#233;s</strong></h2><p>El 90% de los desarrolladores trata Sanity como un CMS headless con esteroides. Defin&#237;s schemas, expon&#233;is un API REST, mont&#225;is un frontend que fetchea contenido.</p><p>Y funciona. Pero est&#225;is perdiendo el 80% de lo que Sanity puede hacer por vosotros.</p><p><strong>*La sabidur&#237;a convencional dice: define tus modelos de contenido primero, exp&#243;nlos por API, y renderiza en el frontend.</strong> *</p><p>La realidad es que Sanity invierte esa l&#243;gica. <strong>No es un CMS con un API colgado. Es una base de datos de documentos en tiempo real con un React UI desacoplado, un query language propio (GROQ) capaz de hacer joins en tiempo de consulta, y un modelo de schemas sin migraciones que permite iterar a velocidad de c&#243;digo.</strong></p><p>La mayor&#237;a de los tutoriales os ense&#241;an a montar Sanity como si fuera WordPress con GraphQL. Cread contenidos, llamad a la API, mostrad en pantalla. Eso funciona, pero no aprovecha la arquitectura real de Sanity: el <strong>Content Lake</strong>.</p><p>El Content Lake no es una base de datos relacional. Es un almac&#233;n de documentos JSON donde cada contenido es un nodo at&#243;mico. Y GROQ &#8212;no REST, no GraphQL&#8212; es el lenguaje dise&#241;ado para navegar ese grafo. <strong>Las proyecciones en tiempo de consulta son el superpoder que el 90% ignora.</strong></p><h2><strong>El Error de Tratar Sanity Como un REST API</strong></h2><p>Cuando mont&#225;is Sanity como un REST API est&#225;ndar, hac&#233;is esto:</p><p>1. Defin&#237;s un schema de `post` con campos anidados.</p><p>2. Cre&#225;is un endpoint que devuelve el `post` entero.</p><p>3. En el frontend, filtr&#225;is y transform&#225;is los datos en JSX.</p><p>Funciona. Pero cada petici&#243;n devuelve datos que no necesit&#225;is. Cada componente que renderiza el mismo `post` desde distinto &#225;ngulo tiene que hacer su propia transformaci&#243;n. Y si quer&#233;is datos relacionados (autor, categor&#237;as, posts similares), necesit&#225;is m&#250;ltiples llamadas o un schema hinchado.</p><p>&#10060; <strong>Enfoque REST tradicional:</strong> Schema monol&#237;tico &#8594; endpoint fijo &#8594; transformaci&#243;n en frontend.</p><p>&#9989; <strong>Enfoque Sanity real:</strong> Documentos at&#243;micos &#8594; proyecci&#243;n GROQ &#8594; datos exactos por componente.</p><p>GROQ te permite hacer en una sola consulta lo que en REST necesitar&#237;as tres endpoints. Mira este ejemplo:</p><p>```groq</p><p>*[_type == "post" &amp;&amp; defined(slug.current)]{</p><p>title,</p><p>excerpt,</p><p>"author": author-&gt;name,</p><p>"categories": categories[]-&gt;title,</p><p>"relatedPosts": *[_type == "post" &amp;&amp; _id != ^._id &amp;&amp; count(categories[@ in ^.categories]) &gt; 0]{title, slug}</p><p>}</p><p>```</p><p><strong>Una sola petici&#243;n.</strong> Tres colecciones relacionadas. Proyecci&#243;n parcial. Joins en tiempo de consulta. Sin resolvers, sin endpoints adicionales, sin schemas complejos de GraphQL.</p><p><strong>*Eso no es un CMS. Eso es una base de datos de documentos con un lenguaje de consulta que compite con SQL para datos semi-estructurados.</strong> *</p><h2><strong>GROQ: El Query Language que Nadie Aprende (y Deber&#237;a)</strong></h2><p>GROQ es el activo infravalorado de Sanity. La mayor&#237;a lo ignora porque "ya saben GraphQL". Error.</p><p>GraphQL sobre Sanity a&#241;ade una capa de abstracci&#243;n que:</p><ul><li><p>Duplica la definici&#243;n de tipos.</p></li><li><p>Introduce resolvers que son ida y vuelta al mismo Content Lake.</p></li><li><p>Necesita schema stitching si ten&#233;is m&#250;ltiples fuentes.</p></li><li><p>Oculta la capacidad de proyecci&#243;n parcial nativa de Sanity.</p></li></ul><p>GROQ, en cambio, es un lenguaje de query dise&#241;ado espec&#237;ficamente para documentos JSON anidados con referencias. No necesit&#225;is definir resolvers. No necesit&#225;is schemas GraphQL. Escrib&#237;s la query que produce exactamente el JSON que vuestro componente necesita.</p><p>Esto es especialmente potente cuando ten&#233;is m&#250;ltiples consumidores del mismo contenido:</p><p>```groq</p><p>// Proyecci&#243;n para web</p><p>*[_type == "article" &amp;&amp; slug.current == $slug]{</p><p>title,</p><p>body[]{</p><p>...,</p><p>_type == "image" =&gt; {asset-&gt;{url, metadata}},</p><p>_type == "code" =&gt; {language, code}</p><p>}</p><p>}</p><p>// Proyecci&#243;n para excerpt (email/resumen)</p><p>*[_type == "article" &amp;&amp; slug.current == $slug]{</p><p>title,</p><p>"excerpt": pt::text(body)[0..200]</p><p>}</p><p>```</p><p>Mismo contenido. Dos proyecciones distintas. El schema no cambia. <strong>Cada consumidor recibe exactamente lo que necesita y nada m&#225;s.</strong></p><h2><strong>Portable Text: El Formato que Te Libera del Vendor Lock-In</strong></h2><p>Sanity no guarda el contenido como HTML. Lo guarda como un array de objetos JSON tipados. Cada bloque (p&#225;rrafo, imagen, c&#243;digo, embed) es un objeto con `_type`, valor, y metadatos.</p><p>Esto se llama <strong>Portable Text</strong> y es, probablemente, la decisi&#243;n arquitect&#243;nica m&#225;s inteligente de Sanity.</p><p>&#10060; <strong>CMS tradicional:</strong> El editor escribe HTML &#8594; guardas HTML &#8594; renderizas HTML en web. Te has casado con ese formato.</p><p>&#9989; <strong>Portable Text:</strong> El editor escribe bloques estructurados &#8594; guardas JSON &#8594; renderizas como HTML, texto plano, RSS, o lo que necesites.</p><p>Un renderer de Portable Text es un pipeline de componentes React (o Vue, o Svelte, o Swift) que mapea cada `_type` a un componente:</p><p>```tsx</p><p>// Renderer de Portable Text</p><p>const ptComponents = {</p><p>types: {</p><p>image: ({value}) =&gt; &lt;Image asset={value.asset} alt={value.alt} /&gt;,</p><p>code: ({value}) =&gt; &lt;SyntaxHighlighter language={value.language} code={value.code} /&gt;,</p><p>callout: ({value}) =&gt; &lt;Callout type={value.type}&gt;{value.text}&lt;/Callout&gt;,</p><p>embed: ({value}) =&gt; &lt;YouTubeEmbed url={value.url} /&gt;,</p><p>},</p><p>marks: {</p><p>link: ({children, value}) =&gt; &lt;a href={value.href}&gt;{children}&lt;/a&gt;,</p><p>highlight: ({children}) =&gt; &lt;mark&gt;{children}&lt;/mark&gt;,</p><p>}</p><p>}</p><p>```</p><p>Ese mismo JSON que renderiz&#225;is en web puede renderizarse en iOS con un renderer Swift, o en un email como texto plano. <strong>El contenido no depende del formato de salida.</strong> Lo escrib&#237;s una vez, lo consum&#237;s en cualquier lado.</p><h2><strong>El Patr&#243;n que el 90% Ignora: Schemas At&#243;micos + Proyecciones GROQ</strong></h2><p>El anti-patr&#243;n m&#225;s com&#250;n en proyectos Sanity es la <strong>normalizaci&#243;n prematura</strong>. Desarrolladores acostumbrados a SQL empiezan a dividir el contenido en decenas de tipos interconectados con referencias profundas. El resultado: queries lentas, editores frustrados que tienen que navegar cinco referencias para editar una p&#225;gina, y un schema que replica una base de datos relacional en un almac&#233;n de documentos.</p><p><strong>*El enfoque Sanity-idiom&#225;tico es opuesto: documentos planos, referencias ligeras, y proyecciones GROQ para componer.</strong> *</p><h3><strong>1. Schemas At&#243;micos</strong></h3><p>No cre&#233;is un schema de "p&#225;gina web". Cread tipos peque&#241;os y reutilizables: `block`, `image`, `link`, `person`, `testimonial`, `pricingTier`. Luego componedlos con arrays y referencias.</p><p>```ts</p><p>// schemaTypes/block.ts</p><p>export default {</p><p>name: 'block',</p><p>type: 'object',</p><p>title: 'Bloque de Contenido',</p><p>fields: [</p><p>{name: 'heading', type: 'string'},</p><p>{name: 'content', type: 'blockContent'},</p><p>{name: 'image', type: 'image'},</p><p>{name: 'cta', type: 'link'}</p><p>]</p><p>}</p><p>// schemaTypes/page.ts</p><p>export default {</p><p>name: 'page',</p><p>type: 'document',</p><p>title: 'P&#225;gina',</p><p>fields: [</p><p>{name: 'title', type: 'string'},</p><p>{name: 'slug', type: 'slug'},</p><p>{name: 'blocks', type: 'array', of: [{type: 'block'}]}</p><p>]</p><p>}</p><p>```</p><h3><strong>2. Proyecciones GROQ Antes de la UI</strong></h3><p>Antes de escribir un solo componente de React, escribid las queries GROQ que vais a necesitar. Esto revela gaps en el modelado antes de que llegu&#233;is al frontend, y os obliga a pensar en t&#233;rminos de <strong>qu&#233; necesita cada componente</strong>, no de qu&#233; tiene el schema.</p><h3><strong>3. Studio Personalizado</strong></h3><p>El Sanity Studio es una aplicaci&#243;n React open-source. Pod&#233;is:</p><ul><li><p>A&#241;adir componentes de input personalizados que validen en cliente antes de llegar al backend.</p></li><li><p>Crear vistas previas en tiempo real que rendericen el contenido mientras el editor escribe.</p></li><li><p>Definir acciones de documento personalizadas (publicar con webhook, generar metadatos SEO, etc.).</p></li></ul><p>Un Studio customizado es un diferenciador real para vuestro equipo editorial.</p><h3><strong>4. Webhooks para Cachear en Producci&#243;n</strong></h3><p>GROQ es r&#225;pido, pero no deber&#237;ais llamar a la API de Sanity en cada visita de producci&#243;n. El patr&#243;n correcto: <strong>GROQ-powered webhooks que disparan un revalidado del cache.</strong></p><p>```ts</p><p>// Webhook handler en Vercel Edge Function</p><p>export async function POST(request: Request) {</p><p>const {body, signature} = await request.json();</p><p>const isValid = verifySanitySignature(signature, process.env.SANITY_WEBHOOK_SECRET);</p><p>if (!isValid) return new Response('Unauthorized', {status: 401});</p><p>const {_type, slug} = body;</p><p>if (_type === 'post') {</p><p>await revalidateTag(`post-${slug.current}`);</p><p>// O: purgar CDN, revalidar ISR, etc.</p><p>}</p><p>return new Response('OK', {status: 200});</p><p>}</p><p>```</p><h2><strong>Migraciones Sin Migraciones: El Modelo que Cambia las Reglas</strong></h2><p>Sanity no requiere migraciones de base de datos. A&#241;ad&#237;s un campo al schema, y los documentos existentes simplemente tienen ese campo como `null` hasta que lo rellen&#225;is. No hay `ALTER TABLE`, no hay downtime, no hay scripts de migraci&#243;n que se ejecuten en producci&#243;n.</p><p><strong>*El trade-off: sacrific&#225;is consistencia de datos por velocidad de iteraci&#243;n. Para sitios impulsados por contenido, es casi siempre la decisi&#243;n correcta.</strong> *</p><p>Para sistemas transaccionales, no. Pero Sanity no est&#225; dise&#241;ado para transacciones. Est&#225; dise&#241;ado para contenido editorial, y en ese dominio, la capacidad de iterar el schema sin fricci&#243;n es un superpoder que WordPress, Contentful y Strapi no igualan.</p><h2><strong>El Framework: El Modelo de 3 Capas para Sanity</strong></h2><p>Llamadlo <strong>El Modelo de Composici&#243;n At&#243;mica</strong>. Tres capas, una dependencia.</p><p>1. <strong>Capa de Schemas At&#243;micos</strong>: Tipos peque&#241;os, reutilizables, sin saber qui&#233;n los va a consumir.</p><p>2. <strong>Capa de Proyecciones GROQ</strong>: Queries por componente que devuelven exactamente los datos que cada vista necesita.</p><p>3. <strong>Capa de Renderizado Contextual</strong>: Renderers de Portable Text que transforman el mismo JSON en HTML, texto plano, o nativo seg&#250;n el dispositivo.</p><p>Cada capa puede iterarse independientemente. Cambi&#225;is la proyecci&#243;n sin tocar el schema. Cambi&#225;is el renderer sin tocar la query. Cambi&#225;is el schema y los documentos antiguos no se rompen, solo tienen campos vac&#237;os.</p><h2><strong>La Trampa: No Uses Sanity Como WordPress</strong></h2><p>Si trat&#225;is Sanity como un CMS que devuelve HTML, est&#225;is usando la herramienta equivocada. Sanity no es un generador de p&#225;ginas. Es una plataforma de contenido donde vosotros constru&#237;s las reglas de validaci&#243;n, las relaciones, y los formatos de salida.</p><p><strong>*El verdadero poder de Sanity no est&#225; en lo que viene configurado. Est&#225; en lo que pod&#233;is construir vosotros encima.</strong> *</p><p>GROQ, Portable Text, el Studio personalizable, las suscripciones en tiempo real, los webhooks con firma &#8212; cada pieza est&#225; dise&#241;ada para que mont&#233;is vuestro propio CMS, no para que us&#233;is el que otros definieron.</p><p>El 90% de los proyectos Sanity ignora esto. El 10% que lo entiende construye sistemas de contenido que son m&#225;s r&#225;pidos, m&#225;s flexibles, y m&#225;s f&#225;ciles de mantener que cualquier alternativa en el mercado.</p><p><strong>*La pregunta no es si Sanity es bueno. La pregunta es si est&#225;is dispuestos a construirlo vosotros.</strong> *</p><p>Porque Sanity no es un CMS. Es un kit de construcci&#243;n de CMS. Y el mejor tutorial no os ense&#241;a a usarlo &#8212; os ense&#241;a a decidir qu&#233; quer&#233;is construir con &#233;l.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/sanity-io-headless-cms-tutorial-cms-que-construyes-tu-mismo-20260529?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El Agente de Follow-Up Que Cierra: Por Qué el 80% de los Pipelines Ignoran el Único Dato Que Importa]]></title><description><![CDATA[El 80% de los follow-ups fallan por ignorar el estado emocional del prospecto. Framework de 5 pasos para construir un agente IA que detecta urgencia y cierra reuniones.]]></description><link>https://newsletter.brianmenagomez.com/p/el-agente-de-follow-up-que-cierra</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-agente-de-follow-up-que-cierra</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 28 May 2026 07:00:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/681731a1-d7ec-4ea1-94ed-ba956ee5de5a_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 80% de los Pipelines de Follow-Up Fallan por un Error Que No Tiene Nada Que Ver con el Tono del Mensaje</strong></h2><p>Crees que el follow-up post-reuni&#243;n es un problema de timing. Que si env&#237;as el email demasiado pronto pareces desesperado. Que si esperas tres d&#237;as, el prospecto se enfr&#237;a. Que el tono perfecto est&#225; en alg&#250;n punto entre "recordatorio amable" y "urgencia comercial".</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 80% de los pipelines de follow-up fallan no por el tono del mensaje ni por la frecuencia. Fallan porque <strong>ning&#250;n agente actual se atreve a preguntar</strong>: "&#191;C&#243;mo te sientes realmente despu&#233;s de esa reuni&#243;n?"</p><p>La verdad inc&#243;moda que nadie en el SaaS de ventas quiere reconocer: el factor decisivo no es cu&#225;ndo env&#237;as el mensaje ni c&#243;mo lo redactas. Es la capacidad de tu agente para <strong>leer el estado emocional del prospecto</strong> despu&#233;s de la reuni&#243;n &#8212; niveles de urgencia, dudas no expresadas, desorganizaci&#243;n interna &#8212; y adaptar la estrategia de cierre en tiempo real.</p><p>Los pipelines actuales optimizan m&#233;tricas vanity (tasa de apertura, clicks en enlaces). El 100% ignora las <strong>m&#233;tricas de intenci&#243;n real</strong>: &#191;el prospecto descarg&#243; la plantilla? &#191;Subi&#243; el documento que le falta? &#191;Respondi&#243; a la pregunta concreta que desbloquea la decisi&#243;n?</p><p>Vale. Vamos a construir algo que funcione.</p><p>---</p><h2><strong>Por Qu&#233; el "Recordatorio Amable" Es Peor Que No Enviar Nada</strong></h2><p>El enfoque est&#225;ndar del follow-up es un clich&#233; andante:</p><p>&#10060; <strong>D&#237;a 1 post-reuni&#243;n</strong>: "Gracias por tu tiempo. &#191;Te qued&#243; alguna duda?"</p><p>&#10060; <strong>D&#237;a 3</strong>: "Solo quer&#237;a saber si has podido revisar la propuesta."</p><p>&#10060; <strong>D&#237;a 7</strong>: "Te escribo por &#250;ltima vez por si a&#250;n te interesa."</p><p>Este patr&#243;n asume que la reuni&#243;n fue bien y que el prospecto solo necesita un empujoncito. Pero la evidencia del mundo real &#8212; la que hemos visto en decenas de pipelines de gestor&#237;as, despachos y SMBs &#8212; cuenta otra historia.</p><p>&#9989; <strong>El enfoque que s&#237; funciona</strong>: detectar que el prospecto sali&#243; de la reuni&#243;n con urgencia regulatoria pero los papeles desordenados, y en lugar de un recordatorio, enviarle una checklist de documentos con instrucciones paso a paso.</p><p>La analog&#237;a directa viene del intake legal. En el proceso de captaci&#243;n de clientes para una gestor&#237;a o despacho de abogados, el cuello de botella no es la precisi&#243;n t&#233;cnica del agente de intake &#8212; es la <strong>captura del estado emocional del cliente</strong>: urgencia regulatoria, desorganizaci&#243;n documental, dudas no expresadas sobre el proceso. Si un agente no puede detectar que un cliente est&#225; en medio de una inspecci&#243;n (urgencia alta) y tiene los papeles en una bolsa de pl&#225;stico (desorganizaci&#243;n extrema), cualquier recordatorio de seguimiento ser&#225; contraproducente.</p><p>El follow-up post-reuni&#243;n B2B es exactamente igual. Tu prospecto no est&#225; siendo "poco interesado". Est&#225; <strong>abrumado, desorganizado y confundido</strong> sobre cu&#225;l es el siguiente paso concreto.</p><p>---</p><h2><strong>La Evidencia Que Nadie Quiere Ver</strong></h2><p>Tres datos que cambian c&#243;mo deber&#237;as dise&#241;ar tu agente de follow-up:</p><p><strong>1. El estado emocional del cliente determina el 80% de la tasa de cierre.</strong></p><p>Lo hemos visto en pipelines reales de intake documental: la urgencia regulatoria combinada con desorganizaci&#243;n documental es el factor cr&#237;tico que todos los agentes actuales ignoran. Ning&#250;n CRM con templates de email captura esto. Ninguna secuencia de HubSpot lo detecta.</p><p><strong>2. Los agentes de IA actuales fallan sistem&#225;ticamente en capturar contexto emocional o conductual.</strong></p><p>No es un fallo t&#233;cnico. Es un fallo de dise&#241;o. La mayor&#237;a de los agentes de follow-up se implementan como <strong>secuencias lineales de emails pre-escritos</strong>. Un &#225;rbol de decisi&#243;n necesitar&#237;a detectar se&#241;ales que ning&#250;n formulario ni template captura: el tono de voz en la reuni&#243;n, las pausas cuando el prospecto habla de plazos, las preguntas que evita responder.</p><p><strong>3. Apify demuestra que los agentes pueden operar como runtimes serverless completos con scheduling, webhooks y proxy.</strong></p><p>Esto no es teor&#237;a. La infraestructura existe. Apify permite desplegar, encadenar y escalar aplicaciones con scheduling, webhooks y proxy integrados. n8n tambi&#233;n. Lo que falta no es la tecnolog&#237;a &#8212; es el <strong>modelo mental</strong> de qu&#233; deber&#237;a estar haciendo el agente.</p><p>---</p><h2><strong>El Modelo Mental Correcto: El &#193;rbol de Decisi&#243;n Emocional</strong></h2><p>El follow-up no es una secuencia lineal. Es un <strong>&#225;rbol de decisi&#243;n que se ramifica seg&#250;n el estado del prospecto</strong>.</p><p>Cada reuni&#243;n de ventas genera un perfil emocional con tres dimensiones:</p><p>| <strong>Dimensi&#243;n</strong> | <strong>Bajo</strong> | <strong>Medio</strong> | <strong>Alto</strong> |</p><p>|---|---|---|---|</p><p>| <strong>Urgencia percibida</strong> | "Lo miro cuando pueda" | "Necesito resolverlo este mes" | "Tengo una inspecci&#243;n la semana que viene" |</p><p>| <strong>Nivel de duda</strong> | "Me parece bien" | "Tengo algunas preguntas" | "No estoy seguro de que esto sea para m&#237;" |</p><p>| <strong>Desorganizaci&#243;n documental</strong> | "Tengo todo digitalizado" | "Tengo los papeles pero no s&#233; cu&#225;les faltan" | "Los documentos est&#225;n en una caja sin clasificar" |</p><p>La mayor&#237;a de las reuniones caen en una combinaci&#243;n predecible. Pero ning&#250;n agente actual mide esto. Env&#237;an el mismo email a los tres tipos de prospecto.</p><p><strong>Ahora, el salto cualitativo</strong>: cada combinaci&#243;n de estado emocional deber&#237;a disparar una secuencia de acciones *distinta*.</p><p>Ejemplo real:</p><ul><li><p><strong>Urgencia alta + desorganizaci&#243;n alta</strong>: No env&#237;es un "recordatorio amable". Env&#237;a una checklist de documentos con casillas de verificaci&#243;n y un enlace directo para subir PDFs. El prospecto no necesita que le recuerden la reuni&#243;n &#8212; necesita <strong>una estructura para organizarse</strong>.</p></li></ul><ul><li><p><strong>Duda alta + urgencia baja</strong>: No insistas con la propuesta. Env&#237;a un case study de 3 p&#225;rrafos que resuelva la objeci&#243;n no dicha. El prospecto no necesita m&#225;s informaci&#243;n &#8212; necesita <strong>que validen su miedo espec&#237;fico</strong>.</p></li></ul><ul><li><p><strong>Urgencia alta + duda baja</strong>: Pide directamente la llamada de cierre de 15 minutos. El prospecto est&#225; listo. Cualquier paso intermedio es fricci&#243;n.</p></li></ul><p>---</p><h2><strong>El Marco de 5 Pasos: C&#243;mo Construir un Agente de Follow-Up Que Cierra</strong></h2><p>Llam&#233;moslo <strong>El Ciclo de Cierre Emocional</strong> (Emotional Close Loop). Son cinco pasos. Ninguno requiere un equipo de data science. Todos se implementan con herramientas que ya existen.</p><h3><strong>Paso 1 &#8212; Post-Call Sentiment Mapping</strong></h3><p>Implementa un pipeline que analice la grabaci&#243;n o transcripci&#243;n de la reuni&#243;n extrayendo las 3 dimensiones emocionales usando un LLM con prompt estructurado.</p><p>Aqu&#237; tienes el prompt que uso para esto:</p><p>```python</p><p>prompt = f"""</p><p>Analiza la siguiente transcripci&#243;n de reuni&#243;n comercial.</p><p>Extrae solo 3 dimensiones con valor num&#233;rico de 1 a 10:</p><p>1. urgencia_percibida: &#191;El prospecto menciona plazos, inspecciones,</p><p>fechas l&#237;mite o consecuencias de no actuar?</p><p>2. nivel_duda: &#191;Hace preguntas evasivas, cambia de tema cuando se</p><p>habla de precio, o dice "lo reviso" sin compromiso?</p><p>3. desorganizacion_documental: &#191;Menciona que tiene que buscar papeles,</p><p>que los tiene en varias carpetas, o que "no sabe exactamente qu&#233; falta"?</p><p>Devuelve SOLO un JSON con estas tres claves y valores num&#233;ricos.</p><p>No expliques nada. No a&#241;adas texto adicional.</p><p>Transcripci&#243;n: {transcript}</p><p>"""</p><p>response = openai.chat.completions.create(</p><p>model="gpt-4o-mini",  # Cuesta c&#233;ntimos por an&#225;lisis</p><p>messages=[{"role": "user", "content": prompt}],</p><p>response_format={"type": "json_object"}</p><p>)</p><p>```</p><p><strong>&#191;El coste?</strong> C&#233;ntimos por reuni&#243;n. El an&#225;lisis se hace una sola vez, post-reuni&#243;n. No es tiempo real. No necesitas GPUs. Necesitas un prompt bien escrito y una API key.</p><h3><strong>Paso 2 &#8212; Estado &#8594; Estrategia de Acci&#243;n</strong></h3><p>Mapea cada combinaci&#243;n de puntuaciones a una secuencia de acciones. Esto no es magia &#8212; es una lookup table:</p><p>```python</p><p>estrategias = {</p><p>(9, 3, 8): "checklist_documentos",  # Urgencia alta, duda baja, desorganizaci&#243;n alta</p><p>(4, 7, 3): "casestudy_objecion",     # Urgencia baja, duda alta, organizado</p><p>(8, 2, 4): "cierre_directo_15min",   # Urgencia alta, duda baja, organizado</p><p>(6, 5, 6): "resumen_ejecutivo_3lineas",  # Perfil medio</p><p>}</p><p>```</p><p>La clave est&#225; en que <strong>cada estrategia dispara un flujo serverless distinto</strong>. No es un template de email con distinto asunto. Son flujos completos con diferentes acciones, tiempos y canales.</p><h3><strong>Paso 3 &#8212; Pipeline Serverless con Scheduling</strong></h3><p>Implementa el agente como runtime serverless (Apify, n8n o Cloud Functions) con webhooks que se disparen autom&#225;ticamente N horas post-reuni&#243;n seg&#250;n el segmento emocional detectado.</p><p>```javascript</p><p>// Ejemplo con webhook en n8n o Edge Function</p><p>// Se dispara autom&#225;ticamente seg&#250;n el segmento</p><p>const segmento = detectarSegmento(analisisEmocional);</p><p>const acciones = {</p><p>checklist_documentos: {</p><p>delay: 2, // horas post-reuni&#243;n</p><p>template: "emails/checklist_urgencia.mjml",</p><p>webhook_espera: "/webhook/documento-subido",</p><p>max_intentos: 3</p><p>},</p><p>cierre_directo_15min: {</p><p>delay: 1, // horas</p><p>template: "emails/cierre_directo.mjml",</p><p>webhook_espera: "/webhook/calendario-agendado",</p><p>max_intentos: 2</p><p>}</p><p>};</p><p>```</p><p>El scheduling + webhooks permiten que el agente <strong>espere</strong> a que el prospecto realice una acci&#243;n (subir un documento, responder una pregunta) y adapte el siguiente paso autom&#225;ticamente, sin intervenci&#243;n humana. Esto es lo que diferencia un agente real de una secuencia de Mailchimp.</p><h3><strong>Paso 4 &#8212; M&#233;tricas de Intenci&#243;n Real sobre Vanity Metrics</strong></h3><p>Reemplaza la tasa de apertura por la <strong>tasa de acci&#243;n concreta</strong>.</p><ul><li><p>&#10060; <strong>Vanity metric</strong>: "El 45% abri&#243; el email de seguimiento."</p></li><li><p>&#9989; <strong>Intenci&#243;n real</strong>: "El 22% descarg&#243; la plantilla de documentos. El 12% subi&#243; al menos un archivo. El 8% agend&#243; la llamada de cierre."</p></li></ul><p>Esto cambia el dise&#241;o completo del agente. En lugar de optimizar para subject lines que generen clicks, <strong>optimizas para micro-conversiones hacia el cierre</strong>.</p><p>La pregunta que tienes que hacerte no es "&#191;abri&#243; el email?" sino "&#191;realiz&#243; una acci&#243;n que acerca el cierre?" &#8212; descargar una plantilla, agendar una llamada de 15 minutos, subir un documento faltante.</p><h3><strong>Paso 5 &#8212; Bucle de Retroalimentaci&#243;n Emocional</strong></h3><p>Cada interacci&#243;n del follow-up debe re-evaluar el estado emocional del prospecto y actualizar la estrategia de cierre en tiempo real.</p><p>Un prospecto que responde con "lo reviso y te confirmo" pero con tono evasivo en la reuni&#243;n no necesita un recordatorio a los 3 d&#237;as. Necesita un email que resuelva la objeci&#243;n no dicha:</p><p>&gt; <em>"S&#233; que revisar el contrato puede ser abrumador. Aqu&#237; est&#225; el punto clave en 3 l&#237;neas. Si prefieres, lo vemos en 10 minutos ma&#241;ana."</em></p><p>Esto no es manipulaci&#243;n psicol&#243;gica. Es <strong>pragmatismo comercial</strong>. Est&#225;s eliminando la fricci&#243;n que impide que el prospecto avance.</p><p>---</p><h2><strong>La Objeci&#243;n Que Te Est&#225;s Haciendo Ahora Mismo</strong></h2><p><em>"Un agente que analiza el estado emocional suena a manipulaci&#243;n o invasivo."</em></p><p>Dos aclaraciones:</p><p>Primero: el an&#225;lisis es sobre <strong>necesidades y obst&#225;culos</strong> (urgencia regulatoria, desorganizaci&#243;n documental, dudas espec&#237;ficas), no sobre psicolog&#237;a profunda del prospecto. No estamos leyendo la mente de nadie. Estamos detectando si alguien dijo "tengo una inspecci&#243;n la semana que viene" o "los papeles est&#225;n en una caja".</p><p>Segundo: el 80% de los SMBs no "no tienen inter&#233;s". Est&#225;n <strong>abrumados, desorganizados, o no entienden el siguiente paso</strong>. Un agente que resuelve eso no est&#225; manipulando &#8212; est&#225; <strong>facilitando una decisi&#243;n</strong> que el prospecto ya quiere tomar pero no sabe c&#243;mo ejecutar.</p><p>---</p><h2><strong>El Futuro No Son M&#225;s Emails. Es Intenci&#243;n Real.</strong></h2><p>Los pipelines de follow-up actuales est&#225;n dise&#241;ados para la era del batch-and-blast. Env&#237;o masivo, espero, re-env&#237;o. Es un modelo de broadcasting, no de relaci&#243;n comercial.</p><p>El agente de follow-up que realmente funciona no es el que env&#237;a m&#225;s emails. Es el que <strong>escucha lo que no se dijo en la reuni&#243;n</strong> y act&#250;a en consecuencia. El que sabe que un "lo reviso" con pausa de 3 segundos no es lo mismo que un "lo reviso" con tono seguro.</p><p>La infraestructura existe. Apify, n8n, Cloud Functions, Edge Functions &#8212; todo est&#225; listo para desplegar agentes con scheduling, webhooks y &#225;rboles de decisi&#243;n complejos.</p><p>Lo que falta no es tecnolog&#237;a.</p><p><strong>Lo que falta es preguntar la pregunta correcta despu&#233;s de cada reuni&#243;n.</strong></p><p>No "&#191;cu&#225;ndo le vuelvo a escribir?"</p><p>Sino "&#191;c&#243;mo se qued&#243; realmente?"</p><p>---</p><h2><strong>Resumen y Pr&#243;ximo Paso</strong></h2><ul><li><p><strong>El 80% de los follow-ups fallan</strong> por ignorar el estado emocional del prospecto, no por el tono o la frecuencia del mensaje.</p></li><li><p><strong>Tres dimensiones</strong> capturan el perfil post-reuni&#243;n: urgencia, duda, desorganizaci&#243;n documental.</p></li><li><p><strong>Cada combinaci&#243;n</strong> dispara una estrategia de acci&#243;n distinta &#8212; no el mismo template de email.</p></li><li><p><strong>M&#233;tricas de intenci&#243;n real</strong> (tasa de acci&#243;n concreta) sobre vanity metrics (tasa de apertura).</p></li><li><p><strong>Bucle de retroalimentaci&#243;n</strong>: cada interacci&#243;n re-eval&#250;a el estado y actualiza la estrategia.</p></li></ul><p>La pr&#243;xima vez que termines una reuni&#243;n y tu CRM te pregunte cu&#225;ndo programar el siguiente email, hazte una pregunta diferente: <strong>&#191;qu&#233; no me dijo el prospecto que determinar&#225; si esto se cierra o no?</strong></p><p>Esa pregunta vale m&#225;s que todos los templates de follow-up del mundo.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/agente-ia-follow-up-cierra-pipelines-estado-emocional-20260528?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Vercel No es un Hosting Barato: Es un Propietario con Cargo de Traslado]]></title><description><![CDATA[Vercel no es un host barato: es vendor lock-in con ISR, Edge Functions y analytics propietarios. Framework de 5 pasos para auditar tu dependencia y salir sin reescribir.]]></description><link>https://newsletter.brianmenagomez.com/p/vercel-no-es-un-hosting-barato-es</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/vercel-no-es-un-hosting-barato-es</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 28 May 2026 07:00:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/013b663f-e925-40e8-9634-bfcd39fe8066_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Vercel No es un Hosting Barato: Es un Propietario con Cargo de Traslado</h1><p>La sabidur&#237;a convencional dice: Vercel es la forma m&#225;s f&#225;cil de desplegar Next.js con zero-config. Pinchas un repo, tecleas un `git push`, y en segundos tienes preview deployments, SSL, CDN global, y un dashboard que te hace sentir que dominas la infraestructura.</p><p><strong>*La realidad es que Vercel optimiza para la experiencia de registro, no para la de salida.</strong> *</p><p>Cada feature que te enamora en el dashboard &#8212;ISR en el edge, Edge Config, KV storage, Analytics, Cron Jobs, Speed Insights&#8212; es un ancla que ata tu c&#243;digo a su runtime propietario. No es que Vercel sea mal hosting. Es que su modelo de negocio no es venderte servidores; es hacer que sea tan c&#243;modo quedarse que el coste de irte sea psicol&#243;gica y t&#233;cnicamente prohibitivo.</p><p>Elegir Vercel por simplicidad no es elegir un host. Es firmar un contrato arquitect&#243;nico que ser&#225; m&#225;s caro de romper que migrar de AWS a Azure. Y lo peor es que la mayor&#237;a de los equipos no leen la letra peque&#241;a hasta que est&#225;n pagando la fianza de salida.</p><h2>El Lock-In No es un Bug. Es la Feature</h2><p>Vercel no es "hosting con esteroides". Es un runtime propietario disfrazado de plataforma de deploy. La compa&#241;&#237;a ha construido un ecosistema donde cada integraci&#243;n vertical &#8212;desde el almacenamiento KV hasta el sistema de an&#225;lisis&#8212; est&#225; dise&#241;ada para funcionar impecablemente dentro de sus fronteras y fallar silenciosamente fuera de ellas.</p><p><strong>*El mayor error que cometen los equipos es tratar Vercel como si fuera un Apache compartido pero con mejor UI.</strong> *</p><p>No lo es. Apache compartido ejecuta PHP est&#225;ndar. Lo subes a cualquier servador y funciona. Vercel ejecuta un runtime que modifica el comportamiento de tu framework en tiempo de build, inyecta dependencias, sobreescribe configuraciones de rutas, y te ofrece APIs que simplemente no existen en ning&#250;n otro lugar.</p><p>| Feature | &#191;Funciona fuera de Vercel? |</p><p>|---------|---------------------------|</p><p>| ISR (Incremental Static Regeneration) en el edge | &#10060; No. Self-hosted requiere un cache handler personalizado como `@neshca/cache-handler`. Ni siquiera funciona out of the box con `next start`. |</p><p>| Edge Functions (`@vercel/edge`) | &#10060; No. Cloudflare Workers y Netlify Edge Functions usan APIs distintas. `NextRequest` y `NextResponse` no existen fuera de Vercel. |</p><p>| Edge Config | &#10060; No. No hay equivalente self-hosted. Es un feature flag store que solo vive en el edge de Vercel. |</p><p>| KV Storage | &#10060; No. Es una integraci&#243;n con Redis gestionada por Vercel. Migrar a Upstash o Redis propia requiere reescribir todas las queries. |</p><p>| Analytics / Speed Insights | &#10060; No. `@vercel/analytics` y `@vercel/speed-insights` inyectan tracking que solo funciona en el dominio de Vercel. |</p><p>| Cron Jobs | &#9888;&#65039; Parcialmente. Vercel los ejecuta como Edge Functions con un scheduler interno. Fuera, necesitas cron jobs externos o un worker. |</p><p>| Cache API (`revalidatePath`, `revalidateTag`) | &#10060; No. Funciona solo en infraestructura de Vercel. Self-hosted necesitas un adapter de cach&#233;. |</p><p>Cada checkmark en esa tabla no es una feature. Es una dependencia que tendr&#225;s que romper si decides irte. Y el problema no es que existan estas dependencias; el problema es que se presentan como "features gratuitas" cuando en realidad son mecanismos de retenci&#243;n.</p><p>Para entender la magnitud del problema, basta con observar c&#243;mo funciona la industria del software en 2026. As&#237; como el marketing de redes sociales ha visto t&#225;cticas que funcionaban hace dos a&#241;os volverse contraproducentes &#8212;como los chatbots de IA intrusivos en mensajes privados que la gente rechaza activamente&#8212;, el hosting de aplicaciones ha seguido una trayectoria similar. Lo que antes era una ventaja competitiva (automatizaci&#243;n, integraci&#243;n profunda, "todo en una caja") se ha convertido en una fuente de dependencia que los equipos no anticiparon.</p><p>Cuando Snapchat forz&#243; su chatbot de IA en las bandejas de entrada de todos los usuarios en 2023, la calificaci&#243;n de la app en la App Store estadounidense cay&#243; a 1,67 estrellas, con el 75% de las rese&#241;as otorgando una estrella. Los usuarios no hab&#237;an pedido esa integraci&#243;n. Del mismo modo, los equipos de desarrollo no pidieron expl&#237;citamente un runtime propietario que secuestrara su l&#243;gica de negocio. Simplemente aceptaron la comodidad sin preguntar por el coste de salida.</p><h2>El Precio Oculto del "Zero-Config"</h2><p>Vercel se vende como "funciona sin configurar nada". Y es verdad &#8212;para el primer deploy. Pero ese zero-config inicial es el cebo. El anzuelo est&#225; en las decisiones arquitect&#243;nicas que tomas sin saber que las est&#225;s tomando.</p><p>El problema es que el build system de Vercel aplica heur&#237;sticas que cambian el comportamiento de tu app. Detecta autom&#225;ticamente tu framework, inyecta build plugins, variables de entorno, y sobreescribe rutas. No te pide permiso. Te lo oculta tras un dashboard bonito.</p><p><strong>*Tu app se comporta distinto en `vercel dev` que en `next dev`.</strong> *</p><p>Y se comporta distinto en producci&#243;n Vercel que en un Docker container. Esto no es una exageraci&#243;n. Es un hecho comprobable: el middleware de Next.js, que deber&#237;a ser est&#225;ndar, se ejecuta en el edge de Vercel con APIs que no forman parte del est&#225;ndar web. Las Server Actions que usan `revalidateTag` funcionan porque Vercel inyecta su propio sistema de cach&#233;. Fuera de ah&#237;, todo se rompe.</p><p>Los equipos descubren esto cuando su staging environment se rompe silenciosamente despu&#233;s de que una actualizaci&#243;n de Vercel cambia una heur&#237;stica de build. O cuando intentan mover su app a un VPS para ahorrar costes y descubren que el ISR no funciona, el middleware lanza errores, y las analytics dejan de recoger datos. No es que hayan hecho algo mal. Es que nunca les dijeron que estaban atados.</p><p>Es un fen&#243;meno similar al que ocurre en el marketing con los avatares de IA generados por inteligencia artificial. Seg&#250;n la encuesta Sprout Social Pulse, el 46% de los usuarios de redes sociales dicen no sentirse c&#243;modos con que las marcas utilicen influencers de IA. La investigaci&#243;n citada por expertos del sector muestra que el contenido generado por IA, incluidos los avatares, es percibido por las audiencias como publicidad deshumanizada, carente de la empat&#237;a y el toque humano que genera confianza. Los equipos de marketing adoptaron estas herramientas por su comodidad y bajo coste inicial, pero el coste a largo plazo &#8212;p&#233;rdida de confianza, backlash, regulaci&#243;n&#8212; super&#243; con creces el beneficio inmediato.</p><p>Con Vercel ocurre exactamente lo mismo. La comodidad inicial de "pinchar y desplegar" oculta un coste arquitect&#243;nico que solo se manifiesta cuando intentas ejercer tu libertad de elecci&#243;n.</p><p>&#10060; <strong>El enfoque d&#233;bil:</strong> "Mi app es peque&#241;a, nunca necesitar&#233; migrar. Esto no me aplica."</p><p>&#9989; <strong>El enfoque real:</strong> "El lock-in m&#225;s peligroso es el que no planificas. Hoy es un side project. Ma&#241;ana es una startup con 50.000 usuarios y una deuda arquitect&#243;nica que duele."</p><h2>El Caso Real: Lo Que Duele No es la Migraci&#243;n T&#233;cnica. Es la Arquitect&#243;nica</h2><p>Imagina que tu app usa ISR para p&#225;ginas de producto. Tienes 10.000 URLs que se regeneran bajo demanda con `revalidateTag`. Funciona perfecto en Vercel. Las p&#225;ginas se sirven r&#225;pido, la invalidaci&#243;n ocurre en milisegundos, y tu equipo ni siquiera piensa en ello.</p><p>Ahora decides migrar a un servidor propio o a Cloudflare Pages.</p><p>El problema no es mover los ficheros. El problema es que `revalidateTag` no existe fuera de Vercel. No es que tengas que reconfigurar algo. Es que tienes que implementar tu propio sistema de invalidaci&#243;n de cach&#233; con Redis, un worker de purga, y un adapter personalizado. Necesitas decidir c&#243;mo almacenas el mapa de tags a URLs, c&#243;mo purgas de forma at&#243;mica, y c&#243;mo aseguras que la regeneraci&#243;n no deje tu sitio serviendo contenido obsoleto.</p><p>Eso no es "ajustar la configuraci&#243;n". Es una reescritura que puede llevar semanas.</p><p>Y si adem&#225;s usas Edge Config para feature flags y Middleware para redirecciones basadas en geolocalizaci&#243;n &#8212;todo integrado con `@vercel/edge`&#8212; la migraci&#243;n se convierte en un proyecto de varias semanas. Cada integraci&#243;n es un m&#243;dulo que dejar&#225; de funcionar. Cada API propietaria es una deuda que vence.</p><p><strong>*El verdadero coste de Vercel no son los euros del plan Pro. Es el trabajo de ingenier&#237;a necesario para salir.</strong> *</p><p>Piensa en ello en t&#233;rminos de ingenier&#237;a: una migraci&#243;n de AWS a Azure, aunque tediosa, implica mover servicios equivalentes. RDS a Azure SQL. S3 a Blob Storage. Lambda a Azure Functions. Son caros y requieren trabajo, pero el mapa de equivalencias est&#225; trazado. Hay gu&#237;as, herramientas, y consultores que lo han hecho cientos de veces.</p><p>Migrar desde Vercel no tiene ese mapa. Porque Vercel no es un servicio de infraestructura: es una plataforma que te vende productividad a cambio de lealtad. Y como cualquier plataforma que opera con ese modelo, la salida es el producto que nunca quisieron que compraras.</p><h2>El Marco de 5 Pasos para Auditar tu Dependencia de Vercel</h2><p>Llam&#233;moslo <strong>El Marco de Portabilidad Forzada</strong>. Funciona as&#237;: asumes que ma&#241;ana mismo Vercel desaparece o cambia sus precios dr&#225;sticamente, y tu app tiene que funcionar en otro sitio en un plazo m&#225;ximo de una semana. &#191;Cu&#225;nto tardas en tenerla operativa? &#191;Puedes responder a esa pregunta con precisi&#243;n?</p><p>Si no puedes, este marco es para ti.</p><h3>Paso 1: Audit de Superficie de Ataque Propietaria</h3><p>Abre tu `package.json`. Busca todo lo que empiece por `@vercel/`.</p><p>```json</p><p>// package.json &#8212; busca estas dependencias</p><p>"@vercel/analytics": "^1.0.0",</p><p>"@vercel/speed-insights": "^1.0.0",</p><p>"@vercel/edge": "^1.0.0",</p><p>"@vercel/kv": "^1.0.0",</p><p>"@vercel/blob": "^1.0.0"</p><p>```</p><p>Cada una de esas l&#237;neas es un punto de anclaje. Pero no te detengas en `package.json`. El lock-in m&#225;s peligroso no est&#225; en las dependencias declaradas, sino en las t&#225;citas: middleware que usa `NextRequest`, Server Actions que llaman a `revalidateTag`, page layouts que asumen ISR en el edge, cron jobs definidos en `vercel.json`, y variables de entorno que solo existen en el dashboard de Vercel.</p><p>El objetivo es tener <strong>visibilidad total</strong> de lo que te ata. Haz una hoja de c&#225;lculo con cada dependencia, su prop&#243;sito, y una estimaci&#243;n del esfuerzo necesario para reemplazarla. Este documento, por s&#237; solo, ya te est&#225; dando informaci&#243;n que probablemente no ten&#237;as.</p><h3>Paso 2: Abstrae las Dependencias Detr&#225;s de Interfaces</h3><p>No importes `@vercel/kv` directamente en tu l&#243;gica de negocio. Esa es la receta para el desastre. Crea un adapter que desacople tu c&#243;digo de la implementaci&#243;n concreta:</p><p>```typescript</p><p>// cache-adapter.ts &#8212; abstracci&#243;n portable</p><p>export interface CacheAdapter {</p><p>get(key: string): Promise&lt;string | null&gt;;</p><p>set(key: string, value: string, ttl?: number): Promise&lt;void&gt;;</p><p>invalidate(tag: string): Promise&lt;void&gt;;</p><p>}</p><p>// vercel-implementation.ts</p><p>import { kv } from '@vercel/kv';</p><p>export const vercelCache: CacheAdapter = {</p><p>get: (key) =&gt; kv.get(key),</p><p>set: (key, value, ttl) =&gt; kv.set(key, value, { ex: ttl }),</p><p>invalidate: (tag) =&gt; kv.del(tag),</p><p>};</p><p>// redis-implementation.ts &#8212; para cuando migres</p><p>import { Redis } from '@upstash/redis';</p><p>export const redisCache: CacheAdapter = {</p><p>get: (key) =&gt; redis.get(key),</p><p>set: (key, value, ttl) =&gt; redis.setex(key, ttl!, value),</p><p>invalidate: async (tag) =&gt; { /<em> l&#243;gica de purga por tag </em>/ },</p><p>};</p><p>```</p><p>El resto de tu c&#243;digo no sabe si est&#225;s en Vercel, Redis, o SQLite. Eso es portabilidad real. Y lo mejor es que este patr&#243;n no es espec&#237;fico de cach&#233;: apl&#237;calo a Edge Config, Blob Storage, Analytics, y cualquier otra integraci&#243;n propietaria. Cada adapter que escribes es una p&#243;liza de seguro contra el lock-in.</p><h3>Paso 3: Despliega en un Segundo Proveedor y Tira la Suite de Tests</h3><p>No esperes a necesitar migrar. Configura un staging en Netlify, Cloudflare Pages o un servidor propio. Corre tu test suite completo.</p><p>Vas a encontrar sorpresas. Siempre las hay. Middleware que falla porque `NextRequest` no existe fuera del contexto de Vercel, ISR que no regenera porque el cache handler no est&#225; configurado, analytics que no recolectan datos porque el script de tracking apunta a un endpoint inexistente, cron jobs que no se ejecutan porque no hay scheduler.</p><p>Resu&#233;lvelas ahora, no cuando est&#233;s contra reloj. Cada error que encuentres en staging es una oportunidad para hacer tu c&#243;digo m&#225;s robusto. Cada dependencia que descubras es una lecci&#243;n sobre c&#243;mo no dise&#241;ar sistemas.</p><p>Este paso tiene un beneficio colateral importante: te obliga a escribir tests que cubren el comportamiento real de tu app en diferentes entornos, lo que mejora la calidad general del software.</p><h3>Paso 4: Sustituye Middleware Propietario por Web Standards</h3><p>`NextRequest` y `NextResponse` son comodidades de Vercel. Pero el est&#225;ndar web es `Request` y `Response`. Y los est&#225;ndares web son la &#250;nica garant&#237;a de portabilidad real a largo plazo.</p><p>```typescript</p><p>// &#10060; Atado a Vercel</p><p>import { NextRequest, NextResponse } from 'next/server';</p><p>export function middleware(request: NextRequest) {</p><p>const country = request.geo?.country;</p><p>return NextResponse.redirect(new URL(`/${country}`, request.url));</p><p>}</p><p>// &#9989; Portable</p><p>export function middleware(request: Request) {</p><p>const country = request.headers.get('x-vercel-ip-country') || 'ES';</p><p>return Response.redirect(new URL(`/${country}`, request.url));</p><p>}</p><p>```</p><p>El segundo bloque funciona en cualquier runtime que soporte el est&#225;ndar web. Cloudflare Workers, Deno, Bun, Node 20+. No importa d&#243;nde despliegues: el c&#243;digo es el mismo.</p><p>Este principio aplica a m&#225;s que middleware. Tus Server Actions deber&#237;an devolver `Response` est&#225;ndar. Tus API routes deber&#237;an usar `Request` y `Response` nativos. Cada vez que usas una abstracci&#243;n propietaria, preg&#250;ntate: "&#191;Puedo escribir esto con APIs est&#225;ndar del navegador?" Si la respuesta es s&#237;, hazlo. Si es no, preg&#250;ntate por qu&#233; est&#225;s usando esa feature.</p><h3>Paso 5: Documenta un Pipeline de Build Agn&#243;stico</h3><p>Tu `next.config.js` no deber&#237;a tener flags espec&#237;ficas de Vercel que rompan en otros entornos. Un buen pipeline de build es aquel que produces el mismo artefacto independientemente de d&#243;nde se ejecute.</p><p>```typescript</p><p>// next.config.ts &#8212; portable</p><p>const nextConfig = {</p><p>output: process.env.DOCKER ? 'standalone' : undefined,</p><p>images: {</p><p>// No uses im&#225;genes solo de Vercel Blob</p><p>remotePatterns: [</p><p>{ protocol: 'https', hostname: '**.vercel-storage.com' },</p><p>{ protocol: 'https', hostname: '**.s3.amazonaws.com' },</p><p>{ protocol: 'https', hostname: '**.cloudinary.com' },</p><p>],</p><p>},</p><p>};</p><p>export default nextConfig;</p><p>```</p><p>Un &#250;nico comando para build local, Vercel, y Docker. Sin sorpresas, sin configuraciones m&#225;gicas que solo existen en el dashboard de Vercel, sin heur&#237;sticas de build que cambian silenciosamente el comportamiento de tu aplicaci&#243;n.</p><p>Documenta tambi&#233;n el proceso de deploy: qu&#233; variables de entorno son necesarias, qu&#233; secretos hay que configurar, qu&#233; pasos de post-build se requieren. Este documento es tu salvavidas cuando llegue el momento de migrar.</p><h2>La Alternativa Real No es Netlify. Es AWS</h2><p>La comparaci&#243;n justa no es Vercel vs. Netlify. Es Vercel vs. AWS con Docker. Cambiar de un proveedor propietario a otro similar no resuelve el problema fundamental; solo cambia el nombre del casero.</p><p>El camino m&#225;s pragm&#225;tico para apps Next.js en producci&#243;n que necesitan portabilidad es un despliegue Dockerizado en AWS Fargate o ECS con un CDN por delante (CloudFront). No es la opci&#243;n m&#225;s sexy, pero es la que te da libertad real.</p><p>&#10060; <strong>Pierdes:</strong> instant rollbacks, preview deployments, zero-config, la sensaci&#243;n de que todo es m&#225;gico.</p><p>&#9989; <strong>Ganas:</strong> control total sobre caching, escalado, costes, la libertad de irte cuando quieras, y la capacidad de auditar cada aspecto de tu infraestructura.</p><p>El trade-off es simple: complejidad operativa hoy vs. deuda arquitect&#243;nica ma&#241;ana. Y la mayor&#237;a de los equipos elige la primera opci&#243;n no porque sea mejor, sino porque es m&#225;s f&#225;cil de vender al negocio. "Lo desplegamos en dos clics" suena mejor que "invertimos dos semanas en configurar un pipeline de CI/CD reproducible".</p><p><strong>*La mayor&#237;a de equipos subestima la deuda arquitect&#243;nica hasta que es demasiado tarde.</strong> *</p><p>As&#237; como los equipos de marketing que adoptaron avatares de IA sin preguntarse c&#243;mo reaccionar&#237;a su audiencia, los equipos de desarrollo adoptan Vercel sin preguntarse c&#243;mo ser&#225; la migraci&#243;n. El patr&#243;n es el mismo: una soluci&#243;n que parece barata y r&#225;pida hoy, pero que acumula un coste oculto que se dispara cuando intentas cambiar de direcci&#243;n.</p><p>Y al igual que la regulaci&#243;n est&#225; alcanzando a la IA generativa &#8212;con la Ley de IA de la UE y la FTC estadounidense impulsando requisitos de divulgaci&#243;n obligatoria para contenido generado por IA&#8212;, el mercado del hosting est&#225; madurando hacia una exigencia de portabilidad. Los equipos que ya han pasado por una migraci&#243;n dolorosa est&#225;n empezando a exigir transparencia sobre las dependencias propietarias antes de firmar contratos.</p><h2>La &#218;nica Pregunta Que Importa</h2><p>No es "&#191;Vercel es bueno o malo?". Vercel es excelente para ciertos casos: proyectos peque&#241;os, MVPs r&#225;pidos, prototipos que validan una idea, apps internas con pocos usuarios. Para esos escenarios, la velocidad de desarrollo que ofrece es inigualable.</p><p>La pregunta real es:</p><p><strong>*&#191;Sabes exactamente lo que te costar&#237;a irte? S&#237; o no.</strong> *</p><p>Si no puedes responder con un n&#250;mero de d&#237;as de ingenier&#237;a y una lista de dependencias, tu arquitectura ya est&#225; comprometida. No importa lo bien que funcione hoy. No importa lo bonito que sea el dashboard. Est&#225;s construyendo sobre terreno que no controlas.</p><p>El Marco de Portabilidad Forzada te lleva menos de un d&#237;a de implementar. Y te ahorrar&#225; semanas &#8212;o meses&#8212; cuando llegue el momento de salir. No porque Vercel sea malo, sino porque cualquier plataforma que controla tu runtime es un riesgo que merece ser medido.</p><p>Porque en 2026, el verdadero lujo no es el zero-config. Es poder elegir d&#243;nde corre tu c&#243;digo. Es tener la certeza de que, si ma&#241;ana las condiciones cambian, tu aplicaci&#243;n no se queda atrapada en un ecosistema del que no puedes escapar.</p><p>La portabilidad no es un lujo. Es el requisito m&#237;nimo para llamarte profesional.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/vercel-vendor-lock-in-migracion-framework-5-pasos-20260528?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item></channel></rss>