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>
70 lines
4.2 KiB
Plaintext
70 lines
4.2 KiB
Plaintext
# 팩토리의 javadoc 이 자기가 무엇을 고치려고 만들어졌는지 적는다
|
|
* The one place the typed profile becomes the settings the driver is built from (MNG-INT-002).
|
|
*
|
|
* <p>The profile, the credential resolver, the TLS and Stable-API flags and the pool and timeout
|
|
* policy all existed and were all unit-tested. None of them reached a {@link MongoClientSettings}:
|
|
* the values were checked as intermediate objects and whatever the driver ended up configured with
|
|
* was decided elsewhere, by defaults nobody had chosen. A policy that nothing applies reads exactly
|
|
* like a policy that is applied — the tests pass, the record is populated, and the client connects
|
|
* with a three-second timeout it inherited from the driver rather than the two the profile states.
|
|
|
|
# 저장소 전체에서 그 타입과 자격증명 해석기를 언급하는 곳
|
|
./docs/reviews/2026-08-14-mongodb-module-code-review.md:688:1. `MongoCredentialResolver` port는 secret reference만 받고 value는 client factory의 최소 scope에서만
|
|
./docs/superpowers/plans/evidence/2026-08-15-wave6-final/task6-p0-reconciliation.md:144:nowhere. It is mapped — `MongoClientSettingsFactory` calls `.uuidRepresentation(...)`. Verified
|
|
./docs/architecture/mongo-api-surface.txt:172:dev.caskeleton.adapter.outbound.mongo.client.MongoClientSettingsFactory
|
|
./docs/architecture/mongo-api-surface.txt:322:dev.caskeleton.adapter.outbound.mongo.security.MongoCredentialResolver
|
|
CLAUDE.md:106:`secret://` reference and `MongoCredentialResolver` is the only thing that turns one into a
|
|
|
|
# 프로파일 검증이 production 에 요구하는 것
|
|
if (production && !tlsRequired) {
|
|
throw MongoOperationRejectedException.of(
|
|
"config.tls",
|
|
"a production MongoDB profile requires TLS; the flag existed and nothing checked it, so a"
|
|
+ " deployment could carry tls-required=false and still be called production");
|
|
}
|
|
|
|
# 그 검증이 켜지려면 무엇이 있어야 하나
|
|
return () -> {
|
|
if (properties.profiles().isEmpty()) {
|
|
return;
|
|
}
|
|
if (probe.getIfAvailable() == null) {
|
|
throw new IllegalStateException(
|
|
"the Mongo platform has configured profiles but no MongoTopologyProbe bean, so the "
|
|
+ "startup validator has nothing to ask about the server: supply a probe built from "
|
|
+ "the live data-plane client, or remove the platform profiles. Starting without one "
|
|
+ "means the topology, the Stable API level and the credential's real capabilities "
|
|
+ "are checked by nothing — silently, because the check was conditioned on the very "
|
|
+ "bean whose absence it should report.");
|
|
}
|
|
|
|
# 출하 설정이 이 모듈 아래 노출하는 키
|
|
365: persistence-mongo:
|
|
367- enabled: ${APP_PERSISTENCE_MONGO_ENABLED:false}
|
|
370- active-profile: ${APP_PERSISTENCE_MONGO_ACTIVE_PROFILE:}
|
|
# platform.profiles 를 넣는 곳 전수 : 0
|
|
|
|
# 이 리프가 이미 쓰는 배선 수단
|
|
34- /** The customizer Boot applies when it builds the client. */
|
|
35- @Bean
|
|
36- @ConditionalOnBean(MeterRegistry.class)
|
|
37- @ConditionalOnMissingBean(name = "mongoDriverObservabilityCustomizer")
|
|
38: public MongoClientSettingsBuilderCustomizer mongoDriverObservabilityCustomizer(
|
|
# 프로덕션에서 그 수단을 등록하는 곳 전수 : 1
|
|
|
|
# 이 경계를 보는 시험이 있는가
|
|
|
|
/**
|
|
* The typed profile reaches the settings the driver is actually built from (MNG-INT-002).
|
|
*
|
|
* <p>The profile, the credential resolver, the TLS and Stable-API flags and the pool and timeout
|
|
* policy all existed and were all unit-tested. None of them was connected to a {@code
|
|
* MongoClientSettings}: the values were checked as intermediate objects, and whatever the driver
|
|
* ended up configured with was decided elsewhere. A policy that nothing applies is a policy that
|
|
* reads as applied.
|
|
*
|
|
# TLS 레인 시험이 쓰는 클라이언트
|
|
security/MongoTlsLaneTest.java-135- MongoClientSettings.builder()
|
|
security/MongoTlsLaneTest.java-136- .applyConnectionString(new ConnectionString(connectionString))
|
|
security/MongoTlsLaneTest.java:137: .applyToSslSettings(ssl -> ssl.enabled(true).context(trustOnly(authorityPem)))
|