TiFactura · Cambios desde qa-20260810

Todo lo mergeado a 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.
18PRs mergeados
4builds QA/PROD
65archivos
+7115 / -134líneas
551 → 613suite (+62 tests)
11CRÍTICAS cerradas

0 · Línea de tiempo de releases

qa-20260810 · 10-ago · base de este documento
Punto de partida. Suite 551/0/16. (fix emisión NC/ND: CbteFch + Concepto 2/3 + retry R)
qa-20260818 / 20260818b · 18-ago
BackOffice ajustes de contingencia (#87) + panel cockpit (#88) + consola BootUI /bootui (#91) + jar sin config embebida (#90).
qa-20260819 · 19-ago
🔴 CAE trabado (#95/#96) + hardening cliente AFIP (audit tanda 1, #100) + BootUI 1.14 Live Activity (#94). Suite 570.
qa-20260819b · 19-ago
🔴 Money-path tandas 1+2: multi-comercio scope por ente (#102), CAEA lock (#103), V1 fail-closed (#105). Suite 581.
qa-20260820 · 20-ago · LATEST
🔴 Money-path tanda 3: jobs aislamiento (#106), saveTrx EnteResolver (#107) + tanda de tests (#108) + informe (#109). Suite 613/0/24.

1 · 🔴 Auditoría money-path — el grueso del período

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.

CRÍTICA Ticket TRABADO sin CAE — #96 (issue #95)

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.

fix Hardening cliente AFIP (tanda 1) — #100 · #101

CRÍTICA ×5 Multi-comercio: scope por ente — #102

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.

fix CAEA + V1 (tandas 2) — #103 · #105

CRÍTICA Tanda 3: jobs + endpoints + saveTrx — #106 · #107

tests Tanda de tests money-path — #108 · #109

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/.

2 · BootUI — consola de diagnóstico embebida

feat Consola /bootui#91 · #94

Consola 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).

3 · BackOffice / Cockpit — ajustes de contingencia

feat Ajustes de contingencia — #87 · #88

4 · Build / packaging

build Jar deployable sin config embebida — #90

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.

5 · Tabla completa de PRs (18)

PRTipoFechaDescripción
#109docs20-agoInforme money-path reproducible + tanda 3
#108test20-agoTanda de tests money-path: 12 bugs confirmados+arreglados, 3 refutados, 3 realdb
#107CRÍTICA20-agoEndpoints hardening — saveTrx con EnteResolver + 5 fixes de borde
#106fix20-agoJobs: aislamiento por ente en CaeaGestion, ComprobantesEmitidos, PvSinMovimiento
#105fix19-agoV1 anti-doble CAEA+CAE fail-closed (V1 en retiro #104)
#103fix19-agoCAEA: lock registrarCaea (TOCTOU) + reparación local + no abortar lote
#102CRÍTICA19-agoMulti-comercio: scope por ente en dedup CAEA + match CAE↔CAEA + TA re-informe (5 CRÍT)
#101fix19-agoTA sobrevive fallo persistencia (#99) + CAEA allowlist (#98) + flush=AUTO doc (#97)
#100fix19-agoAFIP: CAE aprobado nunca R + no persistir cae placeholder + trim
#96CRÍTICA19-agoCAE trabado (#95): reintento re-emite si N nunca se emitió (anti-doble lock pesimista)
#94chore19-agoBootUI 1.3.0 → 1.14.0 (panel Live Activity)
#93docs18-agoBootUI: capturas reales (Overview + Health) al release notes
#92docs18-agoRelease notes BootUI 20260818b (#91 + #90)
#91feat18-agoBootUI: consola diagnóstico /bootui off-by-default, loopback-only, read-only
#90build18-agoEl jar deployable no lleva application*.yml adentro
#89docs18-agoRelease notes técnicas 20260818 (#86 + #87 + #88)
#88feat18-agoCockpit: panel de ajustes de contingencia (tripla CAE+NC+CAEA)
#87feat18-agoBackOffice: 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.

6 · Qué aplicar

Deploy: reemplazar el jar por el de qa-20260820 (Latest). Sin migración DDL nueva en todo el período. Config externa al lado del jar (--spring.config.location=file:./application.yml); PROD con SPRING_PROFILES_ACTIVE=prod. BootUI viene apagado por default (loopback-only si se prende).
Cambios de comportamiento a conocer: un ticket con número reservado y emisión fallida ahora re-emite en vez de quedar trabado; un POST CAEA / reconciliación de un comercio ya no se cruza con otro comercio del mismo (pv,tipo,nro); 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.