ConTodo ERP — Debate 02: Crítica Técnica Consolidada (Partner de Tecnología y Arquitectura)
Debate 02 — Crítica Técnica Consolidada de ConTodo ERP
Rol del autor. Partner de Tecnología y Arquitectura en revisión crítica nivel Big Four. Mi función no es validar lo escrito por los siete agentes técnicos, sino estresar sus supuestos, cazar contradicciones entre documentos (donde nadie tuvo visibilidad del otro), exponer trade-offs que se declararon resueltos pero no lo están, y cuantificar deuda técnica latente. La conclusión de un agente individual puede ser correcta en su silo y aun así romper el sistema cuando se ensambla con los demás. Aquí reviso el ensamble.
Disclaimer anti-overclaiming. Los siete documentos son, individualmente, de calidad alta y poco común para una etapa pre-MVP. Esta crítica es deliberadamente adversarial: asume que el lector ya leyó las virtudes y necesita oír lo que falla. Ninguna observación invalida el proyecto; varias sí condicionan su viabilidad económica a escala.
0. Veredicto ejecutivo
| Dimensión | Calificación | Síntesis |
|---|---|---|
| Coherencia inter-documento | B− | Contradicciones reales en región AWS, tipo de tenancy, modelo de eventos y stack de BI. |
| Realismo del modelo de costos | C+ | El costo de RDS a 5.000 tenants está subestimado por un factor ~2–3x; el costo de IA y de BI (Kafka/MSK) está ausente del modelo financiero. |
| Escalabilidad de Rails a 5.000 tenants | B | Defendible, pero depende de mitigaciones (particionado, RDS Proxy, sharding) que se describen como "a futuro" sin disparador ni dueño. |
| Gestión de seguridad multi-tenant | A− | El pilar más sólido. Doble candado RLS+Pundit bien razonado. Un hueco operativo serio (sección 3.4). |
| Madurez del modelo de datos/BI | B− | Excelente diseño dimensional; pero introduce Kafka/MSK/Debezium que contradice la promesa de "deliberadamente aburrido" y el presupuesto de equipo. |
| Trade-offs no resueltos | — | 9 identificados (sección 4). |
Bottom line: la arquitectura es vendible y técnicamente seria, pero está escrita por siete especialistas que no negociaron entre sí. El riesgo número uno no es técnico sino de gobierno: no existe un contrato de arquitectura único que reconcilie las decisiones contradictorias antes de escribir la primera línea de código. Este documento es el insumo para esa reconciliación.
1. Contradicciones inter-documento (hallazgo crítico)
Cuando siete agentes escriben en paralelo sin un ADR maestro, divergen. Estas divergencias no son matices de estilo: son decisiones de infraestructura incompatibles que costarían reescritura si se descubren en implementación.
| # | Tema | Documento A dice | Documento B dice | Severidad | Resolución requerida |
|---|---|---|---|---|---|
| C1 | Región AWS primaria | DevOps (10): us-east-1 ("menor precio, latencia 90 ms aceptable"). Architect (07): "us-east-1 o sa-east-1, se evalúa sa-east-1". | Ciberseguridad (13): sa-east-1 (São Paulo) preferida por residencia y argumento comercial. | Alta | Es una decisión de una sola vía. sa-east-1 cuesta ~20–40% más que us-east-1 y rompe el modelo de costos de DevOps. Hay que elegir UNA y recostear. |
| C2 | Nombre de la columna tenant | Architect (07), IA (11), Data (12), Ciberseguridad (13): tenant_id. | Rails (08), DevOps (10): company_id. | Media | Trivial de unificar en papel, pero si se filtra al esquema SQL y a las policies RLS, son migraciones y bugs. Fijar el nombre canónico HOY. |
| C3 | Tipo de dato de tenant_id | IA (11) RLS de ejemplo: ::uuid (current_setting(...)::uuid). | Rails (08) outbox y RLS: BIGINT (BIGSERIAL, ::bigint). Architect (07): ::bigint. | Alta | UUID vs BIGINT es una decisión de modelado fundamental (sharding, índices, tamaño). Mezclarlas garantiza fallos de cast en producción de RLS. Decidir: BIGINT para PK internas, UUID solo para identificadores expuestos. |
| C4 | Bus de eventos | Rails (08): EventBus con impl. Redis (dev) / SNS-EventBridge (prod). | DevOps (10): diagrama muestra SNS/EventBridge. Data (12): Kafka/MSK para CDC. | Alta | Hay potencialmente tres sistemas de mensajería (Redis/Sidekiq, SNS/EventBridge, Kafka/MSK). Nadie reconcilió si CDC-Kafka y el outbox-EventBridge coexisten o si uno absorbe al otro. Es costo y complejidad operativa duplicada. |
| C5 | OpenAPI vs GraphQL | Frontend (09): tipos generados desde OpenAPI; "GraphQL pospuesto". Rails (08): "GraphQL pospuesto". | DevOps (10): ALB describe "API REST/GraphQL", compute "render server-side mínimo". | Baja | DevOps arrastra terminología no alineada (también dice "render server-side" cuando Frontend es SPA pura). Limpiar el doc DevOps; no hay GraphQL ni SSR. |
| C6 | Stack de BI | Data (12): elige Debezium + Kafka/MSK + Redshift/DuckDB + dbt + Cube. | Architect (07) y DevOps (10): el modelo de costos y la arquitectura de contenedores no incluyen Kafka, MSK, Debezium, Redshift ni Cube. | Alta | El módulo BI propuesto por Data NO está costeado ni dibujado por DevOps. MSK + Redshift agregan fácilmente US$ 1.500–4.000/mes desde escala media. El modelo de margen >80% de DevOps ignora esto. |
| C7 | Modelo de tenancy enterprise | Architect (07): Silo vía Rails connects_to (otra RDS). | DevOps (10): Silo = "RDS + ECS service propios". | Media | ¿El silo comparte el cluster ECS (más barato) o tiene ECS dedicado (más caro y aislado)? Definen cosas distintas. Impacta pricing del SKU enterprise. |
| C8 | Costo de IA | IA (11): capa completa Bedrock + Vertex + OpenAI + Llama-en-VPC (GPU). | DevOps (10): el modelo de costos no tiene una sola línea de IA (ni Bedrock, ni GPU para Llama, ni tokens). | Alta | Llama self-host en VPC requiere instancias GPU (g5/p4) que cuestan US$ 1.000–8.000+/mes encendidas. La IA se vende como diferenciador pero no aparece en el P&L de infra. |
Conclusión de la sección: 8 contradicciones, 5 de severidad Alta. Antes de codificar se necesita una sesión de reconciliación de ADRs que produzca un único documento maestro de decisiones vinculantes. Sin esto, cada equipo construye sobre supuestos del vecino que no se cumplen.
2. Coherencia multi-tenant vs costos AWS vs seguridad (el triángulo central)
El producto vive o muere en el equilibrio de tres fuerzas que se tensionan entre sí. Los agentes optimizaron cada vértice por separado.
2.1 El triángulo
2.2 Coherencia de la decisión Shared Schema + RLS
Lo que está bien. Los tres documentos que tocan tenancy (07, 08, 13) convergen en Shared Schema + RLS + Silo-on-demand. Es la decisión correcta para un SaaS de PYMEs y está bien justificada (Salesforce/Shopify/Zoho como precedente, economía de escala, onboarding instantáneo). La defensa en profundidad (Pundit → default_scope → RLS) es de manual.
Lo que no se resolvió:
-
Costo de RLS bajo carga real. RLS añade un predicado a cada query. En tablas particionadas y gigantes (kardex, asientos), el planner de PostgreSQL puede degradar si las policies no usan índices alineados con
current_setting. Ningún documento midió el overhead de RLS ni definió un benchmark. A 5.000 tenants en unadb.r6g.4xlarge, esto puede ser la diferencia entre p95 = 250 ms y p95 = 1.5 s. -
SET LOCALy connection pooling. Rails (08) usaSET LOCAL app.current_company_iddentro de una transacción. Pero DevOps (10) impone RDS Proxy / PgBouncer desde 100 clientes. PgBouncer en modotransactionpuede romperSETque no seaSET LOCAL, y RDS Proxy multiplexa conexiones de forma que una variable de sesión mal scopeada filtra contexto entre tenants. Este es el bug de seguridad más peligroso y más probable de toda la arquitectura, y ningún documento lo aborda. El uso deSET LOCAL(transaccional) lo mitiga, pero exige que toda query corra dentro de una transacción explícita — algo que Rails NO hace por defecto en lecturas. Es deuda técnica de seguridad latente. -
Particionado por
tenant_idchoca con power-law. Architect (07, S3) admite que el 5% de tenants genera el 50% de la carga. Particionar porLIST/HASH(tenant_id)con esa distribución crea particiones desbalanceadas: una partición con un tenant gigante y otras casi vacías. El particionado portenant_idno resuelve noisy-neighbor para el tenant pesado dentro de su propia partición. La mitigación real para ese 5% es promoverlos a Silo, pero el disparador no está definido.
2.3 Costos AWS — auditoría del modelo de DevOps
El modelo de costos (10, §9) es el artefacto más concreto y por eso el más auditable. Mis objeciones:
| Línea | Cifra DevOps (5.000) | Objeción | Cifra ajustada (estimada) |
|---|---|---|---|
| RDS PostgreSQL | US$ 4.200 | Una db.r6g.4xlarge Multi-AZ NO sostiene 5.000 tenants con RLS + particionado + 4 TB+. Realista: cluster sharded (3–4 instancias) o Aurora. | US$ 8.000–12.000 |
| Read Replicas | US$ 2.100 | BI pesado + EEFF + Cube necesitan más de 3 réplicas a esa escala. | US$ 3.000–4.500 |
| Kafka/MSK | US$ 0 (ausente) | El doc Data lo exige para CDC. MSK 3 brokers mínimo. | US$ 1.200–2.500 |
| Redshift/DW | US$ 0 (ausente) | Data propone Redshift para tenants grandes. | US$ 1.500–4.000 |
| IA (Bedrock/tokens) | US$ 0 (ausente) | Copilot + forecast + OCR a 5.000 tenants. | US$ 3.000–15.000 (muy variable) |
| Llama VPC (GPU) | US$ 0 (ausente) | g5.xlarge+ encendida 24/7 para datos sensibles. | US$ 1.000–6.000 |
| Cube/semantic layer | US$ 0 (ausente) | Servicio ECS adicional. | US$ 300–800 |
Costo total realista a 5.000 tenants: no ~US$ 20.600/mes sino, con BI + IA completos, US$ 35.000–60.000/mes. El "costo por cliente ~US$ 4,1" se convierte en US$ 7–12. Sigue siendo un margen sano si el pricing es US$ 25–40/cliente, pero el margen >80% es optimista; el realista es 65–75% una vez que se costean los diferenciadores (IA, BI) que el equipo de producto va a vender.
Recomendación: el modelo de costos debe ser un solo artefacto consolidado que incluya las líneas de IA y BI, no tres modelos parciales. El P&L del agente de Finanzas debe usar el ajustado, no el optimista.
2.4 Seguridad — el pilar más fuerte, con un hueco
Ciberseguridad (13) es el mejor documento del set: RBAC+ABAC, SoD codificado, audit log con hash chain + WORM, STRIDE, OWASP, readiness SOC2/ISO. Hueco operativo crítico: el equipo de seguridad declarado es "0 dedicados → 1 Security Engineer" (S5) para sostener SOC 2 Type II, ISO 27001, pentest anual, bug bounty, DPA con subprocesadores, flujos ARCO, DLP y respuesta a incidentes. Eso es trabajo de un equipo de 3–4, no de 1. La ambición de compliance está sub-presupuestada en personas, no en controles. Es coherente con el doc de Finanzas solo si se contempla outsourcing (vCISO + plataforma Vanta/Drata), lo cual hay que hacer explícito.
3. Escalabilidad de Rails a 5.000 tenants
3.1 ¿Es defendible? Sí, con condiciones
Rails como modular monolith con YJIT, Fargate stateless y RDS Proxy escala horizontalmente sin techo en compute. El cuello de botella es siempre la base de datos única, y aquí los documentos son honestos pero difieren las soluciones a un "futuro" sin dueño:
| Vector de escala | Estado en los docs | Crítica |
|---|---|---|
| Conexiones DB | RDS Proxy "desde 100 clientes" (10) | Correcto, pero ver §2.2.2: RDS Proxy + SET de tenant es un riesgo de aislamiento no resuelto. |
| Particionado | "desde MVP" (07, ADR-04) | Bien, pero desbalanceo por power-law no resuelto (§2.2.3). |
| Sharding por cohorte | "a 5.000+" (07, 10) | Sin disparador, sin diseño, sin dueño. "A futuro" es donde mueren los proyectos. Falta un ADR de sharding con métrica gatillo (ej. >70% CPU sostenido en RDS escalada al máximo). |
| Aurora | "a evaluar en escala" (07, 10) | Decisión diferida razonable, pero Aurora Serverless v2 cambia el modelo de costos completo; debería pre-modelarse. |
| Migraciones online | strong_migrations (08) | Bien. Pero a 5.000 tenants en shared schema, un backfill de columna sobre una tabla particionada de cientos de millones de filas es una operación de horas; falta runbook. |
3.2 El verdadero límite: el "noisy migration"
El argumento estrella de Shared Schema vs Separate Schema es "una sola migración" (07, §3.3). Cierto. Pero a escala, esa única migración corre sobre tablas compartidas de cientos de millones de filas. Un add_index o un backfill bloquea o consume IOPS que afectan a los 5.000 tenants simultáneamente. Separate Schema reparte el dolor; Shared Schema lo concentra. El doc vende la simplicidad sin cuantificar que la migración pasa de "trivial" a "evento de mantenimiento planificado con riesgo para todos". Deuda técnica: falta una estrategia de migraciones por lotes con pt-online-schema-change/gh-ost-equivalente para Postgres (ej. pg-osc) desde el día 1.
3.3 Outbox relay como single point of contention
Rails (08) centraliza TODO en el outbox: eventos de dominio, webhooks, y (implícitamente) alimenta a BI. Data (12) en cambio usa CDC/Debezium que lee el WAL, NO el outbox. Hay dos mecanismos de captura de cambios compitiendo: outbox (08) y CDC (12). Si BI usa CDC, el "outbox como changelog para BI" (08, O1) es redundante. Si BI usa outbox, Debezium/Kafka sobra. Nadie eligió. Esto es a la vez una contradicción (C4/C6) y un riesgo de escalabilidad: dos pipelines de eventos doblan la carga sobre el WAL y el costo operativo.
4. Trade-offs declarados como resueltos que NO lo están
| # | Trade-off | Cómo se presentó | Por qué sigue abierto |
|---|---|---|---|
| T1 | Shared Schema simplifica migraciones | "Una migración, un backup" (07) | A escala la migración afecta a todos a la vez; backup/restore selectivo por tenant es "difícil" (el propio doc lo admite) y la Ley 29733 exige export/delete por tenant. La simplicidad se paga después. |
| T2 | RLS garantiza aislamiento | "garantizado por el motor" (07, 13) | Solo si SET LOCAL corre en transacción y el pooler no multiplexa contexto. Con RDS Proxy esto NO está garantizado por defecto (§2.2.2). |
| T3 | SPA Vite "no necesita SSR" | "todo tras login" (09) | Cierto para la app, pero pierde server-side rendering para enlaces de comprobantes públicos (un cliente abre el PDF/portal de su factura sin login). Falta definir si hay superficie pública. |
| T4 | Fargate Spot para workers | "ahorra 60%" (10) | Spot puede ser interrumpido. Sidekiq procesando emisión de CPE o asientos en una tarea Spot interrumpida = job a medias. Mitigable con idempotencia (que sí existe), pero el doc no garantiza que la cola critical esté en On-Demand, no en Spot. Riesgo fiscal. |
| T5 | "Stack deliberadamente aburrido" | Architect (07) | Data (12) introduce Kafka, Debezium, Redshift, dbt, Cube, Iceberg — el stack MÁS exótico del set, operado por un equipo de 4–6. Contradice el principio rector. |
| T6 | Multi-modelo de IA evita lock-in | IA (11) | Sí evita lock-in de LLM, pero crea dependencia operativa de 4 proveedores (Bedrock+Vertex+OpenAI+self-host GPU). Más superficie, más costo fijo, más cosas que monitorear. El lock-in se cambió por complejidad. |
| T7 | "Margen infra >80%" | DevOps (10) | Solo si IA y BI no se cuentan. Con ellos, 65–75% (§2.3). |
| T8 | Silo on-demand "sin reescribir nada" | "gracias a Rails multiple databases" (07) | connects_to/connected_to funciona, pero migrar un tenant existente de shared a silo (mover sus datos, mantener FKs, cero downtime) es un proyecto de ingeniería que ningún doc diseñó. "Sin reescribir código" ≠ "sin esfuerzo de migración de datos". |
| T9 | Cifrado por-tenant (BYOK) descartado por costo | Ciberseguridad (13) | Razonable para MVP, pero se vende "soberanía de datos" (IA 11, Architect O1) como diferenciador enterprise. Soberanía real suele exigir BYOK. El upsell promete algo que el cifrado compartido no entrega del todo. |
5. Riesgos técnicos consolidados (cross-cutting)
Riesgos que ningún documento individual ve porque emergen del ensamble:
| ID | Riesgo emergente | Origen | Severidad | Mitigación recomendada |
|---|---|---|---|---|
| RT1 | Fuga cross-tenant vía connection pooler (RDS Proxy multiplexa contexto de SET) | 08 + 10 | Crítica | Mandato: toda query en transacción con SET LOCAL; test de aislamiento que corra a través del pooler, no solo contra Postgres directo; considerar app.current_tenant por SET validado tras cada checkout de conexión. |
| RT2 | Costo real 2–3x el presupuestado por IA+BI ausentes del modelo | 10 vs 11,12 | Alta | Modelo de costos consolidado único; gate de FinOps antes de activar BI/IA en prod. |
| RT3 | Doble pipeline de eventos (outbox + CDC) duplica carga WAL y ops | 08 vs 12 | Alta | Elegir UNO: outbox→EventBridge para integración, CDC→BI; o CDC para ambos. ADR vinculante. |
| RT4 | Tres sistemas de mensajería (Sidekiq/Redis, SNS/EventBridge, Kafka/MSK) | 08,10,12 | Alta | Justificar cada uno o colapsar. MSK solo si CDC es indispensable en Fase 2+, no MVP. |
| RT5 | Migración a escala bloquea a los 5.000 tenants simultáneamente | 07,08 | Alta | pg-osc/expand-contract estricto + ventana + runbook desde día 1. |
| RT6 | Spot interrumpe jobs fiscales | 10 | Media-Alta | Cola critical SIEMPRE On-Demand; solo reports/ai en Spot. |
| RT7 | Sharding sin disparador ni dueño = se descubre en crisis | 07,10 | Alta | ADR de sharding con métrica gatillo y RACI antes de 1.000 tenants. |
| RT8 | Equipo de 4–6 opera stack de 15+ servicios gestionados | todos | Alta | Reducir superficie en MVP (sin MSK/Redshift/Llama-VPC); contratar SRE antes de 500 tenants. |
| RT9 | Compliance SOC2/ISO con 1 Security Engineer | 13 | Media-Alta | vCISO + Vanta/Drata; presupuestar en P&L. |
| RT10 | tenant_id UUID vs BIGINT inconsistente rompe RLS en runtime | 08,11 | Media | Decidir tipo canónico antes de la primera migración. |
6. Deuda técnica latente (que se contrae el día 1 si no se actúa)
- Ausencia de un ADR maestro. Siete documentos, cero contrato unificado. La primera deuda es de gobierno, no de código.
- Tipo y nombre de
tenant_idsin fijar (C2, C3). Cambiarlo después es una migración global. - Pooler + RLS sin probar juntos (RT1). Si se descubre tras 500 tenants, es incidente de seguridad reportable.
- Estrategia de migración a escala inexistente. Se asume "rails db:migrate" eterno.
- Pipeline de eventos no decidido (outbox vs CDC). Construir ambos es deuda doble.
- Backup/restore por tenant. Shared Schema lo hace difícil; la Ley 29733 lo exige. Se menciona pero no se diseña.
- Promoción shared→silo sin diseño de migración de datos (T8).
- Observabilidad de IA y costos por tenant (medidor de tokens) está en IA (11) pero no integrado al CloudWatch/X-Ray de DevOps (10).
- Contrato OpenAPI como fuente de verdad (09) depende de que Rails (08) lo publique disciplinadamente; ningún doc define quién es dueño del spec ni el proceso de breaking changes.
7. Oportunidades técnicas (lo que el ensamble habilita y nadie capitalizó del todo)
| # | Oportunidad | Por qué es real | Acción |
|---|---|---|---|
| OP1 | Outbox como única fuente de eventos elimina MSK/Debezium en MVP | El outbox transaccional (08) ya captura cambios; un consumidor puede alimentar BI sin Kafka hasta escala media. | Diferir CDC/Kafka a Fase 3; ahorra US$ 1.500–2.500/mes y enorme complejidad operativa temprana. |
| OP2 | Tier "Soberanía" (Silo + BYOK + Llama-VPC) como SKU premium real | Tres docs lo insinúan (07,11,13); juntos forman un paquete enterprise diferenciado vs Defontana/StarSoft. | Empaquetarlo formalmente con pricing que cubra GPU + RDS dedicada + KMS BYOK. |
| OP3 | Capa semántica (Cube) como contrato único de KPIs sirve a BI y a IA (NL2SQL) | Data (12) ya lo propone; IA (11) puede consumirlo en vez de tools SQL ad-hoc → menos alucinación, una sola verdad. | Unificar: la IA habla con Cube, no con tools que repliquen lógica de KPI. |
| OP4 | Tests de aislamiento cross-tenant en CI como activo de venta | Ciberseguridad (13) ya los exige; convertirlos en evidencia auditable acelera SOC 2. | Reportar cobertura de aislamiento como métrica de compliance. |
| OP5 | Graviton + Savings Plans + Spot selectivo ya están bien; falta FinOps por tenant | El medidor de costo de IA por tenant (11) puede extenderse a costo de infra por tenant. | Dashboard de margen por tenant → identifica candidatos a silo o a upsell. |
8. Recomendaciones consolidadas y priorizadas
8.1 Bloqueantes antes de escribir código (Semana 0–2)
- Sesión de reconciliación de ADRs. Producir un único
ADR-MASTER.mdque resuelva C1–C8. Decisiones vinculantes: región (una), nombre y tipo detenant_id, bus de eventos (uno), stack de BI (fasing real), modelo de costos consolidado. - Resolver RT1 (pooler + RLS). Diseñar y probar el mecanismo de
SET LOCALa través de RDS Proxy/PgBouncer. Sin esto validado, la promesa de aislamiento es papel. Es el riesgo de seguridad más alto del proyecto. - Fijar tipo de
tenant_id(recomendación: BIGINT interno + UUID público) y nombre canónico (recomendación:tenant_id, nocompany_id).
8.2 Antes del MVP (Mes 1–3)
- Reducir superficie operativa del MVP. Diferir MSK, Debezium, Redshift, Cube y Llama-VPC. MVP de BI = batch nocturno con dbt + DuckDB/S3 (como el propio Data admite en su fasing). MVP de IA = Bedrock managed (Claude/Haiku), sin self-host GPU.
- Cola
criticalen On-Demand, no Spot. Política explícita en Terraform. - Estrategia de migración a escala (expand/contract +
pg-osc+ runbook) desde la primera tabla. - Modelo de costos consolidado que incluya IA y BI, entregado al agente de Finanzas para recalcular margen (esperar 65–75%, no >80%).
8.3 Antes de 500–1.000 tenants (Mes 6–12)
- ADR de sharding con métrica gatillo y dueño (RACI). No "a futuro".
- Diseño de promoción shared→silo incluyendo migración de datos con cero downtime.
- Contratar SRE dedicado y formalizar seguridad (vCISO + Vanta/Drata) — el equipo de 4–6 no sostiene el stack a esa escala.
- Decidir CDC sí/no según necesidad real de latencia BI (<5 min). Si el batch satisface, no introducir Kafka jamás.
8.4 Tabla RACI mínima propuesta
| Decisión pendiente | Responsable (R) | Aprobador (A) | Plazo |
|---|---|---|---|
| ADR maestro / reconciliación | Solution Architect | CTO | Semana 2 |
| Pooler + RLS validado | Rails Eng + Ciberseguridad | Solution Architect | Semana 4 |
| Tipo/nombre tenant_id | Rails Eng | Solution Architect | Semana 1 |
| Modelo de costos consolidado | DevOps | Finanzas/CTO | Semana 3 |
| Fasing real de BI/IA | Data + IA | CTO | Mes 1 |
| ADR de sharding | Solution Architect | CTO | Antes de 500 tenants |
9. Conclusión
Los siete documentos técnicos de ConTodo son, individualmente, de calidad superior y reflejan criterio senior real: la decisión de tenancy está bien razonada, la seguridad es el pilar más sólido, y el modelo de datos dimensional es de manual. El proyecto es técnicamente viable y comercialmente diferenciable.
El problema no está en las piezas sino en el ensamble. Escritos en paralelo sin un contrato maestro, los agentes contradicen entre sí la región AWS, el tipo de tenancy enterprise, el nombre y tipo de la clave de tenant, el bus de eventos y el stack de BI. Más grave: el modelo de costos omite IA y BI —precisamente los diferenciadores que el negocio va a vender—, lo que infla el margen prometido de >80% a un realista 65–75% y subestima el costo a 5.000 tenants en un factor de ~2–3x. Y existe un riesgo de aislamiento cross-tenant no resuelto en la intersección de RDS Proxy y las variables de sesión de RLS que, de materializarse en producción, sería un evento de extinción de marca para un ERP contable.
La recomendación central es una sola: antes de escribir código, sentar a los siete agentes en una sesión de reconciliación que produzca un ADR maestro vinculante, valide el binomio pooler+RLS, y consolide un único modelo de costos. La arquitectura está a una semana de gobierno de ser excelente; sin ese gobierno, está a varios meses de reescritura de descubrir sus contradicciones en producción.