diff --git a/REPORT.md b/REPORT.md index 3f2298f..b28c43a 100644 --- a/REPORT.md +++ b/REPORT.md @@ -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`** 을 «각각 파싱해» **대칭차**를 낸다 — diff --git a/STATE.md b/STATE.md index d43bc63..d407978 100644 --- a/STATE.md +++ b/STATE.md @@ -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회차 리니지의 상수를 «사람 손»에서 뺐다.** ★★**설계 제약을 먼저 지켰다 — «낡은 문자열 스캐너»를 만들지 «않았다».** 게이트② 검수자가 실측으로 diff --git a/docs/upstream-sync-approach.md b/docs/upstream-sync-approach.md index a649a31..12bdee4 100644 --- a/docs/upstream-sync-approach.md +++ b/docs/upstream-sync-approach.md @@ -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 ` 을 돌린 실측: diff --git a/docs/worklog/2026-09-04-dod-ci-parity-cross-product-decision.json b/docs/worklog/2026-09-04-dod-ci-parity-cross-product-decision.json new file mode 100644 index 0000000..6f51f0d --- /dev/null +++ b/docs/worklog/2026-09-04-dod-ci-parity-cross-product-decision.json @@ -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": [] +} diff --git a/docs/worklog/2026-09-04-dod-ci-parity-cross-product-decision.md b/docs/worklog/2026-09-04-dod-ci-parity-cross-product-decision.md new file mode 100644 index 0000000..68515ff --- /dev/null +++ b/docs/worklog/2026-09-04-dod-ci-parity-cross-product-decision.md @@ -0,0 +1,147 @@ +# [2026-09-04] 파리티 락 «교차곱» 확장 판정 — 넓히지 «않는다»(비용을 먼저 쟀다) + +**티켓**: `rustjava-dod-ci-parity-cross-product-decision` +**채택 제안**: `2026-09-04-dod-ci-parity-lock#p0` +**성격**: ★**판정 회차** — 검사기 로직 변경 **0** · `.rs` **0줄** · `rust.yml` **무접촉** · DoD 블록 **무접촉** + +--- + +## 1. ★비용을 «먼저» 쟀다 — 추정치 0 + +★**제안 문면의 「시간이 두 배」도 «주장»이다.** 재서 적는다(모두 이 머신 · 2026-09-04 · 벽시계): + +### ⒜ 현행 로컬 DoD 7줄 + +| 명령 | warm | ★**소스 1줄 편집 후** | +|---|---|---| +| `cargo fmt --all -- --check` | 0s | 0s | +| `cargo clippy --all -- -D warnings` | 1s | 7s | +| `cargo +beta clippy --all -- -D warnings` | 0s | 6s | +| `cargo clippy --workspace --exclude test-utils --target wasm32-… -- -D warnings` | 1s | 10s | +| `cargo test --all` | 17s | **66s** | +| `python3 scripts/check-worklog-json.py` | 0s | 0s | +| `python3 scripts/check-dod-ci-parity.py` | 0s | 0s | +| **합계** | ★**19s** | ★**89s** | + +※★**티켓 문면은 「현행 DoD 6줄」이라 적혀 있으나 실측은 «7줄»이다** — PR #26(`61d5bf3f`)이 파리티 검사기 줄을 더했다. +★**이 리니지의 지병(낡은 수)이라 그대로 넘기지 않고 실측 수로 잰다.** + +### ⒝ 교차곱으로 넓혔을 때 «추가되는» 3줄 + +| 명령 | ★**콜드**(최초) | warm | ★**소스 1줄 편집 후** | +|---|---|---|---| +| `cargo +beta fmt --all -- --check` | 7s | 1s | 3s | +| `cargo +beta clippy --workspace --exclude test-utils --target wasm32-… -- -D warnings` | 62s | 0s | 19s | +| `cargo +beta test --all` | 102s | 18s | ★**215s** | +| **합계** | **171s** | **19s** | ★**237s** | + +### ⒞ 결론 수치 + +| 시나리오 | 현행 | 교차곱 | 배수 | +|---|---|---|---| +| 무변경 재실행(warm) | 19s | 38s | **2.00×** | +| ★**소스 1줄 편집 후**(회차가 실제로 겪는 케이스) | 89s | ★**326s** | ★**3.66×** | + +⇒ ★★**「두 배」는 «무변경 재실행»에서만 참이다.** 회차는 언제나 «편집 후»에 DoD 를 돌린다 ⇒ **3.66배**가 실제 값이다. +★**지배항** = `cargo +beta test --all` **215s**(같은 편집에서 stable `cargo test --all` **66s** 의 **3.3배**). + +### ⒟ ★돈이 아닌 비용 둘 — 재고 나서야 보였다 + +- ★**전제 미충족**: `rustfmt` 가 beta 에 **설치돼 있지 않다**. `cargo +beta fmt` 는 오늘 그대로 **rc=1** + (`error: 'cargo-fmt' is not installed for the toolchain 'beta-aarch64-apple-darwin'`). + 설치 자체는 3s 지만 ★**모든 머신·에이전트가 갖춰야 하고, 안 갖추면 DoD 가 즉시 rc=1** 이다. +- ★**시간을 서로 뺏지는 «않는다» — 대신 디스크를 쓴다**: beta 3줄을 돌린 «직후» stable `clippy` **2s** · + stable `test` **25s** ⇒ ★**툴체인 교대 축출 0**(두 벌이 `target/` 에 공존한다). + `target/` **46G** · 이 측정 45분 산출물 **5.43 GiB**. + ⇒ ★**「두 배」의 흔한 기전(서로 캐시를 밀어낸다)은 «없다»** — 대신 순수 가산이다. + +### ⒠ CI 셀 수(계약 1⒞) + +`rust_ci` = OS **3** × toolchain **2** = ★**6셀** × 4명령 = **24 실행** + `worklog_json` **1** + `dod_parity` **1** = ★**26**. +로컬 DoD 는 **7**. ★**OS 축은 선언상 범위 밖**(로컬 재현 불가)이라 아래 gap 은 그 축을 뺀 값이다. + +## 2. ★«CI 에만 있는 조합» — 목록 (수만 적지 않는다) + +CI 조합(OS 축 제외) = 4명령 × 2 toolchain + 2 = **10** ↔ DoD = **7** ⇒ ★**빠진 «3»**: + +| # | 명령 | toolchain | +|---|---|---| +| ① | `cargo fmt --all -- --check` | **beta** | +| ② | `cargo clippy --workspace --exclude test-utils --target wasm32-unknown-unknown -- -D warnings` | **beta** | +| ③ | `cargo test --all` | **beta** | + +★**비어 있지 않다** ⇒ 「실익 0 이라 자동 기각」 갈래는 **해당하지 않는다.** 실익은 아래에서 «따로» 쟀다. + +## 3. ★실익 실측 — 그 3개가 «이력에서» 잡았을 사건 + +`rust.yml` 전체 **76 run**(성공 **73** · 실패 **3**). ★**실패 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 가 이미 이중으로 친다.** +⇒ ★★**교차곱 3개가 «새로» 잡았을 사건 = «0건 / 76 run».** + +★**주의 — ①의 fmt 실패가 «반례처럼 보이지만 아니다»**: 그 run 은 **6셀 전건** 실패라 stable 이 이미 잡는다 +(그것은 S7 회차의 순서 실수였고, 그 회차 회신이 「편집했으면 4종을 다시 돌려라」로 이미 처분했다). +★**교차곱이 필요했으려면 «beta 만» 빨개졌어야 한다.** + +## 4. ★판정 — ⒝ **넓히지 않는다** + +> ★**`scripts/check-dod-ci-parity.py` 의 두 축(A=명령 · B=toolchain)은 «독립»으로 비교한다 — 교차곱으로 넓히지 않는다.** +> ★**부분 확장(`fmt@beta` 만)도 지금은 채택하지 않는다.** + +★**근거는 «비용 대 실익» 두 수뿐이다**: **+237s/회차(3.66×)** ↔ **이력상 실익 0건 / 76 run**. +★**「안 넓힌다」를 «기록»으로 남긴다** — 다음 사람이 같은 제안을 다시 올릴 때 재논의가 아니라 **재측정**으로 가게. + +★**부분 확장 ⒞ 기각 사유**(싼데도 안 하는 이유를 적는다): `fmt@beta` 는 편집 후 **+3s** 로 싸다. 그런데 +⑴이력 실익 **0건** ⑵beta `rustfmt` **미설치가 기본**이라 DoD 가 **즉시 rc=1**(회차마다 `rustup component add` 선행) +⑶검사기가 축을 «독립»으로 비교하므로 «부분» 교차곱을 표현하려면 **모델 자체를 바꿔야 한다**(= 로직 변경 · 이 회차 금지). +★**단 재개 조건이 «fmt» 에서 발화하면 이것이 «첫 후보»다.** + +## 5. ★재개 조건 + 세는 명령 + 오늘의 값 + +> ★**`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`**. 중간 출력(그대로): +``` +3 6 Run cargo fmt --all -- --check ← beta 3 / 전체 6 ⇒ beta 전용 아님 +3 3 Run cargo clippy --all -- -D warnings ← beta 전용이지만 DoD 가 덮는 줄 +1 1 Run cargo clippy --all -- -D warnings ← 같음 +``` +★**1 이상이면**: 그 step «하나만» 교차곱에 넣고(전부 넣지 마라) **위 비용표를 다시 재라** — 이 표의 수는 «그때의 값»이다. +★★**「비용이 싸졌다」는 재개 사유가 «아니다»** — 실익이 0 인 동안에는 싸도 넣지 않는다. + +## 6. 적은 «자리»와 이유 + +| 자리 | 무엇을 | 왜 | +|---|---|---| +| `docs/upstream-sync-approach.md` §4 | 결정문 · 비용표 · 실익표 · 재개 조건 | ★**이 리니지의 결정이 사는 곳**(파리티 락 C7 처분·마감 절차와 같은 절) | +| ★`scripts/check-dod-ci-parity.py` **docstring** | 「그 결정은 2026-09-04 에 났고 답은 NO · §4 를 보라」 **1블록** | ★그 파일이 스스로 「Widening … is a decision, not a bug fix」라고 적어 두고 **결정이 났는지는 말하지 않았다** ⇒ ★**검사기를 읽는 사람이 그 문장 하나로 오도된다** | +| 이 워크로그 | 판정 전문 + `adoptedProposals` | 규약 | + +★**docstring 외 코드 변경 0** — 검사기의 실행 경로는 한 줄도 건드리지 않았다(계약). + +## 7. 경계 + +★검사기 **로직 변경 0** · `.rs` **0줄** · `rust.yml` **무접촉** · ★**DoD 블록 무접촉**(「넓힌다」가 아니므로 줄을 더하지 않았다 — +더했으면 `dod_parity` 가 즉시 red 가 되어 이 repo 의 모든 PR 을 막는다) · +★**돌연변이·측정 흔적 전건 복구**(`jvm/src/jvm.rs` 편집 → `git checkout`) · +머지 **0** · force-push **0** · `main` 직접 push **0** · 시크릿 출력 **0** · upstream 발신 **0** · 맨 `grep` **0**. +※★**측정 부작용 1건은 «남는다»**: `rustup component add --toolchain beta rustfmt` — ★**되돌리지 않았다** +(무해하고, 재개 조건이 fmt 에서 발화하면 바로 필요하다). 회신에 신고한다. diff --git a/scripts/check-dod-ci-parity.py b/scripts/check-dod-ci-parity.py index 5ebeb1f..f0322da 100644 --- a/scripts/check-dod-ci-parity.py +++ b/scripts/check-dod-ci-parity.py @@ -23,6 +23,11 @@ where the measured gap was (9 `#[allow(clippy::double_must_use)]` deleted → stable 0, beta rc=101 / 6 diagnostics). Widening to the cross product is a decision, not a bug fix. +★That decision was made on 2026-09-04 and the answer is NO — do not widen. Cost and benefit +were both measured; see `docs/upstream-sync-approach.md` §4 "[2026-09-04 판정] 파리티 락을 +«교차곱»까지 넓히는가" for the numbers and, importantly, the reopen condition (a counting +command over `rust.yml` failure history, today's value 0). Do not re-argue it from taste. + Also out of scope by the same decision: the OS axis (macos/ubuntu/windows). It cannot be reproduced locally at all, so CI is its only net. Conditional (`if:`-guarded) steps are therefore excluded from axis A — but they are PRINTED, never silently dropped.