Sub-scope 01 (mongo) documentation / measured-count drift (deep-analysis-standard 8.4) revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 executedAt=2026-08-29T23:04:26+00:00 cwd=/shared/codebase/clean-architecture-backend-template/src observation boundary: tracked files at this revision; build output excluded. === A. public API surface: build.gradle claim vs baseline vs measurement === $ grep -n 'production files declare a public top-level type' adapter/outbound/persistence-mongo/build.gradle 260:// 311 of this leaf's 313 production files declare a public top-level type. One jar means `public` exit=0 $ grep -n '^# types:' ../docs/architecture/mongo-api-surface.txt 8:# types: 346 exit=0 $ grep -vc '^#' ../docs/architecture/mongo-api-surface.txt 346 exit=0 $ git ls-files 'adapter/outbound/persistence-mongo/src/main/java' | grep -c '[.]java$' 351 exit=0 === B. hermetic contract test count: build.gradle claim === $ grep -n '382 hermetic contract tests' adapter/outbound/persistence-mongo/build.gradle 87:// `mongoStableContractTest`, so every one of the 382 hermetic contract tests ran twice on a fresh exit=0 $ git grep -c 'mongodb-contract' -- 'adapter/outbound/persistence-mongo/src/test' | wc -l 83 exit=0 === C. the deprecated namespace guard and what it does not cover === $ grep -n 'RETIRED_NAMESPACE\|/src/main/' adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/MongoNamespaceContractTest.java 30: private static final String RETIRED_NAMESPACE = "spring.data.mongodb."; 43: .filter(path -> withoutJavaComments(read(path)).contains(RETIRED_NAMESPACE)) 59: .filter(path -> read(path).contains(RETIRED_NAMESPACE)) 82: .filter(path -> path.toString().contains("/src/main/")) exit=0 $ git grep -n 'spring.data.mongodb' -- 'adapter/outbound/persistence-mongo/CLAUDE.md' 'adapter/outbound/persistence-mongo/README.md' adapter/outbound/persistence-mongo/CLAUDE.md:25: `spring.data.mongodb.*` settings; platform profiles come from adapter/outbound/persistence-mongo/README.md:37:spring.data.mongodb.uri=mongodb://localhost:27017/portfolio adapter/outbound/persistence-mongo/README.md:53:표준 `spring.data.mongodb.*` 설정을 사용한다. 플랫폼 profile은 exit=0 $ git grep -n 'spring.data.mongodb' -- 'adapter/outbound/persistence-mongo/src/test' adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/MongoNamespaceContractTest.java:17: *

{@code spring.data.mongodb.*} is deprecated at error level in Spring Boot 4's metadata; the adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/MongoNamespaceContractTest.java:30: private static final String RETIRED_NAMESPACE = "spring.data.mongodb."; adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/MongoPersistenceConfigTest.java:20: .withPropertyValues("spring.data.mongodb.database=portfolio"); adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/MongoPersistenceConfigTest.java:64: "ca-skeleton.persistence-mongo.enabled=true", "spring.data.mongodb.database=portfolio") exit=0 $ git grep -n 'spring.data.mongodb' -- 'adapter/outbound/persistence-mongo/src/main' adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/MongoPersistenceSettings.java:15: * spring.data.mongodb.*} is deprecated at error level in its metadata. This Javadoc named the exit=0 === D. the leaf README activation recipe vs what the composition root requires === $ sed -n '33,40p' adapter/outbound/persistence-mongo/README.md 기본값은 비활성이다. ```properties ca-skeleton.persistence-mongo.enabled=true spring.data.mongodb.uri=mongodb://localhost:27017/portfolio ``` 활성화 시 `MongoPersistenceConfig`가 Spring Boot의 Mongo client 및 data auto-configuration을 exit=0 $ sed -n '100,112p' app-bootstrap/src/main/java/dev/caskeleton/bootstrap/activation/CapabilityDependencyValidator.java + "=true."); } if (mongo && environment .getProperty( MasterSwitch.PERSISTENCE_MONGO.property().replace(".enabled", ".active-profile"), "") .isBlank()) { violations.add( MasterSwitch.PERSISTENCE_MONGO.property() + "=true needs exactly one profile; set " + "ca-skeleton.persistence-mongo.active-profile."); } exit=0 $ grep -n 'active-profile' app-bootstrap/src/main/resources/application.yml 370: active-profile: ${APP_PERSISTENCE_MONGO_ACTIVE_PROFILE:} exit=0 === E. README 'ArchUnit 10개 규칙' vs the boundary test's actual rule count === $ grep -n 'ArchUnit' adapter/outbound/persistence-mongo/README.md 73:| `api` (+ `capability`, `consistency`, `error`, `mapping`, `observation`, `profile`, `schema`) | framework 없는 core 계약. Spring/driver/BSON/Reactor import 금지 (ArchUnit) | 88:| `architecture` | fork가 자기 코드에 적용하는 `@MongoOperation` marker와 ArchUnit rule set | 96:- 패키지 간 방향은 `MongoModuleBoundaryTest`(ArchUnit) 10개 규칙이 강제한다: core-api는 framework exit=0 $ grep -c '@Test' adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoModuleBoundaryTest.java 13 exit=0 $ grep -n '@Test' adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoModuleBoundaryTest.java 113: @Test 126: @Test 154: @Test 166: @Test 180: @Test 192: @Test 204: @Test 216: @Test 228: @Test 244: @Test 256: @Test 280: @Test 310: @Test exit=0 === F. leaf-count claims in this leaf's own adaptation document === $ grep -c '"id"' config/architecture/modules.json 44 exit=0 $ git grep -n '19 leaf\|19-leaf' -- ../docs/mongodb ../docs/adr adapter/outbound/persistence-mongo ../docs/adr/ADR-MONGO-001-platform-boundary.md:61:declares exactly 19 leaf identities, so the modules became package boundaries inside ../docs/mongodb/repository-adaptation.md:18:and `verifyCleanArchitectureDependencies`) declares **exactly 19 leaf identities**. Creating 31 more adapter/outbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/architecture/MongoModuleBoundaryTest.java:16: *

This repository's fail-closed 19-leaf registry outranks the design's 19-Gradle-module layout, exit=0