Skip to content

[rustjava-partial-clone-refusal-decision] fix(scripts): 부분 클론을 거절하지 않는다 — 모호한 것은 «호출 하나»였다 - #78

Merged
Jun025 merged 1 commit into
mainfrom
feat/rustjava-partial-clone-blob-vs-absence
Sep 18, 2026
Merged

Jun025 merged 1 commit into
mainfrom
feat/rustjava-partial-clone-blob-vs-absence

Conversation

@Jun025

@Jun025 Jun025 commented Sep 18, 2026

Copy link
Copy Markdown
Owner

채택 제안 2026-09-18-merge-drops-no-silent-git-failure#p0"The check now refuses to run in a shallow clone, but a clone fetched without file contents can still make it look like nothing is there."

결정

부분 클론을 거절하지 않는다. 대신 symbols() 가 실패한 git show 를 «부재»로 읽기 git ls-tree 로 그 경로가 트리에 있는지 묻는다.
★결정을 preflight() docstring 에 못박았다(「이렇게 «고치지» 마라」 + 근거 수치 + 탐지 축).

★추측하지 않고 «진짜» 부분 클론으로 쟀다

--filter=blob:none · 범위 e53b2142^..e53b2142(알려진 사고 머지):

클론 promisor 결과 시간
완전 6 dropped · rc 1 2.5s
blobless 도달 가능 6 dropped · rc 1 — ★바이트 동일 15.7s
blobless(신선) 도달 불가 0 dropped · ★★rc 0 = green 8.3s

⇒ ★제안은 «절반» 맞다: 「부분 클론이면 아무것도 없어 보인다」는 그 자체로는 거짓이다 — promisor 가 닿으면 git 이 blob 을 투명하게 받아 온다. ★거절은 «돌아가는 설정»을 막는 일이고, shallow 와 달리 부분 클론은 없는 것을 가져올 수 있다.
⇒ ★그러나 조용한 green 은 실재한다 — 조건이 좁을 뿐(promisor 도달 불가). 그 형상에서 검사기는 ✓ … (3 file(s) examined) 를 찍고 rc 0 으로 끝냈다.

방법 주의(자기정정): 첫 오프라인 측정은 오염이었다 — 앞선 온라인 실행이 blob 을 캐시해 «맞는 답»이 나왔다. 위 수는 신선한 클론 + 읽기 «전» 원격 차단에서 다시 잰 값이다.

위험이 실현되나 — 실측 0, 그러나 그것이 «모호함을 남길» 근거는 아니다

.github 어디에도 filter: 0건(merge_dropsfetch-depth: 0). ⇒ 오늘 이 거짓 green 은 «개발자 노트북 + blobless + 오프라인»에서만 난다.
★그것이 거절을 고르지 않은 이유이고, 닫는 비용이 git 호출 하나로 드러났으므로 모호함은 닫았다.

대안 둘을 각각 기각한 근거

거절(remote.origin.partialclonefilter) — 탐지는 된다(실측 blob:none · ★rev-parse --is-shallow-repositoryfalse 라 현행 preflight 가 못 잡는 이유가 이것이다). 그러나 맞는 답을 내는 경우까지 막는다.
에러 문면 대조 — 두 실패는 문면으로 갈린다(fatal: path 'X' does not exist in 'REV'fatal: could not fetch <sha> from promisor remote)지만 ★둘 다 exit 128 이고, preflight 를 만든 회차가 이미 «git 판올림에 약하다»며 미뤘다. 그 판단을 뒤집지 않았다.
⒞★ls-tree 는 «트리 객체»로 답한다
— 부분 클론은 blob 이 없어도 트리는 갖는다. 두 클론에서 동작 동일 실측(있으면 1항목 · 없으면 빈 출력 · 둘 다 rc 0).

축 (★양방향 · 제품 스크립트)

형상
blobless + promisor 도달 «불가» 0 dropped · rc 0(조용한 green) rc 2 cannot measure: …:jvm-bytecode/src/class_definition.rs is in that tree but its content could not be read…
blobless + 도달 가능 rc 1 · 6 dropped rc 1 · 6 dropped(★과차단 0)
완전 클론 rc 1 · 6 dropped 불변

비용 유의차 없음: 같은 범위 3회씩 — 전 7.78/7.99/7.05s ↔ 후 6.39/6.72/8.06s(구간 겹침) · DoD 기본 범위 0.46 → 0.33s. 추가 호출은 show이미 실패한 경로에서만 돈다.

