Sub-scope 02 (outbound-messaging) envelope/** + JSON Schema meta 리소스 — manifest and probes
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
generatedAt=2026-08-30T06:27:52+00:00

=== OWNED FILES ===
758b7177a64804fe295e8be8b425f3808e91196e main/java/dev/caskeleton/adapter/outbound/messaging/envelope/DeterministicEnvelopeWriter.java 548
e0fd83434527d5a36b2a9810533b642c8f017787 main/java/dev/caskeleton/adapter/outbound/messaging/envelope/EnvelopeAdmissionLimits.java 56
63b3ba7a5de004c84241f54afd56198456522a70 main/java/dev/caskeleton/adapter/outbound/messaging/envelope/EnvelopeHashV1.java 36
5fa19d059d212146484fa2358a0105b182b08148 main/java/dev/caskeleton/adapter/outbound/messaging/envelope/JsonSchemaIntegrationEventEncoder.java 232
26eaddffcf160bb6a06c652e3943b576b627d518 main/java/dev/caskeleton/adapter/outbound/messaging/envelope/LocalJsonSchemaRegistry.java 701
3466e4660bd95fa55f817320609cef033f616445 main/resources/contracts/messaging/meta/draft-2020-12/authority.sha256 9
ca69923096f3a2e4fe5eb8152a92d87d146cf021 main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/applicator 48
2f6e056a9ac2399582eaf05985a26acf9161f213 main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/content 17
dfc092d9646e1ea89e4d771bfcf2a4ca87eeac75 main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/core 51
51ef7ea118c34e8ac3da66c973bae02b9e8325d8 main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/format-annotation 14
1a4f106cfe0b2df4784a39fae720762534a54cdf main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/format-assertion 11
05cbc22afde5ebe6ba84957ca412277bde1e4b08 main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/meta-data 37
5f62a3ffa20be07dc813d6b8a154fa8451d0dc61 main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/unevaluated 15
606b87ba2ec213d63b9e2035a6acc4edcb4b8357 main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/meta/validation 98
d5e2d31c3c88e61f4c204cb6616887bba7e105dd main/resources/contracts/messaging/meta/draft-2020-12/draft/2020-12/schema 58
e0ac636a898cf0a7143df39a0fca9c6105a3c9c7 test/java/dev/caskeleton/adapter/outbound/messaging/envelope/EnvelopeAdversarialCorpusTest.java 334
3d960a923d7dc4684e9b039782cf7eef900071f2 test/java/dev/caskeleton/adapter/outbound/messaging/envelope/JsonSchemaIntegrationEventEncoderTest.java 413
ff105bfaa862fd89f992367f6397cb5e858780f7 test/java/dev/caskeleton/adapter/outbound/messaging/envelope/LocalJsonSchemaRegistryTest.java 393
e127ca96edb86ab9fe30438da19b72367fbe5324 test/resources/contracts/messaging/test.event/v1.invalid.json 13
74a3d91ae00a7e82ee5c3893847e9abe0debac16 test/resources/contracts/messaging/test.event/v1.schema.json 70
52c2bce0490fa5845f14227347ec7498a5eb8ca0 test/resources/contracts/messaging/test.event/v1.valid.json 15

main: 5  test: 3  resources: 13
=== 8.1 레지스트리가 외부 해석을 실제로 닫는가 ===
$ grep -n 'SchemaRegistryConfig\|schemaLoader\|uriFetcher\|disable\|cacheRefs\|SpecificationVersion' adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/envelope/LocalJsonSchemaRegistry.java | head -20
7:import com.networknt.schema.SchemaRegistryConfig;
8:import com.networknt.schema.SpecificationVersion;
405:    SchemaRegistryConfig config =
406:        SchemaRegistryConfig.builder()
410:            .cacheRefs(true)
414:          SpecificationVersion.DRAFT_2020_12,
exit=0

$ grep -n 'UNSUPPORTED_CLOSED_SUBSET_KEYWORDS' -A 3 -B 1 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/envelope/LocalJsonSchemaRegistry.java | head -20
57-          "https://json-schema.org/draft/2020-12/vocab/content");
58:  private static final Set<String> UNSUPPORTED_CLOSED_SUBSET_KEYWORDS =
59-      Set.of("$anchor", "$dynamicRef", "$dynamicAnchor", "$recursiveRef", "$recursiveAnchor");
60-  private static final String PINNED_AUTHORITY_ROOT = "contracts/messaging/meta/draft-2020-12/";
61-  private static final String PINNED_AUTHORITY_MANIFEST =
--
300-      }
301:      for (String keyword : UNSUPPORTED_CLOSED_SUBSET_KEYWORDS) {
302-        if (node.has(keyword)) {
303-          throw new IllegalArgumentException(
304-              keyword + " is unsupported by the closed local schema subset");
exit=0

$ grep -n 'KNOWN_VOCABULARIES' adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/envelope/LocalJsonSchemaRegistry.java
48:  private static final Set<String> KNOWN_VOCABULARIES =
286:      if (!KNOWN_VOCABULARIES.contains(entry.getKey())) {
exit=0

=== 8.2 핀 고정된 메타스키마 권위 해시 ===
$ cat adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12/authority.sha256
41da76f5afb7ce062d248f762463a92f7ca47e4e0f905b224ba6afeef91ded0f  draft/2020-12/schema
c4a6e4147b91fef7fea6dc058cb1bf93402f7414b76578a8b16aaf1dad6aacef  draft/2020-12/meta/applicator
08343747764e4a5814262793cf4d652057a7913863c5950d43297e8e1fdac5b6  draft/2020-12/meta/content
c2d12a8e4dd11d336dfc83a3f663aa4c69f0b49b3beb094ffeb25b5316f4803d  draft/2020-12/meta/core
abc775adfefd89d22358170d9bf93f4ebd2349563bbbedd60f02bef7c812bcc0  draft/2020-12/meta/format-annotation
6a5a8e13c605e3eff51f9bf8da18078880d81ff1634e391760ccc2e16ee2146f  draft/2020-12/meta/format-assertion
8f76d6e14f41b9b92ef933b708cdc5144c8b5268651ad11918485fb1754f1c76  draft/2020-12/meta/meta-data
2dbfbcb73994b670b0976492adee1fffb46c21682784d2f5a4ca561f9e2d0cb4  draft/2020-12/meta/unevaluated
7010a31e541f32d2be721e2de348df75c9b36876a3ed304877fc0abda1d37a58  draft/2020-12/meta/validation
exit=0

$ grep -n 'loadPinnedAuthority' -A 30 adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/envelope/LocalJsonSchemaRegistry.java | head -45
105:        loadPinnedAuthority(mapper, LocalJsonSchemaRegistry.class.getClassLoader());
106-
107-    Map<String, ParsedSource> parsedById = new LinkedHashMap<>();
108-    Map<String, ParsedSource> parsedByResource = new LinkedHashMap<>();
109-    exactSources.entrySet().stream()
110-        .sorted(Map.Entry.comparingByKey())
111-        .forEach(
112-            entry -> {
113-              SchemaSource source = entry.getValue();
114-              if (source == null || !entry.getKey().equals(source.resourcePath())) {
115-                throw new IllegalArgumentException(
116-                    "schema resource map key must equal its non-null exact source path");
117-              }
118-              ParsedSource parsed = parseAndCheck(source);
119-              if (parsedByResource.putIfAbsent(source.resourcePath(), parsed) != null) {
120-                throw new IllegalArgumentException(
121-                    "duplicate schema resource " + source.resourcePath());
122-              }
123-              if (parsedById.putIfAbsent(parsed.schemaId(), parsed) != null) {
124-                throw new IllegalArgumentException("duplicate schema $id " + parsed.schemaId());
125-              }
126-            });
127-
128-    validateAllReferences(parsedById);
129-    SchemaRegistry registry = compileRegistry(parsedById);
130-    validatePinnedAuthorityAgainstRuntime(registry, pinnedAuthority);
131-    validateAgainstBundledMetaSchema(registry, parsedById.values());
132-
133-    Map<String, CompiledSchema> byId = new LinkedHashMap<>();
134-    Map<String, CompiledSchema> byResource = new LinkedHashMap<>();
135-    parsedById.values().stream()
--
440:  private static PinnedAuthority loadPinnedAuthority(ObjectMapper mapper, ClassLoader classLoader) {
441-    byte[] manifestBytes = readRequiredClasspathBytes(classLoader, PINNED_AUTHORITY_MANIFEST);
442-    String manifest;
443-    try {
444-      manifest =
445-          StandardCharsets.UTF_8
446-              .newDecoder()
447-              .onMalformedInput(CodingErrorAction.REPORT)
448-              .onUnmappableCharacter(CodingErrorAction.REPORT)
449-              .decode(ByteBuffer.wrap(manifestBytes))
450-              .toString();
451-    } catch (CharacterCodingException exception) {
452-      throw new IllegalArgumentException(
exit=0

=== 8.3 실행 probe: 매니페스트 해시가 실제 파일과 일치하는가 ===
$ cd adapter/outbound/messaging/src/main/resources/contracts/messaging/meta/draft-2020-12 && for f in draft/2020-12/schema draft/2020-12/meta/*; do printf '%s  %s\n' "$(sha256sum "$f" | cut -d' ' -f1)" "$f"; done
41da76f5afb7ce062d248f762463a92f7ca47e4e0f905b224ba6afeef91ded0f  draft/2020-12/schema
c4a6e4147b91fef7fea6dc058cb1bf93402f7414b76578a8b16aaf1dad6aacef  draft/2020-12/meta/applicator
08343747764e4a5814262793cf4d652057a7913863c5950d43297e8e1fdac5b6  draft/2020-12/meta/content
c2d12a8e4dd11d336dfc83a3f663aa4c69f0b49b3beb094ffeb25b5316f4803d  draft/2020-12/meta/core
abc775adfefd89d22358170d9bf93f4ebd2349563bbbedd60f02bef7c812bcc0  draft/2020-12/meta/format-annotation
6a5a8e13c605e3eff51f9bf8da18078880d81ff1634e391760ccc2e16ee2146f  draft/2020-12/meta/format-assertion
8f76d6e14f41b9b92ef933b708cdc5144c8b5268651ad11918485fb1754f1c76  draft/2020-12/meta/meta-data
2dbfbcb73994b670b0976492adee1fffb46c21682784d2f5a4ca561f9e2d0cb4  draft/2020-12/meta/unevaluated
7010a31e541f32d2be721e2de348df75c9b36876a3ed304877fc0abda1d37a58  draft/2020-12/meta/validation
exit=0

=== 8.4 test 이름 ===
$ git ls-files 'adapter/outbound/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging/envelope' | xargs -n1 basename
basename: missing operand
Try 'basename --help' for more information.
exit=123

$ git grep -h '  void [a-z]' -- 'adapter/outbound/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging/envelope' | sed 's/^ *//'
exit=0

