Files
document-haness/docs/clean-architecture-backend-template/final/evidence/rendered/a19-f020-messaging-admin-api.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

213 lines
40 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="4000" viewBox="0 0 1200 4000" 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="3998" 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">$ #!/bin/bash
cd /shared/codebase/clean-architecture-backend-template
# leaf 이름을 남긴다. 긴 문자열 리터럴은 값이 새지</tspan><tspan x="24" dy="22"> 않도록 가린다.
strip() { sed -E &#x27;s#^src/messaging/([^/]+)/src/(main|test)/java/dev/caskeleton/[^:]*/([^:/]+):([0-9]+):#</tspan><tspan x="24" dy="22"> \2 · \1 · \3:\4 #&#x27; \
| sed -E &#x27;s#&quot;[^&quot;]{16,}&quot;#&quot;&lt;가림&gt;&quot;#g&#x27;; }
echo &quot;# 계약 leaf 와 그 소비자 leaf 의 소스 규</tspan><tspan x="24" dy="22">&quot;
for m in messaging-admin-api messaging-admin-runtime; do
echo &quot; $m 의 소스 세트 : $(ls src/messaging/$m/src/ | tr</tspan><tspan x="24" dy="22"> &#x27;\n&#x27; &#x27; &#x27;)&quot;
for ss in main test; do
n=$(find src/messaging/$m/src/$ss -name &#x27;*.java&#x27; 2&gt;/dev/null | wc -l)
l=$(</tspan><tspan x="24" dy="22">find src/messaging/$m/src/$ss -name &#x27;*.java&#x27; -exec cat {} + 2&gt;/dev/null | wc -l)
printf &quot; %-4s %2s 파일 · %4s 줄</tspan><tspan x="24" dy="22">\n&quot; &quot;$ss&quot; &quot;$n&quot; &quot;$l&quot;
done
done
echo
echo &quot;# 계약 leaf 의 유일한 시험 파일이 담은 것&quot;
T=src/messaging/messaging-admin-a</tspan><tspan x="24" dy="22">pi/src/test/java/dev/caskeleton/messaging/admin/DestructiveOperationGuardTest.java
echo &quot; 파일 : $(basename $T) · @T</tspan><tspan x="24" dy="22">est $(grep -c &#x27;@Test&#x27; $T) 개&quot;
grep -n &#x27;void .*(&#x27; $T | sed -E &#x27;s#^([0-9]+): *# :\1 #&#x27;
echo &quot; 그 시험들이 승인 객체</tspan><tspan x="24" dy="22">를 어떻게 얻는가 :&quot;
awk &#x27;NR&gt;=27 &amp;&amp; NR&lt;=33 {printf &quot; DestructiveOperationGuardTest.java:%d %s\n&quot;, NR, $0}&#x27; $T
awk &#x27;NR&gt;</tspan><tspan x="24" dy="22">=45 &amp;&amp; NR&lt;=48 {printf &quot; DestructiveOperationGuardTest.java:%d %s\n&quot;, NR, $0}&#x27; $T
echo &quot; 그 셋의 단언이 무엇에 떨어지</tspan><tspan x="24" dy="22">는가 :&quot;
grep -n &#x27;Optional.empty()\|Optional.of(\|hasMessageContaining\|doesNotThrowAnyException&#x27; $T \
| sed -E &#x27;s#^([0</tspan><tspan x="24" dy="22">-9]+): *# DestructiveOperationGuardTest.java:\1 #&#x27; | sed -E &#x27;s#&quot;[^&quot;]{16,}&quot;#&quot;&lt;가림&gt;&quot;#g&#x27;
echo &quot; 가드가 그 메시지를 내</tspan><tspan x="24" dy="22">는 자리 :&quot;
G=$(find src -name DestructiveOperationGuard.java -path &#x27;*/main/*&#x27;)
grep -n &#x27;APPROVAL_REQUIRED\|APPROVAL_EXPI</tspan><tspan x="24" dy="22">RED\|isValidAt&#x27; $G | sed -E &#x27;s#^([0-9]+): *# DestructiveOperationGuard.java:\1 #&#x27;
echo
echo &quot;# 소비자 leaf 의 시험 </tspan><tspan x="24" dy="22">여섯&quot;
for f in $(find src/messaging/messaging-admin-runtime/src/test -name &#x27;*.java&#x27; | sort); do
printf &quot; %-34s @Tes</tspan><tspan x="24" dy="22">t %s 개\n&quot; &quot;$(basename $f)&quot; &quot;$(grep -c &#x27;@Test&#x27; $f)&quot;
done
echo &quot; 그중 승인 위조 시험이 단언하는 것 :&quot;
grep -n &#x27;void .*(&#x27;</tspan><tspan x="24" dy="22"> src/messaging/messaging-admin-runtime/src/test/java/dev/caskeleton/messaging/admin/runtime/ApprovalForgeryTest.java \
</tspan><tspan x="24" dy="22"> | sed -E &#x27;s#^([0-9]+): *# ApprovalForgeryTest.java:\1 #&#x27;
echo
echo &quot;# 계약 leaf 가 담은 main 타입 스물다섯&quot;
find s</tspan><tspan x="24" dy="22">rc/messaging/messaging-admin-api/src/main -name &#x27;*.java&#x27; | sed &#x27;s#.*/##;s#\.java$##&#x27; | sort | tr &#x27;\n&#x27; &#x27; &#x27; | fold -w 92 -</tspan><tspan x="24" dy="22">s | sed &#x27;s#^# #&#x27;
echo
echo &quot;# 승인 검증자는 어디서 만들어지는가&quot;
echo &quot; main 구현 :&quot;
git grep -n &#x27;implements Approv</tspan><tspan x="24" dy="22">alVerifier&#x27; -- &#x27;src/**/*.java&#x27; | strip
echo &quot; 생성 지점 :&quot;
git grep -n &#x27;new HmacApprovalVerifier&#x27; -- &#x27;src/**/*.java&#x27; | </tspan><tspan x="24" dy="22">strip
echo &quot; 생성 지점 $(git grep -c &#x27;new HmacApprovalVerifier&#x27; -- &#x27;src/**/*.java&#x27; | awk -F: &#x27;{s+=$2} END{print s}&#x27;) </tspan><tspan x="24" dy="22">곳 · 파일 $(git grep -l &#x27;new HmacApprovalVerifier&#x27; -- &#x27;src/**/*.java&#x27; | wc -l) 개&quot;
echo
echo &quot;# main 에 검증자를 두지 </tspan><tspan x="24" dy="22">않는 것이 공백인가 경계인가&quot;
echo &quot; 자기 자바독이 적은 이유 :&quot;
H=$(find src -name HmacApprovalVerifier.java -path &#x27;*/ma</tspan><tspan x="24" dy="22">in/*&#x27;)
awk &#x27;NR&gt;=50 &amp;&amp; NR&lt;=53 {printf &quot; HmacApprovalVerifier.java:%d %s\n&quot;, NR, $0}&#x27; $H
echo &quot; 같은 사슬의 가드는 mai</tspan><tspan x="24" dy="22">n 빈으로 있다 :&quot;
A=$(find src -name MessagingAdminAutoConfiguration.java -path &#x27;*/main/*&#x27;)
awk &#x27;NR&gt;=35 &amp;&amp; NR&lt;=41 {printf</tspan><tspan x="24" dy="22"> &quot; MessagingAdminAutoConfiguration.java:%d %s\n&quot;, NR, $0}&#x27; $A
echo
echo &quot;# 계약 타입의 경계 조건이 따로 고정돼 있는</tspan><tspan x="24" dy="22">&quot;
for t in PlanDigest ApprovalGrant VerifiedApproval ApprovedRedrivePlan ApprovedReplayPlan TopologyManifest; do
m=$</tspan><tspan x="24" dy="22">(git grep -lw &quot;$t&quot; -- &#x27;src/**/*.java&#x27; | grep &#x27;/main/&#x27; | grep -v &quot;/$t.java&quot; | wc -l)
s=$(git grep -lw &quot;$t&quot; -- &#x27;src/**/*</tspan><tspan x="24" dy="22">.java&#x27; | grep &#x27;/test/&#x27; | wc -l)
n=$(find src \( -name &quot;*${t}*Test.java&quot; -o -name &quot;*${t}*Tests.java&quot; -o -name &quot;*${t}*IT</tspan><tspan x="24" dy="22">.java&quot; \) | wc -l)
printf &quot; %-22s main %s 파일 · test %s 파일 · 그 이름을 건 시험 파일 %s 개\n&quot; &quot;$t&quot; &quot;$m&quot; &quot;$s&quot; &quot;$</tspan><tspan x="24" dy="22">n&quot;
done
echo &quot; 만료를 직접 고정하는 자리 :&quot;
git grep -n &#x27;anExpiredGrantDoesNotVerify\|anExpiredApprovalDoesNotAuthorise</tspan><tspan x="24" dy="22">&#x27; -- &#x27;src/**/*.java&#x27; | strip
echo &quot; PlanDigest 가 test 에서 어떻게 쓰이는가 :&quot;
git grep -n &#x27;PlanDigest&#x27; -- &#x27;src/**/*.ja</tspan><tspan x="24" dy="22">va&#x27; | grep &#x27;/test/&#x27; | strip
</tspan></text>
<text x="24" y="838" 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="860" 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-04T02:14:47+00:00 · exit 0</tspan></text>
<line x1="24" y1="874" x2="1176" y2="874" stroke="#30363d"/>
<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"># 계약 leaf 와 그 소비자 leaf 의 소스 규모</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"> messaging-admin-api 의 소스 세트 : main test </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"> main 25 파일 · 1613 줄</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"> test 1 파일 · 147 줄</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"> messaging-admin-runtime 의 소스 세트 : main test </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"> main 12 파일 · 1253 줄</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"> test 6 파일 · 1051 줄</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"></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"># 계약 leaf 의 유일한 시험 파일이 담은 것</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"> 파일 : DestructiveOperationGuardTest.java · @Test 9 개</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"> :51 void anApplicationRuntimeCannotRedrive() {</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"> :63 void anAdminRuntimeStillNeedsAnApproval() {</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"> :73 void anExpiredApprovalDoesNotAuthorise() {</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"> :91 void aDryRunIsAlwaysPermitted() {</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"> :102 void anApprovedAdminOperationIsAuthorised() {</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"> :113 void aRedriveCannotTargetItsOwnSource() {</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"> :119 void aRedriveBatchIsBoundedSoOneOperationCannotFloodTheSource() {</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"> :128 void aTopologyManifestReportsEveryDifference() {</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"> :140 void aMatchingTopologyReportsNoDifferences() {</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"> 그 시험들이 승인 객체를 어떻게 얻는가 :</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"> DestructiveOperationGuardTest.java:27 /**</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"> DestructiveOperationGuardTest.java:28 * A grant the issuer signed, verified the way the runtime verifies it.</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"> DestructiveOperationGuardTest.java:29 *</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"> DestructiveOperationGuardTest.java:30 * &lt;p&gt;The guard used to take a plain {@code AdminApproval} record, which any caller </tspan><tspan x="24" dy="22">could</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"> DestructiveOperationGuardTest.java:31 * construct. Every case below now has to go through a real signature to get an appr</tspan><tspan x="24" dy="22">oval object at</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"> DestructiveOperationGuardTest.java:32 * all, which is the property the type change was made for.</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"> DestructiveOperationGuardTest.java:33 */</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"> DestructiveOperationGuardTest.java:45 Long.MAX_VALUE,</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"> DestructiveOperationGuardTest.java:46 digest);</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"> DestructiveOperationGuardTest.java:47 return ISSUER.verify(grant, ISSUER.sign(grant), digest, from);</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"> DestructiveOperationGuardTest.java:48 }</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"> 그 셋의 단언이 무엇에 떨어지는가 :</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"> DestructiveOperationGuardTest.java:43 Optional.empty(),</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"> DestructiveOperationGuardTest.java:57 DestructiveOperation.REDRIVE, ORDERS, Optional.of(VALID), false, NOW))</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"> DestructiveOperationGuardTest.java:59 .hasMessageContaining(&quot;&lt;가림&gt;&quot;);</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"> DestructiveOperationGuardTest.java:67 () -&gt; guard.authorize(DestructiveOperation.PURGE, ORDERS, Optional.empty(), false, NO</tspan><tspan x="24" dy="22">W))</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"> DestructiveOperationGuardTest.java:69 .hasMessageContaining(&quot;approval&quot;);</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"> DestructiveOperationGuardTest.java:85 DestructiveOperation.OFFSET_RESET, ORDERS, Optional.of(expired), false, NOW))</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"> DestructiveOperationGuardTest.java:87 .hasMessageContaining(&quot;validity window&quot;);</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"> DestructiveOperationGuardTest.java:97 DestructiveOperation.DELETE_DESTINATION, ORDERS, Optional.empty(), true, NOW))</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"> DestructiveOperationGuardTest.java:98 .doesNotThrowAnyException();</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"> DestructiveOperationGuardTest.java:108 DestructiveOperation.REPLAY, ORDERS, Optional.of(VALID), false, NOW))</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"> DestructiveOperationGuardTest.java:109 .doesNotThrowAnyException();</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"> 가드가 그 메시지를 내는 자리 :</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"> DestructiveOperationGuard.java:66 &quot;APPROVAL_REQUIRED&quot;,</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"> DestructiveOperationGuard.java:68 if (!granted.isValidAt(now)) {</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"> DestructiveOperationGuard.java:70 &quot;APPROVAL_EXPIRED&quot;, &quot;approval &quot; + granted.ticket() + &quot; is outside its validity window&quot;);</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"># 소비자 leaf 의 시험 여섯</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"> AdminOperationJournalTest.java @Test 8 개</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"> ApprovalForgeryTest.java @Test 10 개</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"> ApprovedPlanExecutionTest.java @Test 11 개</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"> RedriveResumptionTest.java @Test 5 개</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"> TopologyValidationRuntimeTest.java @Test 4 개</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"> TopologyValidatorTest.java @Test 13 개</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"> 그중 승인 위조 시험이 단언하는 것 :</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"> ApprovalForgeryTest.java:51 void aVerifiedApprovalCannotBeConstructedOutsideTheVerifier() {</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"> ApprovalForgeryTest.java:69 void anAlteredGrantDoesNotVerify() {</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"> ApprovalForgeryTest.java:84 void aSignatureFromAnotherIssuerDoesNotVerify() {</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"> ApprovalForgeryTest.java:96 void anApprovalForOnePlanCannotExecuteAnother() {</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"> ApprovalForgeryTest.java:110 void aVerifiedApprovalForTheWrongSourceCannotBeAttached() {</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"> ApprovalForgeryTest.java:133 void aPlanBeyondTheApprovedImpactCeilingCannotExecute() {</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"> ApprovalForgeryTest.java:146 void anApprovalForAReplayCannotAuthoriseARedrive() {</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"> ApprovalForgeryTest.java:158 void anExpiredGrantDoesNotVerify() {</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"> ApprovalForgeryTest.java:172 void theApproverAndTheOperatorMustBeDifferentPeople() {</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"> ApprovalForgeryTest.java:192 void aCorrectlyIssuedApprovalExecutes() {</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"></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"># 계약 leaf 가 담은 main 타입 스물다섯</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"> AdminApproval AdminOperationJournal AdminOperationLease AdminOperationRecord </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"> AdminOperationState ApprovalGrant ApprovalVerifier ApprovedRedrivePlan ApprovedReplayPlan </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"> DestinationTopology DestructiveOperation DestructiveOperationGuard HmacApprovalVerifier </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"> PlanDigest RedrivePlan RedriveRequest RedriveResult ReplayPlan ReplayRequest ReplayResult </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"> TopologyIssue TopologyManagementMode TopologyManifest TopologyValidationReport </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"> VerifiedApproval </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"> main 구현 :</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"> main · messaging-admin-api · HmacApprovalVerifier.java:26 public final class HmacApprovalVerifier implements ApprovalVerifie</tspan><tspan x="24" dy="22">r {</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"> 생성 지점 :</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"> test · messaging-admin-api · DestructiveOperationGuardTest.java:21 new HmacApprovalVerifier(</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"> test · messaging-admin-runtime · ApprovalForgeryTest.java:42 new HmacApprovalVerifier(</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"> test · messaging-admin-runtime · ApprovalForgeryTest.java:46 new HmacApprovalVerifier(</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"> test · messaging-admin-runtime · ApprovedPlanExecutionTest.java:37 private static final HmacApprovalVerifier VERIFIER = ne</tspan><tspan x="24" dy="22">w HmacApprovalVerifier(ISSUING_KEY);</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"> test · messaging-admin-runtime · RedriveResumptionTest.java:45 new HmacApprovalVerifier(</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"> 생성 지점 5 곳 · 파일 4 개</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"></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"># main 에 검증자를 두지 않는 것이 공백인가 경계인가</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"> 자기 자바독이 적은 이유 :</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"> HmacApprovalVerifier.java:50 * &lt;p&gt;Present because the issuer and the verifier must agree on the canonical form exactly, a</tspan><tspan x="24" dy="22">nd a</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"> HmacApprovalVerifier.java:51 * second implementation of that agreement is a second thing to drift. Holding this key is wh</tspan><tspan x="24" dy="22">at</tspan></text>
<text x="24" y="3026" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> HmacApprovalVerifier.java:52 * makes a caller an issuer — it is not, and must not become, available to the runtime that</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"> HmacApprovalVerifier.java:53 * executes operations.</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"> 같은 사슬의 가드는 main 빈으로 있다 :</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"> MessagingAdminAutoConfiguration.java:35 @Bean</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"> MessagingAdminAutoConfiguration.java:36 @ConditionalOnMissingBean</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"> MessagingAdminAutoConfiguration.java:37 public DestructiveOperationGuard destructiveOperationGuard() {</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"> MessagingAdminAutoConfiguration.java:38 // false: an application runtime never holds an admin credential, so the guard r</tspan><tspan x="24" dy="22">efuses the</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"> MessagingAdminAutoConfiguration.java:39 // operations that would need one. An operator tool overrides this bean with tru</tspan><tspan x="24" dy="22">e.</tspan></text>
<text x="24" y="3246" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingAdminAutoConfiguration.java:40 return new DestructiveOperationGuard(false);</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"> MessagingAdminAutoConfiguration.java:41 }</tspan></text>
<text x="24" y="3290" 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="3312" 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="3334" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PlanDigest main 10 파일 · test 6 파일 · 그 이름을 건 시험 파일 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"> ApprovalGrant main 3 파일 · test 4 파일 · 그 이름을 건 시험 파일 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"> VerifiedApproval main 7 파일 · test 4 파일 · 그 이름을 건 시험 파일 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"> ApprovedRedrivePlan main 2 파일 · test 2 파일 · 그 이름을 건 시험 파일 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"> ApprovedReplayPlan main 2 파일 · test 1 파일 · 그 이름을 건 시험 파일 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"> TopologyManifest main 5 파일 · test 4 파일 · 그 이름을 건 시험 파일 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"> 만료를 직접 고정하는 자리 :</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"> test · messaging-admin-api · DestructiveOperationGuardTest.java:73 void anExpiredApprovalDoesNotAuthorise() {</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"> test · messaging-admin-runtime · ApprovalForgeryTest.java:158 void anExpiredGrantDoesNotVerify() {</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"> PlanDigest 가 test 에서 어떻게 쓰이는가 :</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"> test · messaging-admin-api · DestructiveOperationGuardTest.java:36 PlanDigest digest = PlanDigest.ofCanonical(operation </tspan><tspan x="24" dy="22">+ &quot;|&quot; + source.value());</tspan></text>
<text x="24" y="3598" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-admin-runtime · AdminOperationJournalTest.java:9 import dev.caskeleton.messaging.admin.PlanDigest;</tspan></text>
<text x="24" y="3620" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-admin-runtime · AdminOperationJournalTest.java:29 private static final PlanDigest DIGEST = PlanDigest.ofC</tspan><tspan x="24" dy="22">anonical(&quot;&lt;가림&gt;&quot;);</tspan></text>
<text x="24" y="3664" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-admin-runtime · AdminOperationJournalTest.java:30 private static final PlanDigest OTHER_DIGEST = PlanDige</tspan><tspan x="24" dy="22">st.ofCanonical(&quot;&lt;가림&gt;&quot;);</tspan></text>
<text x="24" y="3708" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-admin-runtime · ApprovedPlanExecutionTest.java:13 import dev.caskeleton.messaging.admin.PlanDigest;</tspan></text>
<text x="24" y="3730" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-admin-runtime · ApprovedPlanExecutionTest.java:45 PlanDigest digest,</tspan></text>
<text x="24" y="3752" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-admin-runtime · RedriveResumptionTest.java:10 import dev.caskeleton.messaging.admin.PlanDigest;</tspan></text>
<text x="24" y="3774" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-admin-runtime · RedriveResumptionTest.java:146 PlanDigest digest = PlanDigest.ofCanonical(&quot;&lt;가림&gt;&quot;);</tspan></text>
<text x="24" y="3796" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-outbox-jdbc-postgresql · AdminOperationJournalPostgresIT.java:9 import dev.caskeleton.messaging.admin.PlanD</tspan><tspan x="24" dy="22">igest;</tspan></text>
<text x="24" y="3840" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-outbox-jdbc-postgresql · AdminOperationJournalPostgresIT.java:46 private static final PlanDigest DIGEST =</tspan><tspan x="24" dy="22"> PlanDigest.ofCanonical(&quot;&lt;가림&gt;&quot;);</tspan></text>
<text x="24" y="3884" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-spring-boot-starter · MessagingAutoConfigurationTest.java:432 dev.caskeleton.messaging.admin.PlanDi</tspan><tspan x="24" dy="22">gest planDigest,</tspan></text>
<text x="24" y="3928" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · messaging-spring-boot-starter · MessagingAutoConfigurationTest.java:468 String approvalTicket, dev.caskeleton</tspan><tspan x="24" dy="22">.messaging.admin.PlanDigest planDigest) {</tspan></text>
</svg>