main entre qa-20260810 (09c38dc, 10-ago-2026) y qa-20260820 (928e4a5, 20-ago-2026). 18 PRs, 4 builds QA/PROD. El grueso es la auditoría money-path (32 jueces adversarios, mutation-tested) y la consola de diagnóstico BootUI.Auditoría del camino del dinero (emisión CAE/CAEA, reconciliación, locking, multi-comercio) con 4 jueces adversarios por dominio en 3 tandas (32 jueces, 109 hallazgos). Cada bug confirmado fue mutation-testeado (código viejo + test nuevo debe fallar) antes de arreglarse. 11 CRÍTICAS cerradas. Informe completo reproducible en docs/audit-moneypath-4-jueces-20260819.html.
Un ticket que reservaba número pero fallaba la emisión sin que ARCA emitiera quedaba trabado para siempre: el reintento solo consultaba, nunca re-emitía. Ahora rama-3 compara N contra el último autorizado de ARCA: si N nunca se emitió → RE-EMITE sobre la misma fila, con anti-doble bajo lock pesimista (independiente de RCSI). Validado por 4 jueces (2 rondas) + mutation test contra SQL Server real.
R por un fallo posterior del gateway (cálculo del barcode).cae placeholder ('0') de un comprobante rechazado.'A' (#98); invariante flush=AUTO documentada (#97).5 CRÍTICAS con una sola causa: el multi-comercio se scopeó por ente en la emisión V2 y en el UNIQUE de DB, pero 3 lookups quedaron sin ente (dedup CAEA, match CAE↔CAEA de reconciliación, TA del job de re-informe). Dos comercios con el mismo (pv,tipo,nro) se cruzaban: CAEA de B nunca informada / NC falsa contra el CAE de A. Cerrado y mutation-checked.
registrarCaea (TOCTOU doble insert) + reparación local de filas ya autorizadas + no abortar el resto del lote ante el primer error.COMPROBANTE_YA_CAEA). V1 en retiro (#104): no se agrega lógica nueva.CaeaGestion, ComprobantesEmitidos, PvSinMovimiento) ya no abortan la corrida de TODOS los entes si uno falla: try/catch por ente.TrxWS.saveTrx (notificación CAEA SOAP) ahora pasa por EnteResolver y falla cerrado en multi-comercio (antes persistía sin ente). + 5 fixes de borde: CUIT con guiones, ente deshabilitado, tipoComprobante faltante, fuga de FQCN al POS, TrafficMdc.clear() primero en el finally.21 tests nuevos, cada uno atado a un riesgo nombrado por la auditoría y mutation-checkeado: 12 bugs nuevos confirmados y arreglados, 3 refutados fijados como contrato, 3 clases realdb contra SQL Server (concurrencia + locking que H2 no reproduce). Cierra el hueco #1 de la auditoría (“casi todo se testeaba en 1 hilo”). El informe (#109) quedó reproducible desde docs/audit/.
/bootui — #91 · #94Consola de diagnóstico embebida (threads, memoria, jobs, health) montada en /bootui, con tres candados: off-by-default, loopback-only (solo desde el propio server) y read-only. Corre sobre SB 4.0.7 sin upgrade y con el actuator cerrado. Subida a BootUI 1.14 (panel Live Activity). Docs con capturas reales (#92, #93).
/api/ajustes-contingencia) que devuelve la tripla CAE+NC+CAEA para el Libro de IVA del cliente, con API key dedicada (X-Api-Key).El jar deployable ya no lleva application*.yml adentro (se excluyen del empaquetado). La config viaja externa, al lado del jar (--spring.config.location=file:./application.yml), evitando que un yml de repo pise la config real de PROD.
| PR | Tipo | Fecha | Descripción |
|---|---|---|---|
| #109 | docs | 20-ago | Informe money-path reproducible + tanda 3 |
| #108 | test | 20-ago | Tanda de tests money-path: 12 bugs confirmados+arreglados, 3 refutados, 3 realdb |
| #107 | CRÍTICA | 20-ago | Endpoints hardening — saveTrx con EnteResolver + 5 fixes de borde |
| #106 | fix | 20-ago | Jobs: aislamiento por ente en CaeaGestion, ComprobantesEmitidos, PvSinMovimiento |
| #105 | fix | 19-ago | V1 anti-doble CAEA+CAE fail-closed (V1 en retiro #104) |
| #103 | fix | 19-ago | CAEA: lock registrarCaea (TOCTOU) + reparación local + no abortar lote |
| #102 | CRÍTICA | 19-ago | Multi-comercio: scope por ente en dedup CAEA + match CAE↔CAEA + TA re-informe (5 CRÍT) |
| #101 | fix | 19-ago | TA sobrevive fallo persistencia (#99) + CAEA allowlist (#98) + flush=AUTO doc (#97) |
| #100 | fix | 19-ago | AFIP: CAE aprobado nunca R + no persistir cae placeholder + trim |
| #96 | CRÍTICA | 19-ago | CAE trabado (#95): reintento re-emite si N nunca se emitió (anti-doble lock pesimista) |
| #94 | chore | 19-ago | BootUI 1.3.0 → 1.14.0 (panel Live Activity) |
| #93 | docs | 18-ago | BootUI: capturas reales (Overview + Health) al release notes |
| #92 | docs | 18-ago | Release notes BootUI 20260818b (#91 + #90) |
| #91 | feat | 18-ago | BootUI: consola diagnóstico /bootui off-by-default, loopback-only, read-only |
| #90 | build | 18-ago | El jar deployable no lleva application*.yml adentro |
| #89 | docs | 18-ago | Release notes técnicas 20260818 (#86 + #87 + #88) |
| #88 | feat | 18-ago | Cockpit: panel de ajustes de contingencia (tripla CAE+NC+CAEA) |
| #87 | feat | 18-ago | BackOffice: endpoint pull de ajustes de contingencia (tripla CAE+NC+CAEA) |
Nota: los números de PR no son consecutivos porque algunos (issues #95, #97, #98, #99, #104) son tickets referenciados, no PRs de merge; #86 entró antes de la base pero se documentó en #89.
--spring.config.location=file:./application.yml); PROD con SPRING_PROFILES_ACTIVE=prod. BootUI viene apagado por default (loopback-only si se prende).
saveTrx multi-comercio exige ente resoluble; los jobs con un comercio roto no frenan a los demás. Ninguno cambia la salida fiscal (mismos CAE/CAEA/NC, mismo WSDL).
TiFactura · cambios qa-20260810 → qa-20260820 (main 928e4a5) · 18 PRs · generado 20-ago-2026.