Skip to content

[rustjava-adopt-indy-fixture-jdk-pin-and-slot-accounting-p1] test(fixtures): 「어느 javac 이 만들었나」를 기록에서 「검증」으로 바꾼다 - #58

Merged
Jun025 merged 5 commits into
mainfrom
provenance/rustjava-indy-fixture-compiler
Sep 17, 2026
Merged

Jun025 merged 5 commits into
mainfrom
provenance/rustjava-indy-fixture-compiler

Conversation

@Jun025

@Jun025 Jun025 commented Sep 16, 2026

Copy link
Copy Markdown
Owner

채택 제안 2026-09-16-indy-fixture-jdk-pin-and-slot-accounting#p1. ★제품 코드 무접촉(Rust 변경은 doc 주석 1곳).

★★제안의 결론 «둘»이 실측으로 반증됐다 — 그래서 제안이 «불가능»하다고 본 쪽을 만들었다

⑴ 「Nothing offline can verify a recorded compiler version … buys provenance, not enforcement」 → ★거짓.
javac 은 같은 소스·플래그·컴파일러에 결정적이다:

$ sh test-data/src/verify-javac-fixtures.sh
javac: javac 26.0.1
6 rebuilt: 6 reproduced, 0 differed; 0 could not be rebuilt

⇒ ★기록이 «재현»으로 검증된다.

⑵ 「강제 가능한 축은 constant_pool.rs 의 상수 개수뿐이고 한 픽스처만 덮는다」 → ★거짓.

픽스처 이미 있는 형상 단언
ConstantKinds 태그별 정확한 개수(MethodType 1 · Dynamic 3 · MethodHandle 7 · InvokeDynamic 3)
StringConcat 부트스트랩 4축 + 인자가 «가리키는 값»("a\u{1}") + ★바이트 창 [15,6,0,35](「layout changed」로 실패)
Lambda LambdaMetafactory.metafactory · 인자 3 · ★args[0]==args[2]!=args[1]

★제안이 든 위험(「현대 javac 은 enum switch 를 condy 로 낸다」)은 ★**ConstantKinds 의 Dynamic 3 이 이미 잠그고 있다.**

만든 것 — test-data/src/verify-javac-fixtures.sh

  • ★--release 를 픽스처 자신의 major − 44 에서 읽는다 ⇒ 외부 표 의존 0(형제 PR 미착지에도 무관).
  • ★명시한 JAVAC 가 안 되면 조용히 대체하지 않고 rc=2 — 「무엇이 검증했나」가 흐려지면 안 된다.
  • ★**「못 만들었다」와 「만들었는데 다르다」를 «가른다»** — 합치면 발견을 과장한다.
  • ★CI 에 배선하지 않았다: 워크플로에도 PATH 에도 JDK 가 없어 ★어디서나 실패하거나 어디서나 건너뛴다.

★실패담 둘 — 밟은 대로 적는다

⑴command -v javac 이 macOS 스텁(실행되는데 「JDK 없음」을 출력)을 고른다 ⇒ 실행해서 판별.
⑵★**-sourcepath 를 넣었다가 되돌렸다** — test-data/src/Exception.java 가 java.lang.Exception 을 가려서
멀쩡히 재현되던 파일들이 incompatible types: Exception cannot be converted to Throwable 로 무너졌다(실측).
⇒ 그 대가(형제 참조 소스는 홀로 재빌드 불가)는 「could not be rebuilt」로 따로 보고한다.

개악 대조

조작 결과
커밋된 StringConcat.class 마지막 1바이트 반전 ★✗ 감지
복원 6 reproduced
명시 JAVAC 부재 ★rc=2 「nothing was verified」 — 통과 아님

★일반화 — 값만 적고 고치지 않았다

sh … test-data → 109 rebuilt · 104 재현 · ★5 상이 · 3 재빌드 불가
(상이: MonitorSemantics+내부 2 · NativeMethod @--release 8 · OddEven @21).
★원인은 단정하지 않는다 — 「다른 컴파일러」와 「빌드 뒤 소스 수정」이 둘 다 맞는다. 범위 밖이라 후속(M)으로 넘겼다.
★그래도 적는 이유: ★제안이 걱정한 드리프트가 «실재»한다는 첫 «직접» 증거다.

검증

cargo test --all --no-fail-fast 572 passed / 0 failed / 1 ignored(doc 주석만 바꿔 불변) · sh -n rc=0 · DoD 7명령 rc=0.

…tures): 어느 javac 이 만들었나를 기록에서 검증으로 바꾼다

