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: *
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- *
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