임시 테스트 무시(ignore)는 세 개의 원장 키가 여전히 일치할 때만 재실행 가능
요약
본 문서는 소프트웨어 테스트 및 패치 검증 과정에서 '임시 무시(temporary ignore)'의 재실행 조건을 설명합니다. 이 기능은 속성 식별자, 고정 장치 계약 해시, 만료 기간 세 가지 원장이 모두 일치할 때만 가능하며, 이는 시스템이 동일한 불변량과 입력 계약을 참조하고 있음을 의미합니다. 또한, 데이터 무결성을 위해 파싱된 계약에 대한 표준 SHA-256 해싱 방법론(키 정렬, float 대신 소단위 정수 사용 등)을 제시합니다.
핵심 포인트
- 임시 무시는 세 가지 원장 키(속성 ID, 고정 장치 해시, 만료 기간)가 모두 일치해야 재실행 가능합니다.
- 고정 장치 계약 해시는 스키마 버전, 필드 이름, 시드를 포함하고 타임스탬프 등은 제외해야 합니다.
- 데이터 무결성을 위해 파싱된 계약을 SHA-256으로 해시할 때 키 정렬 및 UTF-8 바이트를 사용해야 합니다.
- 금융 데이터 처리 시 부동 소수점 대신 소단위 정수 또는 문자열을 사용하여 안정적인 계약을 유지해야 합니다.
임시 테스트 무시는 검토 중인 패치를 설명하는 세 개의 원장 필드가 여전히 남아 있을 때만 재실행이 가능합니다. 이 필드들은 속성 식별자(property identifier), 고정 장치 계약 해시(fixture contract hash), 그리고 동일한 실행기 클래스에 대한 만료되지 않은 기간입니다. 녹색 로그 하나가 일치를 생성하지는 않습니다. 이전 식별자로 다시 작성된 공식 또한 이를 생성하지 못합니다.
Agent diffs는 이 과정을 조용히 깨뜨립니다. 테스트, 고정 장치(fixture), 그리고 복사된 무시 메모가 함께 도착합니다. 그 메모는 여전히 구체적으로 보입니다. 하지만 그것이 명명하는 바이트들은 더 이상 트리의 바이트가 아닙니다. 이것을 불안정한 검증의 증거로 취급하지 말고, 유효하지 않은 기록으로 처리해야 합니다.
각 키가 입증할 수 있는 것
속성 식별자는 하나의 불변량(invariant)을 명명합니다. order_total_equals_sum_of_lines는 식별자입니다. 경로(path)는 아닙니다. 불변량을 변경하면 새로운 식별자를 할당받습니다. 이전 행은 이전 동작 상태를 유지합니다.
고정 장치 계약 해시는 해당 불변량이 읽을 수 있는 입력값을 묶어줍니다. 스키마 버전, 필드 이름, 그리고 고정 시드를 포함해야 합니다. 타임스탬프, 호스트 이름, 프로세스 ID는 제외해야 합니다. 그것들은 실행(run)을 식별할 뿐, 계약(contract)을 식별하지 못합니다.
만료 필드는 무시가 인용될 수 있는 기간을 제한합니다. 반드시 기록된 실행기 클래스를 명명해야 합니다. 만료 기한이 없다는 것이 무제한 승인을 의미하는 것은 아닙니다. 그 결정은 거부입니다.
이러한 키들은 패치가 올바르다는 것을 보여주지 않습니다. 그것들은 임시 무시가 여전히 동일한 불변량, 동일한 입력 계약, 그리고 동일한 실행기 클래스를 가리키고 있음을 보여줍니다. 이 더 좁은 주장이 이 워크플로우가 하는 유일한 일입니다.
다이제스트(digest)를 신뢰하기 전에 표준 해싱 수행하기
원시 파일이 아닌 파싱된 계약을 해시합니다. JSON을 로드하고, 키를 정렬하며 간격을 좁혀 출력한 다음, UTF-8 바이트에 대해 SHA-256을 취합니다. 뒤따르는 줄바꿈(trailing newline)이 다이제스트를 이동시켜서는 안 됩니다. 키의 재배열 또한 이를 이동시켜서는 안 됩니다.
속성을 정확하다고 처리하는 값에 부동 소수점(float)을 사용하는 계약은 거부해야 합니다. 돈은 소단위 정수(integers in minor units) 또는 문자열로 저장하십시오. 0.1의 두 번의 파싱은 안정적인 계약이 아닙니다.
Object 키 순서는 덤프에 의해 정규화됩니다. 배열 순서는 그렇지 않습니다. 배열 순서가 데이터입니다. 만약 리스트가 의미적으로 집합(set)이라면, 프로듀서에서 정렬하고 schema를 변경하여 그 규칙을 기록하세요. 이 변경은 의도적으로 다이제스트(digest)를 바꿉니다.
이 다이제스트는 이번 패치에서 계약 파일에 대한 동등성 검사입니다. 이는 해당 계약이 적절한지에 대한 검토가 아닙니다. 깨끗한 해시 값이라 할지라도 잘못된 입력을 설명할 수 있습니다.
모든 측면에서 동일한 json.dumps 설정을 사용하세요. 이 제안은 ensure_ascii를 기본값으로 유지합니다. 일회성 명령에서 이 플래그를 변경하지 마세요. 그렇지 않으면, 비-ASCII 필드 이름이 고정된 수정(fixture edit)이 아닌 이유로 불일치하게 됩니다.
결정 테이블 (Decision table)
왼쪽에서 오른쪽으로 읽으세요. 첫 번째 실패한 키가 승리합니다. 근접한 실패를 부분적으로 허용하는 것으로 평균 내지 마세요.
| Property ID | Fixture hash | Window | Action |
|---|---|---|---|
| 인용된 ID와 동일함 | 이 계약과 동일함 | 만료되지 않았고, 같은 러너 클래스이며, 실패 클래스가 environment인 경우 | allow_cite. 이번 패치에서는 윈도우를 확장하지 마세요. |
| ... | |||
만료 시간이 --now와 같은 것은 이미 종료되었습니다. 실패 클래스가 environment가 아닌 키와 일치하는 것도 여전히 거부됩니다. 체커는 해당 경우에 대해 reject:not_environment를 반환합니다. allow_cite는 병합 승인(merge approval)이 아닙니다. 이름 지정된 단언(named assertion)은 여전히 실행되어야 합니다. |
다섯 단계 (Five steps)
-
식별자(identifier)를 테스트 모듈에 넣으세요. 원장 문자열은 해당 파일에서 검색 가능해야 합니다. 풀 리퀘스트 댓글은 식별자가 아닙니다.
-
어설션(assertion)이 실제로 읽는 입력으로부터 계약 파일을 작성하세요.
schema, 필드 이름, 그리고 시드(seed)를 유지하세요. 클럭(clocks)과 호스트 식별자는 생략하세요. -
행(row)이 적격 상태가 되기 전에 누락된 유형을 분류하세요. 명명된 속성(named property)이 해시된 계약에서 실패할 때는
invariant를 사용하세요. 타임아웃, 연결 재설정, 그리고 누락된 선택적 서비스에는environment를 사용하세요. 나중에allow_cite만environment가 반환할 수 있습니다. -
지정한 타임스탬점의 행을 비교하세요.
--now는 인자(argument)이며, 클럭 읽기나 원격 로그에서 복사된 타임스탬프가 아닙니다. -
차이점(diff)과 함께 결정 문자열을 유지하세요.
allow_cite은 기존 행이 계속 참조될 수 있음을 의미합니다. 모든reject:*값은 참조가 사라짐을 의미합니다. 이 검사기는 대체 행을 발행하지 않습니다.
제안된 테스트 및 제안된 검사기
두 목록 모두 실행되지 않은 제안입니다. 이는 프로덕션 실행이 아니며, 측정값도 아닙니다.
def test_order_total_equals_sum_of_lines(contract):
"""property_id: order_total_equals_sum_of_lines"""
lines = contract["lines"]
...
어설션이 인변치(invariant)입니다. 독스트링(docstring)이 식별자입니다. 공식이 변경되면, 식별자도 함께 변경되어야 합니다. 이름은 유지하면서 공식을 편집하는 것이 무시(ignore)가 동작 변화를 살아남는 방식입니다.
#!/usr/bin/env python3
"""하나의 무시 기록에 대한 제안된 검사기. 실행되지 않은 예시."""
...
아래 원장은 2026-10-11 평가 날짜에 대한 필드 모양을 보여줍니다. 만료 값(expiry value)은 형식 예시에 불과합니다. 권장되는 기간도 아니며, 관찰된 플레이크 간격(flake interval)도 아닙니다.
{
"property_id": "order_total_equals_sum_of_lines",
"cited_property_id": "order_total_equals_sum_of_lines",
...
{
"schema": 1,
"fields": ["qty", "price"],
...
샘플 원장(ledger)은 fixture_hash가 해당 계약의 다이제스트로 대체될 때까지 닫힌 상태를 유지합니다. 이는 의도된 동작입니다.
명령어 (Commands)
동일한 정규화(canonicalization)를 사용하여 다이제스트를 출력한 다음, 고정된 시점에 결정을 다시 실행합니다. 그 후, 해당 식별자가 여전히 테스트 모듈에 있는지 확인합니다.
python3 - <<'PY'
import hashlib, json
with open("fixture_contract.json", encoding="utf-8") as handle:
...
python3 freeze_keys.py --ledger freeze_record.json --contract fixture_contract.json --now 2026-10-11T00:00:00Z
rg -n "property_id: order_total_equals_sum_of_lines" tests/test_order_total.py
Python 제안은 원장을 계약 파일과 비교합니다. 검색(search)은 테스트 모듈을 확인합니다. 둘 다 통과해야 합니다. 다이제스트가 일치하지 않으면 중단합니다. expires_at을 변경한다고 해서 해시가 복구되는 것은 아닙니다. 검색이 실패하면 중단합니다. 해당 행은 패치가 포함하고 있지 않은 이름(name)을 가리킵니다.
초안 작성 전 제거할 것 (Redact before any draft)
초안은 붙여넣는 발췌문만큼만 유용합니다. 호스트 이름, 계정 식별자, 토큰 및 고객 페이로드를 먼저 제거하세요. 예외 클래스(exception class), 속성 식별자(property identifier), 계약 필드 이름(contract field names)은 유지해야 합니다.
생산 환경 기록일 때에는 픽스처 값(fixture values)을 붙여넣지 마세요. 저장소(repo)의 계약은 이미 합성적(synthetic)이어야 합니다. 그렇지 않다면 이 워크플로우를 중단하세요. 데이터를 교체한 다음, 그 대체된 데이터로 해시를 만드세요. 새로운 다이제스트는 새로운 계약입니다.
스크래치 노트에는 작성된 레이블이 저장될 수 있습니다. 하지만 약한 제거(weak redact)를 통과한 비밀 정보는 저장하지 못할 수도 있습니다. 제거가 불확실한 경우, 초안 작성을 건너뛰고 어설션(assertion)을 로컬에서 읽어 failure_class를 설정하세요.
초안과 서버 샘플이 들어갈 수 있는 곳 (Where a draft and a server sample may enter)
공개: 이 문서는 MonkeyCode의 제품 홍보 활동의 일환으로 작성되었습니다. MonkeyCode의 무료 모델 접근은 레이블 저장용이라기보다는 초안 작성 보조 도구로서 3단계에 적합합니다. 식별자, 계약 필드 이름, 그리고 제거된 발췌문을 제공하세요. 하나의 레이블(예: invariant 또는 environment)과 그 이유를 한 문장으로 요청하세요. 이 텍스트는 스크래치 노트에 남겨두세요. decide는 절대 이를 읽지 않습니다.
MonkeyCode의 무료 서버 옵션은 샘플을 수집할 한 장소로서 4단계에 적합합니다. 이는 --now의 출처가 아닙니다. 이 기능을 사용한다면, 실제로 실행한 클래스 문자열(예: free-server)을 cited_runner_class에 작성해야 합니다. 다른 클래스 문자열은 창 키를 실패하게 만듭니다. 로그는 새롭고 승인되지 않은 행 옆에 위치할 수 있지만, 기존 행을 allow_cite로 변경할 수는 없습니다.
두 가용성 주장 모두 할당량(quota), 하드웨어 형태(hardware shape), 보존 기간(retention period) 또는 검토 면제(waiver of review)에 대한 규정을 명시하지 않습니다. 두 옵션 중 어느 것도 도달할 수 없다면, 스크래치 노트는 비워두고 로컬 체커를 실행하십시오. allow 경로는 이들을 호출하지 않습니다.
편집자가 만료 필드를 수정하기 전에, 수정된 발췌문(redacted excerpt)과 계약 파일이 이미 디스크에 있는 경우, 무료 모델 액세스와 무료 서버 옵션만으로 클래스 레이블을 초안 작성하고 라벨링된 샘플 하나를 첨부하는 데 충분합니다.
사용해서는 안 되는 경우
수트가 순수한 불변량(pure invariant)의 이름을 지정할 수 없다면 워크플로우를 건너뛰십시오. 전체 페이지 스냅샷 차이(Full-page snapshot diffs), 슬리핑을 통해 통과하는 테스트, 그리고 러너를 대체하는 패치는 범위 밖에 있습니다. 해시 값은 여전히 계산될 것입니다. 액션 코드는 검토자가 기대하는 의미가 아닐 수 있습니다.
실패한 불변량을 유지하기 위해 allow_cite를 사용하지 마십시오. 환경 클래스는 전제 조건입니다. 신뢰할 수 없는 로그 라인에서 --now를 가져오지 마십시오. 다이제스트(digest)의 동등성을 계약이 올바른 계약이라는 증거로 취급하지 마십시오.
본 문서는 플레이크율(flake rate), 런타임, 패치된 테스트 수를 보고하지 않습니다. 이러한 수치를 이전 문서에서 빌려오는 것이 decide를 더 정확하게 만들지 못할 것입니다.
패치가 여전히 포함해야 할 내용
명시된 단언(named assertion), 계약 파일, 그리고 선택한 타임스탬프에 대한 결정 문자열을 전송하십시오. reject:*를 반환하는 모든 무시 참조(ignore reference)를 제거하십시오. 초안과 서버 샘플은 검토자가 맥락이 필요하다면 토론에 남아 있을 수 있습니다. 이들은 allow 경로에는 포함되지 않습니다.
게이트는 로컬이며 재현 가능합니다. 세 개의 키, 호출자 제공 타임스탬프 하나, 그리고 환경 클래스가 전체 결정입니다. decide를 변경할 수 없는 맥락은 기록에 속하지 않습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기