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
20 changes: 20 additions & 0 deletions REPORT.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
# REPORT

## [2026-09-04] 파리티 락 «교차곱» 확장 판정 — 넓히지 않는다 (rustjava-dod-ci-parity-cross-product-decision)
- 무엇을: 채택 제안 `2026-09-04-dod-ci-parity-lock#p0` 에 대한 **판정**이다. ★**결론: 교차곱으로 넓히지 «않는다»**
(부분 확장 `fmt@beta` 만도 기각). ★**검사기 로직 변경 0 · `.rs` 0줄 · `rust.yml` 무접촉 · DoD 블록 무접촉** —
바뀐 것은 `docs/upstream-sync-approach.md` §4 의 판정 절과 검사기 **docstring 1블록**뿐이다.
- 왜: ★**비용과 실익을 «각각» 실측했다(추정 0).**
**비용** — 무변경 재실행 19s → 38s(**2.00×**) ↔ ★**소스 1줄 편집 후 89s → 326s(3.66×)**.
제안 문면의 「두 배」는 «무변경»에서만 참이고, 회차는 언제나 «편집 후»에 돌린다. 지배항은
`cargo +beta test --all` **215s**(같은 편집에서 stable test 66s 의 3.3배).
**실익** — CI 에만 있는 조합은 **3개**로 비어 있지 않지만, ★★**`rust.yml` 이력 76 run(성공 73 · 실패 3)
전수 분해에서 그 3개가 «새로» 잡았을 사건은 0건**이다. 이 저장소의 beta 전용 실패는 **전건 `cargo clippy --all`**
이고 그 한 줄은 DoD 가 이미 `+beta` 로 덮는다. ⇒ **+237s/회차를 내고 얻는 것이 0.**
- 사용자 영향: **없다**(런타임·CI·DoD 무변경). 회차 소요가 지금 그대로 유지된다.
- 검증: 벽시계 실측 3세트(warm · 편집 후 · 콜드) · CI 이력 전수 분해 · 재개 조건 명령을 실행해 **오늘의 값 0** 확인 ·
측정용 소스 편집은 `git checkout` 으로 복구 · `check-dod-ci-parity.py` **rc=0**(대칭차 0 유지).
- ★**재고 나서야 보인 것 둘**: ⑴`rustfmt` 가 **beta 에 미설치**라 `cargo +beta fmt` 는 오늘 그대로 **rc=1** —
교차곱을 채택했다면 모든 머신이 `rustup component add` 를 선행해야 했다 ⑵★**툴체인 교대 축출은 «없다»** —
「두 배」의 흔한 기전(서로 캐시를 밀어낸다)이 이 저장소엔 없고, 대가는 시간이 아니라 **디스크**다(`target` 46G).
- ★**후속 추천**: ⑴재개 조건이 발화하면 **그 step «하나만»** 넣고 비용표를 **다시 재라**(이 표는 «그때의 값»이다).
⑵★「비용이 싸졌다」는 재개 사유가 **아니다** — 실익이 0 인 동안에는 싸도 넣지 않는다.

## [2026-09-04] 로컬 DoD ↔ CI 매트릭스 «기계 대조» 신설 (rustjava-local-dod-vs-ci-matrix-mechanical-check)
- 무엇을: `scripts/check-dod-ci-parity.py` 신설 + `rust.yml` job **`dod_parity`** 배선 + DoD 블록에 그 줄 추가.
★**`CLAUDE.md` DoD 코드블록**과 **`.github/workflows/rust.yml`** 을 «각각 파싱해» **대칭차**를 낸다 —
Expand Down
20 changes: 20 additions & 0 deletions STATE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,26 @@
(25번째 run, 앞선 24건 전부 red). **PR 대기 — 게이트③ 미착지.**

