v3-architecture

Accounting V3 — Arquitectura conceptual a alto nivel

Status: Target conceptual · No implementación Fecha: 2026-05-22 Autor: Claude (versión paralela con Codex en ../v3-conceptual-codex/)


1. Frame conceptual

V3 se construye sobre tres categorías de componente. Toda pieza del sistema cae en una y sólo una:

Categoría Qué es Quién lo controla
SoR (System of Record) Persiste verdad canónica. Determinista. Lifecycle estable. Asientos, libro diario, saldos. Externo (Holded / Sage / Odoo) o pequeño y aburrido propio (audit log de decisiones, plan store, dashboard state).
SoA (System of Action) Decide y actúa sobre uno o varios SoR. Extracción, motor de decisión LLM, conciliación inteligente, calcificación, reverse-sync. Intelia.
Conector Traduce entre SoA y SoR. No tiene verdad propia ni decide qué hacer. Plan Generator, Executor, Final Validation. Intelia, per-ERP.

Frase operativa:

El Motor decide. El Conector traduce. El SoR persiste. T3 calcifica patrones por nivel. T4 propaga señal estructurada.

Las 5 reglas de oro

V3 honesta requiere disciplina explícita en cinco fronteras:

  1. account_lines se elimina o se declara sombra explícita. La verdad contable canónica vive en el ERP, no en Intelia. Si se conserva una proyección en Intelia, se nombra last_synced_holded_cache con TTL, sin autoridad de escritura.
  2. Facts separados por dueño: facts/extracted/ (Intelia), facts/memory/ (Intelia), facts/erp_snapshot/ (sombra del SoR ajeno, con refreshed_at explícito).
  3. Plan Store vive dentro del integrador. Las reglas calcificadas de Holded persisten en holded_integration/, no en un namespace top-level que insinúe agnosticismo.
  4. Guías de Holded sin razonamiento semántico. Las guías que el agente Plan Generator consume contienen cómo se hace en Holded, no qué es semánticamente. La semántica viaja en el StandaloneIntent del Motor.
  5. Reglas calcificadas tipadas por nivel:
    • Semánticas: (input_signature) → StandaloneIntent. Viven en el Motor.
    • De integración: (StandaloneIntent + erp_context) → ExecutionPlan. Viven en el integrador.

Estas reglas se evalúan en code review. Cualquier PR que las viole se rechaza por mezcla SoR/SoA.


