Skip to content

Commit fd571cb

Browse files
authored
[rustjava-count-symbols-dropped-from-second-parent-on-resolution] test(ci): 충돌 해소가 떨어뜨린 정의를 센다 [rustjava-count-symbols-dropped-from-second-parent-on-resolution-fix] [rustjava-count-symbols-dropped-from-second-parent-on-resolution-fix2] [rustjava-count-symbols-dropped-from-second-parent-on-resolution-fix3] (#71)
[rustjava-count-symbols-dropped-from-second-parent-on-resolution] test(ci): 충돌 해소가 떨어뜨린 정의를 센다 [rustjava-count-symbols-dropped-from-second-parent-on-resolution-fix] [rustjava-count-symbols-dropped-from-second-parent-on-resolution-fix2] [rustjava-count-symbols-dropped-from-second-parent-on-resolution-fix3]
2 parents 4dea46c + cb56683 commit fd571cb

7 files changed

Lines changed: 444 additions & 0 deletions

File tree

‎.github/workflows/rust.yml‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@ jobs:
6262
- uses: actions/checkout@v7
6363
- run: python3 scripts/check-worklog-json.py
6464

65+
# a conflict resolution that drops one side's work leaves no other trace: no marker, mergeable
66+
# CLEAN, suite green. fetch-depth 0 because the check needs the merge commits and their parents,
67+
# which a shallow checkout does not have. One runner, not the matrix.
68+
merge_drops:
69+
runs-on: ubuntu-latest
70+
steps:
71+
- uses: actions/checkout@v7
72+
with:
73+
fetch-depth: 0
74+
- run: python3 scripts/check-merge-dropped-symbols.py
75+
6576
# parity lock: the CLAUDE.md DoD block must reproduce this file's checks (see the script's
6677
# docstring — hand comparison failed five rounds in a row). One runner, not the matrix.
6778
dod_parity:

‎CLAUDE.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
python3 scripts/check-worklog-json.py
3333
python3 scripts/check-dod-ci-parity.py
3434
python3 scripts/check-named-exception-classes-are-loadable.py
35+
python3 scripts/check-merge-dropped-symbols.py
3536
```
3637
★★**이 블록은 이제 «기계가 지킨다» — `scripts/check-dod-ci-parity.py`(CI job `dod_parity`)가
3738
이 코드블록과 `rust.yml` 을 «각각 파싱해» 대칭차를 낸다.** 어긋나면 그 자리에서 red 다.

‎REPORT.md‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,23 @@
2323
- 검증: `cargo test --all` **rc=0** · `check-dod-ci-parity` **「명령 7개 · toolchain 2개」 rc=0** · `check-worklog-json` rc=0.
2424
- ★후속 추천: ⑴**리터럴이 «아닌» `exception(` 호출부를 세라**(S — 구멍의 크기를 아직 모른다) ⑵**`.unwrap()` → throw 전환**(M · 이 회차가 명시적으로 범위 밖으로 둔 것). 상세 = `docs/worklog/2026-09-18-named-exception-classes-are-loadable.md`.
2525

26+
## [2026-09-18] 충돌 해소가 «한쪽 부모의 정의»를 떨어뜨렸는지 센다 — ★**개악 시험이 내 검사기의 구멍을 잡았다**(rustjava-count-symbols-dropped-from-second-parent-on-resolution)
27+
- 무엇을: 채택 제안 `2026-09-17-union-restores-silently-dropped-makeconcat#p0`(worklog json 기록). ★**제품 코드 0줄** — 검사기 1개 + 의도 규약 + 기존 `rust.yml` 에 잡 하나(**새 워크플로 파일 0**).
28+
- ★**ⓑ 를 먼저 쟀다**(이 게이트가 티켓을 끝낼 수 있었다): `origin/main` 에 손실을 **재구성**해 기존 축 전수 → 생성기 **rc=0** · 단일결함 감사 **rc=0**(23) · `test_class_format` **21** · `test_fixture_pins` **3** · 파리티 **rc=0** · `git status` **0줄** · 충돌 마커 **0** ⇒ ★**아무것도 못 잡는다.**
29+
★★**왜 조용한지를 정확히 알아냈다** — 손실은 **떨어진 이름들이 서로 자기완결일 때만** 조용하고(자기완결이 아니면 `AttributeError` 로 시끄럽게 죽는다), ★**충돌의 한쪽을 통째로 택하는 것이 바로 그 자기완결 슬라이스를 떨어뜨리는 것**이다.
30+
- ★**ⓐ 「3건」을 다시 세니 «4건»** — `LINKED`·`MAKECONCAT_DESCRIPTOR`·`def make_concat_call_site`·`method fieldref`(두 해소 커밋 각각).
31+
- ★**ⓒ 정의의 범위를 실제 4건에서 거꾸로 정했다**: ★넷째 `fieldref` 가 **`class Pool` 안의 메서드**라 ★**「최상위」만 보면 4 중 3만 잡는다** ⇒ **한 단계 중첩까지** 본다.
32+
- ★**ⓓ**: `rustjava` 는 등재 repo 라 `--merge` 착지(main 머지 **83/200**)지만 ★**겨냥하는 것은 «브랜치 내부 base 당김»**(사고 둘 다 그것 · 최근 **26건**)이라 **착지 방식과 무관**하다. 부모 1개 범위 → `0 merge(s)` **rc=0**.
33+
- ★**의도/사고 분리 = 커밋 trailer** `Dropped-from-theirs: <name> -- <why>` ⇒ ★**자기 커밋 하나만 면제**하므로 티켓이 경고한 「영구 목록이 검사기를 무력화한다」가 **구조적으로 불가능**하다.
34+
- ★★**설계를 한 번 갈아엎었다**: 초판의 «트리 == 부모1 이면 `-s ours` 로 보고 건너뛴다» 구조 면제가 ★**개악 시험에서 theirs 를 통째로 버린 머지까지 삼켜 rc=0** 이 됐다 — 그게 이 검사기의 존재 이유인 실패다 ⇒ **면제를 «선언»(`*` 와일드카드)으로 교체**. ★양방향을 안 돌렸으면 **끈 채로 착지**했다.
35+
- ★**합격선 양방향 전건**: ⒜개악 **rc=1 + 이름을 말한다** · ⒝정상 **rc=0** · ⒞trailer **rc=0**, 지우면 **rc=1** · ⓓ스쿼시 **rc=0** · ★실사고에서 **손으로 찾은 것과 같은 분할**(생성기 4 사고 + `.rs` 2 의도)을 기계가 낸다.
36+
- ★★**[게이트② 승계] 필터가 너무 좁아 «둘째 사고»를 놓쳤다 — 넓혔다.** 초판은 「theirs 가 건드린 파일만」 봤고 그 근거 문장이 **거짓**이었다 — `514d5b08` 이 같은 넷을 떨어뜨렸는데 초판은 ★**파일 «4개»를 보고도 findings 0 · rc=0** 으로 통과시켰다(확장본은 같은 머지에서 **13개**를 보고 그 넷을 짚는다 · 세 판본에 `check()` 를 직접 불러 잰 값). ⇒ 술어를 **「theirs 가 바꾼 파일 ∪ 머지가 바꾼 파일」**로 넓혀 ★**두 사고 «둘 다» rc=1**. ★좁힌 채 두면 「없는 보장을 있다고 적는」 형태가 된다(#67 F1 과 같은 형태).
37+
- ★**오탐을 세었다 — ★이 회차가 «직접» 돌린 값이다**(인용 아님 · 창 `38b0df38..8c7b473f` = 83머지): 초판 **8건/19정의** → ★**확장본 10건/26정의**. ★**늘어난 것은 26이 아니라 «7정의»**(`514d5b08` 6 + `37ea5a13` 1)이고, ★**7 중 진짜 소실 4 · 오탐 3**(아래). ★★**시간은 「느리지 않았다」가 아니라 «유의한 증가 없음»이다** — 같은 창에서 **초판만 3회 독립 실행**이 **229s/286.8s/585.3s(2.6배)** 로 흔들리는 반면 판본 차이는 **0.8s/머지**다(수 출처 = 게이트² 검수 실측 · ★이 회차는 다시 재지 않았다). ★wide 의 파일 집합이 narrow 의 **상위집합**이라 **더 싸질 수는 없다**. 종전 「4.4초/머지」 삭제는 **유지**한다.
38+
- ★**trailer 이름은 «출력에서 복사»해야 한다** — `method fieldref` 는 통하고 `Pool.fieldref` 는 **안 통한다**. ★초판 docstring 의 유일한 예시가 **안 통하는 쪽**이었다(게이트② 지적) ⇒ 예시를 고치고 **「글자 그대로 같아야 한다」를 계약에 박았다**. ※당시 전 이력 trailer **0건**이라 깨진 등재는 없다. ★CI 는 `origin/main..HEAD` 만 보므로 **과거 10건이 main 을 red 로 만들지 않는다** — ★**다만 그것을 «대가가 작다»의 근거로 쓰지 마라**: 새 대가는 정확히 그 PR 범위(다음 base 당김)에서 난다(아래 「잃는 것」).
39+
- ★**잃는 것**: ★**이름은 남고 본문이 비어진 경우는 못 잡는다** · 리네임·이동을 소실과 **구별 못 한다** · ★**trailer 는 우회로다**(사유 필수 + 커밋에 남는 것이 유일한 브레이크 — 더 조이지 않은 것이 판단이다) · ★★**새 red 계급 — main 에도 있는 정의를 지우거나 개명한 브랜치는 «다음 base 당김»에서 red 가 되고, 평범한 리팩터가 trailer 를 달아야 한다**(실례 `37ea5a13` — `at_most_one_bootstrap_methods_attribute` 를 일반화해 치운 브랜치가 base 를 당기자 그 이름이 «떨어졌다»로 잡혔다. ★늘어난 7정의 중 **3이 이 계급**이다) · DoD 블록에 들어가 **로컬 실행에도** 붙는다.
40+
- 검증: `cargo test --all` **583 passed / 0 failed / 1 ignored**(불변 — 제품 코드 무접촉) · `check-dod-ci-parity` → **「OK 두 축 모두 대칭차 0 — 명령 7개 · toolchain 2개로 «둘 다 일치»」**(★CI 잡을 늘렸으므로 DoD 블록도 같이 고쳤다).
41+
- ★후속 추천: ⑴소급 8건 중 upstream 동기(S5~S8) 가 떨어뜨린 `decode_str`·`encode_str` 이 «발견인가 수용된 판단인가»를 그 리니지가 판정(S) — 상세 = `docs/worklog/2026-09-18-merge-dropped-symbols-check.md`.
42+
2643
## [2026-09-18] 「어느 bootstrap argument 가 왜 나빴나」 — ★**대전제 ⓒ 에서 끝난다: 그 일을 하는 축이 이미 떠 있다**(rustjava-adopt-loadable-bootstrap-arguments-diagnostic)
2744
- 무엇을: 채택 제안 `2026-09-17-loadable-bootstrap-arguments#p0` 의 처분(worklog json `adoptedProposals` 기록). ★**코드 0행** — `classfile/src/{error,validation}.rs` **무접촉**.
2845
- ★**제안의 전제는 참이다 — CLI 로 돌려서 봤다**(`main` @ `8c7b473f`): 서로 다른 세 규칙(`LdcDynamicBSMArgPastEnd` 나쁜 argument · `LdcDynamicDuplicateBSM` 중복 속성 · `LdcDynamicOldMajor` 버전 게이트)이 ★**글자 하나 다르지 않은 `java.lang.ClassFormatError: Invalid class file`** 를 낸다.

‎STATE.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@
2222
★**못 보는 것**: **런타임 조립 이름 안 보임**(바닥이지 증명 아님) · `exception(` 만 · 초기화 실패 통과.
2323
★**잃는 것**: DoD **6→7**(~1초 · 초판 32.7초는 `target/` 가지치기로 해소) · ★`.unwrap()` 무접촉(전환은 범위 밖).
2424
★`--all` rc=0 · `dod-ci-parity` **명령 7개** rc=0.
25+
- [rustjava-count-symbols-dropped-from-second-parent-on-resolution] ★★**충돌 해소가 떨어뜨린 정의를 센다 — 그리고 개악 시험이 «내 검사기»의 구멍을 잡았다.** 채택 제안 `2026-09-17-union-restores-silently-dropped-makeconcat#p0`. ★**제품 코드 0줄**(검사기 + 규약 + 기존 워크플로 잡 1).
26+
★**ⓑ 를 먼저 쟀다** — 손실을 재구성해 기존 축 전수(생성기·단일결함 감사·두 스위트·파리티·`git status`·마커) ⇒ ★**전부 green = 아무것도 못 잡는다.** ★조용한 조건은 「떨어진 이름들이 **자기완결**일 때」이고, 한쪽을 통째로 택하는 것이 정확히 그것이다.
27+
★**ⓐ 3건 → «4건»** · ★**ⓒ** 넷째가 **클래스 «안»의 메서드**라 「최상위」만 보면 **4 중 3**만 잡는다 ⇒ 한 단계 중첩까지.
28+
★★**설계 교체**: 「트리==부모1 ⇒ `-s ours` 면제」가 **개악을 삼켜 rc=0** 이 됐다(그게 존재 이유인 실패다) ⇒ **선언(`*` trailer)으로 교체**.
29+
★양방향 전건: 개악 **rc=1 + 이름** · 정상 **rc=0** · trailer **rc=0**/지우면 **rc=1** · 스쿼시 **rc=0** · 실사고에서 **손 분할과 동일**(4 사고 + 2 의도).
30+
★★**[게이트② 승계] 필터가 좁아 «둘째 사고»(`514d5b08`)를 놓쳤다** — 근거 문장이 거짓이었다 — 초판은 **파일 4개를 보고도** findings 0 · rc=0(확장본은 같은 머지에서 **13개**) ⇒ **「theirs 가 바꾼 파일 ∪ 머지가 바꾼 파일」**로 넓혀 ★**둘 다 rc=1**. ★docstring 의 유일한 예시가 **면제되지 않는 형식**이었다 ⇒ 고치고 「출력에서 복사하라」를 계약에 박았다(당시 trailer 0건).
31+
★**오탐 실측 — 이 회차가 직접 돌렸다**(창 `38b0df38..8c7b473f` 83머지): 초판 **8건/19정의** → 확장본 **10건/26정의**. ★늘어난 것은 **7정의**(`514d5b08` 6 + `37ea5a13` 1)이고 ★**진짜 4 · 오탐 3**. ★**시간은 «유의한 증가 없음»이다**(판본 차 ≈0.8s/머지 ↔ 같은 판본 재실행 편차 **2.6배** · 수 출처 = 게이트② 검수 실측 · ★재측 안 함). ★「느리지 않았다」는 틀렸다 — wide 는 narrow 의 상위집합이라 더 싸질 수 없다. ★**잃는 것**: 본문만 빈 경우·리네임을 **못 가른다** · trailer 는 **우회로**이고 **이름이 글자 그대로 대조**된다 · ★★**새 red 계급 — main 에도 있는 정의를 지운 브랜치는 다음 base 당김에서 red 가 된다**(실례 `37ea5a13` · 7 중 3).
32+
★`--all` **583/0/1**(불변) · 파리티 **명령 7개 일치**(DoD 블록 동기).
2533
- [rustjava-adopt-loadable-bootstrap-arguments-diagnostic] ★★**대전제 ⓒ 에서 끝났다 — 그 일을 하는 축(PR #67)이 이미 떠 있다.** 채택 제안 `2026-09-17-loadable-bootstrap-arguments#p0`(worklog json 기록). ★**코드 0행.**
2634
★**전제는 참**(CLI 실행: 세 규칙이 전부 `ClassFormatError: Invalid class file` 동일 문면) — 그러나 ★**편집 영역은 전부 겹친다**(전달된 값은 **3 중 1** — 아래): #67 이 제안 `target` 두 파일을 고치고, 이 술어에 **이미 사유를 주며**, 밋밋한 문면 **두 자리**를 둘 다 고쳤다. ★제안 `tradeoff` 자신이 「두 번 하지 말고 함께 하라」고 적었다.
2735
★**남는 잔여는 좁다** — `&'static str` 이라 **인덱스를 못 담는다** ⇒ 「기대」 달성 · 「인덱스·실제」 미달 ⇒ ★**새 카드를 냈다**(★**M** — 초판 `S` 에서 **실측 후 올렸다**: 잔여도 **같은 3층**을 건너 `target` **5파일/4크레이트**(`classfile`·`jvm-bytecode`·`RustJava`·`test-utils` — ★층 3 ↔ 크레이트 4: 경계 층이 두 크레이트에 걸친다) · `InvalidFormat` 을 넓히면 생성 17 + 매치 11 이라 **새 variant** 를 고르고 **두 갈래의 대가**를 적었다).

0 commit comments

Comments
 (0)