Files
document-haness/docs/clean-architecture-backend-template/final/evidence/rendered/analysis-finding-a04-f002.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

309 lines
61 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="6024" viewBox="0 0 1200 6024" 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="6022" 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
set -euo pipefail
cd /shared/codebase/clean-architecture-backend-template
hits() { </tspan><tspan x="24" dy="22"># rc 0=매치 1=무매치 그 밖=오류. 오류면 죽는다.
local out rc
out=$(git grep -nE &quot;$1&quot; -- &quot;$2&quot;) &amp;&amp; rc=0 || rc=$?
[ &quot;</tspan><tspan x="24" dy="22">$rc&quot; -le 1 ] || { echo &quot;SEARCH FAILED rc=$rc : $1&quot; &gt;&amp;2; exit 2; }
[ &quot;$rc&quot; -eq 0 ] &amp;&amp; printf &#x27;%s\n&#x27; &quot;$out&quot; || true
}
mo</tspan><tspan x="24" dy="22">d() { sed -E &#x27;s#^src/(.*)/src/(main|test)/java/.*/([A-Za-z]+\.java):([0-9]+): *# \1 · \2 · \3:\4 #&#x27;; }
ls_or_die() {</tspan><tspan x="24" dy="22"> # pathspec 이 헛돌면 0 을 제조하지 않고 죽는다
local n; n=$(git ls-files -- &quot;$1&quot; | grep -c . || true</tspan><tspan x="24" dy="22">)
[ &quot;$n&quot; -gt 0 ] || { echo &quot;EMPTY PATHSPEC $1&quot; &gt;&amp;2; exit 2; }
}
P=src/adapter/outbound/messaging/src/main/java/dev/ca</tspan><tspan x="24" dy="22">skeleton/adapter/outbound/messaging/core/OutboundMessagePublisher.java
N=src/adapter/outbound/notification/src/main/java</tspan><tspan x="24" dy="22">/dev/caskeleton/adapter/outbound/notification/core/FailOpenNotificationProvider.java
T=src/adapter/outbound/messaging/sr</tspan><tspan x="24" dy="22">c/test/java/dev/caskeleton/adapter/outbound/messaging/core/OutboundMessagePublisherTest.java
R=src/adapter/outbound/noti</tspan><tspan x="24" dy="22">fication/src/main/java/dev/caskeleton/adapter/outbound/notification/core/RoutingNotifier.java
for f in &quot;$P&quot; &quot;$N&quot; &quot;$T&quot; &quot;$</tspan><tspan x="24" dy="22">R&quot;; do test -f &quot;$f&quot;; done
ls_or_die &#x27;src/**/*.java&#x27;
echo &quot;# 두 소비자가 같은 FailOpenDependencyLogger 를 쓴다&quot;
hits &#x27;Fa</tspan><tspan x="24" dy="22">ilOpenDependencyLogger [a-zA-Z]+;|FailOpenDependencyLogger\(&#x27; &#x27;src/**/*.java&#x27; | mod
echo
echo &quot;# 두 파일의 이력&quot;
for f </tspan><tspan x="24" dy="22">in &quot;$N&quot; &quot;$P&quot;; do
printf &#x27; %s\n&#x27; &quot;$(basename &quot;$f&quot;)&quot;
git log --format=&#x27; %h %ad %s&#x27; --date=short -- &quot;$f&quot;
done
echo</tspan><tspan x="24" dy="22">
echo &quot;# 처음 출하된 메시징 publish (821fe00c) — 지금 알림 쪽과 같은 모양&quot;
git show 821fe00c:&quot;$P&quot; | awk &#x27;NR&gt;=26 &amp;&amp; NR&lt;=</tspan><tspan x="24" dy="22">37 {printf &quot; OutboundMessagePublisher.java@821fe00c:%d %s\n&quot;, NR, $0}&#x27;
echo
echo &quot;# 지금의 메시징 publish (:26~:60)&quot;
a</tspan><tspan x="24" dy="22">wk &#x27;NR&gt;=26 &amp;&amp; NR&lt;=60 {printf &quot; OutboundMessagePublisher.java:%d %s\n&quot;, NR, $0}&#x27; &quot;$P&quot;
echo
echo &quot;# 지금의 알림 send 와 </tspan><tspan x="24" dy="22">그 클래스가 스스로 적은 계약&quot;
awk &#x27;NR&gt;=7 &amp;&amp; NR&lt;=11 {printf &quot; FailOpenNotificationProvider.java:%d %s\n&quot;, NR, $0}&#x27; &quot;$N&quot;
</tspan><tspan x="24" dy="22">awk &#x27;NR&gt;=35 &amp;&amp; NR&lt;=45 {printf &quot; FailOpenNotificationProvider.java:%d %s\n&quot;, NR, $0}&#x27; &quot;$N&quot;
echo
echo &quot;# 그 send 를 부르</tspan><tspan x="24" dy="22">는 자리&quot;
awk &#x27;NR&gt;=115 &amp;&amp; NR&lt;=123 {printf &quot; RoutingNotifier.java:%d %s\n&quot;, NR, $0}&#x27; &quot;$R&quot;
echo &quot; NotificationPort 를 참</tspan><tspan x="24" dy="22">조하는 main 파일 :&quot;
hits &#x27;NotificationPort&#x27; &#x27;src/**/*.java&#x27; | grep &#x27;/src/main/&#x27; | cut -d: -f1 \
| xargs -n1 basename |</tspan><tspan x="24" dy="22"> sort -u | sed &#x27;s#^# #&#x27;
echo
echo &quot;# 메시징 쪽 회귀 시험 전문 (:111~:145)&quot;
awk &#x27;NR&gt;=111 &amp;&amp; NR&lt;=145 {printf &quot; Outbou</tspan><tspan x="24" dy="22">ndMessagePublisherTest.java:%d %s\n&quot;, NR, $0}&#x27; &quot;$T&quot;
echo
echo &quot;# 알림 쪽에서 그 클래스를 실제로 조립하는 시험&quot;
hits &#x27;ne</tspan><tspan x="24" dy="22">w FailOpenNotificationProvider&#x27; &#x27;src/**/*.java&#x27; | grep &#x27;/src/test/&#x27; | mod
echo &quot; 그 시험들 안에서 던지도록 만든 것 :&quot;
f</tspan><tspan x="24" dy="22">or tf in $(git grep -l &#x27;new FailOpenNotificationProvider&#x27; -- &#x27;src/**/*.java&#x27; | grep &#x27;/src/test/&#x27;); do
echo &quot; $(base</tspan><tspan x="24" dy="22">name &quot;$tf&quot;)&quot;
{ grep -nE &#x27;throw new|doThrow|thenThrow&#x27; &quot;$tf&quot; || true; } \
| sed -E &#x27;s#^([0-9]+): *# :\1 #&#x27;
do</tspan><tspan x="24" dy="22">ne
echo &quot; 로거 자체를 던지게 만드는 자리 (메시징 회귀 시험이 쓰는 방식) :&quot;
for m in notification messaging; do
printf</tspan><tspan x="24" dy="22"> &#x27; src/adapter/outbound/%-13s Proxy.newProxyInstance : %s 개\n&#x27; &quot;$m&quot; \
&quot;$({ git grep -n &#x27;Proxy.newProxyInstance&#x27; </tspan><tspan x="24" dy="22">-- &quot;src/adapter/outbound/$m/**/*.java&quot; || true; } | grep -c . || true)&quot;
done
echo &quot; 그 클래스 이름을 파일명에 가진 시험</tspan><tspan x="24" dy="22"> : $(
{ git ls-files -- &#x27;src/**/*Test*.java&#x27; | grep -c &#x27;FailOpenNotificationProvider&#x27; || true; }) 개&quot;
echo
echo &quot;# 프</tspan><tspan x="24" dy="22">로브 : 같은 로거 프록시를 세 구조에 똑같이 물린다&quot;
grep -nE &#x27;n.equals\(&quot;debug&quot;\)|n.equals\(&quot;warn&quot;\)|throw new IllegalSta</tspan><tspan x="24" dy="22">teException|getReturnType|sends.incrementAndGet|reset\(\)|catch \(RuntimeException|new FailOpenNotificationProvider|new </tspan><tspan x="24" dy="22">dev.caskeleton.*OutboundMessagePublisher|new PublisherAsShippedAtInit|new FailOpenDependencyLogger&#x27; \
/tmp/probe-notif</tspan><tspan x="24" dy="22">/DiagnosticProbe.java | sed -E &#x27;s#^([0-9]+): *# probe:\1 #&#x27;
CP=&quot;$(cat /tmp/cp-notif.txt):$(cat /tmp/cp-msgadapter.tx</tspan><tspan x="24" dy="22">t)&quot;
rm -rf /tmp/probe-notif/out &amp;&amp; mkdir -p /tmp/probe-notif/out
javac -nowarn -cp &quot;$CP&quot; -d /tmp/probe-notif/out \
/tm</tspan><tspan x="24" dy="22">p/probe-notif/DiagnosticProbe.java /tmp/probe-notif/old/PublisherAsShippedAtInit.java
java -Dfile.encoding=UTF-8 -Dsun.s</tspan><tspan x="24" dy="22">tdout.encoding=UTF-8 \
-cp &quot;$CP:/tmp/probe-notif/out&quot; dev.caskeleton.adapter.outbound.notification.core.DiagnosticProb</tspan><tspan x="24" dy="22">e
</tspan></text>
<text x="24" y="882" 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="904" 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-04T05:00:01+00:00 · exit 0</tspan></text>
<line x1="24" y1="918" x2="1176" y2="918" stroke="#30363d"/>
<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"># 두 소비자가 같은 FailOpenDependencyLogger 를 쓴다</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"> adapter/outbound/messaging · main · OutboundMessagePublisher.java:19 private final FailOpenDependencyLogger dependencyLogge</tspan><tspan x="24" dy="22">r;</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"> adapter/outbound/messaging · test · OutboundMessagePublisherTest.java:28 private FailOpenDependencyLogger dependencyLogger;</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"> adapter/outbound/messaging · test · OutboundMessagePublisherTest.java:37 dependencyLogger = new FailOpenDependencyLogger(lo</tspan><tspan x="24" dy="22">gbackLogger);</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"> adapter/outbound/messaging · test · OutboundMessagePublisherTest.java:138 new OutboundMessagePublisher(broker, new FailOpen</tspan><tspan x="24" dy="22">DependencyLogger(throwingLogger));</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"> adapter/outbound/notification · main · FailOpenNotificationProvider.java:17 private final FailOpenDependencyLogger dependen</tspan><tspan x="24" dy="22">cyLogger;</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"> adapter/outbound/notification · test · NotificationAdapterTest.java:47 private FailOpenDependencyLogger dependencyLogger;</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"> adapter/outbound/notification · test · NotificationAdapterTest.java:56 dependencyLogger = new FailOpenDependencyLogger(logb</tspan><tspan x="24" dy="22">ackLogger);</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"> adapter/outbound/notification · test · RoutingNotifierTest.java:55 private FailOpenDependencyLogger dependencyLogger;</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"> adapter/outbound/notification · test · RoutingNotifierTest.java:64 dependencyLogger = new FailOpenDependencyLogger(logbackL</tspan><tspan x="24" dy="22">ogger);</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"> adapter/outbound/support · main · FailOpenDependencyLogger.java:17 public FailOpenDependencyLogger() {</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"> adapter/outbound/support · main · FailOpenDependencyLogger.java:22 public FailOpenDependencyLogger(Logger log) {</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"> adapter/outbound/support · main · OutboundSupportConfig.java:18 return new FailOpenDependencyLogger();</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"> adapter/outbound/support · test · FailOpenDependencyLoggerTest.java:18 private FailOpenDependencyLogger dependencyLogger;</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"> adapter/outbound/support · test · FailOpenDependencyLoggerTest.java:28 dependencyLogger = new FailOpenDependencyLogger(logb</tspan><tspan x="24" dy="22">ackLogger);</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"></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"># 두 파일의 이력</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"> FailOpenNotificationProvider.java</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"> 821fe00c 2026-07-24 init: 클린 아키텍처 백엔드</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"> OutboundMessagePublisher.java</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"> 2f5d2fc2 2026-08-15 feat: jpa, messaging, notification, mongo, graphql 어댑터터 구현체 추가</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"> 821fe00c 2026-07-24 init: 클린 아키텍처 백엔드</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"></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"># 처음 출하된 메시징 publish (821fe00c) — 지금 알림 쪽과 같은 모양</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"> OutboundMessagePublisher.java@821fe00c:26 @Override</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"> OutboundMessagePublisher.java@821fe00c:27 public void publish(OutboundMessage message) {</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"> OutboundMessagePublisher.java@821fe00c:28 try {</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"> OutboundMessagePublisher.java@821fe00c:29 broker.send(message);</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"> OutboundMessagePublisher.java@821fe00c:30 dependencyLogger.logSuccess(broker.brokerId(), DEPENDENCY_TYPE, &quot;publish&quot;);</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"> OutboundMessagePublisher.java@821fe00c:31 } catch (Exception ex) {</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"> OutboundMessagePublisher.java@821fe00c:32 // fail-open: observe with correlationId, delegate durability to outbox/retry,</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"> OutboundMessagePublisher.java@821fe00c:33 // do NOT propagate — the core use case must still succeed.</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"> OutboundMessagePublisher.java@821fe00c:34 dependencyLogger.logFailure(broker.brokerId(), DEPENDENCY_TYPE, &quot;publish&quot;, ex)</tspan><tspan x="24" dy="22">;</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"> OutboundMessagePublisher.java@821fe00c:35 }</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"> OutboundMessagePublisher.java@821fe00c:36 }</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"> OutboundMessagePublisher.java@821fe00c:37 }</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"># 지금의 메시징 publish (:26~:60)</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"> OutboundMessagePublisher.java:26 @Override</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"> OutboundMessagePublisher.java:27 public void publish(OutboundMessage message) {</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"> OutboundMessagePublisher.java:28 // The send and the observation are separate steps because they used to share a try block</tspan><tspan x="24" dy="22">: a</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"> OutboundMessagePublisher.java:29 // logger that threw after a successful send was caught by the same catch and reported as</tspan><tspan x="24" dy="22"> a</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"> OutboundMessagePublisher.java:30 // publish failure. The broker had accepted the message; the only thing that failed was t</tspan><tspan x="24" dy="22">he</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"> OutboundMessagePublisher.java:31 // record of it, and the two must not be confusable.</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"> OutboundMessagePublisher.java:32 boolean sent = false;</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"> OutboundMessagePublisher.java:33 try {</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"> OutboundMessagePublisher.java:34 broker.send(message);</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"> OutboundMessagePublisher.java:35 sent = true;</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"> OutboundMessagePublisher.java:36 } catch (Exception ex) {</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"> OutboundMessagePublisher.java:37 // fail-open: observe with correlationId, delegate durability to outbox/retry,</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"> OutboundMessagePublisher.java:38 // do NOT propagate — the core use case must still succeed.</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"> OutboundMessagePublisher.java:39 observeQuietly(</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"> OutboundMessagePublisher.java:40 () -&gt; dependencyLogger.logFailure(broker.brokerId(), DEPENDENCY_TYPE, &quot;publish&quot;, ex</tspan><tspan x="24" dy="22">));</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"> OutboundMessagePublisher.java:41 }</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"> OutboundMessagePublisher.java:42 if (sent) {</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"> OutboundMessagePublisher.java:43 observeQuietly(</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"> OutboundMessagePublisher.java:44 () -&gt; dependencyLogger.logSuccess(broker.brokerId(), DEPENDENCY_TYPE, &quot;publish&quot;));</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"> OutboundMessagePublisher.java:45 }</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"> OutboundMessagePublisher.java:46 }</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"> OutboundMessagePublisher.java:47 </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"> OutboundMessagePublisher.java:48 /**</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"> OutboundMessagePublisher.java:49 * Runs an observation, absorbing whatever it throws.</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"> OutboundMessagePublisher.java:50 *</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"> OutboundMessagePublisher.java:51 * &lt;p&gt;Diagnostics are non-authoritative. An appender that is out of disk must not change wh</tspan><tspan x="24" dy="22">at the</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"> OutboundMessagePublisher.java:52 * caller believes about the broker.</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"> OutboundMessagePublisher.java:53 */</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"> OutboundMessagePublisher.java:54 private static void observeQuietly(Runnable observation) {</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"> OutboundMessagePublisher.java:55 try {</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"> OutboundMessagePublisher.java:56 observation.run();</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"> OutboundMessagePublisher.java:57 } catch (RuntimeException ignored) {</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"> OutboundMessagePublisher.java:58 // Nothing to report it to: the reporter is what failed.</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"> OutboundMessagePublisher.java:59 }</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"> OutboundMessagePublisher.java:60 }</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"># 지금의 알림 send 와 그 클래스가 스스로 적은 계약</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"> FailOpenNotificationProvider.java:7 /**</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"> FailOpenNotificationProvider.java:8 * Fail-open decorator: a provider failure is logged (no payload/PII) and swallowed so a</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"> FailOpenNotificationProvider.java:9 * notification — a side-effect — never fails the core use case. Applied centrally by</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"> FailOpenNotificationProvider.java:10 * NotificationConfig.</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"> FailOpenNotificationProvider.java:11 */</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"> FailOpenNotificationProvider.java:35 @Override</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"> FailOpenNotificationProvider.java:36 public void send(Notification notification) {</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"> FailOpenNotificationProvider.java:37 try {</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"> FailOpenNotificationProvider.java:38 delegate.send(notification);</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"> FailOpenNotificationProvider.java:39 dependencyLogger.logSuccess(delegate.providerId(), DEPENDENCY_TYPE, &quot;send&quot;);</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"> FailOpenNotificationProvider.java:40 } catch (Exception ex) {</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"> FailOpenNotificationProvider.java:41 // fail-open: observe (no payload/PII), do not fail the core use case.</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"> FailOpenNotificationProvider.java:42 dependencyLogger.logFailure(delegate.providerId(), DEPENDENCY_TYPE, &quot;send&quot;, ex);</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"> FailOpenNotificationProvider.java:43 }</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"> FailOpenNotificationProvider.java:44 }</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"> FailOpenNotificationProvider.java:45 }</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"></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"># 그 send 를 부르는 자리</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"> RoutingNotifier.java:115 Map&lt;String, FailOpenNotificationProvider&gt; channelRegistry =</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"> RoutingNotifier.java:116 registry.getOrDefault(channel, Map.of());</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"> RoutingNotifier.java:117 // FailOpenNotificationProvider.send declares no throws — no try/catch needed.</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"> RoutingNotifier.java:118 // Individual provider failures are observed (logged) inside the decorator</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"> RoutingNotifier.java:119 // and never propagated, so one failure does not block remaining fan-out sends.</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"> RoutingNotifier.java:120 for (String providerId : providerIds) {</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"> RoutingNotifier.java:121 channelRegistry.get(providerId).send(notification);</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"> RoutingNotifier.java:122 }</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"> RoutingNotifier.java:123 }</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"> NotificationPort 를 참조하는 main 파일 :</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"> Notification.java</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"> NotificationConfig.java</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"> NotificationPort.java</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"> RoutingNotifier.java</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"></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"># 메시징 쪽 회귀 시험 전문 (:111~:145)</tspan></text>
<text x="24" y="3642" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:111 @org.junit.jupiter.api.DisplayName(</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"> OutboundMessagePublisherTest.java:112 &quot;a logger failure after a confirmed send is not a publish failure&quot;)</tspan></text>
<text x="24" y="3686" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:113 @Test</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"> OutboundMessagePublisherTest.java:114 void aLoggerFailureAfterAConfirmedSendIsNotAPublishFailure() {</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"> OutboundMessagePublisherTest.java:115 // The send and the success log used to share one try block, so a logger that threw </tspan><tspan x="24" dy="22">after the</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"> OutboundMessagePublisherTest.java:116 // broker had accepted the message was caught by the failure branch and recorded as </tspan><tspan x="24" dy="22">a publish</tspan></text>
<text x="24" y="3818" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:117 // failure. The broker&#x27;s outcome and the record of it are different facts.</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"> OutboundMessagePublisherTest.java:118 FakeBroker broker = new FakeBroker();</tspan></text>
<text x="24" y="3862" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:119 org.slf4j.Logger throwingLogger =</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"> OutboundMessagePublisherTest.java:120 (org.slf4j.Logger)</tspan></text>
<text x="24" y="3906" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:121 java.lang.reflect.Proxy.newProxyInstance(</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"> OutboundMessagePublisherTest.java:122 getClass().getClassLoader(),</tspan></text>
<text x="24" y="3950" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:123 new Class&lt;?&gt;[] {org.slf4j.Logger.class},</tspan></text>
<text x="24" y="3972" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:124 (proxy, method, args) -&gt; {</tspan></text>
<text x="24" y="3994" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:125 if (method.getName().equals(&quot;debug&quot;)) {</tspan></text>
<text x="24" y="4016" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:126 throw new IllegalStateException(&quot;the appender is out of disk&quot;);</tspan></text>
<text x="24" y="4038" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:127 }</tspan></text>
<text x="24" y="4060" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:128 if (method.getReturnType() == boolean.class) {</tspan></text>
<text x="24" y="4082" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:129 return true;</tspan></text>
<text x="24" y="4104" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:130 }</tspan></text>
<text x="24" y="4126" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:131 if (method.getReturnType() == String.class) {</tspan></text>
<text x="24" y="4148" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:132 return &quot;test.messaging&quot;;</tspan></text>
<text x="24" y="4170" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:133 }</tspan></text>
<text x="24" y="4192" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:134 return null;</tspan></text>
<text x="24" y="4214" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:135 });</tspan></text>
<text x="24" y="4236" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:136 </tspan></text>
<text x="24" y="4258" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:137 OutboundMessagePublisher publisher =</tspan></text>
<text x="24" y="4280" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:138 new OutboundMessagePublisher(broker, new FailOpenDependencyLogger(throwingLogger</tspan><tspan x="24" dy="22">));</tspan></text>
<text x="24" y="4324" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:139 OutboundMessage message = new OutboundMessage(&quot;worklog-events&quot;, &quot;wl-1&quot;, &quot;{}&quot;);</tspan></text>
<text x="24" y="4346" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:140 </tspan></text>
<text x="24" y="4368" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:141 assertThatCode(() -&gt; publisher.publish(message)).doesNotThrowAnyException();</tspan></text>
<text x="24" y="4390" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:142 assertThat(broker.sent)</tspan></text>
<text x="24" y="4412" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:143 .as(&quot;the message reached the broker; only the record of it failed&quot;)</tspan></text>
<text x="24" y="4434" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:144 .containsExactly(message);</tspan></text>
<text x="24" y="4456" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest.java:145 }</tspan></text>
<text x="24" y="4478" 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="4500" 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="4522" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · NotificationAdapterTest.java:91 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4544" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · NotificationAdapterTest.java:101 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4566" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · NotificationAdapterTest.java:123 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4588" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · NotificationAdapterTest.java:133 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4610" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · RoutingNotifierTest.java:137 return new FailOpenNotificationProvider(provider, depen</tspan><tspan x="24" dy="22">dencyLogger);</tspan></text>
<text x="24" y="4654" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · RoutingNotifierTest.java:147 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4676" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · RoutingNotifierTest.java:157 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4698" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · RoutingNotifierTest.java:179 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4720" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · RoutingNotifierTest.java:189 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4742" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · RoutingNotifierTest.java:243 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4764" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · RoutingNotifierTest.java:245 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4786" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> adapter/outbound/notification · test · RoutingNotifierTest.java:316 new FailOpenNotificationProvider(</tspan></text>
<text x="24" y="4808" 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="4830" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> NotificationAdapterTest.java</tspan></text>
<text x="24" y="4852" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> :79 throw new RuntimeException(&quot;provider-failure&quot;);</tspan></text>
<text x="24" y="4874" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RoutingNotifierTest.java</tspan></text>
<text x="24" y="4896" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> :130 throw new RuntimeException(&quot;provider-failure&quot;);</tspan></text>
<text x="24" y="4918" 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="4940" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/adapter/outbound/notification Proxy.newProxyInstance : 0 개</tspan></text>
<text x="24" y="4962" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/adapter/outbound/messaging Proxy.newProxyInstance : 1 개</tspan></text>
<text x="24" y="4984" 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="5006" 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="5028" 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="5050" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:24 if (n.equals(&quot;debug&quot;)) {</tspan></text>
<text x="24" y="5072" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:27 throw new IllegalStateException(&quot;the appender is out of disk&quot;);</tspan></text>
<text x="24" y="5094" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:30 if (n.equals(&quot;warn&quot;)) {</tspan></text>
<text x="24" y="5116" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:33 throw new IllegalStateException(&quot;the appender is out of disk&quot;);</tspan></text>
<text x="24" y="5138" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:36 if (method.getReturnType() == boolean.class) {</tspan></text>
<text x="24" y="5160" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:39 if (method.getReturnType() == String.class) {</tspan></text>
<text x="24" y="5182" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:60 sends.incrementAndGet();</tspan></text>
<text x="24" y="5204" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:65 static void reset() {</tspan></text>
<text x="24" y="5226" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:72 reset();</tspan></text>
<text x="24" y="5248" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:74 new FailOpenNotificationProvider(succeeding(), new FailOpenDependencyLogger(logger(debugThrows, warnThrows)));</tspan></text>
<text x="24" y="5270" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:78 } catch (RuntimeException ex) {</tspan></text>
<text x="24" y="5292" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:87 reset();</tspan></text>
<text x="24" y="5314" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:97 sends.incrementAndGet();</tspan></text>
<text x="24" y="5336" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:101 new dev.caskeleton.adapter.outbound.messaging.core.OutboundMessagePublisher(</tspan></text>
<text x="24" y="5358" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:102 broker, new FailOpenDependencyLogger(logger(debugThrows, warnThrows)));</tspan></text>
<text x="24" y="5380" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:106 } catch (RuntimeException ex) {</tspan></text>
<text x="24" y="5402" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:116 reset();</tspan></text>
<text x="24" y="5424" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:126 sends.incrementAndGet();</tspan></text>
<text x="24" y="5446" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:130 new PublisherAsShippedAtInit(</tspan></text>
<text x="24" y="5468" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:131 broker, new FailOpenDependencyLogger(logger(debugThrows, warnThrows)));</tspan></text>
<text x="24" y="5490" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> probe:135 } catch (RuntimeException ex) {</tspan></text>
<text x="24" y="5512" 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="5534" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> FailOpenNotificationProvider file:/shared/codebase/clean-architecture-backend-template/src/adapter/outbound/notification/b</tspan><tspan x="24" dy="22">uild/classes/java/main/</tspan></text>
<text x="24" y="5578" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisher file:/shared/codebase/clean-architecture-backend-template/src/adapter/outbound/messaging/buil</tspan><tspan x="24" dy="22">d/classes/java/main/</tspan></text>
<text x="24" y="5622" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> FailOpenDependencyLogger file:/shared/codebase/clean-architecture-backend-template/src/adapter/outbound/support/build/</tspan><tspan x="24" dy="22">libs/support-0.0.1+21234e38cdb9.jar</tspan></text>
<text x="24" y="5666" 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="5688" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 알림 쪽 FailOpenNotificationProvider.send (위임 전송은 항상 성공한다)</tspan></text>
<text x="24" y="5710" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 로거가 던지지 않을 때 전송 1 · debug 1 · warn 0 · 호출자에게 나간 예외 없음</tspan></text>
<text x="24" y="5732" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 성공 로거만 던질 때 전송 1 · debug 1 · warn 1 · 호출자에게 나간 예외 없음</tspan></text>
<text x="24" y="5754" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 성공 로거와 실패 로거가 던질 때 전송 1 · debug 1 · warn 1 · 호출자에게 나간 예외 IllegalStateException</tspan></text>
<text x="24" y="5776" 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="5798" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 메시징 쪽 OutboundMessagePublisher.publish (브로커 전송은 항상 성공한다)</tspan></text>
<text x="24" y="5820" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 로거가 던지지 않을 때 전송 1 · debug 1 · warn 0 · 호출자에게 나간 예외 없음</tspan></text>
<text x="24" y="5842" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 성공 로거만 던질 때 전송 1 · debug 1 · warn 0 · 호출자에게 나간 예외 없음</tspan></text>
<text x="24" y="5864" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 성공 로거와 실패 로거가 던질 때 전송 1 · debug 1 · warn 0 · 호출자에게 나간 예외 없음</tspan></text>
<text x="24" y="5886" 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="5908" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 저장소가 처음 출하한 메시징 구조 (821fe00c, 지금 알림 쪽과 같은 모양)</tspan></text>
<text x="24" y="5930" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 성공 로거만 던질 때 전송 1 · debug 1 · warn 1 · 호출자에게 나간 예외 없음</tspan></text>
<text x="24" y="5952" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest:141 의 첫 단언(예외 없음) : 통과</tspan></text>
<text x="24" y="5974" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> OutboundMessagePublisherTest:142 의 둘째 단언(브로커가 받음) : 통과</tspan></text>
</svg>