## 완료
- [rustjava-dod-ci-parity-cross-product-decision] ★★**파리티 락 «교차곱» 확장 «판정» — 결론: 넓히지 «않는다».**
채택 제안 `2026-09-04-dod-ci-parity-lock#p0`. ★**검사기 로직 변경 0 · `.rs` 0줄 · `rust.yml` 무접촉 · DoD 블록 무접촉.**
★**비용을 «먼저» 쟀다(추정 0)**: 무변경 재실행 **19s → 38s = 2.00×** ↔ ★**소스 1줄 편집 후 89s → 326s = 3.66×**.
⇒ ★**제안 문면의 「두 배」는 «무변경»에서만 참**이고 회차가 겪는 케이스는 3.66배다. 지배항 =
`cargo +beta test --all` **215s**(같은 편집에서 stable test 66s 의 3.3배) · 콜드 1회 +171s.
★**돈이 아닌 비용 둘**: ⑴`rustfmt` 가 **beta 에 미설치**라 `cargo +beta fmt` 는 오늘 그대로 **rc=1**
⑵★**툴체인 교대 축출은 «없다»**(beta 3줄 직후 stable clippy 2s · test 25s) — 시간이 아니라 **디스크**를 쓴다(`target` 46G).
★**실익은 «따로» 쟀다**: CI 에만 있는 조합 **3개**(`fmt@beta` · `wasm32 clippy@beta` · `test@beta`)로 비어 있지 않지만,
★★**`rust.yml` 이력 76 run(성공 73 · 실패 3) 전수 분해에서 그 3개가 «새로» 잡았을 사건은 «0건»** 이다 —
이 저장소의 beta 전용 실패는 **전건 `cargo clippy --all`** 이고 그 줄은 DoD 가 이미 `+beta` 로 덮는다
(나머지 1건은 fmt 인데 **6셀 전건** 실패라 stable 이 잡는다). ⇒ ★**+237s/회차를 내고 얻는 것이 0.**
★**부분 확장(`fmt@beta` 만 · +3s)도 기각** — 이력 0건 · beta rustfmt 미설치가 기본 · 부분 교차곱은 모델 변경 요구.
★**재개 조건 + 세는 명령 + 오늘의 값 `0`** 을 `docs/upstream-sync-approach.md` §4 에 박았다
(「`cargo clippy --all` «이외» step 이 beta 셀에서만 실패한 run 이 1건이라도 생기면 다시 연다」).
★검사기 **docstring 에만** 결정 포인터 1블록(그 파일이 「Widening … is a decision」이라 적고 결정 결과를 몰랐다).
★게이트③ 완료: PR #27 — ★★**`--merge` 착지**(★`--squash` 아님). ★**이번엔 «두 겹»으로 강제됐다**:
⑴등재 repo(`contracts/upstream-sync-repos.conf:22`) ⑵★**자식 PR #28 이 이 브랜치 «위에» 얹혀 있다**
(`git merge-base --is-ancestor 204f98be <#28 브랜치>` = **YES**) ⇒ 스쿼시하면 그 커밋들이 재작성돼 #28 이 깨진다.
★**단 #28 의 base 는 `main`** 이라 브랜치 소멸로 닫히지는 않는다(`ripple` 형 사고와 다른 형상).
머지커밋 sha 는 회신 `merged:` 참조. ★**착지 후 반사실**: `origin/main..upstream/main` = **0 유지**.
- [rustjava-local-dod-vs-ci-matrix-mechanical-check] ★★**로컬 DoD ↔ `rust.yml` «기계 대조» 신설 —
`scripts/check-dod-ci-parity.py` + CI job `dod_parity`.** ★**5회차 리니지의 상수를 «사람 손»에서 뺐다.**
★★**설계 제약을 먼저 지켰다 — «낡은 문자열 스캐너»를 만들지 «않았다».** 게이트② 검수자가 실측으로
Expand Down
64 changes: 64 additions & 0 deletions docs/upstream-sync-approach.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -347,6 +347,70 @@ DoD 는 `clippy` 만 이중으로 친다. ★**이것은 결함이 아니라 202
★**먼저 «필터 없이» 총계를 내고 «그다음» 한 건씩 «정정 기록인가 잔존인가»를 눈으로 갈라라.**
★**필터는 세는 단계가 아니라 «읽는» 단계에 붙인다** — 세는 단계에 붙이면 그 필터가 잔존을 함께 지운다.

