fix: 2026-07-27 평가·독푸딩 발견 결함 전량 수정 (v1.4.1) - #32
Merged
Conversation
Every fix carries a regression test that encodes HOW the defect was found.
Agent — control endpoint:
- BUG-1 (major): an agent-only JVM hung after main returned — the JDK
HTTP-Dispatcher thread was non-daemon and the shutdown hook that stops
the server only runs once shutdown has begun. The server now uses a
daemon executor and starts from a daemon thread; AgentJvmExitE2E
re-enacts the discovery (child JVM must exit by itself and write
aggregate.exec).
- BUG-5: text stop for an unknown testId returned a false 200; now 404
on both text and binary paths.
- BUG-6: unsupported format values (e.g. "bianry") were silently treated
as text; now 400 without consuming the in-flight store.
- U7: all control endpoints are POST-only (405 otherwise) and binding a
non-loopback address logs an explicit no-auth warning.
Agent — observability:
- instrumentFailures counter + rate-limited WARN when jacoco's
Instrumenter throws: this silent catch cost -22.7% instructions in a
real app (ASM clash) and was only found by diffing against vanilla.
- BUG-4: unknown/malformed -javaagent options now produce startup WARNs
(a typoed destdirr silently sent output to the default dir).
- BUG-7: agent logs go to stderr — stdout is surefire's forked-JVM
channel ("Corrupted channel" warning + dumpstream every build).
- BUG-8: summary() no longer embeds the [pjacoco] prefix AgentLog adds.
- manifest jacocoVersion comes from the embedded jacoco-core's
JaCoCo.VERSION instead of a hardcoded "0.8.12".
- CoverageBridge PROBE_COUNTS name-keying documented as a known
multi-classloader limitation (classId keying would widen the
reflection surface into jacoco internals).
testkit:
- BUG-2 (major): under JUnit 5 parallel execution, @ParameterizedTest
invocations shared one testId and start()'s retry-overwrite replaced a
sibling's in-flight store — per-test .exec silently lost. Template
invocations now get invocation-unique testIds (FQCN#method[N]).
- U3: testkit jars embed their publication POM + pom.properties
(META-INF/maven) so `mvn install:install-file -Dfile=<jar>` keeps GAV
and transitive deps; verifyJarEmbedsPom (wired into check) asserts it.
gradle-plugin:
- P4-A cache guard stabilized with --no-watch-fs: the reused TestKit
daemon's retained VFS could miss the test's external deletion of
build/pjacoco (macOS event race) and wrongly report :test UP-TO-DATE.
Docs/version:
- Version bumped to 1.4.1 across build.gradle.kts, maven-plugin pom,
samples, and README (README literals had drifted at 1.3.0 — consumers
copy-pasting got the version with the ASM instrumentation bug).
- README (ko/en): binary stop + persist + X-Pjacoco-* headers, the
tightened endpoint contract, install-file walkthrough, Maven default
output dir, per-invocation parameterized testIds, and the
single-active droppedProbes heuristic's limits.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FavJfhdcNAHZKWvmSBVLYZ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
배경
2026-07-27 평가·독푸딩 리포트(서브에이전트 산출, 코디네이터 교차 검증)의 발견 결함을 전량 수정한다. 모든 수정에는 결함을 발견한 방법 자체를 인코딩한 회귀 테스트가 딸려 있다.
수정 내역 (15항목)
agent — 제어 엔드포인트
AgentJvmExitE2E(자식 JVM 자력 종료 + aggregate.exec, 발견 방법 그대로) +controlServerThreadsAreDaemon(jstack 관찰 인코딩).format오타 무검증 → 400(store 미소비). U7: POST 전용(405) + 비루프백 바인드 무인증 경고. 테스트:ControlEndpointContractTest5종.agent — 관측성
InstrumentFailureSignalTest(NoSuchMethodError=ASM clash 재연).AgentOptionsParseWarningsTest,destdirr시나리오 그대로). BUG-7: 로그 stderr화(surefire 채널 오염 해소). BUG-8: summary 프리픽스 중복 제거 (LogChannelTest).jacocoVersion: 하드코딩 제거, 임베드 jacoco-core의JaCoCo.VERSION에서 파생하되 3세그먼트 축약형 유지(출력 스키마 보존;BootstrapManifestTest+SpecAcceptanceE2E는 하드코드 대신 파생값 단언으로 카나리 매트릭스에도 안전).PROBE_COUNTS멀티클래스로더 제약은 문서화(수정 시 jacoco 내부 리플렉션 표면 확대 — 의도적 보류).testkit
@ParameterizedTestper-test exec 무음 소실(공유 testId → retry-overwrite 레이스) → invocation별 고유 testIdFQCN#method[N]. 공용TestIds헬퍼로 인프로세스·블랙박스(HTTP) extension 양쪽 적용(1차 수정이 HTTP 쪽을 누락했던 것을 코드 리뷰가 적발). JUnit4PjacocoRule은getMethodName()이 이미[N]포함으로 감사 통과. 테스트:InvocationUniqueTestIdTest(파생 규칙) +ParameterizedInvocationEndToEndTest(런처로 실제 실행, stub 제어 서버가 받은 testId 3종 검증 — 호출 지점 누락도 잡는 행동 테스트).install-filetransitive 보존),verifyJarEmbedsPom이 check에 배선되고 CI에도 추가(가드 미실행 갭 해소), 좌표를 태스크 입력으로 선언(버전 변경 시 stale 방지) + config-cache 안전 provider.gradle-plugin
--no-watch-fs(외부 삭제 ↔ 데몬 VFS 레이스 원인 주석 포함).docs/version
소비자 영향 (릴리스 노트 반영 필요)
FQCN#method.exec→FQCN#method[N].exec(invocation별)검증
test(전 모듈) +:agent:integrationTest :agent:e2eTest :agent:e2eJakartaTest :agent:e2eCondyTest+ verify 4종 (로컬 6m4s) — 리뷰가 적발한 e2eTest red(SpecAcceptanceE2E 2건)까지 수정 후 재확인🤖 Generated with Claude Code
https://claude.ai/code/session_01FavJfhdcNAHZKWvmSBVLYZ