Files
document-haness/docs/clean-architecture-backend-template/final/evidence/rendered/a19-f014-kafka-msg.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

245 lines
45 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="4506" viewBox="0 0 1200 4506" 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="4504" rx="14" fill="#0d1117" stroke="#30363d"/>
<rect x="1" y="1" width="1198" height="44" rx="14" fill="#161b22"/>
<rect x="1" y="30" width="1198" height="14" fill="#161b22"/>
<circle cx="24" cy="22" r="6" fill="#ff5f57"/>
<circle cx="44" cy="22" r="6" fill="#febc2e"/>
<circle cx="64" cy="22" r="6" fill="#28c840"/>
<text x="92" y="27" fill="#8b949e" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">terminal evidence</text>
<text x="24" y="68" fill="#c9d1d9" font-size="15" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">$ set -e
set -o pipefail
B=src/app-bootstrap/src/main/java/dev/caskeleton/bootstrap
A=src/messaging/messaging-spring-boo</tspan><tspan x="24" dy="22">t-starter/src/main/java/dev/caskeleton/messaging/autoconfigure
strip() { sed -E &#x27;s#^src/[^:]*/src/(main|test)/java/dev/c</tspan><tspan x="24" dy="22">askeleton/([^:]*)/([^:/]+):([0-9]+):# \1 · \2/\3:\4 #&#x27;; }
cut_range() { awk -v f=&quot;$2&quot; -v a=&quot;$3&quot; -v b=&quot;$4&quot; &#x27;NR&gt;=a &amp;&amp; NR</tspan><tspan x="24" dy="22">&lt;=b {printf &quot; %s:%d %s\n&quot;, f, NR, $0}&#x27; &quot;$1&quot;; }
echo &quot;# 가족 문서가 이 항목을 어떻게 들고 있는가&quot;
grep -n &#x27;MSG-015&#x27; src</tspan><tspan x="24" dy="22">/messaging/CLAUDE.md | cut -c1-150 | sed &#x27;s#^# messaging/CLAUDE.md:#&#x27;
echo
echo &quot;# 두 스택의 설정 클래스와 생산자 빈&quot;
</tspan><tspan x="24" dy="22">cut_range $B/messaging/KafkaSenderConfig.java bootstrap/messaging/KafkaSenderConfig.java 37 39
cut_range $B/messaging/Ka</tspan><tspan x="24" dy="22">fkaSenderConfig.java bootstrap/messaging/KafkaSenderConfig.java 61 63
awk &#x27;NR&gt;=126 &amp;&amp; NR&lt;=131 {printf &quot; autoconfigure/K</tspan><tspan x="24" dy="22">afkaMessagingAutoConfiguration.java:%d %s\n&quot;, NR, $0}&#x27; $A/KafkaMessagingAutoConfiguration.java
echo
echo &quot;# 플랫폼 쪽이</tspan><tspan x="24" dy="22"> 켜지는 사슬&quot;
git grep -n &#x27;prefix = MessagingSettings.PREFIX, name = &quot;enabled&quot;&#x27; -- &#x27;src/**/*.java&#x27; | strip
git grep -n &#x27;</tspan><tspan x="24" dy="22">&quot;kafka&quot;, KafkaMessagingAutoConfiguration.class&#x27; -- &#x27;src/**/*.java&#x27; | strip
echo
echo &quot;# broker 만 준 시험이 통과하는 이</tspan><tspan x="24" dy="22">유 — 게이트 뒤 설정을 손으로 등록한다&quot;
git grep -n &#x27;withUserConfiguration(KafkaAdapterConfig&#x27; -- &#x27;src/**/*.java&#x27; | stri</tspan><tspan x="24" dy="22">p
O=src/app-bootstrap/src/test/java/dev/caskeleton/adapter/outbound/OptionalAdapterBeanGatingTest.java
awk &#x27;NR&gt;=59 &amp;&amp; NR</tspan><tspan x="24" dy="22">&lt;=70 {printf &quot; test · OptionalAdapterBeanGatingTest.java:%d %s\n&quot;, NR, $0}&#x27; $O
echo &quot; 두 시험이 컴포지션 루트를 쓰는</tspan><tspan x="24" dy="22">가 :&quot;
for f in src/adapter/outbound/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging/MessagingConfigTes</tspan><tspan x="24" dy="22">t.java $O; do
n=$(grep -c &#x27;CaSkeletonApplication&#x27; &quot;$f&quot; || true)
printf &quot; %-40s CaSkeletonApplication 언급 %s 건\n</tspan><tspan x="24" dy="22">&quot; &quot;$(basename $f)&quot; &quot;${n:-0}&quot;
done
echo &quot; KafkaSenderConfig 가 그 슬라이스에 등록되는가 :&quot;
for f in src/adapter/outbound</tspan><tspan x="24" dy="22">/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging/MessagingConfigTest.java $O; do
n=$(grep -c &#x27;KafkaS</tspan><tspan x="24" dy="22">enderConfig&#x27; &quot;$f&quot; || true)
printf &quot; %-40s KafkaSenderConfig 언급 %s 건\n&quot; &quot;$(basename $f)&quot; &quot;${n:-0}&quot;
done
echo
ech</tspan><tspan x="24" dy="22">o &quot;# 이 조합을 거르는 검증기가 있는가&quot;
V=$(find src -name CapabilityDependencyValidator.java -path &#x27;*/main/*&#x27;)
awk &#x27;NR&gt;=</tspan><tspan x="24" dy="22">64 &amp;&amp; NR&lt;=80 {printf &quot; CapabilityDependencyValidator.java:%d %s\n&quot;, NR, $0}&#x27; $V
echo
echo &quot;# 운영 문서가 이 키를 무엇</tspan><tspan x="24" dy="22">이라고 설명하는가&quot;
awk &#x27;NR&gt;=26 &amp;&amp; NR&lt;=32 {printf &quot; docs/runbooks/outbox-publish-failed.md:%d %s\n&quot;, NR, $0}&#x27; docs/runbo</tspan><tspan x="24" dy="22">oks/outbox-publish-failed.md
echo
echo &quot;# 출하 설정이 두 키를 어떻게 주는가&quot;
grep -n &#x27;APP_MESSAGING_ENABLED\|APP_MESSAG</tspan><tspan x="24" dy="22">ING_BROKER&#x27; src/config/runtime/compose-profile-contracts.json | head -8 | sed &#x27;s#^# compose-profile-contracts.json:#&#x27;
f</tspan><tspan x="24" dy="22">or f in src/.env src/.env.example src/.env.local.example; do
[ -f &quot;$f&quot; ] &amp;&amp; grep -n &#x27;APP_MESSAGING_BROKER\|APP_MESSAGI</tspan><tspan x="24" dy="22">NG_ENABLED&#x27; &quot;$f&quot; | sed &quot;s#^# $(basename $f):#&quot;
done
echo
echo &quot;# KafkaSenderConfig 가 조건에서 물러나는가&quot;
awk &#x27;NR&gt;=60</tspan><tspan x="24" dy="22"> &amp;&amp; NR&lt;=65 {printf &quot; KafkaSenderConfig.java:%d %s\n&quot;, NR, $0}&#x27; $B/messaging/KafkaSenderConfig.java
echo
echo &quot;# 이음매</tspan><tspan x="24" dy="22"> 설정 클래스 자신은 스캔 대상인가&quot;
head -1 $B/messaging/KafkaSenderConfig.java | sed &#x27;s#^# KafkaSenderConfig.java:1 #&#x27;</tspan><tspan x="24" dy="22">
n=$(grep -c &#x27;bootstrap\\.messaging&#x27; $B/CaSkeletonApplication.java || true)
echo &quot; AUTO_CONFIGURED_PACKAGES 가 bootstra</tspan><tspan x="24" dy="22">p.messaging 을 제외하는가 : ${n:-0} 건&quot;
echo
echo &quot;# 이음매 쪽 생산자가 요구하는 설정 빈은 어디서 오는가&quot;
git grep -n &#x27;</tspan><tspan x="24" dy="22">EnableConfigurationProperties(KafkaAdapterSettings.class)&#x27; -- &#x27;src/**/*.java&#x27; | strip
git grep -n &#x27;Import({MessagingConf</tspan><tspan x="24" dy="22">ig.class, KafkaAdapterConfig.class})\|prefix = &quot;app.messaging&quot;, name = &quot;enabled&quot;&#x27; -- &#x27;src/**/*.java&#x27; | strip
echo
echo </tspan><tspan x="24" dy="22">&quot;# 그 설정 클래스가 컴포넌트 스캔으로 들어올 수 있는가&quot;
awk &#x27;NR&gt;=41 &amp;&amp; NR&lt;=57 {printf &quot; CaSkeletonApplication.java:%d %</tspan><tspan x="24" dy="22">s\n&quot;, NR, $0}&#x27; $B/CaSkeletonApplication.java
awk &#x27;NR&gt;=100 &amp;&amp; NR&lt;=101 {printf &quot; CaSkeletonApplication.java:%d %s\n&quot;, NR,</tspan><tspan x="24" dy="22"> $0}&#x27; $B/CaSkeletonApplication.java
grep -n &#x27;adapter\\\\.outbound\\\\.messaging&#x27; $B/CaSkeletonApplication.java | sed -E </tspan><tspan x="24" dy="22">&#x27;s#^([0-9]+): *# CaSkeletonApplication.java:\1 #&#x27;
echo &quot; ConfigurationPropertiesScan 목록에 adapter.outbound.messagin</tspan><tspan x="24" dy="22">g 이 있는가 :&quot;
n=$(awk &#x27;NR&gt;=58 &amp;&amp; NR&lt;=82&#x27; $B/CaSkeletonApplication.java | grep -c &#x27;adapter.outbound.messaging&#x27; || true)
</tspan><tspan x="24" dy="22">echo &quot; $n 건&quot;
echo
echo &quot;# broker=kafka 를 쓰는 시험마다 같은 파일이 enabled 를 주는가&quot;
for f in $(git grep -l &#x27;app.</tspan><tspan x="24" dy="22">messaging.broker=kafka&#x27; -- &#x27;src/**/*.java&#x27; | grep &#x27;/test/&#x27;); do
b=$(grep -c &#x27;app.messaging.broker=kafka&#x27; &quot;$f&quot; || true)</tspan><tspan x="24" dy="22">
e=$(grep -c &#x27;app.messaging.enabled=&#x27; &quot;$f&quot; || true)
printf &quot; %-46s broker=kafka %s 줄 · enabled= %s 줄\n&quot; &quot;$(basen</tspan><tspan x="24" dy="22">ame $f)&quot; &quot;$b&quot; &quot;$e&quot;
done
echo &quot; enabled 를 한 줄도 주지 않는 파일의 시험 이름 :&quot;
for f in $(git grep -l &#x27;app.messaging.b</tspan><tspan x="24" dy="22">roker=kafka&#x27; -- &#x27;src/**/*.java&#x27; | grep &#x27;/test/&#x27;); do
e=$(grep -c &#x27;app.messaging.enabled=&#x27; &quot;$f&quot; || true)
if [ &quot;$e&quot; = </tspan><tspan x="24" dy="22">&quot;0&quot; ]; then grep -n &#x27;void .*(&#x27; &quot;$f&quot; | sed -E &quot;s#^([0-9]+): *# $(basename $f):\1 #&quot;; fi
done
</tspan></text>
<text x="24" y="992" 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="1014" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">time: 2026-09-04T01:37:31+00:00 · exit 0</tspan></text>
<line x1="24" y1="1028" x2="1176" y2="1028" stroke="#30363d"/>
<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"> messaging/CLAUDE.md:70:## application이 이 family에 도달하는 경로 (MSG-015, 미해결)</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"> messaging/CLAUDE.md:82:이것이 리뷰의 **MSG-015 (P0)** 이며 닫히지 않았다. 지금 안전한 이유는 설계가 아니라 기본값이다 —</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"></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"># 두 스택의 설정 클래스와 생산자 빈</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"> bootstrap/messaging/KafkaSenderConfig.java:37 @Configuration(proxyBeanMethods = false)</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"> bootstrap/messaging/KafkaSenderConfig.java:38 @ConditionalOnProperty(name = &quot;app.messaging.broker&quot;, havingValue = &quot;kafka&quot;)</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"> bootstrap/messaging/KafkaSenderConfig.java:39 public class KafkaSenderConfig {</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"> bootstrap/messaging/KafkaSenderConfig.java:61 @Bean(name = &quot;kafkaSeamProducer&quot;, destroyMethod = &quot;close&quot;)</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"> bootstrap/messaging/KafkaSenderConfig.java:62 @ConditionalOnMissingBean(name = &quot;kafkaSeamProducer&quot;)</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"> bootstrap/messaging/KafkaSenderConfig.java:63 public Producer&lt;String, String&gt; kafkaSeamProducer(KafkaAdapterSettings setting</tspan><tspan x="24" dy="22">s) {</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"> autoconfigure/KafkaMessagingAutoConfiguration.java:126 * @return the producer, closed with the context</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"> autoconfigure/KafkaMessagingAutoConfiguration.java:127 */</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"> autoconfigure/KafkaMessagingAutoConfiguration.java:128 @Bean(destroyMethod = &quot;close&quot;)</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"> autoconfigure/KafkaMessagingAutoConfiguration.java:129 @ConditionalOnMissingBean</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"> autoconfigure/KafkaMessagingAutoConfiguration.java:130 public org.apache.kafka.clients.producer.Producer&lt;byte[], byte[]&gt; mes</tspan><tspan x="24" dy="22">sagingKafkaProducer(</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"> autoconfigure/KafkaMessagingAutoConfiguration.java:131 org.springframework.core.env.Environment environment) {</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"></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"># 플랫폼 쪽이 켜지는 사슬</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"> main · messaging/autoconfigure/MessagingPlatformRootAutoConfiguration.java:28 @ConditionalOnProperty(prefix = MessagingSettin</tspan><tspan x="24" dy="22">gs.PREFIX, name = &quot;enabled&quot;, havingValue = &quot;true&quot;)</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"> main · messaging/autoconfigure/MessagingProviderSelection.java:48 &quot;kafka&quot;, KafkaMessagingAutoConfiguration.class,</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"># broker 만 준 시험이 통과하는 이유 — 게이트 뒤 설정을 손으로 등록한다</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"> test · adapter/outbound/messaging/MessagingConfigTest.java:41 .withUserConfiguration(KafkaAdapterConfig.class)</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"> test · OptionalAdapterBeanGatingTest.java:59 private final ApplicationContextRunner runner =</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"> test · OptionalAdapterBeanGatingTest.java:60 new ApplicationContextRunner()</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"> test · OptionalAdapterBeanGatingTest.java:61 // Registered as a real auto-configuration entry, which is how the com</tspan><tspan x="24" dy="22">position root</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"> test · OptionalAdapterBeanGatingTest.java:62 // reaches it: the HTTP Client platform&#x27;s off state is a property of t</tspan><tspan x="24" dy="22">hat entry, not of a</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"> test · OptionalAdapterBeanGatingTest.java:63 // hand-assembled subset of its children.</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"> test · OptionalAdapterBeanGatingTest.java:64 .withConfiguration(AutoConfigurations.of(HttpClientPlatformAutoConfigu</tspan><tspan x="24" dy="22">ration.class))</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"> test · OptionalAdapterBeanGatingTest.java:65 .withUserConfiguration(</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"> test · OptionalAdapterBeanGatingTest.java:66 OutboundSupportConfig.class,</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"> test · OptionalAdapterBeanGatingTest.java:67 MessagingConfig.class,</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"> test · OptionalAdapterBeanGatingTest.java:68 KafkaAdapterConfig.class,</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"> test · OptionalAdapterBeanGatingTest.java:69 NotificationConfig.class,</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"> test · OptionalAdapterBeanGatingTest.java:70 SlackNotificationAdapterConfig.class,</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"> 두 시험이 컴포지션 루트를 쓰는가 :</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"> MessagingConfigTest.java CaSkeletonApplication 언급 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"> OptionalAdapterBeanGatingTest.java CaSkeletonApplication 언급 0 건</tspan></text>
<text x="24" y="2058" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaSenderConfig 가 그 슬라이스에 등록되는가 :</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"> MessagingConfigTest.java KafkaSenderConfig 언급 0 건</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"> OptionalAdapterBeanGatingTest.java KafkaSenderConfig 언급 0 건</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"></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"># 이 조합을 거르는 검증기가 있는가</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"> CapabilityDependencyValidator.java:64 }</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"> CapabilityDependencyValidator.java:65 if (relay &amp;&amp; !outbox) {</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"> CapabilityDependencyValidator.java:66 violations.add(</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"> CapabilityDependencyValidator.java:67 &quot;ca-skeleton.outbox.relay-enabled=true only starts the scheduler for a capabil</tspan><tspan x="24" dy="22">ity that is &quot;</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"> CapabilityDependencyValidator.java:68 + &quot;off; set ca-skeleton.outbox.enabled=true or turn the relay off.&quot;);</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"> CapabilityDependencyValidator.java:69 }</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"> CapabilityDependencyValidator.java:70 if (messaging &amp;&amp; broker.isEmpty()) {</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"> CapabilityDependencyValidator.java:71 violations.add(</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"> CapabilityDependencyValidator.java:72 &quot;app.messaging.enabled=true needs a transport; set app.messaging.broker to a r</tspan><tspan x="24" dy="22">egistered &quot;</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"> CapabilityDependencyValidator.java:73 + &quot;broker id.&quot;);</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"> CapabilityDependencyValidator.java:74 }</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"> CapabilityDependencyValidator.java:75 if (&quot;jdbc&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"> CapabilityDependencyValidator.java:76 .equalsIgnoreCase(</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"> CapabilityDependencyValidator.java:77 environment.getProperty(</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"> CapabilityDependencyValidator.java:78 &quot;ca-skeleton.capabilities.idempotency.provider&quot;, &quot;disabled&quot;))</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"> CapabilityDependencyValidator.java:79 &amp;&amp; !jpa) {</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"> CapabilityDependencyValidator.java:80 violations.add(</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"></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"> docs/runbooks/outbox-publish-failed.md:26 ### Step 1 — 확인</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"> docs/runbooks/outbox-publish-failed.md:27 1. ERROR log에서 `OUTBOX_PUBLISH_FAILED` 라인 확인: `event_type`, `event_id`, `corre</tspan><tspan x="24" dy="22">lation_id`, `attempt_count` 추출</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"> docs/runbooks/outbox-publish-failed.md:28 2. broker 상태 확인: `APP_MESSAGING_BROKER` 값과 broker endpoint 가용성. 이 키는 활</tspan><tspan x="24" dy="22">성화 스위치가</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"> docs/runbooks/outbox-publish-failed.md:29 아니라 **선택자**다 — messaging을 끄는 것은 `APP_MESSAGING_ENABLED=false`이고, </tspan><tspan x="24" dy="22">이 값을 비운다고</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"> docs/runbooks/outbox-publish-failed.md:30 messaging이 꺼지지는 않는다.</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"> docs/runbooks/outbox-publish-failed.md:31 - `APP_MESSAGING_BROKER`가 공백인 채로 relay가 켜져 있으면 **애플리케이션이 기동</tspan><tspan x="24" dy="22">하지 않는다**</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"> docs/runbooks/outbox-publish-failed.md:32 (`OutboxRelayBrokerRequirementValidator`, MSG-024). 이 조합에서는 publish가 전</tspan><tspan x="24" dy="22"></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"></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"> compose-profile-contracts.json:170: &quot;APP_MESSAGING_ENABLED&quot;: &quot;true&quot;,</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"> compose-profile-contracts.json:171: &quot;APP_MESSAGING_BROKER&quot;: &quot;kafka&quot;,</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"> compose-profile-contracts.json:202: &quot;APP_MESSAGING_ENABLED&quot;: &quot;true&quot;,</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"> compose-profile-contracts.json:203: &quot;APP_MESSAGING_BROKER&quot;: &quot;kafka&quot;,</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"> compose-profile-contracts.json:604: &quot;APP_MESSAGING_ENABLED&quot;: &quot;true&quot;,</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"> compose-profile-contracts.json:605: &quot;APP_MESSAGING_BROKER&quot;: &quot;kafka&quot;,</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"> .env:38:APP_MESSAGING_BROKER=</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"> .env.example:229:APP_MESSAGING_BROKER=</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"> .env.example:299:APP_MESSAGING_ENABLED=false</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"> .env.local.example:20:APP_MESSAGING_ENABLED=false</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"> .env.local.example:21:APP_MESSAGING_BROKER=</tspan></text>
<text x="24" y="3180" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="3202" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># KafkaSenderConfig 가 조건에서 물러나는가</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"> KafkaSenderConfig.java:60 */</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"> KafkaSenderConfig.java:61 @Bean(name = &quot;kafkaSeamProducer&quot;, destroyMethod = &quot;close&quot;)</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"> KafkaSenderConfig.java:62 @ConditionalOnMissingBean(name = &quot;kafkaSeamProducer&quot;)</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"> KafkaSenderConfig.java:63 public Producer&lt;String, String&gt; kafkaSeamProducer(KafkaAdapterSettings settings) {</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"> KafkaSenderConfig.java:64 Map&lt;String, Object&gt; config = new HashMap&lt;&gt;();</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"> KafkaSenderConfig.java:65 config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, String.join(&quot;,&quot;, settings.brokers()));</tspan></text>
<text x="24" y="3356" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="3378" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 이음매 설정 클래스 자신은 스캔 대상인가</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"> KafkaSenderConfig.java:1 package dev.caskeleton.bootstrap.messaging;</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"> AUTO_CONFIGURED_PACKAGES 가 bootstrap.messaging 을 제외하는가 : 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"></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"> main · adapter/outbound/messaging/kafka/KafkaAdapterConfig.java:19 @EnableConfigurationProperties(KafkaAdapterSettings.class)</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"> main · adapter/outbound/messaging/autoconfigure/MessagingBridgeRootAutoConfiguration.java:21 @ConditionalOnProperty(prefix = </tspan><tspan x="24" dy="22">&quot;app.messaging&quot;, name = &quot;enabled&quot;, havingValue = &quot;true&quot;)</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"> main · adapter/outbound/messaging/autoconfigure/MessagingBridgeRootAutoConfiguration.java:23 @Import({MessagingConfig.class, </tspan><tspan x="24" dy="22">KafkaAdapterConfig.class})</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"># 그 설정 클래스가 컴포넌트 스캔으로 들어올 수 있는가</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"> CaSkeletonApplication.java:41 @ComponentScan(</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"> CaSkeletonApplication.java:42 basePackages = {</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"> CaSkeletonApplication.java:43 &quot;dev.caskeleton.bootstrap&quot;,</tspan></text>
<text x="24" y="3708" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CaSkeletonApplication.java:44 &quot;dev.caskeleton.adapter&quot;,</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"> CaSkeletonApplication.java:45 &quot;dev.caskeleton.application&quot;,</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"> CaSkeletonApplication.java:46 &quot;dev.caskeleton.domain&quot;,</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"> CaSkeletonApplication.java:47 &quot;dev.caskeleton.shared&quot;</tspan></text>
<text x="24" y="3796" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CaSkeletonApplication.java:48 },</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"> CaSkeletonApplication.java:49 excludeFilters = {</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"> CaSkeletonApplication.java:50 @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),</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"> CaSkeletonApplication.java:51 @ComponentScan.Filter(</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"> CaSkeletonApplication.java:52 type = FilterType.CUSTOM,</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"> CaSkeletonApplication.java:53 classes = AutoConfigurationExcludeFilter.class),</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"> CaSkeletonApplication.java:54 @ComponentScan.Filter(</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"> CaSkeletonApplication.java:55 type = FilterType.REGEX,</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"> CaSkeletonApplication.java:56 pattern = CaSkeletonApplication.AUTO_CONFIGURED_PACKAGES)</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"> CaSkeletonApplication.java:57 })</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"> CaSkeletonApplication.java:100 static final String AUTO_CONFIGURED_PACKAGES =</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"> CaSkeletonApplication.java:101 &quot;dev\\.caskeleton\\.bootstrap\\.autoconfigure\\..*&quot;</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"> CaSkeletonApplication.java:105 + &quot;|dev\\.caskeleton\\.adapter\\.outbound\\.messaging\\..*&quot;</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"> ConfigurationPropertiesScan 목록에 adapter.outbound.messaging 이 있는가 :</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"> 0 건</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"></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"># broker=kafka 를 쓰는 시험마다 같은 파일이 enabled 를 주는가</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"> MessagingConfigTest.java broker=kafka 3 줄 · enabled= 0 줄</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"> OptionalAdapterBeanGatingTest.java broker=kafka 1 줄 · enabled= 0 줄</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"> MessagingLiveRoundTripQualificationTest.java broker=kafka 1 줄 · enabled= 1 줄</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"> MessagingStarterOffContractTest.java broker=kafka 3 줄 · enabled= 7 줄</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"> enabled 를 한 줄도 주지 않는 파일의 시험 이름 :</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"> MessagingConfigTest.java:25 void blankBrokerBindsDisabledSentinelsCharacterization() {</tspan></text>
<text x="24" y="4302" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingConfigTest.java:39 void selectedKafkaBrokerWithoutProjectSenderFailsStartupCharacterization() {</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"> MessagingConfigTest.java:54 void selectedBrokerIdMismatchFailsStartupCharacterization() {</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"> MessagingConfigTest.java:76 public void send(</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"> OptionalAdapterBeanGatingTest.java:77 void allOptionalAdaptersAreDisabledByDefaultAndTheAppStillStarts() {</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"> OptionalAdapterBeanGatingTest.java:114 void kafkaSelectedRegistersTheBrokerAndBindsTheRealPublishers() {</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"> OptionalAdapterBeanGatingTest.java:135 void slackWebhookEnabledContributesTheProviderAndRoutesBoundNotifications() {</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"> OptionalAdapterBeanGatingTest.java:153 void googleEmailEnabledContributesTheProviderAndRoutesBoundNotifications() {</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"> OptionalAdapterBeanGatingTest.java:170 void aRouteBindingToADisabledProviderFailsStartup() {</tspan></text>
</svg>