### ★★★[2026-09-04 판정] 파리티 락을 «교차곱»까지 넓히는가 — ★**넓히지 «않는다»**

채택 제안 `2026-09-04-dod-ci-parity-lock#p0` 에 대한 **결정**이다. ★**비용을 «먼저» 쟀다.**

**결정문**:
> ★**`scripts/check-dod-ci-parity.py` 의 두 축(A=명령 · B=toolchain)은 «독립»으로 비교한다 — 교차곱으로 넓히지 않는다.**
> ★**부분 확장(`fmt@beta` 만)도 지금은 채택하지 않는다.**

★**근거는 «둘 다 실측»이다 — 어느 쪽도 추정이 아니다.**

**⒜ 비용** — ★**제안 문면의 「두 배」는 «무변경 재실행»에서만 참이다**:

| 시나리오 | 현행 | 교차곱 | 배수 |
|---|---|---|---|
| 무변경 재실행(warm) | **19s** | **38s** | 2.00× |
| ★**소스 1줄 편집 후**(코어 크레이트 `jvm` · **회차가 실제로 겪는 케이스**) | **89s** | ★**326s** | ★**3.66×** |
| 콜드 1회(beta 산출물 최초 생성) | — | +**171s** | — |

★**지배항 = `cargo +beta test --all` 215s**(같은 편집에서 stable `cargo test --all` 66s 의 **3.3배**).
★**전제 비용 1건**: `rustfmt` 가 beta 에 **설치돼 있지 않다** — `cargo +beta fmt` 는 오늘 그대로 **rc=1**
(`'cargo-fmt' is not installed for the toolchain 'beta-…'`). 넣으면 **모든 머신·에이전트**가 먼저 갖춰야 한다.
★**시간을 서로 뺏지는 않는다 — 대신 디스크를 쓴다**: beta 3줄 직후 stable clippy **2s** · stable test **25s**
⇒ 툴체인 교대 축출 **0**(두 벌 공존). `target/` **46G** · 이 측정 45분 산출물 **5.43 GiB**.

**⒝ 실익** — ★**«CI 에만 있는 조합»은 «3»개이고, 그 3개가 이력에서 잡았을 사건은 «0»건이다.**

CI 조합(OS 축 제외): `rust_ci` 4명령 × toolchain 2 = 8 + `worklog_json` 1 + `dod_parity` 1 = **10** ↔ DoD **7** ⇒ 빠진 **3**:
①`cargo fmt --all -- --check` @beta ②`cargo clippy --workspace --exclude test-utils --target wasm32-…` @beta ③`cargo test --all` @beta.
※OS 축까지 세면 CI 실행은 **26**(6셀 × 4 + 2)이고 로컬은 7 이다 — 그 축은 선언상 범위 밖이다.

★**`rust.yml` 이력 전수**(76 run = 성공 73 · **실패 3**) 분해:

| run | sha | 실패 셀 | 실패 step | beta 전용? |
|---|---|---|---|---|
| 33824237441 | `0a2992a7` | ★**6셀 전건** | `cargo fmt --all -- --check` | ✗ — **stable 도 실패** ⇒ 현행 DoD 가 잡는다 |
| 33798515798 | `d8af846d` | beta 3셀 | `cargo clippy --all -- -D warnings` | ✓ — ★**DoD 가 이미 `+beta` 로 덮는 줄** |
| 32674170282 | `eaa56689` | ubuntu beta | `cargo clippy --all -- -D warnings` | ✓ — ★**같음** |

⇒ ★★**이 저장소의 「beta 전용 실패」는 «전건 `cargo clippy --all`» 이고, 그 한 줄은 DoD 가 이미 이중으로 친다.**
⇒ ★**교차곱이 «새로» 잡았을 사건 = 0건 / 76 run.** ⇒ **+237s/회차를 지불해 얻는 것이 0 이다.**

