Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,17 @@ jobs:
- uses: actions/checkout@v7
- run: python3 scripts/check-worklog-json.py

# a conflict resolution that drops one side's work leaves no other trace: no marker, mergeable
# CLEAN, suite green. fetch-depth 0 because the check needs the merge commits and their parents,
# which a shallow checkout does not have. One runner, not the matrix.
merge_drops:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- run: python3 scripts/check-merge-dropped-symbols.py

# parity lock: the CLAUDE.md DoD block must reproduce this file's checks (see the script's
# docstring — hand comparison failed five rounds in a row). One runner, not the matrix.
dod_parity:
Expand Down
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
python3 scripts/check-worklog-json.py
python3 scripts/check-dod-ci-parity.py
python3 scripts/check-named-exception-classes-are-loadable.py
python3 scripts/check-merge-dropped-symbols.py
```
★★**이 블록은 이제 «기계가 지킨다» — `scripts/check-dod-ci-parity.py`(CI job `dod_parity`)가
이 코드블록과 `rust.yml` 을 «각각 파싱해» 대칭차를 낸다.** 어긋나면 그 자리에서 red 다.
Expand Down
17 changes: 17 additions & 0 deletions REPORT.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,23 @@
- 검증: `cargo test --all` **rc=0** · `check-dod-ci-parity` **「명령 7개 · toolchain 2개」 rc=0** · `check-worklog-json` rc=0.
- ★후속 추천: ⑴**리터럴이 «아닌» `exception(` 호출부를 세라**(S — 구멍의 크기를 아직 모른다) ⑵**`.unwrap()` → throw 전환**(M · 이 회차가 명시적으로 범위 밖으로 둔 것). 상세 = `docs/worklog/2026-09-18-named-exception-classes-are-loadable.md`.

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

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