2. Mapa de capas

                     ┌──────────────────────────────────────────────┐
                     │   Documento entrante (Gmail · WhatsApp · upload)
                     └──────────────────────────────────────────────┘
                                       │
                                       ▼
                     ╔══════════════════════════════════════════════╗
                     ║                M1 — MOTOR                     ║
                     ║   SoA · portable entre ERPs                   ║
                     ║                                               ║
                     ║   Facts → Decisions (3 LLMs) → Internal Plan  ║
                     ║         → Contextual → Validation             ║
                     ║                                               ║
                     ║   Output: StandaloneIntent + InternalAccPlan  ║
                     ╚══════════════════════════════════════════════╝
                                       │
                                       ▼
            ╔════════════════════════════════════════════════════════╗
            ║              I1 — INTEGRADOR HOLDED                     ║
            ║   Conector + SoR pequeño propio · per-ERP               ║
            ║                                                         ║
            ║   ┌──────────────────┐    miss   ┌──────────────────┐  ║
            ║   │  Plan Store      │ ─────────▶│  Plan Generator   │  ║
            ║   │  (reglas calcif.)│           │  (agente LLM)     │  ║
            ║   │                  │ ◀─────hit │  guides + tool    │  ║
            ║   └──────────────────┘           └──────────────────┘  ║
            ║                  ↓                                      ║
            ║          ExecutionPlan + score de confianza             ║
            ║                                                         ║
            ║   ┌──────────────────────────────────────────────────┐ ║
            ║   │  Executor determinista (Temporal)                 │ ║
            ║   └──────────────────────────────────────────────────┘ ║
            ║                  ↓                                      ║
            ║   ┌──────────────────────────────────────────────────┐ ║
            ║   │  Final Validation (PlanState vs readback)         │ ║
            ║   └──────────────────────────────────────────────────┘ ║
            ╚════════════════════════════════════════════════════════╝
                                       │
                       ┌───────────────┴────────────────┐
                       │       score de confianza        │
                       └──────┬───────────────┬─────────┘
                         ALTA │               │ BAJA
                              ▼               ▼
              ╔══════════════════════╗  ╔══════════════════════╗
              ║  S1 (Holded)         ║  ║  S1 (Dashboard)      ║
              ║  Auto-contabilizado  ║  ║  "Planes pendientes" ║
              ║  + link al plan      ║  ║  contable revisa,    ║
              ║  + tag estructural   ║  ║  edita o aprueba     ║
              ╚══════════════════════╝  ╚══════════════════════╝
                              │               │
                              └───────┬───────┘
                                      ▼
            ╔════════════════════════════════════════════════════════╗
            ║              T4 — REVERSE SYNC                          ║
            ║   Conector · monitoriza Holded · propaga señal          ║
            ║                                                         ║
            ║   Poll de approved/edited/commented                     ║
            ║         ↓                                               ║
            ║   Señal structured ──▶ Plan Store (invalidar regla?)    ║
            ║                    ──▶ Motor (recalibrar memory?)        ║
            ╚════════════════════════════════════════════════════════╝
                                       │
                                       ▼
            ╔════════════════════════════════════════════════════════╗
            ║              T3 — CALCIFICATION ENGINE                  ║
            ║   SoA · observa · propone · promueve                    ║
            ║                                                         ║
            ║   Recolecta evidencia (plan ejecutado + feedback)       ║
            ║         ↓                                               ║
            ║   Detecta patrones (N repeticiones sin edición)         ║
            ║         ↓                                               ║
            ║   Propone regla a Intelia ops (gate humano)             ║
            ║         ↓                                               ║
            ║   Período shadow contra agente nuevo                    ║
            ║         ↓                                               ║
            ║   Promueve a Plan Store (tipo según nivel: M1 o I1)     ║
            ╚════════════════════════════════════════════════════════╝

Y dos transversales que envuelven todo:

  • TX-Signals — bus inmutable tipado, dedupe, projection a tags + comments + audit log + alerts internas.
  • TX-Temporal — durabilidad, retries por dominio, idempotencia por workflow_id, observabilidad.

3. Los seis componentes

ID Componente Tipo Responsabilidad en una frase Doc
M1 Motor SoA portable Decidir qué quiere contabilizarse, sin saber qué ERP recibe. m1-motor.md
I1 Integrador Holded Conector + SoR pequeño propio Traducir intent a operaciones Holded, ejecutarlas, validar resultado. i1-integrator-holded.md
T3 Calcification Engine SoA + escritura a SoR pequeño Observar patrones recurrentes en planes ejecutados y convertirlos en reglas. t3-calcification.md
T4 Reverse Sync Conector + SoA pequeño Capturar señal del SoR ajeno (ediciones del contable) y propagarla al SoA. t4-reverse-sync.md
S1 UX Híbrido Surface Dashboard Intelia para baja confianza + Holded como interfaz para alta confianza. s1-ux-hybrid.md
TX Signals + Temporal Transversal Plumería: durabilidad, observabilidad, projection de eventos. tx-signals-temporal.md

Notas de organización:

  • M1 es lo más portable. Sobrevive a cualquier cambio de ERP. Es el activo a largo plazo.
  • I1 es lo más voluminoso (~50% del LOC esperado). Cuanto peor el SoR de abajo, más gordo I1. Es el termómetro de la calidad del ERP.
  • T3 + T4 son las dos transversales que no existen en el target documentado actual. Son las piezas críticas que hacen del producto un SoA IA-first real, no un proxy IA sobre Holded.
  • S1 es la cara visible para el contable. Define la dinámica de bootstrap (baja confianza → alta confianza con el tiempo).

