Skip to content
24 changes: 22 additions & 2 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,8 +22,28 @@
**검증기로 막을 수 없다.** ⇒ 이 조항은 **1차 방어**이며 **최종 방어는 diff 검토**다.

## Definition of Done
- `cargo fmt --check` · `cargo clippy` · `cargo test` · `python3 scripts/check-worklog-json.py`
전부 green(명령 상세 = `AGENTS.md`).
- ★**`.github/workflows/rust.yml` 이 «치는 그대로» 전부 green** — 축약하지 말고 이 여섯 줄을 그대로 쳐라:
```
cargo fmt --all -- --check
cargo clippy --all -- -D warnings
cargo +beta clippy --all -- -D warnings
cargo clippy --workspace --exclude test-utils --target wasm32-unknown-unknown -- -D warnings
cargo test --all
python3 scripts/check-worklog-json.py
```
★★**`+beta` 줄을 빼지 마라 — CI 는 이 검사들을 «6셀»(toolchain 2 × OS 3)로 친다.**
`rust.yml` 의 `strategy.matrix.rust = [stable, beta]` 가 그 차원이고, 이 repo 엔 `rust-toolchain.toml` 이
**없어** 맨 `cargo` 는 **stable 1개**로만 돈다. ⇒ ★**toolchain 축을 안 적으면 「rust.yml 이 치는 그대로」가 «거짓»이 된다.**
★**실측 근거**(2026-09-04): `#[allow(clippy::double_must_use)]` **9곳을 전건 지우면**
★**stable clippy 는 0인데 beta clippy 는 RED**(★**rc=101** · `double_must_use` 진단 **6**건 —
전건 `jvm/src/jvm.rs:140·404·438·779·791·1016` · cargo 요약 줄이 「due to **6** previous errors」라고 말한다)
⇒ ★**그 자산의 그물은 «beta 축»에만 있다.**
★★**축약본도 쓰지 마라 — 그것이 2026-09-04 에 실제로 구멍을 만들었다.** 종전 문안은
`cargo fmt --check`·`cargo clippy`·`cargo test` 로 줄여 적어 ★**wasm32 줄이 통째로 빠져 있었고**,
그 줄이 ★**`--exclude <크레이트 이름>` 이 사는 «유일한» 자리**다. ⇒ upstream 이 `test_utils` 를
`test-utils` 로 개명(S8)했을 때 **로컬에서는 어떤 명령으로도 드러나지 않고 CI 에서만** 빨개졌다.
⇒ ★**CI 가 검사를 늘리거나 «매트릭스 차원»을 바꾸면 이 블록도 «같이» 고쳐라**(아래 재개 조건이 둘 다 센다).
※OS 축(3종)은 로컬에서 재현할 수 없다 — ★**그 차원만은 CI 가 유일한 그물이고, 그것은 «알고 두는» 값이다.**
- 착수·완료마다 STATE.md 의 "진행중/완료/다음" 을 갱신하고, 완료 시 REPORT.md 상단에
`[YYYY-MM-DD]` 요약 3줄(무엇을·왜·사용자 영향) + 후속 추천을 append 한다.
- ★**후속 추천을 적었으면 `docs/worklog/YYYY-MM-DD-<slug>.{md,json}` 한 쌍도 남긴다** —
Expand Down
43 changes: 43 additions & 0 deletions REPORT.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,48 @@
# REPORT

