Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/137-mongo-advanced-manifest-and-probes.txt
T
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.

Follows the import procedure in README.md.

  source/     the originating repository verbatim — 78 documents, 28 SVGs,
              8 manifests, plus .source-revision recording the commit
  final/      the SSOT
    document.md   729 lines written from the 29 experiment documents, not
                  concatenated: what was predicted, what was measured, and
                  where the measurement itself was wrong
    evidence/raw    125 outputs, flattened to <experiment>__<file> because
                    the originals collided (01-baseline.txt appeared three
                    times) and the audit only globs the top level
    evidence/meta   one per raw file; command and exitCode are null and the
                    README says why rather than inventing them
    evidence/browser  22 captures
    assets/       three diagrams through techviz
    .techviz/     their VizSpecs

A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.

Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.

verify-pipeline.py passes. audit-records.py reports no issues.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 22:51:59 +09:00

454 lines
35 KiB
Plaintext

Sub-scope 10 (mongo) advanced/** - manifest and negative-space probes
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
generatedAt=2026-08-30T00:27:31+00:00
=== OWNED FILES ===
cf0b58082713dff7ed4b8d4dac613359dd01343d main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedCapabilityFlags.java 84
76a78f17b37f3e6d9531e6cc8bbac469ab913324 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedCapabilityGuard.java 81
57558b21d7ef2650d4c51123ff141e85f320181e main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedEntryPoint.java 33
4eb1bfbafd243fd96995da10292d5b19dbdd1b32 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedPolicy.java 24
1042d08eb388d4542cee4fa153d36d665992d942 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedPromotionEvidence.java 61
98a57ef8c8d096b892482a5f6794a63adebac956 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedPromotionGate.java 47
fbaf4fa730bad951431e9371fb2bb1ffd492c997 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/autoconfigure/MongoAdvancedConfiguration.java 43
ecd0d65bc26811770219b40d6249fba0fdfd9b80 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/autoconfigure/MongoAdvancedSettings.java 49
879181c1a388cd35c232c096093e762428e659e4 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoBridgeCheckpointPolicy.java 35
50563d099ba0e60c5767e6eb7ecbdcb4ff928c9c main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoBridgeOutboxPolicy.java 46
f7e563641d1ece707e73b3cd36de604034e4bfe3 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoChangeMessagingBridge.java 87
6e01fc6246368f95435ede76804d1908ee2b93f1 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoChangeToIntegrationEventMapper.java 24
d02e9b227e4e67e21323624e3cd53136d3f55805 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoIntegrationEventEnvelope.java 37
f092848cf4e5617d84d368cdb10bf9109d1132f5 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoIntegrationEventPublisher.java 25
da8c3a9c30a8acacf2440f0a8696da76f57be165 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoPublishResult.java 51
ac63404c901a2ad79140aaed876d8049cf6ae451 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/csfle/MongoCsfleClientFactory.java 54
16d32b92c40b0d9966eb83a2db9d85840058eb4c main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/csfle/MongoCsfleFieldPolicy.java 57
6ffcec5b844f64611b0b9d9ea4edd8ec7c2d376a main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/csfle/MongoCsfleMode.java 32
32d83861cdb0c511ac9b944a274c2694a1c16fc2 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/csfle/MongoCsfleProfile.java 60
47de1e2bf771a2a5d3e496fcfb9fc708fbb9f8ca main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/csfle/MongoDataKeyResolver.java 28
51ccb6a71690787ec834dd9e31efc6967e047dbb main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/qe/MongoEncryptedFieldDescriptor.java 62
f2f055643c8f03eaaebda115ad46da3e54604408 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/qe/MongoEncryptionMetadataOwnership.java 47
0d68cd3d1808ba6f7e1d97b659b29170a3652dea main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/qe/MongoQueryShape.java 32
fd6af5d50e9e25d7b488bc8b35a3c5fdee2512d1 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/qe/MongoQueryShapeSupport.java 32
d68b7d6dadbc389f088649739fd0c3e6ddfa8aca main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/qe/MongoQueryableEncryptionCollectionManager.java 72
c4eba71a5cac8dcf3d243a34d67fc025c1ca9ab2 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/qe/MongoQueryableEncryptionProfile.java 75
436fc3081a1d3a31964904617c62fe82b5634cdc main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/qe/MongoQueryableEncryptionQueryType.java 19
f48ecabd05430ccd7ff147038d3a99d65754b780 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/gridfs/MongoGridFsCompatibilityReader.java 45
9a64c88c5d4041bfb0fc822867ce2845add2901f main/java/dev/caskeleton/adapter/outbound/mongo/advanced/gridfs/MongoGridFsMigrationCheckpoint.java 106
6ab3e4e59f6ae0553ef65439be2f358ef837dbb6 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/gridfs/MongoGridFsMigrationJob.java 86
58dec8cf9ff53b6b5f643a0d17521e4222901e57 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/gridfs/MongoGridFsObjectReference.java 33
3f201c0830d8743d022c7048f295baacffad1e7a main/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchIndexDescriptor.java 38
3b4f825030dab1985e0faefa05e2f25b74395e8a main/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchIndexState.java 32
d8c87417264c8d6288ab1788dcd71d94ac5940aa main/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchOperations.java 28
f371ff53b7127138ef03d5faf0a795dd703292fa main/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchQuery.java 57
fa4737ae0f1a0647f0e1c861ec23cba7ad4694e2 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchReadinessGate.java 37
77525497a042f7d2354721a2a7590c77ebf05c25 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/MongoRoutingClassification.java 29
d0a809bc54d712cd102ef27e2de3b9a4e5d861a4 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/ShardAwareQueryValidator.java 89
40ba3eae2d898ecd7b02c99f0f960683ff1a9026 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/ShardKeyDescriptor.java 75
d7772f9446c764421ccbed83dee671a2c59f8d3e main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/ShardKeyPart.java 20
4367c5bdbc898bc1d6f39069ea6ed192ab847010 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/ShardStrategy.java 23
e8b325e6fc5373e3adf7facd11064937132f7d7c main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/MongoShardingAdminGateway.java 94
c061609d842ff0aca9e7dc14b25e65e36e98acbd main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/ReshardApproval.java 55
6b1d5c4e1629d5fa41bc9487782518829a7868a9 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/ShardKeyAnalyzer.java 78
46cb8bf0f8ef7364ac723fc9c2df53bfcaafdbd1 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/ShardKeyReadinessReport.java 61
d322b44756a0d7066e2d03dfb496042b2f39af04 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/database/MongoTenantClientRegistry.java 141
c1abb429cd5f94ee8ceb9ac7fbe40fb0d61e4ff6 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/database/MongoTenantDatabaseResolver.java 18
395a950d8873bac0b7497562e534bee7217cfaa1 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/database/MongoTenantLifecyclePolicy.java 74
82062210a9f80c077858d5649152c3a8ecd78574 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/database/MongoTenantMigrationCheckpointStore.java 31
5e6cef68234114f4441ed526c5b9ea102d26865a main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/database/MongoTenantMigrationCoordinator.java 134
68457ed1fcccbdc1db8783973abc2a488b2c0033 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/shared/MongoTenantContext.java 52
2b2ab94c13123b2bd1e3da8db3ef0271d4fb6b07 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/shared/MongoTenantManifestValidator.java 70
11e935c18a38b1aa28704ccfe2f90022961aabb3 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/shared/MongoTenantPredicateInjector.java 67
19c752c2e3c93358932d7cfbbaedef76c482b163 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/shared/TenantScopedMongoOperations.java 39
d3964e66a3232a317d58aebb69f225a3107e8c66 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesCapability.java 24
256607703623d14df02ca42caac6fc5008c5e456 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesCapabilityValidator.java 70
edc4892d5534c6806111dd5d562b175ab5f9e3e5 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesDescriptor.java 52
e89ca8f952e66889127afdada563fda74e36f8af main/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesGranularity.java 33
6649eff9590942094adedd2f114f6a9b0ec8a608 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesOperations.java 34
31a0987535a07f5320921542aa14248bf75248e2 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesSupport.java 40
abf5bd6a66042ed92869f561ff44341dd32dafe9 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoEmbedding.java 65
efde94add89c656f4c9d75e93a495e6a63c80cc8 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorIndexDescriptor.java 53
8f8a962368163508d4b9f0572c2968292b5cd8ea main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorQuery.java 62
a8677d6e3a3f97a6b1f7c12203951c98915ae149 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchBenchmarkGate.java 60
c4f034b9ab823dfc15f89f22ac73b381bcefcb69 main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchOperations.java 37
cce5a22c86eae1da860b17bf9c0dc1c5e4de3edc test/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedPromotionGateTest.java 97
360f67467463ad5aad2647554ada6d04a76bf9fb test/java/dev/caskeleton/adapter/outbound/mongo/advanced/autoconfigure/MongoAdvancedConfigurationTest.java 109
efd2c30ccd34991599ec31a3fbaf81aa63180d34 test/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoChangeMessagingBridgeTest.java 159
4eea828823db53ad6fc98bfeb3478054697dfb13 test/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/MongoEncryptionContractTest.java 158
6689b007848f5c089836ec204f864734f76739bb test/java/dev/caskeleton/adapter/outbound/mongo/advanced/gridfs/MongoGridFsMigrationJobTest.java 197
862fe567c572a8eda132849606fddfa30dd44564 test/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchReadinessGateTest.java 110
e504b3a379f503c173a748809557ecd05c2a2184 test/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/ShardAwareQueryValidatorTest.java 81
77f7540a360d6235054b372897ffede9c3f0cd08 test/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/ShardKeyAnalyzerTest.java 103
b3869ce22bf9348db19ce6f61806fef4517a0d75 test/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/MongoTenancyContractTest.java 276
66c0f6a2991e5049f97233a41e48bb320703c3a5 test/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesCapabilityValidatorTest.java 75
production: 65
test: 10
production LOC: 3439 total
=== 8.1 reachability: the guard bean and who imports the Advanced configuration ===
$ git grep -rn 'MongoAdvancedConfiguration' -- . | grep -v 'advanced/autoconfigure/MongoAdvancedConfiguration.java'
adapter/outbound/persistence-mongo/CLAUDE.md:142: `MongoAdvancedProperties`. `MongoAdvancedConfiguration` is imported by name, never auto-loaded:
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/autoconfigure/MongoAdvancedSettings.java:19: * MongoAdvancedConfigurationTest} asserts the two cannot drift apart.
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/advanced/autoconfigure/MongoAdvancedConfigurationTest.java:26:class MongoAdvancedConfigurationTest {
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/advanced/autoconfigure/MongoAdvancedConfigurationTest.java:31: .withUserConfiguration(MongoAdvancedConfiguration.class)
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/advanced/autoconfigure/MongoAdvancedConfigurationTest.java:46: .withUserConfiguration(MongoAdvancedConfiguration.class)
exit=0
$ grep -rn 'advanced' adapter/outbound/persistence-mongo/src/main/resources/META-INF/spring/*.imports
exit=1
$ git grep -rn 'MongoAdvancedCapabilityGuard' -- 'adapter/outbound/persistence-mongo/src/main' | grep -v '/advanced/'
exit=1
=== 8.1b the entry-point / policy classification, counted ===
$ git grep -l '@MongoAdvancedEntryPoint' -- 'adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced' | sort
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoChangeMessagingBridge.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/csfle/MongoCsfleClientFactory.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/qe/MongoQueryableEncryptionCollectionManager.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/gridfs/MongoGridFsMigrationJob.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/MongoShardingAdminGateway.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/database/MongoTenantClientRegistry.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/database/MongoTenantMigrationCoordinator.java
exit=0
$ git grep -l '@MongoAdvancedPolicy' -- 'adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced' | sort
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedCapabilityFlags.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedCapabilityGuard.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedPromotionGate.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/encryption/qe/MongoEncryptionMetadataOwnership.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchReadinessGate.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/ShardAwareQueryValidator.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/ShardKeyAnalyzer.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/shared/MongoTenantManifestValidator.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/shared/MongoTenantPredicateInjector.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesCapabilityValidator.java
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoEmbedding.java
exit=0
$ git grep -c 'public final class\|public class' -- 'adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced' | wc -l
19
exit=0
$ git grep -n 'MongoAdvancedRules' -- 'adapter/outbound/persistence-mongo/src'
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedEntryPoint.java:22: * the first call against a cluster that has no such feature. {@code MongoAdvancedRules} enforces
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoAdvancedRulesTest.java:12:import dev.caskeleton.adapter.outbound.mongo.testkit.arch.MongoAdvancedRules;
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoAdvancedRulesTest.java:28:class MongoAdvancedRulesTest {
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoAdvancedRulesTest.java:38: assertThatCode(() -> MongoAdvancedRules.everyAdvancedTypeIsClassified().check(production))
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoAdvancedRulesTest.java:45: assertThatCode(() -> MongoAdvancedRules.everyEntryPointConsultsTheGuard().check(production))
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoAdvancedRulesTest.java:56: MongoAdvancedRules.everyAdvancedTypeIsClassified(
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoAdvancedRulesTest.java:57: MongoAdvancedRulesTest.class.getPackageName() + "..")
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoAdvancedRulesTest.java:68: assertThatThrownBy(() -> MongoAdvancedRules.everyEntryPointConsultsTheGuard().check(fixtures))
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoAdvancedRulesTest.java:79: assertThatThrownBy(() -> MongoAdvancedRules.everyEntryPointConsultsTheGuard().check(fixtures))
adapter/outbound/persistence-mongo/src/testkit/java/dev/caskeleton/adapter/outbound/mongo/testkit/arch/MongoAdvancedRules.java:29:public final class MongoAdvancedRules {
adapter/outbound/persistence-mongo/src/testkit/java/dev/caskeleton/adapter/outbound/mongo/testkit/arch/MongoAdvancedRules.java:33: private MongoAdvancedRules() {}
exit=0
=== 8.2 the sharding admin gateway: high-risk operations through the 5-arg execute ===
$ grep -n 'adminGateway.execute' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/MongoShardingAdminGateway.java
64: adminGateway.execute(MongoAdminOperation.SHARD_COLLECTION, collection, operator, reason, apply);
75: adminGateway.execute(MongoAdminOperation.REFINE_SHARD_KEY, collection, operator, reason, apply);
86: adminGateway.execute(
92: adminGateway.execute(MongoAdminOperation.BALANCER_CONTROL, scope, operator, reason, apply);
exit=0
$ grep -n 'SHARD_COLLECTION\|REFINE_SHARD_KEY\|RESHARD_COLLECTION\|BALANCER_CONTROL' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/security/admin/MongoAdminOperation.java
37: SHARD_COLLECTION(true),
40: REFINE_SHARD_KEY(true),
43: RESHARD_COLLECTION(true),
46: BALANCER_CONTROL(false),
exit=0
$ grep -n 'public <T> T execute(' -A 14 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/security/admin/MongoAdminGateway.java | head -40
57: public <T> T execute(
58- MongoAdminOperation operation,
59- String target,
60- String operator,
61- String reason,
62- Supplier<T> body) {
63- return execute(
64- MongoAdminCommand.routine(
65- operation, target, operator, reason, clock.instant().plus(COMMAND_VALIDITY)),
66- null,
67- body);
68- }
69-
70- /**
71- * Runs one administrative command under the audit state machine.
--
83: public <T> T execute(MongoAdminCommand command, MongoAdminApproval approval, Supplier<T> body) {
84- Objects.requireNonNull(command, "command");
85- Objects.requireNonNull(body, "body");
86- Instant now = clock.instant();
87- authorization.require(command.operation());
88- if (command.expiredAt(now)) {
89- throw MongoOperationRejectedException.of(
90- "admin.command",
91- "this admin command expired before it ran; a stale command may describe a cluster that no"
92- + " longer looks like the one it was written for");
93- }
94- if (command.operation().highRisk()) {
95- if (approval == null) {
96- throw MongoOperationRejectedException.of(
97- "admin.approval",
exit=0
=== 8.2b duplicated shard-key/index compatibility logic ===
$ grep -n 'supportsUniqueIndexOn' -A 10 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/ShardKeyDescriptor.java
67: public boolean supportsUniqueIndexOn(List<String> indexFields) {
68- Objects.requireNonNull(indexFields, "indexFields");
69- List<String> shardFields = fields();
70- if (indexFields.size() < shardFields.size()) {
71- return false;
72- }
73- return indexFields.subList(0, shardFields.size()).equals(shardFields);
74- }
75-}
exit=0
$ grep -n 'supportingIndexFields' -A 8 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/MongoShardingAdminGateway.java
42: List<String> supportingIndexFields,
43- String operator,
44- String reason,
45- Supplier<Void> apply) {
46- Objects.requireNonNull(collection, "collection");
47- Objects.requireNonNull(shardKey, "shardKey");
48- Objects.requireNonNull(readiness, "readiness");
49- if (!readiness.approved()) {
50- throw MongoOperationRejectedException.of(
--
54: if (!supportingIndexFields
55: .subList(0, Math.min(shardKey.fields().size(), supportingIndexFields.size()))
56- .equals(shardKey.fields())) {
57- throw MongoOperationRejectedException.of(
58- "sharding.shard-collection",
59- "sharding '"
60- + collection
61- + "' needs a supporting index prefixed by the shard key "
62- + shardKey.fields());
63- }
exit=0
=== 8.3 two promotion-evidence vocabularies ===
$ grep -n 'REQUIRED =' -A 3 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/MongoAdvancedPromotionEvidence.java
18: public static final Set<String> REQUIRED =
19- Set.of("stable-platform", "actual-topology", "security", "migration", "failure", "runbook");
20-
21- public MongoAdvancedPromotionEvidence {
exit=0
$ grep -n 'requiredEvidence' -A 5 adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchBenchmarkGate.java
56: public static Set<String> requiredEvidence() {
57- return Objects.requireNonNull(
58- Set.of("index-readiness", "recall", "latency", "memory", "actual-topology"));
59- }
60-}
exit=0
$ git grep -n 'MongoVectorSearchBenchmarkGate\|requiredEvidence()' -- 'adapter/outbound/persistence-mongo/src'
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchBenchmarkGate.java:15:public record MongoVectorSearchBenchmarkGate(
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchBenchmarkGate.java:19: public static MongoVectorSearchBenchmarkGate standard() {
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchBenchmarkGate.java:20: return new MongoVectorSearchBenchmarkGate(0.9, 200, 4L * 1024 * 1024 * 1024);
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchBenchmarkGate.java:23: public MongoVectorSearchBenchmarkGate {
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchBenchmarkGate.java:56: public static Set<String> requiredEvidence() {
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchReadinessGateTest.java:10:import dev.caskeleton.adapter.outbound.mongo.advanced.vector.MongoVectorSearchBenchmarkGate;
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchReadinessGateTest.java:104: MongoVectorSearchBenchmarkGate benchmark = MongoVectorSearchBenchmarkGate.standard();
adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchReadinessGateTest.java:108: assertThat(MongoVectorSearchBenchmarkGate.requiredEvidence()).contains("recall");
exit=0
=== 8.3b scaffold interfaces: implementations and disclaimers ===
--- MongoSearchOperations
implementations:
says Scaffold: adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchOperations.java:1
--- MongoTimeSeriesOperations
implementations:
says Scaffold: adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesOperations.java:1
--- MongoVectorSearchOperations
implementations:
says Scaffold: adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchOperations.java:1
--- TenantScopedMongoOperations
implementations:
says Scaffold: none
--- MongoTenantDatabaseResolver
implementations:
says Scaffold: none
--- MongoDataKeyResolver
implementations:
says Scaffold: none
--- MongoIntegrationEventPublisher
implementations:
says Scaffold: none
--- MongoChangeToIntegrationEventMapper
implementations:
says Scaffold: none
=== 8.4 documentation drift: what the module docs claim about Advanced ===
$ grep -rn 'Advanced' adapter/outbound/persistence-mongo/README.md | head -25
87:| `advanced/**` | opt-in Advanced/Experimental capability (sharding, time series, CSFLE, QE, search, vector, tenancy, bridge, GridFS) |
97: 무의존, Stable은 Advanced에 의존 금지, production은 testkit에 의존 금지, imperative↛reactive,
exit=0
$ grep -rn 'advanced' adapter/outbound/persistence-mongo/build.gradle | head
3:// and docs/mongodb/repository-adaptation.md (how the design's 19 stable + 12 advanced library
7:// `modules/mongodb` and `modules/mongodb-advanced`. This repository's fail-closed module registry
exit=0
=== 8.1c the 19th concrete class: which one carries neither annotation ===
$ git grep -l 'public final class\|public class' -- 'adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced' | sort > /tmp/all19.txt; git grep -l '@MongoAdvancedEntryPoint\|@MongoAdvancedPolicy' -- 'adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced' | sort > /tmp/ann18.txt; comm -23 /tmp/all19.txt /tmp/ann18.txt
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/autoconfigure/MongoAdvancedConfiguration.java
exit=0
$ grep -n 'ADVANCED_PACKAGE\|everyAdvancedTypeIsClassified' -A 20 adapter/outbound/persistence-mongo/src/testkit/java/dev/caskeleton/adapter/outbound/mongo/testkit/arch/MongoAdvancedRules.java | head -50
23: * <p>Two rules, because one alone is escapable. {@link #everyAdvancedTypeIsClassified()} makes a
24- * new concrete class declare which half it is in, so "we only gate the executable ones" cannot
25- * quietly become "we gate the ones somebody remembered". {@link #everyEntryPointConsultsTheGuard()}
26- * then checks that a declared entry point takes a {@link MongoAdvancedCapabilityGuard} and calls
27- * it, which is the part that actually refuses.
28- */
29-public final class MongoAdvancedRules {
30-
31: private static final String ADVANCED_PACKAGE = "dev.caskeleton.adapter.outbound.mongo.advanced..";
32-
33- private MongoAdvancedRules() {}
34-
35- /** Every concrete Advanced class states whether it executes or only decides. */
36: public static ArchRule everyAdvancedTypeIsClassified() {
37: return everyAdvancedTypeIsClassified(ADVANCED_PACKAGE);
38- }
39-
40- /** The same rule over a stated package, so a fixture can prove it fails. */
41: public static ArchRule everyAdvancedTypeIsClassified(String... packageIdentifiers) {
42- return ArchRuleDefinition.classes()
43- .that()
44- .resideInAnyPackage(packageIdentifiers)
45- .and(concreteClass())
46- .should()
47- .beAnnotatedWith(MongoAdvancedEntryPoint.class)
48- .orShould()
49- .beAnnotatedWith(MongoAdvancedPolicy.class)
50- .as(
51- "every concrete Advanced type is annotated @MongoAdvancedEntryPoint or"
52- + " @MongoAdvancedPolicy")
53- .because(
54- "an unclassified class is one nobody decided about, and the capability invariant is"
55- + " only as strong as the weakest unclassified entry point");
56- }
57-
58- /** A declared entry point takes the guard and asks it before it exists. */
59- public static ArchRule everyEntryPointConsultsTheGuard() {
60- return ArchRuleDefinition.classes()
61- .that()
exit=0
=== 8.2c does any test drive MongoShardingAdminGateway? ===
$ git grep -n 'MongoShardingAdminGateway' -- 'adapter/outbound/persistence-mongo/src'
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/MongoShardingAdminGateway.java:22:public final class MongoShardingAdminGateway {
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/MongoShardingAdminGateway.java:26: public MongoShardingAdminGateway(
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/sharding/admin/MongoShardingAdminGateway.java:30: Objects.requireNonNull(guard, "guard").require(MongoShardingAdminGateway.class);
exit=0
=== 8.3c the bridge is a second writer of the change stream checkpoint store ===
$ git grep -n 'checkpoints.save' -- 'adapter/outbound/persistence-mongo/src/main'
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoChangeMessagingBridge.java:60: return checkpoints.save(checkpoint);
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/bridge/MongoChangeMessagingBridge.java:84: ? checkpoints.save(checkpoint)
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/tenancy/database/MongoTenantMigrationCoordinator.java:74: checkpoints.save(
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/changestream/projector/MongoChangeStreamRunner.java:75: ? checkpoints.save(checkpoint).thenReturn(result)
exit=0
=== 8.3d TenantScopedMongoOperations is the one scaffold interface with no disclaimer ===
$ git grep -n 'Scaffold' -- 'adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced'
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/search/MongoSearchOperations.java:13: * <p><strong>Scaffold.</strong> This repository ships no implementation of {@code
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/timeseries/MongoTimeSeriesOperations.java:14: * <p><strong>Scaffold.</strong> This repository ships no implementation of {@code
adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/advanced/vector/MongoVectorSearchOperations.java:14: * <p><strong>Scaffold.</strong> This repository ships no implementation of {@code
exit=0
$ git grep -rn 'implements TenantScopedMongoOperations\|implements MongoSearchOperations\|implements MongoTimeSeriesOperations\|implements MongoVectorSearchOperations' -- 'adapter/outbound/persistence-mongo/src'
exit=1
=== 8.1d why the rule passes despite MongoAdvancedConfiguration carrying neither annotation ===
$ grep -n 'concreteClass' -A 20 adapter/outbound/persistence-mongo/src/testkit/java/dev/caskeleton/adapter/outbound/mongo/testkit/arch/MongoAdvancedRules.java | tail -30
58- /** A declared entry point takes the guard and asks it before it exists. */
59- public static ArchRule everyEntryPointConsultsTheGuard() {
60- return ArchRuleDefinition.classes()
61- .that()
62- .areAnnotatedWith(MongoAdvancedEntryPoint.class)
63- .should(consultTheGuardInEveryConstructor())
64- .because(
65- "a capability that is checked at the first call has already been wired into a running"
--
69: private static com.tngtech.archunit.base.DescribedPredicate<JavaClass> concreteClass() {
70- return new com.tngtech.archunit.base.DescribedPredicate<>("are concrete classes") {
71- @Override
72- public boolean test(JavaClass candidate) {
73- // A @Configuration class is the package's composition root: it builds entry points through
74- // the guard rather than being one, and gating it would gate the thing that supplies the
75- // guard.
76- return !candidate.isInterface()
77- && !candidate.isEnum()
78- && !candidate.isRecord()
79- && !candidate.isAnnotation()
80- && !candidate.isAnonymousClass()
81- && !candidate.isAnnotatedWith("org.springframework.context.annotation.Configuration")
82- // A private nested helper cannot be constructed from outside its enclosing type, so the
83- // enclosing type's classification already covers everything it can do.
84- && !candidate
85- .getModifiers()
86- .contains(com.tngtech.archunit.core.domain.JavaModifier.PRIVATE)
87- && !candidate
88- .getModifiers()
89- .contains(com.tngtech.archunit.core.domain.JavaModifier.ABSTRACT);
exit=0
$ sed -n '28,50p' adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoAdvancedRulesTest.java
class MongoAdvancedRulesTest {
private final JavaClasses production =
new ClassFileImporter()
.withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
.importPackages("dev.caskeleton.adapter.outbound.mongo.advanced");
@Test
@DisplayName("every concrete Advanced type declares whether it executes")
void everyAdvancedTypeIsClassified() {
assertThatCode(() -> MongoAdvancedRules.everyAdvancedTypeIsClassified().check(production))
.doesNotThrowAnyException();
}
@Test
@DisplayName("every declared entry point consults the capability guard")
void everyEntryPointConsultsTheGuard() {
assertThatCode(() -> MongoAdvancedRules.everyEntryPointConsultsTheGuard().check(production))
.doesNotThrowAnyException();
}
@Test
@DisplayName("an unclassified Advanced class fails the classification rule")
exit=0
=== PROBE (execution): every sharding operation with complete evidence ===
One temporary probe class was added, run, and removed:
src/test/.../advanced/sharding/Ss10ShardingProbe.java (@Tag mongodb-contract, hermetic)
Inputs: SHARDING capability enabled; MongoAdminAuthorization.approved(all four operations,
'release-engineer') - i.e. a named approver AND a completed dry run; an approved
ShardKeyReadinessReport; a complete ReshardApproval (approved readiness, dry run
completed, named approver, written forward strategy); a supporting index prefixed
by the shard key; a non-expired command clock.
PROBE shardCollection -> REFUSED MongoOperationRejectedException: admin operation
SHARD_COLLECTION destroys data or rewrites a collection; it runs under an approval
bound to this exact command or not at all
PROBE refineShardKey -> REFUSED (same, REFINE_SHARD_KEY)
PROBE reshardCollection-> REFUSED (same, RESHARD_COLLECTION)
PROBE controlBalancer -> APPLIED
PROBE bodies actually executed = 1 of 4
Reading: MongoShardingAdminGateway routes its three high-risk operations through
MongoAdminGateway's 5-argument execute convenience, which builds MongoAdminCommand.routine
and passes approval = null. MongoAdminGateway.execute(command, approval, body) refuses any
highRisk() operation when approval == null. The gateway builds a complete ReshardApproval
of its own and hands none of it to the plane that decides.
$ git status --short | wc -l
0
exit=0