4. El flujo del documento

4.1 Caso happy path (alta confianza, regla calcificada)

  1. Documento entra → captura + extracción produce DocumentFacts.
  2. M1 corre todas sus sub-fases (Facts → Decisions → Internal Plan → Contextual → Validation) y produce StandaloneIntent + InternalAccountingPlan + ContextualDecision + ValidationResult: PASSED.
  3. I1.Plan Store: lookup por (intent_signature, erp_context_signature). Match → devuelve ExecutionPlan cached + confidence: 0.95.
  4. I1.Executor ejecuta el plan en Holded. Captura observed_state vía readback.
  5. I1.Final Validation compara PlanState declarado vs observed_state. PASSED.
  6. S1: documento queda contabilizado en Holded. Comment con link al plan + tag intelia-plan-<id>. Contable lo ve en su flujo habitual.
  7. T4: monitoriza el documento. A los 14 días sin edición → emite signal PLAN_CONFIRMED_BY_INACTION.
  8. T3: registra la confirmación. Refuerza la calcificación.

Tiempo total: 3-10s. Coste LLM: solo el de M1 (3 calls en Fase 2 si las decisiones no están calcificadas en M1).

4.2 Caso cold (baja confianza, primer documento de su tipo)

1-2. Como en happy path. 3. I1.Plan Store: miss. Llama I1.Plan Generator (agente LLM con guías Holded + tool wrapper). 4. Plan Generator razona: lee estado Holded, consulta guías, produce ExecutionPlan + confidence: 0.55 + reasoning_trace. 5. Confianza por debajo de umbral → S1.Dashboard "Planes pendientes". Plan NO se ejecuta. 6. Contable abre el dashboard, ve el plan + factura + reasoning, aprueba sin tocar. 7. I1.Executor ejecuta el plan aprobado. Captura readback. Final Validation OK. 8. T3: registra evidencia de aprobación. Suma a contador del patrón. 9. Tras 5 aprobaciones del mismo patrón sin edición, T3 propone regla a Intelia ops. 10. Intelia ops aprueba. Regla entra en shadow mode 14 días: cada match nuevo se sirve por agente, se compara con la regla propuesta, y si match → contadores positivos. 11. Tras shadow OK, regla promueve a Plan Store. Próximo documento del patrón = caso happy path.

Tiempo total caso cold: 15-30s + tiempo de revisión del contable. Coste LLM: M1 + Plan Generator + interpretación de evidencia en T3.

4.3 Caso edge (edición del contable post-ejecución)

1-7. Como happy path. 8. T4 detecta que el contable cambió la cuenta 629... por 623... en Holded a los 3 días. 9. T4 emite signal estructurado: EDITED_BY_HUMAN { plan_id, field: account_code, old: "629", new: "623" }. 10. T4 opcionalmente: añade comment en Holded [Intelia] ¿Razón del cambio? Responde con #criterio, #extraccion, #bug, o ignora. 11. Si el contable responde #criterio → signal CRITERION_CHANGED → Intelia ops revisa si toca recalibrar la regla en Plan Store o el LLM guide en M1. 12. Si no responde, el signal queda como evidencia de baja confianza del patrón. T3 marca la regla para re-shadow si N edits superan umbral.


5. Evolución por madurez del cliente

Fase Volumen alta-confianza UX dominante Coste LLM por documento
Mes 0 (onboarding) 0-20% Dashboard Intelia (contable revisa todo) Alto: M1 + Plan Generator en cada doc
Mes 1-3 30-50% Mezcla: simple va por Holded, nuevo se revisa Medio: Plan Generator en ~50% de docs
Mes 6 70-80% Contable abre Intelia ocasionalmente Bajo: Plan Generator en ~25%
Mes 12+ 85-95% Contable trabaja casi solo en Holded Marginal: Plan Generator solo en casos edge

Bootstrap cruzado

Cliente nuevo en sector X no arranca desde cero. T3 mantiene un repositorio de calcificaciones por sector / arquetipo de empresa. Al onboardear, el sistema clona las reglas de "cliente mediano de hostelería" como starter pack. Esas reglas tienen marca de origen: bootstrap_from: {client_id: X, sector: hosteleria}.

