Arquitecto de automatización con IA: Día 85
Índice de contenido
Resumen:
Un método solo vale si funciona fuera del negocio donde nació. En esta entrada, Valeria reúne en una mesa a los tres negocios de otros sectores que acompañaron a la serie, la Clínica Dental Sonrisa Norte, el tostador Café Altura y el Despacho Contable Ledesma y Asociados, y repasa con ellos lo que hizo en cada uno con los mismos cinco pasos que usó en Trigo Lento: medir, contratar los datos, elegir con números, poner a una persona al mando y medir de nuevo. Con los precios revisados en octubre de 2026, la clínica cuesta $10.68$ USD al mes, el tostador $30.17$ y el despacho $11.84$, frente a los $36.35$ de la panadería; en cada uno manda un rubro distinto, y por eso los umbrales no se copian. Verá cómo los datos de salud, los de pago y los fiscales cambian el diseño antes de escribir una regla, qué riesgo cambia de cara en cada negocio, qué se transfiere de uno a otro y qué no, y terminará con una plantilla de caso de diez apartados probada en un cuarto negocio.
¿Cómo citar el presente artículo?
Romero, J. (26 de abril de 2026). Arquitecto de automatización con IA: Día 85. python-data-engineer. https://www.python-data-engineer.com/post/aai/dia_85/.
Arquitecto de automatización con IA: Día 85 by Jeshua Romero Guadarrama, available under Attribution 4.0 International (CC BY 4.0) at https://www.python-data-engineer.com/post/aai/dia_85/.
Precios, límites y políticas revisados en octubre de 2026: planes, precios y límites de Make, n8n, Zapier, WhatsApp (Meta, Twilio, Wati) y de la API de Claude. Las cifras de los tres negocios se toman de sus propias entradas (días 7 y 51, 20 y 73, 31 y 59) y, donde la ficha de planificación decía otra cosa, mandan las entradas publicadas. Las referencias legales se revisaron en la misma fecha: la Ley Federal de Protección de Datos Personales en Posesión de los Particulares publicada en el DOF el 20 de marzo de 2025 (consentimiento expreso y por escrito para datos sensibles en su artículo 8), la NOM-004-SSA3-2012 del expediente clínico (DOF, 15 de octubre de 2012), la declaratoria de vigencia de la NMX-COE-001-SCFI-2018 (DOF, 30 de abril de 2019) y el artículo 30 del Código Fiscal de la Federación; se citan para orientar el diseño y no sustituyen la asesoría de un profesional. La tarifa de marketing de WhatsApp en México varía entre fuentes (de $0.0305$ a $0.0436$ USD); la serie usa $0.0305$ y lo declara. El Bloque 10 llama a la API de Claude y no se ejecutó para escribir la entrada; su salida es un ejemplo comentado. Los cuatro negocios, sus personas y todas sus cifras son ficticios.
Día 85. Caso comparado: el mismo método en la clínica dental, la tienda en línea y el despacho contable
Introducción
Ayer, en el Día 84 (Proyecto integrador V: costes finales frente a los 45 USD), Valeria cerró la factura del ecosistema rubro por rubro, la comparó con el reparto inicial del Día 12, proyectó el mes en que un crecimiento del $5%$ mensual rompería el tope y calculó el retorno de las horas ahorradas, y Trigo Lento ganó una cifra que Don Ernesto llevaba ochenta días pidiendo: $36.35$ USD al mes, con $8.65$ de reserva. Hoy es domingo 26 de abril, la panadería cierra a las dos y Valeria ha invitado a comer a tres personas que no se conocen entre sí pero que tienen algo en común: a los tres les aplicó, en algún momento de la serie, el método que aprendió aquí.
La Dra. Lucía Fernández, de la Clínica Dental Sonrisa Norte, llega con una hogaza bajo el brazo que compró en el mostrador antes de que cerraran. Inés Cabrera, de Café Altura, trae un kilo de Oaxaca recién tostado. El C.P. Ricardo Ledesma, el contador de Trigo Lento desde hace doce años, trae una carpeta, porque un contador no sabe llegar a ningún sitio sin una. Valeria ha puesto en la mesa del fondo cuatro hojas, una por negocio, con las mismas diez preguntas, y quiere revisar con ellos qué pasó después de cada entrada: si la clínica sigue mandando recordatorios, si el tostador todavía empaca hasta medianoche y si el despacho cerró abril con menos horas que marzo.
Don Ernesto pasa con una charola de conchas y mira las cuatro hojas de reojo. “Lo que sirve para el pan no sirve para las muelas”, dice, y sigue de largo hacia el obrador. Tiene razón a medias, y las dos mitades son el tema de hoy. La mitad que tiene razón: los umbrales, las plataformas y la decisión de qué ve una persona no se copian de un negocio a otro, porque en la clínica manda el servidor, en la tienda manda Make y en el despacho manda el secreto profesional. La mitad que no: el plano con el que se decide todo eso es exactamente el mismo, y por eso Valeria pudo aplicarlo tres veces fuera de la panadería sin cambiar una fórmula.
En la presente entrada, descubrirá cómo se formula el método integrador de la serie en cinco pasos, con su pregunta, su artefacto y su criterio de salida, y lo verá aplicado a los cuatro negocios con la matriz de priorización del Día 1. Dibujará las tres arquitecturas con el mismo vocabulario (disparador, contrato, decisión, IA, paso humano y registro), calculará el coste mensual de cada una por rubro con los precios de octubre de 2026 y lo pondrá junto a los $36.35$ USD de Trigo Lento. Después clasificará los campos de cada contrato de datos y verá qué norma cambia el diseño en cada sector, seguirá un mismo riesgo que cambia de cara tres veces, separará lo que se transfiere de lo que no, y terminará con plantilla_caso_automatizacion.md, una hoja de diez apartados que se prueba, antes del postre, con un cuarto negocio que nadie de la mesa conoce.
Objetivos de aprendizaje
Al terminar esta entrada, usted podrá:
- Aplicar el método integrador de la serie (medir, contratar los datos, elegir plataformas con números, poner a una persona al mando, medir de nuevo) a tres negocios distintos de Trigo Lento.
- Comparar arquitectura, coste mensual y riesgos de la Clínica Dental Sonrisa Norte, Café Altura y el Despacho Contable Ledesma y Asociados con los mismos precios revisados en octubre de 2026.
- Identificar las diferencias regulatorias que cambian el diseño: datos de salud (sensibles), comercio electrónico (protección al consumidor) y datos fiscales (CFDI y conservación).
- Distinguir qué se transfiere de un negocio a otro (método, patrones, piezas) y qué no (umbrales, controles, decisiones), y dejar una plantilla genérica de caso reutilizable.
El método integrador en cinco pasos
Durante 84 días la serie no ha seguido un método escrito; lo ha seguido a secas. Hoy conviene escribirlo, porque es lo único que de verdad viaja de un negocio a otro. Si se mira con distancia lo que Valeria hizo en Trigo Lento, en la clínica, en el tostador y en el despacho, siempre fueron los mismos cinco pasos, cada uno con una pregunta, con un artefacto que la responde y con un criterio que dice cuándo se puede pasar al siguiente:
- Medir. ¿Cuánto cuesta hoy el proceso, en minutos y en pesos? El artefacto es el mapa del proceso con minutos por paso y la matriz de priorización del Día 1; el criterio de salida, una lista de procesos con horas al mes y tres prioritarios.
- Contratar los datos. ¿Qué entra, qué sale y qué campo es sensible? El artefacto es el contrato de datos del Día 4; se sale con un esquema donde cada campo tiene tipo, obligatoriedad y clasificación.
- Elegir con números. ¿Qué plataforma cabe en el volumen y en el presupuesto? El artefacto es la cuenta de créditos, ejecuciones y mensajes del Día 12; se sale con un coste mensual por rubro dentro de un tope declarado.
- Poner a una persona al mando. ¿Qué decisión no toma la máquina y quién la toma? El artefacto son las aprobaciones del Día 74; se sale con una lista de pasos humanos con responsable y plazo.
- Medir de nuevo. ¿El flujo hizo lo que prometió y a qué coste? El artefacto es el cuadro de mando del Día 75; se sale cuando los indicadores y el coste real se comparan con la medición inicial.
El orden importa tanto como los pasos. Medir antes de contratar evita contratos para procesos que no valen la pena; contratar antes de elegir plataforma evita elegir por el conector bonito; elegir con números antes de poner a una persona evita descubrir, ya construido, que el flujo no cabe en el presupuesto; y medir de nuevo cierra el círculo, porque sin la segunda medición nadie sabe si la primera era verdad. La Figura 1 despliega ese plano sobre los tres edificios de hoy, y lo que se ve es que el plano es idéntico y que cada edificio responde las cinco preguntas con cifras distintas.
Figura 1. Un mismo plano, tres edificios: el método en cinco pasos se copia tal cual sobre el consultorio, la tienda y la oficina; lo que cambia en cada uno es el volumen, la plataforma, el rubro que manda en la factura, el dato que no sale y la persona al mando.
Comencemos por preparar el entorno con las importaciones base, la semilla global de la serie, el tipo de cambio didáctico y una carpeta propia para el caso comparado, trigo_lento/dia_85/, donde se guardarán las fichas, la clasificación de campos y la plantilla:
# Importaciones base, semilla de la serie, tipo de cambio didáctico y carpeta del día en Python:
import warnings
warnings.filterwarnings('ignore')
import json
import textwrap
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch, Polygon, Patch
# Generador aleatorio con la semilla global de la serie:
rng = np.random.default_rng(2026)
pd.set_option('display.width', 160)
pd.set_option('display.max_colwidth', 60)
CDMX = ZoneInfo('America/Mexico_City')
MXN_POR_USD = 18.50 # tipo de cambio didáctico fijo de la serie
carpeta = Path('trigo_lento') / 'dia_85'
carpeta.mkdir(parents = True, exist_ok = True)
DIAS = ['lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado', 'domingo']
hoy = datetime(2026, 4, 26, 14, 0, tzinfo = CDMX)
print('numpy', np.__version__, '| pandas', pd.__version__, '| matplotlib', matplotlib.__version__)
print(f'Hoy: {DIAS[hoy.weekday()]} {hoy:%d/%m/%Y %H:%M} | carpeta del caso: {carpeta.as_posix()}/ | 1 USD = {MXN_POR_USD} MXN (didáctico)')
numpy 2.4.6 | pandas 3.0.3 | matplotlib 3.10.9
Hoy: domingo 26/04/2026 14:00 | carpeta del caso: trigo_lento/dia_85/ | 1 USD = 18.5 MXN (didáctico)
La salida fija el día y las versiones con las que se calcularon todas las cifras. El tipo de cambio de $18.50$ MXN por USD es el mismo de toda la serie: no es una cotización, es un supuesto declarado para que los pesos y los dólares de los cuatro negocios se puedan sumar en la misma tabla.
Tres negocios, tres puntos de partida
Antes de comparar nada hay que fijar las fichas, igual que el Día 1 fijó la de Trigo Lento, el Día 7 la de la clínica, el Día 20 la del tostador y el Día 31 la del despacho. Los cuatro negocios son ficticios y todas sus cifras son supuestos didácticos; lo que importa aquí no es que sean verdad, sino que sean coherentes con lo que cada entrada publicó, porque las cifras de hoy se derivan de aquellas. Cuando la ficha de planificación de esta entrada decía otra cosa (por ejemplo, $7,200$ comprobantes al mes en el despacho o $282$ recordatorios de carrito en el tostador), mandan las entradas publicadas: $1,800$ comprobantes y $198$ recordatorios con consentimiento.
Sonrisa Norte (días 7 y 51) es una clínica dental de Lindavista con dos dentistas, la Dra. Lucía Fernández y el Dr. Andrés Ríos, y una recepcionista, Irma Salgado, que atiende el teléfono, el WhatsApp y el mostrador. Da $360$ citas al mes con un ingreso medio de $850$ MXN, una inasistencia del $15%$ (uno de cada siete pacientes no llega ni avisa) y una hora de recepción valorada en $70$ MXN. Café Altura (días 20 y 73) es un tostador de especialidad de la colonia Portales con tres personas: Inés Cabrera tuesta y compra, Paco Mena empaca y envía, Lucía Robles atiende y lleva las redes. Vende solo en línea, $620$ pedidos al mes con un ticket de $540$ MXN, y valora su hora en $90$ MXN porque una hora empacando es una hora que no se tuesta. Ledesma y Asociados (días 31 y 59) es un despacho contable de la Del Valle con cinco contadores y $120$ clientes, que recibe por correo $1,800$ comprobantes al mes y concilia $2,100$ cargos bancarios, con una hora de auxiliar a $150$ MXN. El siguiente bloque escribe las cuatro fichas como diccionarios, con los supuestos marcados, y las resume en una sola tabla:
# Fichas de Trigo Lento y de los tres negocios de otros sectores como diccionarios, con los supuestos marcados, en Python:
NEGOCIOS = {
'Trigo Lento': {
'giro': 'panadería de masa madre por encargo', 'zona': 'Narvarte', 'dias': '1 a 89', 'personas': 6,
'equipo': 'Don Ernesto (dueño), Valeria (administración), 2 panaderos, 2 de mostrador',
'unidad': 'encargo', 'volumen_mes': 468, 'ticket_mxn': 380, 'hora_mxn': 75,
'canales': {'WhatsApp': .55, 'Instagram': .20, 'Formulario web': .15, 'Teléfono': .10},
'otro_volumen': ('mensajes de WhatsApp al mes', 1_560),
'datos': ['nombre', 'teléfono', 'dirección de entrega', 'preferencias', 'pedido'],
'plataformas': ['Make Core', 'n8n propio', 'Cloud API de WhatsApp', 'Claude'],
'supuestos': ['ticket medio', 'valor de la hora', 'reparto de canales'],
},
'Sonrisa Norte': {
'giro': 'clínica dental', 'zona': 'Lindavista', 'dias': '7 y 51', 'personas': 3,
'equipo': 'Dra. Lucía Fernández y Dr. Andrés Ríos (dentistas), Irma Salgado (recepción)',
'unidad': 'cita', 'volumen_mes': 360, 'ticket_mxn': 850, 'hora_mxn': 70,
'canales': {'Teléfono': .50, 'WhatsApp': .40, 'Mostrador': .10},
'otro_volumen': ('inasistencias al mes (15 %)', 54),
'datos': ['nombre', 'teléfono', 'fecha y hora de la cita', 'motivo de consulta', 'expediente clínico'],
'plataformas': ['n8n propio', 'Cloud API de WhatsApp'],
'supuestos': ['ingreso por cita', 'inasistencia', 'valor de la hora'],
},
'Café Altura': {
'giro': 'tostador con tienda en línea', 'zona': 'Portales', 'dias': '20 y 73', 'personas': 3,
'equipo': 'Inés Cabrera (tueste y compras), Paco Mena (empaque y envíos), Lucía Robles (atención y redes)',
'unidad': 'pedido', 'volumen_mes': 620, 'ticket_mxn': 540, 'hora_mxn': 90,
'canales': {'Tienda en línea': .70, 'Instagram': .20, 'WhatsApp': .10},
'otro_volumen': ('recordatorios de carrito con consentimiento', 198),
'datos': ['nombre', 'correo', 'teléfono', 'dirección de envío', 'pedido', 'estado del pago', 'guía de envío'],
'plataformas': ['Make Core', 'Tienda en línea (Shopify)', 'Cloud API de WhatsApp', 'Claude Sonnet 5.5'],
'supuestos': ['ticket medio', 'valor de la hora', 'minutos por proceso'],
},
'Ledesma y Asociados': {
'giro': 'despacho contable', 'zona': 'Del Valle', 'dias': '31 y 59', 'personas': 5,
'equipo': 'C.P. Ricardo Ledesma y cuatro contadores asociados, 24 clientes cada uno',
'unidad': 'comprobante', 'volumen_mes': 1_800, 'ticket_mxn': None, 'hora_mxn': 150,
'canales': {'Correo (buzón de comprobantes)': 1.0},
'otro_volumen': ('cargos bancarios al mes', 2_100),
'datos': ['RFC', 'razón social', 'UUID', 'conceptos', 'importes', 'movimientos bancarios'],
'plataformas': ['Make Core', 'Claude Haiku 5.5 (clasificación)', 'Claude Sonnet 5.5 en lote'],
'supuestos': ['comprobantes al mes', 'cargos al mes', 'valor de la hora'],
},
}
resumen = pd.DataFrame([{
'negocio': n, 'giro': f['giro'], 'personas': f['personas'], 'unidad': f['unidad'], 'al_mes': f['volumen_mes'],
'hora_mxn': f['hora_mxn'], 'canal_principal': max(f['canales'], key = f['canales'].get),
'campos': len(f['datos']), 'plataformas': len(f['plataformas']), 'dias': f['dias'],
} for n, f in NEGOCIOS.items()])
print(resumen.to_string(index = False))
ventas = {n: f['volumen_mes'] * f['ticket_mxn'] for n, f in NEGOCIOS.items() if f['ticket_mxn']}
print('\nIngreso mensual por la unidad medida (MXN):', {n: f'{v:,.0f}' for n, v in ventas.items()})
print('Supuestos declarados:', sum(len(f['supuestos']) for f in NEGOCIOS.values()), 'en cuatro fichas; todos los negocios son ficticios')
(carpeta / 'fichas_negocios.json').write_text(json.dumps(NEGOCIOS, ensure_ascii = False, indent = 1), encoding = 'utf-8')
negocio giro personas unidad al_mes hora_mxn canal_principal campos plataformas dias
Trigo Lento panadería de masa madre por encargo 6 encargo 468 75 WhatsApp 5 4 1 a 89
Sonrisa Norte clínica dental 3 cita 360 70 Teléfono 5 2 7 y 51
Café Altura tostador con tienda en línea 3 pedido 620 90 Tienda en línea 7 4 20 y 73
Ledesma y Asociados despacho contable 5 comprobante 1800 150 Correo (buzón de comprobantes) 6 3 31 y 59
Ingreso mensual por la unidad medida (MXN): {'Trigo Lento': '177,840', 'Sonrisa Norte': '306,000', 'Café Altura': '334,800'}
Supuestos declarados: 12 en cuatro fichas; todos los negocios son ficticios
Tres cosas saltan de la salida. La primera es la unidad de trabajo: encargo, cita, pedido y comprobante. Cada negocio mide el mundo con una unidad distinta y todo lo demás (minutos, coste, riesgo) se cuelga de ella; cuando más adelante se calcule el coste por unidad, serán esos cuatro denominadores los que hagan comparables cuatro facturas que no se parecen. La segunda es el canal principal: WhatsApp en la panadería, el teléfono en la clínica, la tienda en línea en el tostador y el correo en el despacho. Un flujo que solo escuchara WhatsApp dejaría fuera a la mitad de los pacientes de Sonrisa Norte y a todos los comprobantes de Ledesma, y esa es la primera razón por la que el disparador no se copia. La tercera es que el despacho no tiene ticket: su unidad no vende nada, la paga un cliente por honorarios, y por eso el valor de sus horas no se compara con ventas sino con lo que cuesta un auxiliar.
Los ingresos mensuales por la unidad medida son $177,840$ MXN en Trigo Lento, $306,000$ en la clínica y $334,800$ en el tostador. No son el tamaño del negocio (la panadería vende también en mostrador, la clínica tiene tratamientos de varias citas), son el tamaño de lo que el método tocó. Los $12$ supuestos declarados en las cuatro fichas, tres por negocio, son el precio de la honestidad: cada cifra que no se midió lleva su etiqueta.
La matriz del Día 1 en cuatro negocios
El primer paso del método es medir, y su herramienta es la matriz de priorización del Día 1, que combina en un puntaje la frecuencia de un proceso, sus minutos, su tasa de error y su riesgo:
$$ P_i = w_f,\frac{f_i}{\max f} + w_t,\frac{t_i}{\max t} + w_e,\frac{e_i}{\max e} + w_r\left(1 - \frac{r_i - 1}{4}\right) $$
La lógica de la fórmula no cambia de un negocio a otro, y conviene recordarla antes de aplicarla tres veces más:
- $f_i$, $t_i$ y $e_i$ se normalizan dividiendo entre el máximo de los procesos candidatos del mismo negocio, de modo que la matriz de la clínica no se compara con la del despacho: el puntaje ordena procesos dentro de un negocio, no negocios entre sí.
- El riesgo resta: el término $1 - (r_i - 1)/4$ vale $1$ con riesgo $1$ y $0$ con riesgo $5$; un proceso arriesgado no se descarta, pero no se empieza por él.
- Los pesos $w_f = 0.35$, $w_t = 0.25$, $w_e = 0.20$ y $w_r = 0.20$ son los del Día 1 y se mantienen en los cuatro negocios para que la comparación sea de datos, no de pesos.
- Lo excluido por regla (las recetas del obrador, el expediente clínico, la deducibilidad) no recibe puntaje: queda fuera por decisión, no por número, y aparece en la matriz para que se vea que se decidió.
El siguiente bloque escribe los cinco pasos como una tabla, carga los procesos candidatos de cada negocio con los minutos de sus entradas y aplica la fórmula con la función aplicar_metodo, que devuelve la matriz ordenada y el contrato mínimo del proceso que queda primero:
# El método integrador en cinco pasos y la matriz de priorización del Día 1 aplicada a cada negocio en Python:
PASOS = pd.DataFrame([
(1, 'Medir', '¿Cuánto cuesta hoy el proceso, en minutos y en pesos?', 'Mapa del proceso y matriz de priorización', 1,
'Horas al mes por proceso y tres procesos prioritarios'),
(2, 'Contratar los datos', '¿Qué entra, qué sale y qué campo es sensible?', 'Contrato de datos del pedido', 4,
'Esquema con tipos, obligatorios y clasificación de cada campo'),
(3, 'Elegir con números', '¿Qué plataforma cabe en el volumen y en el presupuesto?', 'Costes y límites por plataforma', 12,
'Coste mensual por rubro dentro del tope declarado'),
(4, 'Poner a una persona al mando', '¿Qué decisión no toma la máquina y quién la toma?', 'Aprobaciones con Slack y WhatsApp', 74,
'Lista de pasos humanos con responsable y plazo'),
(5, 'Medir de nuevo', '¿El flujo hizo lo que prometió y a qué coste?', 'Cuadro de mando de las automatizaciones', 75,
'Indicadores y coste real frente a la medición inicial'),
], columns = ['paso', 'nombre', 'pregunta', 'artefacto', 'dia', 'criterio_de_salida'])
PESOS = {'frecuencia': 0.35, 'tiempo': 0.25, 'error': 0.20, 'riesgo': 0.20} # los del Día 1
# Procesos candidatos: (proceso, veces al mes, minutos, tasa de error, riesgo 1 a 5, excluido por regla, contrato mínimo).
# Trigo Lento del Día 1; la clínica del Día 7; Café Altura del Día 20 (riesgo de 1 a 3 llevado a 1 a 5); el despacho de los días 31 y 59:
CANDIDATOS = {
'Trigo Lento': [
('Encargos', 468, 6.0, 0.08, 3, False, ['producto', 'cantidad', 'fecha de entrega', 'nombre', 'teléfono']),
('Confirmaciones', 468, 1.0, 0.05, 2, False, ['pedido', 'teléfono', 'precio']),
('Factura de Brújula', 4, 25.0, 0.10, 4, False, ['renglones', 'RFC del cliente', 'total']),
('Inventario de harina', 26, 10.0, 0.06, 2, False, ['insumo', 'existencia', 'punto de reorden']),
('Respuesta a reseñas', 30, 4.0, 0.03, 4, False, ['reseña', 'borrador', 'aprobación']),
('Recetas del obrador', 0, 0.0, 0.00, 5, True, []),
],
'Sonrisa Norte': [
('Agendar cita', 360, 3.5, 0.04, 3, False, ['nombre', 'teléfono', 'fecha', 'hora', 'dentista']),
('Recordatorio de cita', 360, 2.0, 0.06, 2, False, ['nombre de pila', 'fecha', 'hora', 'dirección']),
('Cobro y factura', 360, 2.5, 0.03, 4, False, ['importe', 'RFC', 'forma de pago']),
('Confirmar cita', 360, 0.5, 0.03, 1, False, ['cita', 'respuesta']),
('Recordatorio de revisión semestral', 60, 2.5, 0.05, 2, False, ['nombre de pila', 'mes', 'consentimiento']),
('Reagendar cancelaciones', 36, 4.0, 0.08, 2, False, ['cita', 'huecos de agenda']),
('Notas del expediente clínico', 360, 3.0, 0.02, 5, True, []),
],
'Café Altura': [
('Confirmar y registrar pedido', 620, 3.0, 0.03, 1, False, ['clave del pedido', 'renglones', 'estado del pago']),
('Guía de envío y rastreo', 620, 5.0, 0.05, 3, False, ['clave del pedido', 'dirección', 'peso', 'guía']),
('Inventario y reorden de tueste', 620, 1.5, 0.04, 1, False, ['café', 'presentación', 'existencia']),
('Devoluciones', 19, 20.0, 0.10, 5, False, ['clave del pedido', 'motivo', 'importe']),
('Recordatorio de carrito', 198, 0.0, 0.00, 5, False, ['carrito', 'consentimiento de marketing', 'baja']),
],
'Ledesma y Asociados': [
('Recepción y captura de comprobantes', 1_800, 3.0, 0.05, 3, False, ['XML', 'UUID', 'RFC emisor', 'total']),
('Clasificación del gasto', 1_800, 0.5, 0.08, 3, False, ['clave de producto', 'descripción', 'importe']),
('Conciliación bancaria', 2_100, 1.5, 0.06, 4, False, ['cargo', 'fecha', 'importe', 'candidatos']),
('Extracción de PDF sin XML', 144, 4.0, 0.10, 3, False, ['PDF', 'campos extraídos', 'provisional']),
('Deducibilidad y declaraciones', 120, 30.0, 0.05, 5, True, []),
],
}
def aplicar_metodo(nombre):
# Paso 1 del método: horas al mes y puntaje del Día 1; lo excluido por regla no recibe puntaje:
df = pd.DataFrame(CANDIDATOS[nombre], columns = ['proceso', 'veces_mes', 'minutos', 'tasa_error', 'riesgo', 'excluido', 'contrato'])
df['horas_mes'] = df.veces_mes * df.minutos / 60
candidatos = df[~df.excluido]
df['puntaje'] = (PESOS['frecuencia'] * df.veces_mes / candidatos.veces_mes.max()
+ PESOS['tiempo'] * df.minutos / candidatos.minutos.max()
+ PESOS['error'] * df.tasa_error / candidatos.tasa_error.max()
+ PESOS['riesgo'] * (1 - (df.riesgo - 1) / 4))
df.loc[df.excluido, 'puntaje'] = np.nan
return df.sort_values('puntaje', ascending = False, na_position = 'last').reset_index(drop = True)
prioridades = {n: aplicar_metodo(n) for n in NEGOCIOS}
for nombre, df in prioridades.items():
print(f'\n{nombre}: {len(df)} candidatos, {int(df.excluido.sum())} excluido(s) por regla, '
f'{df[~df.excluido].horas_mes.sum():.1f} horas al mes a mano en lo automatizable')
print(df[~df.excluido].head(3)[['proceso', 'veces_mes', 'minutos', 'horas_mes', 'riesgo', 'puntaje']].round(3).to_string(index = False))
print(' contrato mínimo del primero:', ', '.join(df.loc[0, 'contrato']), '| excluido:',
', '.join(df[df.excluido].proceso) or 'nada')
print()
print(PASOS[['paso', 'nombre', 'artefacto', 'dia']].to_string(index = False))
Trigo Lento: 6 candidatos, 1 excluido(s) por regla, 62.6 horas al mes a mano en lo automatizable
proceso veces_mes minutos horas_mes riesgo puntaje
Encargos 468 6.0 46.800 3 0.670
Confirmaciones 468 1.0 7.800 2 0.610
Factura de Brújula 4 25.0 1.667 4 0.503
contrato mínimo del primero: producto, cantidad, fecha de entrega, nombre, teléfono | excluido: Recetas del obrador
Sonrisa Norte: 7 candidatos, 1 excluido(s) por regla, 55.9 horas al mes a mano en lo automatizable
proceso veces_mes minutos horas_mes riesgo puntaje
Recordatorio de cita 360 2.0 12.0 2 0.775
Agendar cita 360 3.5 21.0 3 0.769
Confirmar cita 360 0.5 3.0 1 0.656
contrato mínimo del primero: nombre de pila, fecha, hora, dirección | excluido: Notas del expediente clínico
Café Altura: 5 candidatos, 0 excluido(s) por regla, 104.5 horas al mes a mano en lo automatizable
proceso veces_mes minutos horas_mes riesgo puntaje
Inventario y reorden de tueste 620 1.5 15.500 1 0.649
Confirmar y registrar pedido 620 3.0 31.000 1 0.648
Guía de envío y rastreo 620 5.0 51.667 3 0.612
contrato mínimo del primero: café, presentación, existencia | excluido: nada
Ledesma y Asociados: 5 candidatos, 1 excluido(s) por regla, 167.1 horas al mes a mano en lo automatizable
proceso veces_mes minutos horas_mes riesgo puntaje
Recepción y captura de comprobantes 1800 3.0 90.0 3 0.688
Conciliación bancaria 2100 1.5 52.5 4 0.614
Clasificación del gasto 1800 0.5 15.0 3 0.591
contrato mínimo del primero: XML, UUID, RFC emisor, total | excluido: Deducibilidad y declaraciones
paso nombre artefacto dia
1 Medir Mapa del proceso y matriz de priorización 1
2 Contratar los datos Contrato de datos del pedido 4
3 Elegir con números Costes y límites por plataforma 12
4 Poner a una persona al mando Aprobaciones con Slack y WhatsApp 74
5 Medir de nuevo Cuadro de mando de las automatizaciones 75
Los tres puntajes de Trigo Lento son exactamente los del Día 1 ($0.670$, $0.610$ y $0.503$), lo que confirma que la función reproduce la matriz original. En la clínica, el recordatorio de cita queda primero con $0.775$ y agendar segundo con $0.769$: cuatro milésimas de diferencia que el Día 7 ya había visto desde otro ángulo (por horas ganaba agendar, por valor ganaba el recordatorio) y que el Día 51 resolvió a favor del recordatorio porque su riesgo es menor y su beneficio, las citas recuperadas, es el mayor. En el tostador, inventario ($0.649$), confirmación ($0.648$) y guías ($0.612$) quedan a menos de cuatro centésimas, el mismo trío que el Día 20 ordenó por meses de recuperación y riesgo con las guías al frente; cuando tres procesos empatan en la matriz, el desempate lo dan el Pareto de horas y el riesgo, no más decimales. En el despacho, la captura de comprobantes ($0.688$) manda sobre la conciliación ($0.614$) porque es más frecuente y menos arriesgada, y en ese orden se construyeron los días 31 y 59.
La Tabla 1 reúne el método con su pregunta, su artefacto, el día en que la serie lo construyó y el criterio que permite pasar al siguiente paso:
Tabla 1. El método integrador: paso, pregunta, artefacto de la serie, día y criterio de salida.
| Paso | Pregunta | Artefacto de la serie | Día | Criterio de salida |
|---|---|---|---|---|
| 1. Medir | ¿Cuánto cuesta hoy el proceso, en minutos y en pesos? | Mapa del proceso y matriz de priorización | 1 | Horas al mes por proceso y tres procesos prioritarios |
| 2. Contratar los datos | ¿Qué entra, qué sale y qué campo es sensible? | Contrato de datos del pedido | 4 | Esquema con tipos, obligatorios y clasificación de cada campo |
| 3. Elegir con números | ¿Qué plataforma cabe en el volumen y en el presupuesto? | Costes y límites por plataforma | 12 | Coste mensual por rubro dentro del tope declarado |
| 4. Poner a una persona al mando | ¿Qué decisión no toma la máquina y quién la toma? | Aprobaciones con Slack y WhatsApp | 74 | Lista de pasos humanos con responsable y plazo |
| 5. Medir de nuevo | ¿El flujo hizo lo que prometió y a qué coste? | Cuadro de mando de las automatizaciones | 75 | Indicadores y coste real frente a la medición inicial |
Lucía, que escucha la explicación con la hogaza todavía en la bolsa, lo resume a su manera: “Entonces lo que usted hizo en mi clínica fue lo mismo que en la panadería, pero con mis minutos.” Exactamente eso. Y Ricardo, sin levantar la vista de la tabla, añade la objeción del contador: “Con sus pesos. Si yo cambio $w_r$ a $0.40$, ¿me cambia el orden?” En su despacho no: la captura sigue primera con cualquier juego razonable de pesos, porque gana en frecuencia y en horas a la vez. En el tostador sí podría, y por eso el Día 20 no se fió solo de la matriz.
Arquitecturas comparadas
El segundo y el tercer paso del método, contratar los datos y elegir con números, producen una arquitectura. Para compararlas sin que la plataforma lo tape todo, las tres se dibujan con el mismo vocabulario de seis palabras que la serie usa desde el Día 2: disparador (lo que inicia el flujo), contrato (los datos validados que entran), decisión (una regla que bifurca), IA (un paso que llama a un modelo), paso humano (una persona que decide) y registro (lo que queda escrito sin contenido sensible). Las formas son las fijas de la serie: óvalo verde, rectángulo azul, rombo naranja, rectángulo morado, hexágono gris y rectángulo rojo para el manejo de errores.
La clínica
Sonrisa Norte tiene la arquitectura con menos piezas y, sobre todo, con menos IA: ninguna. La agenda es la fuente de verdad y dispara el flujo cuarenta y ocho horas antes de cada cita; el contrato lleva nombre de pila, fecha, hora y dirección de la clínica, y nada más, porque el Día 51 decidió que ni el tratamiento ni el nombre del dentista (que en una clínica pequeña revela la especialidad) caben en un recordatorio. Una decisión comprueba consentimiento, horario y días de cierre; una plantilla de utilidad con dos botones sale por la Cloud API; la respuesta del paciente vuelve por el webhook, con su firma verificada, y una segunda decisión la clasifica sin modelo: confirma, cancela o escribe texto libre. Las cancelaciones y el texto libre van a la bandeja de Irma, que es la persona al mando; el registro guarda identificadores y estados durante doce meses. La plataforma es n8n en un servidor propio, elegida para que los datos de salud no pasen por más intermediarios de los necesarios.
Café Altura
El tostador vive de eventos de la tienda en línea, y por eso su arquitectura tiene cuatro disparadores: pedido pagado, entrega, carrito abandonado y devolución. Del pedido pagado sale el contrato del pedido (clave única, renglones, estado del pago), la guía de envío hacia la paquetería y un aviso de envío de utilidad; de la entrega, un segundo aviso. El carrito abandonado pasa por una decisión que consulta el consentimiento de marketing y, solo si existe, manda un único recordatorio con enlace de baja. La devolución es el único paso de IA: Sonnet 5.5 clasifica el motivo y redacta un borrador, e Inés aprueba cada reembolso y cada respuesta. La plataforma es Make Core, por la abundancia de conectores de comercio electrónico y de paquetería, y las fichas de producto del Día 73 (generadas con atributos verificados y revisadas por Inés y Lucía) viven fuera de este dibujo porque no son un flujo mensual sino un relanzamiento.
El despacho
Ledesma y Asociados tiene la arquitectura con más IA (tres pasos) y, paradójicamente, la que menos datos le enseña a un modelo. El correo con comprobante dispara el flujo; la primera decisión pregunta si trae XML. Si lo trae, el CFDI 4.0 se lee con reglas y la biblioteca estándar, sin modelo; si no, Sonnet 5.5 lee el PDF en el lote nocturno y el resultado entra como provisional. La validación en centavos (RFC, UUID, aritmética del total) es una acción pura; la segunda decisión clasifica el gasto por clave de producto y manda a Haiku 5.5 solo lo ambiguo, con clave, descripción e importe y nada que identifique a nadie. La conciliación bancaria resuelve por regla y por puntaje lo evidente y deja que Sonnet proponga pareja, también en lote, para los ambiguos; el contador firma, y la hoja por cliente es el registro. El siguiente bloque escribe las tres arquitecturas como nodos y aristas, define la función de dibujo con las formas fijas de la serie y las pinta en tres paneles:
# Las tres arquitecturas como nodos y aristas con el vocabulario de la serie, dibujadas en tres paneles en Python:
FORMAS = {'disparador': ('ovalo', '#1f9d55'), 'contrato': ('caja', '#2a78d6'), 'accion': ('caja', '#2a78d6'),
'registro': ('caja', '#2a78d6'), 'decision': ('rombo', '#eb6834'), 'ia': ('caja', '#7b4fc9'),
'humano': ('hexagono', '#8a8a8a'), 'error': ('caja', '#c0392b')}
ARQUITECTURAS = {
'Sonrisa Norte (n8n propio y Cloud API)': ([
('Cita en 48 h', 'disparador', 0, 0), ('Contrato de cita', 'contrato', 1, 0), ('¿Consentimiento y horario?', 'decision', 2, 0),
('Plantilla de utilidad', 'accion', 3, 0), ('Respuesta por botón', 'disparador', 4, 0), ('¿Confirma, cancela o escribe?', 'decision', 5, 0),
('Irma: cancela y lee', 'humano', 6, 0), ('Registro 12 meses', 'registro', 7, 0), ('Firma inválida', 'error', 4, -1),
], [('Cita en 48 h', 'Contrato de cita'), ('Contrato de cita', '¿Consentimiento y horario?'), ('¿Consentimiento y horario?', 'Plantilla de utilidad'),
('Plantilla de utilidad', 'Respuesta por botón'), ('Respuesta por botón', '¿Confirma, cancela o escribe?'),
('¿Confirma, cancela o escribe?', 'Irma: cancela y lee'), ('Irma: cancela y lee', 'Registro 12 meses'), ('Respuesta por botón', 'Firma inválida')]),
'Café Altura (Make Core y Cloud API)': ([
('Pedido pagado', 'disparador', 0, 0), ('Contrato del pedido', 'contrato', 1, 0), ('Guía de envío', 'accion', 2, 0),
('Aviso de envío', 'accion', 3, 0), ('Entrega', 'disparador', 4, 0), ('Aviso de entrega', 'accion', 5, 0), ('Registro', 'registro', 7, 0),
('Carrito abandonado', 'disparador', 0, -1), ('¿Consentimiento de marketing?', 'decision', 1, -1), ('Un solo recordatorio', 'accion', 2, -1),
('Devolución', 'disparador', 4, -1), ('Sonnet clasifica y redacta', 'ia', 5, -1), ('Inés aprueba', 'humano', 6, -1),
], [('Pedido pagado', 'Contrato del pedido'), ('Contrato del pedido', 'Guía de envío'), ('Guía de envío', 'Aviso de envío'),
('Aviso de envío', 'Entrega'), ('Entrega', 'Aviso de entrega'), ('Aviso de entrega', 'Registro'),
('Carrito abandonado', '¿Consentimiento de marketing?'), ('¿Consentimiento de marketing?', 'Un solo recordatorio'),
('Devolución', 'Sonnet clasifica y redacta'), ('Sonnet clasifica y redacta', 'Inés aprueba'), ('Inés aprueba', 'Registro')]),
'Ledesma y Asociados (Make Core y lote nocturno)': ([
('Correo con comprobante', 'disparador', 0, 0), ('¿Trae XML?', 'decision', 1, 0), ('Contrato CFDI 4.0 por reglas', 'contrato', 2, 0),
('Sonnet lee el PDF (lote)', 'ia', 2, -1), ('Validación en centavos', 'accion', 3, 0), ('¿Categoría por regla?', 'decision', 4, 0),
('Haiku clasifica lo ambiguo', 'ia', 4, -1), ('Conciliación por puntaje', 'accion', 5, 0), ('Sonnet propone pareja (lote)', 'ia', 5, -1),
('Contador firma', 'humano', 6, 0), ('Hoja por cliente', 'registro', 7, 0),
], [('Correo con comprobante', '¿Trae XML?'), ('¿Trae XML?', 'Contrato CFDI 4.0 por reglas'), ('¿Trae XML?', 'Sonnet lee el PDF (lote)'),
('Contrato CFDI 4.0 por reglas', 'Validación en centavos'), ('Sonnet lee el PDF (lote)', 'Validación en centavos'),
('Validación en centavos', '¿Categoría por regla?'), ('¿Categoría por regla?', 'Conciliación por puntaje'),
('¿Categoría por regla?', 'Haiku clasifica lo ambiguo'), ('Haiku clasifica lo ambiguo', 'Conciliación por puntaje'),
('Conciliación por puntaje', 'Sonnet propone pareja (lote)'), ('Sonnet propone pareja (lote)', 'Contador firma'),
('Conciliación por puntaje', 'Contador firma'), ('Contador firma', 'Hoja por cliente')]),
}
def dibujar_flujo(ax, nodos, aristas, titulo):
# Formas fijas de la serie: disparador en óvalo verde, acción en rectángulo azul, decisión en rombo naranja,
# IA en rectángulo morado, error en rojo y paso humano en hexágono gris; la etiqueta pequeña es el vocabulario:
pos = {}
for nombre, tipo, x, y in nodos:
x, y = x * 2.4, y * 1.5
pos[nombre] = (x, y)
forma, color = FORMAS[tipo]
if forma == 'rombo':
ax.add_patch(Polygon([(x - 1.05, y), (x, y + 0.6), (x + 1.05, y), (x, y - 0.6)], facecolor = color, edgecolor = 'white'))
elif forma == 'hexagono':
ax.add_patch(Polygon([(x - 1.0, y), (x - 0.75, y + 0.45), (x + 0.75, y + 0.45), (x + 1.0, y), (x + 0.75, y - 0.45),
(x - 0.75, y - 0.45)], facecolor = color, edgecolor = 'white'))
else:
estilo = 'round,pad=0.05,rounding_size=0.4' if forma == 'ovalo' else 'round,pad=0.05'
ax.add_patch(FancyBboxPatch((x - 0.95, y - 0.42), 1.9, 0.84, boxstyle = estilo, facecolor = color, edgecolor = 'white', linewidth = 2))
ax.text(x, y + 0.08, textwrap.fill(nombre, 13 if forma == 'rombo' else 16, break_long_words = False),
ha = 'center', va = 'center', color = 'white', fontsize = 7.6)
ax.text(x, y - 0.3, tipo, ha = 'center', va = 'center', color = 'white', fontsize = 6.2)
for o, d in aristas:
(x1, y1), (x2, y2) = pos[o], pos[d]
if abs(y1 - y2) < 0.01:
inicio, fin = (x1 + 1.0, y1), (x2 - 1.0, y2)
elif abs(x1 - x2) < 0.01:
inicio, fin = (x1, y1 - 0.62), (x2, y2 + 0.62)
else:
inicio, fin = (x1 + 0.6, y1 - 0.42 if y2 < y1 else y1 + 0.42), (x2 - 0.9, y2 + 0.3 if y2 < y1 else y2 - 0.3)
ax.add_patch(FancyArrowPatch(inicio, fin, arrowstyle = '-|>', mutation_scale = 12, color = '#52514e', linewidth = 1.3))
xs, ys = [p[0] for p in pos.values()], [p[1] for p in pos.values()]
ax.set_xlim(min(xs) - 1.2, max(xs) + 1.2)
ax.set_ylim(min(ys) - 0.75, max(ys) + 0.75)
ax.set_aspect('equal')
ax.axis('off')
ax.set_title(titulo, fontsize = 12, loc = 'left')
fig, axes = plt.subplots(3, 1, figsize = (16, 11.5))
conteo = []
for ax, (titulo, (nodos, aristas)) in zip(axes, ARQUITECTURAS.items()):
dibujar_flujo(ax, nodos, aristas, titulo)
tipos = pd.Series([t for _, t, _, _ in nodos]).value_counts()
conteo.append({'arquitectura': titulo.split(' (')[0], 'nodos': len(nodos), 'aristas': len(aristas),
**{t: int(tipos.get(t, 0)) for t in ['disparador', 'decision', 'ia', 'humano', 'registro']}})
leyenda = [Patch(facecolor = c, label = t) for t, (_, c) in FORMAS.items()]
axes[0].legend(handles = leyenda, loc = 'upper right', ncol = 4, fontsize = 8, frameon = False, bbox_to_anchor = (1.0, 1.32))
plt.tight_layout()
plt.show()
conteo = pd.DataFrame(conteo).set_index('arquitectura')
print(conteo.to_string())
print('Pasos de IA en total:', int(conteo.ia.sum()), '| pasos humanos:', int(conteo.humano.sum()),
'| la clínica no tiene ningún nodo de IA: la respuesta por botón hace innecesaria la clasificación')
nodos aristas disparador decision ia humano registro
arquitectura
Sonrisa Norte 9 8 2 2 0 1 1
Café Altura 13 11 4 1 1 1 1
Ledesma y Asociados 11 13 1 2 3 1 1
Pasos de IA en total: 4 | pasos humanos: 3 | la clínica no tiene ningún nodo de IA: la respuesta por botón hace innecesaria la clasificación

