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>
213 lines
40 KiB
XML
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 's#^src/messaging/([^/]+)/src/(main|test)/java/dev/caskeleton/[^:]*/([^:/]+):([0-9]+):#</tspan><tspan x="24" dy="22"> \2 · \1 · \3:\4 #' \
|
|
| sed -E 's#"[^"]{16,}"#"<가림>"#g'; }
|
|
|
|
echo "# 계약 leaf 와 그 소비자 leaf 의 소스 규</tspan><tspan x="24" dy="22">모"
|
|
for m in messaging-admin-api messaging-admin-runtime; do
|
|
echo " $m 의 소스 세트 : $(ls src/messaging/$m/src/ | tr</tspan><tspan x="24" dy="22"> '\n' ' ')"
|
|
for ss in main test; do
|
|
n=$(find src/messaging/$m/src/$ss -name '*.java' 2>/dev/null | wc -l)
|
|
l=$(</tspan><tspan x="24" dy="22">find src/messaging/$m/src/$ss -name '*.java' -exec cat {} + 2>/dev/null | wc -l)
|
|
printf " %-4s %2s 파일 · %4s 줄</tspan><tspan x="24" dy="22">\n" "$ss" "$n" "$l"
|
|
done
|
|
done
|
|
|
|
echo
|
|
echo "# 계약 leaf 의 유일한 시험 파일이 담은 것"
|
|
T=src/messaging/messaging-admin-a</tspan><tspan x="24" dy="22">pi/src/test/java/dev/caskeleton/messaging/admin/DestructiveOperationGuardTest.java
|
|
echo " 파일 : $(basename $T) · @T</tspan><tspan x="24" dy="22">est $(grep -c '@Test' $T) 개"
|
|
grep -n 'void .*(' $T | sed -E 's#^([0-9]+): *# :\1 #'
|
|
|
|
echo " 그 시험들이 승인 객체</tspan><tspan x="24" dy="22">를 어떻게 얻는가 :"
|
|
awk 'NR>=27 && NR<=33 {printf " DestructiveOperationGuardTest.java:%d %s\n", NR, $0}' $T
|
|
awk 'NR></tspan><tspan x="24" dy="22">=45 && NR<=48 {printf " DestructiveOperationGuardTest.java:%d %s\n", NR, $0}' $T
|
|
echo " 그 셋의 단언이 무엇에 떨어지</tspan><tspan x="24" dy="22">는가 :"
|
|
grep -n 'Optional.empty()\|Optional.of(\|hasMessageContaining\|doesNotThrowAnyException' $T \
|
|
| sed -E 's#^([0</tspan><tspan x="24" dy="22">-9]+): *# DestructiveOperationGuardTest.java:\1 #' | sed -E 's#"[^"]{16,}"#"<가림>"#g'
|
|
echo " 가드가 그 메시지를 내</tspan><tspan x="24" dy="22">는 자리 :"
|
|
G=$(find src -name DestructiveOperationGuard.java -path '*/main/*')
|
|
grep -n 'APPROVAL_REQUIRED\|APPROVAL_EXPI</tspan><tspan x="24" dy="22">RED\|isValidAt' $G | sed -E 's#^([0-9]+): *# DestructiveOperationGuard.java:\1 #'
|
|
|
|
echo
|
|
echo "# 소비자 leaf 의 시험 </tspan><tspan x="24" dy="22">여섯"
|
|
for f in $(find src/messaging/messaging-admin-runtime/src/test -name '*.java' | sort); do
|
|
printf " %-34s @Tes</tspan><tspan x="24" dy="22">t %s 개\n" "$(basename $f)" "$(grep -c '@Test' $f)"
|
|
done
|
|
echo " 그중 승인 위조 시험이 단언하는 것 :"
|
|
grep -n 'void .*('</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 's#^([0-9]+): *# ApprovalForgeryTest.java:\1 #'
|
|
|
|
echo
|
|
echo "# 계약 leaf 가 담은 main 타입 스물다섯"
|
|
find s</tspan><tspan x="24" dy="22">rc/messaging/messaging-admin-api/src/main -name '*.java' | sed 's#.*/##;s#\.java$##' | sort | tr '\n' ' ' | fold -w 92 -</tspan><tspan x="24" dy="22">s | sed 's#^# #'
|
|
echo
|
|
|
|
echo "# 승인 검증자는 어디서 만들어지는가"
|
|
echo " main 구현 :"
|
|
git grep -n 'implements Approv</tspan><tspan x="24" dy="22">alVerifier' -- 'src/**/*.java' | strip
|
|
echo " 생성 지점 :"
|
|
git grep -n 'new HmacApprovalVerifier' -- 'src/**/*.java' | </tspan><tspan x="24" dy="22">strip
|
|
echo " 생성 지점 $(git grep -c 'new HmacApprovalVerifier' -- 'src/**/*.java' | awk -F: '{s+=$2} END{print s}') </tspan><tspan x="24" dy="22">곳 · 파일 $(git grep -l 'new HmacApprovalVerifier' -- 'src/**/*.java' | wc -l) 개"
|
|
|
|
echo
|
|
echo "# main 에 검증자를 두지 </tspan><tspan x="24" dy="22">않는 것이 공백인가 경계인가"
|
|
echo " 자기 자바독이 적은 이유 :"
|
|
H=$(find src -name HmacApprovalVerifier.java -path '*/ma</tspan><tspan x="24" dy="22">in/*')
|
|
awk 'NR>=50 && NR<=53 {printf " HmacApprovalVerifier.java:%d %s\n", NR, $0}' $H
|
|
echo " 같은 사슬의 가드는 mai</tspan><tspan x="24" dy="22">n 빈으로 있다 :"
|
|
A=$(find src -name MessagingAdminAutoConfiguration.java -path '*/main/*')
|
|
awk 'NR>=35 && NR<=41 {printf</tspan><tspan x="24" dy="22"> " MessagingAdminAutoConfiguration.java:%d %s\n", NR, $0}' $A
|
|
|
|
echo
|
|
echo "# 계약 타입의 경계 조건이 따로 고정돼 있는</tspan><tspan x="24" dy="22">가"
|
|
for t in PlanDigest ApprovalGrant VerifiedApproval ApprovedRedrivePlan ApprovedReplayPlan TopologyManifest; do
|
|
m=$</tspan><tspan x="24" dy="22">(git grep -lw "$t" -- 'src/**/*.java' | grep '/main/' | grep -v "/$t.java" | wc -l)
|
|
s=$(git grep -lw "$t" -- 'src/**/*</tspan><tspan x="24" dy="22">.java' | grep '/test/' | wc -l)
|
|
n=$(find src \( -name "*${t}*Test.java" -o -name "*${t}*Tests.java" -o -name "*${t}*IT</tspan><tspan x="24" dy="22">.java" \) | wc -l)
|
|
printf " %-22s main %s 파일 · test %s 파일 · 그 이름을 건 시험 파일 %s 개\n" "$t" "$m" "$s" "$</tspan><tspan x="24" dy="22">n"
|
|
done
|
|
echo " 만료를 직접 고정하는 자리 :"
|
|
git grep -n 'anExpiredGrantDoesNotVerify\|anExpiredApprovalDoesNotAuthorise</tspan><tspan x="24" dy="22">' -- 'src/**/*.java' | strip
|
|
echo " PlanDigest 가 test 에서 어떻게 쓰이는가 :"
|
|
git grep -n 'PlanDigest' -- 'src/**/*.ja</tspan><tspan x="24" dy="22">va' | grep '/test/' | 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 * <p>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("<가림>");</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 () -> 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("approval");</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("validity window");</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 "APPROVAL_REQUIRED",</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 "APPROVAL_EXPIRED", "approval " + granted.ticket() + " is outside its validity window");</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 * <p>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">+ "|" + 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("<가림>");</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("<가림>");</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("<가림>");</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("<가림>");</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>
|