Sub-scope 04 (mongo) imperative + reactive execution paths — manifest and negative-space probes
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
generatedAt=2026-08-29T23:53:46+00:00
cwd=/shared/codebase/clean-architecture-backend-template/src

=== OWNED FILES ===
bd819ce42effdd227845b9b1b1639618ec3d64b3 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/BoundScopedOperations.java 102
9ca5c1f7c0853c0db1f079128bc85570c518a152 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/DefaultMongoImperativeExecutor.java 196
f9631cf8e020dee1238866b7b3f13c4cd1bd0ab5 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoCollectionAccess.java 33
f434b20ba2e34c720ec050f65a2dc781ae29337b main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoCollectionProfileRegistry.java 75
f71be5443a164317df0d8627fd361b007e2ab082 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoCompletion.java 38
a64d0dedf7dcb7b8645096c7467aa416a598cce1 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoConsistencyBinder.java 126
5d0ef74de0b89b7a328e0cfb474d09446ed2a5af main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoImperativeCallback.java 13
ff5920b0271b62bcdb7d3cd727718be250e791e0 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoImperativeExecutor.java 20
b0a1fedb3b39c582cdfc2cc82ac90e08a737ea8c main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoOperationResult.java 37
dc50a9739878c1a9e24774da2a80a51d02a69e1f main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoPlatformCallback.java 18
ea227553b52a1b8fa886e4771ec1cfcc976b6d56 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoPlatformCollectionAccess.java 20
46631b1bbed247d20fe5381c305d86eb8ccc45ab main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoTemplateSupportContract.java 85
c4c5ecd798f432c93a934561aea6f6fd7a4ab286 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/ScopedMongoOperations.java 50
30cd39613f59540ae9ff84b2908d3fa75cdea253 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/AtomicFilter.java 75
2dda5259da52375bbaaacbceae168b4344004fe2 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/AtomicUpdate.java 217
082693c7670030ffa7cc4b1ab95b36670da08657 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/AtomicUpdateResult.java 57
b639ab673870704503e92f9e87ba892d95c4c881 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/MongoAtomicOperations.java 45
5dade5c4617f11e3b15d9c6b6defa8fa812fcc1c main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/MongoAtomicOperationsTemplate.java 140
40794c26f02579d3bbf66fca502a1409b9a5efd3 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/MongoAtomicPolicy.java 106
def51a52895d1731b194bec57111fb134f7075c4 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/MongoAtomicPolicyRegistry.java 107
b0f2ecb2fa0f2fd81b008e1748421955223bc2fb main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/MongoUpdateOperator.java 58
df6b86485f89106af6b4af45d610000931438a19 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/ReturnDocumentMode.java 25
ca2d14c8482166e7c2acefbc8d01a171277da6ef main/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkExecutor.java 134
f56bcdcee159b40c32cc96f17396002354e6a095 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkItemFailure.java 30
43b3c05d32ec5263aa37d9474713b3272f6fbb3c main/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkItemOutcome.java 38
a6398ac5191e1e00f700a9fd09cae93e5388970a main/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkMode.java 25
c6e35572cb3ddba638373b554870c655d5b00a1a main/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkResult.java 144
3a87002814463b90e135ce9503281e1c1cf039fe main/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkWritePlan.java 122
75ef16600ab391c72d1075024fc097ca07b2c58c main/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/SpringDataBulkFailureExtractor.java 42
c391a685d00e5560ff653cdc33fe5deb3967bcc0 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/revision/MongoDocumentNotFoundException.java 21
d06f3e5df186654919cb9ff6de76986baf07fcc3 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/revision/MongoOptimisticConflictTranslator.java 53
2bf3dacb8e9bb4733f0ab4d10c362f71cebaf2a2 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/revision/MongoRevision.java 38
eb7518388a0d078cf1d9156bdf4cb496ba840c66 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/revision/VersionedMongoUpdater.java 97
52417d945c0c1c27800d469e0709f40593c44710 main/java/dev/caskeleton/adapter/outbound/mongo/imperative/revision/VersionedUpdateCommand.java 115
2db9df019703d7bedbd8f90e2fc445152cef17b8 main/java/dev/caskeleton/adapter/outbound/mongo/reactive/BoundReactiveScopedOperations.java 66
292b1e0158e7694be19d318a8bb6fe95ea8d31fe main/java/dev/caskeleton/adapter/outbound/mongo/reactive/DefaultReactiveMongoExecutor.java 222
76bd226fc05f492019dcbf296f364c1628fabf98 main/java/dev/caskeleton/adapter/outbound/mongo/reactive/ReactiveMongoCallback.java 18
94b00b5175ef8cc2e198bb2d7bc876378ac5e7df main/java/dev/caskeleton/adapter/outbound/mongo/reactive/ReactiveMongoCollectionAccess.java 32
e34ebe97b6eb69a0415700eab44f4d12fdc88d39 main/java/dev/caskeleton/adapter/outbound/mongo/reactive/ReactiveMongoConsistencyBinder.java 113
2f0860eb5c4fb184075e671da4c6734a68fc9223 main/java/dev/caskeleton/adapter/outbound/mongo/reactive/ReactiveMongoContextKeys.java 23
0bcb6a5c85ea46f7fd394bbc61d092140b10a0bb main/java/dev/caskeleton/adapter/outbound/mongo/reactive/ReactiveMongoExecutor.java 22
30011d26717c7b926ebdafa4e0dea9661a37e907 main/java/dev/caskeleton/adapter/outbound/mongo/reactive/ReactiveScopedMongoOperations.java 41
969bc61661e7355d013b8f94752ccaaf4862509a main/java/dev/caskeleton/adapter/outbound/mongo/reactive/cursor/MongoCursorGuard.java 96
ed74a65d40205252e3db4fab279e47cadde1afa3 main/java/dev/caskeleton/adapter/outbound/mongo/reactive/cursor/MongoCursorLease.java 22
4a5a5cb0de9db51f781ad65606da498df2e01861 main/java/dev/caskeleton/adapter/outbound/mongo/reactive/cursor/MongoCursorTermination.java 33
4e976c8bcabdf0635e406d9fa35256af466b3246 main/java/dev/caskeleton/adapter/outbound/mongo/reactive/cursor/MongoReactiveCursorPublisher.java 91
758d2bb7c30b90842e3d3eae9e1e93fb7a157476 main/java/dev/caskeleton/adapter/outbound/mongo/reactive/cursor/MongoResultBudgetTracker.java 88
a59cd62d3ec1f70ccd5cea2ca883ee32e2fb99fa test/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoCollectionProfileRegistryTest.java 54
98745d960c3cdca9748c0a6554e030d7a1096386 test/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoCompletionTest.java 51
2d7a52852bc8146457a0437d9b459dab8da2c876 test/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoConsistencyBinderContractTest.java 79
5316416fff8ae2215a27a7c630f86e1cbd5e2752 test/java/dev/caskeleton/adapter/outbound/mongo/imperative/ScopedAccessSurfaceTest.java 80
cd88d9aaf2443b8c433bb706b9c51ea79f4ec4d4 test/java/dev/caskeleton/adapter/outbound/mongo/imperative/ScopedOperationDeadlineTest.java 85
89a38653daf3857e35e35715af25586bd8cf5382 test/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/MongoAtomicOperationsTemplateTest.java 96
c92c28f8fd96f07c5afb74b3b57fedf9dc1a467c test/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/BulkSharesTheAtomicPolicyTest.java 101
cc9c45c4b7938b36d77f77ed5143b9d7ca0b4035 test/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkExecutorTest.java 87
a70120ddf8b8325f9f6008194a8adbdff32d819c test/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkOutcomeTest.java 127
ed73347fabdebff242a4741f4b3cf0dfda3405c1 test/java/dev/caskeleton/adapter/outbound/mongo/imperative/revision/VersionedMongoUpdaterTest.java 233
da68937aaa439844e7197027e92c3043a3fdc521 test/java/dev/caskeleton/adapter/outbound/mongo/reactive/ReactiveBinderCarriesRuntimeContractTest.java 79
f5ae575038e3198c65754a5d484d8e5e30858c62 test/java/dev/caskeleton/adapter/outbound/mongo/reactive/cursor/MongoCursorGuardTest.java 107
ae30f644ae33792316dda461a4cd2cc012cfba37 test/java/dev/caskeleton/adapter/outbound/mongo/reactive/cursor/MongoCursorQueryIsolationTest.java 91
9fb7148eb432f21c1f80c08cae503207c5602a30 test/java/dev/caskeleton/adapter/outbound/mongo/reactive/cursor/MongoResultBudgetTrackerTest.java 83

