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.
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.
positive | negative | neutral | criterion_change); no toma decisión propia.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).
Pasa N días sin edición → señal positiva pero débil (no es aprobación consciente). Peso bajo en T3.
Contable marca approved=true o aprueba en dashboard Intelia. Peso alto.
Cuenta, impuesto, importe, fecha cambian. Señal negativa para la regla aplicada.
Cambio en nota, tag descriptivo, comentario sin contenido fiscal. No es señal.
Edición sistemática repetida (>3 veces el mismo tipo de cambio) → signal CRITERION_CHANGED a Intelia ops.
Cambio en chart_of_accounts, period locks, tax_entity config → signal de invalidación masiva.
Holded no tiene webhooks fiables. T4 funciona por polling.
| 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.
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.
last_hash evita rehacer trabajo en polls sin cambios.La trazabilidad insertada por I1 es requisito. T4 debe preferir matching explícito:
intelia-plan-id-<uuid>) — match perfecto.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).
Los comments libres del contable son la señal más rica pero la más ruidosa.
[Intelia]).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
}confidence < 0.7 → no se propaga signal (ambiguo). Queda en low_confidence_comments para review humano opcional.criterion_change → signal a Intelia ops dashboard con comment original.negative_disagreement → signal a T3 (evidencia negativa).T4 NO procesa comments que parezcan auto-respuestas o ya procesados. Dedupe por comment_id.
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.
Algunos cambios afectan a múltiples documentos:
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.
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 |
| 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 |
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.
| 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) |
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.