Reference

13. E2E 샘플 평가 리포트

지원 언어별 best/stress 샘플 스캔 결과, jam-lite 한계, jam-full 보완 후보

Source: docs/13-e2e-sample-evaluation.md

13. E2E 샘플 평가 리포트

평가일: 2026-07-14 · 도구: jam v0.38.0 · Metrics Spec: v13.0.0 · 지표 세트: jam-lite

이 문서는 Metrics v13의 측정 모집단 변경을 고정 SHA 16개 저장소에서 실제로 검증한 기준선이다. 핵심 판정 대상은 단순한 등급 유지가 아니라 다음 세 가지다.

  1. production과 test/documentation/configuration/generated가 안정적으로 분리되는가.
  2. 카테고리가 구현된 언어의 production CLOC만 분모에 들어가며 coverage가 공개되는가.
  3. 감사 finding은 보존하면서 점수 제외 finding이 debt·risk profile·상한·회귀 게이트에 영향을 주지 않는가.

v13 점수는 모집단과 부채 집계가 달라 v12.x 점수와 직접 비교할 수 없다. v12 기준선은 변화 방향을 설명하는 참고값으로만 사용한다. jam-full의 과거 외부 도구 평가는 14-jam-full-e2e-evaluation.md에 별도로 보존한다. 취약점 정답 라벨과 비교하는 외적 타당화는 이 regression 점수와 섞지 않고 16-independent-security-validation.md에서 관리한다.

1. 방법과 재현 계약

저장소 URL, commit SHA, 기대 grade와 exact score는 testdata/e2e-corpus.yaml이 단일 기준이다. manifest v2는 project profile, partition, 예상 integrity와 result/run/summary schema도 함께 고정한다. 기존 16종은 이미 기준 개발에 반복 사용됐으므로 독립 validation이 아닌 partition=regression으로 정직하게 분류한다. 2026-07-14에 16개 저장소를 새로 clone한 뒤 고정 SHA를 checkout하고, 같은 바이너리로 전부 스캔했다.

CGO_ENABLED=0 go build -o /tmp/jam-v13 ./cmd/jam
/tmp/jam-v13 version

# 전체 자동 검증(로컬 cache/out 경로는 필요에 맞게 지정)
go run ./tools/e2e-corpus \
  --jam /tmp/jam-v13 \
  --cache-dir /tmp/jam-e2e-cache \
  --out-dir /tmp/jam-v13-results

관측 환경과 산출물:

외부 저장소 HEAD는 사용하지 않는다. SHA가 고정되어 있고 JAM 스캔이 결정적이므로 기대 점수 범위는 완화된 구간이 아니라 실제 관측값 하나로 고정했다.

2. 샘플 세트

언어역할Profile샘플고정 SHA선정 이유
Gobestlibrarygo-cleanhttp-best58d0437작고 단순한 라이브러리
Gostressapplicationgovwa-stress4058f79취약 웹앱
TypeScriptbestlibraryts-is-best7821031타입 유틸리티 라이브러리
JavaScriptstressapplicationjs-nodegoat-stressc5cb68aOWASP 취약 앱
Pythonbestlibrarypy-itsdangerous-best672971d보안 관련 라이브러리
Pythonstressapplicationpy-pygoat-stress19d17ccDjango 취약 앱
Javabestapplicationjava-gs-rest-beste9efc9dSpring 공식 가이드
Javastressapplicationjava-dvja-stress597ece1Java 취약 앱
C#bestlibrarycs-stateless-best588f1a1상태 머신 라이브러리
C#stressapplicationcs-dvcsharp-stress76c1de3취약 API 예제
Rustbestclirust-hyperfine-bestf12f3d9CLI 프로젝트
Ruststresseducationalrust-rustlings-stress4bab596미완성 연습 코드
Cbestlibraryc-linenoise-besta473823소형 단일 파일 중심 라이브러리
Cstresseducationalc-how2heap-stress02da6aaheap exploit 교육 코드
C++bestlibrarycpp-fmt-beste8deaf2대형 라이브러리
C++stressvulnerability_corpuscpp-fuzzer-test-suite-stress6955fc9퍼저 취약 샘플 모음