production: 47
test: 14
production LOC:   3369 total

=== 8.1 reachability: which execution beans a production configuration builds ===
$ grep -n 'DefaultMongoImperativeExecutor\|DefaultReactiveMongoExecutor\|MongoAtomicOperationsTemplate\|MongoBulkExecutor\|VersionedMongoUpdater\|MongoCursorGuard' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/autoconfigure/MongoPlatformAutoConfiguration.java
10:import dev.caskeleton.adapter.outbound.mongo.imperative.DefaultMongoImperativeExecutor;
114:  public DefaultMongoImperativeExecutor mongoImperativeExecutor(
119:    return new DefaultMongoImperativeExecutor(consistency, collections, translator, observer);
148:  public dev.caskeleton.adapter.outbound.mongo.imperative.atomic.MongoAtomicOperationsTemplate
150:          DefaultMongoImperativeExecutor executor,
154:        .MongoAtomicOperationsTemplate(executor, policies);
166:  public dev.caskeleton.adapter.outbound.mongo.imperative.bulk.MongoBulkExecutor mongoBulkExecutor(
167:      DefaultMongoImperativeExecutor executor,
169:    return new dev.caskeleton.adapter.outbound.mongo.imperative.bulk.MongoBulkExecutor(
176:   * <p>The reactive half shipped and was wired by nothing. {@code DefaultReactiveMongoExecutor},
293:    public dev.caskeleton.adapter.outbound.mongo.reactive.DefaultReactiveMongoExecutor
300:      return new dev.caskeleton.adapter.outbound.mongo.reactive.DefaultReactiveMongoExecutor(
exit=0

=== 8.2 the server-side deadline: who applies it and who does not ===
$ git grep -n 'access.scoped()' -- 'adapter/outbound/persistence-mongo/src/main'
exit=1

$ git grep -n 'rawOperations()' -- 'adapter/outbound/persistence-mongo/src/main'
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/geo/SpringMongoGeospatialOperations.java:58:              return access.rawOperations().find(near, documentType, access.collection());
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/geo/SpringMongoGeospatialOperations.java:82:              return access.rawOperations().find(within, documentType, access.collection());
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/DefaultMongoImperativeExecutor.java:192:    public MongoOperations rawOperations() {
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoPlatformCollectionAccess.java:19:  MongoOperations rawOperations();
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/MongoAtomicOperationsTemplate.java:84:                        access.rawOperations(),
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/MongoAtomicOperationsTemplate.java:92:                        access.rawOperations(),
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkExecutor.java:69:                  access.rawOperations().bulkOps(plan.mode().toSpringMode(), access.collection());
exit=0

$ git grep -n 'maxTimeMsec\|maxTime(' -- 'adapter/outbound/persistence-mongo/src/main'
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java:106:            .maxTime(Duration.ofMillis(budget.maxTimeMillis()));
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/BoundScopedOperations.java:53:    return query.maxTimeMsec(timeout.toMillis());
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/BoundScopedOperations.java:98:                .maxTime(timeout)
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/migration/MongoMigrationRunner.java:127:            template.maxTime(),
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/migration/MongoMigrationRunner.java:130:            heartbeatFor(lock, template.maxTime()));
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/migration/MongoMigrationRunner.java:142:    lock.refresh(template.maxTime());
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/query/PolicyAwareMongoQueryBuilder.java:200:    query.maxTimeMsec(budget.maxTimeMillis());
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/reactive/cursor/MongoReactiveCursorPublisher.java:58:            .maxTimeMsec(budget.maxTimeMillis())
exit=0

$ grep -n 'Math.min(registered.maxTimeMillis(), contextMillis)' -B 4 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java
92-    long contextMillis = Math.max(1L, context.timeout().toMillis());
93-    return new MongoOperationBudget(
94-        registered.maxResults(),
95-        registered.maxResultBytes(),
96:        Math.min(registered.maxTimeMillis(), contextMillis),
exit=0

$ grep -n 'query.maxTimeMsec' -B 3 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/query/PolicyAwareMongoQueryBuilder.java
197-          org.springframework.data.mongodb.core.query.Collation.of(policy.collationProfile()));
198-    }
199-    query.limit(budget.maxResults());
200:    query.maxTimeMsec(budget.maxTimeMillis());
exit=0

$ grep -n 'that is the difference between a deadline and a report about one' -B 3 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/BoundScopedOperations.java
exit=1

=== 8.2b the timeout-breach path records success and then failure on one observation ===
$ grep -n 'observation.success(outcome);' -A 10 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/DefaultMongoImperativeExecutor.java | head -24
97:          observation.success(outcome);
98-          throw MongoOperationRejectedException.of(
99-              context.operationName().value(),
100-              "the operation ran for "
101-                  + elapsed.toMillis()
102-                  + "ms against a declared timeout of "
103-                  + context.timeout().toMillis()
104-                  + "ms");
105-        }
106:        observation.success(outcome);
107-        return new MongoOperationResult<>(context, value, outcome, elapsed);
108-      } catch (MongoPersistenceException alreadyTranslated) {
109-        observation.failure(alreadyTranslated.failureContext());
110-        throw alreadyTranslated;
111-      } catch (MongoException driverFailure) {
112-        throw translated(context, operationType, startedAt, observation, driverFailure);
113-      } catch (DataAccessException springFailure) {
114-        throw translated(context, operationType, startedAt, observation, unwrap(springFailure));
115-      }
116-    }
exit=0