Las reglas bootstrapped tienen menor confianza inicial (0.7 en lugar de 0.95). Los primeros 10 documentos de cada patrón pasan por dashboard antes de ascender a alta confianza por client específico. Es calcificación con prior + posterior bayesiano.

Esta es la ventaja diferencial del producto: cliente N+1 onboardea más rápido que cliente N. Producto compone economía de escala IA-first sin depender del prompt-en-runtime.


6. Trade-offs explícitos

6.1 Trade-off principal: latencia vs control

Surface Latencia Control del contable Señal para T3
Holded auto (alta confianza) Inmediato Pasivo (reacciona si ve algo raro) Inactividad N días o edición
Dashboard Intelia (baja confianza) Espera al contable Activo (aprueba o edita explícito) Aprobación explícita

Auto es mejor UX a largo plazo; dashboard es mejor señal de aprendizaje. El sistema vive en el continuo y se mueve hacia auto con la madurez del cliente. No hay versión "perfecta" — hay calibración constante del umbral de confianza.

6.2 Trade-off del Plan Generator: flexibilidad vs determinismo

El agente LLM como Plan Generator da cobertura del 100% de casos (incluyendo edge cases que un sistema rule-based no cubriría) al coste de:

  • No-determinismo en path miss (mismo input puede dar planes ligeramente distintos en runs distintos).
  • Coste LLM por documento.
  • Latencia en runs cold.

T3 cierra este gap: calcificación convierte los patrones recurrentes en reglas deterministas, reduciendo la dependencia del agente con el tiempo. Pero el agente nunca desaparece: siempre hay casos edge.

Mitigación: tipar el ExecutionPlan como Pydantic schema estricto. Aunque el agente genere planes distintos, el shape del plan es comparable y verificable. Y al ser el ExecutionPlan declarativo (no imperative), dos planes funcionalmente equivalentes pero textualmente distintos pueden compararse.

6.3 Trade-off del Holded como interfaz: UX vs señal limpia

Usar Holded como surface para alta confianza es la mejor UX para el contable (no aprende otra app), pero la señal "no editó en N días" es más débil que "aprobó explícitamente en dashboard". El sistema acepta esta pérdida de calidad de señal a cambio de UX.

Mitigación parcial: T4 lee comments del contable en Holded. Si el contable dejó un comment al lado del documento, eso es señal explícita. Pero la mayoría de contables no comentan, comportamiento default es silencio.

6.4 Trade-off del N de ERPs: abstracción universal vs realismo

V3 no construye el esperanto universal (Fase 6 agnóstica del target documentado V2). Cada ERP es un integrador completo (I_<erp>/) con su Plan Generator + Plan Store + Executor + Final Validation. Cuando llegue Sage:

  • Se escribe I2 — Integrador Sage desde cero como paquete paralelo a I1.
  • El motor M1 no se entera.
  • T3 y T4 se extienden a I2 (transversales operan over multiple integrators).

Trade-off: más LOC por ERP que en una abstracción universal, pero cero abstracciones prematuras. La regla del 3 dicta: cuando llegue el tercer integrador, si patrones reales emergen, entonces se extrae lo común a posteriori.

6.5 Trade-off de la calcificación: bootstrap cruzado vs sesgo de cliente

Bootstrap cruzado (cliente N+1 arranca con reglas de N) acelera onboarding pero arrastra sesgos de los clientes existentes. Si todos los clientes en bootstrap_from: hosteleria son mediterráneos, un cliente nuevo en hostelería pero del País Vasco puede heredar criterios que no aplican.

Mitigación: las reglas bootstrapped tienen confianza reducida + período shadow obligatorio (primeros 10 docs por patrón pasan por dashboard). El cliente nuevo "validate" o "rechazar" cada regla heredada en sus primeras semanas.


7. Lo que V3 deja explícitamente abierto