beststress는 표본 선정 역할이지 목표 등급 라벨이 아니다. 정상 프로젝트도 실제 production 부채가 크면 B/C가 될 수 있고, 보안 교육 프로젝트도 jam-lite가 의미론적 취약성을 다 보지 못하면 높은 점수가 나올 수 있다.

3. v13 실측 결과

Findings는 CSV 전체 행 수이고 괄호는 그중 score_exclusion 또는 suppression으로 점수에서 빠진 건수다. CLOC전체 / production이다.

언어역할샘플ScoreGradeFindings (제외)CLOC 전체 / productionIntegrity하드 조건
Gobestgo-cleanhttp-best100A3 (1)214 / 74complete-
Gostressgovwa-stress72C57 (0)11,349 / 11,197completeSEC critical
TypeScriptbestts-is-best86B38 (7)5,130 / 1,723complete-
JavaScriptstressjs-nodegoat-stress74C55 (4)5,298 / 3,990completeSEC critical
Pythonbestpy-itsdangerous-best91A25 (4)1,580 / 647complete-
Pythonstresspy-pygoat-stress69C135 (3)14,857 / 13,636completeSEC critical
Javabestjava-gs-rest-best100A2 (0)965 / 471complete-
Javastressjava-dvja-stress76C19 (0)7,887 / 6,968complete¹SEC critical
C#bestcs-stateless-best80B218 (33)12,415 / 5,380complete-
C#stresscs-dvcsharp-stress65C26 (0)2,774 / 1,029completeSEC critical
Rustbestrust-hyperfine-best87B152 (6)6,573 / 4,480complete-
Ruststressrust-rustlings-stress82B467 (4)11,496 / 8,700complete-
Cbestc-linenoise-best73C98 (0)2,753 / 2,744complete-
Cstressc-how2heap-stress80B14 (0)767 / 444complete-
C++bestcpp-fmt-best88B440 (193)56,847 / 14,708complete-
C++stresscpp-fuzzer-test-suite-stress79C42 (0)3,756 / 3,270incomplete²SEC critical

¹ java-dvjadocs/development/application-bootstrap.md는 NUL byte가 있어 감사 목록의 skipped file로 남지만 documentation 역할이므로 production integrity를 낮추지 않는다.

² cpp-fuzzer-test-suite의 production 파일 sqlite-2016-11-14/sqlite3.c가 7,012,677 bytes로 1 MiB 한도를 넘어 스킵되므로 측정은 incomplete다. strict 모드에서는 산출물을 쓴 뒤 exit 3이어야 한다.

4. v12 기준선과의 변화

샘플v12 기준v13 실측변화주된 이유
go-cleanhttp-best100/A100/A0production finding 없음
govwa-stress79/C72/C-7production-only eligible 밀도
ts-is-best97/A86/B-11test 7건 제외 후 production DUP 27 노출
js-nodegoat-stress79/C74/C-5production-only 밀도 + SEC 상한
py-itsdangerous-best98/A91/A-7production SIZE/DUP/HYG 밀도
py-pygoat-stress79/C69/C-10production-only 밀도 + SEC 상한
java-gs-rest-best100/A100/A0eligible production finding 없음
java-dvja-stress79/C76/C-3production SEC critical
cs-stateless-best92/A80/B-12test 33건 제외, production DUP 5/SIZE 75
cs-dvcsharp-stress79/C65/C-14production DUP/ARCH 밀도 + SEC 상한
rust-hyperfine-best92/A87/B-5가산 production debt
rust-rustlings-stress87/B82/B-5가산 production CPLX/DUP debt
c-linenoise-best84/B73/C-11단일 파일 집중 부채 할인 제거
c-how2heap-stress94/A80/B-14작은 production 모집단의 실제 CPLX/HYG 밀도
cpp-fmt-best95/A88/B-7test 193건 제외, production CPLX/DUP/SIZE 가산
cpp-fuzzer-test-suite-stress79/C79/C0기존 SEC C-band 상한과 동일

