Skip to content

Commit 42fb605

Browse files
author
jun0
committed
[rustjava-adopt-link-stringconcatfactory-p2-fix2] docs(state): 회차 기록 · worklog 쌍
1 parent b085591 commit 42fb605

4 files changed

Lines changed: 112 additions & 0 deletions

File tree

‎REPORT.md‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
11
# REPORT
2+
## [2026-09-17] #57 의 버전 표에 이 PR 의 픽스처 25행을 등재한다 — ★**착지 «순서»가 만든 부채** (rustjava-adopt-link-stringconcatfactory-p2-fix2)
3+
- 무엇을: `test-data/class-file-versions.txt` 에 **25행 추가**(생성기 실행 · 손편집 0) + base 당김. ★제품 Rust **0줄** · 픽스처 재생성 **0** · 테스트 코드 **무접촉**.
4+
- 왜: PR **#57** 이 「미등재 픽스처는 핀을 실패시킨다」를 **의도적으로** 세우고 06:37 에 착지했다. #61 의 25개 픽스처는 그보다 **먼저** 만들어졌으므로, 착지한 그 순간부터 표에 25행을 빚졌다. ★**CI 도 충돌도 아니다** — 핀에서 rc=0 CI_GREEN · `git merge origin/main` 코드 충돌 0인데 **합친 결과**가 규율을 어긴다.
5+
- 사용자 영향: **없다**(테스트 데이터 표). 있는 것은 게이트③ 해금.
6+
- ★**안전선 = 삭제행 0**: `git diff --numstat` → **`25 0`**. 기존 156행 무변경 = 픽스처가 재생성되지 않았다는 뜻이다(삭제행이 있었으면 «다른 사건»이라 멈췄을 자리).
7+
- ★**추가 25행 = 이 PR 이 만든 25개 `.class` 와 집합이 «정확히» 같다**(파일명 대조 · 남의 픽스처 혼입 0).
8+
- ★**양방향으로 쟀다**: 표에서 `65.0 indy/LambdaKinds.class` 한 행을 지우면 **red**(그 파일명을 정확히 지목) · 되돌리면 **green** ⇒ 표가 실제로 규율을 집행한다(빈 표로 통과하지 않는다).
9+
- ★**base 당김의 원장 충돌 2건은 «합집합»으로 풀었다** — `REPORT.md`·`STATE.md` 최상단 삽입 충돌. 한쪽 통째 채택 0 · 줄 단위 양방향 보존 증명(양측 고유줄 결손 **0** · 결과에만 있는 줄 **0**). ★코드 충돌은 **0**이었고, 같은 파일(`classfile/src/validation.rs`)을 다투던 #62 의 기여는 자동 병합 뒤에도 **전건 잔존**(loadable 집합 · 서술자 팔 «둘 다» 살아 있다).
10+
- 검증: `cargo test --test test_fixture_pins` **3 passed / 0 failed** · `cargo test --all` **581 / 0 / 1**(#62 착지분 +3) · DoD **7명령 전건 rc=0**.
11+
- ★후속: 「착지한 규율이 진행 중 PR 을 소급으로 빚지게 하는데 아무도 말해 주지 않는다」 — `docs/worklog/2026-09-17-fixture-version-table-backfill.json`.
12+
213
## [2026-09-17] 부트스트랩 정적 인자는 «적재 가능 상수»여야 한다 — 경계에서 «종류»로 (rustjava-adopt-bound-bootstrap-static-arguments-p0)
314
- 무엇을: 채택 제안 `2026-09-16-bound-bootstrap-static-arguments#p0`. ★**제품 동작이 바뀐다** — 인자가 적재 불가 상수를 가리키는 클래스 파일이 **`ClassFormatError`** 로 거부된다.
415
- 왜: JVMS 4.7.23 이 요구하는 것은 «인덱스가 어딘가에 닿는다»가 아니라 ★**「적재 가능 상수」**다(Integer·Float·Long·Double·Class·String·MethodHandle·MethodType·Dynamic).

‎STATE.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44
(없음 — 2026-09-16 실측: 착수 시 진행 티켓 0 · 열린 PR 0. ※「열린 PR 0」은 ★**이 회차 PR 착지 시점 기준**이다 — 회신 시점에는 그 PR 자신이 열려 있다)
55

66
## 완료
7+
- [rustjava-adopt-link-stringconcatfactory-p2-fix2] ★★**#57 의 버전 표에 25행 등재 — 「착지 순서」가 만든 부채를 갚는다(PR #61).**
8+
★**막힌 것은 CI 도 충돌도 아니었다**: 핀 `85cf0fba` 에서 rc=0 CI_GREEN · `git merge origin/main` **코드 충돌 0** 인데
9+
★**합친 결과**가 #57 이 세운 「미등재 픽스처는 핀을 실패시킨다」를 어겼다(미등재 **25건** 재현).
10+
★생성기(`record-class-file-versions.py`)를 **돌려서** 채웠다 — 손편집 0. ★**삭제행 0**(`25 0`) = 기존 픽스처 재생성 0 이 이 회차의 안전선.
11+
★추가 25행이 이 PR 의 25개 `.class` 와 **집합 동일**(혼입 0) · ★**양방향**(한 행 제거 → red · 되돌림 → green).
12+
★원장 충돌 2건은 **합집합**(줄 단위 양방향 보존 · 한쪽 통째 채택 0) · #62 기여 전건 잔존.
13+
★`test_fixture_pins` **3/0** · `--all` **581/0/1** · DoD 7명령 rc=0.
714
- [rustjava-adopt-bound-bootstrap-static-arguments-p0] ★★**부트스트랩 정적 인자 = «적재 가능 상수» — 경계에서 «종류»로.**
815
채택 제안 `2026-09-16-bound-bootstrap-static-arguments#p0`(worklog json `adoptedProposals` 기록). ★**제품 동작 변경 있음.**
916
★**제안이 적은 위험을 먼저 쟀다**(「틀리면 람다가 전부 corrupt」): 태그 검사는 payload 를 읽지 않으므로 `attribute.rs` 설계와 충돌하지 않고,
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{
2+
"schema": "worklog/v1",
3+
"date": "2026-09-17",
4+
"taskId": "rustjava-adopt-link-stringconcatfactory-p2-fix2",
5+
"summary": "PR #61 was blocked at gate 3 by something that is neither CI nor a conflict: at its reviewed pin CI was green and `git merge origin/main` produced zero code conflicts, but the merged result violated a rule that landed while the PR was open. PR #57 landed the class-file-version table plus its deliberate 'a fixture with no row fails the pin' direction at 06:37; the 25 fixtures in #61 predate that, so from that instant the PR owed the table 25 rows. This round ran the recorder and committed those rows.",
6+
"changes": [
7+
"test-data/class-file-versions.txt: +25 rows, written by test-data/src/record-class-file-versions.py (no hand edit) — 156 existing rows untouched",
8+
"merge origin/main: resolved the two ledger conflicts (REPORT.md, STATE.md top-of-file inserts) as a union; zero code conflicts"
9+
],
10+
"verification": [
11+
"reproduced the block first rather than trusting the previous round's number: cargo test --test test_fixture_pins named exactly 25 unrecorded fixtures, all under test-data/indy",
12+
"git diff --numstat test-data/class-file-versions.txt: `25\t0` — zero deletions is the safety line here, since a deletion would mean an existing fixture was regenerated, which is a different event and a stop",
13+
"the 25 added rows are set-identical to the 25 .class files this PR adds (git diff --diff-filter=A 06fa865c 85cf0fba -- test-data), so no sibling's fixture was swept in",
14+
"bidirectional: removing `65.0 indy/LambdaKinds.class` from the table turns committed_fixtures_keep_their_recorded_class_file_version red and names that file; restoring it returns 3 passed / 0 failed — the table is enforcing, not decorative",
15+
"cargo test --test test_fixture_pins after the merge: 3 passed / 0 failed",
16+
"cargo test --all: 581 passed / 0 failed / 1 ignored (578 on the branch alone; +3 from PR #62 landing)",
17+
"DoD all 7 commands rc=0, including `cargo +beta clippy` and the wasm32 target, which the shorthand form of the block used to omit",
18+
"semantic-merge check on the file both PRs touch: classfile/src/validation.rs auto-merged, and diffing the result against 06fa865c shows only this PR's addition — #62's loadable-constant set and this PR's descriptor arms are both present",
19+
"ledger conflict resolution proved line-wise in both directions: zero lines unique to either side missing from the result, zero lines in the result that came from neither side"
20+
],
21+
"issues": [
22+
"The table is a freeze of what is on disk, so running the recorder would launder a corrupted fixture into the 'correct' value. That is why the zero-deletions check is the gate rather than an afterthought.",
23+
"This is a debt payment, not a fix: nothing prevents the next in-flight PR from acquiring the same debt the next time a pin-style rule lands."
24+
],
25+
"adoptedProposals": [],
26+
"proposals": [
27+
{
28+
"title": "Say which open PRs a newly landed repo-wide rule has just put in debt",
29+
"plainSummary": "A rule landed on main can silently make other people's open pull requests fail, and nobody finds out until someone tries to merge one.",
30+
"userBenefit": "None directly. It turns a surprise discovered at merge time into a note made at landing time, so the round that created the debt is the one that sees it.",
31+
"why": "PR #57 deliberately made unlisted fixtures fail the pin — correct, and it said so. But #61 had already built 25 fixtures, so at 06:37 it became red without anyone touching it, and the redness was invisible: #61's own CI was green at its pin, and the merge had no conflicts. It surfaced only when a gate-3 round pulled base, which cost that round its slot and this whole follow-up round. The generalisation is cheap to state and not cheap to notice: any rule of the form 'everything of kind X must also appear in Y' indebts every open PR that adds an X.",
32+
"tradeoff": "Doing this properly means checking out each open PR merged with main and running the new check, which is a full CI matrix per PR for a signal that is often empty. A cheap approximation — 'this PR adds files matching the new rule's glob' — has false positives and would need a person to read it anyway. There is also a real chance the honest answer is that the merge-ticket template already covers it, since pulling base is where this surfaced and that step is already mandatory.",
33+
"effort": "M",
34+
"target": "tests/test_fixture_pins.rs, .github/workflows/rust.yml"
35+
}
36+
]
37+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# 2026-09-17 — 버전 표 25행 백필 (rustjava-adopt-link-stringconcatfactory-p2-fix2)
2+
3+
PR **#61** 이 게이트③에서 막혔는데, 막은 것은 **CI 도 충돌도 아니었다**.
4+
5+
- 검수 핀 `85cf0fba` 에서 `ci-presence` → **rc=0 CI_GREEN**
6+
- `git merge origin/main` → **코드 충돌 0**(원장 2파일만 충돌)
7+
- 그런데 **합친 결과**가 `test_fixture_pins` 의
8+
`committed_fixtures_keep_their_recorded_class_file_version` 을 **red** 로 만든다 — 미등재 **25건**.
9+
10+
## 원인은 형상이 아니라 «시점»이다
11+
12+
PR **#57** 이 `test-data/class-file-versions.txt` 와 함께
13+
「**미등재 픽스처는 핀을 실패시킨다**」를 **의도적으로** 세우고 06:37 에 착지했다
14+
(그 자신의 주석이 「이미 아는 것만 검사하는 핀은 새로 추가된 것을 덮지 못한다」고 적었다 — 옳다).
15+
16+
#61 의 25개 픽스처는 그보다 **먼저** 만들어졌다.
17+
⇒ **#57 이 착지한 그 순간부터 #61 은 표에 25행을 빚졌고, 아무도 그 사실을 말해 주지 않았다.**
18+
19+
## 한 일
20+
21+
```
22+
python3 test-data/src/record-class-file-versions.py → recorded 181 fixtures
23+
git diff --numstat test-data/class-file-versions.txt → 25 0
24+
```
25+
26+
★**`25 0` 의 「0」이 이 회차의 안전선이다.** 생성기는 «지금 디스크에 있는 것»을 기록하므로,
27+
픽스처가 그 사이 오염됐다면 **오염된 값을 정답으로 굳힌다**. 삭제행이 하나라도 있었으면
28+
그것은 「기존 픽스처가 재생성됐다」는 뜻이고 **다른 사건**이라 멈췄을 자리다.
29+
30+
추가된 25행은 이 PR 이 만든 25개 `.class` 파일과 **집합이 정확히 같다**(남의 픽스처 혼입 0).
31+
32+
## 표가 실제로 규율을 집행하는가 — 양방향
33+
34+
| | 결과 |
35+
|---|---|
36+
| 표에서 `65.0 indy/LambdaKinds.class` 한 행 제거 | ★**red** — 그 파일명을 정확히 지목 |
37+
| 되돌림 | ★**green** 3 passed / 0 failed |
38+
39+
한 방향만 쟀으면 「상수 pass 로 바꿔도 통과」를 못 가른다.
40+
41+
## base 당김 — 원장 2파일 합집합
42+
43+
`REPORT.md`·`STATE.md` 의 최상단 삽입 충돌 2건. 한쪽 통째 채택 **0**, 시간순 합집합.
44+
줄 단위 양방향으로 증명했다 — 양측 고유줄 중 결과에 없는 것 **0** · 결과에만 있는 줄 **0**.
45+
46+
★같은 파일(`classfile/src/validation.rs`)을 다투던 **#62** 의 기여는 자동 병합 뒤에도 **전건 잔존**했다
47+
(적재 가능 상수 집합 · 이 PR 의 서술자 팔 — **둘 다** 살아 있고, `06fa865c` 대비 diff 는 이 PR 의 추가분뿐이다).
48+
49+
## 검증
50+
51+
`test_fixture_pins` **3/0** · `cargo test --all` **581 / 0 / 1**(브랜치 단독 578 → #62 착지분 +3) ·
52+
DoD **7명령 전건 rc=0**(`+beta` clippy · wasm32 clippy 포함).
53+
54+
## 남는 것
55+
56+
이건 **부채 상환이지 수리가 아니다** — 다음에 같은 형태의 규율이 착지하면 그때 열려 있는 PR 이
57+
똑같이 조용히 빚을 진다. 그 축은 제안 `#p0` 으로 남겼다.

0 commit comments

Comments
 (0)