[rustjava-assert-loadable-rederivation-did-not-come-up-short] feat(scripts): 되유도를 믿지 않고 «단언»한다 - #82
Merged
Conversation
…ripts): 되유도를 믿지 않고 «단언»한다 채택 제안 2026-09-19-loadable-set-source-of-truth#p0. ★제안에 how 필드가 없다 — why 를 따르고 tradeoff 에서는 의도적으로 갈렸다(아래). ★먼저 쟀다 — 지금 «적게 잡히는» 것은 없다: 같은 것을 네 가지로 세어 전부 268 (_proto() 출현 · _proto(), 줄 · crate::classes:: · REGISTERED 파싱) · 해석된 고유 이름도 268. ★단언이 «틀리게» 울 조건도 함께 쟀다: 한 줄에 등재 둘 0 · 쉼표 없는 _proto() 0 · 주석 속 _proto() 0 · 중복 이름 0. ⇒ green 에서 시작하는 회귀 방어이지 현존 결함 수리가 아니다. 두 축(둘 다 fail-closed · exit 2): ⑴파싱 ↔ 독립 증인 — REGISTERED 는 «의심 대상»이라 자기 매치를 세는 것은 증명이 아니다. 등재가 없이는 쓰일 수 없는 토큰으로 두 번째로 센다. ⑵등재 수 ↔ 고유 이름 수 — 둘이 한 이름으로 접히면 해석이 틀린 것이고, ★접힌 쌍을 이름으로 찍는다. 양방향 축(제품 스크립트를 «실제로 있었던 결함»으로 되돌려서): ⑴초판의 as_proto 전용 정규식 → rc=2 「265 registrations parsed but 268 proto calls」 ⑵초판의 짧은 이름 키 → rc=2 「268 registrations resolved to only 263 names」 + java/util/Formatter <- java::util::Formatter::as_proto(), java::util::logging::Formatter::as_proto() 등 다섯 쌍 지목 ⑶원형상 → rc=0. ★게이트②가 «소스를 나란히 읽어» 찾은 그 충돌쌍을 이제 스크립트가 말한다. 브리프 3문: 비교 대상 = 소스 자신(기준선·직전값 아님) · 첫 실행/정당한 감소는 «생기지 않는다» (기억하는 수가 없다) · ★죽는다(exit 2) — 형제 회차의 「찍고 안 죽는다」와 갈렸다: 그쪽은 «알려진 사각을 재는» 것이고 이쪽은 «검사기가 자기 입력을 잘못 읽는» 것이며, 이 파일은 이미 그 계급을 exit 2 로 다룬다. 대가: 등재 배열 «밖» 호출이면 정상 트리에서 red · 진짜 중복 등재도 false red(오늘 0) · ★바닥이지 증명이 아니다(틀리되 «다른» 이름이면 통과) · 비용 유의차 없음. 제안 tradeoff 와 갈렸다: 「loader.rs 의 텍스트 형태(한 줄 한 등재)에 묶인다」를 줄이 아니라 «출현»을 세어 없앴다(오늘 줄 수와 동일 268 이라 잃는 것도 없다).
…rigin/main — 원장 2파일 합집합 게이트③ 2-c⒜: REPORT.md·STATE.md 충돌을 전건 보존 합집합(시간순)으로 해소. 검사기 scripts/check-named-exception-classes-are-loadable.py 는 자동 병합(충돌 0·무접촉). 2-c⒟ 양방향 보존: ours 소실 0 · theirs 소실 0 · 신규 0. 계약 12 기여 불변: numstat base..ours ↔ origin/main..resolved 대칭차 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
채택 제안
2026-09-19-loadable-set-source-of-truth#p0.★제안에
how필드가 없다(title·plainSummary·userBenefit·why·tradeoff·effort·target뿐) —why를 따르고tradeoff에서는 의도적으로 갈렸다(맨 아래).★먼저 쟀다 — 지금 «적게 잡히는» 것은 없다
같은 것을 네 가지로 센다(
origin/main@ad9eb1a6):_proto()출현_proto(),줄crate::classes::출현REGISTERED파싱★단언이 «틀리게» 울 조건도 함께 쟀다(이게 핵심이다): 한 줄에 등재 둘 0 · 쉼표 없는
_proto()0 · 주석 속_proto()0 · 중복 이름 0.⇒ ★green 에서 시작하는 회귀 방어이지 «현존 결함 수리»가 아니다. 지어내지 않았다.
지은 것 — 두 축, 둘 다 fail-closed(exit 2)
⑴★파싱 ↔ 독립 증인:
REGISTERED는 의심 대상이라 자기 매치를 세는 것은 증명이 아니다 ⇒ 등재가 없이는 쓰일 수 없는 토큰으로 두 번째로 센다.⑵★등재 수 ↔ 고유 이름 수: 둘이 한 이름으로 접히면 해석이 틀린 것 ⇒ ★접힌 쌍을 «이름으로» 찍는다(진짜 중복 등재와 오귀속을 한눈에 가르라고).
1파일 · +38/−2.
★양방향 축 — 제품 스크립트를 «실제로 있었던 결함»으로 되돌려 쟀다
as_proto전용 정규식265 registrations parsed but 268 proto calls are in rustjava-runtime/src/loader.rs268 registrations resolved to only 263 names+ ★java/util/Formatter <- java::util::Formatter::as_proto(), java::util::logging::Formatter::as_proto()등 다섯 쌍 지목✓ 43 named exception class(es) across 846 call site(s); all 268 loadable★둘째 메시지가 이 회차의 요지다 — 게이트②가 «소스를 나란히 읽어» 찾아낸 그 충돌쌍을 ★이제 스크립트가 스스로 말한다.
브리프의 세 질문
⒜무엇과 비교하나 = ★소스 자신(같은 파일을 두 번째로 센다) — 저장된 기준선도, 직전 실행값도 아니다.
⒝첫 실행 · 정당한 감소 = ★애초에 생기지 않는다. 기억하는 수가 없으니 「첫 실행」이 없고, 클래스를 지우면 네 수가 함께 내려가 green 이다. ★이 형상을 고른 이유가 그것이다.
⒞죽는가 말하는가 = ★죽는다(exit 2 «cannot measure»). 형제 회차(
2026-09-18-nonliteral-exception-call-sites#p0)는 「세어 찍고 절대 실패시키지 않는다」를 골랐고 ★여기서는 갈렸다:그쪽은 «알려진 사각을 재는» 것이고, 이쪽은 ★«검사기가 자기 입력을 잘못 읽는» 것이다. ★이 파일은 이미 그 계급을 exit 2 로 다룬다(해석 불가 등재 →
die). 짧은 loadable 집합은 있는 클래스를 «못 싣는다»로, 없는 것을 «있다»로 만든다.★대가(숨기지 않는다)
⒜숫자 둘이 «참이어야» 한다 —
loader.rs가 등재 배열 밖에서as_proto()를 부르면 ★정상 트리에서 red(오늘 실측: 268 전건이 등재다).⒝★**«진짜» 중복 등재는 false red** — 두 등재가 의도적으로 한 클래스를 가리키는 경우. 오늘 0이고 메시지가 이름을 대지만 위험은 실재한다.
⒞★바닥이지 증명이 아니다(제안 자신의 말) — 틀리되 서로 다른 이름으로 매핑되면 268 을 유지하고 통과한다. 잡는 것은 «과소계수» 계급이고, 실측된 거짓 초록 둘이 그 계급이었다.
⒟비용 유의차 없음: 전 6.47/8.01/4.57s ↔ 후 6.35/5.68/7.53s(구간 겹침 · 부하가 커 편차가 효과보다 크다).
★제안의
tradeoff에서 갈렸다(의도)제안 예고: "it couples the check to the textual shape of loader.rs (one registration per line), which is true today and is not guaranteed."
⇒ ★줄이 아니라 «출현»을 세어 그 묶임을 없앴다 — 줄 배치·쉼표 스타일과 무관하고, 오늘 줄 수와 동일(268 = 268) 이라 잃는 것도 없다.
DoD (9명령 전건 rc=0)
fmt0 ·clippy stable0 ·clippy +beta0 ·clippy wasm320 ·cargo test --all585 passed / 0 failed / 1 ignored ·check-worklog-json0(68파일) ·check-dod-ci-parity0 ·check-named-exception-classes-are-loadable0(★내가 고친 그 검사기 자신) ·check-merge-dropped-symbols0