$ grep -n 'catch (MongoPersistenceException alreadyTranslated)' -A 3 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/DefaultMongoImperativeExecutor.java
108:      } catch (MongoPersistenceException alreadyTranslated) {
109-        observation.failure(alreadyTranslated.failureContext());
110-        throw alreadyTranslated;
111-      } catch (MongoException driverFailure) {
exit=0

$ grep -n 'public void success\|public void failure\|outcomeTags =\|sample.stop' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/observation/MicrometerMongoOperationObserver.java
72:      this.outcomeTags = Tags.of("result", "unknown", "failureCategory", "none");
76:    public void success(MongoExecutionOutcome outcome) {
77:      outcomeTags = Tags.of("result", outcome.name(), "failureCategory", "none");
81:    public void failure(MongoFailureContext failureContext) {
82:      outcomeTags =
101:      sample.stop(registry.timer(TIMER_NAME, baseTags.and(outcomeTags)));
exit=0

=== 8.3 empty-registry defaults: two of them, two different failure shapes ===
$ grep -n 'MongoAtomicPolicyRegistry.empty()' -B 6 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/autoconfigure/MongoPlatformAutoConfiguration.java
exit=1

$ grep -n 'MongoOperationRejectedException' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/atomic/MongoAtomicPolicyRegistry.java
4:import dev.caskeleton.adapter.outbound.mongo.api.error.MongoOperationRejectedException;
52:   * @throws MongoOperationRejectedException when the profile has no registered policy
58:      throw MongoOperationRejectedException.of(
exit=0

=== 8.3b bulk and atomic share one policy registry (the bypass that was closed) ===
$ grep -n 'There is one constructor now' -B 6 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/bulk/MongoBulkExecutor.java
34-   * A bulk executor that enforces the same field and operator policy the atomic path enforces.
35-   *
36-   * <p>The single-document path validated every filter and update against the collection's policy;
37-   * the bulk path did not look at it, and its policies were an optional constructor argument that
38-   * defaulted to none. Protected fields and unregistered operators were therefore reachable by
39-   * putting the same update inside a batch — the policy held for one document and not for a
40:   * thousand. There is one constructor now because an executor that can be built without policies
exit=0

=== 8.4 reactive: cancellation records no success, and the observation still closes ===
$ grep -n 'doOnComplete\|doOnSuccess\|Flux.using\|Mono.using\|MongoOperationObservation::close' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/reactive/DefaultReactiveMongoExecutor.java
72:    return Mono.using(
79:                    .doOnSuccess(
86:            MongoOperationObservation::close)
104:    return Flux.using(
109:                    .doOnComplete(
116:            MongoOperationObservation::close)
exit=0

