T4 — Reverse Sync

T4 — Reverse Sync

Categoría: Conector con interpretación SoA pequeña (LLM extrae intención de comments) Estado: Propio sano — componente nuevo crítico en V3. Síntesis de: Claude T4 + Codex T4

T4 es el componente que convierte la arquitectura en sistema que aprende de la realidad. Es también el más expuesto a ruido y matching débil. Sin un T4 muy bien diseñado, la promesa de "Holded como interfaz madura" queda demasiado apoyada en confianza conceptual.


1. Responsabilidad

T4 observa Holded después de que Intelia escribe o propone, y convierte lo que pasó allí en señales estructuradas para aprendizaje, auditoría y control.

Sin T4, Intelia vuelve a depender de dashboards propios para saber si acertó. Con T4, Holded se convierte en interfaz de trabajo de alta confianza y fuente de feedback.

T4 es el sustrato del aprendizaje: sin él, T3 calcifica sobre evidencia mentirosa.

2. NO es su responsabilidad

  • No decide automáticamente. Propaga señal estructurada; otros componentes deciden qué hacer.
  • No escribe a Holded. Solo lee. T4 es read-only sobre el SoR ajeno.
  • No procesa en runtime de la decisión de Intelia. Trabaja asíncrono.
  • No interpreta semantics libremente. Cuando lee un comment, el LLM extrae intent estructurado (positive | negative | neutral | criterion_change); no toma decisión propia.
  • No cambia cuentas en M1 ni reglas en Plan Store. Solo emite signals; los componentes propietarios deciden.

3. Qué monitoriza

Para cada documento que Intelia ha ejecutado (registrado en executed_plan_history con plan_id y external_id en Holded), T4 vigila:

Campo en Holded Cambio que detecta Signal que emite
approved false → true APPROVED_BY_HUMAN
accounts (líneas) Cambio de cuenta EDITED_ACCOUNT_LINE
tax_keys Cambio en taxes EDITED_TAX
tags (excluyendo intelia-*) Tag añadido por contable TAGGED_BY_HUMAN
comments (excluyendo [Intelia]) Comment del contable COMMENTED_BY_HUMAN
accountingDate Cambio fecha contable DATE_OVERRIDDEN
notes Cambio en nota NOTE_EDITED
Payment state pending → paid o reconciliación manual PAYMENT_STATE_CHANGED
Documento eliminado 404 en readback DELETED_BY_HUMAN

T4 NO monitoriza cambios hechos por Intelia misma (filtrados por timestamp + actor, o hash del estado pre/post-ejecución).

4. Tipos de señal

4.1 Aprobación implícita

Pasa N días sin edición → señal positiva pero débil (no es aprobación consciente). Peso bajo en T3.

4.2 Aprobación explícita

Contable marca approved=true o aprueba en dashboard Intelia. Peso alto.

4.3 Edición material

Cuenta, impuesto, importe, fecha cambian. Señal negativa para la regla aplicada.

4.4 Edición cosmética

Cambio en nota, tag descriptivo, comentario sin contenido fiscal. No es señal.

4.5 Cambio de criterio

Edición sistemática repetida (>3 veces el mismo tipo de cambio) → signal CRITERION_CHANGED a Intelia ops.

4.6 Cambio sistémico

Cambio en chart_of_accounts, period locks, tax_entity config → signal de invalidación masiva.

5. Mecanismo de polling

Holded no tiene webhooks fiables. T4 funciona por polling.

Cadencia adaptativa

Tier Cadencia Cubre
Caliente 15 min Docs ejecutados últimos 30 días por team activo
Tibio 6 h Docs últimos 90 días
Frío 7 días Docs >90 días (correcciones tardías, cierres anuales)

Adaptable por team: clientes con contables muy activos → cadencia más alta.

Hash de estado

Para detectar cambios sin enviar el documento entero por cada poll:

HoldedDocumentMonitor {
    document_id: str (external),
    intelia_plan_id: UUID,
    monitored_fields: ["account_lines", "approved", "tax_keys", ...],
    last_hash: str,
    last_polled_at: datetime,
    poll_tier: "hot" | "warm" | "cold",
    edits_detected: list[EditSignal]
}

En cada poll: lee Holded → calcula hash → si distinto → diff detallado + emite signals.

Optimización

  • Batch polling: una llamada Holded por team con múltiples document_ids.
  • Cache local del estado: last_hash evita rehacer trabajo en polls sin cambios.
  • Rate limit-aware: T4 respeta límites de Holded.

6. Matching y trazabilidad

La trazabilidad insertada por I1 es requisito. T4 debe preferir matching explícito:

  1. Por tag estructural (intelia-plan-id-<uuid>) — match perfecto.
  2. Por comment con plan_id — match fuerte.
  3. Por external_id + hash de estado pre-ejecución — match débil pero útil.
  4. Por correlación temporal — solo como fallback.

Si T4 no puede atribuir un cambio a un plan Intelia con confidence alto, emite signal UNATTRIBUTED_CHANGE que no entra al loop de aprendizaje (queda solo para audit).

7. Procesamiento de comments

Los comments libres del contable son la señal más rica pero la más ruidosa.

Pipeline de extracción

  1. Poll detecta comment nuevo (no escrito por Intelia, prefijo no [Intelia]).
  2. LLM corto (gpt-5-nano) procesa con prompt:
    Contexto: [resumen del plan + cuenta usada + cliente]
    Comentario: "[texto del contable]"
    Devuelve JSON: {
      intent: "positive_confirmation" | "negative_disagreement" | "criterion_change" | "question" | "noise",
      subject: "account" | "tax" | "imputation" | "date" | "general" | null,
      confidence: 0.0-1.0,
      extracted_correction: { ... } | null
    }
  3. Si confidence < 0.7 → no se propaga signal (ambiguo). Queda en low_confidence_comments para review humano opcional.
  4. Si criterion_change → signal a Intelia ops dashboard con comment original.
  5. Si negative_disagreement → signal a T3 (evidencia negativa).

Anti-loop

T4 NO procesa comments que parezcan auto-respuestas o ya procesados. Dedupe por comment_id.

8. Ciclo de respuesta opcional al contable

Cuando T4 detecta una edición ambigua, puede dejar un comment al contable en Holded preguntando la razón:

[Intelia] Detectamos que cambiaste 62980000 → 62890000.

¿Razón del cambio?
- #criterio_cambiado (actualizamos la regla)
- #extraccion_incorrecta (OCR leyó mal)
- #bug_intelia (el agente se equivocó)
- O ignora si fue excepción puntual.

Política: solo se hace si la edición es de alta importance (cuenta cambiada vs comment añadido). Si se hace para todo, satura al contable.

9. Cambios sistémicos

Algunos cambios afectan a múltiples documentos:

  • Chart of accounts (cliente renombra cuenta o crea cuenta nueva).
  • Period locks (cliente cerró trimestre).
  • Tax entity config (activó SII, cambió régimen).

T4 monitoriza estos cambios "sistémicos":

SystemicChangeSignal {
    signal_type: "CHART_OF_ACCOUNTS_CHANGED" | "PERIOD_LOCKED" | ...,
    team_id: UUID,
    detected_at: datetime,
    delta: { ... },
    affected_intelia_plans: [list of plan_ids dependientes],
    audience: ["m1_motor", "t3_calcification", "i1_facts_snapshot"]
}

Disparan invalidación masiva en T3 (reglas afectadas → re-shadow) y refresh de facts/erp_snapshot/ en M1.

10. Outputs — el Delta Event

T4 emite señales tipadas:

DeltaEvent {
    signal_type: enum,
    intelia_plan_id: UUID,
    holded_external_id: str,
    detected_at: datetime,
    delta: {
        field: str,
        old_value: any,
        new_value: any,
    },
    actor: "human" | "intelia" | "system" | "unknown",
    confidence_interpretation: float,
    audience: ["t3_calcification", "m1_motor", "intelia_ops"],
    actionable: bool,
    severity: ERROR | WARNING | INFO,
    recommendation: "ignorar" | "revisar" | "invalidar" | "recalibrar" | "promover"
}

Consumidores:

Consumidor Acción
T3 Suma evidencia (positiva si confirmación, negativa si edición)
M1 Recalibra ProviderHistoryFacts. Próxima decisión sabe que último plan fue editado
Intelia ops dashboard Surface correcciones recientes; permite filtrar por cliente, regla, tipo

11. Riesgos arquitectónicos y mitigaciones

Riesgo Mitigación
Polling no detecta cambios intermedios (contable edita rápido) Hash captura "antes/después". Cambios intermedios se pierden — limitación documentada
Holded API rate limit saturado Batch polling + tiers de cadencia + monitoring de rate-limit headers
LLM extractor de comments confunde positive con negative Confidence threshold 0.7; fall-through a low_confidence_comments
Matching incorrecto (cambio atribuido a plan equivocado) Preferir match explícito por tag estructural. Si no match alto, emitir UNATTRIBUTED
Cambios sistémicos no detectados a tiempo Polling sistémico con cadencia más alta (1h). Pre-write check en I1 valida estado fresco
Comments ruidosos ("ok", "👍") inflan false positives Lista de patrones positive ruidosos. Solo se propaga si comment es suficientemente específico
T4 se convierte en "sincronizador de todo Holded" Política dura: T4 observa con intención (objetos relacionados con planes Intelia, ventanas relevantes). No replica el estado completo

12. Lo que puede salir mal

Patología 1: T4 satura Holded API. Polling agresivo + clientes grandes → 1000+ calls/min → bloqueo. Mitigación: cadencia adaptativa + monitor holded_calls_per_minute.

Patología 2: false positives en interpretación de comments. LLM clasifica comment ambiguo como "positive" cuando era negativo. T3 calcifica un patrón que el contable rechaza. Mitigación: confidence threshold + modo "siempre Intelia ops revisa comments" para clientes con contables muy verbose.

Patología 3: latencia entre cambio y propagación. Contable edita 9am; polling 9:15am; T3 procesa hora siguiente. Aceptable trade-off por coste.

Patología 4: el contable edita en Holded y en dashboard al mismo tiempo. Las dos rutas generan evidence de tipos distintos. Mitigación: tracking unificado de "edition events" sin importar canal.

Patología 5: T4 se convierte en sincronizador. Si T4 intenta replicar todo el estado de Holded, reintroducimos el SoR paralelo. Vigilancia: T4 solo observa objetos vinculados a planes Intelia (vía tag o external_id en executed_plan_history), no exploración completa.

13. Métricas operacionales

Métrica Target
t4_polling_latency_p95 <30s (edición → detección) en tier caliente
t4_signals_emitted_per_day_per_team Variable. Si 0 días seguidos, alerta
t4_comment_extraction_confidence_avg >0.75
t4_low_confidence_comments_per_week_per_team <5
t4_holded_api_calls_per_doc_monitored <0.2 (con cache eficiente)
t4_systemic_change_detection_lag <1h para chart_of_accounts
t4_matching_attribution_rate >95% (con trazabilidad insertada por I1)
t4_unattributed_changes_rate <5% (si alto, falla la trazabilidad de I1)

14. Open questions

  • Cadencia óptima de polling caliente — 15 min razonable, medir coste real.
  • ¿Comments del contable se procesan inmediatamente o en batch? Trade-off latencia vs coste.
  • Política de retención de signals históricos. Propuesta: 12 meses caliente, archivar.
  • ¿T4 puede inferir CRITERION_CHANGED por patrón de cambios sin comment del contable? Probablemente sí con threshold.
  • Reverse-sync de comentarios sistémicos (a nivel cliente, no documento específico). ¿Cómo se captura?
  • Cómo se filtran los cambios hechos por Intelia vs por el contable cuando Holded no atribuye autoría clara.
  • ¿Qué objetos Holded deben entrar en observación inicial y cuáles quedan fuera? Definir whitelist conservadora.

Nota especial sobre prioridad

T4 es el componente que merece la segunda iteración de diseño más profunda. Codex lo señaló explícitamente:

"Sin un T4 muy bien diseñado, la promesa de Holded como interfaz madura queda demasiado apoyada en confianza conceptual."

Antes de implementar V3, hacer un brainstorm específico de T4 con ejemplos concretos de deltas Holded, taxonomía de señales, ventanas de observación, severidades e invalidación de reglas T3.


Síntesis. Detalle granular en versiones originales.