La salida cuenta lo que el dibujo muestra. La clínica tiene $9$ nodos y ningún paso de IA: el botón de la plantilla hace el trabajo que en Trigo Lento hacía un clasificador, porque un paciente que pulsa “Confirmo” no necesita que nadie interprete su mensaje. El tostador tiene $13$ nodos, cuatro disparadores y un solo paso de IA, el único que toca dinero, y por eso ese paso tiene detrás un hexágono gris con el nombre de Inés. El despacho tiene $11$ nodos y $3$ pasos de IA, todos después de una decisión por reglas que les quita el trabajo fácil, y todos antes de la firma del contador. En total son $4$ pasos de IA y $3$ pasos humanos en tres negocios, y en ninguno de los tres hay un camino que vaya de un modelo a un efecto económico sin pasar por una persona o por una validación en código.
Atención aquí: la cantidad de IA de una arquitectura no mide su calidad ni su modernidad. La clínica no tiene ningún modelo porque un botón resuelve el problema con menos riesgo; el despacho tiene tres porque el XML no siempre llega y porque hay ambigüedades que una regla no resuelve. Si al dibujar su propio caso aparece un rectángulo morado donde cabría un rombo naranja, cámbielo: una regla es gratis, determinista y se prueba con datos fijados; un modelo cuesta tokens, puede equivocarse y exige una persona o una comprobación detrás.
Coste mensual
El tercer paso del método pide elegir con números, y los números son los de las Tablas A, B y C de la serie, revisados en octubre de 2026: Make Core a $10.59$ USD en pago mensual con $10,000$ créditos, un servidor propio pequeño a $6.00$ USD, la plantilla de utilidad de WhatsApp en México a $0.0085$ USD por mensaje entregado por la Cloud API directa, la de marketing a $0.0305$, y los modelos de Claude a sus precios por millón de tokens, con el $50%$ de descuento en lote. El coste mensual de un negocio $b$ es la suma de sus rubros fijos, de sus mensajes por cantidad y de sus tokens:
$$ C_b = \sum_{r} F_{r} + \sum_{j} n_j,p_j + \sum_{k} d_k,\frac{e_k,P_e + s_k,P_s}{10^6} $$
La lógica detrás de la fórmula es múltiple:
- $F_r$ son los rubros fijos (la plataforma, el servidor) que se pagan aunque el flujo no corra; en la clínica son el $56%$ del total y en el despacho el $89%$.
- $n_j,p_j$ es la cantidad de mensajes de cada categoría por su tarifa: $504$ recordatorios y $46$ avisos a Irma en la clínica, $1,240$ avisos de envío y $198$ recordatorios de carrito en el tostador, ninguno en el despacho.
- $e_k$ y $s_k$ son los tokens de entrada y salida de cada tarea de IA, $P_e$ y $P_s$ sus precios, y $d_k$ vale $0.5$ si la tarea va en lote y $1$ si es inmediata; el despacho hace todo en lote y el tostador tiene un tope de gasto de $3.00$ USD configurado en la consola, declarado como supuesto.
- Nada de esto incluye el trabajo de las personas: el coste del paso humano se mide en el paso 5, en horas, y aparece en la sección de transferencia.
El siguiente bloque escribe los rubros de cada negocio con sus cantidades, los suma, los compara con el tope de $45$ USD de Trigo Lento y calcula el coste por unidad medida; después dibuja las cuatro facturas como barras apiladas con la línea del tope:
# Coste mensual por rubro y negocio con los precios de las Tablas A, B y C, frente a los 36.35 USD de Trigo Lento, en Python:
PRECIOS = {'make_core': 10.59, 'servidor': 6.00, 'utilidad': 0.0085, 'marketing': 0.0305} # USD, revisado en octubre de 2026
RUBROS = ['Plataforma (Make Core)', 'Servidor propio (n8n)', 'Mensajería de utilidad', 'Mensajería de marketing', 'Claude']
COSTES = {
# Clínica (Día 51): 504 recordatorios más 46 avisos a Irma por la Cloud API; servidor propio; ningún modelo de IA:
'Sonrisa Norte': {'Servidor propio (n8n)': PRECIOS['servidor'], 'Mensajería de utilidad': (504 + 46) * PRECIOS['utilidad']},
# Tostador (días 20 y 73): Make Core con 9 050 créditos, dos avisos de utilidad por pedido, 198 recordatorios de
# marketing con consentimiento y un tope de gasto de Sonnet 5.5 de 3.00 USD (supuesto declarado):
'Café Altura': {'Plataforma (Make Core)': PRECIOS['make_core'], 'Mensajería de utilidad': 2 * 620 * PRECIOS['utilidad'],
'Mensajería de marketing': 198 * PRECIOS['marketing'], 'Claude': 3.00},
# Despacho (días 31 y 59): Make Core con 9 450 créditos; Haiku 5.5 para lo ambiguo (0.079) y Sonnet 5.5 en lote (1.168):
'Ledesma y Asociados': {'Plataforma (Make Core)': PRECIOS['make_core'], 'Claude': 0.079 + 1.168},
# Trigo Lento (Día 84): la factura final del ecosistema:
'Trigo Lento': {'Plataforma (Make Core)': 10.59, 'Servidor propio (n8n)': 6.00, 'Mensajería de utilidad': 11.18, 'Claude': 8.58},
}
tabla_costes = pd.DataFrame(COSTES).T.reindex(columns = RUBROS).fillna(0.0)
tabla_costes['Total USD'] = tabla_costes.sum(axis = 1)
tabla_costes['Total MXN'] = tabla_costes['Total USD'] * MXN_POR_USD
tabla_costes['% de 45'] = 100 * tabla_costes['Total USD'] / 45
tabla_costes['rubro dominante'] = tabla_costes[RUBROS].idxmax(axis = 1)
tabla_costes['peso dominante %'] = 100 * tabla_costes[RUBROS].max(axis = 1) / tabla_costes['Total USD']
print(tabla_costes.round(2).to_string())
por_unidad = {n: tabla_costes.loc[n, 'Total MXN'] / NEGOCIOS[n]['volumen_mes'] for n in NEGOCIOS}
print('\nCoste por unidad medida (MXN):', {n: f'{v:.2f} por {NEGOCIOS[n]["unidad"]}' for n, v in por_unidad.items()})
fig, ax = plt.subplots(figsize = (10, 5))
colores = ['#2a78d6', '#8a8a8a', '#1f9d55', '#eb6834', '#7b4fc9']
base = np.zeros(len(tabla_costes))
for rubro, color in zip(RUBROS, colores):
ax.bar(tabla_costes.index, tabla_costes[rubro], bottom = base, color = color, label = rubro, width = 0.6)
base += tabla_costes[rubro].values
for i, total in enumerate(tabla_costes['Total USD']):
ax.text(i, total + 0.8, f'{total:.2f} USD', ha = 'center', fontsize = 10, fontweight = 'bold')
ax.axhline(45, color = '#c0392b', linestyle = '--', linewidth = 1.5)
ax.text(3.35, 45.8, 'Tope de Trigo Lento: 45 USD', ha = 'right', color = '#c0392b', fontsize = 9)
ax.set_ylabel('USD al mes')
ax.set_ylim(0, 62)
ax.set_title('Coste mensual por rubro y negocio (precios revisados en octubre de 2026)', fontsize = 13)
ax.legend(fontsize = 8.5, loc = 'upper left', ncol = 3, frameon = False)
plt.tight_layout()
plt.show()
Plataforma (Make Core) Servidor propio (n8n) Mensajería de utilidad Mensajería de marketing Claude Total USD Total MXN % de 45 rubro dominante peso dominante %
Sonrisa Norte 0.00 6.0 4.68 0.00 0.00 10.68 197.49 23.72 Servidor propio (n8n) 56.21
Café Altura 10.59 0.0 10.54 6.04 3.00 30.17 558.13 67.04 Plataforma (Make Core) 35.10
Ledesma y Asociados 10.59 0.0 0.00 0.00 1.25 11.84 218.98 26.30 Plataforma (Make Core) 89.47
Trigo Lento 10.59 6.0 11.18 0.00 8.58 36.35 672.48 80.78 Mensajería de utilidad 30.76
Coste por unidad medida (MXN): {'Trigo Lento': '1.44 por encargo', 'Sonrisa Norte': '0.55 por cita', 'Café Altura': '0.90 por pedido', 'Ledesma y Asociados': '0.12 por comprobante'}

