Skip to content

Commit c7d9ab2

Browse files
author
jun0
committed
[rustjava-count-symbols-dropped-from-second-parent-on-resolution-fix3] docs: 「0 file(s) examined」를 실측 4 로 고치고 「느리지 않았다」를 노이즈 서술로 바꾼다
1 parent 290ad15 commit c7d9ab2

5 files changed

Lines changed: 28 additions & 15 deletions

File tree

‎REPORT.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
- ★**의도/사고 분리 = 커밋 trailer** `Dropped-from-theirs: <name> -- <why>` ⇒ ★**자기 커밋 하나만 면제**하므로 티켓이 경고한 「영구 목록이 검사기를 무력화한다」가 **구조적으로 불가능**하다.
1010
- ★★**설계를 한 번 갈아엎었다**: 초판의 «트리 == 부모1 이면 `-s ours` 로 보고 건너뛴다» 구조 면제가 ★**개악 시험에서 theirs 를 통째로 버린 머지까지 삼켜 rc=0** 이 됐다 — 그게 이 검사기의 존재 이유인 실패다 ⇒ **면제를 «선언»(`*` 와일드카드)으로 교체**. ★양방향을 안 돌렸으면 **끈 채로 착지**했다.
1111
- ★**합격선 양방향 전건**: ⒜개악 **rc=1 + 이름을 말한다** · ⒝정상 **rc=0** · ⒞trailer **rc=0**, 지우면 **rc=1** · ⓓ스쿼시 **rc=0** · ★실사고에서 **손으로 찾은 것과 같은 분할**(생성기 4 사고 + `.rs` 2 의도)을 기계가 낸다.
12-
- ★★**[게이트② 승계] 필터가 너무 좁아 «둘째 사고»를 놓쳤다 — 넓혔다.** 초판은 「theirs 가 건드린 파일만」 봤고 그 근거 문장이 **거짓**이었다(`514d5b08` 이 같은 넷을 떨어뜨렸는데 ★**`0 file(s) examined` rc=0**). ⇒ 술어를 **「theirs 가 바꾼 파일 ∪ 머지가 바꾼 파일」**로 넓혀 ★**두 사고 «둘 다» rc=1**. ★좁힌 채 두면 「없는 보장을 있다고 적는」 형태가 된다(#67 F1 과 같은 형태).
13-
- ★**오탐을 세었다 — ★이 회차가 «직접» 돌린 값이다**(인용 아님 · 창 `38b0df38..8c7b473f` = 83머지): 초판 **8건/19정의** → ★**확장본 10건/26정의**. ★**늘어난 것은 26이 아니라 «7정의»**(`514d5b08` 6 + `37ea5a13` 1)이고, ★**7 중 진짜 소실 4 · 오탐 3**(아래). ★**시간은 대가가 아니다** — 같은 창에서 확장본이 초판보다 **느리지 않았다**(종전 「4.4초/머지」는 넓힘의 비용이 아니다).
12+
- ★★**[게이트② 승계] 필터가 너무 좁아 «둘째 사고»를 놓쳤다 — 넓혔다.** 초판은 「theirs 가 건드린 파일만」 봤고 그 근거 문장이 **거짓**이었다 — `514d5b08` 이 같은 넷을 떨어뜨렸는데 초판은 ★**파일 «4개»를 보고도 findings 0 · rc=0** 으로 통과시켰다(확장본은 같은 머지에서 **13개**를 보고 그 넷을 짚는다 · 세 판본에 `check()` 를 직접 불러 잰 값). ⇒ 술어를 **「theirs 가 바꾼 파일 ∪ 머지가 바꾼 파일」**로 넓혀 ★**두 사고 «둘 다» rc=1**. ★좁힌 채 두면 「없는 보장을 있다고 적는」 형태가 된다(#67 F1 과 같은 형태).
13+
- ★**오탐을 세었다 — ★이 회차가 «직접» 돌린 값이다**(인용 아님 · 창 `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초/머지」 삭제는 **유지**한다.
1414
- ★**trailer 이름은 «출력에서 복사»해야 한다** — `method fieldref` 는 통하고 `Pool.fieldref` 는 **안 통한다**. ★초판 docstring 의 유일한 예시가 **안 통하는 쪽**이었다(게이트② 지적) ⇒ 예시를 고치고 **「글자 그대로 같아야 한다」를 계약에 박았다**. ※당시 전 이력 trailer **0건**이라 깨진 등재는 없다. ★CI 는 `origin/main..HEAD` 만 보므로 **과거 10건이 main 을 red 로 만들지 않는다** — ★**다만 그것을 «대가가 작다»의 근거로 쓰지 마라**: 새 대가는 정확히 그 PR 범위(다음 base 당김)에서 난다(아래 「잃는 것」).
1515
- ★**잃는 것**: ★**이름은 남고 본문이 비어진 경우는 못 잡는다** · 리네임·이동을 소실과 **구별 못 한다** · ★**trailer 는 우회로다**(사유 필수 + 커밋에 남는 것이 유일한 브레이크 — 더 조이지 않은 것이 판단이다) · ★★**새 red 계급 — main 에도 있는 정의를 지우거나 개명한 브랜치는 «다음 base 당김»에서 red 가 되고, 평범한 리팩터가 trailer 를 달아야 한다**(실례 `37ea5a13` — `at_most_one_bootstrap_methods_attribute` 를 일반화해 치운 브랜치가 base 를 당기자 그 이름이 «떨어졌다»로 잡혔다. ★늘어난 7정의 중 **3이 이 계급**이다) · DoD 블록에 들어가 **로컬 실행에도** 붙는다.
1616
- 검증: `cargo test --all` **583 passed / 0 failed / 1 ignored**(불변 — 제품 코드 무접촉) · `check-dod-ci-parity` → **「OK 두 축 모두 대칭차 0 — 명령 7개 · toolchain 2개로 «둘 다 일치»」**(★CI 잡을 늘렸으므로 DoD 블록도 같이 고쳤다).

‎STATE.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
★**ⓐ 3건 → «4건»** · ★**ⓒ** 넷째가 **클래스 «안»의 메서드**라 「최상위」만 보면 **4 중 3**만 잡는다 ⇒ 한 단계 중첩까지.
1313
★★**설계 교체**: 「트리==부모1 ⇒ `-s ours` 면제」가 **개악을 삼켜 rc=0** 이 됐다(그게 존재 이유인 실패다) ⇒ **선언(`*` trailer)으로 교체**.
1414
★양방향 전건: 개악 **rc=1 + 이름** · 정상 **rc=0** · trailer **rc=0**/지우면 **rc=1** · 스쿼시 **rc=0** · 실사고에서 **손 분할과 동일**(4 사고 + 2 의도).
15-
★★**[게이트② 승계] 필터가 좁아 «둘째 사고»(`514d5b08`)를 놓쳤다** — 근거 문장이 거짓이었다(`0 file(s) examined` rc=0) ⇒ **「theirs 가 바꾼 파일 ∪ 머지가 바꾼 파일」**로 넓혀 ★**둘 다 rc=1**. ★docstring 의 유일한 예시가 **면제되지 않는 형식**이었다 ⇒ 고치고 「출력에서 복사하라」를 계약에 박았다(당시 trailer 0건).
16-
★**오탐 실측 — 이 회차가 직접 돌렸다**(창 `38b0df38..8c7b473f` 83머지): 초판 **8건/19정의** → 확장본 **10건/26정의**. ★늘어난 것은 **7정의**(`514d5b08` 6 + `37ea5a13` 1)이고 ★**진짜 4 · 오탐 3**. ★**시간은 대가가 아니다**(확장본이 더 느리지 않았다). ★**잃는 것**: 본문만 빈 경우·리네임을 **못 가른다** · trailer 는 **우회로**이고 **이름이 글자 그대로 대조**된다 · ★★**새 red 계급 — main 에도 있는 정의를 지운 브랜치는 다음 base 당김에서 red 가 된다**(실례 `37ea5a13` · 7 중 3).
15+
★★**[게이트② 승계] 필터가 좁아 «둘째 사고»(`514d5b08`)를 놓쳤다** — 근거 문장이 거짓이었다 — 초판은 **파일 4개를 보고도** findings 0 · rc=0(확장본은 같은 머지에서 **13개**) ⇒ **「theirs 가 바꾼 파일 ∪ 머지가 바꾼 파일」**로 넓혀 ★**둘 다 rc=1**. ★docstring 의 유일한 예시가 **면제되지 않는 형식**이었다 ⇒ 고치고 「출력에서 복사하라」를 계약에 박았다(당시 trailer 0건).
16+
★**오탐 실측 — 이 회차가 직접 돌렸다**(창 `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).
1717
★`--all` **583/0/1**(불변) · 파리티 **명령 7개 일치**(DoD 블록 동기).
1818
- [rustjava-adopt-loadable-bootstrap-arguments-diagnostic] ★★**대전제 ⓒ 에서 끝났다 — 그 일을 하는 축(PR #67)이 이미 떠 있다.** 채택 제안 `2026-09-17-loadable-bootstrap-arguments#p0`(worklog json 기록). ★**코드 0행.**
1919
★**전제는 참**(CLI 실행: 세 규칙이 전부 `ClassFormatError: Invalid class file` 동일 문면) — 그러나 ★**편집 영역은 전부 겹친다**(전달된 값은 **3 중 1** — 아래): #67 이 제안 `target` 두 파일을 고치고, 이 술어에 **이미 사유를 주며**, 밋밋한 문면 **두 자리**를 둘 다 고쳤다. ★제안 `tradeoff` 자신이 「두 번 하지 말고 함께 하라」고 적었다.

‎docs/worklog/2026-09-18-merge-dropped-symbols-check.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
"run against the real incident, the check reproduces by machine the same split the -fix3 round found by hand: 4 accidental drops in the generator plus 2 intentional test-function removals in tests/test_class_format.rs",
1919
"cargo test --all: 583 passed / 0 failed / 1 ignored, unchanged — no product code touched",
2020
"check-dod-ci-parity: OK, 7 commands and 2 toolchains matching on both sides after the wiring",
21-
"GATE 2 found the filter too narrow and this round widened it. The original looked only at files the merged-in branch changed, on the stated grounds that 'only files the merged-in branch actually changed can have lost its work' — which is false, and the repo's own second incident proves it: 514d5b08 dropped the same four definitions as e53b2142, and the narrow filter reported '0 file(s) examined', rc=0. The predicate is now every file that either the merged-in branch or the merge itself changed, and both incidents report rc=1 with the same six names.",
21+
"GATE 2 found the filter too narrow and this round widened it. The original looked only at files the merged-in branch changed, on the stated grounds that 'only files the merged-in branch actually changed can have lost its work' — which is false, and the repo's own second incident proves it: 514d5b08 dropped the same four definitions as e53b2142, and the narrow filter examined 4 files, found 0 and returned rc=0 (the wide filter examines 13 on the same merge). It was not blind: it read four files and none of them was where the loss landed. The predicate is now every file that either the merged-in branch or the merge itself changed, and both incidents report rc=1 with the same six names.",
2222
"The docstring's only worked example did not work. It wrote `Dropped-from-theirs: Pool.fieldref` while the check prints `method fieldref` and matches literally, so anyone following the example got no exemption. Verified both ways on a synthetic merge: the name copied from the output exempts (rc=0), the prettier form does not (rc=1). The example now uses the printed form and the docstring states that the name must be copied from the check's own output character for character."
2323
],
2424
"issues": [
25-
"FALSE POSITIVE RATE, measured by this round by running both versions over one window of 83 merges (38b0df38..8c7b473f, the last 200 commits of origin/main at the time): the check as first written flags 8 merges / 19 definitions; the widened file filter flags 10 / 26. An earlier draft of this file said 45; that number was wrong and never came out of this implementation. The narrow version reproducing 19 exactly, in the same run, is what makes the measurement trustworthy. The seven extra definitions come from two merges, 514d5b08 (six) and 37ea5a13 (one), and they split four to three: four are the second of the two real incidents, restored later and present in the tree today; three are a branch having removed a definition main still had (two tests deleted on purpose by 0f517567, one predicate generalised by 1da1379e). So the honest rate is 4 of 7 found and 3 of 7 false, not 6 and 1. The widened version was no slower than the narrow one in that window, so time is not the cost of widening; reading is. A pull request usually contains 0-2 internal merges. CI only walks origin/main..HEAD, so historical merges are never re-examined and do not turn main red -- but that is not a reason to call the cost small, because the new cost lands in exactly that range, on the next base pull of an open branch.",
25+
"FALSE POSITIVE RATE, measured by this round by running both versions over one window of 83 merges (38b0df38..8c7b473f, the last 200 commits of origin/main at the time): the check as first written flags 8 merges / 19 definitions; the widened file filter flags 10 / 26. An earlier draft of this file said 45; that number was wrong and never came out of this implementation. The narrow version reproducing 19 exactly, in the same run, is what makes the measurement trustworthy. The seven extra definitions come from two merges, 514d5b08 (six) and 37ea5a13 (one), and they split four to three: four are the second of the two real incidents, restored later and present in the tree today; three are a branch having removed a definition main still had (two tests deleted on purpose by 0f517567, one predicate generalised by 1da1379e). So the honest rate is 4 of 7 found and 3 of 7 false, not 6 and 1. On time, the honest statement is that there is no significant increase, not that it is no slower: three independent runs of the narrow version over this window span 229s/286.8s/585.3s, a factor of 2.6, while the difference between versions in one back-to-back run was 70s over 83 merges, about 0.8s per merge (all four numbers come from gate-2 measurements; this round deliberately did not re-run them, because re-running produces a fourth different number and that is the point). The wide file set is a superset of the narrow one -- 4 files versus 13 on 514d5b08 -- so it cannot be structurally cheaper. The cost of widening is reading, not waiting: a pull request carries 0-2 internal merges. A pull request usually contains 0-2 internal merges. CI only walks origin/main..HEAD, so historical merges are never re-examined and do not turn main red -- but that is not a reason to call the cost small, because the new cost lands in exactly that range, on the next base pull of an open branch.",
2626
"WHAT IT CANNOT SEE: a definition whose name survives while its body is emptied or gutted. The check compares name sets, so 'still there but no longer does anything' passes. It also cannot tell a genuine rename from a drop-plus-add, and a move between files reads as a drop in the old file.",
2727
"THE TRAILER IS A BYPASS, and deliberately so: anyone in a hurry can write one and move on. The only brake is that a reason is required by the format and the trailer is visible in the merge commit. That is weaker than a gate and stronger than nothing; making it harder was judged over-design for a check with no track record yet.",
2828
"Two of the flagged historical merges are the known incident. The rest are upstream-sync merges (S5-S8) and one `-s ours` ancestry record. The sync ones genuinely dropped upstream methods — decode_str and encode_str are absent from the whole result tree, not moved, which was checked — so whether they are findings or accepted judgements is for the sync lineage to say, not this round.",

‎docs/worklog/2026-09-18-merge-dropped-symbols-check.md‎

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ Dropped-from-theirs: * -- recorded as a merged ancestor only, our tree is author
8484

8585
초판은 **theirs 가 건드린 파일만** 봤고, 그 근거로 「`Only files the merged-in branch actually changed can have
8686
lost its work`」라 적었다. ★**그 문장이 거짓이고, 이 repo 자신의 «둘째» 사고가 반증한다**:
87-
`514d5b08` 은 `e53b2142` 와 **같은 넷**을 떨어뜨렸는데 초판 검사기는 ★**`0 file(s) examined` · rc=0** 으로 통과시켰다.
87+
`514d5b08` 은 `e53b2142` 와 **같은 넷**을 떨어뜨렸는데 초판 검사기는 ★**파일 «4개»를 examine 하고도 findings 0 · rc=0** 으로 통과시켰다(확장본은 같은 머지에서 **13개**를 보고 그 넷을 짚는다).
8888
⇒ ★**해소가 «상대가 건드리지도 않은» 파일을 되돌리는 것** — 「A 충돌 풀다가 B 를 되돌려 놨다」 — 이 검사기의
8989
**존재 이유 그대로의 실패**인데 못 봤다.
9090

@@ -104,8 +104,15 @@ lost its work`」라 적었다. ★**그 문장이 거짓이고, 이 repo 자신
104104
★**앵커** — 같은 스크립트·같은 창에서 초판이 **19 를 글자 그대로** 낸다(측정기가 옳다는 증거).
105105
★**늘어난 것은 «26»이 아니라 «7정의»다** — `514d5b08` **6** + `37ea5a13` **1**. 그게 넓힘의 실제 크기다.
106106
★★**그 7의 성격을 하나씩 판정했다 — 진짜 소실 «4» · 오탐 «3»**(아래 표). 종전 판까지 적혀 있던 **45** 는 **틀린 수**였다.
107-
★**시간은 대가가 아니다** — 같은 창·같은 부하에서 **확장본이 초판보다 느리지 않았다**.
108-
종전 「4.4초/머지」는 두 판본 다에 대해 낡았고, ★**넓힘의 비용처럼 읽히게 두면 안 된다**(비용은 시간이 아니라 «읽을 것»이다).
107+
★★**시간 — 「느리지 않았다」로 적지 않는다. 측정 노이즈가 판본 차이보다 «크다».**
108+
같은 창에서 초판을 **독립 3회** 돌린 값이 **229s / 286.8s / 585.3s** 로 ★**2.6배**까지 벌어진다
109+
(229s 는 게이트² fix2 검수자 실측 · 286.8s 는 그 앞 검수 · 585.3s 는 이 리니지 fix2 회차 · ★**이 회차는 다시 재지 않았다** —
110+
재면 네 번째 다른 수가 나올 뿐이고 그것이 이 지적의 요지다).
111+
한편 판본 차이는 **연속 실행 한 회차에서 70s / 83머지 ≈ 0.8s/머지**였다(같은 검수자 실측 · narrow 229s ↔ wide 299s).
112+
⇒ ★**「유의한 비용 증가 없음」이 맞는 문장이고, 「비용 없음」은 아니다.** ★그리고 wide 의 파일 집합은 narrow 의 **상위집합**이라
113+
(`514d5b08` 에서 4 → 13) ★**구조적으로 더 싸질 수 없다** — 「느리지 않았다」는 방향부터 틀렸다.
114+
종전 「4.4초/머지」를 지운 것은 **옳다**(재현 안 되는 수였다) — ★다만 그 자리에 **새 단정**을 넣은 것이 이번 반려 사유였다.
115+
★**대가는 시간이 아니라 «읽을 것»이다**: PR 하나의 내부 머지는 보통 **0~2건**이다.
109116
★**CI 는 `origin/main..HEAD`(= PR 범위)만 본다** — 과거 10건이 main 을 red 로 만들지는 않는다.
110117
★★**그러나 그것을 «대가가 작다»의 근거로 쓰지 마라** — 새 대가는 정확히 그 PR 범위에서, 다음 base 당김에 난다(아래 「잃는 것」).
111118

@@ -144,7 +151,7 @@ lost its work`」라 적었다. ★**그 문장이 거짓이고, 이 repo 자신
144151
※**오늘 실제로 red 인 살아 있는 PR 은 0건**이다(열린 PR = 이 PR 하나 · 그 범위는 rc=0) — ★그러나 그것은
145152
«오늘의 값»이지 계급의 소멸이 아니다.
146153
- ★**머지마다 몇 초가 붙는다** · DoD 블록에도 들어가 **로컬 실행에도** 붙는다.
147-
★단 **넓힘이 그 시간을 늘리지는 않았다**(위 ⒟ — 확장본이 초판보다 느리지 않았다).
154+
★단 **넓힘의 시간 비용은 «유의하지 않다»**(위 ⒟ — 판본 차이 ≈0.8s/머지 ↔ 같은 판본 재실행 편차 2.6배). ★「늘지 않았다」가 아니다.
148155

149156
## CI 배선
150157

0 commit comments

Comments
 (0)