14종 하락과 2종 불변은 임계값을 바꾼 결과가 아니다. v13은 다음 두 비표준 희석 경로를 제거했다.

따라서 best 6종의 등급 하락은 회귀로 간주하지 않는다. 원래 finding과 비용은 그대로이며, 점수만 더 좁고 일관된 production 모집단에서 계산된다. 반대로 이전 A를 보존하려고 가중치나 grade cut을 조정하는 것은 독립 calibration/validation 근거 없이 기준을 재튜닝하는 것이므로 하지 않았다.

5. 범위와 coverage 검증

5.1 역할 분리

대표적으로 다음 finding이 감사 출력에는 남고 점수에서는 빠졌다.

CSV의 원 severity, raw debt_minutes, message와 location은 보존되고 debt_counted=0, score_exclusion=test가 기록된다. 제외 finding은 SEC/집중/등급 cap과 diff --fail-on-added를 발동시키지 않는다.

5.2 카테고리×언어 coverage

혼합 저장소에서 “점수가 높음”과 “분석 범위가 넓음”을 분리할 수 있다.

이제 unsupported other CLOC를 추가해 core category 점수를 올릴 수 없다. 동시에 낮은 coverage는 jam-run.json, jam-result.json, Markdown 부록에 명시되어 사용자가 점수를 과대해석하지 않게 한다.

6. 무결성 판정 검증

integrity도 점수와 같은 production 모집단에 맞췄다.

이 구분이 없으면 NUL byte가 든 문서 한 개 때문에 동일한 production 코드의 품질 게이트가 실패하는 모순이 생긴다.

7. 판정과 한계

v13은 수백 개 프로젝트를 같은 기준으로 비교하기 위한 기본 계약을 강화했다.

남은 한계도 명확하다.

다음 타당화 단계는 08-roadmap.md의 profile·holdout 계획대로 app/library/CLI/embedded/monorepo 층화, 독립 calibration/validation/holdout 분리, OWASP Benchmark/NIST SARD 교차 검증을 수행하는 것이다. 그 근거가 생기기 전에는 grade cut·가중치·cap을 코퍼스 등급에 맞춰 조정하지 않는다.

8. 자동 CI 게이트

.github/workflows/e2e-corpus.yml은 PR·main push·주간 schedule에서 16종을 4개 shard로 나눈다. 각 shard는 고정 저장소 clone을 cache하고 다음 계약을 모두 검증한다.

결과는 shard별 jam/e2e-summary@1과 전체 원본 산출물을 Actions artifact로 14일 보존한다. JSON Schema에 고정된 요약에는 profile/partition, production CLOC, category coverage, finding/exclusion 수가 있어 이후 독립 holdout과 같은 형식으로 층화 비교할 수 있다.

공식 GitHub cache v6는 Node.js 24 및 최신 self-hosted runner를 요구한다. 이 저장소는 이미 checkout v6/upload-artifact v7을 쓰는 동일 runner 계열을 전제로 한다.

9. 검증 명령

gofmt -w $(find . -name '*.go' -not -path './.git/*' -not -path './dist/*')
go test -count=1 ./...
go vet ./...
go run ./tools/e2e-corpus --validate-only
go run ./tools/release-metadata --check
go run ./tools/render-docs-site --check
bash -n scripts/build-release-artifacts.sh
bash -n docs/install.sh

실측 score/grade는 testdata/e2e-corpus.yaml과 이 문서가 일치해야 하며, 생성된 docs/reference/13-e2e-sample-evaluation/index.html도 함께 커밋한다.