## [2026-09-04] 「우리 자산이 낡는다」 상시 조항 판정 — 넣지 않고 «구멍 하나»를 막았다 (rustjava-sync-contract-standing-clause-for-our-assets-going-stale)
- 무엇을: 운영자 채택 제안 ★**셋**(`2026-09-04-upstream-sync-s6#p1` · `…-s7#p1` · ★`…-s8#p0`)에 대한 **결정**이다.
(★**[fix3 정정] 초판은 「둘」** — 같은 제안의 세 번째 판이 도착해 `adoptedProposals` 는 **세 ref** 다.)
★**결론: 상시 조항을 «넣지 않는다».** 대신 ★**로컬 DoD 가 CI 의 «매트릭스»를 재현하지 않던 것**을 고쳤다 —
`CLAUDE.md` DoD 가 이제 **CI 명령 5줄 + toolchain 축 1줄 = «6줄»**을 축약 없이 싣는다.
★**코드(`.rs`) 변경 0** · 규범 문서 **2파일**(`CLAUDE.md` · `docs/upstream-sync-approach.md`) + 기록 문서 4
(`REPORT.md` · `STATE.md` · 워크로그 `.md`/`.json`).
★**[게이트② 정정] 초판은 「CI 검사 5종 중 wasm32 clippy 한 줄」이라 적었다** — 계수 «1» 시절 문면이고,
계수 **2** 정정 후에는 **두 축**(target · toolchain)이라 DoD 도 **6줄**이다.
- 왜: ★**목록 문서화로 시작하지 않고 «먼저 셌다»**(티켓이 그렇게 요구했다). 우리 자산 **8건**을
★**돌연변이로 깨뜨려** 무엇이 잡는지 실측했다 — 경로 문자열·`setProperty` 서술자·charset 라우팅·
`ClassFormatError` 종류 단정은 **`cargo test` RED**, 수동 span 은 **clippy RED**,
`double_must_use` allow 는 **깨져도 무해**, 워크로그 스크립트는 **로컬 DoD 와 CI 둘 다** 잡는다.
⇒ ★★**[게이트② `request-changes` 정정] 「아무것도 없음」은 «2개»다**(② CI `--exclude` · ⑦ `double_must_use` allow).
초판이 ⑦을 «비하중» 자리에서 재 「무해」로 적었으나, ★**9곳 전건 삭제로 재측정하면 stable 0 · ★beta RED**(rc=101 · 진단 **6**건)
⇒ ⑦의 그물도 **CI 만**이다. ⇒ ★**「1개면 그 하나를 고쳐라」 규칙은 적용되지 않는다.**
★★**게다가 그 1개도 «조용히» 실패하지 않는다** — cargo 가 `warning: excluded package(s) … not found`
를 찍고 빌드가 깨진다 ⇒ ★**문제는 «침묵»이 아니라 «늦음»**(push 후 CI 에서만)이고,
★**근인은 「자산 목록이 없다」가 아니라 «로컬 DoD 가 CI «매트릭스»를 재현하지 않는다»** 였다 —
②는 빠진 `- run:` 줄(**target** 축) · ⑦은 빠진 **toolchain** 축(beta) ⇒ ★**한 근인의 두 얼굴**이다.
⇒ ★**결론은 그대로 「넣지 않는다」이나 논거가 바뀌었다**: 근인 하나를 고치면 둘 다 그물을 얻는다
(DoD 에 `cargo +beta clippy` 를 넣자 ⑦이 **로컬에서 RED**(rc=101 · 진단 **6**건)로 잡힌다 · 실측).
- 사용자 영향: 런타임 동작 **무변경**. 회차가 로컬에서 CI 와 **같은 6줄**(★**toolchain 축 포함**)을 돌리게 되어
★**「로컬 green 인데 CI red」 부류가 이 축에서 사라진다**(S5·S7·S8 이 실제로 그 부류였다).
- 검증: **DoD 6줄을 문면 그대로** 실행 — 전건 **rc=0**(★`cargo +beta clippy --all -- -D warnings` **rc=0** 포함) ·
`cargo test --all` **554 / 0 / 1**(baseline 동수 · 새 red 0). ★**돌연변이는 전부 복구**했고 `.rs` 변경은 **0**이다.
- ★★**사료 — 「세 번」·「두 방향」을 확정하되 결론은 «한 조항으로 못 덮는다»**:
S3(문구 단정 3건 · 테스트) · S5(io 5곳 · 테스트) · S6(regex 3곳 · 정독) = **⑴신규/판본 교체** ·
S7(우리 테스트 5곳 · **컴파일**) = **⑵공용 API 변경** · S8(`rust.yml`·경로 4곳 · **CI만/테스트**) = **⑶개명**.
⇒ ★**잡는 그물이 각각 다르므로**, 조항 하나로 덮으면 **이미 그물이 있는 여섯 자리에까지 사람 확인을 얹게 된다**
(★**세는 법**: 돌연변이 표 **8행** − 그물이 「CI 만」인 **2행**(② · ⑦) = **6** · 명령은 `docs/upstream-sync-approach.md` §4.
★**[게이트② 정정] 초판의 「다섯」은 계수 «1» 시절의 파생 수였다** — 계수가 2 가 되며 **6**이 맞다).
- ★★**재개 조건**(결정에 재개 조건이 없으면 «영구 종결»로 읽힌다):
「**CI 가 치는 검사 중 로컬 DoD 에 없는 것이 1건이라도 생기면 다시 연다**」 ·
★**세는 명령을 `docs/upstream-sync-approach.md` §4 에 박았고, 정정으로 «축이 둘»이 됐다**
(축① `- run:` 줄 · ★축② **toolchain 매트릭스**) · ★**오늘의 값 = 축① 0 · 축② 0**(착수 시 축① 5 · 축② 1).
★세 돌연변이로 **각 축이 «자기 자리»에서만 반응**함을 실측했다.
- ★★**[정정] 초판 후속 추천 3번을 «철회한다»** — 「`double_must_use` allow 가 이제 지워도 통과한다」는
**비하중 돌연변이에서 나온 거짓**이다. ★**9곳을 전건 지우면 beta clippy 가 RED 다**(rc=101 · 진단 **6**건) ⇒ ★**지우지 마라.**
- 후속 추천: ⑴**게이트③은 `--merge`**(등재 repo). ⑵★**upstream 동기 «정기 축» 판정은 아직 열려 있다**
(S8 워크로그 `proposals[1]` · behind 0 인 지금이 적기다) — 이 회차는 그것을 «건드리지 않았다».
⑶★**C7 고지**: DoD 블록 «개악»과 **OS 축 3종**은 이 대조가 못 잡는다 — 회차가 두 축을 «실제로 돌렸는지» 적어라.

