Sub-scope 01 (outbound-messaging) governance + 루트 + autoconfigure + config — manifest and probes revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-30T06:24:40+00:00 === OWNED FILES === a9a027466f4efa9392aa9ec427994bd68d09d041 CLAUDE.md 76 941306ce9dcb4e3c7a456194404a9d66f524066d README.md 159 d23001caa29acef982dc0f28815f0fc5062b7e68 build.gradle 104 1126ebf2aa98feb153ee05da8837b10015487529 gradle.lockfile 152 905739a9d1bf9ba5a96ac4f9d6d7302f7d6db2ce src/main/java/dev/caskeleton/adapter/outbound/messaging/MessagingConfig.java 79 a80a60cf324fa430fff38da6cf96b794da0961f0 src/main/java/dev/caskeleton/adapter/outbound/messaging/MessagingSettings.java 20 8dd9090e6539c0e43997a2425ce820cea060bccd src/main/java/dev/caskeleton/adapter/outbound/messaging/autoconfigure/MessagingBridgeRootAutoConfiguration.java 24 597b0c54064855673332ecc8c07e912107de3a4f src/main/java/dev/caskeleton/adapter/outbound/messaging/autoconfigure/MessagingOffAutoConfigurationImportFilter.java 52 b0ea8ae1189bfc6a111b1ad66acc438b63f4df3e src/main/java/dev/caskeleton/adapter/outbound/messaging/config/CompiledMessagingDescriptor.java 204 cf646bfed662b820c418bacc58293848fa18cc34 src/main/java/dev/caskeleton/adapter/outbound/messaging/config/MessagingCapabilityCardRegistry.java 235 eb62f492984e1b5df49394eaf201243802ea4691 src/main/resources/META-INF/spring.factories 2 0d6aa7d86c134a24d68be492f3b83ff8b5f1e5be src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 98014fb834de5beb45aa94924119a77cdbfe9f17 src/test/java/dev/caskeleton/adapter/outbound/messaging/MessagingConfigTest.java 88 8edcd1efd2f11bd68a9f1f83a93d29ccc9a51fd0 src/test/java/dev/caskeleton/adapter/outbound/messaging/config/MessagingCapabilityCardRegistryTest.java 97 === 8.1 활성화 게이트가 실제로 등록돼 있는가 === $ cat adapter/outbound/messaging/src/main/resources/META-INF/spring.factories org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\ dev.caskeleton.adapter.outbound.messaging.autoconfigure.MessagingOffAutoConfigurationImportFilter exit=0 $ cat adapter/outbound/messaging/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dev.caskeleton.adapter.outbound.messaging.autoconfigure.MessagingBridgeRootAutoConfiguration exit=0 === 8.2 compiled descriptor 계열의 도달성 === CompiledMessagingDescriptor: leaf main 참조 0 · app-bootstrap 참조 0 MessagingCapabilityCardRegistry: leaf main 참조 4 · app-bootstrap 참조 0 ContractCatalogCompiler: leaf main 참조 1 · app-bootstrap 참조 0 DestinationBindingCompiler: leaf main 참조 1 · app-bootstrap 참조 0 ContractCatalogDigest: leaf main 참조 2 · app-bootstrap 참조 0 $ git grep -rn 'CompiledMessagingDescriptor' -- 'app-bootstrap/src' | head exit=0 === 8.3 broker 조립: 두 스위치의 관계 === $ grep -n 'ConditionalOnProperty' -r adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/kafka/KafkaAdapterConfig.java:4:import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/kafka/KafkaAdapterConfig.java:23: @ConditionalOnProperty(name = "app.messaging.broker", havingValue = "kafka") adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/autoconfigure/MessagingBridgeRootAutoConfiguration.java:7:import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/autoconfigure/MessagingBridgeRootAutoConfiguration.java:21:@ConditionalOnProperty(prefix = "app.messaging", name = "enabled", havingValue = "true") adapter/outbound/messaging/src/main/java/dev/caskeleton/adapter/outbound/messaging/MessagingConfig.java:21: * {@code @ConditionalOnProperty(app.messaging.broker=)}-gated bean, at most one active — adding exit=0 $ git grep -rn 'app.messaging' -- 'app-bootstrap/src/main/resources' | head app-bootstrap/src/main/resources/application.yml:657: # MSG-024: an enabled relay with a blank app.messaging.broker fails startup exit=0 === 8.4 config test === $ git ls-files 'adapter/outbound/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging' | grep -E "^adapter/outbound/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging/[^/]+\.java$|^adapter/outbound/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging/config/" | xargs -n1 basename MessagingConfigTest.java MessagingCapabilityCardRegistryTest.java exit=0 $ git grep -h ' void [a-z]' -- 'adapter/outbound/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging/config' "$(git ls-files 'adapter/outbound/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging' | grep -E \"^adapter/outbound/messaging/src/test/java/dev/caskeleton/adapter/outbound/messaging/[^/]+\.java\$\" | head -1)" | sed 's/^ *//' fatal: empty string is not a valid pathspec. please use . instead if you meant to match all paths exit=0 === 8.4b 실행 probe: verifyJsonSchemaRuntimeGraph (check 에 붙어 있음) === $ ./gradlew :adapter:outbound:messaging:verifyJsonSchemaRuntimeGraph FAILED — Messaging JSON runtime is missing required locked module tools.jackson.core:jackson-core:3.0.2 EXIT=1 --- 태스크가 요구하는 정확한 좌표 --- $ sed -n '50,59p' adapter/outbound/messaging/build.gradle [ 'com.networknt:json-schema-validator:3.0.2', 'tools.jackson.core:jackson-core:3.0.2', 'tools.jackson.core:jackson-databind:3.0.2' ].each { String required -> if (!modules.contains(required)) { throw new GradleException( "Messaging JSON runtime is missing required locked module ${required}") } } exit=0 --- 잠긴 실제 좌표 --- $ grep -E 'jackson|networknt|yaml' adapter/outbound/messaging/gradle.lockfile com.fasterxml.jackson.core:jackson-annotations:2.21=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.networknt:json-schema-validator:3.0.2=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-jackson:4.0.8=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-starter-jackson-test:4.0.8=testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-starter-jackson:4.0.8=testCompileClasspath,testRuntimeClasspath tools.jackson.core:jackson-core:3.1.5=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath tools.jackson.core:jackson-databind:3.1.5=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath tools.jackson:jackson-bom:3.1.5=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath exit=0 === 8.4c 컴파일된 서술자 계열의 소비자 === $ git grep -l 'adapter.outbound.messaging.contract\|adapter.outbound.messaging.destination\|adapter.outbound.messaging.envelope\|adapter.outbound.messaging.config' -- . | grep -v '^adapter/outbound/messaging/' exit=1 $ git grep -h 'import dev.caskeleton.adapter.outbound.messaging' -- 'app-bootstrap/src' | sort -u import dev.caskeleton.adapter.outbound.messaging.MessagingConfig; import dev.caskeleton.adapter.outbound.messaging.core.DisabledMessagePublisher; import dev.caskeleton.adapter.outbound.messaging.core.MessageBroker; import dev.caskeleton.adapter.outbound.messaging.core.MessagePublisher; import dev.caskeleton.adapter.outbound.messaging.core.OutboundMessage; import dev.caskeleton.adapter.outbound.messaging.core.OutboundMessagePublisher; import dev.caskeleton.adapter.outbound.messaging.kafka.KafkaAdapterConfig; import dev.caskeleton.adapter.outbound.messaging.kafka.KafkaAdapterSettings; import dev.caskeleton.adapter.outbound.messaging.kafka.KafkaSender; import dev.caskeleton.adapter.outbound.messaging.outbox.DisabledOutboxMessagePublisher; import dev.caskeleton.adapter.outbound.messaging.outbox.OutboxMessagePublishAdapter; import dev.caskeleton.adapter.outbound.messaging.outbox.Slf4jOutboxRelayFailureReportAdapter; exit=0 $ git grep -rn 'CompiledMessagingDescriptor' -- 'adapter/outbound/messaging/src/main' | grep -v 'config/CompiledMessagingDescriptor.java' exit=1 === 8.4d README의 jackson-databind 주장 === $ sed -n '34,40p' adapter/outbound/messaging/README.md ## OutboxEnvelopeJson — 손수 짠 JSON 이 모듈은 `jackson-databind` 를 classpath 에 두지 않아(스켈레톤을 가볍게 유지) outbox envelope 직렬화는 의존성 없는 손수 짠 JSON 이다. ## MessagePublisher vs OutboxMessagePublishPort exit=0