Saltar a contenido

ADR-0007 · La Etapa D confirma, y el criterio pasa de optimizador a satisficiente

  • Estado: aceptado
  • Decisores: mvaliente
  • Fecha de la decisión: 2026-08-19
  • Relacionado: ADR-0005, ADR-0006; RF-02, RF-12, RF-18, TBD-12 del paquete Confirmacion Automatica

Contexto y problema

Hasta hoy el módulo decidía pero no ejecutaba. AUTO_CONFIRM_MODE estaba declarado como interruptor y verificado en el código: aparecía en tres lugares y en los tres era solo una etiqueta que se escribía en el registro. No existía ninguna rama que confirmara. Poner active no cambiaba ningún comportamiento.

Al mismo tiempo, el criterio para llegar a auto_confirmado exigía respaldo de identidad: en cobros al menos una de tres pruebas (documento, referencia exacta o nombre exacto); en pagos las dos a la vez (documento del beneficiario y cuenta destino). Ese criterio dejaba fuera dos poblaciones enteras:

  • los cobros cuyo movimiento no trae datos del ordenante — el banco los informa en 53 de 1.095 débitos en guaraníes;
  • todos los pagos en dólares, porque el extracto de la cuenta 111403 nunca había pasado por el sync que consulta el detalle y sus 326 filas tienen los UDF del beneficiario en null.

Medido sobre el registro de sombra del 12 al 18 de agosto: de 75 borradores de cobro distintos, 18 llegaban a auto_confirmado y 16 quedaban en sugerido por falta de respaldo, con un único candidato de monto exacto en la ventana.

Decisión

1. El respaldo de identidad deja de ser condición cuando el candidato es único.

Se auto-confirma con dos condiciones: - hay un único movimiento reclamable —o varios del mismo monto pero con la identidad señalando a uno solo—; - ningún otro borrador pendiente disputa ese movimiento.

La evidencia de identidad se sigue calculando y registrando: dejó de decidir, no de existir. Es lo que permite medir cuántas confirmaciones tenían respaldo.

2. Existe una pieza que confirma, AutoConfirmerService, gobernada por AUTO_CONFIRM_MODE. En shadow es inerte; en active ejecuta un changeset con las tres operaciones que ya usa la confirmación manual: PATCH de la cabecera, SaveDraftToDocument y escritura del CardCode en la fila del extracto.

3. Proveedores entra a la Etapa D, revirtiendo la definición del 2026-08-17 que lo dejaba en recomendación permanente.

Fundamento

El cambio de criterio es un pasaje de optimización a satisficing. La regla anterior respondía a "confirmar solo con certeza máxima"; la nueva, a "confirmar cuando la evidencia alcanza para el contexto, dado el costo del error". El fundamento del decisor: un movimiento solo, del monto exacto, en la ventana, es con altísima probabilidad el de la solicitud —tanto más cuanto más distintivo el importe— y el caso en conflicto ya está cubierto, porque dos movimientos del mismo monto producen ambiguo y van a mano.

La medición respalda la parte cubierta: el 19,8% de los créditos en guaraníes tiene otro del mismo monto dentro de ±2 días, y todos esos siguen yendo a una persona.

Consecuencias

Lo que se gana. El territorio programado se duplica en cobros (~18 → ~34 casos por semana). En pagos en dólares, la auto-confirmación pasa a ser posible: antes era estructuralmente inalcanzable.

Lo que se acepta. El riesgo residual de que el único movimiento de ese monto corresponda a algo que el OMS no conoce —un pago de un tercero, otra operación—. No hay disputa que detectar porque el otro lado no existe como solicitud, y el monto solo no lo distingue. Se mitiga midiendo, no con más reglas.

Lo que falta y no es opcional. El satisficing exige un nivel de aspiración explícito —cuántos errores por período se aceptan, en cuánto tiempo se detectan— y hoy no está declarado. Es la decisión #6 del paquete, "criterio de salida", y con la Etapa D encendida deja de ser una formalidad: pasa a ser el único instrumento de control.

Auditabilidad. Confirmar solo también consume atención, en otro lugar: alguien tendrá que poder revisar qué hizo la máquina. Si auditar cuesta lo mismo que confirmar a mano, el diseño movió el trabajo en vez de quitarlo. Por eso cada documento confirmado automáticamente lleva en Remarks un sello [auto <id>] con el id de la decisión que lo justificó. El autor sigue siendo el dueño de la solicitud: la trazabilidad comercial no se rompe.

Tope de reintentos. Un dato malo en la solicitud no se arregla solo. Sin tope, un fallo permanente de SAP haría reintentar en cada sync, en silencio y para siempre. AUTO_CONFIRM_MAX_CONFIRM_ATTEMPTS (default 3) corta y devuelve la solicitud a la bandeja. El contador es en memoria: un reinicio lo pierde y se reintenta, que es lo correcto ante un fallo que pudo ser de infraestructura.

Alternativas descartadas

Enchufar el if dentro del evaluador. Habría fundido decidir con ejecutar y roto la descomponibilidad del módulo justo donde más se necesita: el día que haya que apagar esto con urgencia. La pieza vive aparte y se apaga por configuración.

Relajar también la ambigüedad. Se evaluó y se descartó: dos movimientos del mismo monto son indistinguibles por el criterio que quedó, y elegir uno sería sortear. Siguen yendo a una persona.

Persistir el veredicto en el borrador para mostrarlo en pantalla. Se propuso y el decisor lo descartó con un argumento correcto: si todo lo que no se confirmó solo se trata igual, distinguir sugerido de sin_candidato en la UI no le cambia la acción a nadie.

Estado de encendido

AUTO_CONFIRM_MODE=shadow en todos los ambientes. Nada se confirma hasta que esa variable cambie, y ese cambio mueve contabilidad: crea documentos con número, afecta cuentas, cancela facturas y consume movimientos del extracto. Deshacerlo es anular un documento, no borrar una marca.