검증과 실패 의미론
적용 범위: JIT와 schema 계층
성공 건수만으로는 무엇을 놓쳤는지 알 수 없다. 그래서 처리 대상마다 outcome을 남긴다.
No-silent-drop 규칙
모든 in-scope record와 candidate는 명시적 outcome으로 종결된다. 요약 수치는 그 outcome에서 계산한다. 별도 숫자를 입력해 누락을 숨길 수 없다.
JIT candidate outcome
| Outcome | 의미 |
|---|---|
NORMALIZED | 하나 이상의 Observation을 생성함 |
DUPLICATE | 한 index snapshot 안에서 동일 locator의 반복 |
UNSUPPORTED | 읽었지만 고정된 schema로 표현할 수 없음 |
ERROR | 처리 실패 |
NOT_RELEVANT | exact-hit 재구성 결과 실제 account 참여가 없음 |
역색인 match bit는 힌트이지 판정이 아니다. coarse match로 들어온 candidate가 실제 account와 무관하면 NOT_RELEVANT로 종결한다.
Source extraction outcome
SourceExtractionRun의 SourceRecord 선택에도 같은 다섯 outcome이 적용되며, NOT_RELEVANT는 계약이 정한 근거를 요구한다.
Run 수준의 폐쇄
run은 끝났다는 이유만으로 COMPLETE가 되지 않는다.
TransactionDiscoveryRun은 profile과 producer artifact가 고정되고, block 범위에 빈 구간과 미해결 오류가 없으며, 발견한 모든 고유 transaction이 연결된 경우에만COMPLETE다. 필요한 trace나 state 자료를 얻지 못했다면 반드시PARTIAL이다.UNSUPPORTED나ERROR가 남아 있는 동안 interpretation closure는PARTIAL이다. hypothesis가REJECT또는DEFER됐다는 이유만으로 그것이 인용한 Observation이 처리 완료가 되지 않는다.
불확실성이 보존되는 지점
| 상황 | 시스템의 처리 |
|---|---|
| bridge 목적지 미확정 | 확정 OUT Posting과 MISSING destination leg. 도착 Posting·확정 continuity·lot carry 없음 |
| 취득가액 미상 | basisStatus: UNKNOWN. 0이 아님 |
| ERC-4337 user operation | userOpHash와 userOpIndex를 native 증거로 보존. 임의의 transaction 좌표로 매핑하지 않고 UNSUPPORTED로 종결 |
| transaction 없는 block credit·withdrawal | native 좌표를 보존한 채 UNSUPPORTED로 종결 |
| provider divergence | 조용히 승자를 고르지 않고 감지해 드러냄 |
| reorg | inclusion revision으로 기록. 이전 inclusion을 대체하지 않음 |
빈칸을 그럴듯한 기본값으로 채우지 않는다. 값이 없거나 확정되지 않았다는 사실도 결과에 남긴다.
재현성
같은 입력을 같은 버전으로 실행하면 같은 결과가 나온다. 버전이 다르면 변경 원인을 설명할 수 있다.
재현성을 위해 다음 정보를 보존한다.
- 불변 selection snapshot과 selection digest가 run이 무엇을 고려했는지 고정한다.
- 공유 실행 증거를
chainId + blockHash + transactionIndex + evidenceProfile당 한 번만 materialize하므로, 재시도·worker 중복·process crash·provider failover에서도 중복 execution이 생기지 않는다. - content-addressed artifact는 결과에 사용한 입력을 hash로 식별한다.
- 검증된 generation은 제자리에서 수정하지 않는다. 정정은
supersedes와 사유를 가진 새 레코드로 들어온다.
검증의 깊이
개별 fragment의 타입 검사만으로는 발행할 수 없다. #ValidateGeneration은 transaction, inclusion, execution, discovery run, link, observation run, Observation 사이의 전역 참조와 폐쇄 조건을 검사한다. #ValidatePublication은 여기에 더해 manifest를 실제 content hash와 대조한다.
다루지 않는 것
사용자용 coverage와 reconciliation 화면은 확인되지 않음이다. outcome은 저장되지만 비엔지니어가 확인할 인터페이스는 아직 없다. 세무 원가와 리포트를 참고하라.