**⒞ 부분 확장(`fmt@beta` 만 · +3s)도 기각한다** — 싸지만 ⑴이력 **0건** ⑵beta `rustfmt` 미설치가 기본이라
DoD 가 **즉시 rc=1** 이 된다(회차마다 `rustup component add` 가 선행돼야 한다) ⑶검사기가 축을 «독립»으로
비교하므로 «부분» 교차곱을 표현하려면 **모델 자체를 바꿔야 한다**(= 로직 변경).
★**단 아래 재개 조건이 «fmt» 에서 발화하면 이것이 «첫 후보»다.**

★★★**재개 조건 — «세는 명령»과 «오늘의 값»**:
> ★**`rust.yml` 실패 이력에 「`cargo clippy --all` «이외»의 step 이 beta 셀에서만 실패한 run」이 «1건이라도» 생기면 이 판정을 다시 연다.**

```sh
gh run list --repo Jun025/RustJava --workflow=rust.yml --status=failure --limit 200 \
--json databaseId --jq '.[].databaseId' \
| while read -r id; do
gh api "repos/Jun025/RustJava/actions/runs/$id/jobs" \
--jq '[.jobs[]|select(.conclusion=="failure")] as $f
| ($f|map(select(.name|test("beta")))|length) as $b
| ($f|length) as $t
| [$b, $t, ($f[0].steps//[]|map(select(.conclusion=="failure"))|map(.name)|join(","))] | @tsv'
done | awk -F'\t' '$1==$2 && $3 !~ /clippy --all/ {n++} END{print n+0}'
```
★**오늘의 값 = `0`**(2026-09-04). ★**1 이상이면**: 그 step 을 교차곱에 «그것만» 넣고(전부 넣지 마라)
위 비용표를 **다시 재라** — 이 표의 수는 그때의 값이다.
※★**「비용이 싸졌다」는 재개 사유가 «아니다»** — 실익이 0 인 동안에는 싸도 넣지 않는다.

## 5. 단계 분할 — ★**커밋 수로 자르지 마라. 충돌은 앞쪽 7커밋에 몰려 있다**

