Jaekit 개발 문서입니다. Jaekit을 쓰는 데는 필요 없습니다. 처음이라면 Jaekit 이해하기부터 읽으세요.
공통 회귀 연결
한국어 · English
영어 원문을 옮긴 문서입니다. 둘이 다르면 원문을 따릅니다.
regressions.json은 현재 Jaekit 불변 규칙 다섯 개를 담은 유한한 등록부다. 각 경로는 제품 소비자, 공개 계약, 일반 속성, 원래 예시, 관련 입력 계열, 지원 경계, 선택된 회귀와, 미해결이면 공개 후속 작업을 적는다. 등록부는 검토된 소스이며 비공개 목표 기록에서 추론한 것이 아니다. I1–I5의 소비자를 하나 더 들이는 변경은 그 경로와, 그 보호 또는 명시적 공백을 추가해야 한다.
| ID | 속성 | 소비자 |
|---|---|---|
| I1 | 현재 파일 검사는 비공개 자료와 불필요한 이력에 의존하지 않는다 | 저장소 생산자, 공개 보존 검사, 저장된 증명의 소비자 |
| I2 | 실제 결과의 의미가 생산자, 현재·baseline 판정, 저장된 근거를 거쳐도 유지된다 | 참조 생산자와 저장소 생산자, 근거 검증, CLI와 상태 |
| I3 | 요청 연결과 불확실성이 관측 소비자를 거쳐도 유지된다 | 네이티브 trace 해석, 셸 읽기, 수집된 실행·릴리스 관측 |
| I4 | 필요한 도구와 선택된 실패가 계속 보인다 | 로컬·CI 공통 진입점, 셸 실행기, 두 CI 그룹 |
| I5 | 공개 스캐너는 넓은 회피 없이 규칙과 정상 fixture를 구별한다 | 추적된 공개 경로·내용 스캔 |
protected는 이름 붙은 속성에 적힌 회귀가 공통 검증 그룹에 연결되어 있다는 뜻이다. 가능한 모든 입력이나 그 소스 파일의 모든 속성을 다룬다고 주장하지 않는다. gap은 미해결 속성이며 보호로 세지 않는다. 실패하는 회귀를 피하려는 이유만으로 기존 보호를 강등하면 안 된다. 통합된 등록부는 생산자·관측·스캐너 수정을 실제 회귀 선택자에 연결한다. 안정된 경로 ID는 원래 이름을 유지하며(과거의 -gap 접미사 포함), 기준은 status 필드다. 이슈 링크는 각 수정의 출처를 보존할 뿐 그 자체로 보호를 성립시키지 않는다. protected는 여전히 적힌 속성과 선택을 나타내며, 합친 트리의 통과 기록이 아니다.
아래 명령은 이 저장소의 Git 소스 checkout에서 실행한다. 릴리스 archive는 이 계약과 regressions.json을 담지만 그것들이 가리키는 tools/는 담지 않는다. 실행하려면 같은 버전의 소스 checkout을 사용한다.
등록부를 검증하려면 python3 tools/regression_map.py --format json을 실행한다. 결과에는 assurance: selection-only가 적힌다. 이 명령은 공개 소스 경로, 명시적 시험 정의, tools/verify.py에서 지원하는 무조건 탐색 문장을 확인한다. 소스, 근거, 검사는 그 checkout에서 Git이 추적하는 파일이어야 한다. .git/ 아래의 저장소 메타데이터, 최상위 docs/의 목표 문서, 추적되지 않은 파일은 거부한다. 이력은 읽지 않으므로 전체 clone과 shallow clone이 같은 결과를 낸다. 주석 처리된 이름, 없는 시험, 선택되지 않은 파일, 지원하지 않는 선택 제어 흐름은 선택을 성립시키지 않는다. return, raise, 분기, 종료 호출처럼 그룹의 나머지를 끝내거나 건너뛸 수 있는 빌드 전용 with 본문은 지원하지 않는 제어 흐름이다. Python 선택자는 공통 unittest 로더가 선택된 파일에서 수집하는 클래스나 메서드를 가리켜야 한다. 일반 클래스, mixin 단독, 시험이 없는 시험 사례, import에 실패하는 모듈은 선택이 아니다. 수집은 모듈을 import하지만 그 시험을 실행하지 않으며, unittest 실행은 따로 확인한다. 그룹 본문 해석은 메인 디스패처나 CI 연결을 증명하지 않는다. 그 연결은 기존 tools/workflow-checks/test_verify.py와 test_repository.py가 다룬다. 해석기는 일부러 좁다. 검증 구현이 지원하는 문장을 넘어 바뀌면 선택자 해석기를 고쳐 검증하거나, 연결을 성립시킬 수 없다고 보고한다.
이 명령은 시험을 실행하거나 원격 CI를 증명하지 않는다. 공통 문서 그룹은 tools/workflow-checks/test_regressions.py로 등록부 회귀를 불러오고, 기존 Go 그룹은 보호된 Go·셸 시험 묶음을 실행한다. 실제 제품 회귀를 포함해 두 그룹을 실행하려면 실제 통합 트리에서 python3 tools/verify.py를 실행한다. 합성 호출 fixture는 선택과 실패 전달만 증명한다. 시험 파일이 있다는 사실, 선택만 확인한 보고, 제품 시험 결과, 원격 CI 결과는 서로 다른 근거다.
공통 전체 Go 시험 명령에 대해 검증은 선택된 Go 도구에 실제로 적용되는 GOFLAGS를 영구 설정까지 포함해 읽는다. 시험 제한(run, skip, list, fuzz, 켜진 short, 양수가 아닌 count, 그리고 각각의 test. 형식)을 보고하고 그 하위 프로세스에서만 제거한다. 다른 플래그는 값과 Go 인용 방식을 유지하며, 셸 설정과 영구 설정은 다시 쓰지 않는다. 해석할 수 없는 플래그와 컴파일 전용·대체 실행 모드는 전체 실행을 성립시킬 수 없고 검증을 멈춘다. 공통 명령에 있는 명시적 선택 제한은 정적 등록부 해석기가 거부한다. 선택자별로 의도한 회귀 명령은 기존 선택 동작을 유지하며, 문서 전용 검증에는 Go가 필요 없다.
Go 선택은 주석, 문자열, 식별자, 선언 경계를 구별한 뒤 지원하는 패키지 수준 시험 선언을 받아들인다. 시험은 Test로 시작하고 그다음 글자가 소문자가 아닌 ASCII 이름, import한 testing.T 형식을 가리키는 포인터 하나를 받는 제네릭이 아닌 시그니처, 결과값 없음, 본문을 갖춰야 한다. 이것은 유한한 어휘 해석기이며 Go 컴파일러나 패키지가 빌드된다는 증명이 아니다. go_selection 보고는 플랫폼과 무관한 범위, 곧 플랫폼 파일 이름 접미사나 빌드 지시문이 없는 파일을 설명한다. 알려진 GOOS/GOARCH 파일 이름 조건과 //go:build나 옛 // +build 머리는 명시적으로 지원하지 않는다. 해석기는 호스트 설정, 설정된 태그, 도구 체인 조건을 추측하지 않는다. checkout 최상위의 ./... 패키지 순회에서는 숨김 폴더와 밑줄로 시작하는 폴더, testdata, vendor의 하위, 중첩 모듈, 하위 폴더 심볼릭 링크를 제외한다. vendor 폴더 자체와 호스트 폴더 별칭으로 도달한 checkout은 계속 지원한다. 조건부이거나 그 밖에 지원하지 않는 선택은 보호 대신 이유를 돌려준다. 별도의 Go 그룹 실행 회귀가 이 경계를 실제 Go 탐색과 비교한다. 정적 해석기와 문서 그룹은 Go를 실행하지 않는다.
Python 수집은 공통 명령의 실제 탐색 시작 폴더, 파일 패턴, 선택적 최상위 폴더, 반복된 -k 필터를 사용한다. 시작 폴더와 최상위 폴더는 checkout 안에 있어야 한다. 위치 인자와 표준 짧은·긴 탐색 옵션을 지원하고, 모르는 옵션은 거부한다. -k는 unittest의 대소문자를 구별하는 이름 일치를 쓰며, *가 없으면 부분 문자열로 맞추고 반복된 필터는 대안으로 다룬다. 실제 패턴이 load_tests에 전달되고, 수집된 각 클래스나 메서드는 그것을 정의한 소스 파일에 묶인다. 그래서 다른 모듈의 같은 이름 선택자가 그 자리를 대신할 수 없다. 비었거나 제외되었거나 할 수 없는 수집은 보호를 성립시키지 않는다. 수집은 모듈을 import하고 탐색 hook을 호출할 수 있지만 시험 본문은 실행하지 않는다. 선택자별로 의도한 일반 실행은 별개로 남는다.
명시한 이전 공개 등록부 스냅숏에 대해 python3 tools/regression_map.py --previous <public-snapshot.json> --format json은 제거되거나 강등된 보호, 범위 수정, 좁아지거나 바뀐 검사 집합을 보고한다. changed_invariants는 속성이나 근거가 바뀌었거나 추가·제거된 불변 규칙을 나열하고, affected_routes는 그 아래의 모든 경로를 나열한다. 이 명령은 Git 이력을 가져오거나 이전 비공개 목표를 추론하지 않는다. 대체가 속성을 보존하는 이유를 기록하고, 소스 변경에 대체 회귀를 연결한다. 비교는 변경을 검토 대상으로 표시할 뿐 의미가 같은지를 자동으로 판단하지 않는다. 목표나 브랜치 이름이 바뀐 것은 경로를 제거할 이유가 아니다.
수정을 통합할 때는 안정된 경로 ID를 보존하고, 그 소스와 선택자를 갱신하며, 원래 사례와 일반화한 입력 계열을 구별한다. 보호된 모든 경로에 대해 정상 fixture와 관련된 위반·오류·미지원 fixture를 실행한다. I2에는 생산자에서 Core까지의 현재·baseline 경계가, I3에는 최종 소비자에서의 불확실성과 정체성이, I4에는 실제로 선택된 실행 경로가, I5에는 정상 스캐너 소스와 금지된 입력이 모두 필요하다. 시험한 커밋·트리와 결과를 변경의 검증 기록에 남긴다. 개별 브랜치의 결과는 합친 트리를 시험하기 전까지 그 트리를 설명하지 않는다.
등록부는 설치 도구, 네트워크, 모델, 이력 내려받기, 비공개 기록 요구를 더하지 않는다. 문서 전용 검증은 기존 의존성을 그대로 유지한다. 공개 합성 fixture의 취급은 해당 스캐너 안에서만 적용되며, 문자열을 쪼개거나 파일 이름을 면제하라는 저장소 전체 지시가 아니다. 장기적인 결함 재발과 실행 비용은 후속 관측으로 남으며, 이 등록부가 주장하는 내용이 아니다.
통합된 추가 항목은 I1–I5 안에 머문다. 명시적 보존 입력은 I1을, 결과 어댑터·저장된 지적·근거 보고 계약은 I2를, 제한된 archive 입력과 명시적 Spec 관측 경계는 I3을 보호한다. 그 행은 어떤 검사가 실제 로컬 프로세스를 쓰고 어떤 검사가 합성 문서·프로토콜 fixture를 검증하는지 밝힌다. 이 추가 항목이 등록부를 그 기능의 모든 동작으로 넓히지는 않는다. 기존 보호 경로 ID, 범위, 회귀 선택자는 유지한다. 통합이 검증되었다고 말하기 전에 합친 트리를 공통 진입점으로 실행한다.
Windows 릴리스 추가 항목도 I1–I5 안에 머문다. windows-archive-consumer-contract(I3)는 게시 전 Windows ZIP 구조 검사와, 릴리스 노트에 있는 게시 gate의 acceptance 링크를 보호한다. 설치기 자체의 패키지 검사는 그 경계에 적힌 대로 릴리스 workflow의 Windows job에서만 실행된다. release-checker-import-boundary(I3)는 릴리스 acceptance 검사기를 직접 import하는 코드가 호출자 모듈을 실행하지 않도록, 합성 archive를 쓰는 직접 import 프로세스 하나로 보호한다.
contracts/regressions.ko.md만든 커밋 bcaddb7603e8