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

149 lines
25 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="2526" viewBox="0 0 1200 2526" 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="2524" rx="14" fill="#0d1117" stroke="#30363d"/>
<rect x="1" y="1" width="1198" height="44" rx="14" fill="#161b22"/>
<rect x="1" y="30" width="1198" height="14" fill="#161b22"/>
<circle cx="24" cy="22" r="6" fill="#ff5f57"/>
<circle cx="44" cy="22" r="6" fill="#febc2e"/>
<circle cx="64" cy="22" r="6" fill="#28c840"/>
<text x="92" y="27" fill="#8b949e" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">terminal evidence</text>
<text x="24" y="68" fill="#c9d1d9" font-size="15" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">$ #!/bin/bash
cd /shared/codebase/clean-architecture-backend-template
nt() { sed -E &#x27;s# in [0-9hms ]+$##&#x27;; }
echo &quot;# 가</tspan><tspan x="24" dy="22">족 지침이 이 계약의 주인으로 지목한 것&quot;
awk &#x27;NR&gt;=36 &amp;&amp; NR&lt;=44 {printf &quot; src/messaging/CLAUDE.md:%d %s\n&quot;, NR, $0}&#x27; src/</tspan><tspan x="24" dy="22">messaging/CLAUDE.md
echo
echo &quot;# 그 시험 클래스가 놓인 트리&quot;
git grep -l &#x27;class MessagingPublicSurfaceContractTest&#x27; -- </tspan><tspan x="24" dy="22">&#x27;src/**/*.java&#x27; | sed &#x27;s#^# #&#x27;
F=src/app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/messaging/MessagingP</tspan><tspan x="24" dy="22">ublicSurfaceContractTest.java
echo &quot; src/messaging 아래 동명 파일 : $(find src/messaging -name &#x27;MessagingPublicSurfac</tspan><tspan x="24" dy="22">eContractTest.java&#x27; | wc -l) 개&quot;
echo &quot; 가족 test 트리 : $(ls -d src/messaging/*/src/test 2&gt;/dev/null | wc -l) 개 · </tspan><tspan x="24" dy="22">이 파일의 트리 : src/app-bootstrap/src/test&quot;
echo &quot; 이 파일의 @Test $(grep -c &#x27;@Test&#x27; $F) · @Tag $(grep -c &#x27;@Tag&#x27; $F</tspan><tspan x="24" dy="22">) · @Disabled $(grep -c &#x27;@Disabled&#x27; $F)&quot;
grep -n &#x27;void .*(&#x27; $F | sed -E &#x27;s#^([0-9]+): *# :\1 #&#x27;
echo
echo &quot;# 가족 </tspan><tspan x="24" dy="22">경로에서 도는 워크플로의 트리거 전부와 실행 명령&quot;
W=.github/workflows/messaging-certification.yml
awk &#x27;NR&gt;=15 &amp;&amp; NR&lt;=22 </tspan><tspan x="24" dy="22">{printf &quot; messaging-certification.yml:%d %s\n&quot;, NR, $0}&#x27; $W
grep -n &#x27;gradlew&#x27; $W | sed -E &#x27;s#^([0-9]+): *# messaging-c</tspan><tspan x="24" dy="22">ertification.yml:\1 #&#x27;
echo
echo &quot;# 경로 필터가 없는 워크플로&quot;
awk &#x27;NR&gt;=1 &amp;&amp; NR&lt;=9 {printf &quot; ci-quality-gates.yml:%d </tspan><tspan x="24" dy="22">%s\n&quot;, NR, $0}&#x27; .github/workflows/ci-quality-gates.yml
echo &quot; on 블록(1-9)의 paths 필터 : $(awk &#x27;NR&lt;=9&#x27; .github/workf</tspan><tspan x="24" dy="22">lows/ci-quality-gates.yml | grep -c &#x27;paths&#x27;) 건&quot;
awk &#x27;NR&gt;=19 &amp;&amp; NR&lt;=22 {printf &quot; ci-quality-gates.yml:%d %s\n&quot;, NR, $0}</tspan><tspan x="24" dy="22">&#x27; .github/workflows/ci-quality-gates.yml
awk &#x27;NR&gt;=48 &amp;&amp; NR&lt;=55 {printf &quot; ci-quality-gates.yml:%d %s\n&quot;, NR, $0}&#x27; .githu</tspan><tspan x="24" dy="22">b/workflows/ci-quality-gates.yml
echo
echo &quot;# check 가 정말 이 프로젝트의 test 를 포함하는가&quot;
cd src
echo &quot; \$ ./gradl</tspan><tspan x="24" dy="22">ew :app-bootstrap:check --dry-run&quot;
timeout 900 ./gradlew --offline --no-daemon :app-bootstrap:check --dry-run 2&gt;/dev/nul</tspan><tspan x="24" dy="22">l \
| grep -E &#x27;^:app-bootstrap:(test|functionalTest|check) &#x27; | sed &#x27;s#^# #&#x27;
echo &quot; 루트 test 규약이 거는 유일한 필</tspan><tspan x="24" dy="22">터 :&quot;
awk &#x27;NR&gt;=549 &amp;&amp; NR&lt;=553 {printf &quot; src/build.gradle:%d %s\n&quot;, NR, $0}&#x27; build.gradle
echo
echo &quot;# 이름으로 골라 </tspan><tspan x="24" dy="22">실제로 돌리면&quot;
timeout 900 ./gradlew --offline --no-daemon :app-bootstrap:test \
--tests &#x27;dev.caskeleton.bootstrap.con</tspan><tspan x="24" dy="22">tract.messaging.MessagingPublicSurfaceContractTest&#x27; &gt; /tmp/t1.out 2&gt;&amp;1
echo &quot; \$ ./gradlew :app-bootstrap:test --tests </tspan><tspan x="24" dy="22">&#x27;...MessagingPublicSurfaceContractTest&#x27;&quot;
grep -E &#x27;BUILD (SUCCESSFUL|FAILED)&#x27; /tmp/t1.out | nt | sed &#x27;s#^# #&#x27;
python3 </tspan><tspan x="24" dy="22">-c &quot;
import glob, xml.etree.ElementTree as ET
for p in glob.glob(&#x27;app-bootstrap/build/test-results/test/TEST-*MessagingP</tspan><tspan x="24" dy="22">ublicSurfaceContractTest.xml&#x27;):
r = ET.parse(p).getroot()
print(f\&quot; 결과 디렉터리 test/ · {r.get(&#x27;name&#x27;).spl</tspan><tspan x="24" dy="22">it(&#x27;.&#x27;)[-1]} tests={r.get(&#x27;tests&#x27;)} failures={r.get(&#x27;failures&#x27;)} skipped={r.get(&#x27;skipped&#x27;)}\&quot;)
&quot;
echo
echo &quot;# 가족 태스</tspan><tspan x="24" dy="22">크로 같은 이름을 고르면&quot;
timeout 900 ./gradlew --offline --no-daemon :messaging:messaging-kafka:test \
--tests &#x27;dev.ca</tspan><tspan x="24" dy="22">skeleton.bootstrap.contract.messaging.MessagingPublicSurfaceContractTest&#x27; &gt; /tmp/t2.out 2&gt;&amp;1
echo &quot; \$ ./gradlew :messa</tspan><tspan x="24" dy="22">ging:messaging-kafka:test --tests &#x27;...MessagingPublicSurfaceContractTest&#x27;&quot;
grep -E &#x27;No tests found|BUILD (SUCCESSFUL|FAI</tspan><tspan x="24" dy="22">LED)&#x27; /tmp/t2.out | nt | head -2 | sed &#x27;s#^# #&#x27;
</tspan></text>
<text x="24" y="684" 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="706" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">time: 2026-09-04T02:02:28+00:00 · exit 0</tspan></text>
<line x1="24" y1="720" x2="1176" y2="720" stroke="#30363d"/>
<text x="24" y="760" 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="782" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/messaging/CLAUDE.md:36 - 반대로 **노출하지 않는 것은 `implementation`으로 낮춘다.** starter가 노출하지 않는 하위 모듈을</tspan></text>
<text x="24" y="804" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/messaging/CLAUDE.md:37 `implementation`으로 내린 것이, JSON codec이 `ObjectMapper`를 private으로만 쓰고 Jackson을</tspan></text>
<text x="24" y="826" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/messaging/CLAUDE.md:38 `implementation`으로 둔 것이 그 예다.</tspan></text>
<text x="24" y="848" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/messaging/CLAUDE.md:39 - 이 규칙은 문서가 아니라 `MessagingPublicSurfaceContractTest`가 붙들고 있다. leaf의 production</tspan></text>
<text x="24" y="870" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/messaging/CLAUDE.md:40 source에서 public/protected 시그니처에 등장하는 vendor 라이브러리를 뽑아 그 leaf의</tspan></text>
<text x="24" y="892" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/messaging/CLAUDE.md:41 `build.gradle`이 `api`로 선언했는지 대조하고, starter의 `api` closure에 broker client 두 개가</tspan></text>
<text x="24" y="914" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/messaging/CLAUDE.md:42 들어오지 않는 것도 함께 본다. Spring Framework/Boot는 대상이 아니다 — 조립 경계 안에서만</tspan></text>
<text x="24" y="936" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/messaging/CLAUDE.md:43 등장하고 adopter가 이름 부를 일이 없다.</tspan></text>
<text x="24" y="958" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> src/messaging/CLAUDE.md:44 - 새 public 타입은 그 모듈의 계약이다. 삭제·시그니처 변경은 breaking change로 취급한다.</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"></tspan></text>
<text x="24" y="1002" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 시험 클래스가 놓인 트리</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"> src/app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/messaging/MessagingPublicSurfaceContractTest.java</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"> src/messaging 아래 동명 파일 : 0 개</tspan></text>
<text x="24" y="1068" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 가족 test 트리 : 24 개 · 이 파일의 트리 : src/app-bootstrap/src/test</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"> 이 파일의 @Test 3 · @Tag 0 · @Disabled 0</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"> :73 void vendorTypesInPublicSignaturesAreDeclaredApi() {</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"> :94 void theScanIsNotVacuous() {</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"> :114 void neitherBrokerSdkReachesAnAdoptersCompileClasspath() {</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"></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"># 가족 경로에서 도는 워크플로의 트리거 전부와 실행 명령</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"> messaging-certification.yml:15 on:</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"> messaging-certification.yml:16 pull_request:</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"> messaging-certification.yml:17 paths:</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"> messaging-certification.yml:18 - &quot;src/messaging/**&quot;</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"> messaging-certification.yml:19 - &quot;.github/workflows/messaging-certification.yml&quot;</tspan></text>
<text x="24" y="1332" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging-certification.yml:20 schedule:</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"> messaging-certification.yml:21 - cron: &quot;41 4 * * 3&quot;</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"> messaging-certification.yml:22 workflow_dispatch:</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"> messaging-certification.yml:52 run: ./gradlew :messaging:messaging-kafka:verifyMessagingCertificationEvidence --no-daemon --s</tspan><tspan x="24" dy="22">tacktrace</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"> ci-quality-gates.yml:1 name: ci-quality-gates</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"> ci-quality-gates.yml:2 </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"> ci-quality-gates.yml:3 on:</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"> ci-quality-gates.yml:4 pull_request:</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"> ci-quality-gates.yml:5 push:</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"> ci-quality-gates.yml:6 branches: [&quot;main&quot;]</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"> ci-quality-gates.yml:7 workflow_dispatch:</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"> ci-quality-gates.yml:8 </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"> ci-quality-gates.yml:9 permissions:</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"> on 블록(1-9)의 paths 필터 : 0 건</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"> ci-quality-gates.yml:19 jobs:</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"> ci-quality-gates.yml:20 quality-gates:</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"> ci-quality-gates.yml:21 runs-on: ubuntu-latest</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"> ci-quality-gates.yml:22 steps:</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"> ci-quality-gates.yml:48 - name: Check quality, public paths, and dependency locks</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"> ci-quality-gates.yml:49 working-directory: src</tspan></text>
<text x="24" y="1838" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ci-quality-gates.yml:50 run: ./gradlew check verifyPublicPathSnapshot verifyDependencyLocks --warning-mode=fail --no-d</tspan><tspan x="24" dy="22">aemon --stacktrace</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"> ci-quality-gates.yml:51 # Named as its own step because nothing else runs it: `check` does not depend on</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"> ci-quality-gates.yml:52 # graphqlStableTest, so the lane&#x27;s required-class guard — the check that its module-boundary</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"> ci-quality-gates.yml:53 # suite has not silently stopped being discovered — protected nothing in CI. A separate step</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"> ci-quality-gates.yml:54 # keeps the aggregate invocation below byte-identical, which ConditionalTransportQualification</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"> ci-quality-gates.yml:55 # ContractTest asserts on, and the two tasks do not overlap.</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"># check 가 정말 이 프로젝트의 test 를 포함하는가</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"> $ ./gradlew :app-bootstrap:check --dry-run</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"> :app-bootstrap:test SKIPPED</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"> :app-bootstrap:functionalTest SKIPPED</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"> :app-bootstrap:check SKIPPED</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"> 루트 test 규약이 거는 유일한 필터 :</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"> src/build.gradle:549 tasks.named(&#x27;test&#x27;) {</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"> src/build.gradle:550 useJUnitPlatform {</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"> src/build.gradle:551 excludeTags &#x27;quarantine&#x27;</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"> src/build.gradle:552 }</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"> src/build.gradle:553 }</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"></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"># 이름으로 골라 실제로 돌리면</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"> $ ./gradlew :app-bootstrap:test --tests &#x27;...MessagingPublicSurfaceContractTest&#x27;</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"> BUILD SUCCESSFUL</tspan></text>
<text x="24" y="2344" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 결과 디렉터리 test/ · MessagingPublicSurfaceContractTest tests=3 failures=0 skipped=0</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"></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"># 가족 태스크로 같은 이름을 고르면</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"> $ ./gradlew :messaging:messaging-kafka:test --tests &#x27;...MessagingPublicSurfaceContractTest&#x27;</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"> &gt; No tests found for given includes: [dev.caskeleton.bootstrap.contract.messaging.MessagingPublicSurfaceContractTest](--test</tspan><tspan x="24" dy="22">s filter)</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"> BUILD FAILED</tspan></text>
</svg>