# evidence 264 — cross-scope-autoconfiguration-roots # revision: a24ece9cf797f7ea647e33bf846b115208ed1ba5 # cwd: /shared/codebase/clean-architecture-backend-template/src/messaging # command: bash /tmp/xscope.sh # ---- raw output ---- ==== A. registry: every leaf, files, runtime_memberships ==== leaves: 62 1 adapter-inbound-graphql files= 534 rt=['app-bootstrap'] 2 adapter-inbound-grpc files= 18 rt=[] 3 adapter-inbound-web files= 638 rt=['app-bootstrap', 'sample-portfolio'] 4 adapter-inbound-websocket files= 253 rt=[] 5 adapter-outbound-cache-redis files= 390 rt=['app-bootstrap'] 6 adapter-outbound-fileserver files= 119 rt=['app-bootstrap'] 7 adapter-outbound-httpclient files= 370 rt=['app-bootstrap'] 8 adapter-outbound-identifier files= 10 rt=['app-bootstrap', 'sample-portfolio'] 9 adapter-outbound-messaging files= 69 rt=['app-bootstrap'] 10 adapter-outbound-notification files= 240 rt=['app-bootstrap'] 11 adapter-outbound-objectstorage files= 206 rt=['sample-portfolio'] 12 adapter-outbound-persistence-jpa files= 605 rt=['app-bootstrap', 'sample-portfolio'] 13 adapter-outbound-persistence-mongo files= 497 rt=['app-bootstrap'] 14 adapter-outbound-support files= 9 rt=['app-bootstrap'] 15 app-bootstrap files= 455 rt=['app-bootstrap'] 16 application-core files= 1025 rt=['app-bootstrap', 'sample-portfolio'] 17 domain-core files= 13 rt=['app-bootstrap', 'sample-portfolio'] 18 grpc-admin files= 19 rt=[] 19 grpc-advanced-bootstrap files= 13 rt=[] 20 grpc-advanced-compat files= 25 rt=[] 21 grpc-advanced-diagnostics files= 8 rt=[] 22 grpc-advanced-edition files= 11 rt=[] 23 grpc-advanced-resilience files= 23 rt=[] 24 grpc-advanced-streaming files= 20 rt=[] 25 grpc-client files= 19 rt=[] 26 grpc-codegen files= 16 rt=[] 27 grpc-core-api files= 41 rt=[] 28 grpc-discovery files= 11 rt=[] 29 grpc-observability files= 7 rt=[] 30 grpc-operation-ledger-jpa files= 7 rt=[] 31 grpc-policy files= 82 rt=[] 32 grpc-proto-contract files= 11 rt=[] 33 grpc-server files= 24 rt=[] 34 grpc-spring-boot-starter files= 8 rt=[] 35 grpc-testkit files= 36 rt=[] 36 messaging-admin-api files= 28 rt=['app-bootstrap'] 37 messaging-admin-runtime files= 20 rt=['app-bootstrap'] 38 messaging-claim-check files= 11 rt=['app-bootstrap'] 39 messaging-cloudevents files= 6 rt=['app-bootstrap'] 40 messaging-core-api files= 95 rt=['app-bootstrap'] 41 messaging-inbox-jdbc-postgresql files= 13 rt=['app-bootstrap'] 42 messaging-kafka files= 61 rt=['app-bootstrap'] 43 messaging-kafka-share-experimental files= 7 rt=[] 44 messaging-nats-experimental files= 11 rt=[] 45 messaging-observability files= 17 rt=['app-bootstrap'] 46 messaging-outbox-jdbc-postgresql files= 28 rt=['app-bootstrap'] 47 messaging-policy files= 32 rt=['app-bootstrap'] 48 messaging-pulsar-experimental files= 12 rt=[] 49 messaging-rabbit files= 33 rt=['app-bootstrap'] 50 messaging-reliability-api files= 15 rt=['app-bootstrap'] 51 messaging-runtime-core files= 12 rt=['app-bootstrap'] 52 messaging-schema-api files= 15 rt=['app-bootstrap'] 53 messaging-schema-avro files= 8 rt=[] 54 messaging-schema-json files= 6 rt=['app-bootstrap'] 55 messaging-schema-protobuf files= 6 rt=[] 56 messaging-security files= 17 rt=['app-bootstrap'] 57 messaging-spring-boot-starter files= 44 rt=['app-bootstrap'] 58 messaging-spring-cloud-stream-bridge files= 10 rt=[] 59 messaging-testkit files= 23 rt=[] 60 messaging-transport-spi files= 19 rt=['app-bootstrap'] 61 sample-portfolio files= 279 rt=['sample-portfolio'] 62 shared-contract files= 87 rt=['app-bootstrap', 'sample-portfolio'] total tracked files under registered leaves: 6747 shipped leaves: 35 build-only leaves: 27 ==== B. every AutoConfiguration.imports in the repo ==== -- src/adapter/inbound/graphql/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dev.caskeleton.adapter.inbound.graphql.autoconfigure.GraphQlRootAutoConfiguration -- src/adapter/inbound/web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dev.caskeleton.adapter.inbound.web.mvc.autoconfigure.WebMvcPlatformAutoConfiguration dev.caskeleton.adapter.inbound.web.webflux.autoconfigure.WebFluxPlatformAutoConfiguration -- src/adapter/outbound/cache-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dev.caskeleton.adapter.outbound.cache.redis.sdk.config.RedisSdkAutoConfiguration -- src/adapter/outbound/messaging/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dev.caskeleton.adapter.outbound.messaging.autoconfigure.MessagingBridgeRootAutoConfiguration -- src/adapter/outbound/persistence-mongo/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dev.caskeleton.adapter.outbound.mongo.MongoRootAutoConfiguration -- src/app-bootstrap/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dev.caskeleton.bootstrap.autoconfigure.fileserver.FileserverPlatformAutoConfiguration dev.caskeleton.bootstrap.autoconfigure.httpclient.HttpClientPlatformAutoConfiguration dev.caskeleton.bootstrap.autoconfigure.persistencejpa.PersistenceJpaRootAutoConfiguration dev.caskeleton.bootstrap.autoconfigure.messaging.DisabledMessagingSentinelAutoConfiguration dev.caskeleton.bootstrap.notification.NotificationRootAutoConfiguration dev.caskeleton.bootstrap.activation.AdapterActivationAutoConfiguration -- src/grpc/grpc-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dev.caskeleton.grpc.boot.GrpcPlatformAutoConfiguration -- src/messaging/messaging-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dev.caskeleton.messaging.autoconfigure.MessagingPlatformRootAutoConfiguration ==== C. composition root scan boundary ==== pattern = CaSkeletonApplication.AUTO_CONFIGURED_PACKAGES) }) @ConfigurationPropertiesScan( basePackages = { "dev.caskeleton.bootstrap.async", "dev.caskeleton.bootstrap.autoconfigure.fileserver", "dev.caskeleton.bootstrap.autoconfigure.httpclient", "dev.caskeleton.bootstrap.concurrency", "dev.caskeleton.bootstrap.idempotency", "dev.caskeleton.bootstrap.outbox", "dev.caskeleton.bootstrap.redis", "dev.caskeleton.bootstrap.runtime", "dev.caskeleton.bootstrap.security", "dev.caskeleton.bootstrap.settings", "dev.caskeleton.bootstrap.tracing", "dev.caskeleton.adapter.inbound.grpc", "dev.caskeleton.adapter.inbound.web", "dev.caskeleton.adapter.inbound.websocket", "dev.caskeleton.adapter.outbound.cache.redis", "dev.caskeleton.adapter.outbound.fileserver", "dev.caskeleton.adapter.outbound.objectstorage", "dev.caskeleton.application", "dev.caskeleton.domain", "dev.caskeleton.shared" }) public class CaSkeletonApplication { /** * Packages owned by an auto-configuration entry rather than by the component scan. * *
A package prefix rather than a class list: a new configuration added to an optional * capability must not become active merely because nobody remembered to exclude it. * *
The Fileserver admin package is here for a different reason: those routes belong to the * management context, and a component scan that also found them would publish the management * plane on the public connector — the exposure the separate context exists to remove. * *
The web platform's error, budget and operation packages are here for a third reason. Their
* advices and controllers need beans that only exist when the corresponding platform
* auto-configuration is active, and a component scan finds them regardless — so an all-off or
* partially configured deployment failed to start on an unsatisfied dependency rather than simply
* not installing the control. Ownership by auto-configuration is what ties a control's presence
* to its dependency's.
*/
static final String AUTO_CONFIGURED_PACKAGES =
"dev\\.caskeleton\\.bootstrap\\.autoconfigure\\..*"
+ "|dev\\.caskeleton\\.bootstrap\\.notification\\..*"
+ "|dev\\.caskeleton\\.adapter\\.inbound\\.web\\.fileserver\\.admin\\..*"
+ "|dev\\.caskeleton\\.adapter\\.outbound\\.mongo\\..*"
+ "|dev\\.caskeleton\\.adapter\\.outbound\\.messaging\\..*"
+ "|dev\\.caskeleton\\.adapter\\.outbound\\.notification\\..*"
+ "|dev\\.caskeleton\\.adapter\\.outbound\\.persistence\\..*"
+ "|dev\\.caskeleton\\.adapter\\.inbound\\.graphql\\..*"
+ "|dev\\.caskeleton\\.adapter\\.inbound\\.web\\.mvc\\.error\\..*"
+ "|dev\\.caskeleton\\.adapter\\.inbound\\.web\\.mvc\\.budget\\..*"
+ "|dev\\.caskeleton\\.adapter\\.inbound\\.web\\.mvc\\.operation\\..*"
+ "|dev\\.caskeleton\\.adapter\\.inbound\\.web\\.webflux\\.error\\..*"
+ "|dev\\.caskeleton\\.adapter\\.inbound\\.web\\.webflux\\.operation\\..*"
+ "|dev\\.caskeleton\\.messaging\\..*";
==== D. MasterSwitch constants ====
21: PERSISTENCE_JPA("ca-skeleton.persistence-jpa.enabled", "APP_PERSISTENCE_JPA_ENABLED"),
23: PERSISTENCE_MONGO("ca-skeleton.persistence-mongo.enabled", "APP_PERSISTENCE_MONGO_ENABLED"),
25: MESSAGING("app.messaging.enabled", "APP_MESSAGING_ENABLED"),
27: NOTIFICATION_PLATFORM(
30: GRAPHQL("backend.graphql.enabled", "APP_GRAPHQL_ENABLED");
==== E. every @ConditionalOnProperty master gate in main sources ====
92 @ConditionalOnProperty(
18 @ConditionalOnProperty(prefix = "app.fileserver-platform", name = "enabled", havingValue = "true"
4 @ConditionalOnProperty(prefix = "app.object-storage", name = "enabled", havingValue = "true"
2 @ConditionalOnProperty(prefix = "ca-skeleton.objectstorage", name = "backend", havingValue = "s3"
2 @ConditionalOnProperty(prefix = "app.redis", name = "enabled", havingValue = "true"
2 @ConditionalOnProperty(prefix = "app.poster-image.api", name = "mode", havingValue = "legacy"
2 @ConditionalOnProperty(name = "app.messaging.broker", havingValue = "kafka"
1 @ConditionalOnProperty(prefix = MessagingSettings.PREFIX, name = "enabled", havingValue = "true"
1 @ConditionalOnProperty(prefix = "ca-skeleton.websocket", name = "enabled", havingValue = "true"
1 @ConditionalOnProperty(prefix = "ca-skeleton.outbox", name = "enabled", havingValue = "true"
1 @ConditionalOnProperty(prefix = "backend.web.budgets", name = "enabled", havingValue = "true"
1 @ConditionalOnProperty(prefix = "backend.graphql", name = "enabled", havingValue = "true"
1 @ConditionalOnProperty(prefix = "app.poster-image.api", name = "mode", havingValue = "publication"
1 @ConditionalOnProperty(prefix = "app.messaging.admin", name = "enabled", havingValue = "true"
1 @ConditionalOnProperty(prefix = "app.messaging", name = "enabled", havingValue = "true"
1 @ConditionalOnProperty(prefix = "app.jpa-platform", name = "addons-enabled", matchIfMissing = true
1 @ConditionalOnProperty(prefix = "app.fileserver", name = "enabled", havingValue = "true"
1 @ConditionalOnProperty(prefix = "app.file-export", name = "enabled", havingValue = "true"
1 @ConditionalOnProperty(name = "spring.mail.host"
1 @ConditionalOnProperty(name = "ca-skeleton.capabilities.lease.provider", havingValue = "redis"
1 @ConditionalOnProperty(app.messaging.broker=