## [2026-09-04] upstream 동기 S8 — 컷 `bd42427` 개명 스윕 · ★**behind 0** (rustjava-upstream-sync-s8-rename-sweep-decision)
- 무엇을: upstream `bd42427` 까지 **12커밋**(crates.io 공개 준비 개명 스윕)을 `--merge` 로 흡수하고 충돌 **8건**을 해소했다.
★★**`merge-base` `ba5797b` → `bd42427` · behind `12` → ★`0`** · 부모 **2개**
Expand Down
39 changes: 39 additions & 0 deletions STATE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,45 @@
(25번째 run, 앞선 24건 전부 red). **PR 대기 — 게이트③ 미착지.**

## 완료
- [rustjava-sync-contract-standing-clause-for-our-assets-going-stale] ★**「우리 자산이 낡는다」 상시 조항
«판정» — 결론: ★★넣지 «않는다». 대신 «구멍 하나»(로컬 DoD 가 CI 매트릭스를 재현하지 않던 것)를 막았다.**
★코드(`.rs`) 변경 0 · 규범 문서 2 + 기록 문서 4.
★**먼저 셌다(목록 문서화로 시작하지 않았다)**: 자산 8건을 **돌연변이로 깨뜨려** 무엇이 잡는지 쟀다 —
경로 문자열·`setProperty` 서술자·charset 라우팅·`ClassFormatError` 단정은 **`cargo test` RED** ·
수동 span 은 **clippy RED** · `double_must_use` allow 는 **깨져도 무해** · 워크로그 스크립트는 **로컬+CI 둘 다**.
⇒ ★★**[게이트② 정정] 「아무것도 없음」은 «1개»가 아니라 «2개»**(② CI `--exclude` · ⑦ `double_must_use` allow) —
초판이 ⑦을 «비하중» 자리(중복 crate-level attribute 1곳)에서 재 「무해」로 적었고, ★**9곳 전건 삭제로 재측정하면
stable 0 · ★beta RED**(rc=101 · 진단 **6**건)이라 ⑦의 그물도 **CI 만**이다. ⇒ 「1개면 그 하나를 고쳐라」 규칙은 **적용되지 않는다**.
★**결론은 그대로 「넣지 않는다」이나 논거를 다시 세웠다**: ②와 ⑦은 «한 근인의 두 얼굴»이다 —
★**로컬 DoD 가 CI «매트릭스»를 재현하지 않는다**(② = 빠진 `- run:` 줄 = target 축 · ⑦ = 빠진 toolchain 축).
⇒ 근인 하나를 고치니 둘 다 그물을 얻었다(DoD 에 `cargo +beta clippy` 추가 ⇒ ⑦이 **로컬에서 RED**(rc=101 · 진단 **6**건)로 잡힌다).
★★**근인은 「자산 목록이 없다」가 아니었다** — ★**로컬 DoD 가 CI 검사 5종 중 «wasm32 clippy» 한 줄을 빠뜨렸고**
그 줄이 그 자산이 사는 **유일한 자리**다. ⇒ `CLAUDE.md` DoD 가 이제 ★**CI 명령 5줄 + toolchain 축 1줄 = «6줄»**을
축약 없이 싣는다(★**[게이트② 정정] 「5줄」은 계수 «1» 시절 수다 — 빠진 것은 «줄 하나»가 아니라 «두 축»이었다**).
★그리고 ②는 «조용히» 실패하지도 않는다(`excluded package(s) not found` + 빌드 실패) ⇒ 문제는 침묵이 아니라 **늦음**이다.
★**재개 조건은 «축 둘»이다**(정정): **축① `- run:` 줄** · ★**축② toolchain 매트릭스** — 세는 명령 둘 다 §4 에 박았다.
★**오늘의 값 = 축① 0 · 축② 0**(착수 시 축① **5** · 축② **1**). ★세 돌연변이(beta 제거·nightly 추가·`- run:` 추가)로
★**각 축이 «자기 자리»에서만 반응함을 실측**했다. ★**C7 고지**: DoD 블록 «개악»과 **OS 축 3종**은 이 대조가 못 잡는다.
⇒ ★★**[게이트② 2차 정정 · fix2] 「고쳤다고 «신고»한 것이 산출물에 남아 있었다」 — 두 건.**
⑴「다섯 → 여섯」 통일이 ★**4자리 중 1자리**만 됐다 ⑵워크로그 `.json` `verification` 이 ★**diff 에 한 줄도 없이**
철회된 라벨(「beta 도 ok — 깨져도 무해」)을 «검증 기록» 필드에 그대로 싣고 있었다.
★**전문 검색으로 반려 밖에서 «더» 찾았다**: 「CI 명령 5줄」 파생 수 **6자리** · 워크로그 재개 조건 블록이
«축① 만» 실은 것 · 워크로그 검증 표에 `+beta` 행이 없던 것. ⇒ ★**전건 동기 + 마감 절차 3줄을 §4 에 규율로 박았다.**
⇒ ★★**[게이트② 3차 정정 · fix3] ⑴수 라벨 「beta error 7」이 «거짓»이었다 — 착지본 «18자리» 전건 정정.**
실측(9곳 삭제 → `cargo fmt --all` → beta clippy): ★**rc=101 · `double_must_use` 진단 «6»건**
(전건 `jvm/src/jvm.rs:140·404·438·779·791·1016`) · cargo 요약 줄이 「due to **6** previous errors」라 말한다.
★**「7」은 `grep -c '^error'`(진단 6 + 요약 줄 1)의 값**이고 그 필드가 내건 정의가 아니었다 ⇒ ★**화해 문장 철회.**
★**「6」은 «하한»이다** — `jvm-bytecode` 가 `jvm` 에 의존해 jvm 이 깨지면 그 크레이트는 **린트되지 않는다**.
⑵잔존 4건(워크로그 「문서 2파일」 2자리 · json `title` · 「채택 제안 둘」 3자리) + ★**PR 제목**까지 동기.
⑶★**«5건째»를 스스로 찾았다**(`changes[0]`) — ★**필터 걸린 sweep 이 «거짓 0»을 냈기 때문**이고(zsh 단어분할),
그 교훈을 §4 마감 절차 **4번**으로 박았다.
★게이트③ 완료: PR #25 — ★★**`--merge` 착지**(★`--squash` 아님 · 등재 repo `contracts/upstream-sync-repos.conf:22`).
머지커밋 sha 는 회신 `merged:` 참조. ★**게이트② 5회차 만에 approve**(초판 → fix → fix2 → fix3) —
★★**반려 넷이 전부 «내용»이 아니라 «신고한 것 ↔ 산출물»의 어긋남이었다**(계수 · 수 라벨 · 잔존 자리).
⇒ 그 대가로 `docs/upstream-sync-approach.md` §4 에 ★**마감 절차 4줄**이 남았다(착지본 전문 검색 ·
분모 = 파일 × 필드 · 파생 수 · ★**필터 걸린 검색의 «거짓 0»**).
★**남은 minor 하나(F1 · 워크로그 `.md:54` 의 「CI 검사 «한 줄»」)는 이 회차가 «고치지 않았다»** —
다음에 그 파일을 만지는 회차가 §4(:90)와 «같은 표지»를 달면 닫힌다.
- [rustjava-upstream-sync-s8-rename-sweep-decision] ★★**upstream 컷 `bd42427`(개명 스윕 · 12커밋) 머지 —
★★★`merge-base` `ba5797b` → `bd42427` · behind ★**12 → 0** · 부모 2개 ⇒ ★★**upstream 을 «완전히» 따라잡았다.**
착수 재측정(신 서식): **누적 8 · 델타 +8**(base `3fb08a8` · merge-base `ba5797b`) — 「재서 8 이었다」.
Expand Down
Loading