Open questions que V3 conceptual reconoce y no resuelve:

  1. Schema del intent_signature que usa Plan Store para lookup. ¿Hash determinista de qué subconjunto de StandaloneIntent? Si incluimos demasiado, los hits son escasos. Si incluimos poco, las reglas calcifican sobre patrones demasiado amplios y dan planes incorrectos.

  2. Cadencia de polling para T4 Reverse Sync. Cada 15 min es estándar pero ¿es demasiado caro a escala? ¿Se puede dividir en polling rápido para documentos recientes + polling lento para histórico?

  3. Política de invalidación cuando cambian guías Holded. Si las guías que el Plan Generator consume cambian, ¿qué reglas calcificadas se invalidan automáticamente? ¿Se versiona el guide y cada regla recuerda su guide_version?

  4. Definición operativa de "alta confianza". ¿Score numérico simple? ¿Función de (confianza del Plan Generator + edad de la regla calcificada + N veces aprobada)? Tipos de input edge tendrán que tener thresholds distintos.

  5. Concurrencia con el contable. Si el contable edita un documento Holded mientras Intelia está ejecutando un cambio sobre ese mismo documento, ¿qué pasa? T4 capturará el delta, pero podemos haber sobreescrito el cambio del contable. ¿Lock optimista? ¿Lease + retry?

  6. Reverse-sync de comentarios libres del contable. Si el contable comenta "esto es un caso especial, no lo trates con regla general" — ¿cómo lo procesa T4? ¿LLM extrae intent? ¿Humano (Intelia ops) revisa cola de comments?

  7. Métricas de salud del sistema. ¿Qué KPIs operacionales se necesitan? Propuesta: auto_rate (% docs alta confianza), latency_p95, cost_llm_per_doc, correction_rate (% editados post-ejecución), calcification_rate (% docs servidos por regla vs agente), bootstrap_recall (% reglas heredadas aceptadas).

  8. Multi-tax-entity por team. Si un team tiene N tax entities con configuraciones fiscales distintas, ¿T3 calcifica por team o por tax_entity? Probablemente por tax_entity, pero el bootstrap cruzado puede beneficiarse de patrones a nivel team.


8. Por qué V3 no es V2 Target documentado

Dimensión V2 Target (documentado) V3 (este doc)
Esperanto universal (Fase 6 + Fase 7) Presente Eliminado. Cada integrador es paquete completo.
Plan Generator Determinista (hand-coded en holded_write_planner.py) Agente LLM con guías + tool wrapper.
Calcificación confidence_calcified flag implícito T3 componente de primera clase con shadow + gate humano.
Reverse-sync Ausente T4 componente de primera clase.
Cliente nuevo Recibe reglas hard-coded uniformes Bootstrap cruzado desde clientes similares.
Frontera de aprobación Implícita (campo approved de Holded) Híbrida: dashboard Intelia para baja confianza + Holded para alta.
account_lines SoR Intelia paralelo al ledger Holded Eliminado o sombra explícita. La verdad vive en el ERP.

V3 no es una optimización de V2 Target — es una arquitectura distinta que asume distinto modelo mental: la IA no proyecta a un ERP abstracto; la IA opera directamente sobre el ERP concreto que existe, y el sistema aprende del feedback orgánico del contable. El "abstracto" emerge a posteriori vía calcificación cruzada cuando hay N ERPs reales.


Apéndice — Cómo leer el resto de docs

Empieza por... Si tu objetivo es...
m1-motor.md Entender qué decide Intelia y cómo se separa de la integración
i1-integrator-holded.md Entender cómo se gestiona la cicatriz Holded sin contaminar el SoA
t3-calcification.md Entender el loop de aprendizaje y por qué es componente de primera clase
t4-reverse-sync.md Entender cómo el SoA aprende del criterio del contable
s1-ux-hybrid.md Entender el bootstrap híbrido (dashboard → Holded auto)
tx-signals-temporal.md Entender la plumería durable y observable

Versión Claude. La versión paralela de Codex está en ../v3-conceptual-codex/. Síntesis final cuando ambas estén completas.