Files
document-haness/docs/clean-architecture-backend-template/final/evidence/rendered/a20-f003-claude.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

252 lines
41 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="4198" viewBox="0 0 1200 4198" 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="4196" rx="14" fill="#0d1117" stroke="#30363d"/>
<rect x="1" y="1" width="1198" height="44" rx="14" fill="#161b22"/>
<rect x="1" y="30" width="1198" height="14" fill="#161b22"/>
<circle cx="24" cy="22" r="6" fill="#ff5f57"/>
<circle cx="44" cy="22" r="6" fill="#febc2e"/>
<circle cx="64" cy="22" r="6" fill="#28c840"/>
<text x="92" y="27" fill="#8b949e" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">terminal evidence</text>
<text x="24" y="68" fill="#c9d1d9" font-size="15" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">$ #!/bin/bash
set -o pipefail
cd /shared/codebase/clean-architecture-backend-template/src
R=grpc/grpc-testkit/build/test</tspan><tspan x="24" dy="22">-results
notime() { sed -E &#x27;s/ in [0-9]+m? ?[0-9.]*s$//&#x27;; }
xml() { python3 - &quot;$1&quot; &lt;&lt;&#x27;PY&#x27;
import sys, glob, xml.etree.El</tspan><tspan x="24" dy="22">ementTree as ET
d = sys.argv[1]
names = set()
for p in sorted(glob.glob(f&quot;{d}/TEST-*.xml&quot;)):
r = ET.parse(p).getroot</tspan><tspan x="24" dy="22">()
print(f&quot; {r.get(&#x27;name&#x27;).split(&#x27;.&#x27;)[-1]:36s} tests={r.get(&#x27;tests&#x27;)} failures={r.get(&#x27;failures&#x27;)} errors={r.get(</tspan><tspan x="24" dy="22">&#x27;errors&#x27;)} skipped={r.get(&#x27;skipped&#x27;)}&quot;)
for c in r.iter(&#x27;testcase&#x27;): names.add(c.get(&#x27;classname&#x27;) + &#x27;#&#x27; + c.get(&#x27;nam</tspan><tspan x="24" dy="22">e&#x27;))
open(&#x27;/tmp/names_&#x27; + d.split(&#x27;/&#x27;)[-1], &#x27;w&#x27;).write(&#x27;\n&#x27;.join(sorted(names)))
print(f&quot; 시험 {len(names)} 개&quot;)
PY
}</tspan><tspan x="24" dy="22">
echo &quot;# gradle 판&quot;
./gradlew --offline --no-daemon --version 2&gt;/dev/null | grep -E &#x27;^Gradle|^JVM&#x27; | sed &#x27;s#^# #&#x27;
ech</tspan><tspan x="24" dy="22">o
echo &quot;# grpc-testkit 이 등록하는 레인 넷과 각각의 태그&quot;
grep -n &quot;lane(&#x27;\|tag = &quot; grpc/grpc-testkit/build.gradle | sed </tspan><tspan x="24" dy="22">-E &#x27;s#^([0-9]+): *# grpc-testkit/build.gradle:\1 #&#x27;
echo
echo &quot;# 기본 test 에 실제로 걸리는 제외 태그는 두 곳에서 온</tspan><tspan x="24" dy="22">&quot;
grep -n &#x27;excludeTags&#x27; build.gradle grpc/grpc-testkit/build.gradle | sed &#x27;s#^# #&#x27;
awk &#x27;NR&gt;=37 &amp;&amp; NR&lt;=44 {printf &quot; g</tspan><tspan x="24" dy="22">rpc-testkit/build.gradle:%d %s\n&quot;, NR, $0}&#x27; grpc/grpc-testkit/build.gradle
echo &quot; grpc-testkit 안의 quarantine 태그 : $</tspan><tspan x="24" dy="22">(grep -rc &#x27;quarantine&#x27; grpc/grpc-testkit/src/test --include=*.java 2&gt;/dev/null | awk -F: &#x27;{s+=$2} END{print s+0}&#x27;) 건&quot;
</tspan><tspan x="24" dy="22">echo
echo &quot;# 레인 태그는 클래스 단위인가&quot;
grep -rn -A1 &#x27;@Tag&#x27; grpc/grpc-testkit/src/test/java --include=*.java \
| gre</tspan><tspan x="24" dy="22">p -E &#x27;@Tag|class &#x27; | sed &#x27;s#.*/java/dev/caskeleton/grpc/##;s#^# #&#x27;
echo
echo &quot;# check 의 태스크 그래프 — 시험을 돌</tspan><tspan x="24" dy="22">리지 않고 확인한다&quot;
timeout 900 ./gradlew --offline --no-daemon :grpc:grpc-testkit:check --dry-run &gt; /tmp/dry.out 2&gt;&amp;1; </tspan><tspan x="24" dy="22">D=$?
echo &quot; \$ ./gradlew :grpc:grpc-testkit:check --dry-run GRADLE_EXIT=$D&quot;
grep &#x27;:grpc:grpc-testkit:&#x27; /tmp/dry.out</tspan><tspan x="24" dy="22"> | sed &#x27;s#^# #&#x27;
echo &quot; 그 그래프 안의 레인 태스크 : $(grep -cE &#x27;:grpc:grpc-testkit:(grpcInProcess|grpcNetty|grpcFa</tspan><tspan x="24" dy="22">ult|grpcPerformance)&#x27; /tmp/dry.out) 건&quot;
echo
echo &quot;# 낡은 결과를 지우고 세 레인을 이름으로 돌린다&quot;
rm -rf $R/grpcInProc</tspan><tspan x="24" dy="22">essContractTest $R/grpcNettyContractTest $R/grpcFaultTest $R/test
echo &quot; 실행 전 남아 있는 결과 XML : $(find $R -maxdep</tspan><tspan x="24" dy="22">th 2 -name &#x27;TEST-*.xml&#x27; 2&gt;/dev/null | grep -E &#x27;/(grpcInProcessContractTest|grpcNettyContractTest|grpcFaultTest|test)/&#x27; |</tspan><tspan x="24" dy="22"> wc -l) 건&quot;
timeout 1800 ./gradlew --offline --no-daemon --rerun-tasks \
:grpc:grpc-testkit:grpcInProcessContractTest </tspan><tspan x="24" dy="22">\
:grpc:grpc-testkit:grpcNettyContractTest \
:grpc:grpc-testkit:grpcFaultTest &gt; /tmp/g1.out 2&gt;&amp;1; G1=$?
echo &quot; \$ .</tspan><tspan x="24" dy="22">/gradlew :grpc:grpc-testkit:{grpcInProcessContractTest,grpcNettyContractTest,grpcFaultTest}&quot;
grep -E &#x27;BUILD (SUCCESSFUL|</tspan><tspan x="24" dy="22">FAILED)&#x27; /tmp/g1.out | notime | sed &#x27;s#^# #&#x27;
echo &quot; GRADLE_EXIT=$G1&quot;
if [ $G1 -ne 0 ]; then
echo &quot; 레인 실행</tspan><tspan x="24" dy="22">이 실패했으므로 집계하지 않는다&quot;
sed -n &#x27;/^FAILURE:/,$p&#x27; /tmp/g1.out | head -12 | sed &#x27;s#^# #&#x27;
exit $G1
fi
for l </tspan><tspan x="24" dy="22">in grpcInProcessContractTest grpcNettyContractTest grpcFaultTest; do
echo &quot; [$l]&quot;; xml &quot;$R/$l&quot;
done
echo
echo &quot;# </tspan><tspan x="24" dy="22">같은 leaf 의 기본 test 를 돌린다&quot;
timeout 1800 ./gradlew --offline --no-daemon --rerun-tasks :grpc:grpc-testkit:test &gt; /</tspan><tspan x="24" dy="22">tmp/g2.out 2&gt;&amp;1; G2=$?
echo &quot; \$ ./gradlew :grpc:grpc-testkit:test&quot;
grep -E &#x27;BUILD (SUCCESSFUL|FAILED)&#x27; /tmp/g2.out | n</tspan><tspan x="24" dy="22">otime | sed &#x27;s#^# #&#x27;
echo &quot; GRADLE_EXIT=$G2&quot;
if [ $G2 -ne 0 ]; then
echo &quot; 기본 test 실행이 실패했으므로 집계</tspan><tspan x="24" dy="22">하지 않는다&quot;
sed -n &#x27;/^FAILURE:/,$p&#x27; /tmp/g2.out | head -12 | sed &#x27;s#^# #&#x27;
exit $G2
fi
xml &quot;$R/test&quot;
echo
echo &quot;</tspan><tspan x="24" dy="22"># 레인이 돌린 시험이 기본 test 가 돌린 시험의 부분집합인가&quot;
python3 - &lt;&lt;&#x27;PY&#x27;
lanes = set()
for l in (&quot;grpcInProcessContr</tspan><tspan x="24" dy="22">actTest&quot;, &quot;grpcNettyContractTest&quot;, &quot;grpcFaultTest&quot;):
lanes |= set(open(&#x27;/tmp/names_&#x27; + l).read().split(&#x27;\n&#x27;))
base =</tspan><tspan x="24" dy="22"> set(open(&#x27;/tmp/names_test&#x27;).read().split(&#x27;\n&#x27;))
print(f&quot; 레인 {len(lanes)} 개 · 기본 test {len(base)} 개&quot;)
print(f&quot;</tspan><tspan x="24" dy="22"> 레인이 돌린 시험이 기본 test 안에 전부 있는가 : {lanes &lt;= base}&quot;)
print(f&quot; 기본 test 에만 있는 시험 : {len(base -</tspan><tspan x="24" dy="22"> lanes)} 개&quot;)
PY
echo &quot; 성능 레인 클래스가 기본 test 결과에 있는가 : $(ls $R/test/TEST-*GrpcPerformanceLaneTest.xml 2</tspan><tspan x="24" dy="22">&gt;/dev/null | wc -l) 건&quot;
echo
echo &quot;# 레인 태스크만 거는 보증&quot;
G=build-logic/src/main/groovy/ca.strict-test-lane.gradle
</tspan><tspan x="24" dy="22">grep -n &#x27;failOnNoDiscoveredTests\|upToDateWhen\|executedTests\|executedSelectors\|excludes tests \*after\*\|refuses zero</tspan><tspan x="24" dy="22">\|throw new GradleException&#x27; $G \
| cut -c1-150 | sed -E &#x27;s#^([0-9]+): *# ca.strict-test-lane.gradle:\1 #&#x27;
echo
ech</tspan><tspan x="24" dy="22">o &quot;# 레인 태스크를 자동으로 부르는 경로&quot;
echo &quot; grpc-testkit/build.gradle 이 check 를 언급하는가 : $(grep -c &#x27;check&#x27; gr</tspan><tspan x="24" dy="22">pc/grpc-testkit/build.gradle) 건&quot;
echo &quot; 워크플로 $(ls ../.github/workflows/*.yml | wc -l) 개 중 grpc 를 언급하는 것 : </tspan><tspan x="24" dy="22">$(grep -rli &#x27;grpc&#x27; ../.github/workflows/ 2&gt;/dev/null | wc -l) 건&quot;
awk &#x27;NR&gt;=48 &amp;&amp; NR&lt;=61 {printf &quot; ci-quality-gates.yml:</tspan><tspan x="24" dy="22">%d %s\n&quot;, NR, $0}&#x27; ../.github/workflows/ci-quality-gates.yml
echo &quot; 그 마지막 스텝이 부르는 태스크가 무엇을 요구하는가 </tspan><tspan x="24" dy="22">:&quot;
grep -n &#x27;grpcTransportQualificationTest&#x27; build.gradle | sed -E &#x27;s#^([0-9]+): *# src/build.gradle:\1 #&#x27;
</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">cwd: /shared/codebase/clean-architecture-backend-template/src</tspan></text>
<text x="24" y="1036" 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:08:19+00:00 · exit 0</tspan></text>
<line x1="24" y1="1050" x2="1176" y2="1050" stroke="#30363d"/>
<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"># gradle 판</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"> Gradle 9.0.0</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"># grpc-testkit 이 등록하는 레인 넷과 각각의 태그</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"> grpc-testkit/build.gradle:15 lane(&#x27;grpcInProcessContractTest&#x27;) {</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"> grpc-testkit/build.gradle:16 tag = &#x27;grpc-inprocess&#x27;</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"> grpc-testkit/build.gradle:20 lane(&#x27;grpcNettyContractTest&#x27;) {</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"> grpc-testkit/build.gradle:21 tag = &#x27;grpc-netty&#x27;</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"> grpc-testkit/build.gradle:25 lane(&#x27;grpcFaultTest&#x27;) {</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"> grpc-testkit/build.gradle:26 tag = &#x27;grpc-fault&#x27;</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"> grpc-testkit/build.gradle:30 lane(&#x27;grpcPerformanceTest&#x27;) {</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"> grpc-testkit/build.gradle:31 tag = &#x27;grpc-performance&#x27;</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"></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"># 기본 test 에 실제로 걸리는 제외 태그는 두 곳에서 온다</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"> build.gradle:548: // (the skeleton default) excludeTags is a no-op.</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"> build.gradle:551: excludeTags &#x27;quarantine&#x27;</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"> grpc/grpc-testkit/build.gradle:42: excludeTags &#x27;grpc-performance&#x27;</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"> grpc-testkit/build.gradle:37 // The performance lane is excluded from the default `test` task. It measures a running server</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"> grpc-testkit/build.gradle:38 // under load, and a measurement in the release gate is a flaky test on a shared CI runner; it ru</tspan><tspan x="24" dy="22">ns</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"> grpc-testkit/build.gradle:39 // when somebody asks for it, by name.</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"> grpc-testkit/build.gradle:40 tasks.named(&#x27;test&#x27;) {</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"> grpc-testkit/build.gradle:41 useJUnitPlatform {</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"> grpc-testkit/build.gradle:42 excludeTags &#x27;grpc-performance&#x27;</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"> grpc-testkit/build.gradle:43 }</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"> grpc-testkit/build.gradle:44 }</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"> grpc-testkit 안의 quarantine 태그 : 0 건</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"></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"># 레인 태그는 클래스 단위인가</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"> testkit/GrpcInProcessContractFixtureTest.java:22:@Tag(&quot;grpc-inprocess&quot;)</tspan></text>
<text x="24" y="1750" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> testkit/GrpcInProcessContractFixtureTest.java-23-class GrpcInProcessContractFixtureTest {</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"> testkit/GrpcNettyContractProfileTest.java:24:@Tag(&quot;grpc-netty&quot;)</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"> testkit/GrpcNettyContractProfileTest.java-25-class GrpcNettyContractProfileTest {</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"> testkit/GrpcTransportEvidenceClassifierTest.java:37:@Tag(&quot;grpc-fault&quot;)</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"> testkit/GrpcTransportEvidenceClassifierTest.java-38-class GrpcTransportEvidenceClassifierTest {</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"> performance/GrpcPerformanceLaneTest.java:32:@Tag(&quot;grpc-performance&quot;)</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"> performance/GrpcPerformanceLaneTest.java-33-class GrpcPerformanceLaneTest {</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"></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"># check 의 태스크 그래프 — 시험을 돌리지 않고 확인한다</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"> $ ./gradlew :grpc:grpc-testkit:check --dry-run GRADLE_EXIT=0</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"> :grpc:grpc-testkit:compileJava SKIPPED</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"> :grpc:grpc-testkit:processResources SKIPPED</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"> :grpc:grpc-testkit:classes SKIPPED</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"> :grpc:grpc-testkit:checkstyleMain SKIPPED</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"> :grpc:grpc-testkit:compileTestJava 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"> :grpc:grpc-testkit:processTestResources 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"> :grpc:grpc-testkit:testClasses 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"> :grpc:grpc-testkit:checkstyleTest SKIPPED</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"> :grpc:grpc-testkit:spotbugsMain SKIPPED</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"> :grpc:grpc-testkit:spotbugsTest SKIPPED</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"> :grpc:grpc-testkit:spotlessJava SKIPPED</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"> :grpc:grpc-testkit:spotlessJavaCheck SKIPPED</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"> :grpc:grpc-testkit:spotlessCheck SKIPPED</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"> :grpc:grpc-testkit:test SKIPPED</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"> :grpc:grpc-testkit:check SKIPPED</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"> 그 그래프 안의 레인 태스크 : 0 건</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"></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"># 낡은 결과를 지우고 세 레인을 이름으로 돌린다</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"> 실행 전 남아 있는 결과 XML : 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"> $ ./gradlew :grpc:grpc-testkit:{grpcInProcessContractTest,grpcNettyContractTest,grpcFaultTest}</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"> BUILD SUCCESSFUL</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"> GRADLE_EXIT=0</tspan></text>
<text x="24" y="2454" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> [grpcInProcessContractTest]</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"> GrpcInProcessContractFixtureTest tests=7 failures=0 errors=0 skipped=0</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"> 시험 7 개</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"> [grpcNettyContractTest]</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"> GrpcNettyContractProfileTest tests=9 failures=0 errors=0 skipped=0</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"> 시험 9 개</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"> [grpcFaultTest]</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"> GrpcTransportEvidenceClassifierTest tests=9 failures=0 errors=0 skipped=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"> 시험 9 개</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"></tspan></text>
<text x="24" y="2674" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 같은 leaf 의 기본 test 를 돌린다</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"> $ ./gradlew :grpc:grpc-testkit:test</tspan></text>
<text x="24" y="2718" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BUILD SUCCESSFUL</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"> GRADLE_EXIT=0</tspan></text>
<text x="24" y="2762" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GrpcPerformanceGateTest tests=7 failures=0 errors=0 skipped=0</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"> GrpcStableReleaseGateTest tests=9 failures=0 errors=0 skipped=0</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"> GrpcInProcessContractFixtureTest tests=7 failures=0 errors=0 skipped=0</tspan></text>
<text x="24" y="2828" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GrpcNettyContractProfileTest tests=9 failures=0 errors=0 skipped=0</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"> GrpcServerStreamingContractTest tests=7 failures=0 errors=0 skipped=0</tspan></text>
<text x="24" y="2872" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GrpcTransportEvidenceClassifierTest tests=9 failures=0 errors=0 skipped=0</tspan></text>
<text x="24" y="2894" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GrpcUnaryReliabilityContractTest tests=8 failures=0 errors=0 skipped=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"> 시험 56 개</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"></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"># 레인이 돌린 시험이 기본 test 가 돌린 시험의 부분집합인가</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"> 레인 25 개 · 기본 test 56 개</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"> 레인이 돌린 시험이 기본 test 안에 전부 있는가 : True</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"> 기본 test 에만 있는 시험 : 31 개</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"> 성능 레인 클래스가 기본 test 결과에 있는가 : 0 건</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"></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"># 레인 태스크만 거는 보증</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"> ca.strict-test-lane.gradle:4 // useJUnitPlatform { includeTags }, failOnNoDiscoveredTests, outputs.upToDateWhen { false } — </tspan><tspan x="24" dy="22">once per</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"> ca.strict-test-lane.gradle:6 // `failOnNoDiscoveredTests` and `upToDateWhen { false }`, and a lane that is added by copy-past</tspan><tspan x="24" dy="22">e is a</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"> ca.strict-test-lane.gradle:23 // What a leaf may still not do is opt out of failing closed. There is no `failOnNoDiscoveredTe</tspan><tspan x="24" dy="22">sts`</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"> ca.strict-test-lane.gradle:237 failOnNoDiscoveredTests = true</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"> ca.strict-test-lane.gradle:239 // And it is not sufficient, which a TestKit fixture established. `failOnNoDiscoveredTests`</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"> ca.strict-test-lane.gradle:240 // applies to discovery; a tag filter excludes tests *after* discovery, so a lane whose tag</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"> ca.strict-test-lane.gradle:245 // So the lane counts what it actually executed and refuses zero.</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"> ca.strict-test-lane.gradle:246 def executedTests = new java.util.concurrent.atomic.AtomicLong(0L)</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"> ca.strict-test-lane.gradle:247 def executedSelectors =</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"> ca.strict-test-lane.gradle:250 executedTests.incrementAndGet()</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"> ca.strict-test-lane.gradle:252 executedSelectors.add(descriptor.className as String)</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"> ca.strict-test-lane.gradle:253 executedSelectors.add(&quot;${descriptor.className}.${descriptor.name}&quot; as String)</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"> ca.strict-test-lane.gradle:257 if (executedTests.get() == 0L) {</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"> ca.strict-test-lane.gradle:258 throw new GradleException(</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"> ca.strict-test-lane.gradle:276 !executedSelectors.any { String executed -&gt;</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"> ca.strict-test-lane.gradle:285 throw new GradleException(</tspan></text>
<text x="24" y="3532" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ca.strict-test-lane.gradle:293 outputs.upToDateWhen { false }</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"> ca.strict-test-lane.gradle:299 // failOnNoDiscoveredTests is not enough on its own, which a TestKit fixture established rathe</tspan><tspan x="24" dy="22">r</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"> ca.strict-test-lane.gradle:320 throw new GradleException(</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"> ca.strict-test-lane.gradle:333 throw new GradleException(</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"> ca.strict-test-lane.gradle:342 throw new GradleException(</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"> ca.strict-test-lane.gradle:347 throw new GradleException(</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"></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"># 레인 태스크를 자동으로 부르는 경로</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"> grpc-testkit/build.gradle 이 check 를 언급하는가 : 0 건</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"> 워크플로 28 개 중 grpc 를 언급하는 것 : 0 건</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"> ci-quality-gates.yml:48 - name: Check quality, public paths, and dependency locks</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"> ci-quality-gates.yml:49 working-directory: src</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"> 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="3862" 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="3884" 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="3906" 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="3928" 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="3950" 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="3972" 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:56 - name: Qualify the GraphQL Stable lane</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"> ci-quality-gates.yml:57 working-directory: src</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"> ci-quality-gates.yml:58 run: ./gradlew :adapter:inbound:graphql:graphqlStableTest --no-daemon --stacktrace</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"> ci-quality-gates.yml:59 - name: Qualify opt-in inbound transports without skips</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"> ci-quality-gates.yml:60 working-directory: src</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"> ci-quality-gates.yml:61 run: ./gradlew conditionalTransportQualification --no-daemon --stacktrace</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"> 그 마지막 스텝이 부르는 태스크가 무엇을 요구하는가 :</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"> src/build.gradle:594 &#x27;test-results/grpcTransportQualificationTest&#x27;),</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"> src/build.gradle:606 dependsOn &#x27;:adapter:inbound:grpc:grpcTransportQualificationTest&#x27;</tspan></text>
</svg>