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>
454 lines
35 KiB
Plaintext
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
|
|
|