Skip to content

Commit cb56683

Browse files
author
jun0
committed
[rustjava-count-symbols-dropped-from-second-parent-on-resolution-fix3] merge origin/main — 승인된 3파일 합집합(DoD 두 줄 · 원장 상단)
2 parents c7d9ab2 + 4dea46c commit cb56683

7 files changed

Lines changed: 465 additions & 0 deletions

‎.github/workflows/rust.yml‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,12 @@ jobs:
8080
steps:
8181
- uses: actions/checkout@v7
8282
- run: python3 scripts/check-dod-ci-parity.py
83+
84+
# Jvm::exception unwraps new_class(), so naming a class the loader cannot resolve panics instead
85+
# of throwing. This compares the names against the registered protos (see the script's docstring
86+
# for what it cannot see). One runner, not the matrix.
87+
named_exception_classes:
88+
runs-on: ubuntu-latest
89+
steps:
90+
- uses: actions/checkout@v7
91+
- run: python3 scripts/check-named-exception-classes-are-loadable.py

‎CLAUDE.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
cargo test --all
3232
python3 scripts/check-worklog-json.py
3333
python3 scripts/check-dod-ci-parity.py
34+
python3 scripts/check-named-exception-classes-are-loadable.py
3435
python3 scripts/check-merge-dropped-symbols.py
3536
```
3637
★★**이 블록은 이제 «기계가 지킨다» — `scripts/check-dod-ci-parity.py`(CI job `dod_parity`)가

‎REPORT.md‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,28 @@
11
# REPORT
2+
## [2026-09-18] 검사기의 «거짓 초록» 둘과 «거짓 빨강» 하나 — 게이트² 반려 승계 (rustjava-lock-every-named-exception-class-is-loadable-fix)
3+
- 무엇을: PR #72 의 검사기 결함 **3건** 정정. ★**베이스라인 0 인 검사기라 «거짓 초록 = 검사기 부재»** 다. ★런타임 클래스 추가 **0** · `loader.rs` `protos` **무접촉** · `jvm.rs` **무접촉**.
4+
- ★**F1(거짓 초록)** 짧은 이름 충돌 — `Formatter`(`java/util` ↔ `java/util/logging`) · `JarURLConnection`(`java/net` ↔ `org/rustjava/net`) **2쌍 실재**. ★재현: 한쪽 등재를 지우고 그 이름을 `exception(` 에 넣으면 **전 `✓ … 263 loadable` rc=0**(거짓 초록) → **후 rc=1**. 둘째 쌍도 동일. ★처방 = 키를 **(모듈, 타입, 함수)** 로.
5+
- ★**F2(거짓 초록)** 줄 단위 스캔이 다중 줄 `exception(` 을 못 봤다(rustfmt 가 쪼갠다). ★재현: 다중 줄 호출에 미등재 이름 → **전 rc=0(안 보임) → 후 rc=1**. ★**`.exception(` 846 − 다중 줄 34 = 812** ⇒ 검수자의 846 과 초판의 812 차이가 **F2 그 자체**였다.
6+
- ★**F3(거짓 빨강 + 사실오류)** `as_proto` 전용 정규식이 `list_proto` **3건**을 놓쳤고, 한 `impl` 에 생성자가 둘일 때 첫 `name:` 만 집어 엉뚱한 클래스를 귀속시켰다. ⇒ ★**초판의 「정의됐지만 미등재 5건」은 «틀렸다» — 실제 미등재 «0»**(`name:` 268 = 등재 268). 그 기록을 5곳에서 정정했다.
7+
- ★**수의 전/후와 «왜»**: 이름 **41→43** · 호출부 **812→846**(F2) · loadable **263→268**(F3 +3 · F1 충돌쌍 +2). ★**loadable 이 는 것은 느슨해진 것이 아니라** 종전에 265 등재를 263 으로밖에 해석 못 했다는 뜻이다.
8+
- ★**ⓒ 새 red 위험을 «편집 전»에 쟀다** — F2 로 늘어나는 이름 2개(`InstantiationError`·`UnsupportedClassVersionError`)가 **둘 다 등재** ⇒ **새 red 0 · rc=0 유지**(미등재였으면 멈추고 회신할 자리였다).
9+
- ★**시간**: `real` ×3 전 **1.42/1.67/1.46** ↔ 후 **2.01/1.69/1.19** — ★**구간이 겹친다** ⇒ 「늘지 않았다」가 아니라 **「유의하게 늘지 않았다」**.
10+
- ★**잃는 것**: 검사 대상이 늘어 **앞으로 더 자주 red 가 날 수 있다**(★실패가 아니라 «보이게 된 것») · 해석 로직이 3튜플 키로 **복잡해졌다**(결함 3건이 전부 그 자리였다 — 후속 카드) · ★여전히 **바닥**(런타임 조립 이름·`new_class(` 경로는 그대로 안 보인다).
11+
- 검증: 검사기 `✓ 43 named … all 268 loadable` rc=0 · `check-worklog-json` rc=0 · `check-dod-ci-parity` rc=0(명령 7개) · `cargo fmt` rc=0 · `mbvar-guard` rc=0(위반 0).
12+
- ★후속 추천: **loadable 집합을 «파싱으로 재유도»하지 말고 loader 쪽에서 «내보낼» 것인가**(M — 이번 결함 3건이 전부 그 재유도 자리였다). 상세 = `docs/worklog/2026-09-18-named-exception-classes-are-loadable.md`.
13+
14+
## [2026-09-18] 이름으로 부르는 예외 클래스가 «실을 수 있는» 것인가 — 한 자리에서 대조한다 (rustjava-lock-every-named-exception-class-is-loadable)
15+
- 무엇을: 채택 제안 `2026-09-17-string-concat-recipe-arity#p0`(worklog json `adoptedProposals` 기록). 산출물 = `scripts/check-named-exception-classes-are-loadable.py` **한 자리** + CI job + DoD 한 줄. ★**런타임 클래스 추가 0 · `.unwrap()` 무접촉.**
16+
- ★**전제를 코드로 확인했다**(총괄 선실측 없음): `jvm/src/jvm.rs:943-950` 의 `new_class(...).await.`★**`unwrap()`** ⇒ 부트스트랩 로더가 이름을 못 풀면 **Java 예외가 아니라 프로세스가 죽는다**. ★**자기 참조다** — `:842` 가 클래스 부재를 `exception("java/lang/NoClassDefFoundError", …)` 로 보고하므로 **오류 경로 자신의 클래스**가 실려야 한다.
17+
- ★**베이스라인 실측**(★게이트² 가 결함 3건을 잡아 **정정된 수**다): `exception(` 리터럴 클래스명 **43 고유 / 호출부 846** ↔ `loader.rs` 등재 **268항목**(`as_proto` 265 + `list_proto` 3) ⇒ ★**못 싣는 이름 «0»**(제안의 「baseline is now 0」 재현). ★**초판의 41/812/263 은 전부 «과소»였다** — 줄 단위 스캔이 다중 줄 호출 34건을, `as_proto` 전용 정규식이 `list_proto` 3건을, 짧은 이름 키잉이 충돌쌍을 각각 잃었다.
18+
★**제안의 「72」는 재현되지 않았다** — 내 술어는 「`exception(` 첫 인자 리터럴·고유」로 **41**이다. ★**재현 못 한 수는 인용하지 않았다.**
19+
- ★**실을 수 있는 집합 = «등재분»이다** — 그리고 ★**초판이 적은 「정의됐지만 미등재 5건」은 «틀렸다»**: 그 5건은 전부 등재돼 있고(3건은 `list_proto` 로, 2건은 충돌쌍의 다른 쪽으로) ★**실제 미등재는 «0»** 이다. `name:` 리터럴 **268** = 등재 **268**.
20+
- ★**양방향 4축**: ⒜현 상태 **rc=0** ⒝★**⑶ 실제 사례 재현** — `BootstrapMethodError` 등재 1줄 제거 → **rc=1**(`interpreter.rs:1109` 지목) ⒞프로토 이름 오타 → **rc=1**(321 호출부) ⒟★**fail-closed** — 해석 불가 등재 → **rc=2 «못 쟀다»**(집합을 조용히 줄여 false red 를 내지 않는다). 배선도 양방향 — CI step 제거 시 `dod_parity` **rc=1**.
21+
- ★**못 보는 것**(바닥이지 증명이 아니다): ★**런타임 조립 이름**(`format!`·상수·변수)은 **안 보인다** · `exception(` 만 훑는다(`new_class(`·`find_class(` 는 `Result` 를 돌려주므로 축이 다르다) · 초기화 실패는 통과 · 다른 실재 클래스와 겹치는 오타는 통과.
22+
- ★**잃는 것**: DoD 명령 **6 → 7**(실측 **~1초**/회차 · 초판 32.7초를 `target/` 가지치기로 없앴다) · ★**「green 이니 패닉 없다」는 거짓**(위 구멍) · ★**`.unwrap()` 은 그대로**라 새는 이름이 생기면 여전히 패닉한다(전환은 범위 밖).
23+
- 검증: `cargo test --all` **rc=0** · `check-dod-ci-parity` **「명령 7개 · toolchain 2개」 rc=0** · `check-worklog-json` rc=0.
24+
- ★후속 추천: ⑴**리터럴이 «아닌» `exception(` 호출부를 세라**(S — 구멍의 크기를 아직 모른다) ⑵**`.unwrap()` → throw 전환**(M · 이 회차가 명시적으로 범위 밖으로 둔 것). 상세 = `docs/worklog/2026-09-18-named-exception-classes-are-loadable.md`.
25+
226
## [2026-09-18] 충돌 해소가 «한쪽 부모의 정의»를 떨어뜨렸는지 센다 — ★**개악 시험이 내 검사기의 구멍을 잡았다**(rustjava-count-symbols-dropped-from-second-parent-on-resolution)
327
- 무엇을: 채택 제안 `2026-09-17-union-restores-silently-dropped-makeconcat#p0`(worklog json 기록). ★**제품 코드 0줄** — 검사기 1개 + 의도 규약 + 기존 `rust.yml` 에 잡 하나(**새 워크플로 파일 0**).
428
- ★**ⓑ 를 먼저 쟀다**(이 게이트가 티켓을 끝낼 수 있었다): `origin/main` 에 손실을 **재구성**해 기존 축 전수 → 생성기 **rc=0** · 단일결함 감사 **rc=0**(23) · `test_class_format` **21** · `test_fixture_pins` **3** · 파리티 **rc=0** · `git status` **0줄** · 충돌 마커 **0** ⇒ ★**아무것도 못 잡는다.**

‎STATE.md‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@
77
(둘 다 이것보다 오래됐고 MERGEABLE/CONFLICTING 처분이 이미 걸려 있다). 겹침은 전부 **append 형 합집합**이라 해소는 기계적이다)
88

99
## 완료
10+
- [rustjava-lock-every-named-exception-class-is-loadable-fix] ★★**검사기의 «거짓 초록» 2건 + «거짓 빨강» 1건 정정**(게이트² 반려 승계 · PR #72).
11+
★**F1** 짧은 이름 충돌(`Formatter`·`JarURLConnection` **2쌍**) ⇒ 한쪽 등재를 지워도 **전 rc=0(거짓 초록)** → **후 rc=1**. 키를 **(모듈,타입,함수)** 로.
12+
★**F2** 줄 단위 스캔이 다중 줄 호출을 못 봄 ⇒ **전 rc=0(안 보임) → 후 rc=1**. ★**846 − 34 = 812** 로 검수자 수와의 차이를 설명했다.
13+
★**F3** `list_proto` 3건 누락 + 한 `impl` 의 둘째 생성자 오귀속 ⇒ ★**초판의 「미등재 5건」은 틀렸다 — 실제 «0»**(5곳 정정).
14+
★**수 전/후**: 이름 41→**43** · 호출부 812→**846** · loadable 263→**268**(왜인지 기재).
15+
★**ⓒ 편집 «전»에 새 red 위험 측정** — 늘어나는 2이름 모두 등재 ⇒ **새 red 0**.
16+
★**시간 유의차 없음**(전 1.42/1.67/1.46 ↔ 후 2.01/1.69/1.19 · 구간 겹침). ★런타임 클래스 추가 0 · `protos` 무접촉.
17+
- [rustjava-lock-every-named-exception-class-is-loadable] ★★**이름으로 부르는 예외 클래스가 «실을 수 있는» 것인가 — 대조 한 자리.** 채택 제안 `2026-09-17-string-concat-recipe-arity#p0`(worklog json 기록).
18+
★**전제 확인(코드)**: `jvm/src/jvm.rs:943-950` `new_class(...).await.`**`unwrap()`** ⇒ 못 싣는 이름은 **throw 가 아니라 패닉**. ★자기 참조 — `:842` 가 부재를 `exception("java/lang/NoClassDefFoundError")` 로 보고한다.
19+
★**베이스라인 0**(★게이트² 정정 후): `exception(` 리터럴 **43 고유 / 846 호출부** ↔ 등재 **268**(`as_proto` 265 + `list_proto` 3). ★초판의 41/812/263 은 **전부 과소**였다(다중 줄 34 · `list_proto` 3 · 짧은 이름 충돌). ★제안의 「72」는 여전히 **재현 안 됨**.
20+
★**실을 수 있는 집합 = 등재분** · ★**초판의 「미등재 5건」은 틀렸다 — 실제 미등재 «0»**(`name:` 268 = 등재 268).
21+
★**양방향**: 현 상태 rc=0 · ★`BootstrapMethodError` 등재 제거 → **rc=1**(실제 패닉 사례 재현) · 프로토 이름 오타 → rc=1 · ★해석 불가 등재 → **rc=2(못 쟀다 · fail-closed)** · CI step 제거 → `dod_parity` rc=1.
22+
★**못 보는 것**: **런타임 조립 이름 안 보임**(바닥이지 증명 아님) · `exception(` 만 · 초기화 실패 통과.
23+
★**잃는 것**: DoD **6→7**(~1초 · 초판 32.7초는 `target/` 가지치기로 해소) · ★`.unwrap()` 무접촉(전환은 범위 밖).
24+
★`--all` rc=0 · `dod-ci-parity` **명령 7개** rc=0.
1025
- [rustjava-count-symbols-dropped-from-second-parent-on-resolution] ★★**충돌 해소가 떨어뜨린 정의를 센다 — 그리고 개악 시험이 «내 검사기»의 구멍을 잡았다.** 채택 제안 `2026-09-17-union-restores-silently-dropped-makeconcat#p0`. ★**제품 코드 0줄**(검사기 + 규약 + 기존 워크플로 잡 1).
1126
★**ⓑ 를 먼저 쟀다** — 손실을 재구성해 기존 축 전수(생성기·단일결함 감사·두 스위트·파리티·`git status`·마커) ⇒ ★**전부 green = 아무것도 못 잡는다.** ★조용한 조건은 「떨어진 이름들이 **자기완결**일 때」이고, 한쪽을 통째로 택하는 것이 정확히 그것이다.
1227
★**ⓐ 3건 → «4건»** · ★**ⓒ** 넷째가 **클래스 «안»의 메서드**라 「최상위」만 보면 **4 중 3**만 잡는다 ⇒ 한 단계 중첩까지.

0 commit comments

Comments
 (0)