La salida es la Tabla 2, y confirma, con las cifras de las entradas publicadas, lo que el plan había calculado: la clínica cuesta $10.68$ USD al mes ($197.49$ MXN), el tostador $30.17$ USD ($558.13$ MXN), el despacho $11.84$ USD ($218.98$ MXN) y Trigo Lento $36.35$ USD ($672.48$ MXN). Ninguno llega al tope de $45$; el que más se acerca es la panadería, con el $80.78%$, y el que menos la clínica, con el $23.72%$.
Tabla 2. Coste mensual por negocio y rubro en USD (precios revisados en octubre de 2026; Trigo Lento según la factura del Día 84).
| Negocio | Plataforma (Make Core) | Servidor propio (n8n) | Mensajería de utilidad | Mensajería de marketing | Claude | Total USD | Total MXN | % de 45 USD | Rubro dominante |
|---|---|---|---|---|---|---|---|---|---|
| Sonrisa Norte | 0.00 | 6.00 | 4.68 | 0.00 | 0.00 | 10.68 | 197.49 | 23.72 | Servidor (56.2 %) |
| Café Altura | 10.59 | 0.00 | 10.54 | 6.04 | 3.00 | 30.17 | 558.13 | 67.04 | Make Core (35.1 %) |
| Ledesma y Asociados | 10.59 | 0.00 | 0.00 | 0.00 | 1.25 | 11.84 | 218.98 | 26.30 | Make Core (89.5 %) |
| Trigo Lento | 10.59 | 6.00 | 11.18 | 0.00 | 8.58 | 36.35 | 672.48 | 80.78 | Mensajería (30.8 %) |
Lo importante no son los totales, sino la última columna: el rubro dominante cambia en cada negocio. En la clínica manda el servidor, porque los mensajes de $360$ citas cuestan menos que una comida; en el tostador y en el despacho manda Make Core, aunque por razones opuestas (en el tostador es el $35%$ de una factura repartida y en el despacho el $89%$ de una factura casi vacía); en Trigo Lento manda la mensajería, porque $1,560$ mensajes al mes con confirmaciones y avisos son el volumen más alto de los cuatro. Esa es la razón técnica de que los umbrales no se copien: una alerta al $80%$ de los créditos de Make es vital en el despacho, que usa $9,450$ de $10,000$, y carece de sentido en la clínica, que no usa Make. El coste por unidad lo dice de otra manera: $1.44$ MXN por encargo, $0.55$ por cita, $0.90$ por pedido y $0.12$ por comprobante; el despacho es el más barato por unidad porque un comprobante que se lee con reglas no cuesta nada, y la panadería la más cara porque cada encargo lleva una conversación.
Dos diferencias frente a la ficha de planificación merecen una línea. La clínica cuesta $10.68$ y no $10.28$ porque el Día 51 añadió $46$ avisos a Irma que el plan no contaba; el tostador cuesta $30.17$ y no $32.73$ porque el Día 20 filtró los recordatorios de carrito con consentimiento de $282$ a $198$, y $84$ mensajes de marketing que no se envían son $2.56$ USD que no se gastan y, sobre todo, $84$ personas a las que no se escribe sin permiso. En las dos, mandan las entradas.
Diferencias regulatorias
El segundo paso del método, contratar los datos, tiene en los tres negocios una parte que Trigo Lento apenas necesitó: clasificar cada campo según lo que la ley dice de él. Una panadería trata nombres, teléfonos y direcciones, datos personales ordinarios bajo la Ley Federal de Protección de Datos Personales en Posesión de los Particulares, la LFPDPPP, en su versión publicada en el DOF el 20 de marzo de 2025. Los tres negocios de hoy tratan, además, un tipo de dato cada uno que cambia el diseño antes de escribir una sola regla:
- Datos de salud. La LFPDPPP los considera datos personales sensibles y exige para ellos consentimiento expreso y por escrito (artículo 8), que puede otorgarse con firma autógrafa, firma electrónica o un mecanismo de autenticación; el expediente clínico, además, está regido por la NOM-004-SSA3-2012 (DOF, 15 de octubre de 2012), que lo pone bajo custodia del prestador de servicios y fija su conservación mínima en cinco años. Efecto en el diseño: el motivo de consulta, el tratamiento, el dentista y el expediente no salen hacia la mensajería ni hacia ningún modelo; el recordatorio dice “su cita”, no “su endodoncia”.
- Datos de pago y comercio electrónico. La NMX-COE-001-SCFI-2018 (declaratoria de vigencia en el DOF del 30 de abril de 2019) fija las disposiciones para quien ofrezca o venda bienes y servicios en línea: información veraz, precio total, condiciones de entrega y de devolución; la Ley Federal de Protección al Consumidor respalda lo mismo con fuerza de ley, y la LFPDPPP trata los datos patrimoniales con consentimiento expreso. Efecto en el diseño: el número de tarjeta nunca toca un flujo de Make, lo maneja la pasarela; el flujo recibe solo el identificador del pago y su estado, y toda promesa de una ficha de producto tiene un atributo verificado detrás.
- Datos fiscales. El artículo 30 del Código Fiscal de la Federación obliga a conservar la contabilidad y su documentación durante cinco años desde la fecha en que se presentaron o debieron presentarse las declaraciones (con excepciones que amplían el plazo), y el contador está sujeto al secreto profesional sobre los datos de sus clientes y de los terceros que aparecen en sus comprobantes. Efecto en el diseño: RFC, razón social, UUID y totales no salen a un modelo; el XML se lee con reglas, a Claude viajan solo la clave de producto, la descripción y el importe de los conceptos, y las copias cifradas fuera del servidor son parte del diseño, no un extra.
La Figura 2 dibuja las tres cajas fuertes con su norma, lo que entra al flujo y lo que nunca entra; lo común a las tres, debajo, es la ley general: aviso de privacidad, consentimiento por finalidad, minimización y un registro que no guarda contenido sensible. El siguiente bloque escribe la tabla de tipos de dato con su norma, su obligación, su efecto en el diseño y su control, clasifica los campos de los cuatro contratos y cuenta cuántos de cada tipo pueden ir a un modelo tal cual:
Figura 2. Tres cajas fuertes distintas: los datos de salud, los de pago y los fiscales tienen una norma, una cerradura y una regla propias sobre lo que entra al flujo y lo que nunca entra; lo común a las tres es la ley de datos personales.
# Clasificación de los campos de cada contrato de datos y controles exigidos por tipo de dato en Python:
TIPOS = pd.DataFrame([
('identificador', 'LFPDPPP (datos personales)', 'Aviso de privacidad, finalidad declarada y minimización',
'Se seudonimiza antes de llegar a un modelo (HMAC, Día 6)', 'Seudonimizador y lista de campos permitidos'),
('contacto', 'LFPDPPP y políticas de WhatsApp Business', 'Consentimiento por finalidad y canal; baja inmediata',
'Solo se escribe con pedido en curso o consentimiento; plantillas aprobadas', 'Registro de consentimientos consultado antes de enviar'),
('salud', 'LFPDPPP art. 8 (datos sensibles) y NOM-004-SSA3-2012', 'Consentimiento expreso y por escrito; expediente bajo custodia del prestador',
'No viaja a la mensajería ni a un modelo; el recordatorio no nombra el tratamiento', 'Lista de campos prohibidos en plantillas y registros'),
('pago', 'NMX-COE-001-SCFI-2018 y LFPDPPP (datos patrimoniales)', 'Información veraz, precio total y condiciones de devolución; consentimiento expreso',
'Los datos de tarjeta nunca tocan los flujos: los maneja la pasarela', 'El flujo recibe solo el identificador del pago y su estado'),
('fiscal', 'CFF art. 30 y secreto profesional del contador', 'Conservar la contabilidad cinco años; confidencialidad de terceros',
'RFC, nombres y UUID no salen a un modelo; el XML se lee con reglas', 'Validador del blueprint y lista de campos que viajan'),
('operativo', 'Sin norma específica', 'Exactitud y trazabilidad', 'Se automatiza con reglas y se prueba', 'Pruebas del flujo con datos fijados (Día 43)'),
], columns = ['tipo', 'norma', 'obligacion', 'efecto_en_el_diseno', 'control']).set_index('tipo')
CAMPOS = {
'Trigo Lento': {'nombre': 'identificador', 'teléfono': 'contacto', 'dirección de entrega': 'identificador', 'preferencias': 'operativo',
'producto': 'operativo', 'cantidad': 'operativo', 'fecha de entrega': 'operativo', 'precio': 'operativo',
'RFC de Brújula': 'fiscal', 'consentimiento': 'contacto'},
'Sonrisa Norte': {'nombre': 'identificador', 'teléfono': 'contacto', 'fecha de la cita': 'operativo', 'hora': 'operativo',
'dirección de la clínica': 'operativo', 'dentista': 'salud', 'motivo de consulta': 'salud', 'tratamiento': 'salud',
'expediente clínico': 'salud', 'consentimiento': 'contacto', 'importe de la cita': 'pago'},
'Café Altura': {'nombre': 'identificador', 'correo': 'contacto', 'teléfono': 'contacto', 'dirección de envío': 'identificador',
'clave del pedido': 'operativo', 'renglones': 'operativo', 'estado del pago': 'pago', 'tarjeta': 'pago',
'guía de envío': 'operativo', 'motivo de devolución': 'operativo', 'consentimiento de marketing': 'contacto'},
'Ledesma y Asociados': {'RFC emisor': 'fiscal', 'RFC receptor': 'fiscal', 'razón social': 'fiscal', 'UUID': 'fiscal',
'clave de producto': 'operativo', 'descripción del concepto': 'operativo', 'importe': 'fiscal',
'movimiento bancario': 'fiscal', 'categoría sugerida': 'operativo', 'cliente del despacho': 'identificador'},
}
A_MODELO = {'operativo': 'sí', 'identificador': 'seudonimizado', 'contacto': 'no', 'salud': 'nunca', 'pago': 'nunca', 'fiscal': 'nunca'}
conteo_campos = pd.DataFrame({n: pd.Series(c).value_counts() for n, c in CAMPOS.items()}).reindex(TIPOS.index).fillna(0).astype(int)
print(conteo_campos.to_string())
for n, c in CAMPOS.items():
pueden = sum(A_MODELO[t] == 'sí' for t in c.values())
print(f'{n:>20}: {len(c)} campos, {pueden} pueden ir a un modelo tal cual, '
f'{sum(A_MODELO[t] == "nunca" for t in c.values())} nunca; tipo dominante: {pd.Series(c).value_counts().idxmax()}')
print()
print(TIPOS[['norma', 'efecto_en_el_diseno']].to_string())
(carpeta / 'clasificacion_campos.json').write_text(json.dumps(CAMPOS, ensure_ascii = False, indent = 1), encoding = 'utf-8')
Trigo Lento Sonrisa Norte Café Altura Ledesma y Asociados
tipo
identificador 2 1 2 1
contacto 2 2 3 0
salud 0 4 0 0
pago 0 1 2 0
fiscal 1 0 0 6
operativo 5 3 4 3
Trigo Lento: 10 campos, 5 pueden ir a un modelo tal cual, 1 nunca; tipo dominante: operativo
Sonrisa Norte: 11 campos, 3 pueden ir a un modelo tal cual, 5 nunca; tipo dominante: salud
Café Altura: 11 campos, 4 pueden ir a un modelo tal cual, 2 nunca; tipo dominante: operativo
Ledesma y Asociados: 10 campos, 3 pueden ir a un modelo tal cual, 6 nunca; tipo dominante: fiscal
norma efecto_en_el_diseno
tipo
identificador LFPDPPP (datos personales) Se seudonimiza antes de llegar a un modelo (HMAC, Día 6)
contacto LFPDPPP y políticas de WhatsApp Business Solo se escribe con pedido en curso o consentimiento; plantillas aprobadas
salud LFPDPPP art. 8 (datos sensibles) y NOM-004-SSA3-2012 No viaja a la mensajería ni a un modelo; el recordatorio no nombra el tratamiento
pago NMX-COE-001-SCFI-2018 y LFPDPPP (datos patrimoniales) Los datos de tarjeta nunca tocan los flujos: los maneja la pasarela
fiscal CFF art. 30 y secreto profesional del contador RFC, nombres y UUID no salen a un modelo; el XML se lee con reglas
operativo Sin norma específica Se automatiza con reglas y se prueba
La primera tabla de la salida es un retrato de cada negocio en una sola columna: en la clínica el tipo dominante es salud ($4$ de $11$ campos), en el despacho es fiscal ($6$ de $10$) y en el tostador y la panadería es operativo. La segunda parte dice lo que eso implica para la IA: de los $11$ campos de la clínica, solo $3$ pueden ir a un modelo tal cual y $5$ nunca; de los $10$ del despacho, $3$ y $6$; de los $11$ del tostador, $4$ y $2$; de los $10$ de Trigo Lento, $5$ y $1$. Cuanto más regulado es el dato, menos modelo hay en el flujo, y no porque la ley prohíba los modelos, sino porque cada campo que no viaja es un riesgo que no existe. La Tabla 3 ordena las diferencias:
Tabla 3. Diferencias regulatorias: tipo de dato, norma de referencia, obligación concreta, efecto en el diseño y control en el flujo (revisado en octubre de 2026; no sustituye asesoría legal).
| Tipo de dato | Norma de referencia | Obligación concreta | Efecto en el diseño | Control en el flujo |
|---|---|---|---|---|
| Identificador (nombre, dirección) | LFPDPPP (datos personales) | Aviso de privacidad, finalidad declarada y minimización | Se seudonimiza antes de llegar a un modelo (HMAC, Día 6) | Seudonimizador y lista de campos permitidos |
| Contacto (teléfono, correo, consentimiento) | LFPDPPP y políticas de WhatsApp Business | Consentimiento por finalidad y canal; baja inmediata | Solo se escribe con pedido en curso o consentimiento; plantillas aprobadas | Registro de consentimientos consultado antes de cada envío |
| Salud (motivo, tratamiento, expediente) | LFPDPPP, art. 8, y NOM-004-SSA3-2012 | Consentimiento expreso y por escrito; expediente bajo custodia del prestador, cinco años | No viaja a la mensajería ni a un modelo; el recordatorio no nombra el tratamiento | Lista de campos prohibidos en plantillas y registros |
| Pago (tarjeta, estado del pago) | NMX-COE-001-SCFI-2018, LFPC y LFPDPPP (patrimoniales) | Información veraz, precio total y condiciones de devolución; consentimiento expreso | Los datos de tarjeta nunca tocan los flujos: los maneja la pasarela | El flujo recibe solo el identificador del pago y su estado |
| Fiscal (RFC, UUID, importes) | CFF, art. 30, y secreto profesional | Conservar la contabilidad cinco años; confidencialidad de terceros | RFC, nombres y UUID no salen a un modelo; el XML se lee con reglas | Validador del blueprint y lista de campos que viajan |
| Operativo (producto, fecha, estado) | Sin norma específica | Exactitud y trazabilidad | Se automatiza con reglas y se prueba | Pruebas del flujo con datos fijados (Día 43) |
Ricardo, que ha pasado la comida con la carpeta cerrada, la abre por fin para decir algo que no está en la tabla: “Los cinco años del artículo 30 no son un detalle de archivo. Si un flujo borra un comprobante por error y no hay copia, la autoridad puede extender a diez años su revisión, y eso lo paga mi cliente.” Por eso el riesgo de perder la contabilidad aparece en la matriz de la siguiente sección con el impacto máximo aunque su probabilidad sea la mínima, y por eso las copias del Día 81 no son una buena práctica sino una obligación con fecha.
Riesgos que cambian de forma
Un mismo riesgo tiene tres caras en tres negocios. “El flujo dice más de lo que debe” es, en la clínica, un recordatorio con el tratamiento en el texto; en el tostador, un aviso de envío a quien no compró; en el despacho, una conciliación con un RFC equivocado. El daño es distinto (un dato de salud revelado, un dato personal enviado a la persona equivocada, una deducción asignada al contribuyente equivocado), el control es distinto (una plantilla fija, una clave única de pedido, una regla exacta antes del puntaje) y la norma que lo convierte en riesgo regulatorio es distinta. Lo que no cambia es la forma de medirlo, la matriz de probabilidad por impacto del Día 6:
$$ R = P \times I, \qquad \text{severidad} = \begin{cases} \text{baja} & R \le 5 \ \text{media} & 5 < R \le 11 \ \text{alta} & R > 11 \end{cases} $$
- $P$ e $I$ van de $1$ a $5$ y son supuestos declarados: no hay datos de incidentes en negocios ficticios, y en uno real se calibrarían con el registro de ejecuciones.
- Los umbrales de severidad son los de Trigo Lento y se conservan a propósito: lo que cambia entre negocios es la posición de cada riesgo, no la regla que lo clasifica.
- Un riesgo se marca como regulatorio cuando una norma de la Tabla 3 lo describe; esa marca no cambia $R$, pero sí quién tiene que estar de acuerdo con el control (en la clínica, los dentistas; en el despacho, el contador responsable).
El siguiente bloque escribe cinco riesgos por negocio con su probabilidad, su impacto y su control, calcula el puntaje, los ordena y dibuja la matriz con un color por negocio y un anillo rojo en los regulatorios:
# Riesgos por negocio con probabilidad e impacto supuestos, matriz de riesgos y resaltado de los regulatorios en Python:
RIESGOS = pd.DataFrame([
('Sonrisa Norte', 'Recordatorio con el tratamiento en el texto', 2, 5, True, 'Plantilla fija aprobada; campos prohibidos'),
('Sonrisa Norte', 'Mensaje a quien retiró el consentimiento', 2, 4, True, 'Consulta del registro antes de cada envío'),
('Sonrisa Norte', 'Cancelación procesada sin que Irma la vea', 3, 3, False, 'Toda cancelación pasa por la bandeja de Irma'),
('Sonrisa Norte', 'Recordatorio en día de cierre', 3, 2, False, 'Calendario de cierres en el flujo'),
('Sonrisa Norte', 'Servidor propio caído un lunes', 2, 3, False, 'Manual de operación y envío manual'),
('Café Altura', 'Aviso de envío a quien no compró', 2, 4, True, 'Clave del pedido como identificador único'),
('Café Altura', 'Recordatorio de carrito sin consentimiento', 3, 4, True, 'Cuatro filtros y baja inmediata'),
('Café Altura', 'Reembolso aprobado por la IA', 1, 5, False, 'Inés aprueba cada reembolso'),
('Café Altura', 'Ficha con una promesa sin respaldo', 3, 3, True, 'Cotejo de afirmaciones contra atributos'),
('Café Altura', 'Iterador que agota los créditos de Make', 3, 2, False, 'Actualización agregada; alerta al 80 %'),
('Ledesma y Asociados', 'Conciliación con un RFC equivocado', 2, 5, True, 'Regla exacta primero; el contador firma'),
('Ledesma y Asociados', 'Dato fiscal de un tercero enviado a un modelo', 2, 5, True, 'Validador del blueprint; solo clave e importe'),
('Ledesma y Asociados', 'Comprobante duplicado deducido dos veces', 3, 4, False, 'Almacén de UUID y cuarentena'),
('Ledesma y Asociados', 'PDF leído con un total equivocado', 3, 3, False, 'Provisional hasta tener el XML'),
('Ledesma y Asociados', 'Pérdida de la contabilidad antes de cinco años', 1, 5, True, 'Copias cifradas fuera del servidor'),
], columns = ['negocio', 'riesgo', 'probabilidad', 'impacto', 'regulatorio', 'control'])
RIESGOS['puntaje'] = RIESGOS.probabilidad * RIESGOS.impacto
RIESGOS['severidad'] = pd.cut(RIESGOS.puntaje, [0, 5, 11, 25], labels = ['baja', 'media', 'alta'])
RIESGOS['id'] = [f'{n[0]}{i}' for n, g in RIESGOS.groupby('negocio', sort = False) for i in range(1, len(g) + 1)]
print(RIESGOS.sort_values('puntaje', ascending = False)[['id', 'negocio', 'riesgo', 'probabilidad', 'impacto', 'puntaje', 'regulatorio']]
.to_string(index = False))
print('\nPor negocio:')
print(RIESGOS.groupby('negocio').agg(riesgos = ('riesgo', 'size'), regulatorios = ('regulatorio', 'sum'), puntaje_medio = ('puntaje', 'mean'),
altos = ('severidad', lambda s: int((s == 'alta').sum()))).round(2).to_string())
print(f'Regulatorios: {int(RIESGOS.regulatorio.sum())} de {len(RIESGOS)}; su impacto medio es {RIESGOS[RIESGOS.regulatorio].impacto.mean():.2f} '
f'frente a {RIESGOS[~RIESGOS.regulatorio].impacto.mean():.2f} en los demás')
fig, ax = plt.subplots(figsize = (10, 6))
colores_neg = {'Sonrisa Norte': '#2a78d6', 'Café Altura': '#1f9d55', 'Ledesma y Asociados': '#eb6834'}
ax.add_patch(plt.Rectangle((0.5, 0.5), 5, 5, color = '#f3f3f3', zorder = 0))
ax.add_patch(Polygon([(2.5, 5.5), (5.5, 5.5), (5.5, 2.5)], color = '#fbe3df', zorder = 0))
for (negocio, fila), desplazamiento in zip(RIESGOS.groupby('negocio', sort = False), [(-0.2, 0.2), (0.0, -0.2), (0.2, 0.2)]):
x = fila.probabilidad.values + desplazamiento[0]
y = fila.impacto.values + desplazamiento[1]
ax.scatter(x, y, s = 170, color = colores_neg[negocio], label = negocio, zorder = 3)
reg = fila.regulatorio.values
ax.scatter(x[reg], y[reg], s = 460, facecolors = 'none', edgecolors = '#c0392b', linewidths = 2, zorder = 2)
for xi, yi, r in zip(x, y, fila.id):
ax.text(xi, yi, r, ha = 'center', va = 'center', color = 'white', fontsize = 7, fontweight = 'bold', zorder = 4)
ax.scatter([], [], s = 200, facecolors = 'none', edgecolors = '#c0392b', linewidths = 2, label = 'riesgo regulatorio')
ax.set_xlim(0.5, 5.5)
ax.set_ylim(0.5, 5.5)
ax.set_xlabel('Probabilidad (1 a 5, supuesta)')
ax.set_ylabel('Impacto (1 a 5, supuesto)')
ax.set_title('Matriz de riesgos de los tres negocios (S: clínica, C: tostador, L: despacho); el triángulo rosado es severidad alta',
fontsize = 11.5)
ax.legend(fontsize = 9, loc = 'lower right', frameon = True)
plt.tight_layout()
plt.show()
id negocio riesgo probabilidad impacto puntaje regulatorio
C2 Café Altura Recordatorio de carrito sin consentimiento 3 4 12 True
L3 Ledesma y Asociados Comprobante duplicado deducido dos veces 3 4 12 False
S1 Sonrisa Norte Recordatorio con el tratamiento en el texto 2 5 10 True
L1 Ledesma y Asociados Conciliación con un RFC equivocado 2 5 10 True
L2 Ledesma y Asociados Dato fiscal de un tercero enviado a un modelo 2 5 10 True
C4 Café Altura Ficha con una promesa sin respaldo 3 3 9 True
S3 Sonrisa Norte Cancelación procesada sin que Irma la vea 3 3 9 False
L4 Ledesma y Asociados PDF leído con un total equivocado 3 3 9 False
S2 Sonrisa Norte Mensaje a quien retiró el consentimiento 2 4 8 True
C1 Café Altura Aviso de envío a quien no compró 2 4 8 True
S5 Sonrisa Norte Servidor propio caído un lunes 2 3 6 False
S4 Sonrisa Norte Recordatorio en día de cierre 3 2 6 False
C5 Café Altura Iterador que agota los créditos de Make 3 2 6 False
C3 Café Altura Reembolso aprobado por la IA 1 5 5 False
L5 Ledesma y Asociados Pérdida de la contabilidad antes de cinco años 1 5 5 True
Por negocio:
riesgos regulatorios puntaje_medio altos
negocio
Café Altura 5 3 8.0 1
Ledesma y Asociados 5 3 9.2 1
Sonrisa Norte 5 2 7.8 0
Regulatorios: 8 de 15; su impacto medio es 4.38 frente a 3.14 en los demás

Los dos riesgos de severidad alta son el recordatorio de carrito sin consentimiento en el tostador (C2, $R = 12$) y el comprobante duplicado deducido dos veces en el despacho (L3, $R = 12$); la clínica no tiene ninguno alto, porque su diseño del Día 51 recortó la probabilidad de los suyos hasta dejarlos en media. Justo debajo, con $R = 10$, están los tres riesgos regulatorios de impacto máximo: el recordatorio con el tratamiento (S1), la conciliación con un RFC equivocado (L1) y el dato fiscal de un tercero enviado a un modelo (L2). La cifra que resume la sección es esta: $8$ de los $15$ riesgos son regulatorios y su impacto medio es $4.38$, frente a $3.14$ en los demás. Un riesgo regulatorio rara vez es probable, porque los controles existen precisamente por él, pero cuando ocurre no se arregla con una disculpa.
En la matriz se ve también por qué el control no se transfiere aunque el riesgo sí. El riesgo “mensaje a quien no debía” existe en los tres negocios, pero en la clínica se controla consultando el registro de consentimientos antes de cada envío (S2), en el tostador con la clave del pedido como identificador único (C1) y en el despacho con la regla exacta de UUID antes de cualquier puntaje (L1). Copiar el control de la clínica al despacho no serviría de nada: un comprobante no tiene consentimiento, tiene UUID.
Lo que se transfiere y lo que no
Con las tres arquitecturas, las tres facturas y las tres matrices sobre la mesa, la pregunta de Don Ernesto se puede responder con una lista en lugar de con una opinión. Se transfieren tres cosas. El método, los cinco pasos con sus preguntas y sus criterios de salida, se copia entero y sin cambios: Valeria no tuvo que inventar nada en la clínica, en el tostador ni en el despacho, solo medir. Los patrones se copian como ideas y se adaptan en su implementación: la idempotencia (una clave única por unidad de trabajo, sea pedido, cita o UUID), la falla cerrada del Día 76 (si el sistema de aprobaciones no responde, el flujo no publica, no envía, no concilia), la aprobación humana de todo efecto económico o reputacional y el registro común sin contenido sensible. Las piezas genéricas se copian como código: el validador de contratos del Día 5, el seudonimizador del Día 6, la verificación de firma de webhooks del Día 3, el lector de blueprints del Día 22 y de workflows del Día 36, el detector de secretos del Día 80 y la función dibujar_flujo.
No se transfieren otras tres. Los umbrales, porque dependen del rubro dominante y del volumen: el $80%$ de los créditos de Make, el tope de $45$ USD, los $15$ minutos del SLA de Brújula o el umbral de $0.7$ del clasificador del despacho son números de un negocio. Las plataformas, porque la elección del Día 13 se hizo con el volumen y los conectores de Trigo Lento, y la clínica eligió n8n propio por los datos de salud, el tostador Make por los conectores de comercio, y el despacho Make con lote nocturno por el buzón. Y la decisión de qué ve una persona, porque Irma, Inés y Ricardo no están al mando de lo mismo: Irma de las cancelaciones y el texto libre, Inés de los reembolsos y las afirmaciones de las fichas, Ricardo de la firma de cada conciliación. La Tabla 4 lo ordena:
Tabla 4. Lo que se transfiere y lo que no: patrón o pieza, si se reutiliza tal cual, se adapta o no se transfiere, y por qué.
| Patrón o pieza | Se reutiliza tal cual | Se adapta | No se transfiere | Por qué |
|---|---|---|---|---|
| Método en cinco pasos (Tabla 1) | Sí | Las preguntas y los criterios no dependen del sector | ||
| Matriz de priorización y sus pesos | Sí | Normaliza dentro de cada negocio; los pesos son una convención declarada | ||
| Formato del contrato de datos y su validador | Sí | El esquema es genérico; los campos son del negocio | ||
| Idempotencia (clave única por unidad) | Sí | La idea es la misma; la clave es el pedido, la cita o el UUID | ||
| Falla cerrada ante aprobaciones sin respuesta | Sí | El plazo y el canal de aviso dependen de quién espera | ||
| Aprobación humana de efectos económicos | Sí | La regla es fija; la persona y el efecto, no | ||
| Registro común sin contenido sensible | Sí | Los campos prohibidos los dicta la norma del sector | ||
| Seudonimizador, verificador de firmas, detector de secretos | Sí | Código sin supuestos del negocio | ||
| Umbrales (80 % de créditos, 45 USD, 15 minutos, 0.7) | Sí | Dependen del rubro dominante y del volumen | ||
| Plataforma (Make, n8n propio, lote nocturno) | Sí | Se elige con los conectores, el volumen y el tipo de dato | ||
| Qué ve una persona y quién es | Sí | Irma, Inés y Ricardo deciden cosas distintas |
Hay una última cosa que no se transfiere y que no cabe en la tabla: el valor de la hora. Lo que compra el gasto de cada negocio se mide con las horas que ahorra, y una hora no vale lo mismo en una recepción que en un despacho. El valor mensual de las horas ahorradas y el cociente frente al gasto son:
$$ V_b = c_h \sum_{j} \frac{n_j,(t_{a,j} - t_{d,j})}{60}, \qquad Q_b = \frac{V_b + B_b}{G_b} $$
- $n_j$ es el volumen mensual del proceso $j$, $t_{a,j}$ y $t_{d,j}$ sus minutos antes y después, y $c_h$ el valor de la hora del negocio: $75$ MXN en Trigo Lento, $70$ en la clínica, $90$ en el tostador y $150$ en el despacho.
- $B_b$ es cualquier otro beneficio medido que no sean horas; en la clínica son los $18,644$ MXN de citas recuperadas que la simulación del Día 51 estimó al bajar la inasistencia del $15%$ al $8.9%$, y en los demás negocios vale cero porque no se midió nada más.
- $G_b$ es el gasto mensual de la Tabla 2 en pesos; el cociente $Q_b$ dice cuántas veces el gasto se paga con lo que compra.
El siguiente bloque toma las horas ahorradas que cada entrada midió (los días 1, 47 y 71 en Trigo Lento, el Día 51 en la clínica, la Tabla 3 del Día 20 en el tostador y los días 31 y 59 en el despacho), las valora con la hora de cada negocio y las dibuja junto al gasto:
# Horas ahorradas al mes por proceso y su valor con la hora de cada negocio frente al gasto mensual en Python:
# Trigo Lento: encargos (Día 1), correos (Día 47) y contenido (Día 71), más un supuesto de 6 horas de informes y conciliación.
# Clínica: horas netas de Irma (Día 51) y, aparte, las citas recuperadas. Tostador: Tabla 3 del Día 20. Despacho: días 31 y 59.
HORAS = pd.DataFrame([
('Trigo Lento', 'Encargos', 35.1), ('Trigo Lento', 'Correos de mayoristas', 16.1), ('Trigo Lento', 'Contenido', 8.4),
('Trigo Lento', 'Informes y conciliación (supuesto)', 6.0),
('Sonrisa Norte', 'Recordatorios de cita (Irma, netas)', 9.1),
('Café Altura', 'Confirmar y registrar pedido', 25.83), ('Café Altura', 'Guía de envío y rastreo', 41.33),
('Café Altura', 'Inventario y reorden de tueste', 13.43), ('Café Altura', 'Devoluciones', 2.53),
('Ledesma y Asociados', 'Captura de comprobantes', 75.0), ('Ledesma y Asociados', 'Conciliación bancaria', 34.3),
], columns = ['negocio', 'proceso', 'horas_mes'])
OTRO_VALOR = {'Sonrisa Norte': ('citas recuperadas por menos inasistencia (Día 51)', 18_644.0)}
retorno = HORAS.groupby('negocio', sort = False).horas_mes.sum().to_frame()
retorno['hora_mxn'] = [NEGOCIOS[n]['hora_mxn'] for n in retorno.index]
retorno['valor_horas_mxn'] = retorno.horas_mes * retorno.hora_mxn
retorno['gasto_mxn'] = [tabla_costes.loc[n, 'Total MXN'] for n in retorno.index]
retorno['otro_valor_mxn'] = [OTRO_VALOR.get(n, ('', 0.0))[1] for n in retorno.index]
retorno['cociente_horas'] = retorno.valor_horas_mxn / retorno.gasto_mxn
retorno['cociente_total'] = (retorno.valor_horas_mxn + retorno.otro_valor_mxn) / retorno.gasto_mxn
retorno['meses_para_pagar_8h_de_diseno'] = 8 * retorno.hora_mxn / (retorno.valor_horas_mxn + retorno.otro_valor_mxn - retorno.gasto_mxn)
print(retorno.round(2).to_string())
print(f'\nUna hora vale {NEGOCIOS["Sonrisa Norte"]["hora_mxn"]} MXN en la clínica y {NEGOCIOS["Ledesma y Asociados"]["hora_mxn"]} en el despacho: '
f'el mismo ahorro de 10 horas vale {10 * 70} MXN en una y {10 * 150} en el otro')
fig, ax = plt.subplots(figsize = (10, 5.6))
x = np.arange(len(retorno))
ax.bar(x - 0.3, retorno.valor_horas_mxn, width = 0.28, color = '#1f9d55', label = 'Valor de las horas ahorradas')
ax.bar(x, retorno.otro_valor_mxn, width = 0.28, color = '#7b4fc9', label = 'Citas recuperadas (clínica)')
ax.bar(x + 0.3, retorno.gasto_mxn, width = 0.28, color = '#eb6834', label = 'Gasto mensual (plataformas, mensajería y Claude)')
for i, (v, o, g) in enumerate(zip(retorno.valor_horas_mxn, retorno.otro_valor_mxn, retorno.gasto_mxn)):
ax.text(i - 0.3, v + 250, f'{v:,.0f}', ha = 'center', fontsize = 8.5)
ax.text(i + 0.3, g + 250, f'{g:,.0f}', ha = 'center', fontsize = 8.5)
if o:
ax.text(i, o + 250, f'{o:,.0f}', ha = 'center', fontsize = 8.5)
ax.set_xticks(x)
ax.set_xticklabels(retorno.index)
ax.set_ylabel('MXN al mes')
ax.set_title('Lo que compra el gasto: valor de las horas ahorradas frente al coste mensual (MXN)', fontsize = 13)
ax.set_ylim(0, 21_000)
ax.legend(fontsize = 8.5, frameon = False, loc = 'upper center', bbox_to_anchor = (0.5, -0.08), ncol = 3)
plt.tight_layout()
plt.show()
horas_mes hora_mxn valor_horas_mxn gasto_mxn otro_valor_mxn cociente_horas cociente_total meses_para_pagar_8h_de_diseno
negocio
Trigo Lento 65.60 75 4920.0 672.48 0.0 7.32 7.32 0.14
Sonrisa Norte 9.10 70 637.0 197.49 18644.0 3.23 97.63 0.03
Café Altura 83.12 90 7480.8 558.13 0.0 13.40 13.40 0.10
Ledesma y Asociados 109.30 150 16395.0 218.98 0.0 74.87 74.87 0.07
Una hora vale 70 MXN en la clínica y 150 en el despacho: el mismo ahorro de 10 horas vale 700 MXN en una y 1500 en el otro

La Tabla 5 es la salida, y su última columna responde a la pregunta que cualquier dueño hace antes que ninguna otra: cuánto tarda en pagarse una jornada de diseño. En los cuatro negocios, menos de un mes; en la clínica, con las citas recuperadas, menos de un día.
Tabla 5. Horas ahorradas al mes, su valor con la hora de cada negocio, otro beneficio medido y el gasto mensual (MXN al tipo didáctico de 18.50).
| Negocio | Horas ahorradas al mes | Valor de la hora (MXN) | Valor de las horas (MXN) | Otro beneficio medido (MXN) | Gasto mensual (MXN) | Cociente solo horas | Cociente total |
|---|---|---|---|---|---|---|---|
| Trigo Lento | 65.6 | 75 | 4 920.00 | 0 | 672.48 | 7.32 | 7.32 |
| Sonrisa Norte | 9.1 | 70 | 637.00 | 18 644 (citas recuperadas) | 197.49 | 3.23 | 97.63 |
| Café Altura | 83.1 | 90 | 7 480.80 | 0 | 558.13 | 13.40 | 13.40 |
| Ledesma y Asociados | 109.3 | 150 | 16 395.00 | 0 | 218.98 | 74.87 | 74.87 |
La clínica es el caso que enseña más. Solo por horas, su cociente es el más bajo de los cuatro ($3.23$), porque Irma recupera $9.1$ horas netas al mes y una hora de recepción vale $70$ MXN; con las citas recuperadas, es el más alto ($97.63$), porque el valor del recordatorio no está en el tiempo de quien lo manda sino en el sillón que deja de quedarse vacío. Si Valeria hubiera copiado de Trigo Lento la regla de medir el retorno solo en horas, la clínica habría parecido el peor negocio para automatizar, cuando es el mejor. El despacho enseña lo contrario: $109.3$ horas a $150$ MXN son $16,395$ MXN al mes contra un gasto de $219$, un cociente de $74.87$ sin necesidad de ningún otro beneficio, y por eso Ricardo no preguntó nunca por el precio de Make. Y el tostador, con $83.1$ horas y $7,481$ MXN, es el único donde el gasto se nota ($558$ MXN), porque es el único que paga mensajería de marketing.
La plantilla genérica
Todo lo anterior cabe en una hoja, y esa hoja es el entregable de hoy. plantilla_caso_automatizacion.md tiene diez apartados, uno por cada cosa que las cuatro fichas tuvieron que responder: negocio, procesos medidos, contrato de datos, clasificación de datos y regulación, arquitectura, coste, riesgos, persona al mando, indicadores y hoja de ruta. En cada apartado se dice qué viene de Trigo Lento (y se copia) y qué se rellena para el negocio nuevo, de modo que quien la use sepa dónde no tiene que pensar y dónde no puede dejar de hacerlo. La Figura 3 pone la plantilla sobre la mesa con sus dos colores, el gris de lo que se copia y el amarillo de lo que se rellena, y con el cuarto negocio al lado. El siguiente bloque genera el archivo a partir de una lista de apartados y lo imprime resumido:
Figura 3. La plantilla en la mesa: diez apartados en los que lo gris viene de Trigo Lento y se copia, lo amarillo se rellena para cada negocio, y el cuarto negocio, un taller de bicicletas, sirve para probar que la hoja se entiende sin la serie.
# Generación de la plantilla genérica de caso con diez apartados y lo que viene de Trigo Lento en cada uno en Python:
APARTADOS = [
('Negocio', 'Giro, personas, unidad de trabajo, volumen mensual, canales y valor de la hora (declarado como supuesto si no se midió).',
'La estructura de la ficha del Día 1.', 'Todas las cifras.'),
('Procesos medidos', 'Lista de procesos candidatos con veces al mes, minutos, tasa de error, riesgo (1 a 5) y los excluidos por regla.',
'La fórmula de priorización y sus pesos.', 'Los procesos, los minutos y los excluidos.'),
('Contrato de datos', 'Campos de cada proceso prioritario con tipo, obligatoriedad, formato y origen.',
'El formato del contrato (Día 4) y la validación en código.', 'Los campos.'),
('Clasificación de datos y regulación', 'Tipo de cada campo (identificador, contacto, salud, pago, fiscal, operativo), norma aplicable y si puede ir a un modelo.',
'La tabla de tipos y controles.', 'La clasificación de cada campo y la norma sectorial.'),
('Arquitectura', 'Disparadores, contratos, decisiones, pasos de IA, pasos humanos y registros, con la plataforma elegida y por qué.',
'El vocabulario, las formas y los patrones (idempotencia, falla cerrada, aprobación, registro común).', 'La plataforma y el dibujo.'),
('Coste', 'Rubros mensuales con precio, cantidad y fecha de revisión; tope declarado; coste por unidad.',
'Las tablas de precios y la forma de calcular.', 'Las cantidades, el tope y el rubro dominante.'),
('Riesgos', 'Riesgos con probabilidad, impacto, control y si son regulatorios; matriz.', 'La escala y la matriz.', 'Los riesgos y sus controles.'),
('Persona al mando', 'Decisiones que no toma la máquina, quién las toma, en qué plazo y qué pasa si nadie contesta.',
'La regla de que toda acción con efecto económico o reputacional pasa por una persona.', 'Las decisiones y los nombres.'),
('Indicadores', 'Qué se mide después (tiempo de ciclo, errores, coste real, horas) y contra qué se compara.',
'El cuadro de mando del Día 75 y el registro común.', 'Los umbrales.'),
('Hoja de ruta', 'Orden de construcción por prioridad y riesgo, primer flujo en modo sombra y fecha de la primera revisión.',
'El orden del método.', 'Las fechas y el primer flujo.'),
]
lineas = ['# Plantilla de caso de automatización', '',
'Rellene los diez apartados en orden. Lo que "viene de Trigo Lento" se copia; lo que "se rellena" es propio de cada negocio.',
'Ningún dato personal real: los ejemplos usan formatos de prueba.', '']
for i, (titulo, contenido, viene, rellena) in enumerate(APARTADOS, 1):
lineas += [f'## {i}. {titulo}', '', contenido, '', f'- Viene de Trigo Lento: {viene}', f'- Se rellena: {rellena}', '']
(carpeta / 'plantilla_caso_automatizacion.md').write_text('\n'.join(lineas), encoding = 'utf-8')
print('\n'.join(lineas[:5] + [l for l in lineas[5:] if l.startswith('## ') or l.startswith('- ')]))
print(f'\nplantilla_caso_automatizacion.md: {len(lineas)} líneas, {len(APARTADOS)} apartados, '
f'{sum(len(l.split()) for l in lineas)} palabras')
# Plantilla de caso de automatización
Rellene los diez apartados en orden. Lo que "viene de Trigo Lento" se copia; lo que "se rellena" es propio de cada negocio.
Ningún dato personal real: los ejemplos usan formatos de prueba.
## 1. Negocio
- Viene de Trigo Lento: La estructura de la ficha del Día 1.
- Se rellena: Todas las cifras.
## 2. Procesos medidos
- Viene de Trigo Lento: La fórmula de priorización y sus pesos.
- Se rellena: Los procesos, los minutos y los excluidos.
## 3. Contrato de datos
- Viene de Trigo Lento: El formato del contrato (Día 4) y la validación en código.
- Se rellena: Los campos.
## 4. Clasificación de datos y regulación
- Viene de Trigo Lento: La tabla de tipos y controles.
- Se rellena: La clasificación de cada campo y la norma sectorial.
## 5. Arquitectura
- Viene de Trigo Lento: El vocabulario, las formas y los patrones (idempotencia, falla cerrada, aprobación, registro común).
- Se rellena: La plataforma y el dibujo.
## 6. Coste
- Viene de Trigo Lento: Las tablas de precios y la forma de calcular.
- Se rellena: Las cantidades, el tope y el rubro dominante.
## 7. Riesgos
- Viene de Trigo Lento: La escala y la matriz.
- Se rellena: Los riesgos y sus controles.
## 8. Persona al mando
- Viene de Trigo Lento: La regla de que toda acción con efecto económico o reputacional pasa por una persona.
- Se rellena: Las decisiones y los nombres.
## 9. Indicadores
- Viene de Trigo Lento: El cuadro de mando del Día 75 y el registro común.
- Se rellena: Los umbrales.
## 10. Hoja de ruta
- Viene de Trigo Lento: El orden del método.
- Se rellena: Las fechas y el primer flujo.
plantilla_caso_automatizacion.md: 75 líneas, 10 apartados, 465 palabras
La plantilla tiene $75$ líneas y $465$ palabras, y las instrucciones de cabecera son dos: rellenar los diez apartados en orden, porque el orden es el método, y no escribir ningún dato personal real, porque la plantilla se comparte y los datos no. El apartado 4 es el que no existía en la ficha del Día 1 y el que los tres negocios de hoy obligaron a añadir: sin la clasificación de datos y la norma sectorial, la clínica habría puesto el tratamiento en el recordatorio y el despacho habría mandado el RFC al modelo, y las dos cosas habrían parecido razonables en el dibujo.
El cuarto negocio
Una plantilla se prueba con un caso que nadie de la mesa conoce. Valeria inventa uno sobre la marcha, un taller de bicicletas de la colonia Roma con dos mecánicos y una persona de mostrador, $220$ servicios al mes con un ticket de $650$ MXN, clientes que dejan la bicicleta y preguntan por WhatsApp cuándo estará lista, y piezas que se piden a dos proveedores. Para no rellenar los diez apartados a mano durante el postre, le pide a Claude Opus 5.5 un primer borrador con salida estructurada: un modelo de pydantic con un campo por apartado y un undécimo campo, supuestos, donde el modelo tiene que repetir toda cifra que haya inventado. El prompt no lleva ningún dato personal (no hay clientes, ni teléfonos, ni nombres) y pide que los precios de plataformas se escriban como “a verificar”, porque un modelo no es una fuente de precios y la serie ya tiene sus tablas revisadas. La llamada usa effort explícito, max_tokens holgado, el respaldo del lado del servidor ante un rechazo y comprueba stop_reason antes de leer nada:
# Relleno asistido de la plantilla para un cuarto negocio inventado (un taller de bicicletas) con Claude Opus 5.5 en Python:
import anthropic
from pydantic import BaseModel, Field
class CasoAutomatizacion(BaseModel):
negocio: str = Field(description = 'Giro, personas, unidad de trabajo y volumen mensual; cifras marcadas como supuesto')
procesos_medidos: list[str] = Field(description = 'Procesos candidatos con veces al mes, minutos y riesgo de 1 a 5')
contrato_de_datos: list[str] = Field(description = 'Campos del proceso prioritario con tipo y obligatoriedad')
clasificacion_y_regulacion: list[str] = Field(description = 'Tipo de cada campo, norma aplicable y qué nunca va a un modelo')
arquitectura: list[str] = Field(description = 'Disparador, contrato, decisiones, pasos de IA, pasos humanos y registro')
coste: list[str] = Field(description = 'Rubros mensuales con cantidad y precio; los precios se marcan "a verificar"')
riesgos: list[str] = Field(description = 'Riesgo, probabilidad, impacto y control')
persona_al_mando: list[str] = Field(description = 'Decisiones que no toma la máquina y quién las toma')
indicadores: list[str] = Field(description = 'Qué se mide después y contra qué se compara')
hoja_de_ruta: list[str] = Field(description = 'Orden de construcción y fecha de la primera revisión')
supuestos: list[str] = Field(description = 'Toda cifra que el modelo haya inventado, listada aparte')
# Descripción del cuarto negocio, inventada y sin datos personales (ni clientes, ni teléfonos, ni nombres reales):
TALLER = ('Taller de bicicletas ficticio en la colonia Roma: dos mecánicos y una persona de mostrador; 220 servicios al mes '
'(afinación, cambio de llantas, frenos) con ticket medio de 650 MXN; el cliente deja la bicicleta y pregunta por '
'WhatsApp cuándo estará lista; las piezas se piden a dos proveedores; valor de la hora de mostrador 80 MXN (supuesto).')
plantilla = (carpeta / 'plantilla_caso_automatizacion.md').read_text(encoding = 'utf-8')
cliente = anthropic.Anthropic() # lee ANTHROPIC_API_KEY del entorno; la clave nunca se escribe en el código
respuesta = cliente.beta.messages.parse(
model = 'claude-opus-5-5',
max_tokens = 6_000,
output_config = {'effort': 'medium'},
system = ('Es usted arquitecto de automatización. Rellene una plantilla de caso con el método de la serie: medir, '
'contratar los datos, elegir con números, poner a una persona al mando y medir de nuevo. No invente datos '
'personales ni nombres de clientes; toda cifra que no esté en la descripción se marca como supuesto y se repite '
'en "supuestos". Los precios de plataformas se escriben como "a verificar". Responda en español, en frases cortas.'),
messages = [{'role': 'user', 'content': f'Plantilla:\n{plantilla}\n\nNegocio:\n{TALLER}\n\nRellene los diez apartados.'}],
output_format = CasoAutomatizacion,
betas = ['server-side-fallback-2026-07-01'], fallbacks = 'default', # respaldo del lado del servidor ante un rechazo
)
if respuesta.stop_reason != 'end_turn': # rechazo o corte por max_tokens: la plantilla se rellena a mano
print('Sin borrador:', respuesta.stop_reason)
else:
caso = respuesta.parsed_output
print(f'tokens: {respuesta.usage.input_tokens} de entrada, {respuesta.usage.output_tokens} de salida')
for apartado, contenido in caso.model_dump().items():
print(f'\n## {apartado}')
print('\n'.join(f'- {c}' for c in contenido) if isinstance(contenido, list) else contenido)
(carpeta / 'caso_taller_bicicletas_borrador.json').write_text(caso.model_dump_json(indent = 1), encoding = 'utf-8')
# Salida de ejemplo (puede variar):
# tokens: 1412 de entrada, 1183 de salida
#
# ## negocio
# Taller de bicicletas (ficticio), colonia Roma. Tres personas: dos mecánicos y una de mostrador. Unidad: servicio.
# 220 servicios al mes, ticket medio 650 MXN (143 000 MXN al mes). Canal de consulta: WhatsApp. Hora de mostrador: 80 MXN (supuesto).
#
# ## procesos_medidos
# - Recibir la bicicleta y registrar el servicio: 220 al mes, 5 min (supuesto), riesgo 2
# - Responder "¿ya está lista?": 440 al mes (supuesto: dos consultas por servicio), 2 min (supuesto), riesgo 1
# - Aviso de "lista para recoger": 220 al mes, 1 min (supuesto), riesgo 1
# - Pedido de piezas a proveedores: 40 al mes (supuesto), 10 min (supuesto), riesgo 3
# - Cotización de reparaciones mayores: 30 al mes (supuesto), 15 min (supuesto), riesgo 4
# - Excluido por regla: el diagnóstico mecánico y la decisión de qué reparar
#
# ## contrato_de_datos
# - folio_servicio: texto, obligatorio, identificador único del servicio
# - nombre_de_pila: texto, obligatorio, identificador
# - telefono: texto E.164, obligatorio, contacto
# - bicicleta: texto (tipo y color), obligatorio, operativo
# - servicio: catálogo, obligatorio, operativo
# - fecha_prometida: fecha, obligatoria, operativo
# - estado: recibida, en espera de pieza, lista, entregada; obligatorio, operativo
# - consentimiento_whatsapp: booleano con fecha, obligatorio, contacto
# ...
# ## supuestos
# - Dos consultas por servicio, 5, 2, 1, 10 y 15 minutos por proceso, 40 pedidos de piezas y 30 cotizaciones al mes
# - Precios de Make, del servidor y de las plantillas de WhatsApp: a verificar en la fecha de uso
El borrador de ejemplo cuesta unos $1,400$ tokens de entrada y $1,200$ de salida, alrededor de $0.03$ USD con Opus 5.5, y tarda menos que servir el café. Lo que vale de él no es la prosa, sino dos cosas: que el apartado de procesos ya trae un proceso excluido por regla (“el diagnóstico mecánico y la decisión de qué reparar”), porque la plantilla lo pide, y que el apartado de supuestos lista cada minuto y cada volumen que el modelo tuvo que inventar. Esa lista es la agenda de medición de la semana siguiente: lo que el modelo supuso es exactamente lo que el taller tiene que cronometrar antes de construir nada. El borrador no decide la plataforma, no fija umbrales ni pone nombres en el apartado 8; eso lo hace la persona que revisa, y si stop_reason no es end_turn la plantilla se rellena a mano, como se habría hecho sin el modelo.
Inés, que ha visto rellenarse la hoja mientras terminaba su café, hace la pregunta que cierra la prueba: "¿Y si el taller fuera mío, me serviría sin haber leído sus 85 días?" Esa es la prueba. Una plantilla que solo entiende quien construyó Trigo Lento no transfiere nada; una que un tallerista rellena sola, con sus minutos y sus nombres, es el método entero en una hoja.
Consideraciones finales
Hay algo que los números de hoy no dicen y que conviene decir con palabras. Comparar cuatro negocios con las mismas tablas da una sensación de orden que la realidad no tiene: las fichas son ficticias, los minutos son supuestos y las probabilidades de la matriz de riesgos son de un domingo de abril en una mesa de panadería. Lo que sí es verdad, porque se puede comprobar en las cuatro entradas de origen, es que el método produjo en cada caso un diseño distinto a partir de las mismas preguntas, y que las diferencias se explican con tres cosas que se pueden nombrar: el rubro dominante de la factura, el tipo de dato que manda en el contrato y la persona que firma. Si en un quinto negocio esas tres cosas se parecen a las de uno de los cuatro, el diseño se parecerá; si no, no, y la plantilla lo hará visible en el apartado 4, en el 6 y en el 8 antes de que nadie construya nada.
Un libro que sostiene esta forma de trabajar es Case Study Research and Applications: Design and Methods, de Robert K. Yin (6.ª edición, 2018), que explica por qué varios casos con el mismo protocolo valen más que uno solo bien contado: no porque sumen, sino porque cada caso nuevo intenta replicar o contradecir lo que el anterior sugirió. Los tres negocios de hoy son eso, tres réplicas del caso de Trigo Lento con el mismo protocolo, y la plantilla es el protocolo escrito para que la cuarta réplica la haga otra persona.
Lo que se transfiere de un negocio a otro es el plano, no el edificio: las preguntas, los patrones y las piezas de código viajan intactos, y las cifras, la plataforma y la persona al mando se rellenan cada vez. Don Ernesto tenía razón a medias, y la mitad que le faltaba es la que hoy cabe en una hoja de diez apartados. Antes de irse, Ricardo guardó la plantilla en su carpeta; dijo que tiene $120$ clientes y que a por lo menos diez les vendría bien.
Conclusiones clave
Método
- El método integrador tiene cinco pasos con pregunta, artefacto y criterio de salida (medir, contratar los datos, elegir con números, poner a una persona al mando, medir de nuevo), construidos en los días 1, 4, 12, 74 y 75, y se aplicó sin cambiar una fórmula a los cuatro negocios.
- La matriz del Día 1 reproduce los puntajes de Trigo Lento ($0.670$, $0.610$ y $0.503$) y ordena los demás negocios dentro de sí mismos: recordatorio de cita ($0.775$) en la clínica, inventario, confirmación y guías ($0.649$, $0.648$ y $0.612$) en el tostador y captura de comprobantes ($0.688$) en el despacho; lo excluido por regla no recibe puntaje.
- Con tres procesos empatados en la matriz, el desempate lo dan el Pareto de horas y el riesgo, no más decimales; y con cualquier juego razonable de pesos, el orden del despacho no cambia.
Arquitectura y coste
- Con el mismo vocabulario de seis palabras, la clínica tiene $9$ nodos y ningún paso de IA (el botón sustituye al clasificador), el tostador $13$ nodos y un paso de IA que toca dinero con Inés detrás, y el despacho $11$ nodos y $3$ pasos de IA después de una regla y antes de la firma del contador.
- Con los precios de octubre de 2026, la clínica cuesta $10.68$ USD al mes, el tostador $30.17$, el despacho $11.84$ y Trigo Lento $36.35$; el rubro dominante es distinto en cada uno (servidor, Make Core, Make Core y mensajería), y por eso los umbrales no se copian; por unidad, $0.55$ MXN por cita, $0.90$ por pedido, $0.12$ por comprobante y $1.44$ por encargo.
- El gasto se paga con las horas: $7.32$ veces en Trigo Lento, $13.40$ en el tostador y $74.87$ en el despacho; en la clínica solo $3.23$ por horas y $97.63$ con las citas recuperadas, lo que demuestra que la unidad de valor tampoco se transfiere.
Regulación y transferencia
- Tres tipos de dato cambian el diseño antes de escribir una regla: los de salud (LFPDPPP, art. 8, y NOM-004-SSA3-2012) no salen hacia mensajería ni modelos; los de pago (NMX-COE-001-SCFI-2018) viven en la pasarela y el flujo recibe solo el estado; los fiscales (CFF, art. 30) se conservan cinco años y el XML se lee con reglas, sin RFC ni UUID hacia un modelo.
- Cuanto más regulado es el dato, menos modelo hay en el flujo: $5$ de $11$ campos de la clínica y $6$ de $10$ del despacho no van nunca a un modelo; $8$ de $15$ riesgos son regulatorios y su impacto medio es $4.38$ frente a $3.14$.
- Se transfieren el método, los patrones (idempotencia, falla cerrada, aprobación, registro común) y las piezas genéricas de código; no se transfieren los umbrales, las plataformas ni la decisión de qué ve una persona;
plantilla_caso_automatizacion.mdsepara lo uno de lo otro en diez apartados y se probó con un taller de bicicletas en el que Opus 5.5 escribió el borrador y una persona decidió.
Mañana, en el Día 86: Comparativa final de herramientas: reconstruir Trigo Lento en otra plataforma. Un asesor le ofrece a Valeria “pasarlo todo a Zapier, que es más fácil”, y Ricardo comenta que su despacho ya paga Microsoft 365 y podría usar Power Automate; Don Ernesto hará la pregunta correcta, cuánto costaría irse si mañana el de la plataforma sube el precio, y Valeria reconstruirá el ecosistema entero, con el mismo inventario, los mismos acuerdos de servicio del Día 82 (Acuerdos de servicio del ecosistema: SLA con Brújula, SLO internos y tablero de cumplimiento) y el código de honor como criterio de aceptación, para medir en horas y en dólares lo que vale la portabilidad.
Referencias
- Yin, R. K. (2018). Case Study Research and Applications: Design and Methods (6.ª ed.). SAGE Publications.
- Cámara de Diputados del H. Congreso de la Unión (2025). Ley Federal de Protección de Datos Personales en Posesión de los Particulares (DOF, 20 de marzo de 2025). https://www.diputados.gob.mx/LeyesBiblio/
- Secretaría de Salud (2012). Norma Oficial Mexicana NOM-004-SSA3-2012, Del expediente clínico. Diario Oficial de la Federación, 15 de octubre de 2012. https://www.gob.mx/cms/uploads/attachment/file/512094/NOM-004-SSA3-2012.pdf
- Secretaría de Economía (2019). Declaratoria de vigencia de la Norma Mexicana NMX-COE-001-SCFI-2018, Comercio electrónico: disposiciones a las que se sujetarán aquellas personas que ofrezcan, comercialicen o vendan bienes, productos o servicios. Diario Oficial de la Federación, 30 de abril de 2019. https://platiica.economia.gob.mx/normalizacion/nmx-coe-001-scfi-2018/
- Cámara de Diputados del H. Congreso de la Unión (2026). Código Fiscal de la Federación, artículo 30. https://www.diputados.gob.mx/LeyesBiblio/
- Servicio de Administración Tributaria (2026). Anexo 20: Comprobante Fiscal Digital por Internet versión 4.0. http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm
- Meta (2026). Pricing on the WhatsApp Business Platform. https://developers.facebook.com/documentation/business-messaging/whatsapp/pricing
- Make (2026). Precios y créditos. https://www.make.com/en/pricing
- Anthropic (2026). Precios de los modelos y salidas estructuradas. Documentación de Claude. https://platform.claude.com/docs

