Jaekit 개발원본 보기

Jaekit 개발 문서입니다. Jaekit을 쓰는 데는 필요 없습니다. 처음이라면 Jaekit 이해하기부터 읽으세요.

이 페이지

저장소 검사 생산자의 관측 의미

이 문서는 Jaekit 저장소의 goal·review·gap 검사 생산자를 설명한다. 설치되는 일반 참조 생산자와 Core의 check-result/v1 형식은 바뀌지 않는다. 이 도구들은 로컬 검사 자료를 관측하는 개발 도구이며 독립 인증이나 검사 충분성을 보증하지 않는다.

대상과 결과

생산자 버전 2는 한 번 실행한 시험 묶음에서 서로 다른 사실을 별도 선언 대상으로 남긴다. 대상마다 attempt: 1이고 시험 사례나 결과 종류를 내부 재시도로 표현하지 않는다.

대상 관측하는 사실
원래 대상과 additional_violations 실제 assertion 위반 식별자. 남는 슬롯은 추가 위반이 없었음을 나타낸다. 실행·선택 자체가 안 되면 원래 대상도 통과하지 않는다.
execution 실행·환경·수집 오류. assertion 실패가 함께 있어도 각각 남는다.
selection 실행하지 못한 사례. 다른 사례가 성공하거나 실패했어도 skip은 사라지지 않는다.
attribution 실패를 구체적 요구 위반에 연결할 수 있는지. 미분류 assertion은 사실을 남기고 이 대상에 오류를 기록한다.

설정의 result_targets와 선언의 targets에 같은 대상 이름을 지정한다. 기본 제공 설정은 assertion 슬롯 8개와 다른 속성 3개를 사용한다. 필요한 슬롯 수는 실행 전에 2~64개로 정한다. 슬롯보다 많은 실패가 관측되면 선언된 슬롯의 실패와 collection_error가 남는다. 다른 실행·설정 오류가 이미 execution을 차지하면 마지막 assertion 슬롯이 collection_error를 보고하므로 그 오류와 관측 누락이 함께 남는다. 전체 사실과 원래 진단은 로컬 출력에 남으며, 넘친 내용을 모두 간결한 보고에 저장했다고 주장하지 않는다. 불완전한 관측은 성공이나 정상 baseline 기대 실패가 아니다.

여러 실패의 관측 식별자는 각각 별도 슬롯에 남는다. 두 슬롯이 같은 식별자를 갖더라도 재시도가 아니다. 선언은 각 슬롯의 예상 위반을 지정할 수 있지만 생산자는 그 값을 실제 위반 식별자로 복사하지 않는다.

실제 assertion의 식별

Python은 실제로 발생해 unittest가 실패로 분류한 예외에서만 식별자를 얻는다. tools/result_observations.py의 RequirementViolation을 우선 사용한다. 문자열 태그는 시험 코드가 직접 self.fail("[violation:식별자] 설명")을 호출한 실제 예외의 명시적 접두부만 지원한다. 표준 unittest 비교 함수 내부에서 호출한 fail, 비교값·repr·메시지 뒤쪽의 태그, 직접 발생시킨 일반 AssertionError는 식별자 근거가 아니다. 기존 [requirement]도 직접 self.fail에 전달한 접두부에 한해 고정 관측 식별자 requirement-not-met를 뜻한다. 표준 출력에 같은 문자열을 인쇄하거나 성공한 assertion에 메시지를 넣는 것은 위반 근거가 아니다. 예외 메시지 전체에서 태그를 찾던 넓은 문자열 해석은 지원하지 않는다.

이름 없는 assertion은 unclassified-assertion 위반과 attribution 오류로 남는다. 선언을 이 이름으로 바꾸더라도 attribution 오류가 사라지지 않아 정상 기대 실패로 승격되지 않는다. 기대실패 장식자·예상 밖 성공은 기존처럼 설정 오류다. 실패한 subtest와 teardown 오류·skip도 별개 사실로 보존한다.

