refactor: 각 어댑터터별 리펙토링 진행

This commit is contained in:
DongHyeonka
2026-08-24 18:26:40 +09:00
parent e98b56eb03
commit 0137263441
439 changed files with 31935 additions and 4719 deletions
@@ -0,0 +1,70 @@
# ADR-GQL-001 — GraphQL context stays inbound; object authorization moves to application-core; the persisted-operation store stays an inbound SPI
- Status: Accepted
- Date: 2026-08-24
- Review: `docs/reviews/2026-08-14-graphql-module-code-review.md` GQL-026
## Context
The GraphQL leaf's own documentation described three things crossing its boundary: a
`GraphQlRequestContext` with a deadline propagated into application, JPA, Mongo and the HTTP client;
object authorization decided inside the transport; and a persisted-operation registry implemented by
an external durable store.
Two of those invert the dependency direction. If `application-core` or an outbound adapter
implements a type that lives in `adapter:inbound:graphql`, the registry edge that says inbound
depends on application is satisfied while the real compile-time dependency runs the other way.
The third is a business rule in the wrong layer: whether an actor may see an object is a decision
about the domain, and GraphQL is one of four transports this skeleton ships.
## Decision
Three different answers, because the three problems are not the same problem.
**GraphQL context stays inbound-local.** It is mapped explicitly onto application command fields —
actor, tenant, deadline — rather than travelling as a type. Nothing outside the leaf references
`GraphQlRequestContext`, and the boundary test is that grep returns nothing outside it.
**Object authorization moves to `application-core`.** `ObjectAccessPolicy`, `ObjectAccessRequest`
and `ObjectAccessDecision` are transport-neutral and live with the other application policies;
`ApplicationObjectAuthorization` in the GraphQL leaf is the bridge that calls them. This is the one
of the three that was a real layering defect, and it is fixed rather than documented.
**The persisted-operation store stays an inbound-owned SPI.** `GraphQlPersistedOperationRegistry`
remains in `advanced/persisted`, and no leaf outside GraphQL implements it.
## Consequences
The third decision is the one that needs defending, because it leaves the reported risk in place
rather than removing it.
The risk is conditional: the direction inverts only when something outside the leaf implements the
interface. Nothing does. The template ships an in-memory registry and no durable one, because it
ships no persisted-operation store at all.
The alternative was to introduce a generic operational key-value store port owned by a neutral
contract holder, with the GraphQL adapter owning only the key and value mapping. That port would
have exactly one interface, zero implementations and one speculative consumer — a new abstraction
whose shape is guessed from a requirement nobody has stated. This repository has spent a full
remediation pass deleting controls that existed and were reached by nothing, and inventing a port
for a store that does not exist is how the next one of those gets written.
So the decision is to leave the SPI where it is and to move it when a durable store is actually
built. Moving it then is a rename across one leaf and one new adapter, which is cheaper than
carrying a wrong abstraction until then. What must not happen in the meantime is an outbound leaf
implementing the inbound interface, because that is the moment the direction actually inverts, and
it would happen in a commit whose diff looks like an implementation rather than a layering change.
The composition root wires these and owns no business or storage policy of its own.
## Enforcement
`verifyCleanArchitectureDependencies` and `modules.json` hold the leaf's edges to
`domain-core`, `application-core` and `shared-contract`. `ObjectAccessPolicyTest` covers the
application-side policy and `ApplicationObjectAuthorizationTest` the bridge.
The condition this ADR turns on — that nothing outside the GraphQL leaf implements the
persisted-operation SPI — is a claim about the whole repository, so it is checked at the
composition root rather than inside the leaf, next to the other GraphQL boundary rules in
`app-bootstrap`'s architecture suite.
@@ -0,0 +1,67 @@
# ADR-JPA-006 — `audit` is the canonical technical audit model; `auditing` stays a frozen candidate
- Status: Accepted
- Date: 2026-08-24
- Review: `docs/reviews/2026-08-14-jpa-module-code-review.md` JPA-022
## Context
Two complete technical-audit mechanisms live in this leaf and they disagree about the schema.
`audit/AuditableEntity` stamps `created_at`/`created_by`/`updated_at`/`updated_by` with an actor
column of length 256, captured through explicit `initializeAudit`/`applyModification` calls and an
`AuditContextPort`. `auditing/AuditMetadata` is a Spring Data embeddable that stamps
`created_*`/`modified_*` with an actor column of length 64, captured by `@CreatedDate` and friends
through an `AuditorAware`.
Only the first is real: it is what the sample entities extend and what the migrations were written
for. `JpaAuditingConfiguration` is not a Spring `@Configuration`, and nothing in production
constructs any of the three `auditing` types.
The review asked for one canonical model with a migration or activation decision. The failure mode
it was protecting against is specific: an author of a new entity picks whichever package they find
first, and column names, actor lengths and capture lifecycles then diverge per table.
## Decision
`audit/AuditableEntity` is canonical. `auditing` stays in the tree as a candidate and is excluded
from the Stable capability report.
The candidate is not deleted and not promoted. Deleting it would discard a working Spring Data
integration that a deployment preferring declarative auditing would want. Promoting it would mean
either renaming `modified_*` to `updated_*` and widening the actor column — a schema migration of
every audited table to gain nothing a caller asked for — or moving the sample entities onto
`modified_*`, which is the same migration in the other direction.
Neither is worth doing now. What the divergence actually needed was not consolidation but a rule
that an entity cannot straddle the two, and that rule is cheaper than either migration.
## Consequences
Two audit mechanisms remain readable in one leaf, and a reader has to be told which one is live.
That cost is paid in this document, in the package javadoc and in a test whose name says so.
Two failure modes stay silent unless they are asserted, so both are:
- The candidate acquires a stereotype and starts stamping in every deployment that has this module
on the classpath, including the ones whose tables have no `modified_*` columns — where the result
is a failed startup rather than a feature.
- Somebody "harmonises" the two by editing one side's column names, at which point the schema a
deployed table was migrated for and the schema its entity expects diverge with no migration
between them.
If the candidate is ever promoted, it is promoted atomically: forward migration, sample conversion,
`AuditContextPort → AuditorAware` and `Clock → DateTimeProvider` bridges land together, and this
ADR is superseded rather than amended.
Bulk and native updates stamp nothing under either mechanism. That is a property of JPA, not of the
choice made here, so it is enforced separately rather than assumed away.
## Enforcement
`JpaAuditMechanismRule.entitiesUseExactlyOneAuditMechanism` and
`bulkUpdatesOfAuditedEntitiesStampAudit`, run against the real production graph by
`JpaProductionArchitectureTest` at the composition root — not against fixtures, which is how the
earlier version of this rule pack passed while applying to nothing. `AuditingCandidateStatusTest`
asserts the candidate carries no composing stereotype and that the two column sets stay distinct.
`JpaAuditMechanismRuleTest` exercises the rules' own negative cases.
+4 -1
View File
@@ -5,7 +5,7 @@
# split into capability artifacts.
# Update only after review with:
# ./gradlew :adapter:inbound:graphql:updateGraphQlApiSurface -PapproveGraphQlApiSurfaceChange
# types: 395
# types: 398
dev.caskeleton.adapter.inbound.graphql.HealthGraphqlController
dev.caskeleton.adapter.inbound.graphql.advanced.admin.GraphQlAdminPrincipal
dev.caskeleton.adapter.inbound.graphql.advanced.admin.GraphQlPersistedOperationAdminAuthorization
@@ -179,6 +179,7 @@ dev.caskeleton.adapter.inbound.graphql.compat.GraphQlSchemaUsage
dev.caskeleton.adapter.inbound.graphql.context.ActorRef
dev.caskeleton.adapter.inbound.graphql.context.GraphQlCommandAttribution
dev.caskeleton.adapter.inbound.graphql.context.GraphQlDeadline
dev.caskeleton.adapter.inbound.graphql.context.GraphQlIdentityFingerprinter
dev.caskeleton.adapter.inbound.graphql.context.GraphQlRequestContext
dev.caskeleton.adapter.inbound.graphql.context.TenantContext
dev.caskeleton.adapter.inbound.graphql.cost.GraphQlComplexityCalculator
@@ -358,6 +359,7 @@ dev.caskeleton.adapter.inbound.graphql.runtime.GraphQlPlatformRejectionMapper
dev.caskeleton.adapter.inbound.graphql.runtime.GraphQlPlatformWebInterceptor
dev.caskeleton.adapter.inbound.graphql.runtime.GraphQlPreparsedDocumentAdapter
dev.caskeleton.adapter.inbound.graphql.runtime.GraphQlPrincipalResolver
dev.caskeleton.adapter.inbound.graphql.runtime.GraphQlRequestObservationConventionAdapter
dev.caskeleton.adapter.inbound.graphql.runtime.GraphQlWireErrorMapper
dev.caskeleton.adapter.inbound.graphql.runtime.GraphQlWireErrors
dev.caskeleton.adapter.inbound.graphql.runtime.servlet.GraphQlRequestBodyLimitFilter
@@ -387,6 +389,7 @@ dev.caskeleton.adapter.inbound.graphql.schema.GraphQlSchemaHash
dev.caskeleton.adapter.inbound.graphql.schema.GraphQlSchemaMappingException
dev.caskeleton.adapter.inbound.graphql.schema.GraphQlSchemaOwnership
dev.caskeleton.adapter.inbound.graphql.schema.GraphQlSchemaResource
dev.caskeleton.adapter.inbound.graphql.security.ApplicationObjectAuthorization
dev.caskeleton.adapter.inbound.graphql.security.GraphQlAuthenticatedPrincipal
dev.caskeleton.adapter.inbound.graphql.security.GraphQlAuthenticationContextFactory
dev.caskeleton.adapter.inbound.graphql.security.GraphQlAuthenticationException
+340
View File
@@ -0,0 +1,340 @@
# JPA persistence leaf public API surface — every public top-level type in src/main/java.
# A public type in a single-jar leaf is reachable from every adopter's code, so
# additions are reviewed rather than discovered. `api` is the intended external
# surface; the rest is implementation that has not been moved under an internal
# root yet.
# Update only after review with:
# ./gradlew :adapter:outbound:persistence-jpa:updateJpaApiSurface -PapproveJpaApiSurfaceChange
# types: 332
dev.caskeleton.adapter.outbound.persistence.api.PersistenceOperationName
dev.caskeleton.adapter.outbound.persistence.api.capability.CapabilitySupport
dev.caskeleton.adapter.outbound.persistence.api.capability.JpaCapability
dev.caskeleton.adapter.outbound.persistence.api.capability.SupportLevel
dev.caskeleton.adapter.outbound.persistence.api.error.CheckConstraintViolationException
dev.caskeleton.adapter.outbound.persistence.api.error.ConnectionUnavailableException
dev.caskeleton.adapter.outbound.persistence.api.error.ConstraintCode
dev.caskeleton.adapter.outbound.persistence.api.error.ConstraintViolationDetails
dev.caskeleton.adapter.outbound.persistence.api.error.DataCorruptionException
dev.caskeleton.adapter.outbound.persistence.api.error.DeadlockDetectedException
dev.caskeleton.adapter.outbound.persistence.api.error.FailureCategory
dev.caskeleton.adapter.outbound.persistence.api.error.ForeignKeyViolationException
dev.caskeleton.adapter.outbound.persistence.api.error.JpaEntityNotFoundException
dev.caskeleton.adapter.outbound.persistence.api.error.JpaFailureContext
dev.caskeleton.adapter.outbound.persistence.api.error.JpaPersistenceException
dev.caskeleton.adapter.outbound.persistence.api.error.NotNullConstraintViolationException
dev.caskeleton.adapter.outbound.persistence.api.error.OptimisticConflictException
dev.caskeleton.adapter.outbound.persistence.api.error.PessimisticLockTimeoutException
dev.caskeleton.adapter.outbound.persistence.api.error.QueryTimeoutException
dev.caskeleton.adapter.outbound.persistence.api.error.SchemaMismatchException
dev.caskeleton.adapter.outbound.persistence.api.error.SerializationFailureException
dev.caskeleton.adapter.outbound.persistence.api.error.SqlExceptionSqlStateResolver
dev.caskeleton.adapter.outbound.persistence.api.error.SqlStateResolver
dev.caskeleton.adapter.outbound.persistence.api.error.TransactionCompletionUnknownException
dev.caskeleton.adapter.outbound.persistence.api.error.TransactionTimeoutException
dev.caskeleton.adapter.outbound.persistence.api.error.UniqueConstraintViolationException
dev.caskeleton.adapter.outbound.persistence.api.error.VendorFailureTranslator
dev.caskeleton.adapter.outbound.persistence.api.query.CursorCodec
dev.caskeleton.adapter.outbound.persistence.api.query.CursorPayloadCodec
dev.caskeleton.adapter.outbound.persistence.api.query.KeysetPageRequest
dev.caskeleton.adapter.outbound.persistence.api.query.KeysetSlice
dev.caskeleton.adapter.outbound.persistence.api.query.NoopQueryObservation
dev.caskeleton.adapter.outbound.persistence.api.query.QueryName
dev.caskeleton.adapter.outbound.persistence.api.query.QueryObservation
dev.caskeleton.adapter.outbound.persistence.api.query.QueryScope
dev.caskeleton.adapter.outbound.persistence.api.query.SignedJsonCursorCodec
dev.caskeleton.adapter.outbound.persistence.api.query.SortDirection
dev.caskeleton.adapter.outbound.persistence.api.transaction.IsolationLevel
dev.caskeleton.adapter.outbound.persistence.api.transaction.JitterMode
dev.caskeleton.adapter.outbound.persistence.api.transaction.JpaRetryPolicy
dev.caskeleton.adapter.outbound.persistence.api.transaction.JpaTransactionExecutor
dev.caskeleton.adapter.outbound.persistence.api.transaction.PropagationMode
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryDecision
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryDisposition
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryEventListener
dev.caskeleton.adapter.outbound.persistence.api.transaction.RetryProfile
dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionAttempt
dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionCompletionEvidence
dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionProfile
dev.caskeleton.adapter.outbound.persistence.audit.AuditContextPort
dev.caskeleton.adapter.outbound.persistence.audit.AuditableEntity
dev.caskeleton.adapter.outbound.persistence.audit.DomainContextAuditContextPort
dev.caskeleton.adapter.outbound.persistence.auditing.AuditMetadata
dev.caskeleton.adapter.outbound.persistence.auditing.JpaAuditingConfiguration
dev.caskeleton.adapter.outbound.persistence.auditing.JpaAuditorProvider
dev.caskeleton.adapter.outbound.persistence.cache.CacheConcurrencyStrategy
dev.caskeleton.adapter.outbound.persistence.cache.CacheRegionCatalog
dev.caskeleton.adapter.outbound.persistence.cache.HibernateCacheGuard
dev.caskeleton.adapter.outbound.persistence.cache.HibernateCachePolicy
dev.caskeleton.adapter.outbound.persistence.cache.HibernateCacheSettings
dev.caskeleton.adapter.outbound.persistence.config.JpaAdapterComponentsConfig
dev.caskeleton.adapter.outbound.persistence.config.PersistenceJpaConfig
dev.caskeleton.adapter.outbound.persistence.config.PersistenceVendorSettings
dev.caskeleton.adapter.outbound.persistence.envers.EntityRevision
dev.caskeleton.adapter.outbound.persistence.envers.EnversConfigurationGuard
dev.caskeleton.adapter.outbound.persistence.envers.EnversHistoryPolicy
dev.caskeleton.adapter.outbound.persistence.envers.EnversHistoryReader
dev.caskeleton.adapter.outbound.persistence.envers.EnversRevisionMetadata
dev.caskeleton.adapter.outbound.persistence.envers.HibernateEnversHistoryReader
dev.caskeleton.adapter.outbound.persistence.experimental.ExperimentalFeature
dev.caskeleton.adapter.outbound.persistence.experimental.ExperimentalFeatureGate
dev.caskeleton.adapter.outbound.persistence.experimental.database.TenantDataSourceLifecycle
dev.caskeleton.adapter.outbound.persistence.experimental.database.TenantDataSourceRegistry
dev.caskeleton.adapter.outbound.persistence.experimental.database.TenantEntityManagerFactoryRegistry
dev.caskeleton.adapter.outbound.persistence.experimental.database.TenantPoolBudget
dev.caskeleton.adapter.outbound.persistence.experimental.next.CompatibilityLane
dev.caskeleton.adapter.outbound.persistence.experimental.next.ExperimentalPromotionGate
dev.caskeleton.adapter.outbound.persistence.experimental.next.HibernateCompatibilityPolicy
dev.caskeleton.adapter.outbound.persistence.experimental.next.PromotionDecision
dev.caskeleton.adapter.outbound.persistence.experimental.next.PromotionEvidence
dev.caskeleton.adapter.outbound.persistence.experimental.replica.ConsistencyAwareDataSourceRouter
dev.caskeleton.adapter.outbound.persistence.experimental.replica.ConsistencyToken
dev.caskeleton.adapter.outbound.persistence.experimental.replica.ReadConsistency
dev.caskeleton.adapter.outbound.persistence.experimental.replica.ReplicaLagMonitor
dev.caskeleton.adapter.outbound.persistence.experimental.replica.ReplicaRoutingDecision
dev.caskeleton.adapter.outbound.persistence.experimental.replica.ReplicaTarget
dev.caskeleton.adapter.outbound.persistence.experimental.replica.TransactionContext
dev.caskeleton.adapter.outbound.persistence.experimental.rls.RlsAdminBypassToken
dev.caskeleton.adapter.outbound.persistence.experimental.rls.RlsPolicyVerifier
dev.caskeleton.adapter.outbound.persistence.experimental.rls.RlsTenantSessionBinder
dev.caskeleton.adapter.outbound.persistence.experimental.schema.SchemaMultiTenantConnectionProvider
dev.caskeleton.adapter.outbound.persistence.experimental.schema.SchemaTenantMigrationOrchestrator
dev.caskeleton.adapter.outbound.persistence.experimental.schema.SchemaTenantRegistry
dev.caskeleton.adapter.outbound.persistence.experimental.schema.TenantMigrationStatus
dev.caskeleton.adapter.outbound.persistence.experimental.tenant.TenantAwareRepositoryGuard
dev.caskeleton.adapter.outbound.persistence.experimental.tenant.TenantContext
dev.caskeleton.adapter.outbound.persistence.experimental.tenant.TenantEntityListenerGuard
dev.caskeleton.adapter.outbound.persistence.experimental.tenant.TenantId
dev.caskeleton.adapter.outbound.persistence.failure.PersistenceExceptionTranslator
dev.caskeleton.adapter.outbound.persistence.failure.SqlStateErrorMapping
dev.caskeleton.adapter.outbound.persistence.failure.StandardSqlStateErrorMapping
dev.caskeleton.adapter.outbound.persistence.fileserver.FileserverJpaPersistenceConfig
dev.caskeleton.adapter.outbound.persistence.fileserver.FileserverSchemaActivation
dev.caskeleton.adapter.outbound.persistence.fileserver.JpaCleanupQueue
dev.caskeleton.adapter.outbound.persistence.fileserver.JpaContentReferenceLedger
dev.caskeleton.adapter.outbound.persistence.fileserver.JpaFileMetadataStore
dev.caskeleton.adapter.outbound.persistence.fileserver.JpaFileQuotaService
dev.caskeleton.adapter.outbound.persistence.fileserver.JpaQuotaCommitGateway
dev.caskeleton.adapter.outbound.persistence.fileserver.JpaQuotaReclaimGateway
dev.caskeleton.adapter.outbound.persistence.fileserver.JpaRecoveryQueue
dev.caskeleton.adapter.outbound.persistence.fileserver.JpaStagingUploadLocator
dev.caskeleton.adapter.outbound.persistence.fileserver.JpaUploadSessionStore
dev.caskeleton.adapter.outbound.persistence.fileserver.entity.CleanupItemEntity
dev.caskeleton.adapter.outbound.persistence.fileserver.entity.FileEntity
dev.caskeleton.adapter.outbound.persistence.fileserver.entity.QuotaReservationEntity
dev.caskeleton.adapter.outbound.persistence.fileserver.entity.RecoveryItemEntity
dev.caskeleton.adapter.outbound.persistence.fileserver.entity.UploadSessionEntity
dev.caskeleton.adapter.outbound.persistence.fileserver.entity.VerificationResultEntity
dev.caskeleton.adapter.outbound.persistence.fileserver.repository.FileTransitionRepository
dev.caskeleton.adapter.outbound.persistence.fileserver.repository.FileserverCleanupRepository
dev.caskeleton.adapter.outbound.persistence.fileserver.repository.FileserverQuotaRepository
dev.caskeleton.adapter.outbound.persistence.fileserver.repository.FileserverRecoveryRepository
dev.caskeleton.adapter.outbound.persistence.fileserver.repository.JpaFileRepository
dev.caskeleton.adapter.outbound.persistence.fileserver.repository.JpaUploadSessionRepository
dev.caskeleton.adapter.outbound.persistence.fileserver.repository.UploadLeaseRepository
dev.caskeleton.adapter.outbound.persistence.h2.H2IdempotencyClaimRepository
dev.caskeleton.adapter.outbound.persistence.h2.H2LocalTimeoutConfigurer
dev.caskeleton.adapter.outbound.persistence.h2.H2OutboxClaimRepository
dev.caskeleton.adapter.outbound.persistence.h2.H2PersistenceConfig
dev.caskeleton.adapter.outbound.persistence.h2.H2SqlStateErrorMapping
dev.caskeleton.adapter.outbound.persistence.hibernate.HibernateProviderPolicy
dev.caskeleton.adapter.outbound.persistence.hibernate.HibernateStatisticsCollector
dev.caskeleton.adapter.outbound.persistence.hibernate.HibernateStatisticsSnapshot
dev.caskeleton.adapter.outbound.persistence.hibernate.JdbcBatchCounter
dev.caskeleton.adapter.outbound.persistence.hibernate.NamedStatementInspector
dev.caskeleton.adapter.outbound.persistence.hibernate.QueryNameContext
dev.caskeleton.adapter.outbound.persistence.hibernate.batch.BatchExecutionResult
dev.caskeleton.adapter.outbound.persistence.hibernate.batch.HibernateBatchConfigurationGuard
dev.caskeleton.adapter.outbound.persistence.hibernate.batch.HibernateJpaBatchExecutor
dev.caskeleton.adapter.outbound.persistence.hibernate.batch.JpaBatchExecutor
dev.caskeleton.adapter.outbound.persistence.hibernate.batch.JpaBatchProfile
dev.caskeleton.adapter.outbound.persistence.hibernate.batch.JpaBatchProfileRegistry
dev.caskeleton.adapter.outbound.persistence.hibernate.bulk.AffectedRowsExpectation
dev.caskeleton.adapter.outbound.persistence.hibernate.bulk.BulkDmlExecutor
dev.caskeleton.adapter.outbound.persistence.hibernate.bulk.BulkDmlResult
dev.caskeleton.adapter.outbound.persistence.hibernate.bulk.BulkOperationName
dev.caskeleton.adapter.outbound.persistence.hibernate.bulk.HibernateBulkDmlExecutor
dev.caskeleton.adapter.outbound.persistence.hibernate.stateless.HibernateStatelessSessionRunner
dev.caskeleton.adapter.outbound.persistence.hibernate.stateless.StatelessRowCapExceededException
dev.caskeleton.adapter.outbound.persistence.hibernate.stateless.StatelessSessionRunner
dev.caskeleton.adapter.outbound.persistence.hibernate.stateless.StatelessWorkName
dev.caskeleton.adapter.outbound.persistence.hibernate.stateless.StatelessWorkResult
dev.caskeleton.adapter.outbound.persistence.idempotency.IdempotencyClaimRepository
dev.caskeleton.adapter.outbound.persistence.idempotency.IdempotencyReaper
dev.caskeleton.adapter.outbound.persistence.idempotency.IdempotencyRecordJpaRepository
dev.caskeleton.adapter.outbound.persistence.idempotency.IdempotencyResponseObjectStore
dev.caskeleton.adapter.outbound.persistence.idempotency.IdempotencyStoreAdapter
dev.caskeleton.adapter.outbound.persistence.idempotency.entity.IdempotencyRecordEntity
dev.caskeleton.adapter.outbound.persistence.idempotency.mapper.IdempotencyRecordEntityMapper
dev.caskeleton.adapter.outbound.persistence.lock.DistributedLockPersistenceConfig
dev.caskeleton.adapter.outbound.persistence.lock.LockRegistryDistributedLockAdapter
dev.caskeleton.adapter.outbound.persistence.lock.LockSettings
dev.caskeleton.adapter.outbound.persistence.migration.ConcurrentIndexMigrationInspector
dev.caskeleton.adapter.outbound.persistence.migration.FailedConcurrentIndexRecovery
dev.caskeleton.adapter.outbound.persistence.migration.FlywaySchemaPolicy
dev.caskeleton.adapter.outbound.persistence.migration.FlywayValidationGate
dev.caskeleton.adapter.outbound.persistence.migration.MigrationResource
dev.caskeleton.adapter.outbound.persistence.migration.NonTransactionalMigrationPolicy
dev.caskeleton.adapter.outbound.persistence.migration.SchemaManagementMode
dev.caskeleton.adapter.outbound.persistence.migration.SchemaVersionSnapshot
dev.caskeleton.adapter.outbound.persistence.notification.NotificationJpaPersistenceConfig
dev.caskeleton.adapter.outbound.persistence.notification.NotificationSchemaActivation
dev.caskeleton.adapter.outbound.persistence.notification.NotificationSchemaStream
dev.caskeleton.adapter.outbound.persistence.notification.configuration.NotificationJpaPersistenceFacade
dev.caskeleton.adapter.outbound.persistence.notification.crypto.DirectAeadNotificationPayloadCrypto
dev.caskeleton.adapter.outbound.persistence.notification.crypto.NotificationCiphertext
dev.caskeleton.adapter.outbound.persistence.notification.crypto.NotificationCryptoException
dev.caskeleton.adapter.outbound.persistence.notification.crypto.NotificationHmacDigester
dev.caskeleton.adapter.outbound.persistence.notification.crypto.NotificationKeyMaterialHandle
dev.caskeleton.adapter.outbound.persistence.notification.crypto.NotificationKeyMaterialProvider
dev.caskeleton.adapter.outbound.persistence.notification.platform.AdminAuditEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.AdminAuditJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.ConsentEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.ConsentJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.ContactPointEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.ContactPointJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.DeduplicationClaimEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.DeduplicationClaimJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.DeliveryAttemptEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.DeliveryAttemptJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.JdbcNotificationServingState
dev.caskeleton.adapter.outbound.persistence.notification.platform.JdbcReconciliationJobStore
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaAdminOperationStore
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaContactPointStore
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaDeliveryAttemptStore
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaNotificationRequestStore
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaNotificationSideEffectStore
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaPolicyStores
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaProviderEventLedger
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaRecipientDeliveryStore
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaRecipientLeaseStore
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaSuppressionStore
dev.caskeleton.adapter.outbound.persistence.notification.platform.JpaTemplateRegistry
dev.caskeleton.adapter.outbound.persistence.notification.platform.NotificationRecordMapper
dev.caskeleton.adapter.outbound.persistence.notification.platform.NotificationRequestEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.NotificationRequestJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.PreferenceEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.PreferenceJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.ProviderEventEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.ProviderEventJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.RecipientClaimSql
dev.caskeleton.adapter.outbound.persistence.notification.platform.RecipientDeliveryEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.RecipientDeliveryJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.SuppressionEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.SuppressionJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.TemplateVersionEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.TemplateVersionJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.TenantBoundRepositoryGuard
dev.caskeleton.adapter.outbound.persistence.notification.platform.inbox.InboxCommitEventPublisher
dev.caskeleton.adapter.outbound.persistence.notification.platform.inbox.InboxItemEntity
dev.caskeleton.adapter.outbound.persistence.notification.platform.inbox.InboxItemJpaRepository
dev.caskeleton.adapter.outbound.persistence.notification.platform.inbox.InboxOutboxRecordFactory
dev.caskeleton.adapter.outbound.persistence.notification.platform.inbox.JpaNotificationInbox
dev.caskeleton.adapter.outbound.persistence.observation.JpaMetricTags
dev.caskeleton.adapter.outbound.persistence.observation.JpaRetryObservation
dev.caskeleton.adapter.outbound.persistence.observation.JpaTransactionObservation
dev.caskeleton.adapter.outbound.persistence.observation.LowCardinality
dev.caskeleton.adapter.outbound.persistence.observation.MicrometerQueryObservation
dev.caskeleton.adapter.outbound.persistence.observation.SqlDiagnosticRedactor
dev.caskeleton.adapter.outbound.persistence.outbox.OutboxClaimRepository
dev.caskeleton.adapter.outbound.persistence.outbox.OutboxEventJpaRepository
dev.caskeleton.adapter.outbound.persistence.outbox.OutboxReaper
dev.caskeleton.adapter.outbound.persistence.outbox.OutboxStoreAdapter
dev.caskeleton.adapter.outbound.persistence.outbox.entity.OutboxEventEntity
dev.caskeleton.adapter.outbound.persistence.postgresql.PostgreSqlIdempotencyClaimRepository
dev.caskeleton.adapter.outbound.persistence.postgresql.PostgreSqlLocalTimeoutConfigurer
dev.caskeleton.adapter.outbound.persistence.postgresql.PostgreSqlOutboxClaimRepository
dev.caskeleton.adapter.outbound.persistence.postgresql.PostgreSqlPersistenceConfig
dev.caskeleton.adapter.outbound.persistence.postgresql.PostgreSqlSqlStateErrorMapping
dev.caskeleton.adapter.outbound.persistence.postgresql.array.PostgreSqlArraySupport
dev.caskeleton.adapter.outbound.persistence.postgresql.constraint.PostgreSqlConstraintCatalog
dev.caskeleton.adapter.outbound.persistence.postgresql.constraint.PostgreSqlConstraintViolationTranslator
dev.caskeleton.adapter.outbound.persistence.postgresql.copy.BoundedCopyInputStream
dev.caskeleton.adapter.outbound.persistence.postgresql.copy.CopyAdminCapability
dev.caskeleton.adapter.outbound.persistence.postgresql.copy.CopyFormat
dev.caskeleton.adapter.outbound.persistence.postgresql.copy.CopyLimits
dev.caskeleton.adapter.outbound.persistence.postgresql.copy.CopyOperationName
dev.caskeleton.adapter.outbound.persistence.postgresql.copy.CopyResult
dev.caskeleton.adapter.outbound.persistence.postgresql.copy.PostgreSqlCopyLoader
dev.caskeleton.adapter.outbound.persistence.postgresql.copy.RegisteredCopyStatement
dev.caskeleton.adapter.outbound.persistence.postgresql.copy.RegisteredPostgreSqlCopyLoader
dev.caskeleton.adapter.outbound.persistence.postgresql.error.ConstraintCatalog
dev.caskeleton.adapter.outbound.persistence.postgresql.error.PostgreSqlExceptionTranslator
dev.caskeleton.adapter.outbound.persistence.postgresql.error.PostgreSqlFailureClassifier
dev.caskeleton.adapter.outbound.persistence.postgresql.error.PostgreSqlServerErrorFields
dev.caskeleton.adapter.outbound.persistence.postgresql.error.PostgreSqlState
dev.caskeleton.adapter.outbound.persistence.postgresql.idempotency.PostgreSqlOwnerSafeIdempotencyStore
dev.caskeleton.adapter.outbound.persistence.postgresql.inbox.PostgreSqlSameStoreInboxAdapter
dev.caskeleton.adapter.outbound.persistence.postgresql.json.JsonDocument
dev.caskeleton.adapter.outbound.persistence.postgresql.json.JsonDocumentCodec
dev.caskeleton.adapter.outbound.persistence.postgresql.json.JsonPathName
dev.caskeleton.adapter.outbound.persistence.postgresql.json.PostgreSqlJsonQuerySupport
dev.caskeleton.adapter.outbound.persistence.postgresql.lock.LockWaitObservation
dev.caskeleton.adapter.outbound.persistence.postgresql.lock.PostgreSqlLockExceptionTranslator
dev.caskeleton.adapter.outbound.persistence.postgresql.lock.PostgreSqlLockOptions
dev.caskeleton.adapter.outbound.persistence.postgresql.lock.PostgreSqlWorkClaimExecutor
dev.caskeleton.adapter.outbound.persistence.postgresql.lock.WorkClaim
dev.caskeleton.adapter.outbound.persistence.postgresql.lock.WorkClaimExecutor
dev.caskeleton.adapter.outbound.persistence.postgresql.lock.WorkQueueDefinition
dev.caskeleton.adapter.outbound.persistence.postgresql.lock.WorkQueueName
dev.caskeleton.adapter.outbound.persistence.postgresql.outbox.PostgreSqlImmutableOutboxAppendAdapter
dev.caskeleton.adapter.outbound.persistence.postgresql.outbox.PostgreSqlPollingDeliveryAdapter
dev.caskeleton.adapter.outbound.persistence.postgresql.range.PgRange
dev.caskeleton.adapter.outbound.persistence.postgresql.range.PgRangeCodec
dev.caskeleton.adapter.outbound.persistence.postgresql.range.PgRangeJdbcType
dev.caskeleton.adapter.outbound.persistence.postgresql.range.PostgreSqlRangeQuerySupport
dev.caskeleton.adapter.outbound.persistence.postgresql.write.NativeWriteName
dev.caskeleton.adapter.outbound.persistence.postgresql.write.PostgreSqlUpsertExecutor
dev.caskeleton.adapter.outbound.persistence.postgresql.write.RegisteredPostgreSqlUpsertExecutor
dev.caskeleton.adapter.outbound.persistence.postgresql.write.RegisteredUpsertStatement
dev.caskeleton.adapter.outbound.persistence.postgresql.write.UpsertConflictTarget
dev.caskeleton.adapter.outbound.persistence.postgresql.write.UpsertResult
dev.caskeleton.adapter.outbound.persistence.postgresql.write.WriteDisposition
dev.caskeleton.adapter.outbound.persistence.querydsl.PredicatePolicy
dev.caskeleton.adapter.outbound.persistence.querydsl.QueryPage
dev.caskeleton.adapter.outbound.persistence.querydsl.QuerydslJpaSupport
dev.caskeleton.adapter.outbound.persistence.security.DatabasePrivilegeReport
dev.caskeleton.adapter.outbound.persistence.security.DatabaseRolePolicy
dev.caskeleton.adapter.outbound.persistence.security.PostgreSqlRuntimeRoleVerifier
dev.caskeleton.adapter.outbound.persistence.security.SearchPathPolicy
dev.caskeleton.adapter.outbound.persistence.springdata.EntityGraphCatalog
dev.caskeleton.adapter.outbound.persistence.springdata.EntityManagerAccess
dev.caskeleton.adapter.outbound.persistence.springdata.FetchPlanApplier
dev.caskeleton.adapter.outbound.persistence.springdata.FetchPlanName
dev.caskeleton.adapter.outbound.persistence.springdata.JpaKeysetQuerySupport
dev.caskeleton.adapter.outbound.persistence.springdata.JpaRepositoryFragmentSupport
dev.caskeleton.adapter.outbound.persistence.springdata.JpaStreamExecutor
dev.caskeleton.adapter.outbound.persistence.springdata.JpaStreamScope
dev.caskeleton.adapter.outbound.persistence.springdata.KeysetPredicateBuilder
dev.caskeleton.adapter.outbound.persistence.springdata.KeysetSliceAssembler
dev.caskeleton.adapter.outbound.persistence.springdata.KeysetTerm
dev.caskeleton.adapter.outbound.persistence.springdata.RegisteredQuery
dev.caskeleton.adapter.outbound.persistence.springdata.SafeSortField
dev.caskeleton.adapter.outbound.persistence.springdata.SafeSortMapper
dev.caskeleton.adapter.outbound.persistence.springdata.SafeSortRegistry
dev.caskeleton.adapter.outbound.persistence.springdata.ScrollPolicy
dev.caskeleton.adapter.outbound.persistence.springdata.SpecificationPolicy
dev.caskeleton.adapter.outbound.persistence.transaction.BackoffCalculator
dev.caskeleton.adapter.outbound.persistence.transaction.CommitFailureClassifier
dev.caskeleton.adapter.outbound.persistence.transaction.CompletionUnknownRecord
dev.caskeleton.adapter.outbound.persistence.transaction.CompletionUnknownRecorder
dev.caskeleton.adapter.outbound.persistence.transaction.DefaultJpaRetryPolicy
dev.caskeleton.adapter.outbound.persistence.transaction.EffectiveTransactionTimeouts
dev.caskeleton.adapter.outbound.persistence.transaction.EvidenceAwareJpaTransactionManager
dev.caskeleton.adapter.outbound.persistence.transaction.FullTransactionRetryCoordinator
dev.caskeleton.adapter.outbound.persistence.transaction.JpaTransactionConfig
dev.caskeleton.adapter.outbound.persistence.transaction.JpaTransactionSettings
dev.caskeleton.adapter.outbound.persistence.transaction.OptimisticConflictTranslator
dev.caskeleton.adapter.outbound.persistence.transaction.PersistenceFailureTranslatorChain
dev.caskeleton.adapter.outbound.persistence.transaction.RetryBudget
dev.caskeleton.adapter.outbound.persistence.transaction.RetrySleeper
dev.caskeleton.adapter.outbound.persistence.transaction.SpringJpaTransactionExecutor
dev.caskeleton.adapter.outbound.persistence.transaction.SpringTransactionPort
dev.caskeleton.adapter.outbound.persistence.transaction.ThreadRetrySleeper
dev.caskeleton.adapter.outbound.persistence.transaction.TransactionDefinitionMapper
dev.caskeleton.adapter.outbound.persistence.transaction.TransactionEvidenceContext
dev.caskeleton.adapter.outbound.persistence.transaction.TransactionEvidenceFrame
dev.caskeleton.adapter.outbound.persistence.transaction.TransactionEvidenceScope
dev.caskeleton.adapter.outbound.persistence.transaction.TransactionLocalTimeoutConfigurer
dev.caskeleton.adapter.outbound.persistence.transaction.TransactionProfileRegistry
dev.caskeleton.adapter.outbound.persistence.transaction.TransactionStartBudget
dev.caskeleton.adapter.outbound.persistence.transaction.UnknownOperation
+6 -3
View File
@@ -5,7 +5,7 @@
# root yet.
# Update only after review with:
# ./gradlew :adapter:outbound:persistence-mongo:updateMongoApiSurface -PapproveMongoApiSurfaceChange
# types: 343
# types: 346
dev.caskeleton.adapter.outbound.mongo.MongoOptInAutoConfigurationImportFilter
dev.caskeleton.adapter.outbound.mongo.MongoPersistenceConfig
dev.caskeleton.adapter.outbound.mongo.MongoPersistenceSettings
@@ -146,8 +146,6 @@ dev.caskeleton.adapter.outbound.mongo.autoconfigure.MongoPlatformAutoConfigurati
dev.caskeleton.adapter.outbound.mongo.autoconfigure.MongoPlatformHealthIndicator
dev.caskeleton.adapter.outbound.mongo.autoconfigure.MongoPlatformSettings
dev.caskeleton.adapter.outbound.mongo.autoconfigure.MongoProfileProperties
dev.caskeleton.adapter.outbound.mongo.autoconfigure.MongoStableReleaseEvidence
dev.caskeleton.adapter.outbound.mongo.autoconfigure.MongoStableReleaseGate
dev.caskeleton.adapter.outbound.mongo.autoconfigure.MongoStartupValidator
dev.caskeleton.adapter.outbound.mongo.autoconfigure.MongoTopologyProbe
dev.caskeleton.adapter.outbound.mongo.changestream.MongoChangeEventIdentity
@@ -158,6 +156,10 @@ dev.caskeleton.adapter.outbound.mongo.changestream.MongoClusterTime
dev.caskeleton.adapter.outbound.mongo.changestream.MongoResumeCheckpoint
dev.caskeleton.adapter.outbound.mongo.changestream.MongoResumeCheckpointStore
dev.caskeleton.adapter.outbound.mongo.changestream.MongoResumePosition
dev.caskeleton.adapter.outbound.mongo.changestream.MongoResumeTokenCodec
dev.caskeleton.adapter.outbound.mongo.changestream.consumer.MongoChangeStreamSource
dev.caskeleton.adapter.outbound.mongo.changestream.consumer.ReactiveMongoChangeStreamConsumer
dev.caskeleton.adapter.outbound.mongo.changestream.consumer.SpringReactiveChangeStreamSource
dev.caskeleton.adapter.outbound.mongo.changestream.projector.MongoChangeClaim
dev.caskeleton.adapter.outbound.mongo.changestream.projector.MongoChangeDeduplicationStore
dev.caskeleton.adapter.outbound.mongo.changestream.projector.MongoChangeProjectionResult
@@ -199,6 +201,7 @@ dev.caskeleton.adapter.outbound.mongo.imperative.atomic.AtomicUpdateResult
dev.caskeleton.adapter.outbound.mongo.imperative.atomic.MongoAtomicOperations
dev.caskeleton.adapter.outbound.mongo.imperative.atomic.MongoAtomicOperationsTemplate
dev.caskeleton.adapter.outbound.mongo.imperative.atomic.MongoAtomicPolicy
dev.caskeleton.adapter.outbound.mongo.imperative.atomic.MongoAtomicPolicyRegistry
dev.caskeleton.adapter.outbound.mongo.imperative.atomic.MongoUpdateOperator
dev.caskeleton.adapter.outbound.mongo.imperative.atomic.ReturnDocumentMode
dev.caskeleton.adapter.outbound.mongo.imperative.bulk.MongoBulkExecutor
+1 -1
View File
@@ -85,7 +85,7 @@ in a fail-closed contract (`verifyJpaReadinessRegistry` in `src/build.gradle`).
|---|---|
| `test` | `src/test` — hermetic unit lane, `./gradlew :adapter:outbound:persistence-jpa:test` |
| `contractTest`, `integrationTest`, `migrationTest`, `failureTest`, `compatibilityTest` | `src/postgresqlIntegrationTest` — real PostgreSQL containers; selected by the `jpaPlatform*` Gradle tasks |
| `performanceTest` | `src/jpaPlatformPerformanceTest`machine-dependent bounds, never part of `check` |
| `performanceTest` | `src/jpaPlatformPerformanceTest`pool and `REQUIRES_NEW` connection behaviour, run by `jpaPlatformPoolContractTest`; never part of `check`. The source set keeps the plan's name; the lane asserts behaviour rather than measuring, and no numeric performance bound is claimed anywhere from it. |
Docker-dependent lanes fail closed rather than skipping, matching the existing
`PostgreSqlReadinessSupport.assertDockerAvailable()` convention in this leaf.
+37 -1
View File
@@ -10,6 +10,20 @@ major changed nothing so long as the string survived somewhere in the document.
declares a support level per major as a field, each gate names the Gradle task that produces its
evidence, and this document describes what the registry says.
Being a rendering used to be a claim rather than a mechanism: the tables below were still typed by
hand, so a major demoted in the registry stayed Stable here and kept its full release job.
`JpaReleaseRenderingTest` now compares the database table, the gate table and `jpa-release.yml`'s
matrix and promotion lists to the registry, and `verifyJpaReleaseGateTasks` resolves every gate's
task against the real Gradle task graph. Edit the registry; these tables follow, or the build fails.
Two renderings stayed outside that comparison until they were added to it. `jpa-nightly.yml` runs
its own matrix and nothing checked it, so a demotion corrected the release lane and left the nightly
lane certifying the major. And an Experimental major's "compatibility lane only" named no file: the
lane existed, but the registry, this document and the release workflow could each be read end to end
without establishing that, so a reader looking for it concluded there was none. An Experimental major
now has to be recorded as the target of a lane in `.github/workflows`, and a Stable lane may not run
it.
## Database
| Database | Support | Evidence |
@@ -17,7 +31,7 @@ evidence, and this document describes what the registry says.
| PostgreSQL 16 | Stable | full contract suite, release lane (own matrix job) |
| PostgreSQL 17 | Stable | full contract suite, release lane (own matrix job) |
| PostgreSQL 18 | Stable | full contract suite, release lane (own matrix job) |
| PostgreSQL 19 | Experimental | compatibility lane only; promotion requires an ADR |
| PostgreSQL 19 | Experimental | [`jpa-next-postgresql19.yml`](../../.github/workflows/jpa-next-postgresql19.yml) — `NOT_EXECUTABLE`: no `postgres:19-alpine` is published, so no container of that major has been started; promotion requires an ADR |
| H2 | Local convenience | **never** evidence of PostgreSQL behaviour |
Each major gets its **own release job**, because for a while it did not. The release lane passed
@@ -82,6 +96,8 @@ the difference visible instead of asserting a constant against itself. See
| PostgreSQL `COPY` | Admin (J4) |
| Hibernate second-level cache | Advanced |
| Hibernate Envers | Advanced |
| Technical auditing — `audit/AuditableEntity` | Stable (canonical) |
| Technical auditing — `auditing/AuditMetadata` | Candidate, not composed |
| Multi-tenancy (column, RLS, schema, database) | Experimental |
| Consistency-aware read replica | Experimental |
@@ -98,6 +114,26 @@ Each row is a way the platform could pass its tests and still be wrong in produc
| `runtime-role-no-ddl` | gate | the application's own credential being able to alter or drop schema objects |
| `collection-fetch-pagination` | gate | a paged collection fetch silently reading the whole table and paginating in memory |
### The two audit mechanisms
`audit/AuditableEntity` is the canonical one: `created_*`/`updated_*`, a 256-character actor,
stamped explicitly by the repository adapter. It is what the sample entities extend and what the
migrations were written for.
`auditing/AuditMetadata` is a second, complete mechanism with different column names
(`modified_*`), a different actor length (64) and a different capture lifecycle (Spring Data
listeners). Nothing embeds it and nothing composes `JpaAuditingConfiguration`, which is why it is
listed as a candidate rather than as a capability: promoting it means choosing between reshaping it
to the canonical columns and writing a forward migration for the new ones, and that choice has not
been made. Until it is, an entity picks one mechanism or none — enforced on the production graph by
`JpaAuditMechanismRule.entitiesUseExactlyOneAuditMechanism`.
Neither mechanism reaches a bulk or native update. Both stamp on an ordinary save — one in the
adapter, one on a managed entity's lifecycle — so a statement that goes straight to the database
leaves the audit columns showing the previous save. A bulk update of an audited entity must
therefore set the audit column in the statement, which
`JpaAuditMechanismRule.bulkUpdatesOfAuditedEntitiesStampAudit` checks over the production graph.
## Explicitly unsupported
- Reactive JPA. JPA is a blocking specification; a reactive facade over it moves the blocking call
+144 -91
View File
@@ -7,60 +7,76 @@
> either of the old prefixes now fails startup with a message naming the key — see
> `MessagingPrefixMigrationValidator`.
> **이 페이지는 실행된다.** 아래 YAML 블록은 `MessagingConfigurationBindingTest`가 이 파일에서 직접
> 읽어 컨텍스트에 올린다. 문서가 설명하는 모양이 곧 바인딩되는 모양이라는 뜻이고, 문서를 고치면서
> 코드를 고치지 않으면 테스트가 깨진다. 이전 판은 destination·broker·security 세 섹션을 설명했지만
> 어떤 binder도 그것을 읽지 않았다 — 문서대로 설정한 배포는 아무것도 바뀌지 않았고 아무 말도 듣지
> 못했다 (MSG-008).
## Destination profile
```yaml
app:
messaging:
destinations:
order-events:
broker: kafka-primary
kind: EVENT_STREAM # ASYNC_COMMAND | DOMAIN_EVENT | INTEGRATION_EVENT
destinations:
order-events:
broker: kafka-primary
kind: EVENT_STREAM # ASYNC_COMMAND | DOMAIN_EVENT | INTEGRATION_EVENT
# | WORK_QUEUE | PUBLISH_SUBSCRIBE | EVENT_STREAM | REQUEST_REPLY
tier: M1 # M1 | M2 | M3
physical:
topic: order.events.v1
schema:
codec: application/json
compatibility: BACKWARD_TRANSITIVE
message-types: [order.created]
guarantees:
delivery: AT_LEAST_ONCE # AT_MOST_ONCE | AT_LEAST_ONCE
ordering: KEY # NONE | DESTINATION | PARTITION | KEY
external-side-effect: INBOX_TRANSACTIONAL
producer:
confirmation: REPLICATION_OR_PERSISTENCE_ACK
timeout: 5s
mandatory-routing: true
idempotent: true
consumer:
group: order-projection
concurrency: 6
max-in-flight-per-ordering-unit: 1
prefetch: 16
handler-timeout: 30s
manual-settlement: false
retry:
mode: PAUSE_PARTITION # NONE | INLINE | BLOCKING | PAUSE_PARTITION
tier: M1 # M1 | M2 | M3
physical:
topic: order.events.v1
schema:
codec: application/json
compatibility: BACKWARD_TRANSITIVE
message-types: [order.created]
guarantees:
delivery: AT_LEAST_ONCE # AT_MOST_ONCE | AT_LEAST_ONCE
ordering: KEY # NONE | DESTINATION | PARTITION | KEY
external-side-effect: INBOX_TRANSACTIONAL
producer:
confirmation: REPLICATION_OR_PERSISTENCE_ACK
timeout: 5s
mandatory-routing: true
idempotent: true
consumer:
group: order-projection
concurrency: 1 # DESTINATION 순서를 요구하면 1이어야 한다
max-in-flight-per-ordering-unit: 1
prefetch: 16
handler-timeout: 30s
manual-settlement: false
retry:
mode: PAUSE_PARTITION # NONE | INLINE | BLOCKING | PAUSE_PARTITION
# | RETRY_DESTINATION | BROKER_DELAYED
max-attempts: 3
initial-delay: 200ms
max-delay: 2s
multiplier: 2.0
jitter: true
ordering-impact: PRESERVE # PRESERVE | ALLOW_REORDER
dlq:
destination: order-events-dlq
max-redrive-count: 1
payload:
max-bytes: 1048576
claim-check-threshold-bytes: 1048576
key-resolver-configured: true
production: true
topology-auto-create: false
max-attempts: 3
initial-delay: 200ms
max-delay: 2s
multiplier: 2.0
jitter: true
ordering-impact: PRESERVE # PRESERVE | ALLOW_REORDER
dlq:
destination: order-events-dlq
max-redrive-count: 1
payload:
max-bytes: 1048576
claim-check-threshold-bytes: 1048576
key-resolver-configured: true
production: false
topology-auto-create: false
order-events-dlq:
broker: kafka-primary
kind: WORK_QUEUE
physical:
topic: order.events.v1.dlt
schema:
message-types: [order.created]
```
`dlq.destination`이 가리키는 destination도 선언되어야 한다. 선언되지 않은 이름은 부팅 실패이며,
메시지가 갈 곳 없는 DLQ 설정이 조용히 통과하지 않는다. `retry.destination``dlq.destination`
섞여 만드는 순환(A의 retry가 B로, B의 dlq가 A로)도 하나의 그래프로 검사되어 경로와 함께 거절된다.
## 기본값
| 설정 | 기본값 | 근거 |
@@ -81,26 +97,36 @@ app:
| Outbox polling | 500ms | |
| metric dimension 상한 | 200 | cardinality 폭발 방지 |
`schema.codec``application/json`, `schema.compatibility``BACKWARD_TRANSITIVE`,
`guarantees.delivery``AT_LEAST_ONCE`, `retry.mode``NONE`이 기본값이다. 자동 retry가 기본으로
꺼져 있는 이유는 순서를 흐트러뜨리거나 비멱등 side effect를 두 번 실행하는 retry가 눈에 보이는
실패보다 나쁘기 때문이다.
## Broker profile
브로커는 `app.messaging.brokers` 아래에 한 번만 기술한다. `type`이 어느 계열의 설정이 적용되는지
결정하며, 다른 계열의 키(Kafka 항목의 `prefetch` 같은)는 무시되지 않고 부팅 실패로 거절된다 —
무시하면 그 줄을 쓴 사람은 무언가가 적용됐다고 믿게 된다.
### Kafka
```yaml
app:
messaging:
brokers:
kafka-primary:
type: kafka
stable: true
production: true
bootstrap-servers: [broker-1:9093, broker-2:9093]
enable-idempotence: true # stable에서 필수
acks: all # stable에서 필수
max-in-flight-requests-per-connection: 5 # 최대 5
delivery-timeout: 30s
enable-auto-commit: false # 항상 금지
tls-enabled: true # production 필수
authentication-enabled: true # production 필수
brokers:
kafka-primary:
type: kafka
stable: true
production: false
bootstrap-servers: [broker-1:9093, broker-2:9093]
enable-idempotence: true # stable에서 필수
acks: all # stable에서 필수
max-in-flight-requests-per-connection: 5 # 최대 5
delivery-timeout: 30s
enable-auto-commit: false # 항상 금지
consumer-group: order-projection
tls-enabled: false # production이면 필수
authentication-enabled: false # production이면 필수
```
### RabbitMQ
@@ -108,40 +134,52 @@ app:
```yaml
app:
messaging:
brokers:
rabbit-primary:
type: rabbitmq
stable: true
production: true
addresses: [rabbit-1:5671]
publisher-confirms: true # stable에서 필수
publisher-returns: true # stable에서 필수
mandatory: true # stable에서 필수
confirm-timeout: 5s
auto-ack: false # 항상 금지
prefetch: 16
quorum-queues: true # durable work queue 필수
tls-enabled: true
authentication-enabled: true
brokers:
rabbit-primary:
type: rabbitmq
stable: true
production: false
addresses: [rabbit-1:5671]
publisher-confirms: true # stable에서 필수
publisher-returns: true # stable에서 필수
mandatory: true # stable에서 필수
confirm-timeout: 5s
auto-ack: false # 항상 금지
prefetch: 16
quorum-queues: true # durable work queue 필수
tls-enabled: false
authentication-enabled: false
```
`production: true`인 브로커는 `tls-enabled``authentication-enabled`가 모두 참이어야 하고,
그렇지 않으면 `KafkaProfileValidator` / `RabbitProfileValidator`가 부팅을 거절한다. 위 예시가
`production: false`인 것은 이 페이지가 그대로 실행되는 fixture이기 때문이며, 실 배포는 셋 다 참이다.
## 보안
```yaml
app:
messaging:
security:
kafka-primary:
producer: { type: SASL_SCRAM, credential-id: kafka-producer }
consumer: { type: SASL_SCRAM, credential-id: kafka-consumer }
# admin은 application runtime에 설정하지 않는다
hostname-verification: true
access:
publishable: [order-events]
consumable: []
administrable: []
security:
kafka-primary:
producer: { type: SASL_SCRAM, credential-id: kafka-producer }
consumer: { type: SASL_SCRAM, credential-id: kafka-consumer }
# admin은 application runtime에 설정하지 않는다
hostname-verification: true
access:
publishable: [order-events]
consumable: []
administrable: []
```
키는 `app.messaging.brokers`에 선언된 브로커 이름과 같아야 한다. `tls-enabled``production`
브로커 쪽에만 있고 여기에 중복되지 않는다 — 하나의 브로커가 두 곳에서 기술되면 두 값이 어긋나는
날이 오고, 어느 쪽이 이기는지는 아무도 모른다.
`credential-id`는 이름일 뿐이고 자격 증명 자체가 아니다. 실제 재료는 `CredentialProvider`
연결 시점에 해석하므로, 설정 덤프나 힙 덤프에서 나오는 것은 이름뿐이다. producer와 consumer는
서로 다른 `credential-id`를 써야 하며, 같으면 부팅에 실패한다.
## Experimental / Optional
기본값은 전부 `false`다.
@@ -149,12 +187,12 @@ app:
```yaml
app:
messaging:
experimental:
kafka-share: false
pulsar: false
nats: false
bridge:
spring-cloud-stream: false
experimental:
kafka-share: false
pulsar: false
nats: false
bridge:
spring-cloud-stream: false
```
## Backpressure
@@ -162,9 +200,24 @@ app:
```yaml
app:
messaging:
backpressure:
global-limit: 512
per-destination-limit: 64 # global-limit 이하여야 한다
backpressure:
global-limit: 512
per-destination-limit: 64 # global-limit 이하여야 한다
```
`per-destination-limit > global-limit`이면 global limit이 limit이 아니게 되므로 부팅에 실패한다.
## 바인딩되지 않는 키
섹션은 바인딩되는데 그 안의 키 하나가 오타인 경우는 접두사 오타와 달리 조용하다 — 섹션은 붙고,
플랫폼은 뜨고, 바꾸러 온 그 설정만 적용되지 않는다. `MessagingConfigurationKeyValidator`
`app.messaging.destinations|brokers|security` 아래의 모든 키를 settings 레코드에서 파생한 목록과
대조하고, 없는 키는 그 키 이름을 담아 부팅을 거절한다.
허용 키 목록은 이 문서가 아니라 레코드에서 나온다. 문서에 목록을 적으면 필드가 추가된 날 그
목록이 틀리고, 오타를 잡으라고 만든 검사가 정상 필드를 거절하게 된다.
환경변수(`APP_MESSAGING_...`)는 이 검사의 대상이 아니다. `APP_MESSAGING_DESTINATIONS_ORDER_EVENTS_
CONSUMER_PREFETCH`에서 entry 이름과 leaf를 가르는 밑줄은 둘 안에 있는 밑줄과 구별되지 않으므로,
되돌려 쪼개려면 추측해야 한다. 여기서의 추측은 정상 배포를 거절하는 쪽으로 틀리며, 그것은 배포
매니페스트에 손으로 적어야 하는 변수에서 오타 하나를 놓치는 것보다 나쁘다.
+23 -1
View File
@@ -3,6 +3,12 @@
플랫폼이 **무엇을 보장하는지**와 **무엇을 보장하지 않는지**를 브로커별로 고정한다.
여기 없는 조합은 지원되지 않는다.
> **등급은 증거를 따른다.** `CompatibilityMatrix.Entry.hasLiveBrokerCertification()`은 선언된
> boolean이 아니라 `CertifiedEvidence`가 가진 레인 증거에서 파생된다. RabbitMQ가 Stable에서 내려온
> 이유가 이것이다 — 어댑터는 공유 contract 7개를 통과하고 `RabbitBrokerIT`가 실 컨테이너에서 정상
> 경로를 돌리지만, 이 저장소의 Stable 기준인 **장애 시나리오 증거**가 하나도 없다. 레인이 생겨
> 증거를 내면 등급은 코드 수정 없이 따라 올라간다.
> **인증 근거.** 이 표의 버전은 이 저장소의 컨테이너 레인이 실제로 실행한 이미지다. 이전 판은
> Kafka 4.2/4.3을 선언했지만 fixture는 `apache/kafka:4.1.0`, lockfile client는 4.1.1이었다 — 표와
> 코드 상수가 서로 일치했을 뿐 어느 쪽도 실행된 적이 없었다. 장애 시나리오 커버리지도 마찬가지로
@@ -25,7 +31,7 @@
| 브로커 | 등급 | 인증 기준 | Stable 기능 | 제한 |
|---|---|---|---|---|
| Kafka | Stable | 4.1.x | producer idempotence, consumer group, batch, pause/resume, replay, transaction capability | Share Group은 Experimental |
| RabbitMQ | Stable | 4.3.x | exchange/routing, publisher confirm, mandatory return, manual ACK, quorum queue, retry queue, DLQ | stream 및 특수 plugin 미지원 |
| RabbitMQ | Experimental | 4.3.x | exchange/routing, publisher confirm, mandatory return, manual ACK, quorum queue, retry queue, DLQ | 장애 시나리오 레인 미실행 — 증거 없음. stream 및 특수 plugin 미지원 |
| Pulsar | Experimental | 4.0 LTS + 4.2 | typed publish/consume, Shared, Key_Shared, schema | transaction 미승격, 기본 비활성 |
| NATS JetStream | Experimental | 2.14.x | stream, durable consumer, explicit ACK, dedupe, replay | native DLQ 없음(플랫폼이 대행), 기본 비활성 |
| Artemis/JMS | Extension | 범위 밖 | adapter SPI만 | 별도 ADR + Contract Suite 통과 필요 |
@@ -86,11 +92,15 @@ Kafka와 RabbitMQ가 동일한 7개 테스트를 변경 없이 통과한다. 결
|---|---|
| `KafkaBrokerIT` | `acks=all`이 실제 replication 증거를 만든다 / 잘못된 토픽은 `REJECTED` / 발행-소비 왕복에서 identity 보존 및 contiguous commit |
| `KafkaAmbiguityChaosIT` | 브로커를 `docker pause`로 멈춘 상태의 publish가 **`AMBIGUOUS`** 로 보고된다 (broker acceptance 없음, confirmation level `NONE`, 비-retryable) |
| `KafkaBrokerCertificationIT` | 인증 레인. Toxiproxy를 broker 앞에 두고 connection cut / confirm 유실 / 지연 / settlement 유실을 각각 주입하고, 통과한 시나리오마다 `BrokerCertificationEvidence` 한 줄을 manifest에 쓴다 |
| `RabbitBrokerIT` | exchange가 confirm했는데 어떤 큐에도 바인딩되지 않은 publish가 **`REJECTED` + `UNROUTABLE`** 로 보고된다 |
| `OutboxPostgresIT` | 롤백된 트랜잭션은 발행 가능한 행을 남기지 않는다 / `SKIP LOCKED` lease가 두 relay를 분리한다 / ambiguous 행이 같은 `messageId`로 재클레임된다 |
| `InboxPostgresIT` | 재전달이 side effect를 두 번 적용하지 않는다 / 롤백은 예약도 되돌린다 |
Docker가 없으면 `DockerAvailability` 가드로 skip되며, 이 표의 항목은 그때 **검증되지 않은 것**으로 취급한다.
`KafkaBrokerCertificationIT`만 예외다 — 인증 레인은 가드를 달지 않고 Docker가 없으면 실패한다. skip하는
레인은 아무도 켜지 않은 브로커에 대해 성공을 보고하기 때문이다. 그래서 이 레인은 `test`에서 태그로
제외되고 `messagingCertificationTest`로만 실행된다.
### 3. 장애 시나리오 커버리지 (`BrokerFailureMatrix`)
@@ -109,6 +119,18 @@ Docker가 없으면 `DockerAvailability` 가드로 skip되며, 이 표의 항목
커버해야 하고, Experimental 어댑터는 `LIVE_BROKER` 커버리지를 주장할 수 없다. 커버리지는 *능력*이 아니라
*무엇을 실제로 돌렸는지*의 기록이다.
**증거의 출처.** `CertifiedEvidence`는 더 이상 손으로 쓴 목록이 아니라
`messaging-testkit/src/main/resources/messaging/broker-certification-evidence.jsonl`을 읽는다. 그 파일은
`messagingCertificationTest` 레인이 실제 Kafka 컨테이너에 장애를 주입하며 만들어낸 출력이고,
`verifyMessagingCertificationEvidence`가 커밋된 manifest와 이번 실행의 출력을 대조해 다르면 빌드를
실패시킨다. 즉 **manifest를 손으로 고치면 게이트가 깨지고, 레인을 돌리면 manifest가 다시 쓰인다.**
오늘 Kafka가 가진 증거는 `connection-cut-after-write` · `confirm-timeout` · `high-latency` ·
`settlement-lost` 네 개다. `connection-refused`는 남은 gap이며 그 이유가 있다 — Kafka producer는 연결
존재 여부를 알기 전에 레코드를 버퍼에 넣으므로, 연결 거부는 전송에 대해 아무것도 증명하지 못하는
delivery timeout으로 나타난다. 이를 `REJECTED`로 보고하는 것은 이 플랫폼이 금지한 추측이므로,
시나리오는 `CertifiedEvidence.knownGaps`가 이름으로 들고 있는 미커버 항목으로 남는다.
### 실 브로커가 실제로 잡아낸 결함
이 스위트들은 장식이 아니다. 작성 과정에서 결정적 테스트가 통과하는데 실 인프라에서 실패한
@@ -26,8 +26,12 @@ dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.Notification
dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.NotificationPlatformMode
dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.NotificationPlatformSettings
dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.NotificationProviderAssembly
dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.NotificationSecretRequirements
dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.NotificationSmtpProviderConfig
dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.NotificationSmtpSettings
dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.ProviderRuntimeAssembler
dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.ProviderType
dev.caskeleton.adapter.outbound.notification.platform.autoconfigure.SmtpProviderRuntimeAssembler
dev.caskeleton.adapter.outbound.notification.platform.dispatch.AttemptPermit
dev.caskeleton.adapter.outbound.notification.platform.dispatch.CapabilityReconciliationGateway
dev.caskeleton.adapter.outbound.notification.platform.dispatch.ConfiguredProfileCatalog
@@ -56,6 +60,7 @@ dev.caskeleton.adapter.outbound.notification.platform.observation.LoggingNotific
dev.caskeleton.adapter.outbound.notification.platform.observation.NotificationHealthReporter
dev.caskeleton.adapter.outbound.notification.platform.observation.NotificationHealthSnapshot
dev.caskeleton.adapter.outbound.notification.platform.observation.NotificationServingThresholds
dev.caskeleton.adapter.outbound.notification.platform.provider.EmailAttachments
dev.caskeleton.adapter.outbound.notification.platform.provider.ProviderResults
dev.caskeleton.adapter.outbound.notification.platform.provider.UnconfiguredAttachmentResolver
dev.caskeleton.adapter.outbound.notification.platform.provider.apns.ApnsFailureClassifier
@@ -89,6 +94,7 @@ dev.caskeleton.adapter.outbound.notification.platform.provider.ses.SesRequestMap
dev.caskeleton.adapter.outbound.notification.platform.provider.ses.SesSuppressionUpdater
dev.caskeleton.adapter.outbound.notification.platform.provider.ses.SnsCertificateProvider
dev.caskeleton.adapter.outbound.notification.platform.provider.ses.SnsSignatureVerifier
dev.caskeleton.adapter.outbound.notification.platform.provider.smtp.JavaMailSenderSmtpDispatch
dev.caskeleton.adapter.outbound.notification.platform.provider.smtp.SmtpDispatch
dev.caskeleton.adapter.outbound.notification.platform.provider.smtp.SmtpDispatchException
dev.caskeleton.adapter.outbound.notification.platform.provider.smtp.SmtpFailureClassifier
@@ -122,6 +128,7 @@ dev.caskeleton.adapter.outbound.notification.platform.reactor.ReactorContextBrid
dev.caskeleton.adapter.outbound.notification.platform.reactor.ReactorNotificationOrchestrator
dev.caskeleton.adapter.outbound.notification.platform.security.AesGcmCallbackPayloadProtection
dev.caskeleton.adapter.outbound.notification.platform.security.AesGcmContactPointProtector
dev.caskeleton.adapter.outbound.notification.platform.security.AesGcmNotificationPayloadProtection
dev.caskeleton.adapter.outbound.notification.platform.security.CredentialGeneration
dev.caskeleton.adapter.outbound.notification.platform.security.HmacProviderRequestIdHasher
dev.caskeleton.adapter.outbound.notification.platform.security.ProviderCredentialManager
@@ -137,6 +144,7 @@ dev.caskeleton.adapter.outbound.notification.platform.template.NotificationTempl
dev.caskeleton.adapter.outbound.notification.platform.template.PlaceholderTemplateEngine
dev.caskeleton.adapter.outbound.notification.platform.template.Sha256MessageDigestAdapter
dev.caskeleton.adapter.outbound.notification.platform.template.TemplateSlotMode
dev.caskeleton.adapter.outbound.notification.platform.template.TemplateSlotPolicy
dev.caskeleton.adapter.outbound.notification.platform.template.ThymeleafNotificationRenderer
dev.caskeleton.adapter.outbound.notification.platform.template.ThymeleafStringTemplateEngine
dev.caskeleton.adapter.outbound.notification.provider.AttemptCorrelationId
@@ -384,6 +392,7 @@ dev.caskeleton.application.notification.platform.callback.ProviderEventProjector
dev.caskeleton.application.notification.platform.callback.ProviderEventRecord
dev.caskeleton.application.notification.platform.callback.ProviderEventRecordId
dev.caskeleton.application.notification.platform.callback.ProviderEventSource
dev.caskeleton.application.notification.platform.callback.ProviderRequestIdHash
dev.caskeleton.application.notification.platform.callback.StandardDeliveryProjector
dev.caskeleton.application.notification.platform.callback.SuppressionFacts
dev.caskeleton.application.notification.platform.callback.VerifiedCallback
@@ -400,6 +409,7 @@ dev.caskeleton.application.notification.platform.contact.LegacyFcmRegistrationTo
dev.caskeleton.application.notification.platform.contact.MobilePushTarget
dev.caskeleton.application.notification.platform.contact.PhoneNumber
dev.caskeleton.application.notification.platform.contact.WebPushSubscriptionValue
dev.caskeleton.application.notification.platform.dispatch.AcceptNotificationApplicationUseCase
dev.caskeleton.application.notification.platform.dispatch.ApplicationReceiptServiceImpl
dev.caskeleton.application.notification.platform.dispatch.AttachmentIntegrityGuard
dev.caskeleton.application.notification.platform.dispatch.CancelNotificationApplicationUseCase
@@ -430,6 +440,7 @@ dev.caskeleton.application.notification.platform.dispatch.PolicyRoutePlanner
dev.caskeleton.application.notification.platform.dispatch.ProviderDispatchGatewayPort
dev.caskeleton.application.notification.platform.dispatch.ProviderProfileCatalogPort
dev.caskeleton.application.notification.platform.dispatch.ProviderRequestIdHasherPort
dev.caskeleton.application.notification.platform.dispatch.PublishNotificationTemplateApplicationUseCase
dev.caskeleton.application.notification.platform.dispatch.RecipientDeliveryRecord
dev.caskeleton.application.notification.platform.dispatch.RecipientDeliveryStorePort
dev.caskeleton.application.notification.platform.dispatch.RecipientLease
@@ -499,12 +510,16 @@ dev.caskeleton.application.notification.platform.policy.SuppressionReason
dev.caskeleton.application.notification.platform.policy.SuppressionScope
dev.caskeleton.application.notification.platform.policy.SuppressionSource
dev.caskeleton.application.notification.platform.policy.SuppressionStorePort
dev.caskeleton.application.notification.platform.port.in.AcceptNotificationCommand
dev.caskeleton.application.notification.platform.port.in.AcceptNotificationUseCase
dev.caskeleton.application.notification.platform.port.in.CancelNotificationCommand
dev.caskeleton.application.notification.platform.port.in.CancelNotificationUseCase
dev.caskeleton.application.notification.platform.port.in.GetNotificationQuery
dev.caskeleton.application.notification.platform.port.in.GetNotificationUseCase
dev.caskeleton.application.notification.platform.port.in.IngestProviderCallbackCommand
dev.caskeleton.application.notification.platform.port.in.IngestProviderCallbackUseCase
dev.caskeleton.application.notification.platform.port.in.PublishNotificationTemplateCommand
dev.caskeleton.application.notification.platform.port.in.PublishNotificationTemplateUseCase
dev.caskeleton.application.notification.platform.port.in.ScheduleNotificationCommand
dev.caskeleton.application.notification.platform.port.in.ScheduleNotificationUseCase
dev.caskeleton.application.notification.platform.port.in.SubmitNotificationCommand
@@ -539,6 +554,8 @@ dev.caskeleton.application.notification.platform.push.ReceiptKind
dev.caskeleton.application.notification.platform.push.ReceiptResult
dev.caskeleton.application.notification.platform.security.AccessContext
dev.caskeleton.application.notification.platform.security.ContactPointProtector
dev.caskeleton.application.notification.platform.security.NotificationPayloadProtection
dev.caskeleton.application.notification.platform.security.NotificationPayloadUnreadableException
dev.caskeleton.application.notification.platform.security.NotificationRedactor
dev.caskeleton.application.notification.platform.security.ProtectedContactPoint
dev.caskeleton.application.notification.platform.security.SafeDiagnosticContext
@@ -41,6 +41,12 @@ still waiting on gets claimed by a second worker, and the recipient receives the
| `callbacks.enabled` | `APP_NOTIFICATION_PLATFORM_CALLBACKS_ENABLED` | `false` | boolean |
| `callbacks.max-body-bytes` | `APP_NOTIFICATION_PLATFORM_CALLBACK_MAX_BODY_BYTES` | `65508` | 1..65508 |
| `callbacks.replay-skew` | `APP_NOTIFICATION_PLATFORM_CALLBACK_REPLAY_SKEW` | `5m` | positive |
| `callbacks.trusted-proxies` | `APP_NOTIFICATION_PLATFORM_CALLBACK_TRUSTED_PROXIES` | *(empty)* | CSV of peer addresses |
여러 provider가 요청 URL에 서명하므로, 그 URL을 잘못 재구성하면 정상 webhook이 전부 서명 실패가 된다.
`trusted-proxies`가 비어 있으면 forwarded 헤더를 **믿지 않고** 컨테이너가 관측한 값을 쓴다. 무조건 믿으면
아무 호출자나 자기 서명이 검증될 URL을 고를 수 있어 서명 자체가 무의미해진다. 로드밸런서 뒤에 있는 배포는
그 peer를 명시한다.
65508 is not a round number by accident: it is the ciphertext column's 65536 bytes minus the AES-GCM
nonce and tag. A larger configured value would pass every check above the database and fail the
@@ -69,6 +75,43 @@ them, because the keys are deployment-chosen; supply them as YAML or as
A profile pins provider type, environment, credential profile, timeouts, concurrency and rate limit.
Sender identity and credential profile are separate concerns.
## SMTP relay
The one provider profile the template ships, off. A deployment that wants the common case sets
`APP_NOTIFICATION_PLATFORM_SMTP_ENABLED=true` and the relay address; one that wants a different
profile id or a second family declares it in its own YAML instead.
The profile and the relay are separate tables below because they answer different questions. The
profile says *which* provider serves EMAIL and under what limits; the relay says *what the transport
is*. Host, port and credentials are not here at all — they stay `spring.mail.*`, because Spring
already owns them and a second spelling would be a second thing to keep in step.
| Property | Environment variable | Default | Bound |
|---|---|---|---|
| `providers.smtp.enabled` | `APP_NOTIFICATION_PLATFORM_SMTP_ENABLED` | `false` | boolean |
| `providers.smtp.primary-for-channel` | `APP_NOTIFICATION_PLATFORM_SMTP_PRIMARY` | `true` | boolean; exactly one primary per channel |
| `providers.smtp.environment` | `APP_NOTIFICATION_PLATFORM_SMTP_ENVIRONMENT` | `local` | required when enabled |
| `providers.smtp.credential-profile` | `APP_NOTIFICATION_PLATFORM_SMTP_CREDENTIAL_PROFILE` | `default` | resolved through `SecretMaterialProvider`, never inline material |
| `providers.smtp.timeout` | `APP_NOTIFICATION_PLATFORM_SMTP_TIMEOUT` | `10s` | positive, finite |
| `providers.smtp.max-concurrency` | `APP_NOTIFICATION_PLATFORM_SMTP_MAX_CONCURRENCY` | `4` | positive |
| `providers.smtp.rate-per-second` | `APP_NOTIFICATION_PLATFORM_SMTP_RATE_PER_SECOND` | `10` | positive |
| Property | Environment variable | Default | Bound |
|---|---|---|---|
| `smtp.tls-mode` | `APP_NOTIFICATION_PLATFORM_SMTP_TLS_MODE` | `STARTTLS_REQUIRED` | `STARTTLS_REQUIRED` or `IMPLICIT_TLS` |
| `smtp.sender-identity` | `APP_NOTIFICATION_PLATFORM_SMTP_SENDER_IDENTITY` | `no-reply@example.invalid` | address |
| `smtp.connect-timeout` | `APP_NOTIFICATION_PLATFORM_SMTP_CONNECT_TIMEOUT` | `5s` | positive, finite |
| `smtp.read-timeout` | `APP_NOTIFICATION_PLATFORM_SMTP_READ_TIMEOUT` | `10s` | positive, finite |
| `smtp.write-timeout` | `APP_NOTIFICATION_PLATFORM_SMTP_WRITE_TIMEOUT` | `10s` | positive, finite |
| `smtp.max-concurrency` | `APP_NOTIFICATION_PLATFORM_SMTP_DISPATCH_CONCURRENCY` | `4` | positive |
The TLS mode enum has no plaintext member. An unencrypted relay is refused by construction rather
than by a validator somebody has to remember to run.
The default sender is an RFC 2606 reserved domain that resolves nowhere, so a deployment that forgot
to set one produces a traceable bounce instead of mail apparently sent from an address it does not
own.
## Startup failures
Startup fails rather than degrading when:
@@ -91,6 +134,33 @@ All key material arrives through `SecretMaterialProvider`. Nothing is read from
committed file, or from a plaintext log. Contact point encryption and lookup HMAC keys must be
distinct, and the encryption key must be exactly 256 bits.
Eight purposes, eight keys. Each is base64 of at least 32 bytes and each must differ from every
other; the platform decodes them at startup and refuses to boot if one is blank, short or shared. A
blank value used to be skipped, which meant the platform started without the key and found out on
the first contact point — in production, on a recipient's notification.
Every default below is **unset**, deliberately. Supply the values out of band, per environment. Do
not write one into this table, into `application.yml`, into an `.env` file that is tracked, or into
any example: a value that appears in the repository is a value that has been disclosed.
| Purpose | Key material | Active key id |
|---|---|---|
| Contact point encryption | `APP_NOTIFICATION_PLATFORM_CONTACT_ENCRYPTION_KEY` | `APP_NOTIFICATION_PLATFORM_CONTACT_ENCRYPTION_KEY_ID` |
| Contact point lookup HMAC | `APP_NOTIFICATION_PLATFORM_CONTACT_LOOKUP_HMAC_KEY` | `APP_NOTIFICATION_PLATFORM_CONTACT_LOOKUP_HMAC_KEY_ID` |
| Callback signing | `APP_NOTIFICATION_PLATFORM_CALLBACK_SIGNING_KEY` | `APP_NOTIFICATION_PLATFORM_CALLBACK_SIGNING_KEY_ID` |
| Callback fingerprint HMAC | `APP_NOTIFICATION_PLATFORM_CALLBACK_FINGERPRINT_HMAC_KEY` | `APP_NOTIFICATION_PLATFORM_CALLBACK_FINGERPRINT_HMAC_KEY_ID` |
| Provider credential encryption | `APP_NOTIFICATION_PLATFORM_PROVIDER_CREDENTIAL_KEY` | `APP_NOTIFICATION_PLATFORM_PROVIDER_CREDENTIAL_KEY_ID` |
| Provider request lookup HMAC | `APP_NOTIFICATION_PLATFORM_PROVIDER_REQUEST_LOOKUP_HMAC_KEY` | `APP_NOTIFICATION_PLATFORM_PROVIDER_REQUEST_LOOKUP_HMAC_KEY_ID` |
| Payload encryption | `APP_NOTIFICATION_PLATFORM_PAYLOAD_ENCRYPTION_KEY` | `APP_NOTIFICATION_PLATFORM_PAYLOAD_ENCRYPTION_KEY_ID` |
| Web Push VAPID signing | `APP_NOTIFICATION_PLATFORM_VAPID_SIGNING_KEY` | `APP_NOTIFICATION_PLATFORM_VAPID_SIGNING_KEY_ID` |
A key id is not secret — an id identifies key material without revealing it — but it is required,
and it has no default on purpose. A constant id makes a rotation indistinguishable from the key it
replaced, so nothing could decrypt what was written before it. Change the id in the same deployment
that changes the material, and keep the superseded key readable under its old id until the data it
wrote has been re-encrypted. The rotation sequence is in
[at-rest-threat-model.md](at-rest-threat-model.md).
## Readiness
The platform contributes a `notifications` actuator endpoint and a health indicator. It reports DOWN
+19 -1
View File
@@ -1672,9 +1672,12 @@ env_keys:
required_test: idempotency-contract:ttl-applied
- name: APP_IDEMPOTENCY_PROVIDER
# postgresql selects the owner-safe V2 store on the primary data source. It had no value here
# while the store, its schema stream and its integration suite all existed, so the capability
# could only be reached by constructing it in a test.
type: enum
default: jdbc
allowed_values: [disabled, jdbc, redis]
allowed_values: [disabled, jdbc, redis, postgresql]
classification: public-config
required: false
reload_policy: restart-only
@@ -4970,6 +4973,21 @@ env_keys:
compatibility_impact: behavior-change
required_test: adapter-contract:notification-callback-body-bound
- name: APP_NOTIFICATION_PLATFORM_CALLBACK_TRUSTED_PROXIES
# source: NTF-001 — peers whose forwarded headers may be believed when reconstructing the URL a
# provider signed. Empty means the resolver uses what the container observed; honouring
# forwarded headers unconditionally would let any caller pick the URL its signature is checked
# against, which defeats the signature.
type: csv
default: ""
allowed_values: null
classification: security-relevant
required: false
reload_policy: restart-only
owner_branch: worktree-notification-platform
validation: none
compatibility_impact: behavior-change
required_test: adapter-contract:notification-callback-url-resolution
- name: APP_NOTIFICATION_PLATFORM_CALLBACK_REPLAY_SKEW
# source: NTF-025 — how far a callback timestamp may differ from local time before it is treated as a replay
type: duration
@@ -0,0 +1,101 @@
# P1 remediation status — the five module reviews
**Reviews:** `docs/reviews/2026-08-14-{jpa,graphql,messaging,mongodb,notification}-module-code-review.md`
**Baseline:** the P0 pass was already complete when this pass began; this file records the P1 pass,
which is complete — all 31 findings closed, two of them by establishing that the review's own
accepted outcome was already met rather than by writing code.
**Verified at:** repo-wide `test`, `spotlessCheck`, `verifyCleanArchitectureDependencies`,
`verifyEnvKeys`, `verifyPublicPathSnapshot` and the root `CleanArchitectureTest` all green.
This file exists because the status was previously carried only in conversation and had to be
reconstructed. A finding's row is the claim; the evidence column is where the claim is falsifiable.
## The recurring defect
Nearly every P1 in these five reviews is one shape: **a control that exists, passes its own tests,
and is reached by nothing.** Not a wrong algorithm — an unreachable one. The tests passed because
they constructed the class directly; the capability was absent because no configuration could.
Examples closed in this pass: the Mongo typed-update path (`MongoBulkExecutor` and
`MongoAtomicOperationsTemplate` were constructed by nothing), the entire Mongo change-stream
capability (no production code opened a stream at all), `GraphQlBatchLoaderRegistrar.register` (no
caller, so the wrong-key refusal never ran on an executing query), `PublishOptions.timeout()` (read
by nobody on the real publish path), `markExhausted` (no caller, so a row that spent its budget
stayed `AMBIGUOUS` forever), `OutboxMessagePublishPort.publishForOutcome` (no caller, so every
ambiguous publish collapsed into an exception), the outbox relay itself (no bean ran a pass), and
`BackpressureController` (a limiter the publish path never consulted, reporting `globalInFlight: 0`
under any load).
The lesson worth keeping: **a passing unit test is not evidence a capability exists.** The
reachability question — what constructs this, and on which request path — has to be asked
separately, and several of the tests added in this pass exist only to ask it.
## Status
| Finding | Verdict | Evidence |
| --- | --- | --- |
| JPA-005 | closed already | roll-up in `NotificationRequestStatusPolicy`; port is tenant-scoped; ArchUnit `PERSISTENCE_DOES_NOT_DEPEND_ON_APPLICATION_SERVICES` |
| JPA-006 | closed already | `PersistenceJpaRootAutoConfiguration` is in `AutoConfiguration.imports` and imports the real runtime config |
| JPA-007 | closed under item 6 | the review offers two accepted outcomes: full integration, or the interim state under item 6's two conditions. Both hold and were verified in code — `FullTransactionRetryCoordinator:89-93` resolves the policy per call from the calling profile, and `DefaultJpaRetryPolicy:61-64` returns on `!failure.retryable()` before consulting the category allowlist |
| JPA-008 | closed | nothing registered a `VendorFailureTranslator`, so every executor ran `withoutCatalogs()` and a 40001 never reached the retry classifier |
| JPA-026 | closed | a rehydrated callback event had no matcher once `attempt_id` was null; hash fallback + write-back added |
| JPA-028 | closed | the reaper query had no caller, uploads had no terminal state, cleanup decided from a lease it had read rather than claiming |
| JPA-029 | closed already | tuple cutoff implemented; the signal is documented best-effort by decision |
| GQL-004 | not a defect | every evidence bullet false at HEAD; no WebFlux dependency exists, transport disagreement fails startup |
| GQL-011 | closed | unkeyed truncated SHA-256 over actor/tenant replaced with a keyed, rotating HMAC; no default key |
| GQL-015 | closed | schema extensions were invisible to the comparator, so a field removed by `extend type` produced no change at all |
| GQL-016 | closed | the batch executor returned the loader's map verbatim, so the wrong-key refusal and missing-key policy never ran |
| GQL-017 | closed | the blocking bridge was opt-in and null by default, so a reactive runtime ran blocking chunks on the event loop |
| MNG-010 | closed | the guardrail was a `Set<String>` asserted against itself; now an ArchUnit rule over the real production graph at the composition root |
| MNG-012 | closed | a failed abort or close on a committed transaction was discarded by a closing brace |
| MNG-018 | closed | TLS and auth were asserted against a settings object; four TLS cases now run against real servers |
| MNG-024 | closed | the reactive binder carried read preference and write concern only, so reactive writes skipped auditing and callbacks |
| MNG-026 | closed | both typed-update paths were unreachable, and the bulk executor could be built with no policy at all |
| MNG-028 | closed | no production code opened a change stream; the consumer now owns load → resume → stream → project → checkpoint |
| MSG-006 | closed | `markExhausted` had no caller and the scheduler's backoff was never written; a relay worker now runs passes |
| MSG-008 | closed | validators were beans nothing injected, and the documented configuration bound nowhere; destination/broker/security sections now bind under `app.messaging` and the reference document is executed by a test |
| MSG-010 | closed | `BackpressureController` deleted as an unreachable duplicate; its one unique capability moved into the gate that is called |
| MSG-012 | closed | header values accepted CR/LF/NUL, identifiers were bounded in chars not bytes, `traceparent` was any string, denylists matched exact spellings only |
| MSG-014 | closed | `hasLiveBrokerCertification` is derived from recorded evidence rather than declared, and the evidence is now a manifest a fault lane wrote against a real broker rather than a hand-authored list |
| MSG-015 | semantic half closed | the outcome-aware publish path is wired; the anti-corruption bridge needs a `modules.json` edge and is an architecture decision |
| MSG-016 | closed | no reserved name existed for tenant, so every consumed message was rebuilt with none; the canonical metadata is now columns, and the CDC event key moved off `destination`, which had put every message on a topic onto one partition |
| MSG-017 | closed | the timeout is an absolute deadline; contradictory `PublishResult` combinations are unrepresentable; `brokerHints` removed |
| NTF-015 | closed | webhook signing was one shared secret for every subscription; SES silently dropped attachments and now sends them as raw MIME |
| NTF-016 | closed | retired keys were forced to one purpose so a provider-credential drain failed; required purposes now follow enabled capabilities |
| NTF-019 | closed already | split inbound ports carry capabilities; four ArchUnit rules with negative fixtures close the gate |
## Found while closing, not in any review
`SmtpMimeMessageFactory` handed JavaMail the resolver's one-shot stream. JavaMail reads an
attachment twice — once to choose the part's transfer encoding, once to write it — so the second
read returned nothing and the message went out announcing a filename and carrying no bytes, with
the attempt recorded as accepted. Every existing test asserted on the outcome of the send rather
than on what was sent, which is why a bug that emptied every attachment on the one provider family
this platform can actually assemble survived a full review pass.
`SmtpAttachmentBodyTest` now reads the attachment back off the serialised message the way a
receiving client would. It was confirmed to fail against the original code and pass against the
fix, because a regression test nobody has watched fail is a regression test of unknown shape.
## Observations that are not open P1 items
Both were checked against the reviews rather than assumed, because "looks unfinished" and "is an open
finding" are different claims.
**The GraphQL cursor key gate.** `GraphQlPlatformStartupValidator` refuses to start a production
deployment without `backend.graphql.cursor.key-ids`, and nothing signs a cursor with it:
`GraphQlConnectionAssembler` and `HmacGraphQlCursorCodec` have no consumer anywhere in this
repository, because the template ships no paginating resolver. This is not GQL-010, which is about
the codec's framing, rotation and scope and is implemented — versioned framing, the codec choosing
the active key rather than the caller, v1 decode kept only for migration, tenant scope bound. It
belongs to the `modelled` grading the leaf's own `GraphQlPolicyRequestPathTest` already documents in
as many words. Declaring beans for it would create the unreachable-control defect this pass exists
to close, and the present behaviour fails closed, which is the safe direction. Left as it is, on
purpose.
## Product work, not remediation
**Notification provider transports.** Only SMTP has a `ProviderRuntimeAssembler`.
`NotificationProviderAssembly` refuses to start a profile whose family has no assembler, naming the
transport as a seam rather than an implementation — which is the honest fail-closed behaviour, not a
defect. Building SES, Twilio, FCM, APNs and WebPush transports is product work.
+3 -1
View File
@@ -25,7 +25,9 @@ status: stub
### Step 1 — 확인
1. ERROR log에서 `OUTBOX_PUBLISH_FAILED` 라인 확인: `event_type`, `event_id`, `correlation_id`, `attempt_count` 추출
2. broker 상태 확인: `APP_MESSAGING_BROKER`(공백이면 messaging 비활성)과 broker endpoint 가용성
2. broker 상태 확인: `APP_MESSAGING_BROKER` 값과 broker endpoint 가용성. 이 키는 활성화 스위치가
아니라 **선택자**다 — messaging을 끄는 것은 `APP_MESSAGING_ENABLED=false`이고, 이 값을 비운다고
messaging이 꺼지지는 않는다.
- `APP_MESSAGING_BROKER`가 공백인 채로 relay가 켜져 있으면 **애플리케이션이 기동하지 않는다**
(`OutboxRelayBrokerRequirementValidator`, MSG-024). 이 조합에서는 publish가 전부
`AdapterDisabledException`으로 실패하며 PENDING row가 DEAD까지 소진되기 때문이다.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,41 @@
$ ./gradlew verifyCleanArchitectureDependencies verifyEnvKeys verifyRuntimeModuleMembership verifyPublicPathSnapshot verifyDocumentedLeafCount --console=plain
run-at: 2026-08-20T01:59:14Z
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :verifyCleanArchitectureDependencies
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:support:compileJava UP-TO-DATE
> Task :adapter:outbound:support:processResources NO-SOURCE
> Task :adapter:outbound:support:classes UP-TO-DATE
> Task :adapter:outbound:support:jar UP-TO-DATE
> Task :adapter:outbound:cache-redis:compileJava UP-TO-DATE
> Task :verifyEnvKeys
verifyEnvKeys: OK — 341 env keys, 6 required placeholders covered, 225 application APP_ references registered, 61 typed properties registered, 338 rows with a consumer or a deprecation.
> Task :verifyRuntimeModuleMembership
verifyRuntimeModuleMembership: 2 runtime composition(s) match the registry
> Task :verifyPublicPathSnapshot
verifyPublicPathSnapshot: OK — committed public paths are unchanged.
> Task :verifyDocumentedLeafCount
BUILD SUCCESSFUL in 8s
21 actionable tasks: 5 executed, 16 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,901 @@
$ ./gradlew check --warning-mode=fail --no-daemon --console=plain (re-run after the SpotBugs fix)
run-at: 2026-08-20T01:53:16Z
To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/9.0.0/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation.
Daemon will be stopped at the end of the build
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :verifyCleanArchitectureDependencies
> Task :verifyConfigurationPropertiesProcessor
verifyConfigurationPropertiesProcessor: OK — all 44 registered leaves have exact configuration-processor parity.
> Task :verifyDocumentedLeafCount
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:support:compileJava UP-TO-DATE
> Task :adapter:outbound:support:processResources NO-SOURCE
> Task :adapter:outbound:support:classes UP-TO-DATE
> Task :adapter:outbound:support:jar UP-TO-DATE
> Task :adapter:outbound:cache-redis:compileJava UP-TO-DATE
> Task :verifyEnvKeys
verifyEnvKeys: OK — 341 env keys, 6 required placeholders covered, 225 application APP_ references registered, 61 typed properties registered, 338 rows with a consumer or a deprecation.
> Task :verifyJpaReadinessRegistryContract
verifyJpaReadinessRegistryContract: OK — unknown card, duplicate task, missing prerequisite, cycle, duplicate migration ownership, missing selected task, and malformed evidence ownership all fail closed.
> Task :verifyJpaReadinessRegistry
verifyJpaReadinessRegistry: OK — 17 exact cards, 9 owned migration streams, acyclic prerequisites, unique tasks/locations/history tables, and selected task existence verified.
> Task :verifyNoIgnoredSourcePackages
verifyNoIgnoredSourcePackages: OK — 5164 Java sources are all committable.
> Task :verifyNoStaleTraceableJars
verifyNoStaleTraceableJars: OK — no stale traceable JARs in build/libs.
> Task :verifyNotificationApiSurface
verifyNotificationApiSurface: OK — 586 public types, unchanged.
> Task :verifyNotificationConfiguration
verifyNotificationConfiguration: OK — 42 platform settings, bound, documented and registered.
> Task :verifyNotificationEvidence
verifyNotificationEvidence: OK — 4 claims proven, every grade in support-matrix.md is backed.
> Task :verifyOneTypePerFile
verifyOneTypePerFile: OK — one public top-level type per file, names match.
> Task :verifyQuarantineSunset
verifyQuarantineSunset: OK — 0 registered, 0 tagged (14-day sunset enforced).
> Task :verifyReadmeCommands
verifyReadmeCommands: OK — executable commands in /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/README.md resolve.
> Task :verifyRunbookReferences
> Task :verifyRuntimeModuleMembership
verifyRuntimeModuleMembership: 2 runtime composition(s) match the registry
> Task :verifySpotBugsAnalysisFailureContract
verifySpotBugsAnalysisFailureContract: OK — clean and advisory bug-only reports pass; missing classes and analysis errors fail closed.
> Task :verifyTrivyignore
verifyTrivyignore: OK — 0 suppression(s) validated (reason + bounded, non-expired expiry).
> Task :domain-core:compileJava UP-TO-DATE
> Task :domain-core:processResources NO-SOURCE
> Task :domain-core:classes UP-TO-DATE
> Task :domain-core:jar UP-TO-DATE
> Task :messaging:messaging-core-api:compileJava UP-TO-DATE
> Task :messaging:messaging-observability:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-api:compileJava UP-TO-DATE
> Task :messaging:messaging-policy:compileJava UP-TO-DATE
> Task :messaging:messaging-reliability-api:compileJava UP-TO-DATE
> Task :messaging:messaging-security:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-api:compileJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:compileJava UP-TO-DATE
> Task :messaging:messaging-claim-check:compileJava UP-TO-DATE
> Task :messaging:messaging-cloudevents:compileJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka:compileJava UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-rabbit:compileJava UP-TO-DATE
> Task :messaging:messaging-runtime-core:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-json:compileJava UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:compileJava UP-TO-DATE
> Task :adapter:inbound:graphql:compileJava UP-TO-DATE
> Task :adapter:inbound:graphql:processResources UP-TO-DATE
> Task :adapter:inbound:graphql:classes UP-TO-DATE
> Task :adapter:inbound:graphql:jar UP-TO-DATE
> Task :adapter:inbound:web:compileJava UP-TO-DATE
> Task :adapter:inbound:web:processResources NO-SOURCE
> Task :adapter:inbound:web:classes UP-TO-DATE
> Task :adapter:inbound:web:jar UP-TO-DATE
> Task :adapter:outbound:cache-redis:processResources UP-TO-DATE
> Task :adapter:outbound:cache-redis:classes UP-TO-DATE
> Task :adapter:outbound:cache-redis:jar UP-TO-DATE
> Task :adapter:outbound:fileserver:compileJava UP-TO-DATE
> Task :adapter:outbound:fileserver:processResources NO-SOURCE
> Task :adapter:outbound:fileserver:classes UP-TO-DATE
> Task :adapter:outbound:fileserver:jar UP-TO-DATE
> Task :adapter:outbound:httpclient:compileJava UP-TO-DATE
> Task :adapter:outbound:httpclient:processResources NO-SOURCE
> Task :adapter:outbound:httpclient:classes UP-TO-DATE
> Task :adapter:outbound:httpclient:jar UP-TO-DATE
> Task :adapter:outbound:identifier:compileJava UP-TO-DATE
> Task :adapter:outbound:identifier:compileGroovy NO-SOURCE
> Task :adapter:outbound:identifier:processResources NO-SOURCE
> Task :adapter:outbound:identifier:classes UP-TO-DATE
> Task :adapter:outbound:identifier:jar UP-TO-DATE
> Task :adapter:outbound:messaging:compileJava UP-TO-DATE
> Task :adapter:outbound:messaging:processResources UP-TO-DATE
> Task :adapter:outbound:messaging:classes UP-TO-DATE
> Task :adapter:outbound:messaging:jar UP-TO-DATE
> Task :adapter:outbound:notification:compileJava UP-TO-DATE
> Task :adapter:outbound:notification:processResources NO-SOURCE
> Task :adapter:outbound:notification:classes UP-TO-DATE
> Task :adapter:outbound:notification:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:jar UP-TO-DATE
> Task :app-bootstrap:compileJava UP-TO-DATE
> Task :app-bootstrap:processResources UP-TO-DATE
> Task :app-bootstrap:classes UP-TO-DATE
> Task :adapter:inbound:grpc:compileJava UP-TO-DATE
> Task :adapter:inbound:grpc:processResources NO-SOURCE
> Task :adapter:inbound:grpc:classes UP-TO-DATE
> Task :adapter:inbound:grpc:jar UP-TO-DATE
> Task :adapter:inbound:websocket:compileJava UP-TO-DATE
> Task :adapter:inbound:websocket:processResources NO-SOURCE
> Task :adapter:inbound:websocket:classes UP-TO-DATE
> Task :adapter:inbound:websocket:jar UP-TO-DATE
> Task :app-bootstrap:compileConditionalTransportTestJava UP-TO-DATE
> Task :app-bootstrap:processConditionalTransportTestResources NO-SOURCE
> Task :app-bootstrap:conditionalTransportTestClasses UP-TO-DATE
> Task :app-bootstrap:checkstyleConditionalTransportTest UP-TO-DATE
> Task :app-bootstrap:compileFunctionalTestJava UP-TO-DATE
> Task :app-bootstrap:processFunctionalTestResources NO-SOURCE
> Task :app-bootstrap:functionalTestClasses UP-TO-DATE
> Task :app-bootstrap:checkstyleFunctionalTest UP-TO-DATE
> Task :app-bootstrap:checkstyleMain UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:testkitJar UP-TO-DATE
> Task :app-bootstrap:compileSampleOffTestJava UP-TO-DATE
> Task :app-bootstrap:processSampleOffTestResources UP-TO-DATE
> Task :app-bootstrap:sampleOffTestClasses UP-TO-DATE
> Task :app-bootstrap:checkstyleSampleOffTest UP-TO-DATE
> Task :sample-portfolio:compileJava UP-TO-DATE
> Task :sample-portfolio:processResources UP-TO-DATE
> Task :sample-portfolio:classes UP-TO-DATE
> Task :sample-portfolio:jar UP-TO-DATE
> Task :app-bootstrap:compileTestJava UP-TO-DATE
> Task :app-bootstrap:processTestResources UP-TO-DATE
> Task :app-bootstrap:testClasses UP-TO-DATE
> Task :app-bootstrap:checkstyleTest UP-TO-DATE
> Task :app-bootstrap:runtimeClasspathManifest UP-TO-DATE
> Task :messaging:messaging-admin-api:processResources NO-SOURCE
> Task :messaging:messaging-admin-api:classes UP-TO-DATE
> Task :messaging:messaging-admin-api:jar UP-TO-DATE
> Task :messaging:messaging-admin-runtime:processResources NO-SOURCE
> Task :messaging:messaging-admin-runtime:classes UP-TO-DATE
> Task :messaging:messaging-admin-runtime:jar UP-TO-DATE
> Task :messaging:messaging-claim-check:processResources NO-SOURCE
> Task :messaging:messaging-claim-check:classes UP-TO-DATE
> Task :messaging:messaging-claim-check:jar UP-TO-DATE
> Task :messaging:messaging-cloudevents:processResources NO-SOURCE
> Task :messaging:messaging-cloudevents:classes UP-TO-DATE
> Task :messaging:messaging-cloudevents:jar UP-TO-DATE
> Task :messaging:messaging-core-api:processResources NO-SOURCE
> Task :messaging:messaging-core-api:classes UP-TO-DATE
> Task :messaging:messaging-core-api:jar UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:processResources UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:classes UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:jar UP-TO-DATE
> Task :messaging:messaging-kafka:processResources NO-SOURCE
> Task :messaging:messaging-kafka:classes UP-TO-DATE
> Task :messaging:messaging-kafka:jar UP-TO-DATE
> Task :messaging:messaging-observability:processResources NO-SOURCE
> Task :messaging:messaging-observability:classes UP-TO-DATE
> Task :messaging:messaging-observability:jar UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:processResources UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:classes UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:jar UP-TO-DATE
> Task :messaging:messaging-policy:processResources NO-SOURCE
> Task :messaging:messaging-policy:classes UP-TO-DATE
> Task :messaging:messaging-policy:jar UP-TO-DATE
> Task :messaging:messaging-rabbit:processResources NO-SOURCE
> Task :messaging:messaging-rabbit:classes UP-TO-DATE
> Task :messaging:messaging-rabbit:jar UP-TO-DATE
> Task :messaging:messaging-reliability-api:processResources NO-SOURCE
> Task :messaging:messaging-reliability-api:classes UP-TO-DATE
> Task :messaging:messaging-reliability-api:jar UP-TO-DATE
> Task :messaging:messaging-runtime-core:processResources NO-SOURCE
> Task :messaging:messaging-runtime-core:classes UP-TO-DATE
> Task :messaging:messaging-runtime-core:jar UP-TO-DATE
> Task :messaging:messaging-schema-api:processResources NO-SOURCE
> Task :messaging:messaging-schema-api:classes UP-TO-DATE
> Task :messaging:messaging-schema-api:jar UP-TO-DATE
> Task :messaging:messaging-schema-json:processResources NO-SOURCE
> Task :messaging:messaging-schema-json:classes UP-TO-DATE
> Task :messaging:messaging-schema-json:jar UP-TO-DATE
> Task :messaging:messaging-security:processResources NO-SOURCE
> Task :messaging:messaging-security:classes UP-TO-DATE
> Task :messaging:messaging-security:jar UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:processResources UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:classes UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:jar UP-TO-DATE
> Task :messaging:messaging-transport-spi:processResources NO-SOURCE
> Task :messaging:messaging-transport-spi:classes UP-TO-DATE
> Task :messaging:messaging-transport-spi:jar UP-TO-DATE
> Task :adapter:outbound:objectstorage:compileJava UP-TO-DATE
> Task :adapter:outbound:objectstorage:processResources NO-SOURCE
> Task :adapter:outbound:objectstorage:classes UP-TO-DATE
> Task :adapter:outbound:objectstorage:jar UP-TO-DATE
> Task :app-bootstrap:test UP-TO-DATE
> Task :app-bootstrap:functionalTest UP-TO-DATE
> Task :app-bootstrap:spotbugsConditionalTransportTest UP-TO-DATE
> Task :app-bootstrap:spotbugsFunctionalTest UP-TO-DATE
> Task :app-bootstrap:spotbugsMain UP-TO-DATE
> Task :app-bootstrap:spotbugsSampleOffTest UP-TO-DATE
> Task :app-bootstrap:spotbugsTest UP-TO-DATE
> Task :app-bootstrap:spotlessJava UP-TO-DATE
> Task :app-bootstrap:spotlessJavaCheck UP-TO-DATE
> Task :app-bootstrap:spotlessCheck UP-TO-DATE
> Task :app-bootstrap:check
> Task :verifyApplicationCoreDependencyPurity
verifyApplicationCoreDependencyPurity: OK — application-core production declarations are project-only and application classpaths contain no Spring/logging/metrics frameworks.
> Task :application-core:checkstyleMain UP-TO-DATE
> Task :application-core:compileTestJava UP-TO-DATE
> Task :application-core:processTestResources NO-SOURCE
> Task :application-core:testClasses UP-TO-DATE
> Task :application-core:checkstyleTest UP-TO-DATE
> Task :application-core:spotbugsMain UP-TO-DATE
> Task :application-core:spotbugsTest UP-TO-DATE
> Task :application-core:spotlessJava UP-TO-DATE
> Task :application-core:spotlessJavaCheck UP-TO-DATE
> Task :application-core:spotlessCheck UP-TO-DATE
> Task :application-core:test UP-TO-DATE
> Task :application-core:check
> Task :domain-core:checkstyleMain UP-TO-DATE
> Task :domain-core:compileTestJava NO-SOURCE
> Task :domain-core:processTestResources NO-SOURCE
> Task :domain-core:testClasses UP-TO-DATE
> Task :domain-core:checkstyleTest NO-SOURCE
> Task :domain-core:spotbugsMain UP-TO-DATE
> Task :domain-core:spotbugsTest NO-SOURCE
> Task :domain-core:spotlessJava UP-TO-DATE
> Task :domain-core:spotlessJavaCheck UP-TO-DATE
> Task :domain-core:spotlessCheck UP-TO-DATE
> Task :domain-core:test NO-SOURCE
> Task :domain-core:check
> Task :sample-portfolio:checkstyleMain UP-TO-DATE
> Task :sample-portfolio:compileTestJava UP-TO-DATE
> Task :sample-portfolio:processTestResources UP-TO-DATE
> Task :sample-portfolio:testClasses UP-TO-DATE
> Task :sample-portfolio:compilePosterImageMigrationTestJava UP-TO-DATE
> Task :sample-portfolio:processPosterImageMigrationTestResources NO-SOURCE
> Task :sample-portfolio:posterImageMigrationTestClasses UP-TO-DATE
> Task :sample-portfolio:checkstylePosterImageMigrationTest UP-TO-DATE
> Task :sample-portfolio:checkstyleTest UP-TO-DATE
> Task :sample-portfolio:spotbugsMain UP-TO-DATE
> Task :sample-portfolio:spotbugsPosterImageMigrationTest UP-TO-DATE
> Task :sample-portfolio:spotbugsTest UP-TO-DATE
> Task :sample-portfolio:spotlessJava UP-TO-DATE
> Task :sample-portfolio:spotlessJavaCheck UP-TO-DATE
> Task :sample-portfolio:spotlessCheck UP-TO-DATE
> Task :sample-portfolio:test UP-TO-DATE
> Task :sample-portfolio:check
> Task :shared-contract:compileEdgeRateLimitContractTestJava UP-TO-DATE
> Task :shared-contract:processEdgeRateLimitContractTestResources NO-SOURCE
> Task :shared-contract:edgeRateLimitContractTestClasses UP-TO-DATE
> Task :shared-contract:checkstyleEdgeRateLimitContractTest UP-TO-DATE
> Task :shared-contract:checkstyleMain UP-TO-DATE
> Task :shared-contract:compileTestJava UP-TO-DATE
> Task :shared-contract:processTestResources NO-SOURCE
> Task :shared-contract:testClasses UP-TO-DATE
> Task :shared-contract:checkstyleTest UP-TO-DATE
> Task :shared-contract:spotbugsEdgeRateLimitContractTest UP-TO-DATE
> Task :shared-contract:spotbugsMain UP-TO-DATE
> Task :shared-contract:spotbugsTest UP-TO-DATE
> Task :shared-contract:spotlessJava UP-TO-DATE
> Task :shared-contract:spotlessJavaCheck UP-TO-DATE
> Task :shared-contract:spotlessCheck UP-TO-DATE
> Task :shared-contract:test UP-TO-DATE
> Task :shared-contract:check
> Task :messaging:messaging-admin-api:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-admin-api:compileTestJava UP-TO-DATE
> Task :messaging:messaging-admin-api:processTestResources NO-SOURCE
> Task :messaging:messaging-admin-api:testClasses UP-TO-DATE
> Task :messaging:messaging-admin-api:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-admin-api:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-admin-api:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-admin-api:spotlessJava UP-TO-DATE
> Task :messaging:messaging-admin-api:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-admin-api:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-admin-api:test UP-TO-DATE
> Task :messaging:messaging-admin-api:check
> Task :messaging:messaging-admin-runtime:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-admin-runtime:compileTestJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:processTestResources NO-SOURCE
> Task :messaging:messaging-admin-runtime:testClasses UP-TO-DATE
> Task :messaging:messaging-admin-runtime:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-admin-runtime:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-admin-runtime:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-admin-runtime:spotlessJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-admin-runtime:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-admin-runtime:test UP-TO-DATE
> Task :messaging:messaging-admin-runtime:check
> Task :messaging:messaging-claim-check:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-claim-check:compileTestJava UP-TO-DATE
> Task :messaging:messaging-claim-check:processTestResources NO-SOURCE
> Task :messaging:messaging-claim-check:testClasses UP-TO-DATE
> Task :messaging:messaging-claim-check:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-claim-check:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-claim-check:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-claim-check:spotlessJava UP-TO-DATE
> Task :messaging:messaging-claim-check:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-claim-check:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-claim-check:test UP-TO-DATE
> Task :messaging:messaging-claim-check:check
> Task :messaging:messaging-cloudevents:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-cloudevents:compileTestJava UP-TO-DATE
> Task :messaging:messaging-cloudevents:processTestResources NO-SOURCE
> Task :messaging:messaging-cloudevents:testClasses UP-TO-DATE
> Task :messaging:messaging-cloudevents:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-cloudevents:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-cloudevents:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-cloudevents:spotlessJava UP-TO-DATE
> Task :messaging:messaging-cloudevents:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-cloudevents:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-cloudevents:test UP-TO-DATE
> Task :messaging:messaging-cloudevents:check
> Task :messaging:messaging-core-api:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-core-api:compileTestJava UP-TO-DATE
> Task :messaging:messaging-core-api:processTestResources NO-SOURCE
> Task :messaging:messaging-core-api:testClasses UP-TO-DATE
> Task :messaging:messaging-core-api:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-core-api:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-core-api:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-core-api:spotlessJava UP-TO-DATE
> Task :messaging:messaging-core-api:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-core-api:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-core-api:test UP-TO-DATE
> Task :messaging:messaging-core-api:check
> Task :messaging:messaging-inbox-jdbc-postgresql:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-testkit:compileJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:compileTestJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:processTestResources NO-SOURCE
> Task :messaging:messaging-inbox-jdbc-postgresql:testClasses UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-testkit:processResources UP-TO-DATE
> Task :messaging:messaging-testkit:classes UP-TO-DATE
> Task :messaging:messaging-testkit:jar UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:spotlessJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:test UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:check
> Task :messaging:messaging-kafka:compileTestJava UP-TO-DATE
> Task :messaging:messaging-kafka:processTestResources NO-SOURCE
> Task :messaging:messaging-kafka:testClasses UP-TO-DATE
> Task :messaging:messaging-kafka:compileJmhJava UP-TO-DATE
> Task :messaging:messaging-kafka:processJmhResources NO-SOURCE
> Task :messaging:messaging-kafka:jmhClasses UP-TO-DATE
> Task :messaging:messaging-kafka:checkstyleJmh SKIPPED
> Task :messaging:messaging-kafka:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-kafka:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-kafka:spotbugsJmh SKIPPED
> Task :messaging:messaging-kafka:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-kafka:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-kafka:spotlessJava UP-TO-DATE
> Task :messaging:messaging-kafka:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-kafka:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-kafka:test UP-TO-DATE
> Task :messaging:messaging-kafka:check
> Task :messaging:messaging-kafka-share-experimental:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:processResources NO-SOURCE
> Task :messaging:messaging-kafka-share-experimental:classes UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:compileTestJava UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:processTestResources NO-SOURCE
> Task :messaging:messaging-kafka-share-experimental:testClasses UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:spotlessJava UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:test UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:check
> Task :messaging:messaging-nats-experimental:compileJava UP-TO-DATE
> Task :messaging:messaging-nats-experimental:processResources NO-SOURCE
> Task :messaging:messaging-nats-experimental:classes UP-TO-DATE
> Task :messaging:messaging-nats-experimental:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-nats-experimental:compileTestJava UP-TO-DATE
> Task :messaging:messaging-nats-experimental:processTestResources NO-SOURCE
> Task :messaging:messaging-nats-experimental:testClasses UP-TO-DATE
> Task :messaging:messaging-nats-experimental:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-nats-experimental:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-nats-experimental:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-nats-experimental:spotlessJava UP-TO-DATE
> Task :messaging:messaging-nats-experimental:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-nats-experimental:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-nats-experimental:test UP-TO-DATE
> Task :messaging:messaging-nats-experimental:check
> Task :messaging:messaging-observability:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-observability:compileTestJava UP-TO-DATE
> Task :messaging:messaging-observability:processTestResources NO-SOURCE
> Task :messaging:messaging-observability:testClasses UP-TO-DATE
> Task :messaging:messaging-observability:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-observability:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-observability:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-observability:spotlessJava UP-TO-DATE
> Task :messaging:messaging-observability:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-observability:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-observability:test UP-TO-DATE
> Task :messaging:messaging-observability:check
> Task :messaging:messaging-outbox-jdbc-postgresql:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:compileTestJava UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:processTestResources NO-SOURCE
> Task :messaging:messaging-outbox-jdbc-postgresql:testClasses UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:spotlessJava UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:test UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:check
> Task :messaging:messaging-policy:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-policy:compileTestJava UP-TO-DATE
> Task :messaging:messaging-policy:processTestResources NO-SOURCE
> Task :messaging:messaging-policy:testClasses UP-TO-DATE
> Task :messaging:messaging-policy:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-policy:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-policy:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-policy:spotlessJava UP-TO-DATE
> Task :messaging:messaging-policy:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-policy:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-policy:test UP-TO-DATE
> Task :messaging:messaging-policy:check
> Task :messaging:messaging-pulsar-experimental:compileJava UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:processResources NO-SOURCE
> Task :messaging:messaging-pulsar-experimental:classes UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:compileTestJava UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:processTestResources NO-SOURCE
> Task :messaging:messaging-pulsar-experimental:testClasses UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:spotlessJava UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:test UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:check
> Task :messaging:messaging-rabbit:compileTestJava UP-TO-DATE
> Task :messaging:messaging-rabbit:processTestResources NO-SOURCE
> Task :messaging:messaging-rabbit:testClasses UP-TO-DATE
> Task :messaging:messaging-rabbit:compileJmhJava UP-TO-DATE
> Task :messaging:messaging-rabbit:processJmhResources NO-SOURCE
> Task :messaging:messaging-rabbit:jmhClasses UP-TO-DATE
> Task :messaging:messaging-rabbit:checkstyleJmh SKIPPED
> Task :messaging:messaging-rabbit:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-rabbit:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-rabbit:spotbugsJmh SKIPPED
> Task :messaging:messaging-rabbit:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-rabbit:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-rabbit:spotlessJava UP-TO-DATE
> Task :messaging:messaging-rabbit:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-rabbit:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-rabbit:test UP-TO-DATE
> Task :messaging:messaging-rabbit:check
> Task :messaging:messaging-reliability-api:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-reliability-api:compileTestJava NO-SOURCE
> Task :messaging:messaging-reliability-api:processTestResources NO-SOURCE
> Task :messaging:messaging-reliability-api:testClasses UP-TO-DATE
> Task :messaging:messaging-reliability-api:checkstyleTest NO-SOURCE
> Task :messaging:messaging-reliability-api:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-reliability-api:spotbugsTest NO-SOURCE
> Task :messaging:messaging-reliability-api:spotlessJava UP-TO-DATE
> Task :messaging:messaging-reliability-api:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-reliability-api:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-reliability-api:test NO-SOURCE
> Task :messaging:messaging-reliability-api:check
> Task :messaging:messaging-runtime-core:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-runtime-core:compileTestJava UP-TO-DATE
> Task :messaging:messaging-runtime-core:processTestResources NO-SOURCE
> Task :messaging:messaging-runtime-core:testClasses UP-TO-DATE
> Task :messaging:messaging-runtime-core:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-runtime-core:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-runtime-core:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-runtime-core:spotlessJava UP-TO-DATE
> Task :messaging:messaging-runtime-core:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-runtime-core:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-runtime-core:test UP-TO-DATE
> Task :messaging:messaging-runtime-core:check
> Task :messaging:messaging-schema-api:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-schema-api:compileTestJava UP-TO-DATE
> Task :messaging:messaging-schema-api:processTestResources NO-SOURCE
> Task :messaging:messaging-schema-api:testClasses UP-TO-DATE
> Task :messaging:messaging-schema-api:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-schema-api:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-schema-api:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-schema-api:spotlessJava UP-TO-DATE
> Task :messaging:messaging-schema-api:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-schema-api:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-schema-api:test UP-TO-DATE
> Task :messaging:messaging-schema-api:check
> Task :messaging:messaging-schema-avro:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-avro:processResources NO-SOURCE
> Task :messaging:messaging-schema-avro:classes UP-TO-DATE
> Task :messaging:messaging-schema-avro:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-schema-avro:compileTestJava UP-TO-DATE
> Task :messaging:messaging-schema-avro:processTestResources UP-TO-DATE
> Task :messaging:messaging-schema-avro:testClasses UP-TO-DATE
> Task :messaging:messaging-schema-avro:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-schema-avro:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-schema-avro:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-schema-avro:spotlessJava UP-TO-DATE
> Task :messaging:messaging-schema-avro:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-schema-avro:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-schema-avro:test UP-TO-DATE
> Task :messaging:messaging-schema-avro:check
> Task :messaging:messaging-schema-json:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-schema-json:compileTestJava UP-TO-DATE
> Task :messaging:messaging-schema-json:processTestResources NO-SOURCE
> Task :messaging:messaging-schema-json:testClasses UP-TO-DATE
> Task :messaging:messaging-schema-json:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-schema-json:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-schema-json:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-schema-json:spotlessJava UP-TO-DATE
> Task :messaging:messaging-schema-json:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-schema-json:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-schema-json:test UP-TO-DATE
> Task :messaging:messaging-schema-json:check
> Task :messaging:messaging-schema-protobuf:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:processResources NO-SOURCE
> Task :messaging:messaging-schema-protobuf:classes UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:compileTestJava UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:processTestResources NO-SOURCE
> Task :messaging:messaging-schema-protobuf:testClasses UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:spotlessJava UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:test UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:check
> Task :messaging:messaging-security:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-security:compileTestJava UP-TO-DATE
> Task :messaging:messaging-security:processTestResources NO-SOURCE
> Task :messaging:messaging-security:testClasses UP-TO-DATE
> Task :messaging:messaging-security:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-security:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-security:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-security:spotlessJava UP-TO-DATE
> Task :messaging:messaging-security:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-security:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-security:test UP-TO-DATE
> Task :messaging:messaging-security:check
> Task :messaging:messaging-spring-boot-starter:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:compileTestJava UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:processTestResources UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:testClasses UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:spotlessJava UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:test UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:check
> Task :messaging:messaging-spring-cloud-stream-bridge:compileJava UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:processResources NO-SOURCE
> Task :messaging:messaging-spring-cloud-stream-bridge:classes UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:compileTestJava UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:processTestResources NO-SOURCE
> Task :messaging:messaging-spring-cloud-stream-bridge:testClasses UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:spotlessJava UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:test UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:check
> Task :messaging:messaging-testkit:compileTestJava UP-TO-DATE
> Task :messaging:messaging-testkit:processTestResources NO-SOURCE
> Task :messaging:messaging-testkit:testClasses UP-TO-DATE
> Task :messaging:messaging-testkit:compileJmhJava UP-TO-DATE
> Task :messaging:messaging-testkit:processJmhResources NO-SOURCE
> Task :messaging:messaging-testkit:jmhClasses UP-TO-DATE
> Task :messaging:messaging-testkit:checkstyleJmh SKIPPED
> Task :messaging:messaging-testkit:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-testkit:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-testkit:spotbugsJmh SKIPPED
> Task :messaging:messaging-testkit:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-testkit:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-testkit:spotlessJava UP-TO-DATE
> Task :messaging:messaging-testkit:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-testkit:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-testkit:test UP-TO-DATE
> Task :messaging:messaging-testkit:check
> Task :messaging:messaging-transport-spi:checkstyleMain UP-TO-DATE
> Task :messaging:messaging-transport-spi:compileTestJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:processTestResources NO-SOURCE
> Task :messaging:messaging-transport-spi:testClasses UP-TO-DATE
> Task :messaging:messaging-transport-spi:checkstyleTest UP-TO-DATE
> Task :messaging:messaging-transport-spi:spotbugsMain UP-TO-DATE
> Task :messaging:messaging-transport-spi:spotbugsTest UP-TO-DATE
> Task :messaging:messaging-transport-spi:spotlessJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:spotlessJavaCheck UP-TO-DATE
> Task :messaging:messaging-transport-spi:spotlessCheck UP-TO-DATE
> Task :messaging:messaging-transport-spi:test UP-TO-DATE
> Task :messaging:messaging-transport-spi:check
> Task :adapter:inbound:graphql:checkstyleMain UP-TO-DATE
> Task :adapter:inbound:graphql:compileTestFixturesJava UP-TO-DATE
> Task :adapter:inbound:graphql:compileTestJava UP-TO-DATE
> Task :adapter:inbound:graphql:processTestResources UP-TO-DATE
> Task :adapter:inbound:graphql:testClasses UP-TO-DATE
> Task :adapter:inbound:graphql:processTestFixturesResources NO-SOURCE
> Task :adapter:inbound:graphql:testFixturesClasses UP-TO-DATE
> Task :adapter:inbound:graphql:checkstyleTestFixtures UP-TO-DATE
> Task :adapter:inbound:graphql:spotbugsMain UP-TO-DATE
> Task :adapter:inbound:graphql:testFixturesJar UP-TO-DATE
> Task :adapter:inbound:graphql:spotbugsTest UP-TO-DATE
> Task :adapter:inbound:graphql:spotbugsTestFixtures UP-TO-DATE
> Task :adapter:inbound:graphql:spotlessJava UP-TO-DATE
> Task :adapter:inbound:graphql:spotlessJavaCheck UP-TO-DATE
> Task :adapter:inbound:graphql:spotlessCheck UP-TO-DATE
> Task :adapter:inbound:graphql:test UP-TO-DATE
> Task :adapter:inbound:graphql:verifyGraphQlApiSurface
verifyGraphQlApiSurface: OK — the committed public API surface is unchanged.
> Task :adapter:inbound:graphql:verifyGraphQlProductionJar UP-TO-DATE
> Task :adapter:inbound:grpc:checkstyleMain UP-TO-DATE
> Task :adapter:inbound:grpc:compileTestJava UP-TO-DATE
> Task :adapter:inbound:grpc:processTestResources NO-SOURCE
> Task :adapter:inbound:grpc:testClasses UP-TO-DATE
> Task :adapter:inbound:grpc:checkstyleTest UP-TO-DATE
> Task :adapter:inbound:grpc:spotbugsMain UP-TO-DATE
> Task :adapter:inbound:grpc:spotbugsTest UP-TO-DATE
> Task :adapter:inbound:grpc:spotlessJava UP-TO-DATE
> Task :adapter:inbound:grpc:spotlessJavaCheck UP-TO-DATE
> Task :adapter:inbound:grpc:spotlessCheck UP-TO-DATE
> Task :adapter:inbound:grpc:test UP-TO-DATE
> Task :adapter:inbound:grpc:check
> Task :adapter:inbound:web:checkstyleMain UP-TO-DATE
> Task :adapter:inbound:web:compileTestJava UP-TO-DATE
> Task :adapter:inbound:web:processTestResources NO-SOURCE
> Task :adapter:inbound:web:testClasses UP-TO-DATE
> Task :adapter:inbound:web:checkstyleTest UP-TO-DATE
> Task :adapter:inbound:web:spotbugsMain UP-TO-DATE
> Task :adapter:inbound:web:spotbugsTest UP-TO-DATE
> Task :adapter:inbound:web:spotlessJava UP-TO-DATE
> Task :adapter:inbound:web:spotlessJavaCheck UP-TO-DATE
> Task :adapter:inbound:web:spotlessCheck UP-TO-DATE
> Task :adapter:inbound:web:test UP-TO-DATE
> Task :adapter:inbound:graphql:checkstyleTest
> Task :adapter:inbound:web:webSecurityBoundaryTest
> Task :adapter:inbound:graphql:check
> Task :adapter:inbound:web:check
> Task :adapter:inbound:websocket:checkstyleMain UP-TO-DATE
> Task :adapter:inbound:websocket:compileTestJava UP-TO-DATE
> Task :adapter:inbound:websocket:processTestResources NO-SOURCE
> Task :adapter:inbound:websocket:testClasses UP-TO-DATE
> Task :adapter:inbound:websocket:checkstyleTest UP-TO-DATE
> Task :adapter:inbound:websocket:spotbugsMain UP-TO-DATE
> Task :adapter:inbound:websocket:spotbugsTest UP-TO-DATE
> Task :adapter:inbound:websocket:spotlessJava UP-TO-DATE
> Task :adapter:inbound:websocket:spotlessJavaCheck UP-TO-DATE
> Task :adapter:inbound:websocket:spotlessCheck UP-TO-DATE
> Task :adapter:inbound:websocket:test UP-TO-DATE
> Task :adapter:inbound:websocket:check
> Task :adapter:outbound:cache-redis:checkstyleMain UP-TO-DATE
> Task :adapter:outbound:cache-redis:compileTestJava UP-TO-DATE
> Task :adapter:outbound:cache-redis:processTestResources UP-TO-DATE
> Task :adapter:outbound:cache-redis:testClasses UP-TO-DATE
> Task :adapter:outbound:cache-redis:checkstyleTest UP-TO-DATE
> Task :adapter:outbound:cache-redis:spotbugsMain UP-TO-DATE
> Task :adapter:outbound:cache-redis:spotbugsTest UP-TO-DATE
> Task :adapter:outbound:cache-redis:spotlessJava UP-TO-DATE
> Task :adapter:outbound:cache-redis:spotlessJavaCheck UP-TO-DATE
> Task :adapter:outbound:cache-redis:spotlessCheck UP-TO-DATE
> Task :adapter:outbound:cache-redis:test UP-TO-DATE
> Task :adapter:outbound:cache-redis:check
> Task :adapter:outbound:fileserver:compileTestJava UP-TO-DATE
> Task :adapter:outbound:fileserver:processTestResources NO-SOURCE
> Task :adapter:outbound:fileserver:testClasses UP-TO-DATE
> Task :adapter:outbound:fileserver:checkstyleMain
> Task :adapter:outbound:fileserver:spotlessJava
> Task :adapter:outbound:fileserver:spotlessJavaCheck
> Task :adapter:outbound:fileserver:spotlessCheck
> Task :adapter:outbound:fileserver:test UP-TO-DATE
> Task :adapter:outbound:httpclient:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:httpclient:processTestkitResources NO-SOURCE
> Task :adapter:outbound:httpclient:testkitClasses UP-TO-DATE
> Task :adapter:outbound:fileserver:checkstyleTest
> Task :adapter:outbound:httpclient:compileHttpClientPerformanceTestJava
> Task :adapter:outbound:httpclient:processHttpClientPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:httpclient:httpClientPerformanceTestClasses
> Task :adapter:outbound:httpclient:checkstyleHttpClientPerformanceTest
> Task :adapter:outbound:fileserver:spotbugsMain
> Task :adapter:outbound:fileserver:spotbugsTest
> Task :adapter:outbound:httpclient:compileJmhJava
> Task :adapter:outbound:httpclient:processJmhResources NO-SOURCE
> Task :adapter:outbound:httpclient:jmhClasses
> Task :adapter:outbound:httpclient:compileTestJava UP-TO-DATE
> Task :adapter:outbound:httpclient:processTestResources NO-SOURCE
> Task :adapter:outbound:httpclient:testClasses UP-TO-DATE
> Task :adapter:outbound:httpclient:checkstyleJmh
> Task :adapter:outbound:httpclient:httpClientBlockHoundTest
OpenJDK 64-Bit Server VM warning: Option AllowRedefinitionToAddDeleteMethods was deprecated in version 13.0 and will likely be removed in a future release.
> Task :adapter:outbound:httpclient:checkstyleMain
> Task :adapter:outbound:httpclient:checkstyleTestkit
> Task :adapter:outbound:httpclient:checkstyleTest
> Task :adapter:outbound:httpclient:httpClientSecurityTest
> Task :adapter:outbound:httpclient:httpClientStableContractTest
> Task :adapter:outbound:httpclient:spotbugsJmh SKIPPED
> Task :adapter:outbound:httpclient:spotlessJava
> Task :adapter:outbound:httpclient:spotlessJavaCheck
> Task :adapter:outbound:httpclient:spotlessCheck
> Task :adapter:outbound:httpclient:spring62ApiSurfaceScan
> Task :adapter:outbound:httpclient:test UP-TO-DATE
> Task :adapter:outbound:identifier:compileTestJava UP-TO-DATE
> Task :adapter:outbound:identifier:compileTestGroovy UP-TO-DATE
> Task :adapter:outbound:identifier:processTestResources NO-SOURCE
> Task :adapter:outbound:identifier:testClasses UP-TO-DATE
> Task :adapter:outbound:identifier:spotlessJava
> Task :adapter:outbound:httpclient:spotbugsHttpClientPerformanceTest
> Task :adapter:outbound:identifier:spotlessJavaCheck
> Task :adapter:outbound:identifier:spotlessCheck
> Task :adapter:outbound:identifier:test UP-TO-DATE
> Task :adapter:outbound:messaging:compileTestJava UP-TO-DATE
> Task :adapter:outbound:messaging:processTestResources UP-TO-DATE
> Task :adapter:outbound:messaging:testClasses UP-TO-DATE
> Task :adapter:outbound:identifier:checkstyleTest
> Task :adapter:outbound:identifier:checkstyleMain
> Task :adapter:outbound:messaging:spotlessJava
> Task :adapter:outbound:messaging:spotlessJavaCheck
> Task :adapter:outbound:messaging:spotlessCheck
> Task :adapter:outbound:messaging:test UP-TO-DATE
> Task :adapter:outbound:messaging:verifyJsonSchemaRuntimeGraph
> Task :adapter:outbound:notification:compileTestJava UP-TO-DATE
> Task :adapter:outbound:notification:processTestResources UP-TO-DATE
> Task :adapter:outbound:notification:testClasses UP-TO-DATE
> Task :adapter:outbound:fileserver:check
> Task :adapter:outbound:messaging:checkstyleTest
> Task :adapter:outbound:messaging:checkstyleMain
> Task :adapter:outbound:httpclient:spotbugsMain
> Task :adapter:outbound:httpclient:spotbugsTest
> Task :adapter:outbound:httpclient:spotbugsTestkit
> Task :adapter:outbound:notification:checkstyleTest
> Task :adapter:outbound:notification:spotlessJava
> Task :adapter:outbound:notification:spotlessJavaCheck
> Task :adapter:outbound:notification:spotlessCheck
> Task :adapter:outbound:notification:test UP-TO-DATE
> Task :adapter:outbound:notification:verifyDependencyPolicy
> Task :adapter:outbound:objectstorage:compileTestJava UP-TO-DATE
> Task :adapter:outbound:objectstorage:processTestResources UP-TO-DATE
> Task :adapter:outbound:objectstorage:testClasses UP-TO-DATE
> Task :adapter:outbound:notification:checkstyleMain
> Task :adapter:outbound:objectstorage:compileObjectStorageAwsQualificationTestJava
> Task :adapter:outbound:objectstorage:processObjectStorageAwsQualificationTestResources NO-SOURCE
> Task :adapter:outbound:objectstorage:objectStorageAwsQualificationTestClasses
> Task :adapter:outbound:objectstorage:checkstyleObjectStorageAwsQualificationTest
> Task :adapter:outbound:objectstorage:checkstyleMain
> Task :adapter:outbound:identifier:spotbugsMain
> Task :adapter:outbound:identifier:spotbugsTest
> Task :adapter:outbound:messaging:spotbugsMain
> Task :adapter:outbound:messaging:spotbugsTest
> Task :adapter:outbound:notification:spotbugsMain
> Task :adapter:outbound:notification:spotbugsTest
> Task :adapter:outbound:objectstorage:compileObjectStorageMinioContractTestJava
> Task :adapter:outbound:objectstorage:processObjectStorageMinioContractTestResources NO-SOURCE
> Task :adapter:outbound:objectstorage:objectStorageMinioContractTestClasses
> Task :adapter:outbound:objectstorage:checkstyleObjectStorageMinioContractTest
> Task :adapter:outbound:objectstorage:compileObjectStorageMinioFaultTestJava
> Task :adapter:outbound:objectstorage:processObjectStorageMinioFaultTestResources NO-SOURCE
> Task :adapter:outbound:objectstorage:objectStorageMinioFaultTestClasses
> Task :adapter:outbound:objectstorage:checkstyleObjectStorageMinioFaultTest
> Task :adapter:outbound:identifier:check
> Task :adapter:outbound:objectstorage:checkstyleTest
> Task :adapter:outbound:objectstorage:spotlessJava
> Task :adapter:outbound:objectstorage:spotlessJavaCheck
> Task :adapter:outbound:objectstorage:spotlessCheck
> Task :adapter:outbound:objectstorage:test UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJpaPlatformPerformanceTestJava
> Task :adapter:outbound:persistence-jpa:processJpaPlatformPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPerformanceTestClasses
> Task :adapter:outbound:persistence-jpa:checkstyleJpaPlatformPerformanceTest
> Task :adapter:outbound:persistence-jpa:checkstyleMain
> Task :adapter:outbound:objectstorage:spotbugsMain
> Task :adapter:outbound:objectstorage:spotbugsObjectStorageAwsQualificationTest
> Task :adapter:outbound:objectstorage:spotbugsObjectStorageMinioContractTest
> Task :adapter:outbound:objectstorage:spotbugsObjectStorageMinioFaultTest
> Task :adapter:outbound:objectstorage:spotbugsTest
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses
> Task :adapter:outbound:persistence-jpa:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testClasses UP-TO-DATE
> Task :adapter:outbound:notification:check
> Task :adapter:outbound:persistence-jpa:checkstyleTestkit
> Task :adapter:outbound:persistence-jpa:checkstyleTest
> Task :adapter:outbound:persistence-jpa:checkstylePostgresqlIntegrationTest
> Task :adapter:outbound:persistence-jpa:spotlessJava
> Task :adapter:outbound:persistence-jpa:spotlessJavaCheck
> Task :adapter:outbound:persistence-jpa:spotlessCheck
> Task :adapter:outbound:persistence-jpa:test UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:verifyJpaEvidenceHarnessContract
verifyJpaEvidenceHarnessContract: OK — skip, dirty/local R2, and content mutation fail closed.
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileMongoPerformanceTestJava
> Task :adapter:outbound:persistence-mongo:processMongoPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:mongoPerformanceTestClasses
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:messaging:check
> Task :adapter:outbound:persistence-mongo:checkstyleMongoPerformanceTest
> Task :adapter:outbound:persistence-jpa:spotbugsJpaPlatformPerformanceTest
> Task :adapter:outbound:persistence-jpa:spotbugsMain
> Task :adapter:outbound:persistence-mongo:checkstyleTestkit
> Task :adapter:outbound:persistence-jpa:spotbugsPostgresqlIntegrationTest
> Task :adapter:outbound:persistence-jpa:spotbugsTest
> Task :adapter:outbound:persistence-jpa:spotbugsTestkit
> Task :adapter:outbound:persistence-mongo:checkstyleMain
> Task :adapter:outbound:persistence-mongo:checkstyleTest
> Task :adapter:outbound:persistence-mongo:mongoStableContractTest
> Task :adapter:outbound:persistence-mongo:spotlessJava
> Task :adapter:outbound:persistence-mongo:spotlessJavaCheck
> Task :adapter:outbound:persistence-mongo:spotlessCheck
> Task :adapter:outbound:persistence-mongo:test UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:verifyMongoApiSurface
verifyMongoApiSurface: OK — the committed public API surface is unchanged.
> Task :adapter:outbound:persistence-mongo:verifyMongoReleaseContractLanes
> Task :adapter:outbound:httpclient:check
> Task :adapter:outbound:objectstorage:check
> Task :adapter:outbound:persistence-mongo:verifyMongoTestLaneDisjointness
> Task :adapter:outbound:support:compileTestJava UP-TO-DATE
> Task :adapter:outbound:support:processTestResources NO-SOURCE
> Task :adapter:outbound:support:testClasses UP-TO-DATE
> Task :adapter:outbound:support:spotlessJava
> Task :adapter:outbound:support:spotlessJavaCheck
> Task :adapter:outbound:support:spotlessCheck
> Task :adapter:outbound:support:test UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:check
> Task :adapter:outbound:support:checkstyleMain
> Task :adapter:outbound:support:checkstyleTest
> Task :adapter:outbound:persistence-mongo:spotbugsMongoPerformanceTest
> Task :adapter:outbound:persistence-mongo:spotbugsMain
> Task :adapter:outbound:persistence-mongo:spotbugsTest
> Task :adapter:outbound:persistence-mongo:spotbugsTestkit
> Task :adapter:outbound:support:spotbugsTest
> Task :adapter:outbound:support:spotbugsMain
> Task :adapter:outbound:support:check
> Task :adapter:outbound:persistence-mongo:check
BUILD SUCCESSFUL in 5m 42s
547 actionable tasks: 117 executed, 430 up-to-date
exit=0
@@ -0,0 +1,265 @@
$ ./gradlew clean compileJava compileTestJava --warning-mode=fail --no-daemon --console=plain
run-at: 2026-08-20T01:18:16Z
To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/9.0.0/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation.
Daemon will be stopped at the end of the build
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :app-bootstrap:clean
> Task :application-core:clean
> Task :domain-core:clean
> Task :sample-portfolio:clean
> Task :shared-contract:clean
> Task :messaging:messaging-admin-api:clean
> Task :messaging:messaging-admin-runtime:clean
> Task :messaging:messaging-claim-check:clean
> Task :messaging:messaging-cloudevents:clean
> Task :messaging:messaging-core-api:clean
> Task :messaging:messaging-inbox-jdbc-postgresql:clean
> Task :messaging:messaging-kafka:clean
> Task :messaging:messaging-kafka-share-experimental:clean
> Task :messaging:messaging-nats-experimental:clean
> Task :messaging:messaging-observability:clean
> Task :messaging:messaging-outbox-jdbc-postgresql:clean
> Task :messaging:messaging-policy:clean
> Task :messaging:messaging-pulsar-experimental:clean
> Task :messaging:messaging-rabbit:clean
> Task :messaging:messaging-reliability-api:clean
> Task :messaging:messaging-runtime-core:clean
> Task :messaging:messaging-schema-api:clean
> Task :messaging:messaging-schema-avro:clean
> Task :messaging:messaging-schema-json:clean
> Task :messaging:messaging-schema-protobuf:clean
> Task :messaging:messaging-security:clean
> Task :messaging:messaging-spring-boot-starter:clean
> Task :messaging:messaging-spring-cloud-stream-bridge:clean
> Task :messaging:messaging-testkit:clean
> Task :messaging:messaging-transport-spi:clean
> Task :adapter:inbound:graphql:clean
> Task :adapter:inbound:grpc:clean
> Task :adapter:inbound:web:clean
> Task :adapter:inbound:websocket:clean
> Task :adapter:outbound:cache-redis:clean
> Task :adapter:outbound:fileserver:clean
> Task :adapter:outbound:httpclient:clean
> Task :adapter:outbound:identifier:clean
> Task :adapter:outbound:messaging:clean
> Task :adapter:outbound:notification:clean
> Task :adapter:outbound:objectstorage:clean
> Task :adapter:outbound:persistence-jpa:clean
> Task :adapter:outbound:persistence-mongo:clean
> Task :adapter:outbound:support:clean
> Task :shared-contract:compileJava
> Task :shared-contract:processResources
> Task :shared-contract:classes
> Task :shared-contract:jar
> Task :application-core:compileJava
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes
> Task :application-core:jar
> Task :domain-core:compileJava
> Task :domain-core:processResources NO-SOURCE
> Task :domain-core:classes
> Task :domain-core:jar
> Task :messaging:messaging-core-api:compileJava
> Task :messaging:messaging-observability:compileJava
> Task :messaging:messaging-schema-api:compileJava
> Task :messaging:messaging-policy:compileJava
> Task :messaging:messaging-reliability-api:compileJava
> Task :messaging:messaging-security:compileJava
> Task :messaging:messaging-admin-api:compileJava
> Task :messaging:messaging-transport-spi:compileJava
> Task :messaging:messaging-admin-runtime:compileJava
> Task :messaging:messaging-claim-check:compileJava
> Task :messaging:messaging-cloudevents:compileJava
> Task :messaging:messaging-inbox-jdbc-postgresql:compileJava
> Task :messaging:messaging-kafka:compileJava
> Task :messaging:messaging-outbox-jdbc-postgresql:compileJava
> Task :messaging:messaging-rabbit:compileJava
> Task :messaging:messaging-runtime-core:compileJava
> Task :messaging:messaging-schema-json:compileJava
> Task :messaging:messaging-spring-boot-starter:compileJava
> Task :adapter:inbound:graphql:compileJava
> Task :adapter:inbound:graphql:processResources
> Task :adapter:inbound:graphql:classes
> Task :adapter:inbound:graphql:jar
> Task :adapter:inbound:web:compileJava
> Task :adapter:inbound:web:processResources NO-SOURCE
> Task :adapter:inbound:web:classes
> Task :adapter:inbound:web:jar
> Task :adapter:outbound:support:compileJava
> Task :adapter:outbound:support:processResources NO-SOURCE
> Task :adapter:outbound:support:classes
> Task :adapter:outbound:support:jar
> Task :adapter:outbound:cache-redis:compileJava
> Task :adapter:outbound:cache-redis:processResources
> Task :adapter:outbound:cache-redis:classes
> Task :adapter:outbound:cache-redis:jar
> Task :adapter:outbound:fileserver:compileJava
> Task :adapter:outbound:fileserver:processResources NO-SOURCE
> Task :adapter:outbound:fileserver:classes
> Task :adapter:outbound:fileserver:jar
> Task :adapter:outbound:httpclient:compileJava
> Task :adapter:outbound:httpclient:processResources NO-SOURCE
> Task :adapter:outbound:httpclient:classes
> Task :adapter:outbound:httpclient:jar
> Task :adapter:outbound:identifier:compileJava
> Task :adapter:outbound:identifier:compileGroovy NO-SOURCE
> Task :adapter:outbound:identifier:processResources NO-SOURCE
> Task :adapter:outbound:identifier:classes
> Task :adapter:outbound:identifier:jar
> Task :adapter:outbound:messaging:compileJava
> Task :adapter:outbound:messaging:processResources
> Task :adapter:outbound:messaging:classes
> Task :adapter:outbound:messaging:jar
> Task :adapter:outbound:notification:compileJava
> Task :adapter:outbound:notification:processResources NO-SOURCE
> Task :adapter:outbound:notification:classes
> Task :adapter:outbound:notification:jar
> Task :adapter:outbound:persistence-jpa:compileJava
> Task :adapter:outbound:persistence-jpa:processResources
> Task :adapter:outbound:persistence-jpa:classes
> Task :adapter:outbound:persistence-jpa:jar
> Task :adapter:outbound:persistence-mongo:compileJava
> Task :adapter:outbound:persistence-mongo:processResources
> Task :adapter:outbound:persistence-mongo:classes
> Task :adapter:outbound:persistence-mongo:jar
> Task :app-bootstrap:compileJava
> Task :sample-portfolio:compileJava
> Task :messaging:messaging-kafka-share-experimental:compileJava
> Task :messaging:messaging-nats-experimental:compileJava
> Task :messaging:messaging-pulsar-experimental:compileJava
> Task :messaging:messaging-schema-avro:compileJava
> Task :messaging:messaging-schema-protobuf:compileJava
> Task :messaging:messaging-spring-cloud-stream-bridge:compileJava
> Task :messaging:messaging-testkit:compileJava
> Task :adapter:inbound:grpc:compileJava
> Task :adapter:inbound:websocket:compileJava
> Task :adapter:outbound:objectstorage:compileJava
> Task :app-bootstrap:processResources
> Task :app-bootstrap:classes
> Task :sample-portfolio:processResources
> Task :sample-portfolio:classes
> Task :sample-portfolio:jar
> Task :adapter:outbound:persistence-jpa:compileTestkitJava
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses
> Task :adapter:outbound:persistence-jpa:testkitJar
> Task :app-bootstrap:compileTestJava
> Task :application-core:compileTestJava
> Task :domain-core:compileTestJava NO-SOURCE
> Task :sample-portfolio:compileTestJava
> Task :shared-contract:compileTestJava
> Task :messaging:messaging-admin-api:processResources NO-SOURCE
> Task :messaging:messaging-admin-api:classes
> Task :messaging:messaging-admin-api:compileTestJava
> Task :messaging:messaging-admin-runtime:processResources NO-SOURCE
> Task :messaging:messaging-admin-runtime:classes
> Task :messaging:messaging-admin-runtime:compileTestJava
> Task :messaging:messaging-claim-check:processResources NO-SOURCE
> Task :messaging:messaging-claim-check:classes
> Task :messaging:messaging-claim-check:compileTestJava
> Task :messaging:messaging-cloudevents:processResources NO-SOURCE
> Task :messaging:messaging-cloudevents:classes
> Task :messaging:messaging-cloudevents:compileTestJava
> Task :messaging:messaging-core-api:processResources NO-SOURCE
> Task :messaging:messaging-core-api:classes
> Task :messaging:messaging-core-api:compileTestJava
> Task :messaging:messaging-inbox-jdbc-postgresql:processResources
> Task :messaging:messaging-inbox-jdbc-postgresql:classes
> Task :messaging:messaging-inbox-jdbc-postgresql:compileTestJava
> Task :messaging:messaging-kafka:processResources NO-SOURCE
> Task :messaging:messaging-kafka:classes
> Task :messaging:messaging-kafka:compileTestJava
> Task :messaging:messaging-kafka-share-experimental:processResources NO-SOURCE
> Task :messaging:messaging-kafka-share-experimental:classes
> Task :messaging:messaging-kafka-share-experimental:compileTestJava
> Task :messaging:messaging-nats-experimental:processResources NO-SOURCE
> Task :messaging:messaging-nats-experimental:classes
> Task :messaging:messaging-nats-experimental:compileTestJava
> Task :messaging:messaging-observability:processResources NO-SOURCE
> Task :messaging:messaging-observability:classes
> Task :messaging:messaging-observability:compileTestJava
> Task :messaging:messaging-outbox-jdbc-postgresql:processResources
> Task :messaging:messaging-outbox-jdbc-postgresql:classes
> Task :messaging:messaging-outbox-jdbc-postgresql:compileTestJava
> Task :messaging:messaging-policy:processResources NO-SOURCE
> Task :messaging:messaging-policy:classes
> Task :messaging:messaging-policy:compileTestJava
> Task :messaging:messaging-pulsar-experimental:processResources NO-SOURCE
> Task :messaging:messaging-pulsar-experimental:classes
> Task :messaging:messaging-pulsar-experimental:compileTestJava
> Task :messaging:messaging-rabbit:processResources NO-SOURCE
> Task :messaging:messaging-rabbit:classes
> Task :messaging:messaging-rabbit:compileTestJava
> Task :messaging:messaging-reliability-api:processResources NO-SOURCE
> Task :messaging:messaging-reliability-api:classes
> Task :messaging:messaging-reliability-api:compileTestJava NO-SOURCE
> Task :messaging:messaging-runtime-core:processResources NO-SOURCE
> Task :messaging:messaging-runtime-core:classes
> Task :messaging:messaging-runtime-core:compileTestJava
> Task :messaging:messaging-schema-api:processResources NO-SOURCE
> Task :messaging:messaging-schema-api:classes
> Task :messaging:messaging-schema-api:compileTestJava
> Task :messaging:messaging-schema-avro:processResources NO-SOURCE
> Task :messaging:messaging-schema-avro:classes
> Task :messaging:messaging-schema-avro:compileTestJava
> Task :messaging:messaging-schema-json:processResources NO-SOURCE
> Task :messaging:messaging-schema-json:classes
> Task :messaging:messaging-schema-json:compileTestJava
> Task :messaging:messaging-schema-protobuf:processResources NO-SOURCE
> Task :messaging:messaging-schema-protobuf:classes
> Task :messaging:messaging-schema-protobuf:compileTestJava
> Task :messaging:messaging-security:processResources NO-SOURCE
> Task :messaging:messaging-security:classes
> Task :messaging:messaging-security:compileTestJava
> Task :messaging:messaging-spring-boot-starter:processResources
> Task :messaging:messaging-spring-boot-starter:classes
> Task :messaging:messaging-spring-boot-starter:compileTestJava
> Task :messaging:messaging-spring-cloud-stream-bridge:processResources NO-SOURCE
> Task :messaging:messaging-spring-cloud-stream-bridge:classes
> Task :messaging:messaging-spring-cloud-stream-bridge:compileTestJava
> Task :messaging:messaging-testkit:processResources
> Task :messaging:messaging-testkit:classes
> Task :messaging:messaging-testkit:compileTestJava
> Task :messaging:messaging-transport-spi:processResources NO-SOURCE
> Task :messaging:messaging-transport-spi:classes
> Task :messaging:messaging-transport-spi:compileTestJava
> Task :adapter:inbound:graphql:compileTestFixturesJava
> Task :adapter:inbound:graphql:compileTestJava
> Task :adapter:inbound:grpc:processResources NO-SOURCE
> Task :adapter:inbound:grpc:classes
> Task :adapter:inbound:grpc:compileTestJava
> Task :adapter:inbound:web:compileTestJava
> Task :adapter:inbound:websocket:processResources NO-SOURCE
> Task :adapter:inbound:websocket:classes
> Task :adapter:inbound:websocket:compileTestJava
> Task :adapter:outbound:cache-redis:compileTestJava
> Task :adapter:outbound:fileserver:compileTestJava
> Task :adapter:outbound:httpclient:compileTestkitJava
> Task :adapter:outbound:httpclient:processTestkitResources NO-SOURCE
> Task :adapter:outbound:httpclient:testkitClasses
> Task :adapter:outbound:httpclient:compileTestJava
> Task :adapter:outbound:identifier:compileTestJava
> Task :adapter:outbound:messaging:compileTestJava
> Task :adapter:outbound:notification:compileTestJava
> Task :adapter:outbound:objectstorage:processResources NO-SOURCE
> Task :adapter:outbound:objectstorage:classes
> Task :adapter:outbound:objectstorage:compileTestJava
> Task :adapter:outbound:persistence-jpa:compileTestJava
> Task :adapter:outbound:persistence-mongo:compileTestkitJava
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses
> Task :adapter:outbound:persistence-mongo:compileTestJava
> Task :adapter:outbound:support:compileTestJava
BUILD SUCCESSFUL in 4m 48s
170 actionable tasks: 162 executed, 8 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,378 @@
$ ./gradlew test --warning-mode=fail --no-daemon --console=plain
run-at: 2026-08-20T01:33:26Z
To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/9.0.0/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation.
Daemon will be stopped at the end of the build
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :domain-core:compileJava UP-TO-DATE
> Task :domain-core:processResources NO-SOURCE
> Task :domain-core:classes UP-TO-DATE
> Task :domain-core:jar UP-TO-DATE
> Task :messaging:messaging-core-api:compileJava UP-TO-DATE
> Task :messaging:messaging-observability:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-api:compileJava UP-TO-DATE
> Task :messaging:messaging-policy:compileJava UP-TO-DATE
> Task :messaging:messaging-reliability-api:compileJava UP-TO-DATE
> Task :messaging:messaging-security:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-api:compileJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:compileJava UP-TO-DATE
> Task :messaging:messaging-claim-check:compileJava UP-TO-DATE
> Task :messaging:messaging-cloudevents:compileJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka:compileJava UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-rabbit:compileJava UP-TO-DATE
> Task :messaging:messaging-runtime-core:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-json:compileJava UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:compileJava UP-TO-DATE
> Task :adapter:inbound:graphql:compileJava UP-TO-DATE
> Task :adapter:inbound:graphql:processResources UP-TO-DATE
> Task :adapter:inbound:graphql:classes UP-TO-DATE
> Task :adapter:inbound:graphql:jar UP-TO-DATE
> Task :adapter:inbound:web:compileJava UP-TO-DATE
> Task :adapter:inbound:web:processResources NO-SOURCE
> Task :adapter:inbound:web:classes UP-TO-DATE
> Task :adapter:inbound:web:jar UP-TO-DATE
> Task :adapter:outbound:support:compileJava UP-TO-DATE
> Task :adapter:outbound:support:processResources NO-SOURCE
> Task :adapter:outbound:support:classes UP-TO-DATE
> Task :adapter:outbound:support:jar UP-TO-DATE
> Task :adapter:outbound:cache-redis:compileJava UP-TO-DATE
> Task :adapter:outbound:cache-redis:processResources UP-TO-DATE
> Task :adapter:outbound:cache-redis:classes UP-TO-DATE
> Task :adapter:outbound:cache-redis:jar UP-TO-DATE
> Task :adapter:outbound:fileserver:compileJava UP-TO-DATE
> Task :adapter:outbound:fileserver:processResources NO-SOURCE
> Task :adapter:outbound:fileserver:classes UP-TO-DATE
> Task :adapter:outbound:fileserver:jar UP-TO-DATE
> Task :adapter:outbound:httpclient:compileJava UP-TO-DATE
> Task :adapter:outbound:httpclient:processResources NO-SOURCE
> Task :adapter:outbound:httpclient:classes UP-TO-DATE
> Task :adapter:outbound:httpclient:jar UP-TO-DATE
> Task :adapter:outbound:identifier:compileJava UP-TO-DATE
> Task :adapter:outbound:identifier:compileGroovy NO-SOURCE
> Task :adapter:outbound:identifier:processResources NO-SOURCE
> Task :adapter:outbound:identifier:classes UP-TO-DATE
> Task :adapter:outbound:identifier:jar UP-TO-DATE
> Task :adapter:outbound:messaging:compileJava UP-TO-DATE
> Task :adapter:outbound:messaging:processResources UP-TO-DATE
> Task :adapter:outbound:messaging:classes UP-TO-DATE
> Task :adapter:outbound:messaging:jar UP-TO-DATE
> Task :adapter:outbound:notification:compileJava UP-TO-DATE
> Task :adapter:outbound:notification:processResources NO-SOURCE
> Task :adapter:outbound:notification:classes UP-TO-DATE
> Task :adapter:outbound:notification:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:jar UP-TO-DATE
> Task :app-bootstrap:compileJava UP-TO-DATE
> Task :app-bootstrap:processResources UP-TO-DATE
> Task :app-bootstrap:classes UP-TO-DATE
> Task :sample-portfolio:compileJava UP-TO-DATE
> Task :sample-portfolio:processResources UP-TO-DATE
> Task :sample-portfolio:classes UP-TO-DATE
> Task :sample-portfolio:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:testkitJar UP-TO-DATE
> Task :app-bootstrap:compileTestJava UP-TO-DATE
> Task :app-bootstrap:runtimeClasspathManifest UP-TO-DATE
> Task :app-bootstrap:processTestResources UP-TO-DATE
> Task :app-bootstrap:testClasses UP-TO-DATE
> Task :messaging:messaging-admin-api:processResources NO-SOURCE
> Task :messaging:messaging-admin-api:classes UP-TO-DATE
> Task :messaging:messaging-admin-api:jar UP-TO-DATE
> Task :messaging:messaging-admin-runtime:processResources NO-SOURCE
> Task :messaging:messaging-admin-runtime:classes UP-TO-DATE
> Task :messaging:messaging-admin-runtime:jar UP-TO-DATE
> Task :messaging:messaging-claim-check:processResources NO-SOURCE
> Task :messaging:messaging-claim-check:classes UP-TO-DATE
> Task :messaging:messaging-claim-check:jar UP-TO-DATE
> Task :messaging:messaging-cloudevents:processResources NO-SOURCE
> Task :messaging:messaging-cloudevents:classes UP-TO-DATE
> Task :messaging:messaging-cloudevents:jar UP-TO-DATE
> Task :messaging:messaging-core-api:processResources NO-SOURCE
> Task :messaging:messaging-core-api:classes UP-TO-DATE
> Task :messaging:messaging-core-api:jar UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:processResources UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:classes UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:jar UP-TO-DATE
> Task :messaging:messaging-kafka:processResources NO-SOURCE
> Task :messaging:messaging-kafka:classes UP-TO-DATE
> Task :messaging:messaging-kafka:jar UP-TO-DATE
> Task :messaging:messaging-observability:processResources NO-SOURCE
> Task :messaging:messaging-observability:classes UP-TO-DATE
> Task :messaging:messaging-observability:jar UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:processResources UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:classes UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:jar UP-TO-DATE
> Task :messaging:messaging-policy:processResources NO-SOURCE
> Task :messaging:messaging-policy:classes UP-TO-DATE
> Task :messaging:messaging-policy:jar UP-TO-DATE
> Task :messaging:messaging-rabbit:processResources NO-SOURCE
> Task :messaging:messaging-rabbit:classes UP-TO-DATE
> Task :messaging:messaging-rabbit:jar UP-TO-DATE
> Task :messaging:messaging-reliability-api:processResources NO-SOURCE
> Task :messaging:messaging-reliability-api:classes UP-TO-DATE
> Task :messaging:messaging-reliability-api:jar UP-TO-DATE
> Task :messaging:messaging-runtime-core:processResources NO-SOURCE
> Task :messaging:messaging-runtime-core:classes UP-TO-DATE
> Task :messaging:messaging-runtime-core:jar UP-TO-DATE
> Task :messaging:messaging-schema-api:processResources NO-SOURCE
> Task :messaging:messaging-schema-api:classes UP-TO-DATE
> Task :messaging:messaging-schema-api:jar UP-TO-DATE
> Task :messaging:messaging-schema-json:processResources NO-SOURCE
> Task :messaging:messaging-schema-json:classes UP-TO-DATE
> Task :messaging:messaging-schema-json:jar UP-TO-DATE
> Task :messaging:messaging-security:processResources NO-SOURCE
> Task :messaging:messaging-security:classes UP-TO-DATE
> Task :messaging:messaging-security:jar UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:processResources UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:classes UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:jar UP-TO-DATE
> Task :messaging:messaging-transport-spi:processResources NO-SOURCE
> Task :messaging:messaging-transport-spi:classes UP-TO-DATE
> Task :messaging:messaging-transport-spi:jar UP-TO-DATE
> Task :adapter:outbound:objectstorage:compileJava UP-TO-DATE
> Task :adapter:outbound:objectstorage:processResources NO-SOURCE
> Task :adapter:outbound:objectstorage:classes UP-TO-DATE
> Task :adapter:outbound:objectstorage:jar UP-TO-DATE
> Task :app-bootstrap:test UP-TO-DATE
> Task :application-core:compileTestJava UP-TO-DATE
> Task :application-core:processTestResources NO-SOURCE
> Task :application-core:testClasses UP-TO-DATE
> Task :application-core:test UP-TO-DATE
> Task :domain-core:compileTestJava NO-SOURCE
> Task :domain-core:processTestResources NO-SOURCE
> Task :domain-core:testClasses UP-TO-DATE
> Task :domain-core:test NO-SOURCE
> Task :sample-portfolio:compileTestJava UP-TO-DATE
> Task :sample-portfolio:processTestResources UP-TO-DATE
> Task :sample-portfolio:testClasses UP-TO-DATE
> Task :sample-portfolio:test UP-TO-DATE
> Task :shared-contract:compileTestJava UP-TO-DATE
> Task :shared-contract:processTestResources NO-SOURCE
> Task :shared-contract:testClasses UP-TO-DATE
> Task :shared-contract:test UP-TO-DATE
> Task :messaging:messaging-admin-api:compileTestJava UP-TO-DATE
> Task :messaging:messaging-admin-api:processTestResources NO-SOURCE
> Task :messaging:messaging-admin-api:testClasses UP-TO-DATE
> Task :messaging:messaging-admin-api:test UP-TO-DATE
> Task :messaging:messaging-admin-runtime:compileTestJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:processTestResources NO-SOURCE
> Task :messaging:messaging-admin-runtime:testClasses UP-TO-DATE
> Task :messaging:messaging-admin-runtime:test UP-TO-DATE
> Task :messaging:messaging-claim-check:compileTestJava UP-TO-DATE
> Task :messaging:messaging-claim-check:processTestResources NO-SOURCE
> Task :messaging:messaging-claim-check:testClasses UP-TO-DATE
> Task :messaging:messaging-claim-check:test UP-TO-DATE
> Task :messaging:messaging-cloudevents:compileTestJava UP-TO-DATE
> Task :messaging:messaging-cloudevents:processTestResources NO-SOURCE
> Task :messaging:messaging-cloudevents:testClasses UP-TO-DATE
> Task :messaging:messaging-cloudevents:test UP-TO-DATE
> Task :messaging:messaging-core-api:compileTestJava UP-TO-DATE
> Task :messaging:messaging-core-api:processTestResources NO-SOURCE
> Task :messaging:messaging-core-api:testClasses UP-TO-DATE
> Task :messaging:messaging-core-api:test UP-TO-DATE
> Task :messaging:messaging-testkit:compileJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:compileTestJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:processTestResources NO-SOURCE
> Task :messaging:messaging-inbox-jdbc-postgresql:testClasses UP-TO-DATE
> Task :messaging:messaging-testkit:processResources UP-TO-DATE
> Task :messaging:messaging-testkit:classes UP-TO-DATE
> Task :messaging:messaging-testkit:jar UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:test UP-TO-DATE
> Task :messaging:messaging-kafka:compileTestJava UP-TO-DATE
> Task :messaging:messaging-kafka:processTestResources NO-SOURCE
> Task :messaging:messaging-kafka:testClasses UP-TO-DATE
> Task :messaging:messaging-kafka:test UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:processResources NO-SOURCE
> Task :messaging:messaging-kafka-share-experimental:classes UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:compileTestJava UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:processTestResources NO-SOURCE
> Task :messaging:messaging-kafka-share-experimental:testClasses UP-TO-DATE
> Task :messaging:messaging-kafka-share-experimental:test UP-TO-DATE
> Task :messaging:messaging-nats-experimental:compileJava UP-TO-DATE
> Task :messaging:messaging-nats-experimental:processResources NO-SOURCE
> Task :messaging:messaging-nats-experimental:classes UP-TO-DATE
> Task :messaging:messaging-nats-experimental:compileTestJava UP-TO-DATE
> Task :messaging:messaging-nats-experimental:processTestResources NO-SOURCE
> Task :messaging:messaging-nats-experimental:testClasses UP-TO-DATE
> Task :messaging:messaging-nats-experimental:test UP-TO-DATE
> Task :messaging:messaging-observability:compileTestJava UP-TO-DATE
> Task :messaging:messaging-observability:processTestResources NO-SOURCE
> Task :messaging:messaging-observability:testClasses UP-TO-DATE
> Task :messaging:messaging-observability:test UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:compileTestJava UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:processTestResources NO-SOURCE
> Task :messaging:messaging-outbox-jdbc-postgresql:testClasses UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:test UP-TO-DATE
> Task :messaging:messaging-policy:compileTestJava UP-TO-DATE
> Task :messaging:messaging-policy:processTestResources NO-SOURCE
> Task :messaging:messaging-policy:testClasses UP-TO-DATE
> Task :messaging:messaging-policy:test UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:compileJava UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:processResources NO-SOURCE
> Task :messaging:messaging-pulsar-experimental:classes UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:compileTestJava UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:processTestResources NO-SOURCE
> Task :messaging:messaging-pulsar-experimental:testClasses UP-TO-DATE
> Task :messaging:messaging-pulsar-experimental:test UP-TO-DATE
> Task :messaging:messaging-rabbit:compileTestJava UP-TO-DATE
> Task :messaging:messaging-rabbit:processTestResources NO-SOURCE
> Task :messaging:messaging-rabbit:testClasses UP-TO-DATE
> Task :messaging:messaging-rabbit:test UP-TO-DATE
> Task :messaging:messaging-reliability-api:compileTestJava NO-SOURCE
> Task :messaging:messaging-reliability-api:processTestResources NO-SOURCE
> Task :messaging:messaging-reliability-api:testClasses UP-TO-DATE
> Task :messaging:messaging-reliability-api:test NO-SOURCE
> Task :messaging:messaging-runtime-core:compileTestJava UP-TO-DATE
> Task :messaging:messaging-runtime-core:processTestResources NO-SOURCE
> Task :messaging:messaging-runtime-core:testClasses UP-TO-DATE
> Task :messaging:messaging-runtime-core:test UP-TO-DATE
> Task :messaging:messaging-schema-api:compileTestJava UP-TO-DATE
> Task :messaging:messaging-schema-api:processTestResources NO-SOURCE
> Task :messaging:messaging-schema-api:testClasses UP-TO-DATE
> Task :messaging:messaging-schema-api:test UP-TO-DATE
> Task :messaging:messaging-schema-avro:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-avro:processResources NO-SOURCE
> Task :messaging:messaging-schema-avro:classes UP-TO-DATE
> Task :messaging:messaging-schema-avro:compileTestJava UP-TO-DATE
> Task :messaging:messaging-schema-avro:processTestResources UP-TO-DATE
> Task :messaging:messaging-schema-avro:testClasses UP-TO-DATE
> Task :messaging:messaging-schema-avro:test UP-TO-DATE
> Task :messaging:messaging-schema-json:compileTestJava UP-TO-DATE
> Task :messaging:messaging-schema-json:processTestResources NO-SOURCE
> Task :messaging:messaging-schema-json:testClasses UP-TO-DATE
> Task :messaging:messaging-schema-json:test UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:processResources NO-SOURCE
> Task :messaging:messaging-schema-protobuf:classes UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:compileTestJava UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:processTestResources NO-SOURCE
> Task :messaging:messaging-schema-protobuf:testClasses UP-TO-DATE
> Task :messaging:messaging-schema-protobuf:test UP-TO-DATE
> Task :messaging:messaging-security:compileTestJava UP-TO-DATE
> Task :messaging:messaging-security:processTestResources NO-SOURCE
> Task :messaging:messaging-security:testClasses UP-TO-DATE
> Task :messaging:messaging-security:test UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:compileTestJava UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:processTestResources UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:testClasses UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:test UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:compileJava UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:processResources NO-SOURCE
> Task :messaging:messaging-spring-cloud-stream-bridge:classes UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:compileTestJava UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:processTestResources NO-SOURCE
> Task :messaging:messaging-spring-cloud-stream-bridge:testClasses UP-TO-DATE
> Task :messaging:messaging-spring-cloud-stream-bridge:test UP-TO-DATE
> Task :messaging:messaging-testkit:compileTestJava UP-TO-DATE
> Task :messaging:messaging-testkit:processTestResources NO-SOURCE
> Task :messaging:messaging-testkit:testClasses UP-TO-DATE
> Task :messaging:messaging-testkit:test UP-TO-DATE
> Task :messaging:messaging-transport-spi:compileTestJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:processTestResources NO-SOURCE
> Task :messaging:messaging-transport-spi:testClasses UP-TO-DATE
> Task :messaging:messaging-transport-spi:test UP-TO-DATE
> Task :adapter:inbound:graphql:compileTestFixturesJava UP-TO-DATE
> Task :adapter:inbound:graphql:processTestFixturesResources NO-SOURCE
> Task :adapter:inbound:graphql:testFixturesClasses UP-TO-DATE
> Task :adapter:inbound:graphql:testFixturesJar UP-TO-DATE
> Task :adapter:inbound:graphql:compileTestJava UP-TO-DATE
> Task :adapter:inbound:graphql:processTestResources UP-TO-DATE
> Task :adapter:inbound:graphql:testClasses UP-TO-DATE
> Task :adapter:inbound:graphql:test UP-TO-DATE
> Task :adapter:inbound:grpc:compileJava UP-TO-DATE
> Task :adapter:inbound:grpc:processResources NO-SOURCE
> Task :adapter:inbound:grpc:classes UP-TO-DATE
> Task :adapter:inbound:grpc:compileTestJava UP-TO-DATE
> Task :adapter:inbound:grpc:processTestResources NO-SOURCE
> Task :adapter:inbound:grpc:testClasses UP-TO-DATE
> Task :adapter:inbound:grpc:test UP-TO-DATE
> Task :adapter:inbound:web:compileTestJava UP-TO-DATE
> Task :adapter:inbound:web:processTestResources NO-SOURCE
> Task :adapter:inbound:web:testClasses UP-TO-DATE
> Task :adapter:inbound:web:test UP-TO-DATE
> Task :adapter:inbound:websocket:compileJava UP-TO-DATE
> Task :adapter:inbound:websocket:processResources NO-SOURCE
> Task :adapter:inbound:websocket:classes UP-TO-DATE
> Task :adapter:inbound:websocket:compileTestJava UP-TO-DATE
> Task :adapter:inbound:websocket:processTestResources NO-SOURCE
> Task :adapter:inbound:websocket:testClasses UP-TO-DATE
> Task :adapter:inbound:websocket:test UP-TO-DATE
> Task :adapter:outbound:cache-redis:compileTestJava UP-TO-DATE
> Task :adapter:outbound:cache-redis:processTestResources UP-TO-DATE
> Task :adapter:outbound:cache-redis:testClasses UP-TO-DATE
> Task :adapter:outbound:cache-redis:test UP-TO-DATE
> Task :adapter:outbound:fileserver:compileTestJava UP-TO-DATE
> Task :adapter:outbound:fileserver:processTestResources NO-SOURCE
> Task :adapter:outbound:fileserver:testClasses UP-TO-DATE
> Task :adapter:outbound:fileserver:test UP-TO-DATE
> Task :adapter:outbound:httpclient:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:httpclient:processTestkitResources NO-SOURCE
> Task :adapter:outbound:httpclient:testkitClasses UP-TO-DATE
> Task :adapter:outbound:httpclient:compileTestJava UP-TO-DATE
> Task :adapter:outbound:httpclient:processTestResources NO-SOURCE
> Task :adapter:outbound:httpclient:testClasses UP-TO-DATE
> Task :adapter:outbound:httpclient:test UP-TO-DATE
> Task :adapter:outbound:identifier:compileTestJava UP-TO-DATE
> Task :adapter:outbound:identifier:compileTestGroovy UP-TO-DATE
> Task :adapter:outbound:identifier:processTestResources NO-SOURCE
> Task :adapter:outbound:identifier:testClasses UP-TO-DATE
> Task :adapter:outbound:identifier:test UP-TO-DATE
> Task :adapter:outbound:messaging:compileTestJava UP-TO-DATE
> Task :adapter:outbound:messaging:processTestResources UP-TO-DATE
> Task :adapter:outbound:messaging:testClasses UP-TO-DATE
> Task :adapter:outbound:messaging:test UP-TO-DATE
> Task :adapter:outbound:notification:compileTestJava UP-TO-DATE
> Task :adapter:outbound:notification:processTestResources UP-TO-DATE
> Task :adapter:outbound:notification:testClasses UP-TO-DATE
> Task :adapter:outbound:notification:test
> Task :adapter:outbound:objectstorage:compileTestJava UP-TO-DATE
> Task :adapter:outbound:objectstorage:processTestResources
> Task :adapter:outbound:objectstorage:testClasses
> Task :adapter:outbound:objectstorage:test
> Task :adapter:outbound:persistence-jpa:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:test
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:test
> Task :adapter:outbound:support:compileTestJava UP-TO-DATE
> Task :adapter:outbound:support:processTestResources NO-SOURCE
> Task :adapter:outbound:support:testClasses UP-TO-DATE
> Task :adapter:outbound:support:test
BUILD SUCCESSFUL in 2m 38s
200 actionable tasks: 6 executed, 194 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,54 @@
# Task 1 — the Wave 0 red set is empty, and the lanes are removed
## Command
```bash
cd src
./gradlew wave0RedReport --console=plain --no-daemon
```
`BUILD SUCCESSFUL in 43s` — but that says nothing on its own, and this is the important part of the
evidence rather than a caveat to it. Both `wave0Red` lanes set `ignoreFailures = true`, because they
were reports rather than gates: their job was to answer "what is still red from the baseline?", not
to fail a build. A green exit code from a report is not a claim about the tests.
## What the results actually say
```
app-bootstrap/build/test-results/wave0Red: 0 classes, 0 tests, 0 failures, 0 skipped
messaging/messaging-observability/build/test-results/wave0Red: 0 classes, 0 tests, 0 failures, 0 skipped
```
Zero tests, because no test carries the tag any more:
```bash
grep -rc 'wave0-red' $(git ls-files '*.java') # no match in any tracked Java source
```
The three Wave 0 characterizations — the full-`test` scanner failure, the five-switch-off bean and
resource inventory, and the local/dev boot and Compose merge reproductions — became ordinary tests as
the waves that fixed them landed, and their `@Tag("wave0-red")` markers came off with them. The red
set is empty by the only measure that matters: there is nothing left tagged.
## Why the lanes are deleted rather than kept
Two reasons, and the second is the one that generalises.
1. The plan says so, and its reason holds: a permanent lane for an empty set is a lane that stops
being read.
2. These lanes are the exact shape the Wave 5 lane convention exists to refuse. A tag filter that
matches nothing does not fail — `failOnNoDiscoveredTests` applies to discovery and a tag excludes
after discovery — so the lane runs, executes zero tests, and reports success. Here that is
harmless, because the lanes are reports and their emptiness is the answer. But leaving two
hand-rolled lanes in that shape, outside the convention that would have refused them, is leaving
a template for the next lane somebody copies.
Removed:
- `src/build.gradle` — the `wave0RedReport` aggregate
- `src/app-bootstrap/build.gradle` — the `wave0Red` lane and the `test { excludeTags 'wave0-red' }`
- `src/messaging/messaging-observability/build.gradle` — the same pair
The `excludeTags` removal matters as much as the lane removal: it was what kept tagged
characterizations out of the ordinary suite. With no tagged test left it is inert, and leaving it
would silently exclude any future test that reused the tag.
@@ -0,0 +1,28 @@
$ ./gradlew wave0RedReport --console=plain --no-daemon
run-at: 2026-08-20 (Wave 6 execution pass)
FAILURE: Build failed with an exception.
* What went wrong:
Task 'wave0RedReport' not found in root project 'ca-skeleton' and its subprojects.
exit=1
--------------------------------------------------------------------------------
READ THIS BEFORE TREATING THE LINE ABOVE AS A REGRESSION.
This is the expected end state, not a failure. Task 1's checkbox is "confirm the report is empty,
*then delete the lanes and the aggregate*". The deletion happened, so the task it names no longer
exists and the command can no longer run. `grep -rn wave0Red src --include=*.gradle` returns
nothing, which is the same fact from the other direction.
The substantive evidence — the empty red set measured while the lanes still existed — is in
`task1-wave0-red-set.md` beside this file: 0 classes / 0 tests / 0 failures in both lanes, with the
note that those lanes ran `ignoreFailures = true` and so a green exit code from them was never the
claim.
Provenance note: this file previously held the raw log of that earlier successful run. It was
overwritten during the Wave 6 execution pass by re-running the command under the same filename
without checking what was already there. The original log is not recoverable (this directory is
untracked). What was lost is the raw transcript; what the checkbox depends on survives in the
`.md` above, which was written from it.
@@ -0,0 +1,59 @@
# Task 2 — Wave 2 Task B5, the three ghost release lanes
Wave 2 offered two outcomes for `mongoShardedTest`, `mongoAtlasTest` and `mongoKmsTest`: implement
them, or demote them and stop describing an unrunnable gate. **(b) Demote was taken**, and it is
reflected in all three places the plan names.
## `src/config/mongodb/release-contracts.json`
All three moved out of the Stable blocking set into `experimental_contracts`, each carrying
`"blocking": false`, `"promotion": "experimental"` and a `not_promoted_reason` that states the
mechanism rather than an intention:
> A manifest entry pointing at an unregistered task does not fail; it is simply never run, and the
> release reports green for a capability nobody qualified. Demoted rather than implemented so the
> green means what it says.
That is the correct reading. A release manifest naming a task that no build file registers is not a
failing gate — it is an absent one, and absence is indistinguishable from success in a report that
counts failures.
## `docs/mongodb/advanced/sharding.md`
The gate row now reads:
> **Not promoted.** No `mongoShardedTest` lane is registered, and a sharded cluster is not an
> environment this repository stands up. Listed under `experimental_contracts` in
> `src/config/mongodb/release-contracts.json`; promoting it needs the lane, its required class, and
> protected-environment evidence to exist first.
## `scripts/verify-mongodb-advanced.sh`
Setting `MONGODB_SHARDED_URI` is now an explicit error rather than an invocation of a task that does
not exist:
```
sharded topology is experimental and has no registered lane;
MONGODB_SHARDED_URI was set but mongoShardedTest does not exist.
See experimental_contracts in src/config/mongodb/release-contracts.json.
```
The distinction the script draws is worth keeping: an operator who exported the URI expected a
qualification to run, so silence would be worse than failure. With the URI unset it records missing
evidence instead, which is a different statement from a pass.
## The arbiter
```bash
cd src
./gradlew :app-bootstrap:test --tests '*ReleaseManifestTaskExistenceTest' --console=plain
```
`BUILD SUCCESSFUL` — 1 test, 0 failures, 0 skipped. The manifest names no blocking task that the
build does not register.
## Registered Mongo lanes, for the record
`mongoStableContractTest`, `mongoReplicaSetTest`, `mongoFailoverTest`, `mongoMigrationTest`,
`mongoCompatibilityTest`, `mongoSecurityIntegrationTest`, `mongoPerformanceTest` — seven, and none of
the three demoted names among them, which is the state the demotion describes.
@@ -0,0 +1,181 @@
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:test UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:test UP-TO-DATE
> Task :adapter:outbound:support:compileJava UP-TO-DATE
> Task :adapter:outbound:support:processResources NO-SOURCE
> Task :adapter:outbound:support:classes UP-TO-DATE
> Task :adapter:outbound:support:jar UP-TO-DATE
> Task :adapter:outbound:messaging:compileJava UP-TO-DATE
> Task :adapter:outbound:messaging:processResources UP-TO-DATE
> Task :adapter:outbound:messaging:classes UP-TO-DATE
> Task :adapter:outbound:messaging:jar UP-TO-DATE
> Task :adapter:outbound:messaging:compileTestJava UP-TO-DATE
> Task :adapter:outbound:messaging:processTestResources UP-TO-DATE
> Task :adapter:outbound:messaging:testClasses UP-TO-DATE
> Task :adapter:outbound:messaging:test UP-TO-DATE
> Task :adapter:outbound:notification:compileJava UP-TO-DATE
> Task :adapter:outbound:notification:processResources NO-SOURCE
> Task :adapter:outbound:notification:classes UP-TO-DATE
> Task :adapter:outbound:notification:jar UP-TO-DATE
> Task :adapter:outbound:notification:compileTestJava UP-TO-DATE
> Task :adapter:outbound:notification:processTestResources UP-TO-DATE
> Task :adapter:outbound:notification:testClasses UP-TO-DATE
> Task :adapter:outbound:notification:test UP-TO-DATE
> Task :adapter:inbound:graphql:compileJava UP-TO-DATE
> Task :adapter:inbound:graphql:processResources UP-TO-DATE
> Task :adapter:inbound:graphql:classes UP-TO-DATE
> Task :adapter:inbound:graphql:jar UP-TO-DATE
> Task :adapter:inbound:graphql:compileTestFixturesJava UP-TO-DATE
> Task :adapter:inbound:graphql:processTestFixturesResources NO-SOURCE
> Task :adapter:inbound:graphql:testFixturesClasses UP-TO-DATE
> Task :adapter:inbound:graphql:testFixturesJar UP-TO-DATE
> Task :adapter:inbound:graphql:compileTestJava UP-TO-DATE
> Task :adapter:inbound:graphql:processTestResources UP-TO-DATE
> Task :adapter:inbound:graphql:testClasses UP-TO-DATE
> Task :adapter:inbound:graphql:test UP-TO-DATE
2026-08-19T04:59:21.954Z INFO 432501 --- [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2026-08-19T04:59:21.963Z INFO 432501 --- [tomcat-shutdown] o.s.boot.tomcat.GracefulShutdown : Graceful shutdown complete
2026-08-19T04:59:21.978Z INFO 432501 --- [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2026-08-19T04:59:21.980Z INFO 432501 --- [tomcat-shutdown] o.s.boot.tomcat.GracefulShutdown : Graceful shutdown complete
> Task :adapter:inbound:graphql:graphqlStableTest
> Task :verifyRuntimeModuleMembership
verifyRuntimeModuleMembership: 2 runtime composition(s) match the registry
> Task :domain-core:compileJava UP-TO-DATE
> Task :domain-core:processResources NO-SOURCE
> Task :domain-core:classes UP-TO-DATE
> Task :domain-core:jar UP-TO-DATE
> Task :messaging:messaging-core-api:compileJava UP-TO-DATE
> Task :messaging:messaging-observability:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-api:compileJava UP-TO-DATE
> Task :messaging:messaging-policy:compileJava UP-TO-DATE
> Task :messaging:messaging-reliability-api:compileJava UP-TO-DATE
> Task :messaging:messaging-security:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-api:compileJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:compileJava UP-TO-DATE
> Task :messaging:messaging-claim-check:compileJava UP-TO-DATE
> Task :messaging:messaging-cloudevents:compileJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka:compileJava UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-rabbit:compileJava UP-TO-DATE
> Task :messaging:messaging-runtime-core:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-json:compileJava UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:compileJava UP-TO-DATE
> Task :adapter:inbound:web:compileJava UP-TO-DATE
> Task :adapter:inbound:web:processResources NO-SOURCE
> Task :adapter:inbound:web:classes UP-TO-DATE
> Task :adapter:inbound:web:jar UP-TO-DATE
> Task :adapter:outbound:cache-redis:compileJava UP-TO-DATE
> Task :adapter:outbound:cache-redis:processResources UP-TO-DATE
> Task :adapter:outbound:cache-redis:classes UP-TO-DATE
> Task :adapter:outbound:cache-redis:jar UP-TO-DATE
> Task :adapter:outbound:fileserver:compileJava UP-TO-DATE
> Task :adapter:outbound:fileserver:processResources NO-SOURCE
> Task :adapter:outbound:fileserver:classes UP-TO-DATE
> Task :adapter:outbound:fileserver:jar UP-TO-DATE
> Task :adapter:outbound:httpclient:compileJava UP-TO-DATE
> Task :adapter:outbound:httpclient:processResources NO-SOURCE
> Task :adapter:outbound:httpclient:classes UP-TO-DATE
> Task :adapter:outbound:httpclient:jar UP-TO-DATE
> Task :adapter:outbound:identifier:compileJava UP-TO-DATE
> Task :adapter:outbound:identifier:compileGroovy NO-SOURCE
> Task :adapter:outbound:identifier:processResources NO-SOURCE
> Task :adapter:outbound:identifier:classes UP-TO-DATE
> Task :adapter:outbound:identifier:jar UP-TO-DATE
> Task :app-bootstrap:compileJava UP-TO-DATE
> Task :app-bootstrap:processResources UP-TO-DATE
> Task :app-bootstrap:classes UP-TO-DATE
> Task :adapter:inbound:grpc:compileJava UP-TO-DATE
> Task :adapter:inbound:grpc:processResources NO-SOURCE
> Task :adapter:inbound:grpc:classes UP-TO-DATE
> Task :adapter:inbound:grpc:jar UP-TO-DATE
> Task :adapter:inbound:websocket:compileJava UP-TO-DATE
> Task :adapter:inbound:websocket:processResources NO-SOURCE
> Task :adapter:inbound:websocket:classes UP-TO-DATE
> Task :adapter:inbound:websocket:jar UP-TO-DATE
> Task :app-bootstrap:compileConditionalTransportTestJava UP-TO-DATE
> Task :app-bootstrap:processConditionalTransportTestResources NO-SOURCE
> Task :app-bootstrap:conditionalTransportTestClasses UP-TO-DATE
> Task :app-bootstrap:conditionalTransportCompositionTestRequiredClasses
> Task :app-bootstrap:conditionalTransportCompositionTest
> Task :app-bootstrap:conditionalTransportCompositionTestEvidence
conditionalTransportCompositionTest: 3 tests, 0 skipped
> Task :adapter:inbound:graphql:graphqlTransportQualificationTestRequiredClasses
2026-08-19T04:59:43.275Z INFO 433478 --- [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2026-08-19T04:59:43.288Z INFO 433478 --- [tomcat-shutdown] o.s.boot.tomcat.GracefulShutdown : Graceful shutdown complete
> Task :adapter:inbound:graphql:graphqlTransportQualificationTest
> Task :adapter:inbound:graphql:graphqlTransportQualificationTestEvidence
graphqlTransportQualificationTest: 8 tests, 0 skipped
> Task :adapter:inbound:grpc:compileTestJava UP-TO-DATE
> Task :adapter:inbound:grpc:processTestResources NO-SOURCE
> Task :adapter:inbound:grpc:testClasses UP-TO-DATE
> Task :adapter:inbound:grpc:grpcTransportQualificationTestRequiredClasses
> Task :adapter:inbound:grpc:grpcTransportQualificationTest
> Task :adapter:inbound:grpc:grpcTransportQualificationTestEvidence
grpcTransportQualificationTest: 15 tests, 0 skipped
> Task :adapter:inbound:websocket:compileTestJava UP-TO-DATE
> Task :adapter:inbound:websocket:processTestResources NO-SOURCE
> Task :adapter:inbound:websocket:testClasses UP-TO-DATE
> Task :adapter:inbound:websocket:websocketTransportQualificationTestRequiredClasses
2026-08-19T05:00:00.518Z INFO 437360 --- [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2026-08-19T05:00:00.523Z INFO 437360 --- [tomcat-shutdown] o.s.boot.tomcat.GracefulShutdown : Graceful shutdown complete
> Task :adapter:inbound:websocket:websocketTransportQualificationTest
> Task :adapter:inbound:websocket:websocketTransportQualificationTestEvidence
websocketTransportQualificationTest: 5 tests, 0 skipped
> Task :conditionalTransportQualification
conditional-transport-graphql: 8 tests, 0 skipped
conditional-transport-grpc: 15 tests, 0 skipped
conditional-transport-websocket: 5 tests, 0 skipped
conditional-transport-composition: 3 tests, 0 skipped
BUILD SUCCESSFUL in 1m 8s
101 actionable tasks: 15 executed, 86 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
EXIT=0
@@ -0,0 +1,61 @@
# NOT RUN — the GraphQL bootJar JWT qualification
Recorded as not-run with its reason, per this wave's rule that a gate which could not run is never
reported as passing.
## What was attempted
```bash
cd src
./gradlew :app-bootstrap:graphqlRuntimeQualification --console=plain
```
```
* What went wrong:
Cannot locate tasks that match ':app-bootstrap:graphqlRuntimeQualification' as task
'graphqlRuntimeQualification' not found in project ':app-bootstrap'.
exit=1
```
## Why it cannot run
The task does not exist, and neither does the source set the spec names for it.
`app-bootstrap/src/` holds `main`, `test`, `functionalTest`, `conditionalTransportTest` and
`sampleOffTest` — there is no `graphqlRuntimeQualificationTest`.
The spec (`…-five-adapter-runtime-remediation-review-design.md`, GraphQL section) fixes the
canonical task as `:app-bootstrap:graphqlRuntimeQualification`, depending on `bootJar`, running the
produced jar as a child process, taking a client-credentials token from a Keycloak container that
imported the same tracked realm artifact, and calling real HTTP `/graphql`. None of that machinery
was built.
## What exists instead, and why it does not substitute
| Artefact | What it actually proves | Why it is not release evidence |
| --- | --- | --- |
| `GraphqlHttpBoundaryQualificationTest` | `/graphql` and `/graphiql` answer over HTTP in a `@SpringBootTest` | authenticates with `withBasicAuth(USERNAME, PASSWORD)` and `httpBasic(Customizer.withDefaults())` — test-only Basic auth, not the JWT decoder a deployment runs |
| `ConditionalTransportCompositionContractTest` | the GraphQL types load and the leaf's runtime membership matches the registry | `assertThatCodeLoads(typeName)` is class existence; it makes no request and sees no token |
The spec anticipates exactly these two and rules both out by name: the boundary test "may remain a
module contract test but is not aggregated into release evidence", and class existence is named as
the thing the qualification exists to replace.
## Consequence for the Definition of Done
Spec §13 item — *"GraphQL blocking qualification runs the bootJar JWT composition exactly once and
uses neither class-existence nor test-only Basic Auth as release evidence"* — **cannot be ticked**.
It is the one item of the twenty-four in that state.
## This was already declared, not discovered
`.github/ci-gate-matrix.yml` registers the gate as `mechanism: delegated-pending` with the comment
that it "inherits that control's pending status rather than having none of its own", and
`verify-gate-matrix.sh` reports `49 gates, 45 verified, 4 delegated-pending`. The gap is recorded in
the repository's own control plane; this file is the Wave 6 confirmation of it, not a new finding.
## What closing it would take
A new `graphqlRuntimeQualificationTest` source set, a Gradle lane depending on `bootJar`, a child
process launcher for the jar, a Keycloak container importing `infra/keycloak/realms/
ca-skeleton-realm.json`, and the required-class / zero-discovery / stale-XML refusals the spec lists.
That is new capability, which this wave explicitly does not add.
@@ -0,0 +1,31 @@
$ ./gradlew :app-bootstrap:graphqlRuntimeQualification --console=plain
run-at: 2026-08-20T07:20:21Z
Mem: 30Gi 18Gi 1.4Gi 688Mi 12Gi 12Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
[Incubating] Problems report is available at: file:///home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/build/reports/problems/problems-report.html
FAILURE: Build failed with an exception.
* What went wrong:
Cannot locate tasks that match ':app-bootstrap:graphqlRuntimeQualification' as task 'graphqlRuntimeQualification' not found in project ':app-bootstrap'.
* Try:
> Run gradlew tasks to get a list of available tasks.
> For more on name expansion, please refer to https://docs.gradle.org/9.0.0/userguide/command_line_interface.html#sec:name_abbreviation in the Gradle documentation.
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to generate a Build Scan (Powered by Develocity).
> Get more help at https://help.gradle.org.
BUILD FAILED in 2s
8 actionable tasks: 8 up-to-date
exit=1
@@ -0,0 +1,162 @@
$ ./gradlew :adapter:inbound:graphql:graphqlStableTest conditionalTransportQualification --console=plain
run-at: 2026-08-20T07:18:59Z
total used free shared buff/cache available
Mem: 30Gi 17Gi 2.0Gi 687Mi 12Gi 13Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:inbound:graphql:compileJava UP-TO-DATE
> Task :adapter:inbound:graphql:processResources UP-TO-DATE
> Task :adapter:inbound:graphql:classes UP-TO-DATE
> Task :adapter:inbound:graphql:jar UP-TO-DATE
> Task :adapter:inbound:graphql:compileTestFixturesJava UP-TO-DATE
> Task :adapter:inbound:graphql:processTestFixturesResources NO-SOURCE
> Task :adapter:inbound:graphql:testFixturesClasses UP-TO-DATE
> Task :adapter:inbound:graphql:testFixturesJar UP-TO-DATE
> Task :adapter:inbound:graphql:compileTestJava UP-TO-DATE
> Task :adapter:inbound:graphql:processTestResources UP-TO-DATE
> Task :adapter:inbound:graphql:testClasses UP-TO-DATE
2026-08-20T07:19:40.310Z INFO 3669807 --- [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2026-08-20T07:19:40.317Z INFO 3669807 --- [tomcat-shutdown] o.s.boot.tomcat.GracefulShutdown : Graceful shutdown complete
2026-08-20T07:19:40.345Z INFO 3669807 --- [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2026-08-20T07:19:40.347Z INFO 3669807 --- [tomcat-shutdown] o.s.boot.tomcat.GracefulShutdown : Graceful shutdown complete
> Task :adapter:inbound:graphql:graphqlStableTest
> Task :verifyRuntimeModuleMembership
verifyRuntimeModuleMembership: 2 runtime composition(s) match the registry
> Task :domain-core:compileJava UP-TO-DATE
> Task :domain-core:processResources NO-SOURCE
> Task :domain-core:classes UP-TO-DATE
> Task :domain-core:jar UP-TO-DATE
> Task :messaging:messaging-core-api:compileJava UP-TO-DATE
> Task :messaging:messaging-observability:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-api:compileJava UP-TO-DATE
> Task :messaging:messaging-policy:compileJava UP-TO-DATE
> Task :messaging:messaging-reliability-api:compileJava UP-TO-DATE
> Task :messaging:messaging-security:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-api:compileJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:compileJava UP-TO-DATE
> Task :messaging:messaging-claim-check:compileJava UP-TO-DATE
> Task :messaging:messaging-cloudevents:compileJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka:compileJava UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-rabbit:compileJava UP-TO-DATE
> Task :messaging:messaging-runtime-core:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-json:compileJava UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:compileJava UP-TO-DATE
> Task :adapter:inbound:web:compileJava UP-TO-DATE
> Task :adapter:inbound:web:processResources NO-SOURCE
> Task :adapter:inbound:web:classes UP-TO-DATE
> Task :adapter:inbound:web:jar UP-TO-DATE
> Task :adapter:outbound:support:compileJava UP-TO-DATE
> Task :adapter:outbound:support:processResources NO-SOURCE
> Task :adapter:outbound:support:classes UP-TO-DATE
> Task :adapter:outbound:support:jar UP-TO-DATE
> Task :adapter:outbound:cache-redis:compileJava UP-TO-DATE
> Task :adapter:outbound:cache-redis:processResources UP-TO-DATE
> Task :adapter:outbound:cache-redis:classes UP-TO-DATE
> Task :adapter:outbound:cache-redis:jar UP-TO-DATE
> Task :adapter:outbound:fileserver:compileJava UP-TO-DATE
> Task :adapter:outbound:fileserver:processResources NO-SOURCE
> Task :adapter:outbound:fileserver:classes UP-TO-DATE
> Task :adapter:outbound:fileserver:jar UP-TO-DATE
> Task :adapter:outbound:httpclient:compileJava UP-TO-DATE
> Task :adapter:outbound:httpclient:processResources NO-SOURCE
> Task :adapter:outbound:httpclient:classes UP-TO-DATE
> Task :adapter:outbound:httpclient:jar UP-TO-DATE
> Task :adapter:outbound:identifier:compileJava UP-TO-DATE
> Task :adapter:outbound:identifier:compileGroovy NO-SOURCE
> Task :adapter:outbound:identifier:processResources NO-SOURCE
> Task :adapter:outbound:identifier:classes UP-TO-DATE
> Task :adapter:outbound:identifier:jar UP-TO-DATE
> Task :adapter:outbound:messaging:compileJava UP-TO-DATE
> Task :adapter:outbound:messaging:processResources UP-TO-DATE
> Task :adapter:outbound:messaging:classes UP-TO-DATE
> Task :adapter:outbound:messaging:jar UP-TO-DATE
> Task :adapter:outbound:notification:compileJava UP-TO-DATE
> Task :adapter:outbound:notification:processResources NO-SOURCE
> Task :adapter:outbound:notification:classes UP-TO-DATE
> Task :adapter:outbound:notification:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:jar UP-TO-DATE
> Task :app-bootstrap:compileJava UP-TO-DATE
> Task :app-bootstrap:processResources UP-TO-DATE
> Task :app-bootstrap:classes UP-TO-DATE
> Task :adapter:inbound:grpc:compileJava UP-TO-DATE
> Task :adapter:inbound:grpc:processResources NO-SOURCE
> Task :adapter:inbound:grpc:classes UP-TO-DATE
> Task :adapter:inbound:grpc:jar UP-TO-DATE
> Task :adapter:inbound:websocket:compileJava UP-TO-DATE
> Task :adapter:inbound:websocket:processResources NO-SOURCE
> Task :adapter:inbound:websocket:classes UP-TO-DATE
> Task :adapter:inbound:websocket:jar UP-TO-DATE
> Task :app-bootstrap:compileConditionalTransportTestJava UP-TO-DATE
> Task :app-bootstrap:processConditionalTransportTestResources NO-SOURCE
> Task :app-bootstrap:conditionalTransportTestClasses UP-TO-DATE
> Task :app-bootstrap:conditionalTransportCompositionTestRequiredClasses
> Task :app-bootstrap:conditionalTransportCompositionTest
> Task :app-bootstrap:conditionalTransportCompositionTestEvidence
conditionalTransportCompositionTest: 3 tests, 0 skipped
> Task :adapter:inbound:graphql:graphqlTransportQualificationTestRequiredClasses
2026-08-20T07:19:56.193Z INFO 3670728 --- [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2026-08-20T07:19:56.198Z INFO 3670728 --- [tomcat-shutdown] o.s.boot.tomcat.GracefulShutdown : Graceful shutdown complete
> Task :adapter:inbound:graphql:graphqlTransportQualificationTest
> Task :adapter:inbound:graphql:graphqlTransportQualificationTestEvidence
graphqlTransportQualificationTest: 8 tests, 0 skipped
> Task :adapter:inbound:grpc:compileTestJava UP-TO-DATE
> Task :adapter:inbound:grpc:processTestResources NO-SOURCE
> Task :adapter:inbound:grpc:testClasses UP-TO-DATE
> Task :adapter:inbound:grpc:grpcTransportQualificationTestRequiredClasses
> Task :adapter:inbound:grpc:grpcTransportQualificationTest
> Task :adapter:inbound:grpc:grpcTransportQualificationTestEvidence
grpcTransportQualificationTest: 15 tests, 0 skipped
> Task :adapter:inbound:websocket:compileTestJava UP-TO-DATE
> Task :adapter:inbound:websocket:processTestResources NO-SOURCE
> Task :adapter:inbound:websocket:testClasses UP-TO-DATE
> Task :adapter:inbound:websocket:websocketTransportQualificationTestRequiredClasses
2026-08-20T07:20:10.449Z INFO 3671395 --- [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2026-08-20T07:20:10.454Z INFO 3671395 --- [tomcat-shutdown] o.s.boot.tomcat.GracefulShutdown : Graceful shutdown complete
> Task :adapter:inbound:websocket:websocketTransportQualificationTest
> Task :adapter:inbound:websocket:websocketTransportQualificationTestEvidence
websocketTransportQualificationTest: 5 tests, 0 skipped
> Task :conditionalTransportQualification
conditional-transport-graphql: 8 tests, 0 skipped
conditional-transport-grpc: 15 tests, 0 skipped
conditional-transport-websocket: 5 tests, 0 skipped
conditional-transport-composition: 3 tests, 0 skipped
BUILD SUCCESSFUL in 1m 11s
88 actionable tasks: 15 executed, 73 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,173 @@
===== PostgreSQL 16 =====
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformFailureTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest
PostgreSqlNotificationSchemaActivationIntegrationTest > V1 to V4, disable, re-enable and an interrupted migration all recover FAILED
org.opentest4j.AssertionFailedError at PostgreSqlNotificationSchemaActivationIntegrationTest.java:184
43 tests completed, 1 failed
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':adapter:outbound:persistence-jpa:jpaPlatformMigrationTest'.
> There were failing tests. See the report at: file:///home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/reports/tests/jpaPlatformMigrationTest/index.html
* Try:
> Run with --scan to generate a Build Scan (Powered by Develocity).
BUILD FAILED in 4m 58s
21 actionable tasks: 3 executed, 18 up-to-date
EXIT(16)=1
===== PostgreSQL 17 =====
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformFailureTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest
PostgreSqlNotificationSchemaActivationIntegrationTest > V1 to V4, disable, re-enable and an interrupted migration all recover FAILED
org.opentest4j.AssertionFailedError at PostgreSqlNotificationSchemaActivationIntegrationTest.java:184
43 tests completed, 1 failed
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':adapter:outbound:persistence-jpa:jpaPlatformMigrationTest'.
> There were failing tests. See the report at: file:///home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/reports/tests/jpaPlatformMigrationTest/index.html
* Try:
> Run with --scan to generate a Build Scan (Powered by Develocity).
BUILD FAILED in 5m 42s
21 actionable tasks: 3 executed, 18 up-to-date
EXIT(17)=1
===== PostgreSQL 18 =====
> Task :build-logic:extractPluginRequests
> Task :build-logic:generatePluginAdapters
> Task :build-logic:compileJava
> Task :build-logic:compileGroovy
> Task :build-logic:compileGroovyPlugins
> Task :build-logic:pluginDescriptors
> Task :build-logic:processResources
> Task :build-logic:classes
> Task :build-logic:jar
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':adapter:outbound:persistence-jpa:jpaPlatformContractTest'.
> Multiple build operations failed.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.StablePostgreSqlMatrixContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.StablePostgreSqlMatrixContractTest.xml.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlArrayRangeContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlArrayRangeContractTest.xml.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlPessimisticLockContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlPessimisticLockContractTest.xml.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.OptimisticRetryIntegrationTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.OptimisticRetryIntegrationTest.xml.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlCopyLoaderIntegrationTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlCopyLoaderIntegrationTest.xml.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.experimental.ReadAfterWriteRoutingContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.experimental.ReadAfterWriteRoutingContractTest.xml.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.readiness.PostgreSqlNotificationIdempotencyRaceIntegrationTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.readiness.PostgreSqlNotificationIdempotencyRaceIntegrationTest.xml.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.experimental.TenantColumnIsolationTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.experimental.TenantColumnIsolationTest.xml.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.experimental.TenantPoolCapacityContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.experimental.TenantPoolCapacityContractTest.xml.
Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlWorkClaimContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlWorkClaimContractTest.xml.
...and 7 more failures.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.StablePostgreSqlMatrixContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.StablePostgreSqlMatrixContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlArrayRangeContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlArrayRangeContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlPessimisticLockContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlPessimisticLockContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.OptimisticRetryIntegrationTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.OptimisticRetryIntegrationTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlCopyLoaderIntegrationTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlCopyLoaderIntegrationTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.experimental.ReadAfterWriteRoutingContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.experimental.ReadAfterWriteRoutingContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.readiness.PostgreSqlNotificationIdempotencyRaceIntegrationTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.readiness.PostgreSqlNotificationIdempotencyRaceIntegrationTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.experimental.TenantColumnIsolationTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.experimental.TenantColumnIsolationTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.experimental.TenantPoolCapacityContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.experimental.TenantPoolCapacityContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlWorkClaimContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlWorkClaimContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.JpaLifecycleAssociationContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.JpaLifecycleAssociationContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlUpsertContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlUpsertContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlJsonbContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlJsonbContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.JpaValueMappingContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.JpaValueMappingContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.JpaPlatformContractSupportOwnershipTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.JpaPlatformContractSupportOwnershipTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlSqlStateContractTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.platform.PostgreSqlSqlStateContractTest.xml.
> Could not write XML test results for dev.caskeleton.adapter.outbound.persistence.readiness.PostgreSqlRecipientLeaseFencingIntegrationTest to file /home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-jpa/build/test-results/jpaPlatformContractTest/TEST-dev.caskeleton.adapter.outbound.persistence.readiness.PostgreSqlRecipientLeaseFencingIntegrationTest.xml.
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to generate a Build Scan (Powered by Develocity).
> Get more help at https://help.gradle.org.
BUILD FAILED in 5m 20s
19 actionable tasks: 9 executed, 10 up-to-date
@@ -0,0 +1,49 @@
$ ./gradlew :adapter:outbound:persistence-jpa:jpaPlatformReleaseGate -Pjpa.matrix.versions=16 --console=plain
run-at: 2026-08-20T07:38:10Z
Mem: 30Gi 15Gi 8.9Gi 770Mi 8.2Gi 15Gi
Starting a Gradle Daemon, 5 stopped Daemons could not be reused, use --status for details
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformFailureTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest
> Task :adapter:outbound:persistence-jpa:compileJpaPlatformPerformanceTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processJpaPlatformPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPerformanceTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPoolContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformQueryPlanTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformSecurityTest
> Task :adapter:outbound:persistence-jpa:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:test UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformReleaseGate
BUILD SUCCESSFUL in 8m 14s
27 actionable tasks: 6 executed, 21 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,48 @@
$ ./gradlew :adapter:outbound:persistence-jpa:jpaPlatformReleaseGate -Pjpa.matrix.versions=17 --console=plain
run-at: 2026-08-20T07:46:38Z
Mem: 30Gi 19Gi 4.6Gi 782Mi 8.5Gi 11Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformFailureTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest
> Task :adapter:outbound:persistence-jpa:compileJpaPlatformPerformanceTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processJpaPlatformPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPerformanceTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPoolContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformQueryPlanTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformSecurityTest
> Task :adapter:outbound:persistence-jpa:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:test UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformReleaseGate
BUILD SUCCESSFUL in 7m 26s
27 actionable tasks: 6 executed, 21 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,48 @@
$ ./gradlew :adapter:outbound:persistence-jpa:jpaPlatformReleaseGate -Pjpa.matrix.versions=18 --console=plain
run-at: 2026-08-20T07:54:35Z
Mem: 30Gi 19Gi 4.3Gi 1.1Gi 8.2Gi 10Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformFailureTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest
> Task :adapter:outbound:persistence-jpa:compileJpaPlatformPerformanceTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processJpaPlatformPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPerformanceTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPoolContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformQueryPlanTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformSecurityTest
> Task :adapter:outbound:persistence-jpa:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:test UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformReleaseGate
BUILD SUCCESSFUL in 5m 45s
27 actionable tasks: 6 executed, 21 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,138 @@
===== PostgreSQL 16 =====
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformFailureTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest
> Task :adapter:outbound:persistence-jpa:compileJpaPlatformPerformanceTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processJpaPlatformPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPerformanceTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPoolContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformQueryPlanTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformSecurityTest
> Task :adapter:outbound:persistence-jpa:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:test UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformReleaseGate
BUILD SUCCESSFUL in 7m 26s
27 actionable tasks: 6 executed, 21 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
EXIT(16)=0
===== PostgreSQL 17 =====
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformFailureTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest
> Task :adapter:outbound:persistence-jpa:compileJpaPlatformPerformanceTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processJpaPlatformPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPerformanceTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPoolContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformQueryPlanTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformSecurityTest
> Task :adapter:outbound:persistence-jpa:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:test UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformReleaseGate
BUILD SUCCESSFUL in 5m 55s
27 actionable tasks: 6 executed, 21 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
EXIT(17)=0
===== PostgreSQL 18 =====
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compilePostgresqlIntegrationTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processPostgresqlIntegrationTestResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:postgresqlIntegrationTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformFailureTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformMigrationTest
> Task :adapter:outbound:persistence-jpa:compileJpaPlatformPerformanceTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processJpaPlatformPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPerformanceTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformPoolContractTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformQueryPlanTest
> Task :adapter:outbound:persistence-jpa:jpaPlatformSecurityTest
> Task :adapter:outbound:persistence-jpa:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:test UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jpaPlatformReleaseGate
BUILD SUCCESSFUL in 5m 58s
27 actionable tasks: 6 executed, 21 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
EXIT(18)=0
@@ -0,0 +1,61 @@
$ ./gradlew :messaging:messaging-kafka:verifyMessagingCertificationEvidence --console=plain
run-at: 2026-08-20T08:00:43Z
Mem: 30Gi 16Gi 7.8Gi 1.0Gi 8.3Gi 14Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :messaging:messaging-core-api:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-api:compileJava UP-TO-DATE
> Task :messaging:messaging-policy:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-api:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-api:processResources NO-SOURCE
> Task :messaging:messaging-admin-api:classes UP-TO-DATE
> Task :messaging:messaging-admin-api:jar UP-TO-DATE
> Task :messaging:messaging-observability:compileJava UP-TO-DATE
> Task :messaging:messaging-security:compileJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:processResources NO-SOURCE
> Task :messaging:messaging-admin-runtime:classes UP-TO-DATE
> Task :messaging:messaging-admin-runtime:jar UP-TO-DATE
> Task :messaging:messaging-core-api:processResources NO-SOURCE
> Task :messaging:messaging-core-api:classes UP-TO-DATE
> Task :messaging:messaging-core-api:jar UP-TO-DATE
> Task :messaging:messaging-kafka:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka:processResources NO-SOURCE
> Task :messaging:messaging-kafka:classes UP-TO-DATE
> Task :messaging:messaging-testkit:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka:compileTestJava UP-TO-DATE
> Task :messaging:messaging-kafka:processTestResources NO-SOURCE
> Task :messaging:messaging-kafka:testClasses UP-TO-DATE
> Task :messaging:messaging-observability:processResources NO-SOURCE
> Task :messaging:messaging-observability:classes UP-TO-DATE
> Task :messaging:messaging-observability:jar UP-TO-DATE
> Task :messaging:messaging-policy:processResources NO-SOURCE
> Task :messaging:messaging-policy:classes UP-TO-DATE
> Task :messaging:messaging-policy:jar UP-TO-DATE
> Task :messaging:messaging-schema-api:processResources NO-SOURCE
> Task :messaging:messaging-schema-api:classes UP-TO-DATE
> Task :messaging:messaging-schema-api:jar UP-TO-DATE
> Task :messaging:messaging-security:processResources NO-SOURCE
> Task :messaging:messaging-security:classes UP-TO-DATE
> Task :messaging:messaging-security:jar UP-TO-DATE
> Task :messaging:messaging-testkit:processResources UP-TO-DATE
> Task :messaging:messaging-testkit:classes UP-TO-DATE
> Task :messaging:messaging-testkit:jar UP-TO-DATE
> Task :messaging:messaging-transport-spi:processResources NO-SOURCE
> Task :messaging:messaging-transport-spi:classes UP-TO-DATE
> Task :messaging:messaging-transport-spi:jar UP-TO-DATE
> Task :messaging:messaging-kafka:messagingCertificationTest
> Task :messaging:messaging-kafka:verifyMessagingCertificationEvidence
BUILD SUCCESSFUL in 39s
31 actionable tasks: 2 executed, 29 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,71 @@
$ ./gradlew :messaging:messaging-kafka:cleanTest :messaging:messaging-kafka:test --tests '*IT' :messaging:messaging-rabbit:cleanTest :messaging:messaging-rabbit:test --tests '*IT' --console=plain
(cleanTest first: the previous invocation reused 6.5-hour-old XML because the task was up-to-date)
run-at: 2026-08-20T08:03:01Z
Mem: 30Gi 17Gi 6.5Gi 1.0Gi 8.5Gi 13Gi
Starting a Gradle Daemon, 1 busy and 35 stopped Daemons could not be reused, use --status for details
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :messaging:messaging-kafka:cleanTest
> Task :messaging:messaging-core-api:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-api:compileJava UP-TO-DATE
> Task :messaging:messaging-policy:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-api:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-api:processResources NO-SOURCE
> Task :messaging:messaging-admin-api:classes UP-TO-DATE
> Task :messaging:messaging-admin-api:jar UP-TO-DATE
> Task :messaging:messaging-observability:compileJava UP-TO-DATE
> Task :messaging:messaging-security:compileJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:processResources NO-SOURCE
> Task :messaging:messaging-admin-runtime:classes UP-TO-DATE
> Task :messaging:messaging-admin-runtime:jar UP-TO-DATE
> Task :messaging:messaging-core-api:processResources NO-SOURCE
> Task :messaging:messaging-core-api:classes UP-TO-DATE
> Task :messaging:messaging-core-api:jar UP-TO-DATE
> Task :messaging:messaging-kafka:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka:processResources NO-SOURCE
> Task :messaging:messaging-kafka:classes UP-TO-DATE
> Task :messaging:messaging-testkit:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka:compileTestJava UP-TO-DATE
> Task :messaging:messaging-kafka:processTestResources NO-SOURCE
> Task :messaging:messaging-kafka:testClasses UP-TO-DATE
> Task :messaging:messaging-observability:processResources NO-SOURCE
> Task :messaging:messaging-observability:classes UP-TO-DATE
> Task :messaging:messaging-observability:jar UP-TO-DATE
> Task :messaging:messaging-policy:processResources NO-SOURCE
> Task :messaging:messaging-policy:classes UP-TO-DATE
> Task :messaging:messaging-policy:jar UP-TO-DATE
> Task :messaging:messaging-schema-api:processResources NO-SOURCE
> Task :messaging:messaging-schema-api:classes UP-TO-DATE
> Task :messaging:messaging-schema-api:jar UP-TO-DATE
> Task :messaging:messaging-security:processResources NO-SOURCE
> Task :messaging:messaging-security:classes UP-TO-DATE
> Task :messaging:messaging-security:jar UP-TO-DATE
> Task :messaging:messaging-testkit:processResources UP-TO-DATE
> Task :messaging:messaging-testkit:classes UP-TO-DATE
> Task :messaging:messaging-testkit:jar UP-TO-DATE
> Task :messaging:messaging-transport-spi:processResources NO-SOURCE
> Task :messaging:messaging-transport-spi:classes UP-TO-DATE
> Task :messaging:messaging-transport-spi:jar UP-TO-DATE
> Task :messaging:messaging-kafka:test
> Task :messaging:messaging-rabbit:cleanTest
> Task :messaging:messaging-rabbit:compileJava UP-TO-DATE
> Task :messaging:messaging-rabbit:processResources NO-SOURCE
> Task :messaging:messaging-rabbit:classes UP-TO-DATE
> Task :messaging:messaging-rabbit:compileTestJava UP-TO-DATE
> Task :messaging:messaging-rabbit:processTestResources NO-SOURCE
> Task :messaging:messaging-rabbit:testClasses UP-TO-DATE
> Task :messaging:messaging-rabbit:test
BUILD SUCCESSFUL in 1m 29s
35 actionable tasks: 4 executed, 31 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,27 @@
$ ./gradlew :adapter:outbound:persistence-mongo:mongoCompatibilityTest --console=plain
run-at: 2026-08-20T07:31:58Z
Mem: 30Gi 19Gi 632Mi 834Mi 11Gi 11Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:mongoCompatibilityTest
BUILD SUCCESSFUL in 18s
13 actionable tasks: 1 executed, 12 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,27 @@
$ ./gradlew :adapter:outbound:persistence-mongo:mongoFailoverTest --console=plain
run-at: 2026-08-20T07:33:19Z
Mem: 30Gi 19Gi 1.0Gi 839Mi 11Gi 11Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:mongoFailoverTest
BUILD SUCCESSFUL in 1m 17s
13 actionable tasks: 1 executed, 12 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,43 @@
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:mongoStableContractTest
> Task :adapter:outbound:persistence-mongo:mongoReplicaSetTest
> Task :adapter:outbound:persistence-mongo:mongoFailoverTest
> Task :adapter:outbound:persistence-mongo:mongoMigrationTest
MongoMigrationLaneTest > aCheckpointSurvivesTheProcessThatWroteIt() FAILED
dev.caskeleton.adapter.outbound.mongo.api.error.MongoOperationRejectedException at MongoMigrationLaneTest.java:155
6 tests completed, 1 failed
> Task :adapter:outbound:persistence-mongo:mongoMigrationTest FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':adapter:outbound:persistence-mongo:mongoMigrationTest'.
> There were failing tests. See the report at: file:///home/donghyeon/workspace/desktop-server-git/clean-architecture-backend-template/src/adapter/outbound/persistence-mongo/build/reports/tests/mongoMigrationTest/index.html
* Try:
> Run with --scan to generate a Build Scan (Powered by Develocity).
BUILD FAILED in 2m 11s
16 actionable tasks: 4 executed, 12 up-to-date
EXIT=1
@@ -0,0 +1,33 @@
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:mongoStableContractTest
> Task :adapter:outbound:persistence-mongo:mongoReplicaSetTest
> Task :adapter:outbound:persistence-mongo:mongoFailoverTest
> Task :adapter:outbound:persistence-mongo:mongoMigrationTest
> Task :adapter:outbound:persistence-mongo:mongoCompatibilityTest
> Task :adapter:outbound:persistence-mongo:mongoSecurityIntegrationTest
> Task :adapter:outbound:persistence-mongo:compileMongoPerformanceTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processMongoPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:mongoPerformanceTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:mongoPerformanceTest
BUILD SUCCESSFUL in 2m 50s
20 actionable tasks: 7 executed, 13 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
EXIT=0
@@ -0,0 +1,27 @@
$ ./gradlew :adapter:outbound:persistence-mongo:mongoMigrationTest --console=plain
run-at: 2026-08-20T07:31:22Z
Mem: 30Gi 19Gi 858Mi 817Mi 12Gi 11Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:mongoMigrationTest
BUILD SUCCESSFUL in 13s
13 actionable tasks: 1 executed, 12 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,27 @@
$ ./gradlew :adapter:outbound:persistence-mongo:mongoPerformanceTest --console=plain
run-at: 2026-08-20T07:37:00Z
Mem: 30Gi 21Gi 664Mi 789Mi 9.5Gi 9.0Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileMongoPerformanceTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processMongoPerformanceTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:mongoPerformanceTestClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:mongoPerformanceTest
BUILD SUCCESSFUL in 26s
13 actionable tasks: 1 executed, 12 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,27 @@
$ ./gradlew :adapter:outbound:persistence-mongo:mongoReplicaSetTest --console=plain
run-at: 2026-08-20T07:33:01Z
Mem: 30Gi 19Gi 1.0Gi 804Mi 11Gi 11Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:mongoReplicaSetTest
BUILD SUCCESSFUL in 9s
13 actionable tasks: 1 executed, 12 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,27 @@
$ ./gradlew :adapter:outbound:persistence-mongo:mongoSecurityIntegrationTest --console=plain
run-at: 2026-08-20T07:34:53Z
Mem: 30Gi 19Gi 1.6Gi 795Mi 11Gi 11Gi
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileTestJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processTestResources NO-SOURCE
> Task :adapter:outbound:persistence-mongo:testClasses UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:mongoSecurityIntegrationTest
BUILD SUCCESSFUL in 1m 54s
13 actionable tasks: 1 executed, 12 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
exit=0
@@ -0,0 +1,164 @@
Starting a Gradle Daemon, 1 busy and 61 stopped Daemons could not be reused, use --status for details
> Task :build-logic:extractPluginRequests UP-TO-DATE
> Task :build-logic:generatePluginAdapters UP-TO-DATE
> Task :build-logic:compileJava UP-TO-DATE
> Task :build-logic:compileGroovy UP-TO-DATE
> Task :build-logic:compileGroovyPlugins UP-TO-DATE
> Task :build-logic:pluginDescriptors UP-TO-DATE
> Task :build-logic:processResources UP-TO-DATE
> Task :build-logic:classes UP-TO-DATE
> Task :build-logic:jar UP-TO-DATE
> Task :shared-contract:compileJava UP-TO-DATE
> Task :shared-contract:processResources UP-TO-DATE
> Task :shared-contract:classes UP-TO-DATE
> Task :shared-contract:jar UP-TO-DATE
> Task :application-core:compileJava UP-TO-DATE
> Task :application-core:processResources NO-SOURCE
> Task :application-core:classes UP-TO-DATE
> Task :application-core:jar UP-TO-DATE
> Task :domain-core:compileJava UP-TO-DATE
> Task :domain-core:processResources NO-SOURCE
> Task :domain-core:classes UP-TO-DATE
> Task :domain-core:jar UP-TO-DATE
> Task :messaging:messaging-core-api:compileJava UP-TO-DATE
> Task :messaging:messaging-observability:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-api:compileJava UP-TO-DATE
> Task :messaging:messaging-policy:compileJava UP-TO-DATE
> Task :messaging:messaging-reliability-api:compileJava UP-TO-DATE
> Task :messaging:messaging-security:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-api:compileJava UP-TO-DATE
> Task :messaging:messaging-transport-spi:compileJava UP-TO-DATE
> Task :messaging:messaging-admin-runtime:compileJava UP-TO-DATE
> Task :messaging:messaging-claim-check:compileJava UP-TO-DATE
> Task :messaging:messaging-cloudevents:compileJava UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-kafka:compileJava UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:compileJava UP-TO-DATE
> Task :messaging:messaging-rabbit:compileJava UP-TO-DATE
> Task :messaging:messaging-runtime-core:compileJava UP-TO-DATE
> Task :messaging:messaging-schema-json:compileJava UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:compileJava UP-TO-DATE
> Task :adapter:inbound:graphql:compileJava UP-TO-DATE
> Task :adapter:inbound:graphql:processResources UP-TO-DATE
> Task :adapter:inbound:graphql:classes UP-TO-DATE
> Task :adapter:inbound:graphql:jar UP-TO-DATE
> Task :adapter:inbound:web:compileJava UP-TO-DATE
> Task :adapter:inbound:web:processResources NO-SOURCE
> Task :adapter:inbound:web:classes UP-TO-DATE
> Task :adapter:inbound:web:jar UP-TO-DATE
> Task :adapter:outbound:support:compileJava UP-TO-DATE
> Task :adapter:outbound:support:processResources NO-SOURCE
> Task :adapter:outbound:support:classes UP-TO-DATE
> Task :adapter:outbound:support:jar UP-TO-DATE
> Task :adapter:outbound:cache-redis:compileJava UP-TO-DATE
> Task :adapter:outbound:cache-redis:processResources UP-TO-DATE
> Task :adapter:outbound:cache-redis:classes UP-TO-DATE
> Task :adapter:outbound:cache-redis:jar UP-TO-DATE
> Task :adapter:outbound:fileserver:compileJava UP-TO-DATE
> Task :adapter:outbound:fileserver:processResources NO-SOURCE
> Task :adapter:outbound:fileserver:classes UP-TO-DATE
> Task :adapter:outbound:fileserver:jar UP-TO-DATE
> Task :adapter:outbound:httpclient:compileJava UP-TO-DATE
> Task :adapter:outbound:httpclient:processResources NO-SOURCE
> Task :adapter:outbound:httpclient:classes UP-TO-DATE
> Task :adapter:outbound:httpclient:jar UP-TO-DATE
> Task :adapter:outbound:identifier:compileJava UP-TO-DATE
> Task :adapter:outbound:identifier:compileGroovy NO-SOURCE
> Task :adapter:outbound:identifier:processResources NO-SOURCE
> Task :adapter:outbound:identifier:classes UP-TO-DATE
> Task :adapter:outbound:identifier:jar UP-TO-DATE
> Task :adapter:outbound:messaging:compileJava UP-TO-DATE
> Task :adapter:outbound:messaging:processResources UP-TO-DATE
> Task :adapter:outbound:messaging:classes UP-TO-DATE
> Task :adapter:outbound:messaging:jar UP-TO-DATE
> Task :adapter:outbound:notification:compileJava UP-TO-DATE
> Task :adapter:outbound:notification:processResources NO-SOURCE
> Task :adapter:outbound:notification:classes UP-TO-DATE
> Task :adapter:outbound:notification:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:classes UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:jar UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:compileJava UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:processResources UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:classes UP-TO-DATE
> Task :adapter:outbound:persistence-mongo:jar UP-TO-DATE
> Task :app-bootstrap:compileJava UP-TO-DATE
> Task :app-bootstrap:processResources UP-TO-DATE
> Task :app-bootstrap:classes UP-TO-DATE
> Task :sample-portfolio:compileJava UP-TO-DATE
> Task :sample-portfolio:processResources UP-TO-DATE
> Task :sample-portfolio:classes UP-TO-DATE
> Task :sample-portfolio:jar UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:compileTestkitJava UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:processTestkitResources NO-SOURCE
> Task :adapter:outbound:persistence-jpa:testkitClasses UP-TO-DATE
> Task :adapter:outbound:persistence-jpa:testkitJar UP-TO-DATE
> Task :app-bootstrap:compileTestJava UP-TO-DATE
> Task :app-bootstrap:runtimeClasspathManifest UP-TO-DATE
> Task :app-bootstrap:processTestResources UP-TO-DATE
> Task :app-bootstrap:testClasses UP-TO-DATE
> Task :messaging:messaging-admin-api:processResources NO-SOURCE
> Task :messaging:messaging-admin-api:classes UP-TO-DATE
> Task :messaging:messaging-admin-api:jar UP-TO-DATE
> Task :messaging:messaging-admin-runtime:processResources NO-SOURCE
> Task :messaging:messaging-admin-runtime:classes UP-TO-DATE
> Task :messaging:messaging-admin-runtime:jar UP-TO-DATE
> Task :messaging:messaging-claim-check:processResources NO-SOURCE
> Task :messaging:messaging-claim-check:classes UP-TO-DATE
> Task :messaging:messaging-claim-check:jar UP-TO-DATE
> Task :messaging:messaging-cloudevents:processResources NO-SOURCE
> Task :messaging:messaging-cloudevents:classes UP-TO-DATE
> Task :messaging:messaging-cloudevents:jar UP-TO-DATE
> Task :messaging:messaging-core-api:processResources NO-SOURCE
> Task :messaging:messaging-core-api:classes UP-TO-DATE
> Task :messaging:messaging-core-api:jar UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:processResources UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:classes UP-TO-DATE
> Task :messaging:messaging-inbox-jdbc-postgresql:jar UP-TO-DATE
> Task :messaging:messaging-kafka:processResources NO-SOURCE
> Task :messaging:messaging-kafka:classes UP-TO-DATE
> Task :messaging:messaging-kafka:jar UP-TO-DATE
> Task :messaging:messaging-observability:processResources NO-SOURCE
> Task :messaging:messaging-observability:classes UP-TO-DATE
> Task :messaging:messaging-observability:jar UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:processResources UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:classes UP-TO-DATE
> Task :messaging:messaging-outbox-jdbc-postgresql:jar UP-TO-DATE
> Task :messaging:messaging-policy:processResources NO-SOURCE
> Task :messaging:messaging-policy:classes UP-TO-DATE
> Task :messaging:messaging-policy:jar UP-TO-DATE
> Task :messaging:messaging-rabbit:processResources NO-SOURCE
> Task :messaging:messaging-rabbit:classes UP-TO-DATE
> Task :messaging:messaging-rabbit:jar UP-TO-DATE
> Task :messaging:messaging-reliability-api:processResources NO-SOURCE
> Task :messaging:messaging-reliability-api:classes UP-TO-DATE
> Task :messaging:messaging-reliability-api:jar UP-TO-DATE
> Task :messaging:messaging-runtime-core:processResources NO-SOURCE
> Task :messaging:messaging-runtime-core:classes UP-TO-DATE
> Task :messaging:messaging-runtime-core:jar UP-TO-DATE
> Task :messaging:messaging-schema-api:processResources NO-SOURCE
> Task :messaging:messaging-schema-api:classes UP-TO-DATE
> Task :messaging:messaging-schema-api:jar UP-TO-DATE
> Task :messaging:messaging-schema-json:processResources NO-SOURCE
> Task :messaging:messaging-schema-json:classes UP-TO-DATE
> Task :messaging:messaging-schema-json:jar UP-TO-DATE
> Task :messaging:messaging-security:processResources NO-SOURCE
> Task :messaging:messaging-security:classes UP-TO-DATE
> Task :messaging:messaging-security:jar UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:processResources UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:classes UP-TO-DATE
> Task :messaging:messaging-spring-boot-starter:jar UP-TO-DATE
> Task :messaging:messaging-transport-spi:processResources NO-SOURCE
> Task :messaging:messaging-transport-spi:classes UP-TO-DATE
> Task :messaging:messaging-transport-spi:jar UP-TO-DATE
> Task :adapter:outbound:objectstorage:compileJava UP-TO-DATE
> Task :adapter:outbound:objectstorage:processResources NO-SOURCE
> Task :adapter:outbound:objectstorage:classes UP-TO-DATE
> Task :adapter:outbound:objectstorage:jar UP-TO-DATE
> Task :app-bootstrap:test
BUILD SUCCESSFUL in 1m 6s
94 actionable tasks: 1 executed, 93 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.0.0/userguide/configuration_cache_enabling.html
EXIT=0
@@ -0,0 +1,104 @@
# Task 3 — the ten-row activation matrix
Every row below names where its evidence is, and nothing is ticked from reasoning about the code.
Rows 17 and 10 are runtime lanes from one Compose matrix run, `20260819T025416Z-200172`; rows 8 and 9
needed work this wave and are described in full.
The per-lane `activation.json` is the application's own answer about which switches are on, not the
flags the harness passed in — which is the point of reading it rather than the lane definition.
| # | Matrix | Evidence | Resolved switches (from `activation.json`) |
| --- | --- | --- | --- |
| 1 | five off | `off-local`, `off-dev`, `off-prod` lanes + `FiveAdapterOffInventoryTest` | `local` / `dev` / `prod`, **none on** |
| 2 | JPA only | `local-jpa` lane | `local`, `persistence-jpa` |
| 3 | Mongo only | `local-mongo` lane | `local`, `persistence-mongo` |
| 4 | Messaging only | `local-messaging` lane | `local`, `messaging` |
| 5 | Notification + JPA, `INGEST_ONLY` | `local-notification-ingest` + `local-notification-handoff` | `local`, `persistence-jpa`+`notification.platform`, `APP_NOTIFICATION_PLATFORM_MODE: INGEST_ONLY` |
| 6 | Notification + JPA, `SERVING` | `local-notification-serving` | same switches, `MODE: SERVING` |
| 7 | GraphQL only | `local-graphql` lane | `local`, `graphql` |
| 8 | relay on, dependency missing | **this wave** — see below | n/a: the deployment is refused |
| 9 | JPA + Mongo | `all-adapters` lane + `PortResolutionContractTest` | `local`, both persistence switches on |
| 10 | five on | `all-adapters` lane | `local`, `graphql`,`messaging`,`persistence-jpa`,`persistence-mongo`,`notification.platform` |
Row 5's exactly-once claim is not inferred from the lane passing; the smoke client says it:
```
notification-smoke: b0e083cb-06c5-4dde-b454-4c4e26f65edc delivered exactly once and stayed that way
```
## Row 8 — a defect, found by running the row
The plan is explicit that Row 8 must be checked for the *name*, not merely for a failure. Checking it
that way found that the name was not what an operator got.
`ca-skeleton.outbox.enabled=true` with the JPA switch off is a dependency error this repository
names, and `CapabilityDependencyValidator` produces the sentence that names it. But the outbox is
also a registered relational consumer, so `DataSourceRequirement` reports that a pool is required,
`JpaOffAutoConfigurationImportFilter` therefore keeps Boot's relational auto-configurations in the
candidate set, and Hibernate and Flyway were instantiated during refresh — ahead of the
`InitializingBean` that carried the check. What actually came out was:
```
Unable to obtain connection from database: Connection to localhost:5433 refused.
```
Both components were right on their own. A pool does have consumers besides JPA, and the outbox does
need the JPA switch. The disagreement was only ever visible in **which one spoke first**, and no test
could see it: the existing `CapabilityDependencyValidatorTest` calls the validator's static method
against a `MockEnvironment`, which proves the rule computes the right sentence and nothing about
whether anything runs it in time.
**Fix.** The check moved to the environment stage
(`CapabilityDependencyEnvironmentValidator`, an `EnvironmentPostProcessor` at
`LOWEST_PRECEDENCE` alongside the master-switch and profile validators), where every property
source is resolved and nothing has been instantiated. The `InitializingBean` stays: a context built
without `spring.factories` — an `ApplicationContextRunner`, a slice test — never reaches the
post-processor, and the rule should not be optional there.
**Evidence, from the built jar rather than from a test harness** — see
[task3-row8-dependency-error.log](task3-row8-dependency-error.log):
```
### outbox on, JPA off exit code: 1
This deployment enables capabilities whose dependencies are off:
- ca-skeleton.outbox.enabled=true needs relational persistence to store rows;
set ca-skeleton.persistence-jpa.enabled=true or turn the outbox off.
- ca-skeleton.outbox.enabled=true needs somewhere to publish;
set app.messaging.enabled=true or turn the outbox off.
### relay on, outbox off exit code: 1
This deployment enables capabilities whose dependencies are off:
- ca-skeleton.outbox.relay-enabled=true only starts the scheduler for a capability that is off;
set ca-skeleton.outbox.enabled=true or turn the relay off.
```
`DependencyErrorStartupContractTest` pins this at the composition-root level, including a case that
boots all-off successfully — without it, every other assertion in that class would also be satisfied
by a validator that refuses everything.
## Row 9 — the positive half runs; the conflict half is pinned as a rule
`all-adapters` starts PostgreSQL and MongoDB and the application together, and the application
reports both persistence switches on. The two adapters implement disjoint ports, so there is no
ambiguity to resolve and no `@Primary` involved.
That absence is what needs pinning, because manufacturing a conflict would test Spring's
`NoUniqueBeanDefinitionException` rather than this repository. What can silently change is the
property the row depends on: that no port is resolved by preferring one bean over another. A
`@Primary` added later to settle an ambiguity would convert a startup rejection into a silent pick,
and every existing test would stay green, because the composition would still boot.
`PortResolutionContractTest` states the rule directly — a `@Primary` on a port implementation is
permitted only when a condition decides which one is active, which makes it a selector rather than a
tiebreak. The whole repository has three `@Primary` beans:
| bean | type | guard |
| --- | --- | --- |
| `inProcessDistributedLock` | `DistributedLockPort` | `multi-instance-enabled` false or absent |
| `distributedLockProvider` | `DistributedLockPort` | `multi-instance-enabled` true |
| `applicationTaskExecutor` | `TaskExecutor` | none — Boot's own contract wants a primary executor, and it is not a port |
The two lock beans cannot coexist, so neither is being preferred; one of them simply is not there.
The rule was falsified before being trusted: removing the `@ConditionalOnProperty` from
`distributedLockProvider` fails the test, and restoring it passes.
@@ -0,0 +1,26 @@
# Task 3 — the activation matrix, and where each row's evidence comes from
The plan's matrix is ten rows; the Compose contract is fifteen lanes; the in-process activation
suite is nineteen classes. They are not three copies of one thing, so this records which artefact
answers which row before anything is run. A row whose evidence is a passing unit test is recorded as
that, not as a runtime lane.
| # | Matrix row | Evidence |
| --- | --- | --- |
| 1 | five off | `off-local`, `off-dev`, `off-prod` lanes + `FiveAdapterOffInventoryTest` (bean/thread/endpoint inventory is in-process; a container cannot count beans) |
| 2 | JPA only | `local-jpa` lane (db + app) |
| 3 | Mongo only | `local-mongo` lane (mongo + rs-init + app) |
| 4 | Messaging only | `local-messaging` lane; `local-messaging-outbox` additionally proves the relay's database dependency |
| 5 | Notification + JPA, `INGEST_ONLY` | `local-notification-ingest`, and `local-notification-handoff` for the accept → restart → deliver-once half |
| 6 | Notification + JPA, `SERVING` | `local-notification-serving` |
| 7 | GraphQL only | `local-graphql` lane (keycloak + auth-smoke + graphql-smoke) |
| 8 | relay on, dependency missing | **no lane** — a startup that must be *rejected* is an in-process contract: `DependencyErrorStartupContractTest`, `CapabilityDependencyValidatorTest`. The plan requires the *name* of the missing switch, not merely a failure. |
| 9 | JPA + Mongo | `all-adapters` covers the both-on half; the two-implementations-of-one-port rejection is in-process (`CleanArchitectureTest` plus the composition tests), because it is a context-startup outcome |
| 10 | five on | `all-adapters` lane |
Rows 8 and 9 are deliberately not Compose lanes. Both are assertions that a context *refuses* to
start for a stated reason, and a Compose lane can only observe that a container exited — which is
the same observation for a missing switch, a bad password and a typo in a YAML key.
Lanes with no matrix row of their own — `shared-infra-local`, `shared-infra-dev`, `prod-smoke`
carry Task 4's environment evidence rather than Task 3's activation evidence.
@@ -0,0 +1,17 @@
# Task 3 Row 8 — a capability on with its dependency off: the real jar, the real exit code
### outbox on, JPA off
```
java.lang.IllegalStateException: This deployment enables capabilities whose dependencies are off:
- ca-skeleton.outbox.enabled=true needs relational persistence to store rows; set ca-skeleton.persistence-jpa.enabled=true or turn the outbox off.
- ca-skeleton.outbox.enabled=true needs somewhere to publish; set app.messaging.enabled=true or turn the outbox off.
exit code: 1
```
### relay on, outbox off
```
java.lang.IllegalStateException: This deployment enables capabilities whose dependencies are off:
- ca-skeleton.outbox.relay-enabled=true only starts the scheduler for a capability that is off; set ca-skeleton.outbox.enabled=true or turn the relay off.
exit code: 1
```
@@ -0,0 +1,165 @@
# Task 6 — the five reviews' P0 findings, reconciled
The remediation design this wave executed never referenced a review id (`grep -c` over it: zero).
It took one theme from the five reviews — five adapters ship and do not run — and Waves 06 executed
that theme. So "how much of the reviews is reflected" had never been measured. This is the first
measurement, and then the work that followed it.
Three read-only audits ran in parallel, one per review family, each instructed to treat a passing
test as evidence only when it exercises the real composition. Their headline claims were then
re-checked by hand before being acted on; one was wrong and is recorded as such below.
## Where the P0 set stood when measured
| Review | P0 | CLOSED | PARTIAL | OPEN |
| --- | ---: | ---: | ---: | ---: |
| jpa | 6 | 5 | 1 | 0 |
| messaging | 5 | 2 | 3 | 0 |
| graphql | 2 | 1 | 1 | 0 |
| notification | 12 | 1 | 11 | 0 |
| mongodb | 9 | 0 | 9 | 0 |
| **total** | **34** | **9** | **25** | **0** |
Nothing was OPEN: every P0 had been worked. What the audits found instead, in three independent
voices, was the same shape — **the implementation is substantially real and the gate under it is
thin**. Six notification adapter classes were referenced by zero tests. Both Mongo executors were
referenced by zero tests. Every messaging real-broker test skips silently without Docker. And the
Compose matrix, the strongest evidence this repository produces, runs in no workflow.
## What was fixed, and how each was proven
### NTF-004 / JPA-004 — the completion write was not fenced
Two audits reached this independently from different reviews, which is why it was taken first.
The claim is fenced (a single `FOR UPDATE SKIP LOCKED` CTE that bumps `lease_fence`) and the renew
is fenced. The *completion* was `findById → mutate → saveAndFlush` with no owner or fence predicate.
A worker whose lease expired during the provider call — the one stretch the platform deliberately
spends outside a transaction — came back and wrote its outcome over the row a new holder had already
claimed. The `@Version` column does not stop that: it detects a concurrent edit, not a superseded
writer, and the late worker's read is recent enough to win.
Fixed with conditional statements in the same idiom as the renew, `saveHeldBy`/`transitionHeldBy` on
the port returning empty when the lease is gone, and all four branches of `applyNextAction` moved
onto them. Losing the lease is not an error: the new holder owns the job and will record its own
outcome.
`@Modifying(clearAutomatically = true)` on both, because a native update bypasses the persistence
context and the immediate re-read would otherwise be served the values it just replaced — a trap one
of the audits had found elsewhere in this same platform.
**Proof:** two real-PostgreSQL cases in the JPA contract lane. A superseded holder's completion
matches zero rows and the live holder's state is untouched; the current holder's completion writes.
The second exists because without it the first is satisfied by a statement that matches nothing ever.
### NTF-012 — the SSRF guard had no callers
`requireExternallyRoutable` refuses the cloud metadata service, RFC 1918, link-local, IPv6 local,
userinfo disguise and multi-answer DNS. It had an eight-case test suite, all green, and **one
occurrence in the repository: its own definition.** The two sites it was written for —
`WebhookSubscription` and `SesProviderProperties` — still called `requireSecureOrLoopback`, which
reads the scheme and nothing else.
Both now call it. The new test goes through the constructors rather than the helper, because testing
the helper again is exactly what failed to catch this.
What is not closed: `allowLoopback` is true, so a user-supplied target naming `localhost` still
passes. Closing it means the allowance becomes a decision the caller states, and the caller does not
exist — WEBHOOK has no `ProviderRuntimeAssembler`, so a webhook profile refuses to boot and nothing
in production constructs the record. Writing the policy now would mean choosing its default with no
caller to check it against. Recorded in the code at the call site.
### NTF-001 — the documented callback switch broke startup
`CallbackRequestFactory` is a constructor argument of the MVC controller, the WebFlux handler and the
WebFlux configuration, and was produced by no production code — the only instantiation was in a test.
So `APP_NOTIFICATION_PLATFORM_CALLBACKS_ENABLED=true`, a key in the env registry and in the
configuration reference, did not enable callbacks; it failed the boot on an unsatisfied dependency.
The beans now exist, conditioned on the same switch. The missing `trusted-proxies` setting came with
them, defaulting to empty — with no entry, forwarded headers are not believed, because honouring
them unconditionally lets any caller choose the URL its own signature is checked against. Registered
in `application.yml`, the env registry, `.env.example` and the configuration reference; both
notification gates pass.
### MNG-007 — a health view Actuator could not read, and a reactive half nothing built
`MongoPlatformHealthIndicator` computed topology mismatch, secondary availability and a bounded
detail map, and implemented neither `HealthIndicator` nor `HealthContributor`. The adapter carries no
Actuator dependency and should not: the delivery platform had already established the shape, where
the adapter computes the facts and the composition root maps them onto `Health`. Done the same way.
Separately, every reactive class in the leaf — executor, consistency binder, session factory, cursor
guard — was declared by no configuration. They shipped and no configuration could construct them.
Now wired in a nested configuration conditioned on a `ReactiveMongoTemplate` *bean*, not just the
class: the class is on the compile classpath unconditionally, so a class condition alone would try to
build the reactive path in a servlet-only deployment and fail a startup for a capability nobody asked
for. Both the positive and the negative case are asserted.
### MNG-005 / MNG-023 — a deadline that only produced a report
The blocking executor compared elapsed time to the declared timeout *after* the callback returned,
and said so in its own comment: a Java callback cannot be interrupted mid driver call. That is an
overrun report, not a deadline.
The scoped API is the narrowed surface where the number can actually be sent, so every method taking
a `Query` or an `Aggregation` now carries it as `maxTimeMS`, which the server enforces. `insert` has
no query to attach it to. `Duration.ZERO` is refused, because zero means "no limit" to the server and
accepting it would turn a misconfiguration into an unbounded operation.
The raw escape hatches (`rawOperations()`, `executeInternal(...)`) are genuinely used inside the
platform by the geospatial, atomic and bulk operations, and their callers live in sibling packages,
so package-private cannot express the rule. It is enforced as a boundary from the composition root —
the only place that sees both the platform and everything consuming it. The rule was falsified by
widening its scope until it fired, and a second case asserts the platform still uses them, so the
rule cannot pass by the hatches having been deleted.
### MNG-006 — a guard that compared a declaration against nothing
`LocalDateTimeMappingGuard` was constructed `withoutConverters()` and then asked to validate the
manifest. It could only ever reject `LOCAL_DATE_TIME_WITH_REGISTERED_CONVERTER`: a deployment that
*had* registered the named converter was rejected exactly as loudly as one that had not, so the check
that exists to distinguish those two cases could not tell them apart. It now reads the converters the
deployment actually registered, and a test asserts the same manifest passes with the converter and
fails without it.
### MNG-008 — a promotion gate that required five of the six categories it declares
`MongoAdvancedPromotionEvidence.REQUIRED` listed six; `MongoAdvancedPromotionGate.verify()` required
five. `migration` was missing, so a promotion could pass with no migration evidence at all.
### GQL-002 — the batch policy applied to nothing
`GraphQlBatchLoaderRegistrar` carried the chunking, the budget and the request scope, was unit
tested, and was declared by no configuration — the only file mentioning it was itself. A field
resolving through `@BatchMapping` or a `DataLoader` met none of it. The chain
(`BatchPolicyRegistry → DataLoaderFactory → BatchLoaderRegistrar`) is now assembled by the platform.
The batch ceiling reuses `maximumPageSize` rather than adding a setting: both answer how many rows
one downstream call may ask for, and a batch limit above the page limit would let one request fan out
past the bound it already accepted.
## One thing an audit got wrong, and one fix that was reverted
The mongodb audit reported that the UUID axis is "declaration-only" and mapped onto the driver
nowhere. It is mapped — `MongoClientSettingsFactory` calls `.uuidRepresentation(...)`. Verified
before acting.
Acting on the adjacent concern — the manifest and the profile describing the same fact independently
— a startup check was written to refuse a disagreement between them. Writing its test showed the
disagreement cannot occur: `MongoUuidRepresentation` has two values, only `STANDARD` is writable, and
an existing check already refuses the other. **A guard for a state that cannot arise is the same
"declaration nothing checks" this wave has been removing**, so it was reverted rather than kept with
an unfalsifiable test.
## What remains, and why
- **NTF-012 loopback residue** — belongs with the change set that gives WEBHOOK an assembler.
- **MSG-015** — the application-owned port and anti-corruption bridge between `application-core` and
the messaging platform. The review names it and specifies the target shape; it is a runtime wiring
change, and the review itself says the physical work is a separate change set.
- **MSG-003/004/005 residue** — on code no deployment can execute: the platform's outbox and inbox
migrations are applied only by tests, the production Kafka transport is publish-only, and Rabbit
declares no transport bean.
- **P1 and P2 — 100 findings, never audited.** They were not in this remediation's scope and their
state is unknown. Saying so is the honest position; the P0 audit took three parallel agents and
the P1/P2 set is three times larger.