{ "assetKey": "a19-f022-messagingpublicsurfacecontracttest", "kind": "terminal", "command": "#!/bin/bash\ncd /shared/codebase/clean-architecture-backend-template\nnt() { sed -E 's# in [0-9hms ]+$##'; }\n\necho \"# 가족 지침이 이 계약의 주인으로 지목한 것\"\nawk 'NR>=36 && NR<=44 {printf \" src/messaging/CLAUDE.md:%d %s\\n\", NR, $0}' src/messaging/CLAUDE.md\n\necho\necho \"# 그 시험 클래스가 놓인 트리\"\ngit grep -l 'class MessagingPublicSurfaceContractTest' -- 'src/**/*.java' | sed 's#^# #'\nF=src/app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/messaging/MessagingPublicSurfaceContractTest.java\necho \" src/messaging 아래 동명 파일 : $(find src/messaging -name 'MessagingPublicSurfaceContractTest.java' | wc -l) 개\"\necho \" 가족 test 트리 : $(ls -d src/messaging/*/src/test 2>/dev/null | wc -l) 개 · 이 파일의 트리 : src/app-bootstrap/src/test\"\necho \" 이 파일의 @Test $(grep -c '@Test' $F) · @Tag $(grep -c '@Tag' $F) · @Disabled $(grep -c '@Disabled' $F)\"\ngrep -n 'void .*(' $F | sed -E 's#^([0-9]+): *# :\\1 #'\n\necho\necho \"# 가족 경로에서 도는 워크플로의 트리거 전부와 실행 명령\"\nW=.github/workflows/messaging-certification.yml\nawk 'NR>=15 && NR<=22 {printf \" messaging-certification.yml:%d %s\\n\", NR, $0}' $W\ngrep -n 'gradlew' $W | sed -E 's#^([0-9]+): *# messaging-certification.yml:\\1 #'\n\necho\necho \"# 경로 필터가 없는 워크플로\"\nawk 'NR>=1 && NR<=9 {printf \" ci-quality-gates.yml:%d %s\\n\", NR, $0}' .github/workflows/ci-quality-gates.yml\necho \" on 블록(1-9)의 paths 필터 : $(awk 'NR<=9' .github/workflows/ci-quality-gates.yml | grep -c 'paths') 건\"\nawk 'NR>=19 && NR<=22 {printf \" ci-quality-gates.yml:%d %s\\n\", NR, $0}' .github/workflows/ci-quality-gates.yml\nawk 'NR>=48 && NR<=55 {printf \" ci-quality-gates.yml:%d %s\\n\", NR, $0}' .github/workflows/ci-quality-gates.yml\n\necho\necho \"# check 가 정말 이 프로젝트의 test 를 포함하는가\"\ncd src\necho \" \\$ ./gradlew :app-bootstrap:check --dry-run\"\ntimeout 900 ./gradlew --offline --no-daemon :app-bootstrap:check --dry-run 2>/dev/null \\\n | grep -E '^:app-bootstrap:(test|functionalTest|check) ' | sed 's#^# #'\necho \" 루트 test 규약이 거는 유일한 필터 :\"\nawk 'NR>=549 && NR<=553 {printf \" src/build.gradle:%d %s\\n\", NR, $0}' build.gradle\n\necho\necho \"# 이름으로 골라 실제로 돌리면\"\ntimeout 900 ./gradlew --offline --no-daemon :app-bootstrap:test \\\n --tests 'dev.caskeleton.bootstrap.contract.messaging.MessagingPublicSurfaceContractTest' > /tmp/t1.out 2>&1\necho \" \\$ ./gradlew :app-bootstrap:test --tests '...MessagingPublicSurfaceContractTest'\"\ngrep -E 'BUILD (SUCCESSFUL|FAILED)' /tmp/t1.out | nt | sed 's#^# #'\npython3 -c \"\nimport glob, xml.etree.ElementTree as ET\nfor p in glob.glob('app-bootstrap/build/test-results/test/TEST-*MessagingPublicSurfaceContractTest.xml'):\n r = ET.parse(p).getroot()\n print(f\\\" 결과 디렉터리 test/ · {r.get('name').split('.')[-1]} tests={r.get('tests')} failures={r.get('failures')} skipped={r.get('skipped')}\\\")\n\"\n\necho\necho \"# 가족 태스크로 같은 이름을 고르면\"\ntimeout 900 ./gradlew --offline --no-daemon :messaging:messaging-kafka:test \\\n --tests 'dev.caskeleton.bootstrap.contract.messaging.MessagingPublicSurfaceContractTest' > /tmp/t2.out 2>&1\necho \" \\$ ./gradlew :messaging:messaging-kafka:test --tests '...MessagingPublicSurfaceContractTest'\"\ngrep -E 'No tests found|BUILD (SUCCESSFUL|FAILED)' /tmp/t2.out | nt | head -2 | sed 's#^# #'\n", "cwd": "/shared/codebase/clean-architecture-backend-template", "exitCode": 0, "executedAt": "2026-09-04T02:02:28+00:00", "sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916", "raw": "evidence/raw/a19-f022-messagingpublicsurfacecontracttest.txt", "svg": "evidence/rendered/a19-f022-messagingpublicsurfacecontracttest.svg", "rawSha256": "350649393cfe95fb9539672d2275c8dea0875accdfbff364e8c6f2e4125b6247", "lines": 76, "redaction": "비밀값 없음" }