제안의 결론 둘이 실측으로 반증됐다. 「offline 으로 검증할 수 없다」는 거짓이다 — javac 은 같은
소스·플래그·컴파일러에 결정적이라 기록된 도구로 재빌드하면 indy 6개가 바이트 단위로 재현된다.
「형상 단언이 한 픽스처만 덮는다」도 거짓이다 — javac 산출 indy 3/3 이 이미 갖고 있고, 제안이 든
condy 위험은 ConstantKinds 의 Dynamic 개수가 잠근다.

그래서 제안이 불가능하다고 본 쪽을 만들었다. --release 는 픽스처 자신의 major-44 로 읽어 외부 표에
의존하지 않고, 명시한 JAVAC 가 안 되면 조용히 대체하지 않고 rc=2 로 멈추며, 「못 만들었다」와
「만들었는데 다르다」를 가른다. JDK 가 CI 에도 PATH 에도 없어 배선하지 않았다.

-sourcepath 는 넣었다가 되돌렸다: test-data/src/Exception.java 가 java.lang.Exception 을 가린다.

루트 일반화는 109 rebuilt / 104 재현 / 5 상이 — 원인은 단정하지 않고 후속으로 넘겼다.
jun0 added 4 commits September 17, 2026 09:29
…igin/main — 형제 #55 착지분과의 충돌 2파일 합집합 해소

충돌은 원장 2파일(REPORT.md·STATE.md)뿐이고 코드 파일 충돌 0. 양쪽 항목을 전건 보존하고
시간순으로 얹었다 — 이 회차(38c02a2 05:22)가 main 쪽 최신 항목(30a31bd 04:04)보다 뒤라 위에 온다.
줄 소실 0(양방향) · 합집합 밖 신규줄 0.
…te): 게이트③ 착지 기록 동봉 (PR #58 · --merge)
…igin/main — 형제 #59 착지분과의 충돌 2파일 합집합 해소

충돌은 원장 2파일뿐이고 코드 파일 충돌 0.
★시간순이 «뒤집혔다» — main 쪽 항목(3b04712 06:52)이 이 회차(38c02a2 05:22)보다 뒤라 «위»에 온다.
줄 소실 0(양방향) · 합집합 밖 신규줄 0.
…te): 게이트③ 2회차 기록 추가 (base 재당김 · PR #58)
@Jun025
Jun025 merged commit 6e016a2 into main Sep 17, 2026
10 checks passed
@Jun025
Jun025 deleted the provenance/rustjava-indy-fixture-compiler branch September 17, 2026 02:23
Jun025 pushed a commit that referenced this pull request Sep 17, 2026
… 형제 #59·#58 착지분과의 충돌 2파일 합집합 해소

충돌은 원장 2파일뿐이고 코드 파일 충돌 0.
tests/test_class_format.rs 는 또 자동 병합됐고 양방향으로 쟀다(이쪽 10/3 불변 · main 델타 누락 0).
시간순: main 쪽 두 항목(3b04712 06:52 · 38c02a2 05:22)이 이 회차(53ca340 04:31)보다 뒤라 위에 온다.
Jun025 pushed a commit that referenced this pull request Sep 17, 2026
#59·#58·#56 착지분 흡수

충돌 3파일: 원장 2(REPORT·STATE)는 합집합·시간순(이 회차 09:06 > main 최신 06:52 ⇒ 위),
make_indy_fixtures.py 는 형제 두 회차의 «각자 추가»라 합집합으로 합쳤다
(#59 의 fieldref·MAKECONCAT_DESCRIPTOR·make_concat_call_site·LINKED +
 이 PR 의 method_type·method_handle·METAFACTORY_*·lambda_near_miss·METAFACTORY_FIXTURES).
★검증: 재생성 후 기존 픽스처 «바이트 변동 0» — 두 생성기가 둘 다 살아 있다.
Jun025 pushed a commit that referenced this pull request Sep 17, 2026
…ge origin/main + 표 3행 — 형제 #59 픽스처를 이 PR 이 책임진다

게이트③ 회차가 «옳게» 막힌 자리를 푼다. base 를 당기면 이 PR 자신의 핀 테스트가 실패했다:
#59 가 들여온 MakeConcat·MakeConcatWithArgument·MakeConcatWrongDescriptor 가 표에 없었다.
검사기가 옳게 물은 것이므로 완화하지 않고 표를 고쳤다.

★표 갱신을 «이 머지 커밋 안»에 둔 이유: 이 PR 이 세운 AGENTS.md 규율이
「.class 를 더하거나 재생성하면 «같은 커밋에» 표를 고쳐라」다. 그 셋을 들여오는 것이 이 머지이므로
같은 커밋이 그 규율에 맞다.

record-class-file-versions.py 1회 · diff = 3 0(★추가만 · 삭제 0) ⇒ 기존 156행 중 바뀐 것 없음
= 픽스처 재생성 0. 원장 2파일 충돌은 합집합·시간순(이 회차 06:16 은 #59 06:52 아래 · #58 05:22 위).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant