orquestador/specs/PROGRESS.md

481 lines
81 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Seguimiento de implementación
Actualizado: 2026-10-28. T01–T15 DONE. T16 BLOCKED: implementación y A01–A20 aprobados con PostgreSQL externo; falta corrida Docker/Testcontainers. Ver E25. T17 PENDING; ninguna tarea principal IN_PROGRESS.
Estados permitidos: PENDING, IN_PROGRESS, BLOCKED, DONE. No más de una tarea principal IN_PROGRESS. Consultar IMPLEMENTATION_PLAN para subtareas y criterios.
| ID | Estado | Dependencias | Archivos | Comandos/checks | Resultado | Bloqueo | Siguiente paso |
|---|---|---|---|---|---|---|---|
| T01 | DONE | — | pom.xml, mvnw*, .mvn, configuración, DeploymentSmokeCheck.java, ADR-001/004 | E09: clean verify con JDK 21 y deployment-smoke | BUILD SUCCESS; 5 pruebas, 0 fallos, 0 errores, 0 omitidas | Ninguno para T01 | Iniciar T02: OpenAPI y JSON Schema |
| T02 | DONE | T01 DONE | contracts/openapi.yaml, schemas/*.schema.json, examples/contracts, ContractValidationTest.java, ADR-005 | E10: clean verify con Java 21 | BUILD SUCCESS; 92 comprobaciones, 0 fallos/errores/omisiones | Ninguno para T02 | Iniciar T03: migraciones PostgreSQL y Testcontainers |
| T03 | DONE | T02 DONE | V1/V2 SQL, DatabaseMigrationIT.java, configuración, ADR-007, RUNBOOK | E12: clean verify -Pmigration-tests-external con JDK 21 | 92 contratos + 40 IT aprobados en PostgreSQL 9.6.2; 0 fallos/errores/omisiones | Ninguno para T03; ruta Docker no ejecutada localmente | T04: modelo de dominio y puertos |
| T04 | DONE | T02,T03 DONE | */domain, */application/port, flow/api/ValidationReportResponse, Domain*Test, DOMAIN_MODEL.md, ADR-008 | E13: mvnw test con JDK 21; compilación aislada y DTO contra schema | 134 pruebas aprobadas; 0 fallos/errores/omisiones | Ninguno | T05: implementar evaluador de decisiones |
| T05 | DONE | T04 DONE | decision/domain, PureDecisionEvaluator, tres suites T05, DECISION_EVALUATOR.md, ADR-009 | E14: mvnw test con JDK 21 | 216 pruebas aprobadas, 0 fallos/errores/omisiones; A04–A06 a nivel evaluador/contrato | Ninguno | T06: validador, publicación y activación |
| T06 | DONE | T03,T04,T05 DONE | flow/application, flow/infrastructure, PublicationCatalog, FlowValidationTest, FlowPublicationIT, FLOW_PUBLICATION.md, ADR-010 | E15: clean verify -Pmigration-tests-external | 258 unitarias + 51 IT aprobadas; A16 servicio/DB y A17 asignación; REST pendiente T07 | Ninguno para servicios internos T06 | T07: JWT, autorización por recurso y exposición administrativa |
| T07 | DONE | T04 DONE | shared/infrastructure/security, ResourceAccess, flow/api, SecurityPolicyTest, SecurityHttpIT, SECURITY.md, ADR-011 | E16: clean verify -Pmigration-tests-external | 265 unitarias + 57 IT aprobadas; JWT/HTTP/DB y A15 puerta de recursos/A16 HTTP | Keycloak real y despliegue pendientes, fuera de verificación local | T08: reutilizar autorización para solicitudes |
| T08 | DONE | T06,T07 DONE | request/application, request/api, PostgresRequestStore, RequestJson, PersistenceAccessConfiguration, RequestCreationIT, REQUESTS.md, ADR-012 | E17: clean verify -Pmigration-tests-external | 268 unitarias + 66 IT aprobadas; creación atómica, replay, concurrencia, ETag/ACL | Ninguno para implementación local; despliegue pendiente | T09: aceptar eventos idempotentes |
| T09 | DONE | T08 DONE | execution/api, Events/EventStore, EventPolicy, PostgresEventStore, EventAcceptanceIT, EVENTS.md, ADR-013 | E18: clean verify -Pmigration-tests-external | 268 unitarias + 76 IT aprobadas; A07–A09 aceptación durable, guardias, roles, rollback | Ninguno para aceptación local; worker y despliegue pendientes | T10: worker, leases y consulta de ejecución |
| T10 | DONE | T09 DONE | WorkerStore/PostgresWorkerStore, WorkerEngine/WorkerLoop, ExecutionController, V3, WorkerIT, WORKER.md, ADR-014 | E19: suite completa + verificación final WorkerIT | 268 unitarias y 93 IT distintos aprobados; worker final 17 casos, fencing/checkpoints/recuperación | Ninguno para worker local; adapters T11 y retry T12 pendientes | T11: handlers e integraciones HTTP |
| T11 | DONE | T10 DONE | action/infrastructure, integration/infrastructure, PostgresWorkerStore, mocks HTTP, examples/integrations, INTEGRATIONS.md, ADR-015 | E20: clean verify -Pmigration-tests-external | 301 unitarias + 99 IT = 400 aprobadas; 0 fallos/errores/omisiones | Integración real de proveedores pendiente de contratos/credenciales; sin bloqueo local | T12: reintentos y conciliación |
| T12 | DONE | T11 DONE | RetryDelay, WorkerEngine/Store, Resolutions/PostgresResolutionStore, ResolutionController, RetryReconciliationIT, RECONCILIATION.md, ADR-016 | E21: clean verify -Pmigration-tests-external | 303 unitarias + 116 IT = 419 aprobadas; retries, resolución atómica y 5 caídas de JVM reales | Ninguno local; proveedores reales fuera de alcance | T13: documentos y tareas para front |
| T13 | DONE | T11,T12 DONE | AvailableEvents/Policy/Store/Controller, DocumentMetadata, WorkerEngine, AvailableEventsIT/DocumentTasksIT, AVAILABLE_EVENTS.md, ADR-017 | E22: clean verify -Pmigration-tests-external | 308 unitarias + 137 IT = 445 aprobadas; A11/A20 y tareas/bloqueos verificados | Ninguno local; documental real fuera de alcance | T14: flujos demostrativos v1/v2 |
| T14 | DONE | T05,T06,T13 DONE | examples/flows, examples/integrations, demo-flows.http, DemoFlowTest/DemoFlowsIT, ADR-018 | E23: verify -Pmigration-tests-external -Dit.test=DemoFlowsIT,DocumentTasksIT,HttpIntegrationIT | 311 unitarias + 29 IT = 340 aprobadas; A10/A18, fronteras y dos tipos completos | Proveedores reales fuera del alcance local; simulate registrado para T16 | T15: auditoría y observabilidad |
| T15 | DONE | T09,T10,T11,T12,T13,T14 DONE | audit/api, HistoryStore, QueueMetrics, CommandObservationFilter, Worker/HTTP, ObservabilityTest/IT, OBSERVABILITY.md, ADR-019 | E24: clean verify -Pmigration-tests-external + check final cursor | 314 unitarias + 163 IT = 477; ajuste final 4 unitarias + 1 IT aprobados, sin fallos ni omisiones | Ninguno local; Docker/proveedores reales fuera de evidencia | T16: verificación integral |
| T16 | BLOCKED | T15 DONE | FlowSimulation/SimulationController, TransitionEvaluator, SimulationTest/IT, acceptance-cases.json, verify_acceptance.py, CI, ACCEPTANCE.md, ADR-020 | E25: clean verify externo + gate A01–A20 + prueba Docker | 326 unitarias + 167 IT = 493 aprobadas; A01–A20 PASS externo; 2 tests Python aprobados | Testcontainers no encuentra entorno Docker válido; CI remoto no ejecutado | Habilitar motor Docker autorizado y ejecutar clean verify + gate --require-testcontainers |
| T17 | PENDING | T16 | Dockerfile, compose.yaml, README, RUNBOOK, examples/http, CI | Pendiente: Build de imagen, compose, verify y demo completa de sección 16 | No ejecutado | Dependencias sin completar | Construir imagen y Compose completos |
## E11 — Adaptación PostgreSQL 9.6.2 — 2026-10-26 13:23 (America/Mexico_City)
- Solicitud del usuario: utilizar el PostgreSQL disponible. ADR-006 documenta la modificación del objetivo PostgreSQL 17 al entorno 9.6.2 actual.
- Configuración: perfil Spring postgres96, Hibernate PostgreSQLLegacyDialect (community-dialects 7.4.13.Final), Compose selecciona ese perfil por defecto. .env.example apunta a server02:30432/orquestador y no incluye contraseña.
- `.\mvnw.cmd --batch-mode --no-transfer-progress clean verify` con Java 21: BUILD SUCCESS, 92 tests aprobados (16.074 s).
- `.\mvnw.cmd --batch-mode --no-transfer-progress failsafe:integration-test failsafe:verify -Ppostgres96-check`, con DB/JWT en variables de proceso: BUILD SUCCESS, 1 prueba compuesta aprobada (12.696 s). Reporte: target/failsafe-reports/com.organizacion.compatibility.Postgres96CompatibilityProbe.txt.
- Evidencia: conexión real 9.6.2, dialecto PostgreSQLLegacyDialect, default_transaction_read_only=on, validación Flyway 12.4.0 de 0 migraciones, health/readiness/liveness HTTP 200 UP y ruta protegida HTTP 401. Servicio local detenido al terminar.
- Sin cambios a datos, schemas o historial de migraciones. El inicializador automático Flyway y SQL init se desactivaron únicamente en la prueba; la configuración normal conserva Flyway. No se desplegó el JAR en server02.
- La revisión automática rechazó el primer diseño por posible migración; la alternativa explícitamente read-only fue aprobada y ejecutada. No queda bloqueo de aprobación para esta adaptación.
- T03 sigue PENDING: faltan tablas, migraciones y pruebas de restricciones/concurrencia. La conexión disponible permite diseñar para 9.6, pero no sustituye un entorno aislado de pruebas ni prueba soporte completo del motor.
## E10 — Cierre T02 — 2026-10-26 11:58 (America/Mexico_City)
- Estado: DONE. 14 operaciones REST OpenAPI 3.1.0, DTOs, schema DSL 2020-12, ejemplos de resultados normalizados y fixtures contractuales completos para esta fase.
- Comando: `.\mvnw.cmd --batch-mode --no-transfer-progress clean verify` con JAVA_HOME=.tools/jdk21/jdk-21.0.12.1+1, Maven Wrapper 3.9.12 y Enforcer habilitado.
- Resultado: BUILD SUCCESS (11.969 s); ContractValidationTest: 92 comprobaciones, 0 fallos, 0 errores, 0 omitidas. Reportes en target/surefire-reports/com.organizacion.orchestrator.ContractValidationTest.txt y TEST-com.organizacion.orchestrator.ContractValidationTest.xml.
- Cobertura: schema oficial OpenAPI 3.1, parseo Swagger, meta-schema 2020-12, resolución de todos los $ref locales, 52 fixtures (29 válidos/23 inválidos), ejemplos embebidos, rutas/seguridad/cabeceras, aridad de condiciones, límites estructurales, UUID, claves JSON duplicadas y rechazo de inyección de datos de proveedor según inputSchema.
- Corrección durante la tarea: primera ejecución tuvo 91/92 aprobadas; Swagger Parser expandía el schema recursivo hasta exceder profundidad. Se corrigió con resolve=false, manteniendo verificación independiente de referencias y validación real de ejemplos. Segunda ejecución aprobó todo; no hubo tests omitidos.
- Dependencias sólo test: networknt 1.5.9 y swagger-parser-v3 2.1.35; API Jackson 2 gestionada por BOM. Inspección del JAR con zipfile confirmó ausencia de validadores/Swagger y Jackson 2 databind/YAML en BOOT-INF/lib.
- Dockerfile/.dockerignore incluyen contracts, schemas y examples/contracts en build para ejecutar estas pruebas; no se construyó una imagen en esta sesión (Docker no disponible en este equipo). No se modificó ni redesplegó server02.
- Archivos principales: contracts/openapi.yaml, contracts/validation/openapi-3.1.schema.json, schemas/{flow-definition,api,integration-results}.schema.json, examples/contracts/manifest.json y fixtures, examples/http/contracts.http, pom.xml, ContractValidationTest.java, README/documentación y ADR-005.
- Alcance: validación de contratos y datos, sin endpoints, base, providers ni motor. La evaluación de scoring/AST, validación semántica de grafo, permisos efectivos y A01–A20 corresponden a tareas posteriores; no se declaran aprobados. El smoke remoto de T01 no se repitió por no haber cambios de runtime.
- Siguiente tarea: T03 (PENDING), dependencias satisfechas; requiere entorno Docker/PostgreSQL para Testcontainers.
## E09 — Cierre T01 — 2026-10-26 11:20 (America/Mexico_City)
- Estado final: DONE. Esta evidencia supera los bloqueos históricos de T01 descritos abajo; no cierra T07/T16/T17.
- JDK: Eclipse Temurin 21.0.12.1+1, instalado sólo en .tools/jdk21/jdk-21.0.12.1+1 (ignorado en Git). Descarga oficial mediante API Adoptium, SHA256 comprobado: f9d6e191ab098c0d416e7d588a24420a8621cd2f4720dab2459b8b7b2d2d8b4e.
- Maven Wrapper: 3.9.12. `mvnw.cmd -version` confirmó JDK 21.0.12.1. Enforcer validó Java y Maven; no se omitió ninguna regla.
- Comando: `.\mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pdeployment-smoke '-Dsmoke.baseUrl=http://server02:8787'`, con JAVA_HOME apuntando al JDK anterior sólo en esa sesión.
- Resultado: BUILD SUCCESS (29.285 s); 5 pruebas ejecutadas, 0 fallos, 0 errores, 0 omitidas. Compilación release 21 y JAR ejecutable generado.
- Pruebas: health/readiness/liveness HTTP 200 y JSON status UP; ruta de solicitudes sin token HTTP 401 y challenge Bearer; token malformado HTTP 401.
- Reportes: target/failsafe-reports/com.organizacion.orchestrator.DeploymentSmokeCheck.txt y TEST-com.organizacion.orchestrator.DeploymentSmokeCheck.xml. Son artefactos locales; este registro conserva el resumen sin copiar propiedades del entorno.
- JAR: target/orquestador-nmp-0.1.0-SNAPSHOT.jar, SHA256 BA94B68388E26575F3CB6370E360B7E1D2C859853359CEE1D2D4C931D884B030.
- Archivos: pom.xml, src/test/java/com/organizacion/orchestrator/DeploymentSmokeCheck.java, README de pruebas, README.md, specs/RUNBOOK.md, specs/IMPLEMENTATION_PLAN.md, specs/DECISIONS.md y este registro.
- Alcance: build local con Java 21 más smoke del despliegue en red local con PostgreSQL externo, documentado en ADR-004. No hubo redeploy ni prueba de JWT válido, roles, endpoints funcionales o persistencia de negocio. La salud no certifica versión del runtime remoto ni identidad de su JAR.
- Siguiente tarea habilitada: T02 (PENDING, sin bloqueo de dependencias).
## Evidencias históricas — 2026-10-26
- E01: `java -version` y `mvn -version`: Java 17.0.12 y Maven 3.9.12. Se encontró también Corretto 24; no JDK 21 en las ubicaciones revisadas. `Get-Command docker` no encontró Docker en PATH.
- E02: `mvn -B -N org.apache.maven.plugins:maven-wrapper-plugin:3.3.4:wrapper '-Dmaven=3.9.12' '-Dtype=only-script'`: BUILD SUCCESS. Wrapper oficial creado con distribución 3.9.12. Se corrigió una primera invocación cuya propiedad sin comillas fue fragmentada por PowerShell.
- E03: con JAVA_HOME apuntando temporalmente a Corretto 24, `.\mvnw.cmd -B '-Denforcer.skip=true' package`: BUILD SUCCESS; JAR ejecutable generado con compilación release 21. Fue una comprobación limitada; no equivale a build/runtime con JDK 21. No modificar Enforcer ni CI para omitir el requisito. No había pruebas ejecutables en esta comprobación.
- E04: POM/BOM Boot 4.1.2 y dependencias resueltos desde Maven Central. Arranque, health, Compose, Testcontainers y A01–A20 NO ejecutados. La imagen PostgreSQL fijada está pendiente de pull.
- E05: `.\mvnw.cmd -B --no-transfer-progress validate` con Java 17: rechazo esperado de Enforcer, mensaje `Configura JAVA_HOME con JDK 21.` La regla impide compilar accidentalmente con el runtime incorrecto.
- E06: `.\mvnw.cmd -B --no-transfer-progress dependency:tree '-Dincludes=org.junit.jupiter:*,org.junit.platform:*'`: BUILD SUCCESS; Jupiter 5.13.4 y Platform 1.13.4 confirmados.
- E07: lectura XML del POM y comprobación de IDs: T01–T17 presentes en plan/seguimiento. Cabecera binaria de OrchestratorApplication.class: major 65 (Java 21). La inspección inicial con javap quedó impedida por acceso del sandbox a java.security; la lectura directa de la cabecera confirmó el bytecode.
## Próxima sesión
### E08 — Prueba del servicio remoto (2026-10-26)
Comprobación ejecutada con Invoke-WebRequest -UseBasicParsing -TimeoutSec 10 contra http://server02:8787:
| GET | HTTP | Resultado |
|---|---|---|
| /actuator/health | 200 | status UP |
| /actuator/health/readiness | 200 | status UP |
| /actuator/health/liveness | 200 | status UP |
| /api/v1/requests, sin token | 401 | Protección sin autenticación confirmada |
Con la configuración del repositorio, readiness incluye PostgreSQL. Esta prueba confirma salud remota y rechazo sin token; no acredita la existencia del endpoint de solicitudes, validación de JWT real, versión del runtime remoto ni la suite clean verify. El intento anterior contra serer02 falló por nombre incorrecto y se corrigió a server02. Las limitaciones de arranque remoto registradas anteriormente quedan superadas por esta evidencia; T01 conserva pendiente el cierre reproducible con Java 21.
### Preparación Docker solicitada — 2026-10-26
- Archivos: Dockerfile, .dockerignore, compose.yaml, .env.example, README.md, RUNBOOK.md y ADR-003.
- Entregado: imagen multietapa Java 21, usuario no root, healthcheck y un único servicio conectado a PostgreSQL externo. No se incluyó PostgreSQL en Compose. No se modificó ningún .env del usuario.
- Verificación: análisis con PyYAML 6.0.3 y comprobaciones estáticas aprobaron YAML, servicio único, ausencia de volúmenes/dependencias locales, seis variables obligatorias, puerto interno y mapeo al anfitrión. Herramienta temporal en .tools, fuera de Git y del contexto Docker.
- Bloqueo: Docker no disponible en PATH ni en la ubicación habitual de Docker Desktop; no se ejecutaron docker build, compose config ni arranque/conexión a PostgreSQL externo. Esta comprobación estática no sustituye esas pruebas.
- Siguiente paso: completar .env, ejecutar docker compose config --quiet y docker compose up --build -d; comprobar readiness y logs. T01 continúa BLOCKED y T17 PENDING hasta satisfacer sus criterios completos.
1. Leer este registro, especificación y cambios del repositorio.
2. T01–T10 DONE. Siguiente tarea habilitada: T11, handlers e integraciones HTTP.
3. Registrar evidencia de la siguiente tarea y mantener una única tarea principal IN_PROGRESS. No repetir verificaciones aprobadas sin cambios o fallos que lo justifiquen.
## Plantilla de evidencia adicional
`Fecha | ID | Archivos | Comando/check exacto | Resultado y reporte | Bloqueo | Próximo paso`
## E12 — Cierre T03 — 2026-10-26 14:12 (America/Mexico_City)
- Entorno autorizado: server02:30432/orquestador_test, PostgreSQL 9.6.2 real; conexión inicial de solo lectura confirmó nombre y versión. No se modificó la base orquestador ni se desplegó el servicio remoto.
- Archivos: V1__orchestrator_tables.sql, V2__immutability_and_runtime_privileges.sql, DatabaseMigrationIT.java, pom.xml, application.yaml, compose.yaml, .env.example, probe de compatibilidad y documentación.
- Comando: `.\mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`, JDK 21.0.12.1 y credenciales MIGRATION_TEST_DB_* en entorno de proceso.
- Resultado final: BUILD SUCCESS, 55.245 s, 92 pruebas Surefire y 40 Failsafe, cero fallos/errores/omisiones. Reportes: target/surefire-reports/com.organizacion.orchestrator.ContractValidationTest.txt y target/failsafe-reports/com.organizacion.orchestrator.DatabaseMigrationIT.txt.
- V1/V2 aplicadas desde esquema vacío y segunda ejecución sin migraciones pendientes. Verificadas diez tablas, FKs, JSONB/checks, idempotencia, índice activo incluyendo conciliación, flujos publicados/retirados inmutables, históricos append-only, rol runtime sin DDL ni cambios de auditoría, rollback atómico, rollback de migración fallida, carrera de dos inserciones y SKIP LOCKED.
- La primera corrida encontró una comparación textual false/f en la prueba JDBC de permisos; se corrigió con cast explícito a text. La suite completa final pasó, incluyendo los checks restantes del rol.
- El ERROR de Flyway V999 es intencional: el test comprueba que DDL e historial se revierten. V999 es temporal, no se entrega como migración.
- Esquema final aislado t03_304ad66fc7c3485ca63e474f2fe76c19 eliminado por AfterAll; rol temporal revertido y su ausencia comprobada. No se guardaron contraseñas en archivos del proyecto.
- Testcontainers 2.0.5/PostgreSQL 9.6.24 preparado como ruta normal de verify/CI; ejecución local no realizada por ausencia de Docker. ADR-007 documenta alternativa real externa y límites.
- Siguiente: T04 PENDING con dependencias satisfechas. T06 conserva la validación semántica/publicación y T07 la autorización por recurso.
## E13 — Cierre T04 — 2026-10-26 15:52 (America/Mexico_City)
- Criterios previos: records y errores estables; DTO separado de dominio/persistencia; puertos DecisionEvaluator, ActionHandler y FlowDefinitionValidator; dominio sin dependencias HTTP/JPA. Pruebas pertinentes: invariantes e inmutabilidad, recompilación aislada y compatibilidad DTO/schema.
- Implementación: 30 archivos de dominio/puertos bajo shared, flow, request, execution, decision y action; un DTO de validación en flow/api. JSON sellado e inmutable con BigDecimal y null/ausencia distintos; AST y acciones tipadas; identidad por recurso; snapshots de flujo, solicitud, ejecución y checkpoint. Ver DOMAIN_MODEL.md y ADR-008.
- Comando final: `.\mvnw.cmd --batch-mode --no-transfer-progress test`, JAVA_HOME configurado al JDK local 21.0.12.1.
- Resultado: BUILD SUCCESS, 22.456 s, 134 tests (92 contractuales existentes + 39 DomainModelTest + 1 DomainArchitectureTest + 2 DomainBoundaryTest), cero fallos/errores/omisiones. Reportes en target/surefire-reports.
- Arquitectura: los 30 archivos domain/application/port recompilaron con classpath aislado y únicamente java.base, sin fuentes API/infraestructura. Se prohíben además referencias java.net/java.sql. No se añadió dependencia Maven.
- Verificado: copias inmutables de colecciones, precisión decimal, null/ausencia, pointers permitidos, orden de AST/reglas/acciones, políticas de reintento acotadas, publicación/retiro, ejecución activa y conciliación, lease consistente, resultado/checkpoint exitoso obligatorio, separación de fallo técnico/resultado negativo y hashes compatibles con DB/API. DTO de validación comprobado contra api.schema.json.
- Primera ejecución: 129 pruebas aprobadas. Revisión posterior alineó hashes a hexadecimal minúscula y añadió el DTO y cinco casos adicionales; la ejecución final de 134 pruebas aprobó todo.
- Alcance: sin cambios a SQL, contratos, configuración de despliegue o credenciales. No se accedió a PostgreSQL ni se repitieron sus IT de E12, al no cambiar persistencia. No se desplegó el servicio. Los puertos no tienen implementaciones simuladas; T05/T06/T11 conservan sus criterios funcionales y A01–A20 siguen pendientes.
- Siguiente tarea: T05 PENDING con dependencia satisfecha. No hay tarea principal IN_PROGRESS.
## E14 — Cierre T05 — 2026-10-26 17:05 (America/Mexico_City)
- Criterios previos: once operadores, JSON Pointer, BigDecimal, tipos estrictos, null/ausencia, cortocircuito, límites, UNIQUE/FIRST y ambigüedad. Verificar scoring 71/70/61/60 y solapamientos simples, con dominio independiente de infraestructura.
- Archivos: PureDecisionEvaluator, ConditionEvaluator, JsonPointerResolver, AstLimits, EvaluationLimits, IntervalOverlapAnalyzer; DecisionEvaluatorTest, JsonPointerResolverTest, IntervalOverlapAnalyzerTest; ampliación de DomainArchitectureTest; documentación y ADR-009.
- Comando final: `.\mvnw.cmd --batch-mode --no-transfer-progress test`, JDK 21.0.12.1. BUILD SUCCESS, 13.414 s. 216 pruebas, cero fallos/errores/omisiones: 92 contratos + 56 decisiones + 17 pointers + 9 intervalos + 39 dominio + 1 arquitectura + 2 DTO/schema.
- Reportes: target/surefire-reports/com.organizacion.orchestrator.DecisionEvaluatorTest.txt, JsonPointerResolverTest.txt e IntervalOverlapAnalyzerTest.txt (mismo prefijo de paquete); pruebas previas también aprobadas.
- A04: fixture contractual scoring.json produce N/M/M/MANUAL para 71/70/61/60, además de fracciones precisas y valores fuera del rango ilustrativo. No se impuso rango universal 0–100.
- A05: fixtures de proveedor con score ausente/string rechazan BureauResult; si llegan al evaluador producen EVALUATION_ERROR, nunca default. Null también falla. No es aún prueba de adapter HTTP/proveedor.
- A06: varias coincidencias UNIQUE producen AMBIGUOUS_DECISION, incluso con igual output. FIRST conserva precedencia y regla aplicada; errores no se convierten a negocio negativo. Evaluación pura sin escrituras.
- Verificados límites exactos de 20 niveles/1000 nodos, suma de reglas y ramas no ejecutadas, entrada de 50000 niveles rechazada sin stack overflow, comparación estructural/IN acotados, cortocircuito ordenado y 40 evaluaciones concurrentes con la misma instancia/contexto intacto.
- Intervalos: extremos abiertos/cerrados, conjunciones, intervalos vacíos y operandos invertidos. Fuera del subconjunto se informa alcance desconocido; no se afirma satisfacibilidad general. Arquitectura recompila también el evaluador application con java.base y sin I/O/HTTP/JPA.
- Primera corrida: 215 pruebas aprobadas; se añadió rechazo temprano por número de reglas y una prueba de frontera exacta de nodos. Corrida final: 216 aprobadas.
- Sin cambios SQL, contratos REST/DSL ni dependencias; no se accedió a PostgreSQL ni proveedores, no hubo despliegue. Los IT PostgreSQL de E12 no se repitieron porque no cambió persistencia. A04–A06 están cubiertos al nivel T05; la aceptación integral REST permanece en T16.
- Siguiente: T06 PENDING con dependencias satisfechas. Ninguna tarea principal IN_PROGRESS.
## E15 — Cierre T06 (servicios internos) — 2026-10-26 21:58 (America/Mexico_City)
- Criterios previos: validar grafo/schemas/roles/capacidades/mappings; edición con revisión; publicar definición inmutable y checksum con contratos/perfiles fijados; activar/retirar con bloqueos y auditoría atómica. Verificar fallos y carreras en PostgreSQL real. ADR-010 explicita la separación entre servicio interno T06 y exposición REST segura T07.
- Archivos: PublicationCatalog, FlowJsonCodec, ConfiguredFlowValidator, FlowPreparation/FlowStore, CatalogFlowPreparation, FlowAdministration/FlowValidationException, PostgresFlowStore, FlowFixtures/FlowValidationTest/FlowPublicationIT, DomainArchitectureTest, pom.xml y documentación.
- Comando final: `.\mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`, JAVA_HOME en JDK 21.0.12.1, credenciales MIGRATION_TEST_DB_* solo en entorno de proceso.
- Resultado final: BUILD SUCCESS, 2:07 min. 258 pruebas Surefire y 51 Failsafe, cero fallos/errores/omisiones. FlowValidationTest: 42 casos; FlowPublicationIT: 11 casos reales (47.86 s); DatabaseMigrationIT: 40 casos (58.63 s). Reportes: target/surefire-reports y target/failsafe-reports/com.organizacion.orchestrator.FlowPublicationIT.txt / DatabaseMigrationIT.txt.
- Validación: grafo, terminales/sumideros/alcanzabilidad, IDs/parejas únicas, roles, schemas cerrados, catálogo/perfiles, NO_OP, inputs y resultados previos, tipos, updates solapados, protección de datos de proveedor, tareas documentales, decisiones y límites. Decoder completo del DSL y roundtrip de fixtures T02, rechazo de claves duplicadas/JSON excesivo/referencias externas/Unicode incompatible, canonicalización y hash estable.
- Persistencia: ciclo crear/editar/publicar/activar/retirar, revisiones obsoletas, inmutabilidad de servicio y DB, permisos técnicos internos, contratos/perfiles fijados, retiro sin alterar instancias existentes y limpieza auditada de referencias activas. Cada escritura administrativa se revirtió ante un fallo SQL real inducido en admin_audit.
- Concurrencia con barreras: dos publicadores; editar/publicar; dos activaciones; activar/retirar; asignar antes del retiro; retiro antes de asignación. Ninguna asignación posterior al retiro ni cambio parcial. T08 debe conservar la misma transacción para solicitud/idempotencia/auditoría, según FLOW_PUBLICATION.md.
- A16 acreditado a nivel API interna y DB; comprobación REST/JWT no ejecutada ni anunciada como aprobada. A17 acreditado con puerta de asignación e inserción real de solicitudes en transacción. T07/T08/T16 completarán las rutas y el recorrido HTTP. No se inició T07.
- Aislamiento: únicamente orquestador_test. Último esquema T06: t06_ef065d4bc2c34f5dbbe3f839e7d1d96a, eliminado por AfterAll; también se limpió el esquema propio T03. Trigger de fallo solo en esquema de prueba. No se tocó orquestador ni se hizo redeploy.
- La primera solicitud de ejecución remota agotó el plazo de revisión automática y no se inició. El reintento permitido fue aprobado y pasó (255 unitarias + 50 IT); tras ampliar controles/auditoría y añadir el orden inverso de la carrera, la corrida final pasó con 309 pruebas. No queda bloqueo de aprobación.
- Artefacto: target/orquestador-nmp-0.1.0-SNAPSHOT.jar, SHA256 2E60C16853ECB1118922294996DF1041CA79A9CC9D71C394FD8C848EAF53B5DA. Inspección ZIP confirmó tres schemas empaquetados, networknt 1.5.9 y Jackson 2.21.7 junto al Jackson 3.1.7 de Boot. No se ejecutó Docker ni arranque/redeploy de este JAR.
- Decisión técnica: JDBC transaccional para administración, detrás de puertos puros, en lugar del JPA propuesto para estos agregados; motivo/alternativas documentados en ADR-010. No se añadieron migraciones ni se cambiaron contratos REST. No hay proveedor real ni catálogo simulado registrado en producción.
- Siguiente: T07 PENDING, dependencias satisfechas. Ninguna tarea principal IN_PROGRESS.
## E16 — Cierre T07 — 2026-10-27 02:47 (America/Mexico_City)
- Criterios: JWT firmado (firma/issuer/audience/exp), roles técnicos y scope, puerta de propiedad para solicitud/ejecución/documento/auditoría, runtime DB restringido y seis rutas administrativas T06 con A16 por HTTP. ADR-011 registra decisiones de alcance y autorización.
- Archivos: SecurityConfiguration, JwtActorMapper, RuntimeRoleVerifier, ResourceAccess/ResourceOwnershipStore/ResourceOwner, PostgresResourceOwnershipStore, FlowAdministrationController/FlowView, CorrelationFilter/ProblemResponse/ApiExceptionHandler, PublicationCatalogLoader/FlowAdministrationConfiguration, config/, compose.yaml, application.yaml, .env.example, SecurityPolicyTest, SecurityHttpIT, ResourceProbe exclusivo de test, DomainArchitectureTest y SECURITY.md.
- Comando final: `.\mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`, JDK 21.0.12.1; credenciales MIGRATION_TEST_DB_* solo en entorno de proceso. BUILD SUCCESS, 2:10 min, finalizado 2026-10-27T02:47:52-06:00.
- Resultado: 265 pruebas Surefire + 57 Failsafe = 322, cero fallos/errores/omisiones. IT: DatabaseMigrationIT 40, FlowPublicationIT 11, SecurityHttpIT 6. SecurityPolicyTest 7. Reportes target/surefire-reports y target/failsafe-reports.
- JWT RSA real y JWKS HTTP local: firma ajena, issuer/audience incorrectos, expiración, nbf futuro, ausencia de exp/sub/ámbito y token malformado/ausente denegados. Roles realm/cliente correcto aceptados; otros clientes y OAuth scope no conceden permisos. Ámbito administrativo ajeno denegado.
- HTTP administrativo: crear/validar/publicar/activar/retirar; rol editor no publica; ETag y precondiciones 428/400/412; editar publicado 409 (A16); JSON duplicado/malformado 400, schema inválido 422, cuerpo excesivo 413. Health anónimo 200, ausencia de cookies de sesión en errores autenticados.
- A15: los cuatro recursos persistidos resuelven propietario/ámbito a través de PostgreSQL. Dueño del mismo ámbito accede; mismo dueño de otro ámbito, otro dueño incluso FLOW_ADMIN y recurso inexistente reciben 404. Conciliación exige operador y ámbito, con delegación explícita de propietario. Se verifica por HTTP con ResourceProbe, controlador solo de test fuera del escaneo productivo, no son las rutas funcionales futuras.
- DB: conexión independiente con LOGIN temporal no elevado, concesiones V2, migración con propietario distinto; RuntimeRoleVerifier acepta runtime y rechaza propietario. DDL, DELETE admin_audit y lectura flyway_schema_history rechazados por PostgreSQL real.
- Aislamiento: únicamente orquestador_test; schema final t07_64e1695df2154c3ba0ad28c4530c0ef0 y rol t07_runtime_64e1695df2154c3ba0ad28c4530c0ef0 eliminados por AfterAll. Esquemas propios T03/T06 también limpiados. No se modificó orquestador, no se desplegó ni se invocaron proveedores.
- Corrida inicial aprobada: 265 unitarias; integración dirigida 4 casos aprobados el 2026-10-26. Se amplió con recursos persistidos y roles de cliente; la corrida final incluye esos 6 casos y todas las regresiones. El wrapper requirió ejecución fuera del sandbox para acceder a la caché/JDK; revisión automática aprobó ejecución. No queda bloqueo técnico.
- Configuración local: administración deshabilitada por defecto; al habilitar exige usuario DB restringido, catálogo y lista ADMIN_BUSINESS_SCOPES. business_scope es el claim por defecto configurable, pendiente de confirmar contra un JWT real de controlms. Verificar emisión real Keycloak y desplegar no se presentan como pruebas aprobadas.
- Sin nuevas migraciones ni cambio de idempotencia/versionado. Compose conserva un único servicio y PostgreSQL externo. Simulación se mantiene pendiente T14 y resolución funcional T12. T08 debe integrar la puerta ResourceAccess y desacoplar su wiring del interruptor administrativo conservando la verificación DB. Siguiente: T08 PENDING; ninguna tarea principal IN_PROGRESS.
## E17 — Cierre T08 — 2026-10-27 03:03 (America/Mexico_City)
- Criterios previos: resolver/fijar flujo publicado activo, validar initialDataSchema y dataSchema, idempotencia por actor/ámbito, solicitud/auditoría/ledger atómicos, consulta con ETag/ejecución activa y autorización. Pruebas de carreras reales, rollback y HTTP firmado; no cerrar por compilación.
- Archivos: Requests/RequestStore/RequestSnapshot, RequestJson/PostgresRequestStore/RequestConfiguration, RequestController/RequestView, PersistenceAccessConfiguration, ajustes FlowAdministrationConfiguration/ApiExceptionHandler, flags application.yaml/compose/.env.example; RequestJsonTest, RequestCreationIT, fixture SecurityHttpIT y DomainArchitectureTest. Contrato OpenAPI/README, REQUESTS.md, SECURITY.md, ADR-012 y examples/http/requests.http actualizados.
- Comando final: `.\mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`; JDK 21.0.12.1, MIGRATION_TEST_DB_* solo en entorno de proceso. BUILD SUCCESS, 2:34 min, finalizado 2026-10-27T03:03:36-06:00.
- Resultado: 268 unitarias Surefire + 66 IT Failsafe = 334; cero fallos/errores/omisiones. IT: DatabaseMigrationIT 40, FlowPublicationIT 11, RequestCreationIT 9, SecurityHttpIT 6. Reportes target/surefire-reports y target/failsafe-reports.
- HTTP: 201/Location/ETag, GET autorizado, RequestView/Problem contra schema contractual; replay idéntico con respuesta original después de activar v2, retirar v1 o avanzar revisión; GET conserva versión fijada y expone ejecución activa/ETag actuales. Conflicto 409 por otro contenido; clave independiente por actor/ámbito; scope/owner ajenos 404, sin JWT 401. Administración apagada 403 mientras solicitudes funcionan.
- Entrada: command cerrado, identidad cliente rechazada, ambos schemas de datos, tipos estrictos, score no permitido, tamaño UTF-8/canónico, JSON duplicado y decimal preciso. Ausencia de clave 400, schema 422, tamaño 413, tipo inexistente 404, tipo deshabilitado/sin activo 409. Fallos no consumen clave; replay no depende de disponibilidad del catálogo activo.
- Concurrencia real: dos POST de igual clave generan una única solicitud/respuesta; comandos distintos en carrera producen 201/409. Barreras dentro de la asignación comprueban retención de locks flujo/tipo hasta commit ante activación y retiro. Solicitud aceptada conserva versión anterior; posteriores usan nueva versión o rechazan tipo retirado. Regresiones de carreras T06 también aprobadas.
- Atomicidad: triggers exclusivos de prueba fallan realmente al insertar auditoría o ledger. No queda solicitud/ledger parcial; reintento tras fallo de auditoría funciona. Implementación JDBC comparte DataSource/READ COMMITTED con FlowStore y usa advisory lock transaccional más clave única completa; ADR-012 registra elección y semántica de replay.
- Aislamiento: únicamente orquestador_test. Se reutilizó fixture T07 con schema t07_704fbd4eaf8e4f649d08b40a78a6bf4c y rol LOGIN t07_runtime_704fbd4eaf8e4f649d08b40a78a6bf4c, eliminados por AfterAll de cada suite; T07 recrea/limpia esos objetos propios para regresión. T03/T06 limpian sus esquemas propios. No se tocó orquestador ni se desplegó en server02:8787.
- Primera corrida: 268 unitarias aprobadas; integración dirigida inicial de 7 casos aprobada (51.694 s). Se añadieron validación de esquema inicial y retiro concurrente; corrida final de 9 casos T08 y todas las regresiones aprobada. No quedan fallos conocidos ni bloqueos externos de prueba.
- No se necesitaron nuevas migraciones: V1/V2 contienen tabla idempotente, auditoría, permisos y restricciones. No hay proveedores ni mocks de resultados de negocio. JWT real firmado con JWKS local, no emisión real de controlms. Docker no ejecutado; Compose solo servicio con PostgreSQL externo y REQUEST_API_ENABLED=false por defecto. Para habilitar, configurar runtime restringido; independiente de administración.
- Siguiente: T09 PENDING con dependencia DONE. Ninguna tarea principal IN_PROGRESS. Eventos, worker y recorrido integral siguen pendientes; no se anuncian cubiertos por T08.
## E18 — Cierre T09 — 2026-10-27 03:36 (America/Mexico_City)
- Criterios previos: bloquear solicitud autorizada, replay antes de revisión, If-Match/rol/schema/guardia, ejecución PENDING + revisión + EVENT_ACCEPTED atómicos, respuesta 202/Location. Verificar A07–A09 con PostgreSQL real y rollback, sin HTTP de proveedores.
- Archivos: AcceptedEvent/EventPolicy, Events/EventStore, PostgresEventStore/EventConfiguration, EventController, ApiExceptionHandler; EventAcceptanceIT y ampliación DomainArchitectureTest. Contrato OpenAPI, EVENTS.md, ADR-013, ejemplos HTTP y documentación actualizados. No se reemplazó trabajo previo.
- Comando final: `.\mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`, JDK 21.0.12.1 y credenciales MIGRATION_TEST_DB_* solo en entorno de proceso. BUILD SUCCESS, 7:31 min; finalizado 2026-10-27T03:36:50-06:00.
- Resultado: 268 unitarias Surefire + 76 IT Failsafe = 344, cero fallos/errores/omisiones. IT: DatabaseMigrationIT 40, EventAcceptanceIT 10, FlowPublicationIT 11, RequestCreationIT 9, SecurityHttpIT 6. Reportes target/surefire-reports y target/failsafe-reports, particularmente com.organizacion.orchestrator.EventAcceptanceIT.txt.
- A07: reintento devuelve mismo executionId y status actual sin nuevas escrituras, incluso tras cambiar estado/revisión/rol. Acceso actual y sujeto original se comprueban siempre. Nueva instancia del adapter recupera replay desde PostgreSQL; no se anuncia reinicio del proceso. Orden de JSON y escala decimal equivalente no alteran hash; revisión esperada sí lo altera.
- A08: clave repetida con evento/datos/revisión distintos produce 409 IDEMPOTENCY_CONFLICT. Carrera simultánea con payloads distintos produce un 202 y un 409; no duplica ejecución ni revisión.
- A09: dos envíos idénticos simultáneos comparten ejecución; dos claves con igual revisión producen 202/412. PENDING/RUNNING/RETRY_WAIT/RECONCILIATION_REQUIRED impiden nuevo evento con revisión actual (409 REQUEST_BUSY); replay sigue permitido.
- Seguridad/validación: JWT ausente 401, owner/scope ajenos 404, rol ajeno 403, identidad/roles en comando rechazados, campos de proveedor fuera del schema 422. Guardia falsa GUARD_NOT_SATISFIED y valor ausente EVALUATION_ERROR, ambos 422 sin escrituras. If-Match ausente 428, inválido 400, obsoleto 412; payload excesivo 413. AcceptedEvent y Problem comprobados contra schemas.
- Atomicidad: fallos SQL reales inducidos al insertar ejecución, actualizar revisión e insertar auditoría revierten todo; auditoría previa de creación se conserva. Reintento tras fallo de auditoría funciona. Error SQL por HTTP retorna 503 seguro. Estado y data de negocio permanecen intactos al aceptar; accepted_revision es la nueva revisión (If-Match + 1).
- Flujo fijado RETIRED sigue aceptando eventos de instancias previas. Caso con INVOKE_INTEGRATION configurado acepta PENDING sin checkpoints, resultado ni actualización de datos: no existe adapter HTTP de proveedor invocado. Los cambios SQL a estados técnicos usados por pruebas son fixtures explícitos, no un worker implementado.
- Aislamiento: solo orquestador_test. Fixture compartido T07/T08 usa schema t07_b8dc4f7d95774fbc92a43745b161065d y LOGIN t07_runtime_b8dc4f7d95774fbc92a43745b161065d, creados/eliminados por cada suite propia. T03/T06 también limpian sus esquemas. No se tocó orquestador, no hubo despliegue ni uso de datos personales/proveedores.
- Corridas previas: 268 unitarias aprobadas; IT dirigida inicial 8 casos aprobados en 2:09 min. Se añadieron carrera con payload distinto/canonicalización y flujo con integración declarada; corrida final de 10 casos T09 y regresiones aprobada. No quedan fallos conocidos.
- JAR generado: target/orquestador-nmp-0.1.0-SNAPSHOT.jar; SHA256 552B5273EB904EA6ED447BD48B18C98C0E33ED97FFA0353A4CFD2ED5F1609F16. Inspección ZIP confirma ausencia de clases/controladores de prueba. git diff --check aprobado.
- Sin nuevas migraciones; usa V1/V2 y REQUEST_API_ENABLED existente con runtime restringido. ADR-013 documenta replay, accepted_revision y alcance. GET /executions/{id} queda como subtarea explícita T10; Location mantiene contrato objetivo. GET de solicitud ya muestra activeExecutionId, pero sin worker los eventos permanecen PENDING. A07–A09 de efectos externos requieren T10/T11/T16.
- Siguiente: T10 PENDING con dependencia DONE. Ninguna tarea principal IN_PROGRESS. No se inició worker ni procesamiento externo.
## E19 — Cierre T10 — 2026-10-27 08:52 (America/Mexico_City)
- Criterios previos: reclamar con SKIP LOCKED, leases por tiempo DB, fencing en todas las escrituras, checkpoints/reuso y recuperación inicial; dos workers, lease vencido, retorno tardío, rollback final y GET de ejecución autorizado. No confundir executor local con cola durable ni declarar providers implementados.
- Archivos: WorkerState, WorkerStore/WorkerActions, PostgresWorkerStore, WorkerEngine/WorkerLoop/WorkerConfiguration, ExecutionController, PersistenceAccessConfiguration; V3__action_effect_checkpoint.sql, configuración application.yaml/compose/.env.example; WorkerIT y expectativas V3 de DatabaseMigrationIT; WORKER.md, ADR-014, contrato, ejemplos y documentación.
- Suite completa: `.\mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`; BUILD SUCCESS, 5:15 min, finalizado 2026-10-27T08:49:43-06:00. 268 unitarias + 91 IT (WorkerIT 15), cero fallos/errores/omisiones. Migraciones 40, eventos 10, publicación 11, creación 9, seguridad 6 y worker 15.
- Ajuste posterior acotado: fallar controladamente datos finales excesivos y validar tipo de capability; actualización contractual/documental. Se añadieron dos pruebas de worker (límite de datos y checkpoint faltante) y se verificó el código final con `.\mvnw.cmd --batch-mode --no-transfer-progress verify -Pmigration-tests-external '-Dit.test=WorkerIT'`. BUILD SUCCESS, 2:36 min, finalizado 2026-10-27T08:52:38-06:00; 268 unitarias + 17 WorkerIT, sin fallos/errores/omisiones. No se repitieron IT ajenos al ajuste ya aprobados. Evidencia vigente: 361 casos distintos = 268 unitarias + 93 IT; no se presenta como una sola corrida final de 361.
- Entorno: JDK 21.0.12.1 y MIGRATION_TEST_DB_* solo en variables de proceso. Reportes target/surefire-reports y target/failsafe-reports; WorkerIT.txt refleja los 17 casos finales.
- Reclamación: dos stores/owners concurrentes reciben ejecuciones distintas; una fila bloqueada se omite; RETRY_WAIT futuro no se reclama hasta tiempo DB vencido. Renovación no revive lease vencido; recuperación incrementa fencing_token. Token antiguo no puede renovar, cargar, iniciar/guardar checkpoint, fallar ni confirmar.
- Procesamiento: ejecución sin acciones completa estado/datos/revisión/resultado/auditoría; decisión T05 aplica updates y conserva regla aplicada. Resultado del worker viejo que retorna después del nuevo no sobrescribe datos. Finalización rechaza snapshot/revisión obsoletos y checkpoints faltantes. Límites finales producen fallo controlado, no recuperación infinita.
- Checkpoints: caída simulada tras primer éxito conserva ese resultado, reintenta solo la acción incompleta con clave estable e input_hash compatible. Reconstrucción de repositorio/engine recupera desde PostgreSQL. Cambio de hash bloquea reuso. READ_ONLY/IDEMPOTENT_WRITE recuperables; NON_IDEMPOTENT_WRITE incierto no se repite y exige conciliación. Doble de proveedor idempotente registra dos llamadas pero un efecto por clave; esto no acredita un proveedor real.
- Atomicidad: fallo SQL inducido al auditar finalización revierte datos/estado/revisión/resultado finales; checkpoint de acción permanece SUCCEEDED y recuperación no repite llamada. Escritura exitosa seguida de conflicto final conserva solicitud bloqueada para conciliación. Adapter ausente falla explícitamente INTEGRATION_UNAVAILABLE, sin fabricar éxito.
- Scheduler real de prueba: reclama trabajo, renueva dos veces durante acción bloqueada por barrera, finaliza y se detiene; solicitud posterior queda PENDING. Heartbeat cancelado no interrumpe otro trabajo al reutilizar thread. Apagado drena con renovación hasta 20 s y deja trabajo restante para recuperación por lease.
- GET /executions/{id}: Pending/Succeeded/Failed contra schema ExecutionView, owner/scope ajenos 404, sin JWT 401. No se retornan snapshots de identidad, inputs, lease_owner o payload crudo de proveedor. Location T09 ya es consultable.
- Migración V3: persiste clasificación de efecto confiable; V1/V2 intactas, checkpoints previos conservadoramente NON_IDEMPOTENT_WRITE. Tres migraciones aplicadas/validadas e idempotentes; pruebas de permisos/rollback previas aprobadas con V3.
- Aislamiento: exclusivamente orquestador_test, fixtures temporales propios. Suite final WorkerIT: schema t07_b639d9ea7fe94294beead496e8b1d64b y rol t07_runtime_b639d9ea7fe94294beead496e8b1d64b eliminados por AfterAll. Suite completa usó t07_3a45246f4c704a54b855f3c40003427d más schemas propios T03/T06, también limpiados. No se tocó orquestador ni se desplegó.
- Límites explícitos: SimulatedCrash abandona intento y se reconstruye repositorio; no es reinicio de JVM. Adapters/proveedor deduplicador son dobles de test, no registros productivos. T11 implementará adapters reales/mocks HTTP; T12 política completa de errores transitorios/backoff/Retry-After/conciliación. T10 reconoce RETRY_WAIT y recuperación de lease, pero no anuncia retry HTTP completo. Docker y Keycloak reales no ejecutados en esta tarea.
- Defaults: WORKER_ENABLED=false, lease 60 s, renovación 15 s, concurrencia/lote 10, polling 500 ms. Puede correr sin API/admin, exige runtime DB restringido. Flujos sin acciones funcionan; integraciones no registradas fallan, por lo que se mantiene apagado para esos flujos hasta T11.
- Siguiente: T11 PENDING, dependencia DONE. Ninguna tarea principal IN_PROGRESS; no se inició integración de proveedor.
## E20 — Cierre T11 — 2026-10-27 11:40 (America/Mexico_City)
- Criterios previos: registro de handlers confiable, contratos/perfiles fijados, POST HTTP acotado, separación negocio/error, NO_OP solo simulación y referencias documentales verificadas. Pruebas HTTP reales contra mocks loopback y PostgreSQL real; sin proveedores ni despliegue.
- Archivos: HttpRoutes/BoundedHttp/HttpIntegrationHandler/IntegrationConfiguration, RegisteredWorkerActions/RegisterDocumentHandler/NoOpSimulationHandler, PublicationCatalogConfiguration, WorkerConfiguration y PostgresWorkerStore.save; config/integration-routes.json, application.yaml/compose/.env.example; HttpProviderFixture/HttpIntegrationTest/RegisterDocumentTest/HttpIntegrationIT, examples/integrations, INTEGRATIONS.md, WORKER.md, README y ADR-015.
- Prueba dirigida final: `mvnw.cmd --batch-mode --no-transfer-progress verify -Pmigration-tests-external -Dit.test=HttpIntegrationIT -Dtest=HttpIntegrationTest,RegisterDocumentTest`; BUILD SUCCESS, 2:13 min, finalizado 2026-10-27T11:25:47-06:00. 33 tests + 6 IT, cero fallos/errores/omisiones.
- Correcciones durante prueba: el fixture decimal usaba Double y se sustituyó por parser decimal estricto; el JSON documental del fixture se corrigió a inputs.documentId conforme al DSL existente. Las pruebas finales dirigidas pasan; no se alteró el contrato para aceptar el fixture.
- Transporte: JSON duplicado/malformado/schema inválido rechazado; precisión decimal, mappings, headers de perfil/clave estable, bearer desde entorno, secreto ausente sin envío, versiones no fijadas/ajenas sin envío, 404 explícito, 429/5xx, rechazo de redirecciones, límite de memoria y timeout del cuerpo después de headers. Escritura incierta no se transforma en resultado de negocio.
- Negocio: cliente encontrado persiste datos y avanza START→END; cliente no encontrado SUCCEEDED/CLIENTE_NO_ENCONTRADO conserva START; timeout/503/contrato inválido FAILED sin customer ni outcome negativo. DOCUMENTO_VALIDA INVALID es resultado de negocio; BURO_CONSULTA exige score numérico. Son contratos propuestos con datos sintéticos, no integración real aprobada.
- Documentos: valida pertenencia a solicitud/ámbito, identidad, tipo, MIME, tamaño, checksum y scanStatus. Guarda referencia y checkpoint en una transacción con fencing. Trigger SQL inducido revierte ambos; recuperación READ_ONLY repite consulta y completa una única referencia. Servicio documental mock, sin subir/descargar archivos ni ejecutar antivirus local.
- Configuración: wiring Spring del registro comprobado con worker activo y administración apagada; catálogos vacíos predeterminados no autorizan endpoints. Ejemplos cargados por loaders reales; URLs .invalid, sin credenciales. Compose conserva un servicio, montaje config de solo lectura y PostgreSQL externo. No se requieren nuevas migraciones; V1/V2/V3 intactas.
- Alcance: A01/A02 y separación técnica de A03 cubiertos en fixtures; retries/backoff/Retry-After de A03 pendientes T12 y recorrido completo T14/T16. Integración real de clientes/documentos/buró requiere contratos/credenciales; no se contactó proveedor real, Keycloak ni runtime orquestador/server02:8787. Docker no ejecutado.
- Regresión completa final: `mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`, JDK 21.0.12.1; BUILD SUCCESS, 13:54 min, finalizado 2026-10-27T11:40:22-06:00. 301 pruebas Surefire + 99 Failsafe = 400; cero fallos/errores/omisiones. IT: migraciones 40, eventos 10, publicación 11, HTTP T11 6, solicitudes 9, seguridad 6 y worker 17. Reportes en target/surefire-reports y target/failsafe-reports.
- Aislamiento: credenciales MIGRATION_TEST_DB_* solo en entorno de proceso; exclusivamente orquestador_test. Schemas temporales t03/t06/t07 y roles runtime propios limpiados por AfterAll. La regresión usó t03_f14d09faa2f443e5929e85f05eec3e6d y fixture compartido t07_e677f961a04a4e83b6814d6f21c4a72b, recreado/limpiado por cada suite correspondiente. No se modificó la base runtime.
- Artefacto: target/orquestador-nmp-0.1.0-SNAPSHOT.jar, SHA256 2F9CC8EEB70FB7B966276BD98445B94732A9E70EEBB6424A105B18571646F0A0. Inspección ZIP confirma ausencia de mocks/clases de prueba; git diff --check aprobado.
- T11 DONE; siguiente T12 PENDING con dependencia DONE. Ninguna tarea principal IN_PROGRESS. Proveedores reales y despliegue siguen pendientes, no se presentan como pruebas aprobadas.
## E21 — Cierre T12 — 2026-10-27 16:22 (America/Mexico_City)
- Criterios previos: máximo publicado de tres intentos totales por acción; backoff/jitter/Retry-After acotados; RETRY_WAIT durable y atómico; conservar checkpoints y clasificar leases vencidos por efecto; no liberar UNKNOWN; resolve protegido, idempotente, con evidencia y sin elegir destino; fault injection y concurrencia con PostgreSQL real.
- Archivos: ActionResult/RetryDelay, WorkerStore/PostgresWorkerStore/WorkerEngine, HttpIntegrationHandler; Resolutions/ResolutionStore/PostgresResolutionStore/ResolutionConfiguration/ResolutionController y ApiExceptionHandler. Pruebas RetryPolicyTest/RetryReconciliationIT/CrashWorkerProcess y ampliaciones WorkerIT/HttpProviderFixture/HttpIntegrationIT; fixtures SecurityHttpIT/RequestCreationIT. Contrato OpenAPI, RECONCILIATION.md, ejemplos HTTP, README, WORKER/INTEGRATIONS, ADR-016 y seguimiento actualizados.
- Primera corrida dirigida: `mvnw.cmd --batch-mode --no-transfer-progress verify -Pmigration-tests-external -Dit.test=RetryReconciliationIT -Dtest=RetryPolicyTest,HttpIntegrationTest`; BUILD SUCCESS, 1:41 min, finalizado 2026-10-27T16:12:00-06:00. 25 unitarias + 8 IT, cero fallos/errores/omisiones. Se amplió después la cobertura de límites, concurrencia y fronteras de caída; incluida en la regresión final.
- Retry: estado de intento, próxima fecha con reloj DB y RETRY_SCHEDULED comparten transacción; fencing impide reencolar con token obsoleto. READ_ONLY/IDEMPOTENT_WRITE transitorios elegibles; claves/hash se conservan; éxitos previos no se repiten. Agotamiento sin efectos termina FAILED; escrituras inciertas requieren conciliación incluso tras agotar intentos.
- Resolve: requiere administración habilitada, EXECUTION_OPERATOR y ámbito permitido/coincidente; operador puede diferir del propietario. RESUME valida contrato/versiones/efecto y cobertura de acciones pendientes; CLOSE exige ausencia/compensación declarada con evidencia. Rechaza ausencia frente a escritura SUCCEEDED durable. No se inyectan referencias documentales ni estados destino.
- Atomicidad/replay: ledger append-only, checkpoints, cola y auditoría se confirman juntos. Mismo sujeto/comando/clave devuelve respuesta original tras completar; cambios de comando/sujeto confligen. Bloqueo solicitud→ejecución serializa resoluciones; fencing aumenta. La evidencia es declaración verificada por operador, no llamada automatizada al proveedor.
- Caídas: JVM hija exclusiva de prueba termina con Runtime.halt en fronteras anteriores/posteriores al HTTP y con checkpoint previo. El proceso padre reconstruye store/worker usando la DB durable; mock deduplica efecto lógico por clave. No es una prueba de reinicio de contenedor ni idempotencia de un proveedor real.
- Sin migraciones nuevas: V1/V2/V3 ya contienen estados/ledger/permisos. Compose permanece como un único servicio con PostgreSQL externo; flags por defecto sin cambios. Pruebas únicamente en orquestador_test, sin desplegar ni tocar runtime orquestador/server02:8787 ni proveedores reales.
- Regresión final: `mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`, JDK 21.0.12.1 y credenciales MIGRATION_TEST_DB_* solo en el proceso. BUILD SUCCESS, 8:25 min, finalizado 2026-10-27T16:22:45-06:00. 303 unitarias Surefire + 116 IT Failsafe = 419, cero fallos/errores/omisiones. IT: migraciones 40, eventos 10, publicación 11, HTTP T11 6, solicitudes 9, RetryReconciliationIT 17, seguridad 6 y worker 17. Reportes en target/surefire-reports y target/failsafe-reports.
- Evidencia T12: Retry-After 429 real de mock programa 120 s, luego éxito con clave estable; tres fallos READ_ONLY agotan en FAILED sin outcome negativo; escritura idempotente agotada no libera solicitud. Éxitos previos no se repiten. Rollback inducido en auditoría de retry y de resolución conserva checkpoint/cola/ledger anteriores. Replay tras SUCCEEDED conserva respuesta, dos claves concurrentes producen 200/409 y una clave compartida produce una resolución. Datos/estado/revisión de negocio se conservan al cerrar.
- Cinco caídas reales de JVM: READ_ONLY antes de envío; IDEMPOTENT_WRITE después de HTTP y después de un checkpoint previo; NON_IDEMPOTENT_WRITE antes/después de HTTP. Los seguros recuperan; los no seguros exigen conciliación sin repetir llamada. Checkpoint previo conserva attempt_count=1; mock registra un efecto lógico por clave. WorkerIT confirma token obsoleto rechazado también al programar retry y mantiene pruebas de rollback final (A19).
- Aislamiento: esquemas temporales propios y roles LOGIN eliminados por AfterAll. Suite final utilizó t03_fa507cbe77934497a335700d620079c6 y fixture compartido t07_6687499ffd2b4582963ebdaccc2425c8 (recreado/limpiado por suites), además del schema propio T06. No se tocó runtime ni se desplegó; Docker y proveedores reales no ejecutados.
- Artefacto: target/orquestador-nmp-0.1.0-SNAPSHOT.jar, SHA256 7781CC0F17909D712E6FF34B262D2AEF52C34CF65955A2B938A7FF69A91ACC59. ZIP sin CrashWorkerProcess, mocks o clases de prueba. git diff --check aprobado.
- T12 DONE; siguiente T13 PENDING con dependencias DONE. Ninguna tarea principal IN_PROGRESS. A03 y A12–A14/A19 cubiertos localmente con los límites de proveedor mock indicados; T16 repetirá la matriz integral.
## E22 — Cierre T13 — 2026-10-27 16:50 (America/Mexico_City)
- Alcance confirmado con usuario: backend exclusivamente, sin desarrollar una interfaz gráfica. Criterios previos: consulta autorizada de eventos/schema/ui y bloqueos, versión fijada/retirada, guardias sin datos inventados, documentos ajenos sin vincular, INVALID conserva tarea/motivo, fallo técnico no produce INVALID y payload con resultados de proveedor rechazado (A11/A20).
- Archivos: AvailableEvents/View/Policy/AvailabilitySnapshot/AvailabilityStore/PostgresAvailabilityStore/AvailableEventsController y RequestConfiguration; document/domain/DocumentMetadata, RegisterDocumentHandler, WorkerEngine. AvailableEventPolicyTest/AvailableEventsIT/DocumentTasksIT, catálogo documental de ejemplo, OpenAPI, AVAILABLE_EVENTS.md, ejemplos HTTP, README, ADR-017 y seguimiento.
- Verificación dirigida final: `mvnw.cmd --batch-mode --no-transfer-progress verify -Pmigration-tests-external -Dit.test=AvailableEventsIT,DocumentTasksIT -Dtest=AvailableEventPolicyTest,RegisterDocumentTest,DomainArchitectureTest`; BUILD SUCCESS, 2:46 min, finalizado 2026-10-27T16:40:04-06:00. 16 unitarias + 20 IT (8 disponibilidad y 12 documentos), cero fallos/errores/omisiones. Después se añadió el caso de referencia ya vinculada a otra solicitud; incluido en regresión completa.
- Correcciones de fixtures: publicación rechazó el flujo documental inicial. Se separó documentId de entrada de registeredDocumentId verificado y se declararon tipos string explícitos en enums status/scanStatus del catálogo de ejemplo para el análisis estático. No se relajaron las reglas de datos protegidos ni cambiaron valores aceptados del contrato. Un test puro comprueba la validez del fixture.
- Disponibilidad: usa una sentencia SQL para revisión/estado/definición fijada/ejecución activa coherentes; una escritura no confirmada no mezcla versiones de esos datos. Conserva ui anterior tras activar v2 y retirar v1. Filtra propietario/ámbito/roles; FLOW_ADMIN no accede a recurso ajeno. FORM y DOCUMENT_UPLOAD se ajustan al schema público. Los cuatro estados activos devuelven events vacío y blockedByExecutionId.
- Guardias: falso/error conocidos se proyectan como códigos genéricos; cualquier dependencia de event.data se difiere al POST. Prueba HTTP demuestra que un evento anunciado se rechaza con agree=false y se acepta con agree=true. No-store, sin ETag en esta ruta porque la disponibilidad puede cambiar sin revisión nueva; revision sigue disponible para If-Match.
- Documentos: verificador puro centraliza pertenencia/tipo/MIME/tamaño/checksum/CLEAN. Worker añade límites más restrictivos de la tarea publicada antes de insertar referencia y al reutilizar checkpoint; tamaño 1001 frente a tarea 1000 y MIME PNG permitido por catálogo pero no por tarea se rechazan. Conserva transacción/fencing de referencia+checkpoint T11.
- Negocio: recorrido real API/worker/HTTP mock/SQL INVALID deja SUCCEEDED/DOCUMENTO_INVALIDO con razón EXPIRED en datos y tarea visible; nuevo evento VALID avanza y oculta tarea sin duplicar referencia. Error 503 reintenta sin repetir metadata exitosa, bloquea tareas durante RETRY_WAIT y al agotar queda FAILED sin fabricar INVALID. Payloads con score/validation/MIME/scanStatus/identidad no crean ejecución.
- Límites: no se reciben archivos, no se calcula MIME/checksum desde bytes ni se ejecuta antivirus; se verifica el dictamen del servicio documental confiable. Solo mocks de prueba y datos sintéticos. Sin nuevas migraciones, despliegue o cambios al Compose de un servicio con PostgreSQL externo. No se toca runtime orquestador/server02:8787.
- Regresión completa final: `mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`, JDK 21.0.12.1; BUILD SUCCESS, 9:53 min, finalizado 2026-10-27T16:50:46-06:00. 308 unitarias Surefire + 137 IT Failsafe = 445; cero fallos/errores/omisiones. IT: disponibilidad 8, migraciones 40, documentos 13, eventos 10, publicación 11, HTTP 6, solicitudes 9, retries/conciliación 17, seguridad 6 y worker 17. Reportes en target/surefire-reports y target/failsafe-reports.
- Caso adicional aprobado: una referencia ya vinculada a solicitud A no se reasigna a B aunque el mock entregue metadatos contradictorios; la referencia original permanece, B no obtiene vínculo, su checkpoint falla y no se invoca el validador posterior.
- Aislamiento: solo orquestador_test; credenciales MIGRATION_TEST_DB_* en entorno de proceso. Fixtures temporales t07_f89ebc09f5764cc397a280dff4436f93 (recreado/limpiado por suites), t03_0ba9b05d7ca24ad6839dd222fb795062 y schema propio T06; roles/schemas propios limpiados por AfterAll. Sin despliegue, Docker ni proveedor/antivirus real.
- Artefacto target/orquestador-nmp-0.1.0-SNAPSHOT.jar: SHA256 FD5B3A7718745754910BBB9A81C2338F0CEF7A4577590C5A2334C9DCFDB0AA8E. ZIP sin mocks, suites ni proceso de caída de prueba. git diff --check aprobado.
- T13 DONE; siguiente T14 PENDING con dependencias DONE. Ninguna tarea principal IN_PROGRESS. A11/A20 cubiertos con servicio documental mock; integración real pendiente de contrato/configuración.
## E23 — Cierre T14 — 2026-10-28 (America/Mexico_City)
- Criterios: tres JSON completos publicables, recorridos persistentes por API/worker/SQL,
crédito v1/v2 coexistente (A10), licencia por configuración (A18), compra y fronteras
71/70/61/60. Solo backend, proveedores HTTP simulados y datos sintéticos.
- Archivos: examples/flows/*.json y README/seed; examples/integrations/catalog y rutas;
examples/http/demo-flows.http; DemoFlowTest/DemoFlowsIT; README y ADR-018.
- Validación inicial: DemoFlowTest, 3 casos aprobados (2026-10-27 23:51).
- Primera integración: 9 de 10 casos aprobados; la comprobación SQL usaba el nombre
flow_version_id en vez de flow_id. Corregido exclusivamente en test.
- Segunda integración: 8 de 10 casos aprobados; segunda licencia usaba otro UUID con
el mismo storageDocumentId sintético, infringiendo unicidad. Corregido el fixture
para identificar cada documento. Un caso quedó RETRY_WAIT; se amplió el plazo HTTP
del fixture demo de conexión 100 ms/respuesta 2 s a 1 s/5 s. Producción sin cambios.
- Hash agregado de src/main antes/después: 203974E7294C38BE32A19B44C51A6EDD371081B76A355A6688F59DDF32143B49.
Igualdad verificada: no cambios Java, recursos o migraciones de producción en T14.
- Pendiente resultado de verificación final: todas las unitarias + DemoFlowsIT,
DocumentTasksIT y HttpIntegrationIT. Se conserva E22 como regresión completa base;
no se atribuirá esa corrida anterior a T14.
- Alcance pendiente independiente: /admin/flows/{id}/simulate no implementado; revisar
en T16 antes de entrega T17 (ADR-018). La demo actual usa API operativa con mocks.
- DemoFlowsIT final: 10/10 aprobados, 166.8 s. Publicación/activación HTTP de los tres
archivos exactos; ambos créditos terminan después de activar v2, con flow_id distinto.
Rechaza buró prematuro en v2, conserva EXPIRED/LICENCIA_PENDIENTE y permite reemplazo
válido. Compra confirma/cancela sin invocar documentos/buró. Score ausente/textual
termina FAILED y conserva BURO_PENDIENTE; no produce REVISION_MANUAL.
- Surefire final: 311/311 aprobados. JAR sin suites/mocks/proceso de caída; SHA256
FD5B3A7718745754910BBB9A81C2338F0CEF7A4577590C5A2334C9DCFDB0AA8E,
idéntico al artefacto T13. Pendiente únicamente finalizar regresión documental/HTTP.
- Verificación final completada: `mvnw.cmd --batch-mode --no-transfer-progress verify -Pmigration-tests-external -Dit.test=DemoFlowsIT,DocumentTasksIT,HttpIntegrationIT`.
BUILD SUCCESS, 5:53 min, finalizado 2026-10-28T01:14:02-06:00. 311 unitarias +
29 IT = 340, cero fallos/errores/omisiones. IT: demo 10, documentos 13, HTTP 6.
Esta corrida sustituye los resultados fallidos de desarrollo descritos arriba.
No se repitieron las demás IT de E22: src/main y JAR permanecieron idénticos;
se verificó la regresión de consumidores del catálogo de ejemplo modificado.
- Reportes: target/surefire-reports, target/failsafe-reports y target/t14-final.log.
JDK 21 local. Solo orquestador_test; schema temporal t07_41df5db3c155418d99cbe30611c405aa
y rol propio limpiados por AfterAll (fixture recreado por suite). Credenciales
exclusivamente en entorno de proceso; no se tocó runtime ni se desplegó Docker.
- T14 DONE. T15 PENDING con dependencias DONE; ninguna tarea principal IN_PROGRESS.
Los pendientes históricos de los párrafos anteriores quedan resueltos por esta
corrida, salvo proveedores reales y endpoint simulate explícitamente indicados.
## E24 — Cierre T15 — 2026-10-28 (America/Mexico_City)
- Criterios previos: historial paginado/filtrado con ACL por recurso, auditoría
atómica, métricas sin cardinalidad por solicitud, logs sin PII, readiness/liveness
y apagado del worker. Única tarea principal IN_PROGRESS. Sin despliegue.
- Implementación: audit/api/HistoryController e infrastructure/HistoryStore;
QueueMetrics/ObservabilityConfiguration, CommandObservationFilter; seguridad de
Actuator; timers HTTP, logs/códigos/razones del worker y presupuesto de drenaje.
OBSERVABILITY.md, ADR-019, OpenAPI, ejemplo HTTP, README/RUNBOOK/SECURITY y env/Compose.
- Primera dirigida: `mvnw.cmd --batch-mode --no-transfer-progress verify -Pmigration-tests-external -Dtest=ObservabilityTest,DomainArchitectureTest,HttpIntegrationTest -Dit.test=ObservabilityIT`.
BUILD SUCCESS, 1:54 min, finalizado 2026-10-28T01:47:22-06:00; 27 unitarias y
15 IT, cero fallos/errores/omisiones. Apagado: latches prueban renovación durante
drenaje, interrupción por presupuesto y ausencia de nuevas reclamaciones.
Historial: empates de timestamp, filtros, binding de cursor, ACL, redacción y
triggers append-only; gauges SQL/DB-time y acceso a Actuator. Pool propio cerrado
como fallo controlado: readiness 503/liveness 200. No es caída de DB productiva.
- Se añadió después captura de logs con cliente y score centinela, y comprobación
durable de reasonCodes en DocumentTasksIT. Están incluidas en regresión final.
- Regresión completa en curso: `mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`.
314 unitarias ya aprobadas; IT pendientes de terminar. No marcar DONE hasta
resultado final. Usa exclusivamente orquestador_test y esquemas/roles temporales;
secretos solo en entorno del proceso. Proveedores HTTP mock y datos sintéticos.
- Regresión completa: ObservabilityIT 16/16 aprobados, incluida captura de logs;
DocumentTasksIT 13/13 aprueba reasonCodes en auditoría, y DemoFlowsIT 10/10.
- Revisión final detectó binding ambiguo entre kind omitido y literal "null".
Se distingue ausencia con cadena vacía (inválida como kind) y se agrega aserción
HTTP específica. La corrida completa ya había compilado la versión previa;
al terminar se ejecutará nuevamente el caso de cursor y tests de operación/
arquitectura contra el código final. No se atribuye ese ajuste a la corrida base.
- Regresión completa terminada: BUILD SUCCESS, 12:45 min, finalizado
2026-10-28T02:01:05-06:00. Surefire 314 + Failsafe 163 = 477; cero
fallos/errores/omisiones. IT: disponibilidad 8, migraciones 40, demo 10,
documentos 13, eventos 10, publicación 11, HTTP 6, observabilidad 16,
solicitudes 9, reintentos/conciliación 17, seguridad 6 y worker 17.
- WorkerIT conserva 17 casos aprobados: fallo inducido de inserción auditada hace
rollback de estado/revisión; recuperación reutiliza checkpoint exitoso, reglas
y actualización se confirman junto con auditoría, renovación y fencing vigentes.
- Reportes de la corrida completa conservados en target/t15-full-reports.zip antes
del check final dirigido del cursor. Log completo t15-final.log (ignorado por git).
- Check del código final: `mvnw.cmd --batch-mode --no-transfer-progress verify -Pmigration-tests-external -Dtest=ObservabilityTest,DomainArchitectureTest -Dit.test=ObservabilityIT#historyAuthorizationAndCursorBindingNeverExposeForeignResource`.
BUILD SUCCESS, 59.678 s, finalizado 2026-10-28T02:02:47-06:00; 4 unitarias +
1 IT, sin fallos/errores/omisiones. Cursor con kind omitido vs literal null
ya no comparte binding; también rechaza otro filtro y otra solicitud, y aplica ACL.
- Evidencia final: target/t15-cursor-final.log y reportes actuales; corrida completa
preservada en target/t15-full-reports.zip y t15-final.log. JAR final
target/orquestador-nmp-0.1.0-SNAPSHOT.jar SHA256
B71C97EB0D16504069B326088F270F9546E4DD7379B876C4F05AF412B148370E.
ZIP sin suites/mocks/proceso de caída. git diff --check aprobado.
- Sin nuevas migraciones; historial/razones conservan transacción de negocio y
permisos append-only. Runtime orquestador/server02:8787 y proveedores reales
no usados. Compose sigue con un servicio y PostgreSQL externo; no se desplegó.
- T15 DONE. Los pendientes de verificación descritos arriba quedan resueltos por
las corridas finales. T16 PENDING con dependencias DONE, ninguna tarea IN_PROGRESS.
T16 conserva el pendiente explícito de simulate de ADR-018; Docker/integraciones
reales y política organizacional de retención no se declaran verificados aquí.
## E25 — T16: implementación verificada, cierre bloqueado por Docker — 2026-10-28 (America/Mexico_City)
- Criterios: matriz A01–A20 ejecutada sin skips, reinicios/concurrencia/rollback/ACL,
reportes conservados y CI reproducible con Docker; cerrar /simulate pendiente.
Única tarea principal IN_PROGRESS. T17 no iniciado, sin despliegue.
- Implementación: FlowSimulation/SimulationController; TransitionEvaluator extraído
mecánicamente de WorkerEngine para compartir proyección pura. Contrato y fixtures
administrativos, sin HTTP ni escrituras. NO_OP solo en simulación. Runtime sigue
con contratos fijados, idempotencia, checkpoints, leases y auditoría existentes.
- Pruebas nuevas: FlowSimulationTest (12 casos), SimulationIT (2), DemoFlowsIT
agrega API cliente 503 con agotamiento y replay antes/después de ejecutar con
una llamada al proveedor; cliente ausente comprueba outcome explícito.
- Matriz ejecutable specs/acceptance-cases.json y scripts/verify_acceptance.py.
Rechaza métodos ausentes, fallos/errores/skips; distingue external-postgresql de
testcontainers según XML real. 2 tests Python del checker aprobados. CI exige
docker info, clean verify y gate A01–A20; artefactos por 30 días. Maven falla si
no encuentra tests. No se afirma ejecución del workflow remoto.
- Verificación dirigida: `mvnw.cmd --batch-mode --no-transfer-progress verify -Pmigration-tests-external -Dtest=FlowSimulationTest,DomainArchitectureTest -Dit.test=SimulationIT`.
BUILD SUCCESS, 1:00 min, finalizado 2026-10-28T06:27:09-06:00. 13 unitarias +
2 IT, cero fallos/errores/omisiones. El test de referencia externa se alineó al
rechazo estructural previo del DSL, sin relajar el filtro ni resolver la URL.
- Docker: Get-Command docker no encuentra ejecutable; no servicio Docker ni archivo
en instalación estándar; DOCKER_HOST/TLS/CERT_PATH/HOST_OVERRIDE sin configurar.
Se solicitó motor autorizado al usuario. Pendiente prueba directa Testcontainers.
- Regresión completa en curso con JDK 21 y perfil migration-tests-external,
exclusivamente orquestador_test. Hasta ahora 326 unitarias, 40 migraciones y
12 recorridos demo aprobados. Proveedores/JWKS mock; secretos solo en proceso.
- Archivos operativos: SIMULATION.md, ACCEPTANCE.md, ADR-020, README, OpenAPI,
examples/http/simulate.http, .github/workflows/ci.yaml, pom.xml y seguimiento.
- Regresión completa externa: `mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external`.
BUILD SUCCESS, 18:22 min, finalizado 2026-10-28T06:48:10-06:00. 326 unitarias +
167 IT = 493; cero fallos/errores/omisiones. IT: disponibilidad 8, migraciones 40,
demo 12, documentos 13, eventos 10, publicación 11, HTTP 6, observabilidad 16,
solicitudes 9, retry/conciliación 17, seguridad 6, simulación 2 y worker 17.
- `python scripts/verify_acceptance.py`: passed=true, environment=external-postgresql,
todos los métodos/parametrizaciones de A01–A20 ejecutados y aprobados. Dos tests
Python del checker también aprobados; incluye rechazo de un skip no mapeado.
- Puerta Docker con esos mismos reportes: `python scripts/verify_acceptance.py --require-testcontainers --output target/acceptance-docker-gate.json` devuelve passed=false
por entorno externo. Es el resultado esperado: no atribuir evidencia Testcontainers
a esta corrida. Reportes completos conservados ANTES de la prueba Docker en
target/t16-external-reports.zip; JSON target/acceptance-report.json y log t16-final.log.
- JAR comprobado: SHA256 FA50938E56D5ACCDE505E2FEEB4F76F1F9011BA01B90895084101350C9D16DAC.
Prueba directa de detección de Docker en curso con perfil predeterminado.
- Prueba Docker directa: `mvnw.cmd --batch-mode --no-transfer-progress verify -Dtest=FlowSimulationTest -Dit.test=SimulationIT` (sin perfil externo).
BUILD FAILURE, 9.795 s, finalizado 2026-10-28T06:49:37-06:00. Falla setup de
SimulationIT con `Could not find a valid Docker environment`; 1 error de entorno,
sin skips. No inicia PostgreSQL ni invoca runtime externo. La suite externa
anterior conserva su evidencia aprobada en ZIP/JSON. Los reportes XML actuales
contienen la prueba negativa de Docker y no deben confundirse con aquel archivo.
- Bloqueo externo confirmado, no defecto funcional ni prueba Docker aprobada.
T16 BLOCKED. No se marca DONE ni se inicia T17. Para cerrar: motor Docker local
o remoto autorizado; `mvnw.cmd --batch-mode --no-transfer-progress clean verify`
y `python scripts/verify_acceptance.py --require-testcontainers`, sin skips.
- Sin migraciones nuevas, cambios al Compose de un servicio, despliegue productivo
o llamadas a proveedores reales. Conservadas auditoría/idempotencia/versiones;
extracción del evaluador respaldada por regresión completa. git diff --check OK.
## E26 — Corrección del contexto de build Docker — 2026-10-28
- Reporte del usuario: `docker compose build` falla con 20 errores unitarios por archivos ausentes en `examples/flows`, `examples/integrations` y `config`.
- Causa: Dockerfile solo copiaba ejemplos contractuales y .dockerignore excluía los demás recursos. Se agregaron las dos carpetas de ejemplos y los archivos explícitos `config/publication-catalog.json` y `config/integration-routes.json` a ambos archivos. Se mantienen las pruebas en package y la imagen final solo recibe el JAR.
- Verificación: copia aislada de las entradas COPY del build, más mvnw.cmd para Windows, en `target/docker-build-check-20261028113047`. Desde allí: `mvnw.cmd --batch-mode --no-transfer-progress package`, JDK 21.
- Resultado: BUILD SUCCESS, 326 pruebas, 0 fallos, 0 errores, 0 omitidas; 44.508 s, finalizado 2026-10-28T11:31:39-06:00. Log: `target/docker-build-check-20261028113047/build-check.log`; reportes en su `target/surefire-reports`. Evidencia E25 preservada.
- Límite: esta corrida verifica package con las entradas de construcción aisladas en Windows; no sustituye docker build en Linux ni las pruebas de integración Testcontainers. Docker sigue sin estar disponible en este equipo. T16 permanece BLOCKED para su cierre integral; T17 PENDING.
- Siguiente paso: repetir `docker compose build orquestador` en el equipo con Docker; para cerrar T16 ejecutar desde la raíz `./mvnw --batch-mode --no-transfer-progress clean verify` y `python3 scripts/verify_acceptance.py --require-testcontainers` con motor accesible.
## E27 — Red Docker solicitada — 2026-10-28
- Compose conecta el servicio orquestador a la red externa existente `microsipNet`, con nombre explícito para evitar prefijo de proyecto.
- Verificación: parseo YAML con PyYAML y comprobaciones de asociación del servicio, nombre y external=true; aprobado. `git diff --check` aprobado.
- No se ejecutó despliegue ni docker compose config: motor Docker no disponible localmente. La red debe existir en el host de despliegue. T16 conserva su bloqueo de verificación integral.
## E28 — Colección Postman solicitada — 2026-10-28
- Archivos: examples/postman/Orquestador-NMP.postman_collection.json y README.md.
- 24 solicitudes con baseUrl http://server02:8787: salud, rechazo sin token, borrador/validación, cuatro simulaciones de scoring, publicación/activación, solicitudes/idempotencia, eventos/replay/consulta, historial y métricas. Tokens vacíos, captura de IDs/revisiones y claves nuevas por operación.
- Verificación local: parseo JSON, 24 solicitudes, cuerpos JSON y flujo embebido idéntico a credito-v1.json; sintaxis JavaScript de scripts comprobada con Node. No se enviaron peticiones ni se ejecutó importación en Postman; autenticación real requiere token y configuración del usuario. No cierra T16.
## E29 — Servicio de proveedores mock configurable — 2026-10-29
- Solicitud: configurar manualmente las respuestas de servicios de consulta. Entregado demo/providers-mock (servidor Java 21, Dockerfile, arranque TLS, rutas, README, colección Postman de 20 peticiones y pruebas) y compose.mock.yaml opcional. ADR-021 registra alcance/alternativas. Compose base y configuración original sin cambios.
- PUT administrativo por endpoint modifica status, delayMs y cuerpo literal; token requerido, tamaño acotado y persistencia atómica. GET informa configuración y contador. Consulta cliente, buró, validación y metadatos documentales con respuestas sintéticas. Certificados separados de respuestas, validación HTTPS conservada y healthcheck Java previo al arranque del orquestador.
- Comando: con JAVA_HOME=.tools/jdk21/jdk-21.0.12.1+1, `python demo/providers-mock/test_mock.py`. Corrida final: 4 tests, 70.248 s, OK. Servidor HTTPS real en loopback, certificado temporal confiado: autorización/404/405/límites, encontrado/no encontrado, 503/demora, reinicio/persistencia, healthcheck JVM, metadatos configurables, scoring 71/70/61/60, INVALID y cuerpo malformado. Primera corrida de 3 tests también aprobada; ampliada para cubrir healthcheck Java y metadatos.
- Checks adicionales: parseo YAML con PyYAML; seis rutas conservan contratos/perfiles/presupuestos del ejemplo cambiando solo URL/tokenEnvironment; JSON de 20 peticiones y cuerpos válido; scripts Postman compilados con Node; git diff --check aprobado. No se ejecutó importación gráfica en Postman.
- Docker sigue sin ejecutable disponible aquí. No se construyó imagen ni se ejecutó Compose, importación de certificados en el contenedor, recorrido remoto ni proveedor real. No se tocaron PostgreSQL ni server02. T16 conserva BLOCKED; T17 no se declara cerrado. Siguiente: usuario configura token/puerto, levanta mock con override, importa CA/colección y aplica override al orquestador de demo según README.
## E30 — POC sin certificados — 2026-10-29
- Sustituye TLS del mock descrito en E29 por petición explícita. MockServer y healthcheck HTTP; Dockerfile sin keytool/entrypoint de certificados. Compose opcional conserva solo mock-data y activa demo-mock. Rutas y Postman usan http://providers-mock:8788 y http://server02:8788. README actualizado para recreación y uso sin CA.
- HttpRoutes/IntegrationConfiguration habilitan HTTP de providers-mock:8788 solo bajo demo-mock. Constructores/cargadores previos conservan denegación; HTTPS y excepción loopback local/test sin cambios. ADR-022.
- `mvnw.cmd --batch-mode --no-transfer-progress test -Dtest=HttpIntegrationTest`: BUILD SUCCESS, 24 pruebas, cero fallos/errores/omisiones, 40.400 s (17:56:56 -06:00). Incluye rechazo del host mock sin habilitación, aceptación explícita y rechazo de otros hosts/puertos. Log target/mock-http-maven.log.
- `python demo/providers-mock/test_mock.py` con JDK 21: 4 tests OK en 64.015 s; HTTP real, healthcheck Java, configuración, persistencia, errores/demora y metadatos. Parseo de Compose, rutas y colección Postman aprobado; sin mounts de certificados ni JAVA_TOOL_OPTIONS en override. git diff --check aprobado.
- No se ejecutó Docker ni despliegue en server02. T16 sigue BLOCKED, T17 PENDING. Aplicar `docker compose -f compose.yaml -f compose.mock.yaml up -d --build` y reimportar colección del mock; la reconstrucción del orquestador es necesaria para la nueva excepción explícita.
## E31 — Autenticación de POC sin Keycloak — 2026-10-30
- Pedido explícito: token fijo similar al mock en lugar de integrar Keycloak. Perfil demo-token con DemoTokenDecoder, identidad/roles server-side y comparación de hashes en tiempo constante. Token incorrecto devuelve 401; configuración inválida falla al arrancar. Se mantienen ACL, flags, idempotencia y rol DB restringido. Sin perfil, Nimbus RS256 sigue siendo el decoder. ADR-023 y POC_AUTH.md.
- Compose opcional activa demo-token y reutiliza MOCK_ADMIN_TOKEN salvo ORCHESTRATOR_DEMO_TOKEN explícito. Subject poc-user y ámbito demo por defecto. Compose base permite interpolar JWT vacío para la POC, pero el arranque normal exige issuer/JWKS/audiencia. Colección Postman mantiene Bearer/accessToken, sin secretos guardados.
- Verificación dirigida: `mvnw.cmd --batch-mode --no-transfer-progress test -Dtest=DemoTokenSecurityTest,DemoTokenHttpTest,SecurityPolicyTest`: BUILD SUCCESS, 12 pruebas, cero fallos/errores/omisiones, 21.190 s. HTTP real sin DB/JWKS: autenticación, identidad no falsificable, propiedad/ámbito y rechazo del secreto en modo normal. El primer intento coincidió con reubicación del controlador de test; corregido al completar su aislamiento del escaneo productivo y repetir.
- Verificación final: `mvnw.cmd --batch-mode --no-transfer-progress verify -Pmigration-tests-external -Dit.test=DemoTokenIT,SecurityHttpIT`, JDK 21, exclusivamente orquestador_test con schemas/roles temporales. BUILD SUCCESS, 1:40 min, finalizado 2026-10-30T02:52:49-06:00. 332 unitarias + 7 IT = 339 aprobadas, sin fallos/errores/omisiones. Regresión JWT normal (6 IT) y POC con JWKS detenido (1 IT): crear/publicar/activar flujo, crear/repetir solicitud, identidad persistida, aceptar/repetir evento e historial. No ejecuta worker el nuevo IT.
- Evidencia: target/demo-token-tests.log, target/demo-token-verify.log y reportes Surefire/Failsafe. JAR SHA256 7B0BA4D26106248D762F1C4462D416DC5E3BDEAC509DFDD45039D40D117F57F0. JAR incluye perfil y excluye clases de prueba. YAML, Postman sin secretos y git diff --check aprobados.
- No hubo despliegue ni cambios sobre orquestador/server02:8787. Docker/Compose real y suite integral Testcontainers siguen pendientes: T16 BLOCKED, T17 PENDING. Aplicar reconstrucción con ambos Compose y poner token fijo en accessToken, dejando tokens específicos vacíos.