★재다가 발견했고 «고치지 않았다»

이 검사기의 출력 순서가 실행마다 다르다(findings 가 set 에서 나온다). origin/main 판본을 PYTHONHASHSEED=random 으로 5회 돌려 순서 2종(4+1). rc·집합은 동일하고 줄 순서만 움직인다 ⇒ ★선행 결함이다(내 변경과 무관). 전/후 diff 에서 잠깐 «회귀»처럼 보였기에 적어 둔다 — 후속 카드로 냈다.

DoD (9명령 전건 rc=0)

fmt 0 · clippy stable 0 · clippy +beta 0 · clippy wasm32 0 · cargo test --all 584 passed / 0 failed / 1 ignored(.rs 무접촉 ⇒ 불변) · check-worklog-json 0(65파일) · check-dod-ci-parity 0 · check-named-exception-classes-are-loadable 0 · check-merge-dropped-symbols 0

…는다 — 모호한 것은 «호출 하나»였다

채택 제안 2026-09-18-merge-drops-no-silent-git-failure#p0.

진짜 --filter=blob:none 클론으로 쟀다(범위 e53b214^..e53b214):
  완전 클론                      6 dropped · rc 1 (2.5s)
  blobless + promisor 도달 가능   6 dropped · rc 1  ★완전히 동일 (15.7s)
  blobless(신선) + 도달 «불가»    0 dropped · ★rc 0 = green

⇒ 제안은 절반만 맞다: 「부분 클론이면 아무것도 없어 보인다」는 그 자체로 거짓이고
(promisor 가 닿으면 git 이 blob 을 투명하게 받아 온다) 거절은 «돌아가는 설정»을 막는 일이다.
그러나 조용한 green 은 실재한다 — 조건이 좁을 뿐(promisor 도달 불가).

처방은 환경 거절이 아니라 그 «한 호출»의 모호함 제거다: symbols() 가 실패한 git show 를
부재로 읽기 «전»에 ls-tree 로 트리 존재를 묻는다. 부분 클론도 트리는 가지므로,
git 에러 문면을 대조하지 않고 갈린다(문면 대조는 preflight 회차가 이미 «판올림에 약하다»며 미뤘다).

양방향: 거짓 green 형상 rc 0 → ★rc 2 「못 쟀다」(못 읽은 blob 을 이름으로 지목) ·
과차단 0(도달 가능 blobless 는 여전히 rc 1 · 6 dropped) · 완전 클론 불변 ·
비용 유의차 없음(전 7.78/7.99/7.05s ↔ 후 6.39/6.72/8.06s · DoD 기본범위 0.46→0.33s).

결정을 preflight() docstring 에 못박았다 — 「이렇게 «고치지» 마라」와 그 근거 수치까지.
@Jun025
Jun025 merged commit 97d2258 into main Sep 18, 2026
12 checks passed
@Jun025
Jun025 deleted the feat/rustjava-partial-clone-blob-vs-absence branch September 18, 2026 19:13
Jun025 pushed a commit that referenced this pull request Sep 18, 2026
…/main — 승인된 원장 2파일 합집합

#78 착지(97d2258)로 생긴 원장 재충돌. 양쪽 항목 전건 보존·시간순(최신 상단).
보존 증명: 소실 ours=0 theirs=0 · 충돌 마커 0 · 두 회차 엔트리 각각 1개씩 온전.
※다중집합 «외래줄 1」은 «- 검증: DoD 9명령 · 아래 절.» 이 두 엔트리에 각각 있어서 생긴
  술어 한계이지 오염이 아니다(엔트리 단위로 각 1개 확인).
해소면 밖 변경 0.
Jun025 pushed a commit that referenced this pull request Sep 18, 2026
… 승인된 원장 2파일 합집합

형제 착지(#75 ddc6c4c · #78 97d2258)로 생긴 원장 재충돌. 게이트③ 2-c⒜ 승인 범위(원장 파일 한정).
양쪽 항목 전건 보존·시간순(최신 상단) · 한쪽 통째 채택(--ours/--theirs) 0.
보존 증명: ours추가 REPORT 18 / STATE 9 · theirs추가 37 / 15 — 소실 0/0 · 충돌 마커 0.
계약 12: 해소면 밖 변경 0 — jvm/src/jvm.rs · jvm/tests/test_exception_construction.rs ·
scripts/check-named-exception-classes-are-loadable.py · worklog 쌍이 핀(394184b) 대비 바이트 동일.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant