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>
149 lines
25 KiB
XML
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 's# in [0-9hms ]+$##'; }
|
|
|
|
echo "# 가</tspan><tspan x="24" dy="22">족 지침이 이 계약의 주인으로 지목한 것"
|
|
awk 'NR>=36 && NR<=44 {printf " src/messaging/CLAUDE.md:%d %s\n", NR, $0}' src/</tspan><tspan x="24" dy="22">messaging/CLAUDE.md
|
|
|
|
echo
|
|
echo "# 그 시험 클래스가 놓인 트리"
|
|
git grep -l 'class MessagingPublicSurfaceContractTest' -- </tspan><tspan x="24" dy="22">'src/**/*.java' | sed 's#^# #'
|
|
F=src/app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/messaging/MessagingP</tspan><tspan x="24" dy="22">ublicSurfaceContractTest.java
|
|
echo " src/messaging 아래 동명 파일 : $(find src/messaging -name 'MessagingPublicSurfac</tspan><tspan x="24" dy="22">eContractTest.java' | wc -l) 개"
|
|
echo " 가족 test 트리 : $(ls -d src/messaging/*/src/test 2>/dev/null | wc -l) 개 · </tspan><tspan x="24" dy="22">이 파일의 트리 : src/app-bootstrap/src/test"
|
|
echo " 이 파일의 @Test $(grep -c '@Test' $F) · @Tag $(grep -c '@Tag' $F</tspan><tspan x="24" dy="22">) · @Disabled $(grep -c '@Disabled' $F)"
|
|
grep -n 'void .*(' $F | sed -E 's#^([0-9]+): *# :\1 #'
|
|
|
|
echo
|
|
echo "# 가족 </tspan><tspan x="24" dy="22">경로에서 도는 워크플로의 트리거 전부와 실행 명령"
|
|
W=.github/workflows/messaging-certification.yml
|
|
awk 'NR>=15 && NR<=22 </tspan><tspan x="24" dy="22">{printf " messaging-certification.yml:%d %s\n", NR, $0}' $W
|
|
grep -n 'gradlew' $W | sed -E 's#^([0-9]+): *# messaging-c</tspan><tspan x="24" dy="22">ertification.yml:\1 #'
|
|
|
|
echo
|
|
echo "# 경로 필터가 없는 워크플로"
|
|
awk 'NR>=1 && NR<=9 {printf " ci-quality-gates.yml:%d </tspan><tspan x="24" dy="22">%s\n", NR, $0}' .github/workflows/ci-quality-gates.yml
|
|
echo " on 블록(1-9)의 paths 필터 : $(awk 'NR<=9' .github/workf</tspan><tspan x="24" dy="22">lows/ci-quality-gates.yml | grep -c 'paths') 건"
|
|
awk 'NR>=19 && NR<=22 {printf " ci-quality-gates.yml:%d %s\n", NR, $0}</tspan><tspan x="24" dy="22">' .github/workflows/ci-quality-gates.yml
|
|
awk 'NR>=48 && NR<=55 {printf " ci-quality-gates.yml:%d %s\n", NR, $0}' .githu</tspan><tspan x="24" dy="22">b/workflows/ci-quality-gates.yml
|
|
|
|
echo
|
|
echo "# check 가 정말 이 프로젝트의 test 를 포함하는가"
|
|
cd src
|
|
echo " \$ ./gradl</tspan><tspan x="24" dy="22">ew :app-bootstrap:check --dry-run"
|
|
timeout 900 ./gradlew --offline --no-daemon :app-bootstrap:check --dry-run 2>/dev/nul</tspan><tspan x="24" dy="22">l \
|
|
| grep -E '^:app-bootstrap:(test|functionalTest|check) ' | sed 's#^# #'
|
|
echo " 루트 test 규약이 거는 유일한 필</tspan><tspan x="24" dy="22">터 :"
|
|
awk 'NR>=549 && NR<=553 {printf " src/build.gradle:%d %s\n", NR, $0}' build.gradle
|
|
|
|
echo
|
|
echo "# 이름으로 골라 </tspan><tspan x="24" dy="22">실제로 돌리면"
|
|
timeout 900 ./gradlew --offline --no-daemon :app-bootstrap:test \
|
|
--tests 'dev.caskeleton.bootstrap.con</tspan><tspan x="24" dy="22">tract.messaging.MessagingPublicSurfaceContractTest' > /tmp/t1.out 2>&1
|
|
echo " \$ ./gradlew :app-bootstrap:test --tests </tspan><tspan x="24" dy="22">'...MessagingPublicSurfaceContractTest'"
|
|
grep -E 'BUILD (SUCCESSFUL|FAILED)' /tmp/t1.out | nt | sed 's#^# #'
|
|
python3 </tspan><tspan x="24" dy="22">-c "
|
|
import glob, xml.etree.ElementTree as ET
|
|
for p in glob.glob('app-bootstrap/build/test-results/test/TEST-*MessagingP</tspan><tspan x="24" dy="22">ublicSurfaceContractTest.xml'):
|
|
r = ET.parse(p).getroot()
|
|
print(f\" 결과 디렉터리 test/ · {r.get('name').spl</tspan><tspan x="24" dy="22">it('.')[-1]} tests={r.get('tests')} failures={r.get('failures')} skipped={r.get('skipped')}\")
|
|
"
|
|
|
|
echo
|
|
echo "# 가족 태스</tspan><tspan x="24" dy="22">크로 같은 이름을 고르면"
|
|
timeout 900 ./gradlew --offline --no-daemon :messaging:messaging-kafka:test \
|
|
--tests 'dev.ca</tspan><tspan x="24" dy="22">skeleton.bootstrap.contract.messaging.MessagingPublicSurfaceContractTest' > /tmp/t2.out 2>&1
|
|
echo " \$ ./gradlew :messa</tspan><tspan x="24" dy="22">ging:messaging-kafka:test --tests '...MessagingPublicSurfaceContractTest'"
|
|
grep -E 'No tests found|BUILD (SUCCESSFUL|FAI</tspan><tspan x="24" dy="22">LED)' /tmp/t2.out | nt | head -2 | sed 's#^# #'
|
|
</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 - "src/messaging/**"</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 - ".github/workflows/messaging-certification.yml"</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: "41 4 * * 3"</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: ["main"]</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'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('test') {</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 'quarantine'</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 '...MessagingPublicSurfaceContractTest'</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 '...MessagingPublicSurfaceContractTest'</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"> > 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>
|