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>
53 lines
3.2 KiB
Plaintext
53 lines
3.2 KiB
Plaintext
# evidence 251 — messaging-leaf-registry-and-memberships
|
|
# revision: a24ece9cf797f7ea647e33bf846b115208ed1ba5
|
|
# cwd: /shared/codebase/clean-architecture-backend-template/src/messaging
|
|
# command: cd /shared/codebase/clean-architecture-backend-template && python3 - <<PY
|
|
import json,io,subprocess
|
|
d=json.load(io.open("src/config/architecture/modules.json"))
|
|
rows=[]
|
|
def w(o):
|
|
if isinstance(o,dict):
|
|
if isinstance(o.get("id"),str) and o.get("gradle_path","").startswith(":messaging:"):
|
|
rows.append((o["id"],o["source_path"],o.get("runtime_memberships"),len(o.get("allowed_dependencies") or [])))
|
|
for v in o.values(): w(v)
|
|
elif isinstance(o,list):
|
|
[w(v) for v in o]
|
|
w(d)
|
|
tot=0
|
|
print("leaves:",len(rows))
|
|
for i,(a,b,c,n) in enumerate(sorted(rows),1):
|
|
f=len(subprocess.run(["git","ls-files",b],capture_output=True,text=True).stdout.split()); tot+=f
|
|
print(f"{i:2d} {a:42s} files={f:4d} deps={n:2d} rt={c}")
|
|
print("leaf file total:",tot)
|
|
print("git ls-files src/messaging:",len(subprocess.run(["git","ls-files","src/messaging"],capture_output=True,text=True).stdout.split()))
|
|
PY
|
|
# ---- raw output ----
|
|
leaves: 25
|
|
1 messaging-admin-api files= 28 deps= 2 rt=['app-bootstrap']
|
|
2 messaging-admin-runtime files= 20 deps= 6 rt=['app-bootstrap']
|
|
3 messaging-claim-check files= 11 deps= 2 rt=['app-bootstrap']
|
|
4 messaging-cloudevents files= 6 deps= 2 rt=['app-bootstrap']
|
|
5 messaging-core-api files= 95 deps= 0 rt=['app-bootstrap']
|
|
6 messaging-inbox-jdbc-postgresql files= 13 deps= 2 rt=['app-bootstrap']
|
|
7 messaging-kafka files= 61 deps= 7 rt=['app-bootstrap']
|
|
8 messaging-kafka-share-experimental files= 7 deps= 4 rt=[]
|
|
9 messaging-nats-experimental files= 11 deps= 7 rt=[]
|
|
10 messaging-observability files= 17 deps= 1 rt=['app-bootstrap']
|
|
11 messaging-outbox-jdbc-postgresql files= 28 deps= 5 rt=['app-bootstrap']
|
|
12 messaging-policy files= 32 deps= 2 rt=['app-bootstrap']
|
|
13 messaging-pulsar-experimental files= 12 deps= 7 rt=[]
|
|
14 messaging-rabbit files= 33 deps= 7 rt=['app-bootstrap']
|
|
15 messaging-reliability-api files= 15 deps= 1 rt=['app-bootstrap']
|
|
16 messaging-runtime-core files= 12 deps= 6 rt=['app-bootstrap']
|
|
17 messaging-schema-api files= 15 deps= 1 rt=['app-bootstrap']
|
|
18 messaging-schema-avro files= 8 deps= 2 rt=[]
|
|
19 messaging-schema-json files= 6 deps= 2 rt=['app-bootstrap']
|
|
20 messaging-schema-protobuf files= 6 deps= 2 rt=[]
|
|
21 messaging-security files= 17 deps= 1 rt=['app-bootstrap']
|
|
22 messaging-spring-boot-starter files= 44 deps=17 rt=['app-bootstrap']
|
|
23 messaging-spring-cloud-stream-bridge files= 10 deps= 3 rt=[]
|
|
24 messaging-testkit files= 23 deps= 4 rt=[]
|
|
25 messaging-transport-spi files= 19 deps= 3 rt=['app-bootstrap']
|
|
leaf file total: 549
|
|
git ls-files src/messaging: 550
|