--- kind: CONCEPT slug: adapter-outbound-messaging-c03 title: 열린 타입은 페이로드로 받지 않는다 topic: state-machines-and-ownership project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:adapter-outbound-messaging-c03 evidenceCapturedOn: 2026-09-01 assets: - key: adapter-outbound-messaging-c03 file: ../../../final/evidence/rendered/adapter-outbound-messaging-c03.svg evidence: - ../../../final/evidence/raw/adapter-outbound-messaging-c03.txt source: - 원본 분석 절은 analysis/12-adapter-outbound-messaging.md#L237 이다. module: adapter-outbound-messaging --- # 열린 타입은 페이로드로 받지 않는다 `ContractCatalogCompiler`가 정확한 record 타입 토큰으로부터 불변 카탈로그를 만들고, test 이름이 무엇을 거부하는지 전부 적는다. ## 본문 `ContractCatalogCompiler`가 **정확한 record 타입 토큰**으로부터 불변 카탈로그를 만들고, test 이름이 무엇을 거부하는지 전부 적는다 — 중복 stable/schema/payload 신원, 음수 버전, 잘못된 payload kind, null·공백·중복·반사 불일치 성분 순서, 서술자 누락, **payload 버전 사이의 logical destination 드리프트**. ## ContractCatalogCompiler 참조 위치 :::evidence key="adapter-outbound-messaging-c03" alt="코드베이스에서 ContractCatalogCompiler 를 검색한 출력 18줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="ContractCatalogCompiler 코드베이스 검색 — 18줄 · exit 0" zoom="true" ::: ## 그래프가 닫혀 있어야 스냅샷할 수 있다 `recursivelyFreezesOnlyTheClosedDeclaredGenericPayloadGraph` / `rejectsOpenRawWildcardMapJsonTreeInterfaceAndGenericRecordGraphs` — 열린 타입(raw·wildcard·`Map`·JSON 트리·인터페이스·제네릭 record 그래프)을 페이로드로 받지 않는다. 봉투 작성기가 shape을 따라 스냅샷할 수 있으려면 그래프가 닫혀 있어야 한다(§11). ## 접근자를 정확히 한 번만 부르는 이유 `snapshotsEveryContributionAccessorExactlyOnceIncludingAStatefulSchemaHash` / `statefulDescriptorCannotBypassCrossVersionLogicalDestinationDrift` — 기여 접근자를 **정확히 한 번만** 호출한다. 가변 서술자가 검사와 저장 사이에 값을 바꿔 규칙을 우회하는 경로를 닫는다. ## 반사가 밖으로 새지 않는다 `compiledContractUsesOnlyAStaticPublicCompositionBridgeWithoutReflectionLeak` — 컴파일된 계약이 반사를 밖으로 새게 하지 않는다.