각 컷 지점에서 `git merge-tree --write-tree --name-only origin/main <cut>` 을 돌린 실측:
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
{
"schema": 1,
"date": "2026-09-04",
"title": "파리티 락 «교차곱» 확장 판정 — 넓히지 않는다(비용 3.66배 ↔ 이력상 실익 0건/76 run)",
"services": [
"RustJava"
],
"taskId": "rustjava-dod-ci-parity-cross-product-decision",
"summary": "채택 제안 2026-09-04-dod-ci-parity-lock#p0 에 대한 판정이다. 결론: scripts/check-dod-ci-parity.py 의 두 축(A=명령 · B=toolchain)을 «교차곱»으로 넓히지 «않는다». 부분 확장(fmt@beta 만)도 지금은 채택하지 않는다. ★비용을 먼저 쟀고 추정치를 쓰지 않았다 — 제안 문면의 「두 배」는 «무변경 재실행»에서만 참이고(19s → 38s = 2.00×), 회차가 실제로 겪는 «소스 1줄 편집 후» 케이스는 89s → 326s = ★3.66× 다. 지배항은 cargo +beta test --all 215s(같은 편집에서 stable test 66s 의 3.3배). 그리고 돈이 아닌 비용 둘이 재고 나서야 보였다: ⑴rustfmt 가 beta 에 설치돼 있지 않아 cargo +beta fmt 는 오늘 그대로 rc=1 이다(모든 머신·에이전트가 갖춰야 하고 안 갖추면 DoD 가 즉시 red) ⑵툴체인 교대 축출은 «없다»(beta 3줄 직후 stable clippy 2s · stable test 25s) — 시간을 서로 뺏는 대신 두 벌이 target/ 에 공존해 디스크를 쓴다(target 46G · 측정 45분 산출물 5.43 GiB). ★실익은 따로 쟀다: CI 에만 있는 조합은 «3»개로 비어 있지 않지만(fmt@beta · wasm32 clippy@beta · test@beta), rust.yml 이력 76 run(성공 73 · 실패 3) 전수 분해에서 그 3개가 «새로» 잡았을 사건은 0건이다 — 이 저장소의 beta 전용 실패는 전건 cargo clippy --all 이고 그 한 줄은 DoD 가 이미 +beta 로 덮는다. 나머지 1건(fmt)은 6셀 전건 실패라 stable 이 이미 잡는다. ⇒ +237s/회차를 지불해 얻는 것이 0 이다. 재개 조건을 세는 명령과 오늘의 값(0)과 함께 docs/upstream-sync-approach.md §4 에 박았다.",
"changes": [
"docs/upstream-sync-approach.md §4 — [2026-09-04 판정] 절 신설: 결정문 · 비용표(무변경 2.00× ↔ 편집 후 3.66× · 콜드 +171s) · 실익표(rust.yml 실패 3건 전수 분해) · 부분 확장 기각 사유 · 재개 조건 + 세는 명령 + 오늘의 값 0.",
"scripts/check-dod-ci-parity.py — ★docstring «만» 1블록 추가(실행 경로 무접촉). 그 파일이 스스로 「Widening to the cross product is a decision, not a bug fix」라고 적어 두고 결정이 났는지는 말하지 않아, 검사기를 읽는 사람이 그 문장 하나로 오도되기 때문이다. 결정 결과(NO)와 §4 포인터와 재개 조건의 존재만 적었다.",
"STATE.md · REPORT.md — 회차 기록.",
"★DoD 블록(CLAUDE.md)은 «무접촉» — 「넓힌다」가 아니므로 줄을 더하지 않았다. 더했으면 dod_parity 가 즉시 red 가 되어 이 repo 의 모든 PR 을 막는다(계약이 그것을 명시 경고했다)."
],
"deploy": {
"sha": "",
"urls": []
},
"verification": "★비용 실측(이 머신 · 2026-09-04 · 벽시계 · 추정 0). 현행 로컬 DoD 는 7줄이다 — ★티켓 문면의 「6줄」은 낡았다(PR #26 61d5bf3f 이 파리티 검사기 줄을 더했다). 현행 7줄: warm 합계 19s(fmt 0 · clippy 1 · +beta clippy 0 · wasm32 clippy 1 · test 17 · worklog 0 · parity 0) / 소스 1줄 편집 후(코어 크레이트 jvm) 합계 89s(0 · 7 · 6 · 10 · 66 · 0 · 0). 교차곱 추가 3줄: 콜드 합계 171s(+beta fmt 7 · +beta wasm32 clippy 62 · +beta test 102) / warm 19s(1 · 0 · 18) / 편집 후 ★237s(3 · 19 · ★215). ⇒ 무변경 19→38s = 2.00× · 편집 후 89→326s = ★3.66×. 전제: rustfmt@beta 미설치 확인(cargo +beta fmt rc=1 · 문면 'cargo-fmt' is not installed) → rustup component add 3s 후 측정. 축출 없음 확인: beta 3줄 직후 stable clippy 2s · stable test 25s. target/ 46G · 45분 내 mtime 산출물 960파일 5.43 GiB. ★실익 실측: rust.yml run 76건(success 73 · failure 3) 전수 — 33824237441/0a2992a7 = fmt 가 6셀 전건 실패(beta 전용 아님) · 33798515798/d8af846d = clippy --all 이 beta 3셀만 · 32674170282/eaa56689 = clippy --all 이 ubuntu beta 만. ⇒ beta 전용 실패는 전건 cargo clippy --all 이고 DoD 가 이미 덮는다 ⇒ 교차곱이 새로 잡았을 사건 0건. 재개 조건 세는 명령을 실행해 오늘의 값 0 확인(중간 출력 3줄을 워크로그에 그대로 실었다). ★회차 종료 상태: 검사기 실행 경로 변경 0(docstring 만) · .rs 0줄(측정용 편집은 git checkout 으로 복구 · git status 청결) · rust.yml 무접촉 · CLAUDE.md DoD 블록 무접촉 · python3 scripts/check-dod-ci-parity.py rc=0(대칭차 0 유지) · python3 scripts/check-worklog-json.py rc=0.",
"issues": [
"★★티켓 문면이 「현행 로컬 DoD 6줄」이라 적었으나 실측은 «7줄»이다(PR #26 이 파리티 검사기 줄을 더했다). 이 리니지의 지병이 정확히 「낡은 수를 물려받아 인용한다」라서 그대로 넘기지 않고 실측 수로 쟀고, 회신에 명시했다.",
"★제안 문면의 「시간이 두 배」는 «무변경 재실행»에서만 참이었다(2.00×). 회차가 실제로 겪는 «편집 후» 케이스는 3.66× 다 — ★그 차이가 판정을 바꾸지는 않지만(어느 쪽이든 실익 0), 「두 배」를 그대로 인용했으면 비용을 41% 과소평가한 채 결정했을 것이다.",
"★「두 배」의 흔한 기전(두 toolchain 이 서로 캐시를 밀어낸다)은 이 저장소에 «없다» — 실측으로 확인했다(beta 3줄 직후 stable clippy 2s · test 25s). 대신 순수 가산이고 대가는 디스크다(target 46G). ⇒ 다음 사람이 「캐시 축출 때문에 비싸다」로 논거를 세우지 않게 여기 적는다.",
"★측정 부작용 1건이 «남는다»: rustup component add --toolchain beta rustfmt. 되돌리지 않았다 — 무해하고, 재개 조건이 fmt 에서 발화하면 바로 필요하다. ★그러나 이것이 «전제 비용»의 증거이기도 하다: 그 설치 전에는 cargo +beta fmt 가 rc=1 이었고, 교차곱을 채택했다면 모든 머신이 이 단계를 선행해야 했다.",
"★OS 축(macos·ubuntu·windows)은 이 판정의 대상이 아니다 — 로컬 재현 불가라 CI 가 유일한 그물이라는 선행 결정 그대로다. OS 축까지 세면 CI 실행은 26이고 로컬은 7 이다.",
"★부분 확장(fmt@beta 만 · 편집 후 +3s)도 기각했다. 싼데도 안 하는 이유를 적었다: 이력 실익 0건 · beta rustfmt 미설치가 기본이라 DoD 가 즉시 rc=1 · 검사기가 축을 «독립»으로 비교하므로 부분 교차곱은 모델 변경(= 이 회차 금지인 로직 변경)을 요구한다. ★재개 조건이 fmt 에서 발화하면 이것이 첫 후보다.",
"머지하지 않았다 — 게이트②·③은 별 세션이다. ★게이트③은 등재 repo 라 merge_strategy: merge 필수.",
"★[게이트③ 집행] PR #27 을 --merge 로 착지시켰다. ★이번엔 두 겹으로 강제됐다 — ⑴등재 repo(스쿼시는 계보를 접는다) ⑵자식 PR #28 이 이 브랜치 위에 얹혀 있어(204f98be 가 그 브랜치의 조상) 스쿼시하면 커밋이 재작성돼 #28 이 깨진다. ★단 #28 의 base 는 main 이라 브랜치 소멸로 닫히지는 않는다. 동봉 «전» head 가 검수 핀 204f98be5eee969e2e49e37e0c98dfca3b697f96 과 일치함을 확인했고(git fetch 를 먼저 쳐 거짓 일치를 막았다), 동봉 전/후 sha 는 머지 회신에 적었다. 착지 diff 6파일 · 배포 워크플로 0개 ⇒ 배포 0."
],
"proposals": [],
"resolvedIssues": [
"2026-09-04-dod-ci-parity-lock#p0 — 「축 A × 축 B 교차곱까지 넓힐지 판정하라」. 비용(편집 후 3.66× · +237s/회차)과 실익(이력 0건/76 run)을 각각 실측해 «넓히지 않는다»로 판정했고, 재개 조건을 세는 명령·오늘의 값(0)과 함께 docs/upstream-sync-approach.md §4 에 박았다."
],
"adoptedProposals": [
"2026-09-04-dod-ci-parity-lock#p0"
],
"declinedProposals": []
}
Loading