Sub-scope 05 (mongo) query + aggregation — manifest and negative-space probes revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-29T23:56:53+00:00 cwd=/shared/codebase/clean-architecture-backend-template/src === OWNED FILES === bd1a00feb05bd763ac1b60c4bba58cb10fb20f66 main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/MongoAggregationPlan.java 74 0d418661496039271fddf141871db7da9ad625f6 main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/MongoAggregationProfile.java 137 77dfb8127f180887cdd8ccccf168b924a7835f47 main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/MongoAggregationRisk.java 35 e3943a285f45a7938929305020c0a18a81a1c3d7 main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/MongoAggregationStageDescriptor.java 70 8ed663b789d66ef063c45ec7b84c08a8a3a142b6 main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java 109 fa19ea3af90410955979662933050214fb362ae5 main/java/dev/caskeleton/adapter/outbound/mongo/query/MongoFieldDescriptor.java 48 37aad70d93eec8e780299bae74f1b5d8f1aec99e main/java/dev/caskeleton/adapter/outbound/mongo/query/MongoOperator.java 73 0df5cb53d9ffd0cb8805d032f040301aeb4439ce main/java/dev/caskeleton/adapter/outbound/mongo/query/MongoQueryPolicy.java 197 76b64aea8129c7b2af6c93ac61fbc2fe26d985ef main/java/dev/caskeleton/adapter/outbound/mongo/query/MongoRegexPolicy.java 182 aa6db8904a9faf7658c5fa20da2868a7f03a9ae8 main/java/dev/caskeleton/adapter/outbound/mongo/query/MongoSortDescriptor.java 35 ccd0d04e560b03aba3ba773ef53d3d86e5fd83a0 main/java/dev/caskeleton/adapter/outbound/mongo/query/PolicyAwareMongoQueryBuilder.java 215 52caac4c793029523101f7005a360f3c75a5683e main/java/dev/caskeleton/adapter/outbound/mongo/query/budget/MongoBudgetEnforcer.java 59 227276706036025d4ade7ed73c2c31efad40b9db main/java/dev/caskeleton/adapter/outbound/mongo/query/budget/MongoBudgetPolicyRegistry.java 80 874b21adb182e2b76fb114312c61491590f65357 main/java/dev/caskeleton/adapter/outbound/mongo/query/budget/MongoOperationBudget.java 50 fd25ddbec5850e8aa720e2b6b04807a9624cf2ce main/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoCursorValueCodec.java 147 8e8d0f24a64bd65a99fa2709fcebe5d7aeff4f7c main/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetCursor.java 60 06d538f210979f1b692a60f82a20347e5180a382 main/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetCursorCodec.java 179 3c4b1ab9cd19e318c6f5b8ad7325a95dcd56f8cf main/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetPageRequest.java 79 fbb9597c181122d7ea6b91bb1688ced9e5d87960 main/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetQueryBuilder.java 118 c8ed45c5758ae57847e7230260bc61d6336106f1 main/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetSlice.java 41 c5e4dcc1f15e76650ef13bedc05b8e94e1dbbe04 main/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetSort.java 73 2eba3b368b9c5f49f2176b1799e3de2adf4b93ed main/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoNullSortOrdering.java 21 89fd5ff0bde84c41e4e04760de13b8db29d94002 test/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutorTest.java 108 b4a31a13b36509bc834917990384451d10fbcf7d test/java/dev/caskeleton/adapter/outbound/mongo/query/LiteralSearchIsExpressibleTest.java 88 f64f31f195837c736b4793b31dc72e10aa277c28 test/java/dev/caskeleton/adapter/outbound/mongo/query/PolicyAwareMongoQueryBuilderTest.java 118 16b5af361b3761756391ca085bf2baebf965fdc6 test/java/dev/caskeleton/adapter/outbound/mongo/query/budget/MongoBudgetEnforcerTest.java 74 114650961653168159cecbe5ec0dcde400a4002a test/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetCursorTypeTest.java 113 68b0ef6e5d06224088402d2477b3a1f9831df179 test/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetPageRequestBoundsTest.java 73 8882413c97ee97c4e17e24b88f91e3d93a1148e3 test/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetQueryBuilderTest.java 116 production: 22 test: 7 production LOC: 2082 total === 8.1 reachability: what the auto-configuration builds from this sub-scope === $ grep -n 'Aggregation\|QueryBuilder\|Keyset\|BudgetPolicyRegistry\|BudgetEnforcer\|QueryPolicy\|RegexPolicy' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/autoconfigure/MongoPlatformAutoConfiguration.java 15:import dev.caskeleton.adapter.outbound.mongo.query.budget.MongoBudgetEnforcer; 308: public MongoBudgetEnforcer mongoBudgetEnforcer() { 309: return new MongoBudgetEnforcer(); exit=0 $ git grep -n 'MongoBudgetEnforcer' -- 'adapter/outbound/persistence-mongo/src/main' | grep -v 'query/budget/MongoBudgetEnforcer.java' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java:5:import dev.caskeleton.adapter.outbound.mongo.query.budget.MongoBudgetEnforcer; adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java:30: private final MongoBudgetEnforcer enforcer; adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java:33: MongoOperations operations, MongoBudgetPolicyRegistry budgets, MongoBudgetEnforcer enforcer) { adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/autoconfigure/MongoPlatformAutoConfiguration.java:15:import dev.caskeleton.adapter.outbound.mongo.query.budget.MongoBudgetEnforcer; adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/autoconfigure/MongoPlatformAutoConfiguration.java:308: public MongoBudgetEnforcer mongoBudgetEnforcer() { adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/autoconfigure/MongoPlatformAutoConfiguration.java:309: return new MongoBudgetEnforcer(); exit=0 $ git grep -n 'PolicyAwareMongoAggregationExecutor\|PolicyAwareMongoQueryBuilder\|MongoKeysetCursorCodec\|MongoBudgetPolicyRegistry' -- 'adapter/outbound/persistence-mongo/src/main' | grep -v '/query/' | grep -v '/aggregation/' exit=1 === 8.2 the collection-name invariant and the one signature that takes a String === $ grep -n 'there is no path from a string to a collection' -B 4 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/imperative/MongoCollectionProfileRegistry.java exit=1 $ grep -n 'String collection' -B 6 -A 10 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java | sed -n '1,30p' 57- * permitted 58- */ 59- public List execute( 60- MongoOperationContext context, 61- MongoAggregationProfile profile, 62- MongoAggregationPlan plan, 63: String collection, 64- Class outputType) { 65- Objects.requireNonNull(context, "context"); 66- Objects.requireNonNull(collection, "collection"); 67- Objects.requireNonNull(outputType, "outputType"); 68- validate(plan, profile); 69- 70- MongoOperationBudget budget = budgets.require(context.operationName()); 71- MongoOperationBudget effective = 72- enforcer.narrow(budget, budget.narrowedTo(budgetFor(context, budget))); 73- exit=0 $ grep -n 'operations.aggregate' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java 76: AggregationResults results = operations.aggregate(aggregation, collection, outputType); exit=0 === 8.2b aggregation runs outside the imperative execution scope === $ grep -n 'MongoOperations operations' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java 26: private final MongoOperations operations; 33: MongoOperations operations, MongoBudgetPolicyRegistry budgets, MongoBudgetEnforcer enforcer) { exit=0 $ grep -n 'observer\|observation\|translator' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/aggregation/PolicyAwareMongoAggregationExecutor.java exit=1 === 8.3 regex policy: what 'forbidden' actually forbids === $ grep -n 'public static MongoRegexPolicy forbidden' -A 4 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/query/MongoRegexPolicy.java 91: public static MongoRegexPolicy forbidden() { 92- return new MongoRegexPolicy(1, Set.of(), true); 93- } 94- 95- /** exit=0 $ grep -n 'requireWithinLength(pattern)\|requireAnchored\|hasNestedQuantifier(pattern)' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/query/MongoRegexPolicy.java 28: int maxLength, Set allowedFlags, boolean requireAnchored) { 103: requireWithinLength(pattern); 111: if (requireAnchored && !pattern.startsWith("^")) { 117: if (hasNestedQuantifier(pattern)) { exit=0 === 8.4 keyset cursor: signing key origin === $ grep -n 'MINIMUM_KEY_BYTES\|public MongoKeysetCursorCodec' -A 3 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetCursorCodec.java 46: private static final int MINIMUM_KEY_BYTES = 32; 47- 48- private final SecretKeySpec key; 49- 50: public MongoKeysetCursorCodec(byte[] secret) { 51- Objects.requireNonNull(secret, "secret"); 52: if (secret.length < MINIMUM_KEY_BYTES) { 53- throw new IllegalArgumentException( 54: "a cursor signing key needs at least " + MINIMUM_KEY_BYTES + " bytes"); 55- } 56- this.key = new SecretKeySpec(secret.clone(), HMAC_ALGORITHM); 57- } exit=0 $ git grep -n 'new MongoKeysetCursorCodec' -- 'adapter/outbound/persistence-mongo/src' adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetCursorTypeTest.java:29: new MongoKeysetCursorCodec("k".repeat(32).getBytes(java.nio.charset.StandardCharsets.UTF_8)); adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetQueryBuilderTest.java:66: MongoKeysetCursorCodec codec = new MongoKeysetCursorCodec(SIGNING_KEY); adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetQueryBuilderTest.java:78: MongoKeysetCursorCodec codec = new MongoKeysetCursorCodec(SIGNING_KEY); adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/query/pagination/MongoKeysetQueryBuilderTest.java:113: assertThatThrownBy(() -> new MongoKeysetCursorCodec(new byte[16])) exit=0