From ed046208f9150fccfe8471eeb9899d891a23faa6 Mon Sep 17 00:00:00 2001 From: jun0 Date: Fri, 4 Sep 2026 22:00:20 +0900 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20=ED=98=95=EC=A0=9C=20repo(wie=C2=B7?= =?UTF-8?q?qts)=20=ED=8C=8C=EB=A6=AC=ED=8B=B0=20=EB=9D=BD=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=EC=84=B1=20=EC=A1=B0=EC=82=AC=20=E2=80=94=20=EB=91=98?= =?UTF-8?q?=20=EB=8B=A4=20=EC=A1=B0=EA=B1=B4=EB=B6=80=20=ED=95=84=EC=9A=94?= =?UTF-8?q?=20=C2=B7=20=EA=B2=80=EC=82=AC=EA=B8=B0=EB=8A=94=20=ED=8F=AC?= =?UTF-8?q?=ED=8C=85=20=EB=B6=88=EA=B0=80=20[rustjava-dod-ci-parity-siblin?= =?UTF-8?q?g-repo-survey]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 채택 제안 2026-09-04-dod-ci-parity-lock#p1 에 대한 읽기 전용 조사 + 판정. 형제 repo 는 gh api /contents 로만 읽었다 — git 쓰기 0 · PR 0 · 파일 수정 0. 구조 판정: 같지 않다. wie 의 DoD 정본은 AGENTS.md(우리는 CLAUDE.md)이고 CI 의 4번째 게이트(cargo test)가 if: 로 갈린 2 step + 블록 스칼라라 우리 파서의 「조건부 = OS 축 = 제외」 규칙이 거짓 red 를 만든다. qts 는 DoD 가 make 타깃 이름(Makefile 간접층)이고 toolchain 매트릭스가 없어 축 B 가 성립하지 않으며 gitleaks 는 action 이라 어떤 run: 파서도 못 본다. ⇒ 제안 문면의 「복사하지 마라」가 실측으로 확인됐다. 그런데 어긋남은 둘 다 실재한다(이력 전수 분해). wie rust.yml 최근 200 run(성공 166 · 실패 34) 중 beta 셀에서만 실패한 clippy 가 9건(26%)인데 four gates 에 cargo +beta 가 없다(문자열 beta 가 규범 문서에 0건). qts ci.yml 최근 실패 60건 중 uv run ruff format --check . 가 유일한 실패인 것이 10건(17%)인데 make lint 는 그것을 안 친다(문자열 format 이 규범 문서에 0건). 판정: 둘 다 ⒞ 조건부 필요. 단 먼저 할 일은 락이 아니라 각 한 줄이다 — wie 는 four gates 에 cargo +beta clippy --all -- -D warnings, qts 는 make lint 에 ruff format --check. 락은 그 다음이다(락은 어긋남을 막는 것이지 고치는 것이 아니다). 구현 0 — 형제 repo 는 다른 레인 소관이라 T1·T2·T3 의 축과 합격선만 적었다. 일반 사실: 세 repo 가 전부 이 어긋남을 갖고 있었고 어긋난 자리가 전부 규범 문서에 적혀 있지 않았다 ⇒ 「사람이 문서를 최신으로 유지한다」가 세 repo에서 각각 실패했다. 이 repo 검사기·rust.yml·CLAUDE.md DoD 블록 무접촉 · .rs 0줄 · 파리티 rc=0 유지. --- REPORT.md | 20 +++ STATE.md | 14 ++ docs/upstream-sync-approach.md | 18 ++ ...2026-09-04-parity-sibling-repo-survey.json | 67 ++++++++ .../2026-09-04-parity-sibling-repo-survey.md | 162 ++++++++++++++++++ 5 files changed, 281 insertions(+) create mode 100644 docs/worklog/2026-09-04-parity-sibling-repo-survey.json create mode 100644 docs/worklog/2026-09-04-parity-sibling-repo-survey.md diff --git a/REPORT.md b/REPORT.md index b28c43a..317961e 100644 --- a/REPORT.md +++ b/REPORT.md @@ -1,5 +1,25 @@ # REPORT +## [2026-09-04] 형제 repo 파리티 락 필요성 조사 — 둘 다 «조건부 필요», 검사기는 포팅 불가 (rustjava-dod-ci-parity-sibling-repo-survey) +- 무엇을: 채택 제안 `2026-09-04-dod-ci-parity-lock#p1` 에 대한 ★**읽기 전용 조사 + 판정**이다. + `wie`·`qts` 의 **DoD 정본 위치 · CI 검사 집합 · 대칭차**를 각각 실측하고, ★**이력으로 실익까지** 쟀다. + ★**형제 repo 변경 0**(`git`·PR·파일 수정 전부 0 — `gh api /contents` 로만 읽었다) · 구현 **0**. +- 왜: ★**같은 처방이 그대로 맞는지 «먼저» 재라**는 것이 제안 문면이었고, 재보니 ★**맞지 않았다.** + `wie` 는 DoD 정본이 **`AGENTS.md`** 이고 CI 의 4번째 게이트(`cargo test`)가 ★**`if:` 로 갈린 2 step + 블록 스칼라**라 + 우리 파서의 「조건부 = OS 축 = 제외」 규칙이 ★**거짓 red** 를 만든다. `qts` 는 DoD 가 ★**`make` 타깃 이름**이라 + Makefile 간접층이 있고, ★**toolchain 매트릭스가 없어 축 B 가 성립하지 않으며**, `gitleaks` 는 ★**action 이라 못 본다**. +- 사용자 영향: **없다**(이 repo 무변경). ★**형제 repo 에 «측정된» 개선 경로 둘이 생겼다** — + `wie` 이력 **9/34(26%)** · `qts` 이력 **10/60(17%)** 이 각각 «한 줄»로 로컬에 들어온다. +- 검증: `wie` `rust.yml` 최근 200 run(성공 166 · 실패 34) **실패 전수 분해** — stable-only clippy 24 · + ★**beta-only clippy 9** · windows test 1. `qts` `ci.yml` 최근 실패 **60건 전수 분해** — + `ruff format --check` 포함 38 · ★**그것만 10** · `ruff check` 7 · phase0-only 0. + ★문서 실측: 문자열 `beta` 가 `wie` 규범 문서에 **0건** · 문자열 `format` 이 `qts` 규범 문서에 **0건**. +- ★★**일반 사실 하나**: 세 repo 가 **전부** 이 어긋남을 갖고 있었고 ★**어긋난 자리가 전부 규범 문서에 «적혀 있지 않았다»** + ⇒ ★**「사람이 문서를 최신으로 유지한다」가 세 repo에서 «각각» 실패했다** — 기계 대조의 일반 근거다. +- ★**후속 추천**: ⑴`wie` four gates 에 `cargo +beta clippy --all -- -D warnings` ⑵`qts` `make lint` 에 + `uv run ruff format --check .` ⑶★**락 포팅은 그 «뒤»**(락은 어긋남을 «막는» 것이지 «고치는» 것이 아니다). + ★셋 다 **그 repo 레인 소관**이라 여기서 고치지 않았다 — 축과 합격선만 워크로그에 적었다. + ## [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 블록 무접촉** — diff --git a/STATE.md b/STATE.md index b802dc3..da2372f 100644 --- a/STATE.md +++ b/STATE.md @@ -1,6 +1,20 @@ # STATE ## 진행중 +- [rustjava-dod-ci-parity-sibling-repo-survey] ★★**형제 repo(`wie`·`qts`) 파리티 락 필요성 «조사+판정» — 둘 다 «⒞ 조건부 필요».** + 채택 제안 `2026-09-04-dod-ci-parity-lock#p1`. ★**읽기 전용**(형제 repo `git`·PR·파일 수정 **0** · `gh api /contents` 로만 읽었다) · 구현 **0**. + ★★**검사기는 «포팅 불가»다** — `wie` 는 DoD 정본이 **`AGENTS.md`** 이고 4번째 게이트(`cargo test`)가 + ★**`if:` 로 갈린 2 step + 블록 스칼라**라 우리 파서의 「조건부 = 제외」가 ★**거짓 red** 를 만든다 · + `qts` 는 DoD 가 **`make` 타깃 이름**(Makefile 간접층)이고 ★**toolchain 매트릭스가 없어 축 B 가 성립하지 않으며** + `gitleaks` 는 ★**action 이라 어떤 `run:` 파서도 못 본다**. + ★★**그런데 어긋남은 «둘 다 실재»한다 — 이력으로 쟀다**: `wie` `rust.yml` 실패 **34건 전수** 중 + ★**beta 셀에서만 실패한 clippy 9건(26%)** 인데 four gates 에 `cargo +beta` 가 **없다**(문자열 `beta` 규범 문서 **0건**) · + `qts` `ci.yml` 최근 실패 **60건 전수** 중 ★**`uv run ruff format --check .` «만» 실패 10건(17%)** 인데 `make lint` 는 안 친다 + (문자열 `format` 규범 문서 **0건**). + ⇒ ★**먼저 할 일은 락이 아니라 «각 한 줄»** — 그 다음이 포팅이다. 다음 티켓 3건(T1·T2·T3)의 **축과 합격선**만 적었다(발권은 총괄 몫). + ★★**일반 사실**: 세 repo 가 전부 이 어긋남을 갖고 있었고 **어긋난 자리가 전부 규범 문서에 없었다** — + 「사람이 문서를 최신으로 유지한다」가 **세 repo에서 각각 실패**했다. + ★이 repo 검사기·`rust.yml`·DoD 블록 **무접촉** · `.rs` **0줄**. **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×**. diff --git a/docs/upstream-sync-approach.md b/docs/upstream-sync-approach.md index 12bdee4..11fbb28 100644 --- a/docs/upstream-sync-approach.md +++ b/docs/upstream-sync-approach.md @@ -411,6 +411,24 @@ gh run list --repo Jun025/RustJava --workflow=rust.yml --status=failure --limit 위 비용표를 **다시 재라** — 이 표의 수는 그때의 값이다. ※★**「비용이 싸졌다」는 재개 사유가 «아니다»** — 실익이 0 인 동안에는 싸도 넣지 않는다. +### ★[2026-09-04 조사] 형제 repo(`wie`·`qts`)에도 같은 락이 필요한가 — ★**둘 다 «조건부 필요» · 검사기는 «포팅 불가»** + +★**다음 RustJava 회차가 같은 조사를 반복하지 않도록 결과만 남긴다** — 전문은 +`docs/worklog/2026-09-04-parity-sibling-repo-survey.{md,json}`. ★**형제 repo 는 다른 레인 소관이라 이 저장소가 고치지 않는다.** + +- ★**구조가 같지 않다**: `wie` 의 DoD 정본은 ★**`AGENTS.md`**(우리는 `CLAUDE.md`)이고 CI 의 4번째 게이트 + (`cargo test`)가 ★**`if:` 로 갈린 2 step + 블록 스칼라**라, 우리 파서의 「조건부 = OS 축 = 제외」 규칙이 + ★**거짓 red** 를 만든다. `qts` 는 DoD 가 ★**`make` 타깃 이름**(Makefile 간접층)이고 ★**toolchain 매트릭스가 없어 + 축 B 자체가 성립하지 않으며**, `gitleaks` 는 ★**action 이라 어떤 `run:` 파서도 못 본다**. +- ★**그런데 어긋남은 «둘 다 실재»한다(이력 실측)**: `wie` 는 `rust.yml` 실패 **34건 중 9건(26%)** 이 + ★**beta 셀에서만** 실패한 clippy 인데 four gates 에 `cargo +beta` 가 **없다**(문자열 `beta` 가 규범 문서에 **0건**) · + `qts` 는 최근 실패 **60건 중 10건(17%)** 이 ★**`uv run ruff format --check .` «만»** 실패인데 `make lint` 는 그것을 **안 친다**. +- ⇒ ★★**먼저 할 일은 락이 아니라 «각 한 줄»이다** — `wie`: four gates 에 `cargo +beta clippy --all -- -D warnings` · + `qts`: `make lint` 에 `uv run ruff format --check .`. ★**락은 그 «다음»이다**(락은 어긋남을 «막는» 것이지 «고치는» 것이 아니다). +- ★★**일반 사실 하나** — 세 repo 가 전부 이 어긋남을 갖고 있었고 ★**어긋난 자리가 전부 규범 문서에 «적혀 있지 않았다»** + (우리 = wasm32 줄 + beta 축 · `wie` = beta 축 · `qts` = `ruff format --check`). + ⇒ ★**「사람이 문서를 최신으로 유지한다」가 세 repo에서 «각각» 실패했다** — 그것이 기계 대조의 일반 근거다. + ## 5. 단계 분할 — ★**커밋 수로 자르지 마라. 충돌은 앞쪽 7커밋에 몰려 있다** 각 컷 지점에서 `git merge-tree --write-tree --name-only origin/main ` 을 돌린 실측: diff --git a/docs/worklog/2026-09-04-parity-sibling-repo-survey.json b/docs/worklog/2026-09-04-parity-sibling-repo-survey.json new file mode 100644 index 0000000..c88dc4e --- /dev/null +++ b/docs/worklog/2026-09-04-parity-sibling-repo-survey.json @@ -0,0 +1,67 @@ +{ + "schema": 1, + "date": "2026-09-04", + "title": "형제 repo(wie·qts) 파리티 락 필요성 조사 — 둘 다 «조건부 필요» · 그러나 검사기는 포팅 불가", + "services": [ + "RustJava" + ], + "taskId": "rustjava-dod-ci-parity-sibling-repo-survey", + "summary": "채택 제안 2026-09-04-dod-ci-parity-lock#p1 에 대한 읽기 전용 조사 + 판정이다. 형제 repo 는 GitHub API(gh api repos//contents/...)로만 읽었고 워킹트리·.git 을 건드리지 않았다 — 쓰기 0. ★구조 판정: RustJava(CLAUDE.md DoD 코드블록 ↔ rust.yml 단일 파일)와 wie 는 «비슷하나 같지 않고», qts 는 «다르다». wie 의 DoD 정본은 AGENTS.md 이고 CI 의 4번째 게이트(cargo test)가 if: 로 갈린 2 step + 블록 스칼라라 RustJava 파서를 그대로 적용하면 «거짓 red» 가 난다. qts 는 DoD 가 make 타깃 이름(산문)이라 Makefile 간접층이 있고, toolchain 매트릭스가 아예 없어 축 B 가 성립하지 않으며, gitleaks 는 action 이라 어떤 run: 파서도 못 본다. ★대칭차는 두 repo 다 0 이 아니고 «이력으로도» 실재를 확인했다: wie 는 rust.yml 최근 200 run 중 실패 34건 전수 분해에서 beta 셀에서만 실패한 clippy 가 9건(26%)인데 DoD 4 gates 에 cargo +beta 가 없다(문자열 beta 가 AGENTS.md·CLAUDE.md 에 0건). qts 는 ci.yml 최근 실패 60건 전수 분해에서 uv run ruff format --check . 가 38건에 포함되고 그중 10건(17%)은 그것이 «유일한» 실패였다 — make lint 는 그 명령을 치지 않으므로 로컬 DoD 를 전부 돌려도 green 이었다(문자열 format 이 규범 문서에 0건). ★판정: 둘 다 ⒞ 조건부 필요. 그러나 먼저 할 일은 파리티 락이 아니라 각 한 줄이다 — wie 는 four gates 에 cargo +beta clippy --all -- -D warnings, qts 는 make lint 에 uv run ruff format --check . 다. 락 포팅은 그 뒤이고, wie 는 파서 3군데(조건부 게이트 판별·env 접두 정규화·다중 워크플로), qts 는 Makefile 전개·축 B 부재·action 검사 명시를 각각 요구한다. 구현 0 — 형제 repo 는 다른 레인 소관이라 축과 합격선만 적었다.", + "changes": [ + "docs/worklog/2026-09-04-parity-sibling-repo-survey.{md,json} 신설 — 정본 위치 실측표 · 대칭차 원소 나열 · 이력 전수 분해 · repo 별 판정 · 다음 티켓 3건(T1·T2·T3)의 축과 합격선.", + "docs/upstream-sync-approach.md §4 — 조사 결과 요약 3줄(다음 RustJava 회차가 같은 조사를 반복하지 않도록).", + "STATE.md · REPORT.md — 회차 기록.", + "★형제 repo(wie·qts) 변경 0 — git 명령 0 · PR 0 · 파일 수정 0. 이 repo 의 검사기·rust.yml·DoD 블록도 무접촉." + ], + "deploy": { + "sha": "", + "urls": [] + }, + "verification": "★읽기 방법: gh api repos/Jun025/{wie,qts}/contents/... (origin/main 내용) — 형제 워킹트리·.git 무접촉. ⒜wie 정본 실측: CLAUDE.md 에는 §Definition of Done 이 «없고»(헤딩 = 착수 규율/완주 규율/에이전트 개발환경) 정본은 AGENTS.md §Definition of Done → 「The four gates (what rust.yml actually runs)」 ```sh 블록 4줄(cargo fmt --all -- --check · cargo clippy --all -- -D warnings · cargo clippy --target wasm32-unknown-unknown -- -D warnings · RUST_MIN_STACK=4194304 cargo test --all). rust.yml: 비조건부 - run: 3개 + 조건부 4개(ubuntu apt · windows choco · windows test 블록 · 비-windows test 블록) · matrix os 3 × rust [stable, beta]. ⇒ 축 A 대칭차 1(DoD 에만 RUST_MIN_STACK cargo test — ★거짓 양성: CI 는 조건부 2 step 으로 정말 친다) · 축 B 대칭차 1(CI 에만 beta — ★진짜). 워크플로 8개이고 coverage·engine-contract·web 이 추가 검사를 친다. ⒝qts 정본 실측: CLAUDE.md §Definition of Done = make lint · make guardrail · make test (+ make sync) 산문. Makefile 전개 — sync: uv sync --all-packages / lint: uv run ruff check . + go vet(조건부) / test: uv run pytest + go test(조건부) / guardrail: uv run pytest -m guardrail / fmt: uv run ruff format .(★고치는 것 — 게이트 아님). ci.yml job 7(gitleaks·lint·test·guardrail·phase0·go-watchdog·build) · toolchain 매트릭스 없음(python 3.12 단일). ⇒ CI 에만 있는 것 최소 3종(uv run ruff format --check . · pytest -m phase0 · gitleaks action). ★이력 실측: wie rust.yml 최근 200 run = 성공 166 · 실패 34, 실패 34건 전수 분해 → stable-only clippy 24 · ★beta-only clippy 9 · windows RUST_MIN_STACK test 1. qts ci.yml 최근 실패 60건(2026-07-18~2026-09-03) 전수 분해 → ruff format --check 포함 38 · ★그것이 유일한 실패 10 · ruff check 포함 7 · phase0-only 0. ※같은 도구의 최근 200 run 창은 성공 188 · 실패 2 · 취소 9 로 모집단이 다르다(전자는 실패만 60건까지 거슬러 올라간 창) — 비율은 그 창 안에서만 읽어야 한다. ★문서 실측: 문자열 beta 가 wie AGENTS.md·CLAUDE.md 에 0건 · 문자열 format 이 qts CLAUDE.md·AGENTS.md 에 0건(ruff 는 AGENTS.md 에 1회). ★이 repo 상태: python3 scripts/check-dod-ci-parity.py rc=0 · check-worklog-json.py rc=0 · .rs 변경 0 · rust.yml·CLAUDE.md DoD 블록 무접촉.", + "issues": [ + "★★RustJava 검사기를 «복사»하면 두 repo 다 틀린다. wie 에서는 조건부 step 이 «진짜 게이트»(cargo test)라 「조건부 = OS 축 = 제외」 규칙이 거짓 red 를 만들고, qts 에서는 Makefile 간접층 때문에 「DoD 줄 ↔ CI run 줄」 문자열 대조가 원리적으로 성립하지 않는다. ⇒ 제안 문면의 「복사하지 마라 — 먼저 그 repo 의 DoD 정본이 무엇인가를 실측해야 한다」가 실측으로 확인됐다.", + "★★세 repo 가 전부 「로컬 체크리스트 ↔ CI」 어긋남을 갖고 있었고, 어긋난 자리가 전부 규범 문서에 «적혀 있지 않았다» — RustJava = wasm32 줄 + beta 축 · wie = beta 축(문자열 beta 0건) · qts = ruff format --check(문자열 format 0건). 「사람이 문서를 최신으로 유지한다」가 세 repo에서 각각 실패했다. 이것이 기계 대조의 일반 근거다.", + "★먼저 할 일은 락이 아니라 «한 줄»이다 — wie 는 cargo +beta clippy --all -- -D warnings(이력 9/34 를 로컬로), qts 는 uv run ruff format --check .(이력 10/60 을 로컬로). ★락을 그 앞에 두지 마라: 락은 «어긋남을 막는» 것이지 «이미 난 어긋남을 고치는» 것이 아니다.", + "★wie 에서 교차곱(+beta fmt·+beta test)까지 넓히지 마라 — RustJava 가 이력 0건을 근거로 기각했다(…-cross-product-decision). wie 에서 넣으려면 wie 이력으로 다시 재라. wie 의 windows test 실패 1건은 OS 축이지 toolchain 축이 아니다.", + "★qts 의 go vet/go test 는 조건부 skip 이고 그 사실이 qts CLAUDE.md 에 이미 적혀 있다(「Go 는 이 맥북에 미설치라 watchdog 검증이 조용히 skip 된다 — 로컬 green 을 근거로 삼지 말고 PR CI 결과를 봐라」). ⇒ 그 축은 «몰라서 난 구멍»이 아니라 «알고 두는 값»이다. ruff format --check 와 같은 칸에 넣지 마라.", + "★모집단 주의: qts 의 「10/60」과 「최근 200 run 중 실패 2」는 «다른 창»이다. 전자는 실패만 60건까지 거슬러 올라간 창(2026-07-18~09-03)이고 후자는 최근 200 run 창이다. 비율을 창 밖으로 옮겨 인용하지 마라.", + "★형제 repo 는 다른 레인 소관이라 이 회차가 «고칠 수 없다» — T1·T2·T3 의 축과 합격선만 적었다. 발권은 총괄 몫이다.", + "머지하지 않았다 — 게이트②·③은 별 세션이다. ★게이트③은 등재 repo 라 merge_strategy: merge 필수." + ], + "proposals": [ + { + "title": "wie 의 four gates 에 beta 축 한 줄을 더하라 — 이력 9/34(26%)가 로컬로 들어온다", + "plainSummary": "wie 의 CI 는 두 가지 컴파일러 버전으로 검사하는데, 개발자가 로컬에서 돌리라고 적힌 목록에는 한 가지만 있다. 그래서 새 버전에서만 나는 경고가 로컬에서 안 보이고 PR 에서만 빨개진다.", + "userBenefit": "이력상 실패 34건 중 9건이 정확히 그 형태였다. 한 줄을 더하면 그 9건이 커밋 전에 잡힌다 — PR 을 열고 CI 를 기다린 뒤 고치는 왕복이 사라진다.", + "why": "wie AGENTS.md §Definition of Done 의 four gates 에 cargo +beta 가 없고, 문자열 beta 가 AGENTS.md·CLAUDE.md 어디에도 0건이다(rust.yml 주석에만 있다). RustJava 는 같은 구멍을 이력 2건에서 발견해 고쳤는데 wie 는 9건이 났는데도 열려 있다.", + "tradeoff": "⑴한 줄을 더하면 회차마다 beta clippy 가 붙는다(RustJava 실측: 편집 후 +6s — 재빌드가 아니라 lint 라 싸다). ⑵rustup component add --toolchain beta clippy 가 전제다(RustJava 에서는 beta 에 rustfmt 가 없었다 — 같은 함정). ⑶안 하면 26%의 실패가 계속 CI 에서만 드러난다.", + "effort": "XS — 문서 1줄 + 전제 명시. 이력 재인용이 대부분이다.", + "target": "wie · AGENTS.md §Definition of Done" + }, + { + "title": "qts 의 make lint 에 ruff format --check 를 더하라 — 이력 10/60(17%)의 «로컬 green ↔ CI red» 가 사라진다", + "plainSummary": "qts 의 CI 는 코드 서식을 검사하는데 로컬에서 돌리는 make lint 는 그것을 안 친다. 서식만 어긋난 상태로 PR 을 열면 로컬은 통과인데 CI 만 빨개진다.", + "userBenefit": "이력상 최근 실패 60건 중 10건이 «서식 검사만» 실패였다 — 전부 로컬에서 잡을 수 있었던 것이다. 38건은 서식 검사가 실패 목록에 포함돼 있었다.", + "why": "Makefile 의 lint 타깃은 uv run ruff check . 만 치고, fmt 타깃은 «고치는» 것이라 게이트가 아니다. CI lint job 은 ruff check 와 ruff format --check 를 «둘 다» 친다. 문자열 format 이 qts CLAUDE.md·AGENTS.md 어디에도 없다.", + "tradeoff": "⑴make lint 가 느려진다(ruff format --check 는 밀리초 단위라 실질 0). ⑵서식 위반이 로컬에서 커밋을 막게 되므로 make fmt 를 먼저 돌리는 습관이 필요하다. ⑶안 하면 17%의 실패가 계속 CI 왕복을 만든다.", + "effort": "XS — Makefile 1줄 + CLAUDE.md DoD 한 줄 명시(make fmt 와 혼동 방지).", + "target": "qts · Makefile lint 타깃 · CLAUDE.md §Definition of Done" + }, + { + "title": "파리티 락 포팅은 T1·T2 «뒤»에 · repo 별 파서 축을 먼저 정하라", + "plainSummary": "RustJava 가 만든 «로컬 목록 ↔ CI 자동 대조» 장치를 형제 저장소에도 두는 일이다. 다만 저장소마다 구조가 달라 그대로 복사하면 오히려 잘못된 빨간불이 난다.", + "userBenefit": "한 번 넣으면 그 저장소의 로컬 목록이 CI 와 어긋나는 순간 PR 이 빨개진다 — 문서가 조용히 낡아 다음 회차가 그것을 근거로 인용하는 연쇄가 끊긴다.", + "why": "wie 는 조건부 step 이 «진짜 게이트»(cargo test 가 windows/비-windows 2갈래)라 RustJava 의 「조건부 = 제외」가 거짓 red 를 만들고, env 접두 정규화와 다중 워크플로 스캔도 필요하다. qts 는 Makefile 간접층·축 B 부재·action 기반 검사 때문에 문자열 대조 자체가 성립하지 않는다.", + "tradeoff": "⑴repo 마다 파서를 만들면 세 벌이 된다(이 저장소가 규탄한 «두 벌» 형태의 확대). ⑵공용 도구로 빼면 정본 위치 설정 파일이 필요하고 그것이 다시 낡을 수 있다. ⑶안 하면 형제 repo 는 사람 손 대조로 남는다 — RustJava 에서 다섯 번 실패한 방식이다.", + "effort": "S~M(repo 당). 합격선: 정본 위치를 코드에 박을 것 · 성공에도 원소를 찍을 것 · 못 보는 것을 함께 찍을 것 · 개악 대조 ≥3건 red + 무개악 green.", + "target": "wie · qts · 총괄 발권 정책" + } + ], + "resolvedIssues": [ + "2026-09-04-dod-ci-parity-lock#p1 — 「같은 파리티 락이 형제 repo(wie·qts)에도 필요한지 판정하라」. repo 당 정본을 실측하고 대칭차를 «지금» 재고 이력으로 실익까지 확인해 «둘 다 ⒞ 조건부 필요» 로 판정했다. 검사기 포팅은 불가(구조 상이)이고, 먼저 할 일은 각 repo 의 한 줄이라는 것이 판정의 요지다." + ], + "adoptedProposals": [ + "2026-09-04-dod-ci-parity-lock#p1" + ], + "declinedProposals": [] +} diff --git a/docs/worklog/2026-09-04-parity-sibling-repo-survey.md b/docs/worklog/2026-09-04-parity-sibling-repo-survey.md new file mode 100644 index 0000000..3bd6e72 --- /dev/null +++ b/docs/worklog/2026-09-04-parity-sibling-repo-survey.md @@ -0,0 +1,162 @@ +# [2026-09-04] 형제 repo(`wie`·`qts`) 파리티 락 필요성 조사 — ★**둘 다 «조건부 필요»** + +**티켓**: `rustjava-dod-ci-parity-sibling-repo-survey` +**채택 제안**: `2026-09-04-dod-ci-parity-lock#p1` +**성격**: ★**읽기 전용 조사 + 판정** — 형제 repo **쓰기 0**(`git`·PR·파일 수정 전부 0) · 구현 **0** + +★**형제 repo 는 GitHub API 로만 읽었다**(`gh api repos//contents/...`) — 그 워킹트리·`.git` 을 건드리지 않았다. +⇒ 읽은 것은 **`origin/main` 의 내용**이고, 그 레인의 미커밋 작업은 이 조사에 들어오지 않는다. + +--- + +## 1. ★repo 당 «정본 실측» — 구조가 «같지 않다» + +| | **RustJava**(기준) | **wie** | **qts** | +|---|---|---|---| +| DoD 정본 | `CLAUDE.md` §Definition of Done 의 **첫 코드블록** | ★**`AGENTS.md`** §Definition of Done → 「The four gates」 코드블록(```sh · 4줄) | `CLAUDE.md` §Definition of Done — ★**코드블록이 «아니라» 산문**이고 내용이 **`make` 타깃 이름** | +| 간접층 | 없음(명령이 곧 명령) | 없음 | ★★**`Makefile` 이 있다** — `make lint`/`test`/`guardrail`/`sync` | +| CI 파일 | `rust.yml` **1개**(+`worklog_json`·`dod_parity` 동거) | `rust.yml` + ★**7개 더**(`coverage`·`engine-contract`·`web`·`publish-artifact`·…) | `ci.yml` + ★**11개 더**(배포 다수) | +| CI job | 3 | rust.yml 1(6셀) + 타 워크플로 다수 | ci.yml **7**(`gitleaks`·`lint`·`test`·`guardrail`·`phase0`·`go-watchdog`·`build`) | +| ★**toolchain 매트릭스** | `rust: [stable, beta]` | ★**`rust: [stable, beta]`**(동일) | ★★**없다**(python 3.12 단일) ⇒ **축 B 자체가 없다** | +| 조건부 step 의 성격 | ★**설정뿐**(windows `git config`) | ★★**«진짜 게이트»가 조건부**(`cargo test` 가 windows/비-windows 2 step) | 설정 + 배포(`build` job) | + +⇒ ★★**「구조가 같은가」의 답: wie 는 «비슷하나 같지 않다» · qts 는 «다르다».** + +## 2. ★두 집합의 대칭차 — «지금» 쟀다(원소 나열) + +★**전제**: 「대칭차가 0 이면 «지금은 안 어긋나 있다»이지 «어긋날 수 없다»가 아니다」 — +★**그런데 두 repo 다 «0 이 아니다».** 그래서 이 구별을 쓸 자리가 아니었다. + +### ⒜ `wie` — RustJava 파서 규칙을 «그대로» 적용했을 때 + +**축 A(명령)** · CI 비조건부 `- run:` **3** ↔ DoD **4**: + +| 명령 | CI | DoD | +|---|---|---| +| `cargo fmt --all -- --check` | y | y | +| `cargo clippy --all -- -D warnings` | y | y | +| `cargo clippy --target wasm32-unknown-unknown -- -D warnings` | y | y | +| ★`RUST_MIN_STACK=4194304 cargo test --all` | ★**n**(조건부 2 step · 블록 스칼라) | y | + +⇒ 대칭차 **1** — ★★**그런데 이것은 «거짓 양성»이다.** CI 는 그 검사를 **정말로 친다**. 다만 +⑴`if:` 로 windows/비-windows 두 갈래이고 ⑵`export RUST_MIN_STACK=…` 를 **별 줄**에 쓴 **블록 스칼라**라 +RustJava 의 「조건부 = OS 축 = 제외」 규칙과 「한 줄 문자열 동일성」에 둘 다 걸린다. + +**축 B(toolchain)** · CI `{stable, beta}` ↔ DoD `{stable}`: + +| toolchain | CI | DoD | +|---|---|---| +| stable | y | y | +| ★**beta** | ★**y** | ★★**n** | + +⇒ 대칭차 **1** — ★★**이것은 «진짜»다.** `cargo +beta` 는 wie 의 **4 gates 에 없고**, +★**`beta` 라는 문자열이 `AGENTS.md`·`CLAUDE.md` 어디에도 «0건»** 이다(`rust.yml` 주석에만 있다). + +### ⒝ `qts` — ★**문자열 대조가 원리적으로 안 맞는다** ⇒ «의미»로 폈다 + +`make` 타깃을 Makefile 로 펼친 DoD 집합: +`uv sync --all-packages` · `uv run ruff check .` · `uv run pytest` · `uv run pytest -m guardrail` +(+ `go vet ./...` · `go test ./...` — ★**둘 다 `command -v go` 조건부라 이 맥북에서는 «조용히 skip»**) + +`ci.yml` 의 검사 집합 ↔ 위: + +| CI 검사 | 로컬 DoD 에 있나 | +|---|---| +| `uv run ruff check .` | y | +| ★**`uv run ruff format --check .`** | ★★**n — 진짜 gap** | +| `uv run pytest -ra` | y(플래그만 다름) | +| `uv run pytest -m guardrail -ra` | y(〃) | +| ★`uv run pytest -m "phase0 and not integration" -ra` | ★**n** | +| ★`gitleaks-action`(★`run:` 이 아니라 **action**) | ★**n** — `run:` 파서가 **원리적으로 못 본다** | +| `go vet` / `go test`(job `go-watchdog`) | ★**조용히 skip**(qts `CLAUDE.md` 가 이미 그 사실을 적어 뒀다) | + +⇒ ★**CI 에만 있는 것 = 최소 3종**(`ruff format --check` · `phase0` · `gitleaks`). +★**`ruff format --check` 는 `CLAUDE.md`·`AGENTS.md` 어디에도 «없다»**(「ruff」만 1회 언급). + +## 3. ★실익을 «이력»으로 쟀다 — 두 곳 다 «실제로 났다» + +RustJava 회차가 「이력 0건이면 안 넣는다」로 판정했으므로 **같은 자로** 쟀다. + +### ⒜ `wie` — `rust.yml` 최근 **200 run**(성공 **166** · 실패 **34**) · ★**실패 34건 전수 분해** + +| 형태 | 건수 | 로컬 DoD 가 잡나 | +|---|---|---| +| `cargo clippy --all` 이 **stable** 에서 실패 | **24** | ✔ 잡는다 | +| ★★`cargo clippy --all` 이 ★**beta 에서만** 실패 | ★**9** | ✘ ★**못 잡는다**(DoD 에 `+beta` 가 없다) | +| windows `RUST_MIN_STACK` test 실패 | 1 | ✘(OS 축 — 로컬 재현 불가) | + +⇒ ★★**「로컬 green ↔ CI red」가 «9건 / 34건 = 26%»** 이고, ★**한 줄(`cargo +beta clippy --all -- -D warnings`)이 그 전부를 로컬로 끌어온다.** +★**RustJava 는 이 구멍을 이력 «2건»에서 발견해 고쳤는데, wie 는 «9건»이 났는데도 열려 있다.** + +### ⒝ `qts` — `ci.yml` 최근 **실패 60건**(2026-07-18 ~ 2026-09-03) 전수 분해 + +| 형태 | 건수 | 로컬 DoD 가 잡나 | +|---|---|---| +| `uv run ruff format --check .` 가 실패 step 에 **포함** | **38 / 60 (63%)** | ✘ | +| ★★그중 ★**그것이 «유일한» 실패** | ★**10 / 60 (17%)** | ✘ ★**로컬 DoD 를 전부 돌려도 green 이었다** | +| `uv run ruff check .`(= `make lint` 가 치는 것) | 7 | ✔ | +| `phase0` 만 실패 | **0** | — | + +★**모집단을 흐리지 않는다**: 같은 도구의 「최근 **200 run**」 창에서는 성공 188 · 실패 2 · 취소 9 다 — +★**두 창의 모집단이 다르다**(위 60건은 «실패만» 60건까지 거슬러 올라간 창이다). 비율은 **그 창 안에서만** 읽어라. + +## 4. ★판정 — repo 별 + +### ⒜ `wie` = ★**⒞ 조건부 «필요»** + +★★**단 «먼저 할 일»은 파리티 락이 «아니다» — DoD 한 줄이다.** +> ★**`AGENTS.md` §Definition of Done 의 four gates 에 `cargo +beta clippy --all -- -D warnings` 를 더하라.** +> 그 한 줄이 이력 **9/34(26%)** 를 로컬로 끌어온다. ★**파리티 락은 그 «다음»이다.** + +★**파리티 락을 포팅하려면 파서를 «세 군데» 고쳐야 한다** — 복사로는 안 된다: +⑴★**조건부 step 이 «진짜 게이트»일 수 있다**(RustJava 는 설정뿐이었다) ⇒ 「조건부 = 제외」가 **거짓 red** 를 만든다 +⑵★**env 접두 정규화**(`RUST_MIN_STACK=… cargo test` ↔ `export …` + 별 줄 블록 스칼라) +⑶★**다중 워크플로**(검사가 `coverage`·`engine-contract`·`web` 에도 있다) ⇒ 단일 파일 파서 부족 + +### ⒝ `qts` = ★**⒞ 조건부 «필요»** + +★★**RustJava 검사기는 «포팅 불가»다** — 구조가 다르다: +⑴★**`Makefile` 간접층** ⇒ 「DoD 줄 ↔ CI `run:` 줄」 문자열 대조가 **원리적으로 성립하지 않는다** +⑵★**toolchain 매트릭스가 없다** ⇒ **축 B 가 아예 없다**(검사기의 절반이 무의미) +⑶★**action 기반 검사**(`gitleaks-action`)는 `run:` 이 아니라 **어떤 `run:` 파서도 못 본다** + +★★**단 «먼저 할 일»은 여기서도 한 줄이다.** +> ★**`make lint` 에 `uv run ruff format --check .` 를 더하라**(또는 DoD 가 그것을 직접 부르게 하라). +> 그 한 줄이 이력 **10/60(17%)의 «로컬 green ↔ CI red»** 를 없앤다. + +그 뒤에도 기계로 잠그려면 ★**Makefile 을 펼쳐 CI 와 대조하는 «다른» 검사기**가 필요하다(이 회차 범위 밖). + +### ⒞ ★공통 — 이 조사가 확인한 «일반 사실» 하나 + +★★**세 repo 가 전부 「로컬 체크리스트 ↔ CI」 어긋남을 갖고 있었고, 어긋난 자리가 전부 «규범 문서에 적혀 있지 않았다».** +RustJava = wasm32 줄 + beta 축 · wie = **beta 축**(문자열 `beta` 가 규범 문서에 **0건**) · +qts = **`ruff format --check`**(문자열 `format` 이 규범 문서에 **0건**). +⇒ ★**「사람이 문서를 최신으로 유지한다」는 세 repo에서 «각각» 실패했다.** 이것이 기계 대조의 일반 근거다. + +## 5. ★다음 티켓의 «축과 합격선»(구현은 이 회차 밖 · ★그 repo 레인 몫) + +★**이 회차는 형제 repo 를 한 바이트도 고치지 않았다.** 아래는 **총괄이 그 레인에 발권할 때** 쓸 재료다. + +### T1 — `wie`: four gates 에 beta 축 추가 (**XS** · 선행) +- **축**: `AGENTS.md` §Definition of Done 의 코드블록에 `cargo +beta clippy --all -- -D warnings` 1줄. +- **합격선**: ⑴그 줄 rc=0 ⑵★**이력 재계산** — 「beta 셀에서만 실패한 run」이 이제 로컬로 잡히는지 + 회신에 **9/34 를 인용**하고 ⑶`rustup component add --toolchain beta clippy` 전제를 **명시**(RustJava 실측: beta 에 `rustfmt` 가 없었다). +- ★**넓히지 마라** — `+beta fmt`·`+beta test` 는 RustJava 가 **이력 0건**을 근거로 기각했다(`…-cross-product-decision`). + wie 에서 넣으려면 **wie 이력으로 다시 재라**(그 repo 의 windows test 실패 1건은 OS 축이지 toolchain 축이 아니다). + +### T2 — `qts`: `make lint` 에 포맷 검사 추가 (**XS** · 선행) +- **축**: `Makefile` `lint:` 에 `uv run ruff format --check .` 1줄(★`make fmt` 는 «고치는» 것이라 게이트가 아니다). +- **합격선**: ⑴`make lint` rc=0 ⑵★**이력 인용** 10/60 ⑶★**`make fmt` 와 혼동하지 않도록 CLAUDE.md DoD 에 한 줄 명시.** + +### T3 — 파리티 락 포팅 (**S~M** · ★T1·T2 «뒤») +- **합격선(공통)**: ⒜정본 위치를 **코드에 박을 것**(문서 금지 — RustJava 계약 3) ⒝**성공에도 원소를 찍을 것**(조용한 통과 금지) + ⒞**못 보는 것을 그 자리에서 찍을 것** ⒟★**개악 대조 ≥3건 red · 무개악 green**(공허하지 않음 증명). +- **wie 전용 축**: 조건부 step 을 «게이트/설정»으로 가를 술어 · env 접두 정규화 · **다중 워크플로 스캔**. +- **qts 전용 축**: **Makefile 타깃 전개** · 축 B 부재 처리 · action 기반 검사를 «못 본다»고 **명시 출력**. +- ★**T3 를 T1·T2 «앞»에 두지 마라** — 락은 «어긋남을 막는» 것이지 «이미 난 어긋남을 고치는» 것이 아니다. + +## 6. 경계 + +★**형제 repo 쓰기 0** — `git` 명령 0 · PR 0 · 파일 수정 0(전부 `gh api … /contents` 읽기). +★`.rs` **0줄** · 이 repo 의 **검사기·`rust.yml` 무접촉** · **DoD 블록 무접촉** · +머지 **0** · force-push **0** · `main` 직접 push **0** · 시크릿 출력 **0** · upstream 발신 **0** · 맨 `grep` **0**. From 5c2ed7bc6ec3f64a62c6085e4f9b927506eb96ff Mon Sep 17 00:00:00 2001 From: jun0 Date: Fri, 4 Sep 2026 23:18:49 +0900 Subject: [PATCH 2/3] =?UTF-8?q?docs:=20=EC=8A=A4=ED=83=9D=20=EA=B3=A0?= =?UTF-8?q?=EC=A7=80=20=C2=B7=20=ED=8C=8C=EC=84=9C=204=EB=B2=88=EC=A7=B8?= =?UTF-8?q?=20=EC=B6=95=20=C2=B7=20=E3=80=8C=ED=8F=AC=ED=8C=85=20=EB=B6=88?= =?UTF-8?q?=EA=B0=80=E3=80=8D=EB=A5=BC=20qts=20=EB=A1=9C=20=ED=95=9C?= =?UTF-8?q?=EC=A0=95=20[rustjava-dod-ci-parity-sibling-repo-survey]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게이트² request-changes(F1·F1-⒝·F2·F3·F4) 승계. 문서만 — 코드 0줄. 판정(⒞ 조건부 필요 · 축 B beta · 대칭차 값)은 무접촉이다(검수자가 재현했다). F1 — §0 신설. 이 PR 은 스택이다: 204f98b(#27 의 구현 커밋)이 이 브랜치의 조상이고 (--is-ancestor rc=0), #28 은 #27 의 옛 상태를 업고 있다(e9e2a8e1 ↔ ed046208 rc=1 · merge-tree rc=1 CONFLICT STATE.md). 착지 순서 #27 → #28. 단 base 가 main 이라 #27 의 브랜치가 지워져도 이 PR 이 닫히지는 않는다(ripple 사고와 다른 형상). 초판이 MERGEABLE 로 보였던 이유(GitHub 이 #27 이전 main 과 대조)도 적었고, 그 예정이 실현됐음을 갱신했다 — #27 이 ba4bb417 로 착지했고 워밍 후 재조회는 CONFLICTING/DIRTY · 충돌 STATE.md 1건. 그 1건은 게이트③ 2-c⒜ 승인 범위 안이고 코드 충돌 0 이다. 해소는 하지 않았다. F1-⒝ — 「검사기 무접촉」을 이 회차 커밋으로 한정. PR 파일 목록의 scripts/check-dod-ci-parity.py 5+ 는 #27 의 것이고, 이 회차 커밋은 결백하다 (git diff 204f98b..ed046208 -- '*.rs' scripts/ .github/ CLAUDE.md → 0). F2 — §1⒜ 의 「«그대로» 적용」이 부정확했다(손으로 주석을 벗기고 잰 값이다 · 분석값 1 은 옳다). 상수 1줄만 바꿔 wie 에 돌리면 rc=1 · 축 A 대칭차 7(CI 3 / DoD 4)이 나오고, 원인은 four gates 4줄의 후행 주석을 norm() 이 안 벗기는 것이다. RustJava 자신의 DoD 에는 주석이 없어 그 파서가 이 축을 만난 적이 없다. ⇒ T3 의 wie 전용 축을 3 → 4 로. F3 — 「포팅 불가」를 qts 로 한정(qts 는 sys.exit · wie 는 돈다). 표제·PR 제목 정정. F4 — T3 합격선에 「세는 명령 + 오늘의 값」 한 줄(wie 9 · qts 38). T1·T2 가 오늘의 어긋남을 닫아 버리므로 그것이 없으면 ⒞ 를 기계로 다시 물을 수 없다. --- ...2026-09-04-parity-sibling-repo-survey.json | 13 ++-- .../2026-09-04-parity-sibling-repo-survey.md | 65 +++++++++++++++++-- 2 files changed, 69 insertions(+), 9 deletions(-) diff --git a/docs/worklog/2026-09-04-parity-sibling-repo-survey.json b/docs/worklog/2026-09-04-parity-sibling-repo-survey.json index c88dc4e..f483012 100644 --- a/docs/worklog/2026-09-04-parity-sibling-repo-survey.json +++ b/docs/worklog/2026-09-04-parity-sibling-repo-survey.json @@ -1,17 +1,18 @@ { "schema": 1, "date": "2026-09-04", - "title": "형제 repo(wie·qts) 파리티 락 필요성 조사 — 둘 다 «조건부 필요» · 그러나 검사기는 포팅 불가", + "title": "형제 repo(wie·qts) 파리티 락 필요성 조사 — 둘 다 «조건부 필요» · 포팅은 qts «불가» / wie «상수 복사로는 불가 · 파서 4축 수정 후 가능»", "services": [ "RustJava" ], "taskId": "rustjava-dod-ci-parity-sibling-repo-survey", - "summary": "채택 제안 2026-09-04-dod-ci-parity-lock#p1 에 대한 읽기 전용 조사 + 판정이다. 형제 repo 는 GitHub API(gh api repos//contents/...)로만 읽었고 워킹트리·.git 을 건드리지 않았다 — 쓰기 0. ★구조 판정: RustJava(CLAUDE.md DoD 코드블록 ↔ rust.yml 단일 파일)와 wie 는 «비슷하나 같지 않고», qts 는 «다르다». wie 의 DoD 정본은 AGENTS.md 이고 CI 의 4번째 게이트(cargo test)가 if: 로 갈린 2 step + 블록 스칼라라 RustJava 파서를 그대로 적용하면 «거짓 red» 가 난다. qts 는 DoD 가 make 타깃 이름(산문)이라 Makefile 간접층이 있고, toolchain 매트릭스가 아예 없어 축 B 가 성립하지 않으며, gitleaks 는 action 이라 어떤 run: 파서도 못 본다. ★대칭차는 두 repo 다 0 이 아니고 «이력으로도» 실재를 확인했다: wie 는 rust.yml 최근 200 run 중 실패 34건 전수 분해에서 beta 셀에서만 실패한 clippy 가 9건(26%)인데 DoD 4 gates 에 cargo +beta 가 없다(문자열 beta 가 AGENTS.md·CLAUDE.md 에 0건). qts 는 ci.yml 최근 실패 60건 전수 분해에서 uv run ruff format --check . 가 38건에 포함되고 그중 10건(17%)은 그것이 «유일한» 실패였다 — make lint 는 그 명령을 치지 않으므로 로컬 DoD 를 전부 돌려도 green 이었다(문자열 format 이 규범 문서에 0건). ★판정: 둘 다 ⒞ 조건부 필요. 그러나 먼저 할 일은 파리티 락이 아니라 각 한 줄이다 — wie 는 four gates 에 cargo +beta clippy --all -- -D warnings, qts 는 make lint 에 uv run ruff format --check . 다. 락 포팅은 그 뒤이고, wie 는 파서 3군데(조건부 게이트 판별·env 접두 정규화·다중 워크플로), qts 는 Makefile 전개·축 B 부재·action 검사 명시를 각각 요구한다. 구현 0 — 형제 repo 는 다른 레인 소관이라 축과 합격선만 적었다.", + "summary": "채택 제안 2026-09-04-dod-ci-parity-lock#p1 에 대한 읽기 전용 조사 + 판정이다. 형제 repo 는 GitHub API(gh api repos//contents/...)로만 읽었고 워킹트리·.git 을 건드리지 않았다 — 쓰기 0. ★구조 판정: RustJava(CLAUDE.md DoD 코드블록 ↔ rust.yml 단일 파일)와 wie 는 «비슷하나 같지 않고», qts 는 «다르다». wie 의 DoD 정본은 AGENTS.md 이고 CI 의 4번째 게이트(cargo test)가 if: 로 갈린 2 step + 블록 스칼라라 RustJava 파서를 그대로 적용하면 «거짓 red» 가 난다. qts 는 DoD 가 make 타깃 이름(산문)이라 Makefile 간접층이 있고, toolchain 매트릭스가 아예 없어 축 B 가 성립하지 않으며, gitleaks 는 action 이라 어떤 run: 파서도 못 본다. ★대칭차는 두 repo 다 0 이 아니고 «이력으로도» 실재를 확인했다: wie 는 rust.yml 최근 200 run 중 실패 34건 전수 분해에서 beta 셀에서만 실패한 clippy 가 9건(26%)인데 DoD 4 gates 에 cargo +beta 가 없다(문자열 beta 가 AGENTS.md·CLAUDE.md 에 0건). qts 는 ci.yml 최근 실패 60건 전수 분해에서 uv run ruff format --check . 가 38건에 포함되고 그중 10건(17%)은 그것이 «유일한» 실패였다 — make lint 는 그 명령을 치지 않으므로 로컬 DoD 를 전부 돌려도 green 이었다(문자열 format 이 규범 문서에 0건). ★[게이트² F2·F3 정정] 「검사기 포팅 불가」는 «qts 에만» 참이다 — 상수 1줄(DOD_FILE → AGENTS.md)만 바꿔 wie 에 돌리면 도구가 «돈다»(rc=1 · 축 A 대칭차 7 = CI 에만 3 · DoD 에만 4 · 축 B beta 1). 그 7 은 «거짓»이고 원인은 네 번째 축이다 — wie 의 four gates 4줄이 전부 후행 주석을 달고 있는데 parse_dod → norm() 이 공백만 접고 주석을 벗기지 않는다(RustJava 자신의 DoD 에는 주석이 없어 그 파서가 이 축을 만난 적이 없다). ⇒ wie 는 «상수 복사로는 불가 · 파서 4축 수정 후 가능», qts 는 «불가»(sys.exit)다. ★[F1] 이 PR 은 «스택»이다 — 204f98b(#27 의 구현 커밋)이 이 브랜치의 조상이고 착지 순서는 #27 → #28 이다. ★판정: 둘 다 ⒞ 조건부 필요. 그러나 먼저 할 일은 파리티 락이 아니라 각 한 줄이다 — wie 는 four gates 에 cargo +beta clippy --all -- -D warnings, qts 는 make lint 에 uv run ruff format --check . 다. 락 포팅은 그 뒤이고, wie 는 파서 3군데(조건부 게이트 판별·env 접두 정규화·다중 워크플로), qts 는 Makefile 전개·축 B 부재·action 검사 명시를 각각 요구한다. 구현 0 — 형제 repo 는 다른 레인 소관이라 축과 합격선만 적었다.", "changes": [ "docs/worklog/2026-09-04-parity-sibling-repo-survey.{md,json} 신설 — 정본 위치 실측표 · 대칭차 원소 나열 · 이력 전수 분해 · repo 별 판정 · 다음 티켓 3건(T1·T2·T3)의 축과 합격선.", "docs/upstream-sync-approach.md §4 — 조사 결과 요약 3줄(다음 RustJava 회차가 같은 조사를 반복하지 않도록).", "STATE.md · REPORT.md — 회차 기록.", - "★형제 repo(wie·qts) 변경 0 — git 명령 0 · PR 0 · 파일 수정 0. 이 repo 의 검사기·rust.yml·DoD 블록도 무접촉." + "★형제 repo(wie·qts) 변경 0 — git 명령 0 · PR 0 · 파일 수정 0. 이 repo 의 검사기·rust.yml·DoD 블록도 무접촉.", + "★[fix · 게이트² request-changes 승계 · 문서만] F1 스택 고지(§0 신설 — 스택 사실·착지 순서 #27→#28·예정된 STATE.md 충돌·초판이 MERGEABLE 로 보였던 이유·그 예정이 실현됐다는 갱신) · F1-⒝ 「검사기 무접촉」을 «이 회차 커밋» 으로 한정(PR 파일 목록의 scripts/check-dod-ci-parity.py 5+ 는 #27 의 것) · F2 §1⒜ 의 「«그대로» 적용」 문면 정정 + T3 의 wie 전용 축을 3 → ★4 로(후행 주석 절삭) · F3 표제·PR 제목의 「포팅 불가」를 qts 로 한정 · F4 T3 합격선에 「세는 명령 + 오늘의 값」 한 줄." ], "deploy": { "sha": "", @@ -26,7 +27,11 @@ "★qts 의 go vet/go test 는 조건부 skip 이고 그 사실이 qts CLAUDE.md 에 이미 적혀 있다(「Go 는 이 맥북에 미설치라 watchdog 검증이 조용히 skip 된다 — 로컬 green 을 근거로 삼지 말고 PR CI 결과를 봐라」). ⇒ 그 축은 «몰라서 난 구멍»이 아니라 «알고 두는 값»이다. ruff format --check 와 같은 칸에 넣지 마라.", "★모집단 주의: qts 의 「10/60」과 「최근 200 run 중 실패 2」는 «다른 창»이다. 전자는 실패만 60건까지 거슬러 올라간 창(2026-07-18~09-03)이고 후자는 최근 200 run 창이다. 비율을 창 밖으로 옮겨 인용하지 마라.", "★형제 repo 는 다른 레인 소관이라 이 회차가 «고칠 수 없다» — T1·T2·T3 의 축과 합격선만 적었다. 발권은 총괄 몫이다.", - "머지하지 않았다 — 게이트②·③은 별 세션이다. ★게이트③은 등재 repo 라 merge_strategy: merge 필수." + "머지하지 않았다 — 게이트②·③은 별 세션이다. ★게이트③은 등재 repo 라 merge_strategy: merge 필수.", + "★★[F1] 이 PR 은 «스택»이다 — 204f98b(#27 의 구현 커밋)이 이 브랜치의 조상이고(merge-base --is-ancestor rc=0), #28 은 #27 의 «옛» 상태를 업고 있다(e9e2a8e1 ↔ ed046208 rc=1). 초판은 그 사실을 한 줄도 적지 않았다(base main 뿐). ★단 base 가 main 이라 #27 의 브랜치가 지워져도 이 PR 이 «닫히지»는 않는다 — 계약 5 의 ripple 사고(자식 base 가 부모 브랜치)와 다른 형상이다. ★그리고 예정된 STATE.md 충돌은 «실현»됐다(#27 이 ba4bb417 로 착지 · 워밍 후 재조회 CONFLICTING/DIRTY · 충돌 파일 STATE.md 1건). 그 1건은 게이트③ 계약 2-c⒜ 의 «원장 파일 한정» 승인 범위 안이고 코드 파일 충돌은 0 이다. ★이 회차는 해소하지 않았다(게이트③ 몫 · 충돌 집합은 그때의 값).", + "★★[F2] RustJava 파서에 «네 번째 축»이 있다 — DoD 줄의 후행 주석 절삭. wie 의 four gates 4줄이 전부 후행 주석을 달고 있는데 norm() 은 공백만 접고 주석을 벗기지 않아 4줄 전건 불일치가 나고, 상수 1줄만 바꿔 돌리면 rc=1 · 축 A 대칭차 7(CI 에만 3 · DoD 에만 4)이 나온다. ★RustJava 자신의 DoD 에는 주석이 «없어서» 그 파서가 이 축을 만난 적이 없다. ★안 적으면 다음 워커가 거짓 7건을 만난 뒤 회차 중간에 발견한다.", + "★[F3] 「검사기 포팅 불가」는 qts 에만 참이다 — qts 는 DoD 절에 코드블록이 없어 sys.exit 로 죽고, wie 는 «돈다»(값이 틀릴 뿐). 요약이 본문보다 강했던 것을 표제·PR 제목에서 한정했다.", + "★[F4] T3 합격선에 「세는 명령 + 오늘의 값」을 넣었다 — T1·T2 가 «오늘의 어긋남»을 닫아 버리므로 그 뒤 「언제 락이 필요해지는가」를 기계로 다시 물으려면 명령이 필요하다. 오늘의 값: wie 9 · qts 38." ], "proposals": [ { diff --git a/docs/worklog/2026-09-04-parity-sibling-repo-survey.md b/docs/worklog/2026-09-04-parity-sibling-repo-survey.md index 3bd6e72..e27c967 100644 --- a/docs/worklog/2026-09-04-parity-sibling-repo-survey.md +++ b/docs/worklog/2026-09-04-parity-sibling-repo-survey.md @@ -1,4 +1,5 @@ # [2026-09-04] 형제 repo(`wie`·`qts`) 파리티 락 필요성 조사 — ★**둘 다 «조건부 필요»** +# ★**포팅: `qts` 는 «불가» · `wie` 는 «상수 복사로는 불가 · 파서 4축 수정 후 가능»** **티켓**: `rustjava-dod-ci-parity-sibling-repo-survey` **채택 제안**: `2026-09-04-dod-ci-parity-lock#p1` @@ -7,6 +8,30 @@ ★**형제 repo 는 GitHub API 로만 읽었다**(`gh api repos//contents/...`) — 그 워킹트리·`.git` 을 건드리지 않았다. ⇒ 읽은 것은 **`origin/main` 의 내용**이고, 그 레인의 미커밋 작업은 이 조사에 들어오지 않는다. +## 0. ★★[게이트² F1 정정] 이 PR 은 «스택»이다 — 착지 순서와 예정된 충돌 + +★**초판은 이 사실을 «한 줄도» 적지 않았다**(`base main` 뿐). 실측이다: + +``` +PR #28 : 61d5bf3 → 204f98b [#27 의 커밋] → ed04620 +PR #27 : 61d5bf3 → 204f98b → e9e2a8e1 +git merge-base --is-ancestor 204f98b <#28 head> → rc=0 ★#28 은 #27 의 커밋을 «업고» 있다(스택) +git merge-base --is-ancestor e9e2a8e1 ed046208 → rc=1 ★#28 은 #27 의 «옛» 상태를 업고 있다 +git merge-tree --write-tree e9e2a8e1 ed046208 → rc=1 CONFLICT: STATE.md +``` + +⇒ ⑴★**스택 사실**: `204f98b`(=#27 의 구현 커밋)이 이 브랜치의 **조상**이다. +⑵★**착지 순서 = `#27` → `#28`.** ★단 **base 는 `main`** 이라 #27 의 브랜치가 지워져도 이 PR 이 «닫히지»는 않는다 +(계약 5 의 `ripple` 사고는 자식의 base 가 «부모 브랜치»였던 형상이다 — **다른 형상**이다). +⑶★★**#27 착지 «후» `STATE.md` 충돌이 «예정»돼 있고, 그때 그 항목의 재작성이 필요하다.** + +★**초판 작성 시점에 `MERGEABLE` 로 보였던 이유**: GitHub 이 ★**«#27 이전» main** 과 대조했기 때문이다. +★★**[갱신 · 이 정정 회차 실측] 그 «예정»은 «실현»됐다** — #27 이 `ba4bb417` 로 **착지했고**, +워밍 후 재조회에서 이 PR 은 ★**`CONFLICTING` / `DIRTY`**, 충돌 파일은 ★**`STATE.md` «1건»**이다 +(`git merge-tree --write-tree --name-only <#28 head> origin/main` → rc=1 · `STATE.md`). +⇒ ★**그 1건은 게이트③ 계약 2-c⒜ 의 «원장 파일 한정» 승인 범위 «안»이고 코드 파일 충돌은 0** 이다. +★★**이 회차는 그것을 «해소하지 않는다»** — 해소는 게이트③의 몫이고, ★**충돌 집합은 «그때의 값»이라 그 회차가 착수 시점에 다시 재야 한다**(2-c⒜⑴). + --- ## 1. ★repo 당 «정본 실측» — 구조가 «같지 않다» @@ -27,7 +52,10 @@ ★**전제**: 「대칭차가 0 이면 «지금은 안 어긋나 있다»이지 «어긋날 수 없다»가 아니다」 — ★**그런데 두 repo 다 «0 이 아니다».** 그래서 이 구별을 쓸 자리가 아니었다. -### ⒜ `wie` — RustJava 파서 규칙을 «그대로» 적용했을 때 +### ⒜ `wie` — RustJava 파서 «규칙»을 적용했을 때(★**손으로** — 도구를 그대로 돌린 값이 아니다) + +★★**[게이트² F2 정정] 초판의 「«그대로» 적용」은 «부정확»했다.** 아래 표는 ★**후행 주석을 손으로 벗기고** 잰 값이다. +★**분석값 «1» 은 옳다 — 틀린 것은 «그대로» 라는 말이다.** 도구를 실제로 돌리면 다른 수가 나온다(→ §4⒜ 넷째 축). **축 A(명령)** · CI 비조건부 `- run:` **3** ↔ DoD **4**: @@ -108,14 +136,19 @@ RustJava 회차가 「이력 0건이면 안 넣는다」로 판정했으므로 * > ★**`AGENTS.md` §Definition of Done 의 four gates 에 `cargo +beta clippy --all -- -D warnings` 를 더하라.** > 그 한 줄이 이력 **9/34(26%)** 를 로컬로 끌어온다. ★**파리티 락은 그 «다음»이다.** -★**파리티 락을 포팅하려면 파서를 «세 군데» 고쳐야 한다** — 복사로는 안 된다: +★★**`wie` 는 «포팅 불가»가 «아니다» — «상수 복사로는 불가 · 파서 «네 군데» 수정 후 가능»이다**(F3 정정): ⑴★**조건부 step 이 «진짜 게이트»일 수 있다**(RustJava 는 설정뿐이었다) ⇒ 「조건부 = 제외」가 **거짓 red** 를 만든다 ⑵★**env 접두 정규화**(`RUST_MIN_STACK=… cargo test` ↔ `export …` + 별 줄 블록 스칼라) ⑶★**다중 워크플로**(검사가 `coverage`·`engine-contract`·`web` 에도 있다) ⇒ 단일 파일 파서 부족 +⑷★★**DoD 줄의 «후행 주석» 절삭**(F2) — 아래 §4⒜ 의 실행 출력이 그 증거다. + +★★**[게이트² F2 · 실행으로 확인] 상수 «1줄»(`DOD_FILE` → `AGENTS.md`)만 바꿔 `wie` 에 돌렸다** +(경로·제목은 `wie` 도 같아 치환이 필요 없었다) — ★**rc=1 · 축 A 대칭차 «7»**(CI 에만 **3** · DoD 에만 **4**) · 축 B 는 `beta` **1**. +⇒ ★**`wie` 에서 그 도구는 «돈다»**(`qts` 는 `sys.exit`) — 그래서 「포팅 불가」는 `qts` 에만 참이다. ### ⒝ `qts` = ★**⒞ 조건부 «필요»** -★★**RustJava 검사기는 «포팅 불가»다** — 구조가 다르다: +★★**RustJava 검사기는 ★`qts` 에서 «포팅 불가»다 — 구조가 다르다**(★`wie` 는 «돈다» — 위 ⒜ 참조): ⑴★**`Makefile` 간접층** ⇒ 「DoD 줄 ↔ CI `run:` 줄」 문자열 대조가 **원리적으로 성립하지 않는다** ⑵★**toolchain 매트릭스가 없다** ⇒ **축 B 가 아예 없다**(검사기의 절반이 무의미) ⑶★**action 기반 검사**(`gitleaks-action`)는 `run:` 이 아니라 **어떤 `run:` 파서도 못 본다** @@ -151,12 +184,34 @@ qts = **`ruff format --check`**(문자열 `format` 이 규범 문서에 **0건** ### T3 — 파리티 락 포팅 (**S~M** · ★T1·T2 «뒤») - **합격선(공통)**: ⒜정본 위치를 **코드에 박을 것**(문서 금지 — RustJava 계약 3) ⒝**성공에도 원소를 찍을 것**(조용한 통과 금지) ⒞**못 보는 것을 그 자리에서 찍을 것** ⒟★**개악 대조 ≥3건 red · 무개악 green**(공허하지 않음 증명). -- **wie 전용 축**: 조건부 step 을 «게이트/설정»으로 가를 술어 · env 접두 정규화 · **다중 워크플로 스캔**. +- **wie 전용 축 ★«넷»**: ⑴조건부 step 을 «게이트/설정»으로 가를 술어 ⑵env 접두 정규화 ⑶**다중 워크플로 스캔** + ⑷★★**DoD 줄의 «후행 주석» 절삭** — `wie` 의 four gates **4줄이 전부** 후행 주석을 달고 있는데 + (`cargo fmt --all -- --check # rust.yml: formatting gate`) `parse_dod → norm()` 은 **공백만 접고 주석을 벗기지 않는다**. + ★**RustJava 자신의 DoD 에는 주석이 «없어서» 그 파서가 이 축을 만난 적이 없다.** + ★**안 늘리면 다음 워커가 «거짓 대칭차 7건»을 만난 뒤 회차 «중간»에 이 축을 발견한다.** - **qts 전용 축**: **Makefile 타깃 전개** · 축 B 부재 처리 · action 기반 검사를 «못 본다»고 **명시 출력**. - ★**T3 를 T1·T2 «앞»에 두지 마라** — 락은 «어긋남을 막는» 것이지 «이미 난 어긋남을 고치는» 것이 아니다. +- ★★**[게이트² F4] «언제 락이 필요해지는가»를 «잴 명령»과 «오늘의 값»으로 적어라** — 부모 회차(#27)가 같은 자리에 + 그 형태를 박았다. ★**T1·T2 가 «오늘의 어긋남»을 닫아 버리므로, 명령이 없으면 ⒞(조건부)를 기계로 다시 물을 수 없다.** + ⇒ **T3 합격선에 이 한 줄을 넣어라**(repo 마다 ``·``·`<로컬이 치는 명령>` 만 바꾼다): + ```sh + # 「로컬 DoD 가 «안 치는» step 이 CI 실패에 등장한 run」의 수 — 0 이 아니면 락이 값한다 + gh run list --repo --workflow= --status=failure --limit 200 \ + --json databaseId --jq '.[].databaseId' \ + | while read -r id; do + gh api "repos//actions/runs/$id/jobs" \ + --jq '[.jobs[]|select(.conclusion=="failure")]|map(.steps//[]|map(select(.conclusion=="failure"))|map(.name))|flatten|unique|join(";")' + done | /usr/bin/grep -c '<로컬이 안 치는 명령>' + ``` + ★**오늘의 값**: `wie` = **9**(beta 셀 전용 clippy · `cargo +beta` 미보유) · `qts` = **38**(`ruff format --check`). + ★**T1·T2 착지 «후»에 다시 재라 — 그 값이 «0 에 가까워지면» T3 의 실익이 준다.** ## 6. 경계 ★**형제 repo 쓰기 0** — `git` 명령 0 · PR 0 · 파일 수정 0(전부 `gh api … /contents` 읽기). -★`.rs` **0줄** · 이 repo 의 **검사기·`rust.yml` 무접촉** · **DoD 블록 무접촉** · +★`.rs` **0줄** · ★★**이 회차 커밋 기준** 이 repo 의 **검사기·`rust.yml`·DoD 블록 무접촉** · +★★**[게이트² F1-⒝ 정정] PR 파일 목록에는 `scripts/check-dod-ci-parity.py` 가 «5+» 로 보인다 — 그 5줄은 «#27 의 것»이다** +(이 PR 이 #27 «위에» 얹혀 있기 때문이다 · §0). ★**이 회차 커밋은 결백하다**: +`git diff 204f98b..ed046208 -- '*.rs' scripts/ .github/ CLAUDE.md` → ★**0**. +⇒ ★**게이트③ 집행자가 PR 파일 목록만 보면 «회신과 반대되는 것»을 읽는다** — 그래서 문면을 «이 회차 커밋»으로 한정한다. 머지 **0** · force-push **0** · `main` 직접 push **0** · 시크릿 출력 **0** · upstream 발신 **0** · 맨 `grep` **0**. From b92e92e75ac4ddb92d1fa42093e42b33c2246e90 Mon Sep 17 00:00:00 2001 From: jun0 Date: Sat, 5 Sep 2026 00:29:05 +0900 Subject: [PATCH 3/3] docs: record gate3 execution in the ledger [rustjava-dod-ci-parity-sibling-repo-survey] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit STATE.md 진행중 → 완료(게이트③ PR #28 · --merge · 등재 repo · 부모 #27 착지로 생긴 CONFLICTING 을 별 해소 회차가 풀었고 판단 필요 hunk 0 · 검사 1건 → 10건 전건 성공 · 재검은 총괄이 「건너뛴다」로 판정) + worklog .json 게이트③ 집행 1줄(핀 불일치를 안고 집행한 사실과 그 근거를 명시). 코드 변경 0. --- STATE.md | 33 +++++++++++-------- ...2026-09-04-parity-sibling-repo-survey.json | 3 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/STATE.md b/STATE.md index 5575896..c76391d 100644 --- a/STATE.md +++ b/STATE.md @@ -1,20 +1,6 @@ # STATE ## 진행중 -- [rustjava-dod-ci-parity-sibling-repo-survey] ★★**형제 repo(`wie`·`qts`) 파리티 락 필요성 «조사+판정» — 둘 다 «⒞ 조건부 필요».** - 채택 제안 `2026-09-04-dod-ci-parity-lock#p1`. ★**읽기 전용**(형제 repo `git`·PR·파일 수정 **0** · `gh api /contents` 로만 읽었다) · 구현 **0**. - ★★**검사기는 «포팅 불가»다** — `wie` 는 DoD 정본이 **`AGENTS.md`** 이고 4번째 게이트(`cargo test`)가 - ★**`if:` 로 갈린 2 step + 블록 스칼라**라 우리 파서의 「조건부 = 제외」가 ★**거짓 red** 를 만든다 · - `qts` 는 DoD 가 **`make` 타깃 이름**(Makefile 간접층)이고 ★**toolchain 매트릭스가 없어 축 B 가 성립하지 않으며** - `gitleaks` 는 ★**action 이라 어떤 `run:` 파서도 못 본다**. - ★★**그런데 어긋남은 «둘 다 실재»한다 — 이력으로 쟀다**: `wie` `rust.yml` 실패 **34건 전수** 중 - ★**beta 셀에서만 실패한 clippy 9건(26%)** 인데 four gates 에 `cargo +beta` 가 **없다**(문자열 `beta` 규범 문서 **0건**) · - `qts` `ci.yml` 최근 실패 **60건 전수** 중 ★**`uv run ruff format --check .` «만» 실패 10건(17%)** 인데 `make lint` 는 안 친다 - (문자열 `format` 규범 문서 **0건**). - ⇒ ★**먼저 할 일은 락이 아니라 «각 한 줄»** — 그 다음이 포팅이다. 다음 티켓 3건(T1·T2·T3)의 **축과 합격선**만 적었다(발권은 총괄 몫). - ★★**일반 사실**: 세 repo 가 전부 이 어긋남을 갖고 있었고 **어긋난 자리가 전부 규범 문서에 없었다** — - 「사람이 문서를 최신으로 유지한다」가 **세 repo에서 각각 실패**했다. - ★이 repo 검사기·`rust.yml`·DoD 블록 **무접촉** · `.rs` **0줄**. **PR 대기 — 게이트③ 미착지.** - [rustjava-upstream-sync-squash-defeats-convergence] ★**S1~S4 가 착지하고도 fork 가 upstream 에 한 걸음도 가까워지지 않은 근인을 확정하고 계보를 기록했다.** 근인 = 게이트③ 제품 repo **`--squash`**. 증명은 **머지커밋 부모 수**다 — `6bfe97c4`·`11ef5010`·`4bb796de`·`3a597768` **전건 1개**(커밋 7·10·15·21이 @@ -37,6 +23,25 @@ (25번째 run, 앞선 24건 전부 red). **PR 대기 — 게이트③ 미착지.** ## 완료 +- [rustjava-dod-ci-parity-sibling-repo-survey] ★★**형제 repo(`wie`·`qts`) 파리티 락 필요성 «조사+판정» — 둘 다 «⒞ 조건부 필요».** + 채택 제안 `2026-09-04-dod-ci-parity-lock#p1`. ★**읽기 전용**(형제 repo `git`·PR·파일 수정 **0** · `gh api /contents` 로만 읽었다) · 구현 **0**. + ★★**검사기는 «포팅 불가»다** — `wie` 는 DoD 정본이 **`AGENTS.md`** 이고 4번째 게이트(`cargo test`)가 + ★**`if:` 로 갈린 2 step + 블록 스칼라**라 우리 파서의 「조건부 = 제외」가 ★**거짓 red** 를 만든다 · + `qts` 는 DoD 가 **`make` 타깃 이름**(Makefile 간접층)이고 ★**toolchain 매트릭스가 없어 축 B 가 성립하지 않으며** + `gitleaks` 는 ★**action 이라 어떤 `run:` 파서도 못 본다**. + ★★**그런데 어긋남은 «둘 다 실재»한다 — 이력으로 쟀다**: `wie` `rust.yml` 실패 **34건 전수** 중 + ★**beta 셀에서만 실패한 clippy 9건(26%)** 인데 four gates 에 `cargo +beta` 가 **없다**(문자열 `beta` 규범 문서 **0건**) · + `qts` `ci.yml` 최근 실패 **60건 전수** 중 ★**`uv run ruff format --check .` «만» 실패 10건(17%)** 인데 `make lint` 는 안 친다 + (문자열 `format` 규범 문서 **0건**). + ⇒ ★**먼저 할 일은 락이 아니라 «각 한 줄»** — 그 다음이 포팅이다. 다음 티켓 3건(T1·T2·T3)의 **축과 합격선**만 적었다(발권은 총괄 몫). + ★★**일반 사실**: 세 repo 가 전부 이 어긋남을 갖고 있었고 **어긋난 자리가 전부 규범 문서에 없었다** — + 「사람이 문서를 최신으로 유지한다」가 **세 repo에서 각각 실패**했다. + ★이 repo 검사기·`rust.yml`·DoD 블록 **무접촉** · `.rs` **0줄**. + ★게이트③ 완료: PR #28 — ★★**`--merge` 착지**(★`--squash` 아님 · 등재 repo). 머지커밋 sha 는 회신 `merged:` 참조. + ★**부모 #27 착지로 `CONFLICTING` 이 됐고 «해소 회차»가 별도로 돌았다** — 충돌 `STATE.md` 1건 · + ★**판단 필요 hunk 0**(두 판본 16줄 중 15줄 바이트 동일 · 차이는 «착지 상태»뿐) · 승인 내용 무접촉 · + ★★**검사 «1건 → 10건» 전건 성공**(충돌 중에는 `pull_request` 트리거가 «구조적으로» 못 돈다 — 그 기전이 해소로 확증됐다). + ★**재검은 총괄이 «건너뛴다»로 판정**(원 게이트② 핀 `5c2ed7bc` · 해소 후 head `8ab6bb16`). - [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×**. diff --git a/docs/worklog/2026-09-04-parity-sibling-repo-survey.json b/docs/worklog/2026-09-04-parity-sibling-repo-survey.json index f483012..ca5689a 100644 --- a/docs/worklog/2026-09-04-parity-sibling-repo-survey.json +++ b/docs/worklog/2026-09-04-parity-sibling-repo-survey.json @@ -31,7 +31,8 @@ "★★[F1] 이 PR 은 «스택»이다 — 204f98b(#27 의 구현 커밋)이 이 브랜치의 조상이고(merge-base --is-ancestor rc=0), #28 은 #27 의 «옛» 상태를 업고 있다(e9e2a8e1 ↔ ed046208 rc=1). 초판은 그 사실을 한 줄도 적지 않았다(base main 뿐). ★단 base 가 main 이라 #27 의 브랜치가 지워져도 이 PR 이 «닫히지»는 않는다 — 계약 5 의 ripple 사고(자식 base 가 부모 브랜치)와 다른 형상이다. ★그리고 예정된 STATE.md 충돌은 «실현»됐다(#27 이 ba4bb417 로 착지 · 워밍 후 재조회 CONFLICTING/DIRTY · 충돌 파일 STATE.md 1건). 그 1건은 게이트③ 계약 2-c⒜ 의 «원장 파일 한정» 승인 범위 안이고 코드 파일 충돌은 0 이다. ★이 회차는 해소하지 않았다(게이트③ 몫 · 충돌 집합은 그때의 값).", "★★[F2] RustJava 파서에 «네 번째 축»이 있다 — DoD 줄의 후행 주석 절삭. wie 의 four gates 4줄이 전부 후행 주석을 달고 있는데 norm() 은 공백만 접고 주석을 벗기지 않아 4줄 전건 불일치가 나고, 상수 1줄만 바꿔 돌리면 rc=1 · 축 A 대칭차 7(CI 에만 3 · DoD 에만 4)이 나온다. ★RustJava 자신의 DoD 에는 주석이 «없어서» 그 파서가 이 축을 만난 적이 없다. ★안 적으면 다음 워커가 거짓 7건을 만난 뒤 회차 중간에 발견한다.", "★[F3] 「검사기 포팅 불가」는 qts 에만 참이다 — qts 는 DoD 절에 코드블록이 없어 sys.exit 로 죽고, wie 는 «돈다»(값이 틀릴 뿐). 요약이 본문보다 강했던 것을 표제·PR 제목에서 한정했다.", - "★[F4] T3 합격선에 「세는 명령 + 오늘의 값」을 넣었다 — T1·T2 가 «오늘의 어긋남»을 닫아 버리므로 그 뒤 「언제 락이 필요해지는가」를 기계로 다시 물으려면 명령이 필요하다. 오늘의 값: wie 9 · qts 38." + "★[F4] T3 합격선에 「세는 명령 + 오늘의 값」을 넣었다 — T1·T2 가 «오늘의 어긋남»을 닫아 버리므로 그 뒤 「언제 락이 필요해지는가」를 기계로 다시 물으려면 명령이 필요하다. 오늘의 값: wie 9 · qts 38.", + "★[게이트③ 집행] PR #28 을 --merge 로 착지시켰다(등재 repo — 스쿼시는 계보를 접는다). ★이 회차는 «핀 불일치»를 안고 집행했다 — 원 게이트② 핀은 5c2ed7bc(…-fix 회신)인데 현 head 는 8ab6bb16 이다. 그 delta 는 «해소 회차»(별 티켓·별 회신)이고, ★총괄 추기가 「재검을 건너뛴다」로 명시 판정했다(근거: 판단 필요 hunk 0 · 승인 내용 무접촉 · 코드 0줄 · CONFLICTING → MERGEABLE/CLEAN · 부모 2개 · 검사 1건 → 10건 전건 성공). ★착수 조건이 지목한 …-conflict-resolve.review.md 는 실재하지 않는다 — 그 자리를 총괄 추기가 대체했다. 착지 diff 5파일 · 배포 워크플로 0개 ⇒ 배포 0. 코드(.rs) 변경 0." ], "proposals": [ {