{ "assetKey": "a20-f011-grpccompletionreconciler-arraylist", "kind": "terminal", "command": "#!/bin/bash\nset -euo pipefail\ncd /shared/codebase/clean-architecture-backend-template\nK=src/grpc/grpc-policy/src/main/java/dev/caskeleton/grpc/idempotency/GrpcCompletionReconciler.java\nC=src/grpc/grpc-policy/src/main/java/dev/caskeleton/grpc/deadline/GrpcCancellationCoordinator.java\nR=docs/runbooks/grpc-platform-operations.md\ntest -f \"$K\"; test -f \"$C\"; test -f \"$R\"\n\n# grep 오류(2)와 무매치(1)를 가른다. 오타난 패턴은 0 을 제조하지 못하고 죽는다.\ncnt() { local n; n=$(grep -c -- \"$1\" \"$2\") || [ $? -eq 1 ] || { echo \"GREP FAILED: $1\" >&2; exit 2; }; echo \"$n\"; }\n\necho \"# 클래스 자바독과 목록 선언 ($(wc -l < $K) 줄)\"\nawk 'NR>=8 && NR<=26 {printf \" GrpcCompletionReconciler.java:%d %s\\n\", NR, $0}' $K\n\necho\necho \"# pending 이 나오는 줄 전부\"\ngrep -n 'pending' $K | sed -E 's#^([0-9]+): *# GrpcCompletionReconciler.java:\\1 #'\n\necho\necho \"# 동기화 표시자 — 같은 검색을 같은 리프의 짝에도 건다\"\nprintf \" %-18s %10s %10s %10s\\n\" \"표시자\" \"이 파일\" \"짝 파일\" \"리프 전체\"\nfor w in synchronized volatile 'java.util.concurrent' ReentrantLock CopyOnWrite 'not thread' 'single-threaded'; do\n a=$(cnt \"$w\" $K); b=$(cnt \"$w\" $C)\n r=$({ git grep -l -- \"$w\" -- 'src/grpc/grpc-policy/**/*.java' || true; } | grep -c . || true)\n printf \" %-18s %10s %10s %10s\\n\" \"$w\" \"$a\" \"$b\" \"$r\"\ndone\n\necho \" 같은 검색을 리프 전체에 걸어 파일별로 :\"\nfor f in $(find src/grpc/grpc-policy/src/main -name '*.java' | sort); do\n n=$(grep -cE 'synchronized|volatile|ReentrantLock|CopyOnWrite|java\\.util\\.concurrent' $f) || [ $? -eq 1 ] || exit 2\n [ \"$n\" != \"0\" ] && printf \" %-38s %s 건\\n\" \"$(basename $f)\" \"$n\" || true\ndone\necho \" 리프 전체 $(find src/grpc/grpc-policy/src/main -name '*.java' | grep -c .) 파일\"\n\necho\necho \"# pending.add 가 실행되는 조건\"\nawk 'NR>=62 && NR<=82 {printf \" GrpcCompletionReconciler.java:%d %s\\n\", NR, $0}' $K\nS=src/grpc/grpc-policy/src/main/java/dev/caskeleton/grpc/idempotency/GrpcCompletionResolution.java\nawk 'NR>=46 && NR<=54 {printf \" GrpcCompletionResolution.java:%d %s\\n\", NR, $0}' $S\n\necho\necho \"# 같은 리프에서 같은 모양의 필드를 가진 클래스\"\ngrep -rnE 'private final (List|Map|Set|Deque|Queue)<.*> .* = new ' src/grpc/grpc-policy/src/main \\\n | sed 's#.*/main/java/dev/caskeleton/grpc/# #'\necho \" 그중 GrpcCancellationCoordinator 의 공개 메서드 :\"\ngrep -nE '^ public ' $C | sed -E 's#^([0-9]+): *# GrpcCancellationCoordinator.java:\\1 #'\n\necho\necho \"# 이 타입을 참조하는 자리 — 경로 제한 없이, 절단 없이\"\ngit grep -l 'GrpcCompletionReconciler' | sed 's/^/ /'\ngit grep -n 'GrpcCompletionReconciler' -- 'src/**/*.java' \\\n | sed -E 's#^src/[^:]*/src/(main|test)/java/dev/caskeleton/[^:]*/([^:/]+):([0-9]+):# \\1 · \\2:\\3 #'\nn=$({ git grep -l 'GrpcCompletionReconciler' -- 'src/**/*.java' || true; } | { grep '/main/' || true; } | { grep -v '/GrpcCompletionReconciler.java' || true; } | grep -c . || true)\np=$({ git grep -l 'GrpcCancellationCoordinator' -- 'src/**/*.java' || true; } | { grep '/main/' || true; } | { grep -v '/GrpcCancellationCoordinator.java' || true; } | grep -c . || true)\necho \" 자기 파일 밖 main 참조 : $n 개\"\necho \" [대조] GrpcCancellationCoordinator : $p 개 (0 이 아니어야 정상)\"\n\necho\necho \"# 운영 런북이 자기를 어떻게 규정하는가\"\nawk 'NR>=1 && NR<=9 {printf \" grpc-platform-operations.md:%d %s\\n\", NR, $0}' $R\necho \" 그 런북이 요구하는 스위치가 코드에 있는가 : $({ git grep -l 'grpc.platform.enabled' -- 'src' || true; } | grep -c . || true) 개 파일\"\necho \" 독립 문서의 같은 서술 :\"\ngrep -n 'Not released\\|build-only' docs/compatibility/grpc-support-matrix.md \\\n | sed -E 's#^([0-9]+): *# grpc-support-matrix.md:\\1 #'\n\necho\necho \"# 그 런북이 이 클래스에 기대하는 동작\"\nawk 'NR>=34 && NR<=42 {printf \" grpc-platform-operations.md:%d %s\\n\", NR, $0}' $R\n", "cwd": "/shared/codebase/clean-architecture-backend-template", "exitCode": 0, "executedAt": "2026-09-04T03:24:35+00:00", "sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916", "raw": "evidence/raw/a20-f011-grpccompletionreconciler-arraylist.txt", "svg": "evidence/rendered/a20-f011-grpccompletionreconciler-arraylist.svg", "rawSha256": "515801cc849539fdd668bab15c948712ffe116d2633d1d90701d2ab5f4c6e24b", "lines": 137, "redaction": "비밀값 없음" }