Files
document-haness/docs/clean-architecture-backend-template/final/evidence/rendered/a19-f008-acl.svg
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

204 lines
37 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="3626" viewBox="0 0 1200 3626" role="img">
<title>terminal evidence</title>
<desc>Terminal-style rendering generated from retained command output. Sensitive-looking values are redacted in the visual asset.</desc>
<rect x="1" y="1" width="1198" height="3624" rx="14" fill="#0d1117" stroke="#30363d"/>
<rect x="1" y="1" width="1198" height="44" rx="14" fill="#161b22"/>
<rect x="1" y="30" width="1198" height="14" fill="#161b22"/>
<circle cx="24" cy="22" r="6" fill="#ff5f57"/>
<circle cx="44" cy="22" r="6" fill="#febc2e"/>
<circle cx="64" cy="22" r="6" fill="#28c840"/>
<text x="92" y="27" fill="#8b949e" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">terminal evidence</text>
<text x="24" y="68" fill="#c9d1d9" font-size="15" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">$ set -e
set -o pipefail
S=src/messaging/messaging-security/src/main/java/dev/caskeleton/messaging/security/BrokerAclMan</tspan><tspan x="24" dy="22">ifest.java
strip() { sed -E &#x27;s#^src/[^:]*/src/(main|test)/[^:]*/([^:/]+):([0-9]+):# \1 · \2:\3 #&#x27;; }
cut_range() { awk</tspan><tspan x="24" dy="22"> -v f=&quot;$2&quot; -v a=&quot;$3&quot; -v b=&quot;$4&quot; &#x27;NR&gt;=a &amp;&amp; NR&lt;=b {printf &quot; %s:%d %s\n&quot;, f, NR, $0}&#x27; &quot;$1&quot;; }
printf &quot; %s : %s 줄\n&quot; &quot;Bro</tspan><tspan x="24" dy="22">kerAclManifest.java&quot; &quot;$(wc -l &lt; $S)&quot;
echo &quot;# 자바독이 적어 둔 두 검사&quot;
cut_range $S BrokerAclManifest.java 12 20
echo
e</tspan><tspan x="24" dy="22">cho &quot;# 그 두 성질에 대응하는 코드가 이 타입 안에 있다&quot;
cut_range $S BrokerAclManifest.java 94 95
cut_range $S BrokerAclM</tspan><tspan x="24" dy="22">anifest.java 98 111
cut_range $S BrokerAclManifest.java 113 128
cut_range $S BrokerAclManifest.java 130 140
echo
echo &quot;</tspan><tspan x="24" dy="22"># 간결 생성자는 그 검사를 하지 않는다&quot;
cut_range $S BrokerAclManifest.java 81 87
echo
echo &quot;# 그 세 메서드를 부르는 자</tspan><tspan x="24" dy="22">리 전부&quot;
git grep -n &#x27;requireApplicationRuntime\|destructiveGrants()\|\.undeclared(\|\.missing(&#x27; -- &#x27;src/messaging/**/*.</tspan><tspan x="24" dy="22">java&#x27; | strip
echo &quot; 그중 BrokerAclManifest.java 밖의 main 코드 :&quot;
o=$(git grep -n &#x27;requireApplicationRuntime\|destruct</tspan><tspan x="24" dy="22">iveGrants()\|\.undeclared(\|\.missing(&#x27; -- &#x27;src/messaging/**/*.java&#x27; | grep -v &#x27;/BrokerAclManifest.java:&#x27; | grep &#x27;/main/</tspan><tspan x="24" dy="22">&#x27; || true)
if [ -z &quot;$o&quot; ]; then echo &quot; 0 건&quot;; else echo &quot;$o&quot; | strip; fi
echo &quot;# 이 타입을 만들거나 받는 프로덕션 코</tspan><tspan x="24" dy="22">&quot;
h=$(git grep -n &#x27;BrokerAclManifest&#x27; -- &#x27;src/**/*.java&#x27; | grep -v &#x27;/BrokerAclManifest.java:&#x27; | grep &#x27;/main/&#x27; || true)</tspan><tspan x="24" dy="22">
if [ -z &quot;$h&quot; ]; then echo &quot; main 에서 0 건&quot;; else echo &quot;$h&quot; | strip; fi
echo -n &quot; 자기 파일 밖에서 이 이름이 나오는 </tspan><tspan x="24" dy="22">파일 수 : &quot;
git grep -l &#x27;BrokerAclManifest&#x27; -- &#x27;src/**/*.java&#x27; | grep -vc &#x27;/BrokerAclManifest.java&#x27; || true
git grep -l </tspan><tspan x="24" dy="22">&#x27;BrokerAclManifest&#x27; -- &#x27;src/**/*.java&#x27; | grep -v &#x27;/BrokerAclManifest.java&#x27; | sed &#x27;s#^src/# #&#x27;
echo &quot; 그 시험이 단언</tspan><tspan x="24" dy="22">하는 것 :&quot;
awk &#x27;NR&gt;=167 &amp;&amp; NR&lt;=201 &amp;&amp; (/void |assertThat/) {printf &quot; CredentialRuntimeRegistryTest.java:%d %s\n&quot;, NR, $</tspan><tspan x="24" dy="22">0}&#x27; \
src/messaging/messaging-security/src/test/java/dev/caskeleton/messaging/security/CredentialRuntimeRegistryTest.j</tspan><tspan x="24" dy="22">ava
echo
echo &quot;# 파괴적 권한이 값으로 표시되는 방식&quot;
awk &#x27;NR&gt;=49 &amp;&amp; NR&lt;=66 &amp;&amp; (/enum Operation/ || /\(true\)/ || /\(fal</tspan><tspan x="24" dy="22">se\)/) {printf &quot; BrokerAclManifest.java:%d %s\n&quot;, NR, $0}&#x27; $S
echo
echo &quot;# 기동 시점 검증으로 감싸인 프로파일은 셋이다</tspan><tspan x="24" dy="22">&quot;
for f in $(git grep -l &#x27;new StartupProfileValidation&#x27; -- &#x27;src/**/*.java&#x27;); do
awk -v n=&quot;$(basename $f)&quot; &#x27;/new Startu</tspan><tspan x="24" dy="22">pProfileValidation/{c=4} c&amp;&amp;c--{printf &quot; %s:%d %s\n&quot;, n, NR, $0}&#x27; &quot;$f&quot;
done
echo
echo &quot;# 파괴 연산 자체를 막는 다른 장</tspan><tspan x="24" dy="22">&quot;
git grep -n &#x27;DestructiveMessagingAdmin&#x27; -- &#x27;src/**/*.java&#x27; | strip
n=$(git grep -l &#x27;implements DestructiveMessagingA</tspan><tspan x="24" dy="22">dmin&#x27; -- &#x27;src/**/*.java&#x27; 2&gt;/dev/null | grep -c &#x27;/main/&#x27; || true)
echo &quot; 그 인터페이스를 구현하는 main 클래스 : ${n:-0} </tspan><tspan x="24" dy="22">&quot;
echo
echo &quot;# 브로커에 권한을 질의하는 코드&quot;
for pat in describeAcls DescribeAclsResult AclBinding createAcls AclOp</tspan><tspan x="24" dy="22">eration Authorizer listPermissions checkPermissions; do
n=$(git grep -l &quot;$pat&quot; -- &#x27;src/**/*.java&#x27; 2&gt;/dev/null | wc -l </tspan><tspan x="24" dy="22">|| true)
printf &quot; %-22s %s 파일\n&quot; &quot;$pat&quot; &quot;$n&quot;
done
echo &quot; 그 0 들의 의미를 정하는 사실 — Kafka AdminClient 자체의 </tspan><tspan x="24" dy="22">소스 세트별 분포 :&quot;
git grep -l &#x27;org.apache.kafka.clients.admin\|AdminClient&#x27; -- &#x27;src/**/*.java&#x27; 2&gt;/dev/null \
| sed -</tspan><tspan x="24" dy="22">E &#x27;s#^src/[^/]*/[^/]*/src/([a-zA-Z]+)/.*# \1#&#x27; | sort | uniq -c | sed -E &#x27;s#^ *([0-9]+) +(.*)# \2 : \1 파일#&#x27; || e</tspan><tspan x="24" dy="22">cho &quot; 0 파일&quot;
</tspan></text>
<text x="24" y="706" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">cwd: /shared/codebase/clean-architecture-backend-template</tspan></text>
<text x="24" y="728" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">time: 2026-09-04T01:21:20+00:00 · exit 0</tspan></text>
<line x1="24" y1="742" x2="1176" y2="742" stroke="#30363d"/>
<text x="24" y="782" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java : 141 줄</tspan></text>
<text x="24" y="804" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 자바독이 적어 둔 두 검사</tspan></text>
<text x="24" y="826" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:12 * &lt;p&gt;Written down so the grant can be reviewed and diffed rather than discovered from a broker</tspan></text>
<text x="24" y="848" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:13 * dump. The manifest is what the platform checks itself against at startup: a runtime that holds</tspan></text>
<text x="24" y="870" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:14 * more than it declares is a finding, because the extra permission is the one nobody reasoned</tspan></text>
<text x="24" y="892" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:15 * about.</tspan></text>
<text x="24" y="914" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:16 *</tspan></text>
<text x="24" y="936" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:17 * &lt;p&gt;Destructive permissions are named separately from ordinary ones. {@code DELETE_TOPIC} and</tspan></text>
<text x="24" y="958" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:18 * {@code PURGE} are not &quot;write, but more&quot;; they destroy data an application can never restore, so</tspan></text>
<text x="24" y="980" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:19 * an application runtime declaring one is rejected outright.</tspan></text>
<text x="24" y="1002" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:20 *</tspan></text>
<text x="24" y="1024" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="1046" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 두 성질에 대응하는 코드가 이 타입 안에 있다</tspan></text>
<text x="24" y="1068" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:94 public List&lt;Grant&gt; destructiveGrants() {</tspan></text>
<text x="24" y="1090" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:95 return grants.stream().filter(grant -&gt; grant.operation().isDestructive()).toList();</tspan></text>
<text x="24" y="1112" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:98 /**</tspan></text>
<text x="24" y="1134" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:99 * Refuses a manifest that gives an application runtime destructive power.</tspan></text>
<text x="24" y="1156" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:100 *</tspan></text>
<text x="24" y="1178" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:101 * @throws MessagingConfigurationException when a destructive grant is declared</tspan></text>
<text x="24" y="1200" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:102 */</tspan></text>
<text x="24" y="1222" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:103 public void requireApplicationRuntime() {</tspan></text>
<text x="24" y="1244" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:104 List&lt;Grant&gt; destructive = destructiveGrants();</tspan></text>
<text x="24" y="1266" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:105 if (!destructive.isEmpty()) {</tspan></text>
<text x="24" y="1288" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:106 throw new MessagingConfigurationException(</tspan></text>
<text x="24" y="1310" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:107 &quot;APPLICATION_HOLDS_DESTRUCTIVE_GRANT&quot;,</tspan></text>
<text x="24" y="1332" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:108 &quot;principal %s declares %s, which an application runtime must never hold&quot;</tspan></text>
<text x="24" y="1354" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:109 .formatted(principal, destructive.stream().map(Grant::operation).toList()));</tspan></text>
<text x="24" y="1376" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:110 }</tspan></text>
<text x="24" y="1398" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:111 }</tspan></text>
<text x="24" y="1420" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:113 /**</tspan></text>
<text x="24" y="1442" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:114 * Reports the permissions the runtime holds but never declared.</tspan></text>
<text x="24" y="1464" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:115 *</tspan></text>
<text x="24" y="1486" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:116 * &lt;p&gt;Excess is the finding, not the shortfall: a missing grant fails loudly on first use, while</tspan></text>
<text x="24" y="1508" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:117 * an undeclared extra one sits unnoticed until it is abused.</tspan></text>
<text x="24" y="1530" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:118 *</tspan></text>
<text x="24" y="1552" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:119 * @param observed the grants the broker actually reports for this principal</tspan></text>
<text x="24" y="1574" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:120 * @return the observed grants that this manifest does not declare</tspan></text>
<text x="24" y="1596" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:121 */</tspan></text>
<text x="24" y="1618" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:122 public Set&lt;Grant&gt; undeclared(Set&lt;Grant&gt; observed) {</tspan></text>
<text x="24" y="1640" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:123 Objects.requireNonNull(observed, &quot;observed must not be null&quot;);</tspan></text>
<text x="24" y="1662" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:124 Set&lt;Grant&gt; extra = new LinkedHashSet&lt;&gt;(observed);</tspan></text>
<text x="24" y="1684" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:125 extra.removeAll(Set.copyOf(grants));</tspan></text>
<text x="24" y="1706" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:126 return Set.copyOf(extra);</tspan></text>
<text x="24" y="1728" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:127 }</tspan></text>
<text x="24" y="1750" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:128 </tspan></text>
<text x="24" y="1772" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:130 * Reports the declared permissions the broker does not actually grant.</tspan></text>
<text x="24" y="1794" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:131 *</tspan></text>
<text x="24" y="1816" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:132 * @param observed the grants the broker actually reports for this principal</tspan></text>
<text x="24" y="1838" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:133 * @return the declared grants that are missing</tspan></text>
<text x="24" y="1860" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:134 */</tspan></text>
<text x="24" y="1882" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:135 public Set&lt;Grant&gt; missing(Set&lt;Grant&gt; observed) {</tspan></text>
<text x="24" y="1904" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:136 Objects.requireNonNull(observed, &quot;observed must not be null&quot;);</tspan></text>
<text x="24" y="1926" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:137 Set&lt;Grant&gt; absent = new LinkedHashSet&lt;&gt;(grants);</tspan></text>
<text x="24" y="1948" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:138 absent.removeAll(observed);</tspan></text>
<text x="24" y="1970" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:139 return Set.copyOf(absent);</tspan></text>
<text x="24" y="1992" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:140 }</tspan></text>
<text x="24" y="2014" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="2036" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 간결 생성자는 그 검사를 하지 않는다</tspan></text>
<text x="24" y="2058" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:81 public BrokerAclManifest {</tspan></text>
<text x="24" y="2080" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:82 Objects.requireNonNull(grants, &quot;grants must not be null&quot;);</tspan></text>
<text x="24" y="2102" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:83 if (principal == null || principal.isBlank()) {</tspan></text>
<text x="24" y="2124" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:84 throw new IllegalArgumentException(&quot;principal must not be blank&quot;);</tspan></text>
<text x="24" y="2146" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:85 }</tspan></text>
<text x="24" y="2168" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:86 grants = List.copyOf(grants);</tspan></text>
<text x="24" y="2190" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:87 }</tspan></text>
<text x="24" y="2212" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="2234" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 세 메서드를 부르는 자리 전부</tspan></text>
<text x="24" y="2256" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · BrokerAclManifest.java:94 public List&lt;Grant&gt; destructiveGrants() {</tspan></text>
<text x="24" y="2278" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · BrokerAclManifest.java:103 public void requireApplicationRuntime() {</tspan></text>
<text x="24" y="2300" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · BrokerAclManifest.java:104 List&lt;Grant&gt; destructive = destructiveGrants();</tspan></text>
<text x="24" y="2322" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · CredentialRuntimeRegistryTest.java:181 assertThatThrownBy(manifest::requireApplicationRuntime)</tspan></text>
<text x="24" y="2344" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · CredentialRuntimeRegistryTest.java:200 assertThat(manifest.undeclared(Set.of(declared, extra)))</tspan></text>
<text x="24" y="2366" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그중 BrokerAclManifest.java 밖의 main 코드 :</tspan></text>
<text x="24" y="2388" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 0 건</tspan></text>
<text x="24" y="2410" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 이 타입을 만들거나 받는 프로덕션 코드</tspan></text>
<text x="24" y="2432" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main 에서 0 건</tspan></text>
<text x="24" y="2454" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 자기 파일 밖에서 이 이름이 나오는 파일 수 : 1</tspan></text>
<text x="24" y="2476" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging/messaging-security/src/test/java/dev/caskeleton/messaging/security/CredentialRuntimeRegistryTest.java</tspan></text>
<text x="24" y="2498" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 시험이 단언하는 것 :</tspan></text>
<text x="24" y="2520" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CredentialRuntimeRegistryTest.java:167 void anApplicationRuntimeMayNotHoldADestructiveGrant() {</tspan></text>
<text x="24" y="2542" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CredentialRuntimeRegistryTest.java:181 assertThatThrownBy(manifest::requireApplicationRuntime)</tspan></text>
<text x="24" y="2564" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CredentialRuntimeRegistryTest.java:187 void aGrantTheBrokerHoldsButNobodyDeclaredIsTheFinding() {</tspan></text>
<text x="24" y="2586" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CredentialRuntimeRegistryTest.java:200 assertThat(manifest.undeclared(Set.of(declared, extra)))</tspan></text>
<text x="24" y="2608" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="2630" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 파괴적 권한이 값으로 표시되는 방식</tspan></text>
<text x="24" y="2652" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:49 public enum Operation {</tspan></text>
<text x="24" y="2674" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:51 WRITE(false),</tspan></text>
<text x="24" y="2696" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:53 READ(false),</tspan></text>
<text x="24" y="2718" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:55 DESCRIBE(false),</tspan></text>
<text x="24" y="2740" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:57 CREATE(false),</tspan></text>
<text x="24" y="2762" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:59 ALTER(true),</tspan></text>
<text x="24" y="2784" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:61 DELETE(true),</tspan></text>
<text x="24" y="2806" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:63 PURGE(true);</tspan></text>
<text x="24" y="2828" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="2850" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 기동 시점 검증으로 감싸인 프로파일은 셋이다</tspan></text>
<text x="24" y="2872" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaMessagingAutoConfiguration.java:59 return new StartupProfileValidation&lt;&gt;(</tspan></text>
<text x="24" y="2894" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaMessagingAutoConfiguration.java:60 () -&gt;</tspan></text>
<text x="24" y="2916" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaMessagingAutoConfiguration.java:61 java.util.stream.Stream.concat(</tspan></text>
<text x="24" y="2938" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaMessagingAutoConfiguration.java:62 compiled.kafkaBrokers().stream(), profiles.orderedStream())</tspan></text>
<text x="24" y="2960" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingCoreAutoConfiguration.java:221 return new StartupProfileValidation&lt;&gt;(</tspan></text>
<text x="24" y="2982" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingCoreAutoConfiguration.java:222 () -&gt;</tspan></text>
<text x="24" y="3004" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingCoreAutoConfiguration.java:223 java.util.stream.Stream.concat(compiled.security().stream(), profiles.orde</tspan><tspan x="24" dy="22">redStream())</tspan></text>
<text x="24" y="3048" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingCoreAutoConfiguration.java:224 .toList(),</tspan></text>
<text x="24" y="3070" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RabbitMessagingAutoConfiguration.java:55 return new StartupProfileValidation&lt;&gt;(</tspan></text>
<text x="24" y="3092" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RabbitMessagingAutoConfiguration.java:56 () -&gt;</tspan></text>
<text x="24" y="3114" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RabbitMessagingAutoConfiguration.java:57 java.util.stream.Stream.concat(</tspan></text>
<text x="24" y="3136" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RabbitMessagingAutoConfiguration.java:58 compiled.rabbitBrokers().stream(), profiles.orderedStream())</tspan></text>
<text x="24" y="3158" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="3180" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 파괴 연산 자체를 막는 다른 장치</tspan></text>
<text x="24" y="3202" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · DestructiveMessagingAdmin.java:21 public interface DestructiveMessagingAdmin {</tspan></text>
<text x="24" y="3224" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · MessagingAdminService.java:21 * &lt;p&gt;Destructive operations live in {@link DestructiveMessagingAdmin}, a separate inter</tspan><tspan x="24" dy="22">face that an</tspan></text>
<text x="24" y="3268" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · MessagingAdminAutoConfiguration.java:22 * &lt;p&gt;{@link dev.caskeleton.messaging.admin.runtime.DestructiveMessagingAdmin}</tspan><tspan x="24" dy="22"> is deliberately</tspan></text>
<text x="24" y="3312" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 인터페이스를 구현하는 main 클래스 : 0 건</tspan></text>
<text x="24" y="3334" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="3356" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 브로커에 권한을 질의하는 코드</tspan></text>
<text x="24" y="3378" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> describeAcls 0 파일</tspan></text>
<text x="24" y="3400" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> DescribeAclsResult 0 파일</tspan></text>
<text x="24" y="3422" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> AclBinding 0 파일</tspan></text>
<text x="24" y="3444" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> createAcls 0 파일</tspan></text>
<text x="24" y="3466" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> AclOperation 0 파일</tspan></text>
<text x="24" y="3488" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> Authorizer 0 파일</tspan></text>
<text x="24" y="3510" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> listPermissions 0 파일</tspan></text>
<text x="24" y="3532" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> checkPermissions 0 파일</tspan></text>
<text x="24" y="3554" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 0 들의 의미를 정하는 사실 — Kafka AdminClient 자체의 소스 세트별 분포 :</tspan></text>
<text x="24" y="3576" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test : 5 파일</tspan></text>
</svg>