Go test JSON은 통과·실패·skip과 컴파일·프로세스 오류를 관측할 수 있지만 출력 문자열만으로 실패한 assertion의 요구 식별자를 확인할 수는 없다. 로그와 assertion이 같은 출력 경로를 사용하므로 태그나 소스 줄을 추측해 이름을 붙이지 않는다. 구체적 근거가 없는 Go 실패는 미분류 실패와 attribution 오류로 남는다. 패키지와 시험 이름을 함께 식별하므로 여러 패키지의 같은 시험 이름이 서로의 결과를 덮어쓰지 않는다. 이전의 일반 Go 실패를 선언 ID로 바꾸던 baseline 수락을 재현한다는 보장은 없다. 통과하는 Go 시험과 기존 런타임 오류 구분은 유지한다. 더 넓은 Go 어댑터는 이 계약에 포함하지 않는다.

명령과 호환

명령의 nonzero만으로 요구 위반을 정하지 않는다. 구조화 근거로 사용할 명령은 jaekit-command-exits/v1의 pass, violations, unverified를 서로 겹치지 않게 지정한다. violations는 종료 코드 문자열과 그 명령이 관측하는 실제 위반 식별자의 관계이며, 예상 위반을 담은 Core 선언과 별개다. 문서화되지 않은 종료, 신호, 실행 불가, 시간 초과는 위반으로 변환하지 않는다. violations의 키는 1~255 종료 코드를 앞자리 0 없는 ASCII 십진수로 쓴다("1", "255"). "01", 다른 숫자 체계의 숫자, 공백·부호가 든 키, 같은 JSON 객체의 중복 키는 명령을 실행하기 전에 설정 오류로 거부한다. 저장소가 제공하는 명령 대상은 모두 종료 계약을 갖는다. 공개 문서 검사는 문서 문제에 1, 문서가 없거나 읽을 수 없으면 UNVERIFIED 3, 내부 오류에 70으로 끝나고, 보존·이력 감사는 내부 오류에 70을 쓴다. 따라서 종료 1은 해당 도구가 실제로 찾은 문제만 뜻한다. 감사의 UNVERIFIED 종료 2는 미관측이며 성공이나 의도한 baseline 실패가 아니다.

goal 설정은 jaekit-goal-targets/v2, 생산자 버전은 2를 사용한다. 기존 goal 설정 v1은 구조화 보고가 없는 maintain 실행에 한해서 같은 종료 성공 여부를 확인할 수 있다. v1의 단일 대상 구조화 선언은 실행 전에 지원되지 않음을 알리고 거부한다. review·gap 설정도 명시적 result_targets가 필요하다. 현재 추적된 설정·선언·생산자 입력은 함께 갱신하지만 과거 기록은 수정하지 않는다. 새 생산자와 선언의 바이트가 달라졌으므로 과거 근거를 새 코드의 관측으로 재사용하지 않는다.

독립 Go 결과 CLI도 같은 관측 대상을 선언하며 생산자 repository-go-check, 버전 2만 지원한다. 선언의 생산자 입력에는 실제로 읽는 go-result.py, produce.py, result_observations.py와 관련 설정·검사 파일을 모두 포함한다. 보고 파일은 새로 생성하고 기존 파일을 덮어쓰지 않는다. classify()는 과거 fixture가 사용하는 v1 디버깅 함수일 뿐 현 CLI의 근거 판정에 쓰이지 않는다. 파일 목록과 선언·보고 연결은 기존 결과 계약을 따른다.

확인 범위

tools/producer-checks/test_semantics.py는 실제 Python·Go·명령 프로세스의 정상·미관측·오류·혼합·실패 귀속을 다룬다. cmd/ha/producer_semantics_test.go는 실제 생산자 프로세스의 보고가 Core의 현재·baseline 분류와 저장된 대상 관측까지 이어지는 경계를 다룬다. 이 회귀는 기존 공통 검증과 Go CI 그룹에서 선택된다. 합성 입력과 로컬 프로세스 시험이며 과거 사용 이력 감사, 실제 모델 실행, 원격 CI 실행을 대신하지 않는다.

contracts/repository-producers.md만든 커밋 bcaddb7603e8