자료가 없어서 판단하지 못한 일과 판단했지만 조건이 맞지 않은 일은 다음 처리가 다르다. 이 차이를 한 가지 대기 문구로 덮지 않도록 작은 합성 요약 함수를 만들었다. 실제 데이터나 외부 시스템을 연결하지 않은 코드다.
규칙마다 자료 유무와 조건 결과를 따로 받는다
summarize_rules는 규칙 목록을 받는다. 각 규칙에는 id, required, available, met 네 필드만 둔다. available은 계산에 필요한 관찰을 준비했다고 호출자가 선언한 값이고 met는 그 관찰로 판단한 조건 결과다. 자료가 있어 조건이 거짓인 것과 자료가 없어 조건을 판단하지 못한 것을 같은 False 하나로 압축하지 않는 계약이다.
이 함수가 자료를 읽거나 참인지 확인하지는 않는다. 어떤 값을 관찰했고 왜 available이라고 했는지는 연결하는 프로그램의 책임이다. 함수 이름에 evidence가 있어도 출처 인증이나 최신성 검사가 생기지 않는다. 여기서는 설명 가능한 두 상태를 잃지 않고 요약하는 작은 계산만 분리했다.
후속 원제품 수정에서는 장기 평균 null이 입력 해석에서 0으로 바뀌어 available이 참이 되는 반례를 확인했다. 요약 함수는 호출자가 잘못 선언한 자료 유무를 원문 시세와 대조해 바로잡지 못한다. 원문 타입·단위·시각과 허용 변환을 확인한 뒤 가용성을 만들어야 한다. 이번 모듈의 구현이나 ZIP을 원제품에 자동 설치한 것은 아니다.
그 다음 시장 입력 경로를 연결한 시험에서는 배열 가격 [100]과 불리언 가격 true가 앞단에서 숫자 100과 1로 바뀌어 엔진 검사를 지나던 반례도 나왔다. 원제품은 같은 숫자 해석 함수를 시장 응답·스냅샷·엔진에 연결해 고쳤다. 이 요약 모듈은 그 변환을 수행하지 않는다. available=True와 met=True가 형식상 맞으면 원문이 잘못됐는지 알아낼 수 없으므로, 호출자는 가용성 선언 전의 변환 경로까지 확인해야 한다.
자료가 없으면 조건 결과는 미확인으로 남긴다
available이 True이면 met는 실제 boolean이어야 한다. available이 False이면 met는 None만 허용한다. 자료는 없는데 조건을 충족했다고 넣거나, 계산하지 않은 결과를 False로 넣는 모순을 거절한다. 문자열 false나 숫자 0도 boolean으로 바꾸어 받지 않는다. 잘못된 자료형을 그럴듯한 보류 상태로 숨기지 않기 위한 선택이다.
규칙 ID는 중복 없는 소문자 식별자이며 목록은 1개부터 64개까지다. 여분 원문 필드나 빠진 필드는 오류다. 이 범위는 공개 예제의 계약이고 모든 업무의 규칙 개수를 뜻하지 않는다. 더 큰 규칙 체계가 필요하면 목록 분할과 식별자 범위부터 정하고 시험을 확장해야 한다.
필수 규칙과 선택 관찰의 집계를 분리한다
required는 어떤 관찰이 요약의 필수 조건인지 명시한다. 선택 관찰이 아직 없어도 필수 자료가 준비됐다는 사실을 지우지 않는다. 반대로 선택 조건 여러 개가 맞았다고 필수 자료 하나의 누락을 가려서는 안 된다. 필수 규칙이 하나도 없는 목록은 의미 없는 전체 통과를 만들지 않도록 거절했다.
결과의 required_total, available_required, met_required는 모두 같은 필수 모집단을 사용한다. missing_optional은 별도 목록이다. 원본 프로그램에 있던 특정 규칙 이름의 예외 처리를 그대로 복사한 것이 아니라, 이 공개 예제에서는 필요 여부를 명시하는 새 계약을 선택했다. 원래 정책을 자동으로 교체하는 도구는 아니다.
코드와 구현 살펴보기
독립 합성 전체 구현
"""Independent declared rule summary. No data source, strategy or action."""
import re
def summarize_rules(rows):
if type(rows) is not list or not 1<=len(rows)<=64:raise ValueError('RULE_LIST_REQUIRED')
seen=set();required=[];optional=[]
for row in rows:
if type(row) is not dict or set(row)!={'id','required','available','met'}:raise ValueError('EXACT_RULE_FIELDS')
if type(row['id']) is not str or not re.fullmatch(r'[a-z][a-z0-9_-]{0,39}',row['id']):raise ValueError('RULE_ID')
if row['id'] in seen:raise ValueError('DUPLICATE_RULE_ID')
seen.add(row['id'])
if type(row['required']) is not bool or type(row['available']) is not bool:raise ValueError('BOOLEAN_FLAGS')
if row['available']:
if type(row['met']) is not bool:raise ValueError('OBSERVED_CONDITION_REQUIRED')
elif row['met'] is not None:raise ValueError('UNAVAILABLE_CONDITION_MUST_BE_UNKNOWN')
(required if row['required'] else optional).append(row)
if not required:raise ValueError('REQUIRED_RULE_NEEDED')
missing=sorted(r['id'] for r in required if not r['available'])
unmet=sorted(r['id'] for r in required if r['available'] and not r['met'])
return {'state':'inputs_missing' if missing else 'conditions_unmet' if unmet else 'conditions_met',
'required_total':len(required),'available_required':sum(r['available'] for r in required),
'met_required':sum(r['available'] and r['met'] for r in required),
'missing_required':missing,'unmet_required':unmet,
'missing_optional':sorted(r['id'] for r in optional if not r['available']),
'evaluation_ready':not missing,'all_required_conditions_met':not missing and not unmet,
'executes_action':False,'authenticates_evidence':False}
제목 상태 하나를 고르면서 세부 사유도 남긴다
필수 자료가 부족하면 inputs_missing, 자료는 모두 있고 조건 일부가 거짓이면 conditions_unmet, 필수 조건이 모두 참이면 conditions_met다. 부족한 자료가 있을 때 제목 상태는 그것을 우선하지만 이미 평가해 거짓인 규칙도 unmet_required에 남긴다. 하나의 상태 문구를 만들기 위해 나머지 관찰을 버리지 않는다.
evaluation_ready는 필수 자료가 모두 있다는 선언만 반영한다. 조건이 거짓이어도 자료가 준비됐으면 True일 수 있다. all_required_conditions_met는 자료와 필수 조건을 함께 본다. 따라서 평가할 수 있음과 조건을 충족함을 서로 다른 필드로 읽을 수 있다. 입력 순서를 바꿔도 사유 목록은 정렬되어 같은 요약을 만든다.
조건 통과를 실제 행동으로 연결하지 않는다
executes_action과 authenticates_evidence는 모든 정상 결과에서 False다. 필수 조건이 모두 참이어도 실제 입력·저장·주문·승인으로 연결하는 기능은 없다. 이 모듈은 수량이나 금액, 전략 신호를 계산하지 않는다. 어떤 행동을 할지는 권한과 현재 상태를 확인하는 다음 계층에서 별도로 판단해야 한다.
소스 폴더와 압축 추출 폴더에서 각각 독립 시험 22개를 실행했다. 다섯 기록은 자료 부족, 관찰한 거짓, 필수 조건 충족, 선택 자료 미확인과 혼합 사유를 보여 준다. 아래 선택기는 저장된 합성 결과를 읽으며 방문자의 자료를 받지 않는다. DOM 대역 검사는 실제 브라우저와 원래 프로그램 검수로 보고하지 않는다.
다른 프로그램의 상태 문구에도 연결할 수 있다
ZIP에는 독립 구현, 시험, 예제 실행기와 실제 합성 실행 기록이 있다. 압축을 푼 폴더에서 python -B -m unittest -v로 확인한다. 수정·재배포·상업적 재사용을 허용하고 무보증으로 제공한다. 원래 업체의 프로그램이나 고객 자료를 추출한 파일이 아니라 새로 작성한 작은 설명용 계약이다.
적용할 때는 어떤 관찰을 필수로 할지, 자료가 준비됐다는 근거를 어디서 만들지, 미충족과 미확인에 어떤 안내를 붙일지 정한다. 자료를 기다리는 상태와 정상적으로 계산한 부정 결과가 구별되면 담당자의 다음 행동도 달라진다. 실제 자료 조회·신선도·권한·이력 저장·자동 실행은 이 함수 밖에 남겨 두었다.
두 모델을 연결할 때는 표현도 맞춰야 한다. 원래 엔진은 자료가 없을 때 available:false와 met:false를 함께 남기지만 이 Python 모듈은 미확인 결과를 met=None으로 받는다. 필요한 어댑터를 구현하거나 자동 연결하지 않았다. 이번 개정에서 기존 공개 ZIP을 다시 추출해 합성 검사 22개와 기록 선택기의 DOM 대역을 확인했다. 원제품의 첫 후속 22개·복구 16/22와 다음 입력 경로 수정의 30개·복구 22/30은 각각의 개발 기록이며, 이 모듈의 시험 수나 실제 브라우저 검수로 합산하지 않는다.