361 lines
12 KiB
YAML
361 lines
12 KiB
YAML
schema-version: 1
|
|
repository-snapshot-hash: sha256:4d351050ecdfa25ea9e39b22c7c5bc0c686b60aa1f9fef7a02f86ae073151f1e
|
|
project-name: ca-skeleton
|
|
languages:
|
|
- Java
|
|
frameworks:
|
|
- Spring Boot 4.0.0
|
|
- Gradle
|
|
facts:
|
|
- id: F-README-CONTRACT-001
|
|
category: readme-contract
|
|
key: required-literals
|
|
value:
|
|
- ./gradlew bootstrap
|
|
- GET /api/healthcheck
|
|
- feature-developer-experience-contract
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/DeveloperExperienceContractTest.java
|
|
line-start: 52
|
|
line-end: 64
|
|
symbol: readmeCommandsAreVerifiedAndBootstrapIsTheFirstRunEntrypoint
|
|
source-kind: executable-test-contract
|
|
- id: F-IDENTITY-001
|
|
category: adoption
|
|
key: template-identifiers
|
|
value:
|
|
gradle-root-name: ca-skeleton
|
|
java-package-root: dev.caskeleton
|
|
main-class: dev.caskeleton.bootstrap.CaSkeletonApplication
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/settings.gradle
|
|
line-start: 5
|
|
line-end: 5
|
|
source-kind: build-configuration
|
|
- path: src/app-bootstrap/src/main/java/dev/caskeleton/bootstrap/CaSkeletonApplication.java
|
|
line-start: 1
|
|
line-end: 20
|
|
symbol: CaSkeletonApplication
|
|
source-kind: implementation
|
|
- id: F-STACK-001
|
|
category: stack
|
|
key: runtime-and-framework
|
|
value:
|
|
java: 21
|
|
java-distribution: temurin-21.0.11+10
|
|
spring-boot: 4.0.0
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: .tool-versions
|
|
line-start: 1
|
|
line-end: 1
|
|
source-kind: tool-version-configuration
|
|
- path: src/build.gradle
|
|
line-start: 5
|
|
line-end: 7
|
|
source-kind: build-configuration
|
|
- path: src/build.gradle
|
|
line-start: 103
|
|
line-end: 107
|
|
source-kind: build-configuration
|
|
- id: F-MODULES-001
|
|
category: architecture
|
|
key: declared-modules
|
|
value:
|
|
core: [domain-core, application-core, shared-contract]
|
|
inbound: [web, grpc, graphql, websocket]
|
|
outbound: [persistence-jpa, support, messaging, cache-redis, notification, objectstorage, fileserver, persistence-mongo, httpclient, identifier]
|
|
composition: [app-bootstrap]
|
|
sample: [sample-portfolio]
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/settings.gradle
|
|
line-start: 5
|
|
line-end: 25
|
|
source-kind: build-configuration
|
|
- id: F-DEPENDENCY-POLICY-001
|
|
category: architecture
|
|
key: module-dependency-policy
|
|
value: Gradle의 verifyCleanArchitectureDependencies가 모든 선언 모듈을 정책에 포함시키고 허용되지 않은 프로젝트 의존성을 실패시킨다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/build.gradle
|
|
line-start: 553
|
|
line-end: 615
|
|
symbol: verifyCleanArchitectureDependencies
|
|
source-kind: executable-build-rule
|
|
- id: F-CODE-BOUNDARY-001
|
|
category: architecture
|
|
key: code-boundary-policy
|
|
value: ArchUnit 규칙이 application 패키지의 adapter·bootstrap·transport·persistence 의존과 Spring @Transactional 사용을 금지한다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/app-bootstrap/src/test/java/dev/caskeleton/bootstrap/architecture/CleanArchitectureTest.java
|
|
line-start: 197
|
|
line-end: 228
|
|
source-kind: executable-test-rule
|
|
- id: F-CORE-001
|
|
category: architecture
|
|
key: core-responsibilities
|
|
value:
|
|
domain-core: 외부 라이브러리 의존성이 없는 도메인 모듈
|
|
application-core: domain-core와 shared-contract를 의존하는 유스케이스 모듈
|
|
shared-contract: 비즈니스 개념을 두지 않는 공용 운영 계약 모듈
|
|
assertion-type: derived
|
|
confidence: high
|
|
evidence:
|
|
- path: src/domain-core/build.gradle
|
|
line-start: 1
|
|
line-end: 3
|
|
source-kind: build-configuration
|
|
- path: src/application-core/build.gradle
|
|
line-start: 1
|
|
line-end: 15
|
|
source-kind: build-configuration
|
|
- path: src/shared-contract/build.gradle
|
|
line-start: 1
|
|
line-end: 3
|
|
source-kind: build-configuration
|
|
- id: F-COMPOSITION-001
|
|
category: architecture
|
|
key: composition-root
|
|
value: app-bootstrap가 core, inbound web, 여러 outbound adapter, shared-contract를 조립하고 Spring Boot main class를 지정한다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/app-bootstrap/build.gradle
|
|
line-start: 41
|
|
line-end: 58
|
|
source-kind: build-configuration
|
|
- path: src/app-bootstrap/build.gradle
|
|
line-start: 174
|
|
line-end: 176
|
|
source-kind: build-configuration
|
|
- id: F-SAMPLE-001
|
|
category: adoption
|
|
key: sample-removal-contract
|
|
value: sample-portfolio는 일반 테스트에서만 sampleFixture로 연결되며 sampleOffTest는 같은 핵심 테스트 스위트를 샘플 없이 컴파일하고 실행한다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/app-bootstrap/build.gradle
|
|
line-start: 14
|
|
line-end: 38
|
|
source-kind: build-configuration
|
|
- path: src/app-bootstrap/build.gradle
|
|
line-start: 95
|
|
line-end: 100
|
|
source-kind: build-configuration
|
|
- path: src/app-bootstrap/build.gradle
|
|
line-start: 135
|
|
line-end: 147
|
|
symbol: sampleOffTest
|
|
source-kind: executable-build-rule
|
|
- id: F-BOOTSTRAP-001
|
|
category: command
|
|
key: local-bootstrap-contract
|
|
value: bootstrap은 전체 소스 컴파일, Docker daemon 확인, PostgreSQL 시작, 앱 빌드·시작, 샘플 격리 계약, HTTP smoke check를 순서대로 실행한다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/build.gradle
|
|
line-start: 345
|
|
line-end: 435
|
|
symbol: bootstrap
|
|
source-kind: executable-build-rule
|
|
- id: F-HEALTH-001
|
|
category: endpoint
|
|
key: bootstrap-success-signal
|
|
value: bootstrap smoke check는 http://localhost:8080/api/healthcheck의 HTTP 200 응답과 status UP을 요구한다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/build.gradle
|
|
line-start: 396
|
|
line-end: 426
|
|
symbol: bootstrapSmoke
|
|
source-kind: executable-build-rule
|
|
- path: src/adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/controller/HealthcheckController.java
|
|
line-start: 10
|
|
line-end: 17
|
|
symbol: HealthcheckController
|
|
source-kind: implementation
|
|
- id: F-CONTAINER-001
|
|
category: runtime
|
|
key: local-compose-topology
|
|
value: 로컬 Compose 구성은 app과 PostgreSQL 16 서비스를 연결하고 named volume에 데이터베이스 데이터를 보존한다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: docker-compose.yml
|
|
line-start: 26
|
|
line-end: 80
|
|
source-kind: container-configuration
|
|
- path: docker-compose.local.yml
|
|
line-start: 15
|
|
line-end: 83
|
|
source-kind: container-configuration
|
|
- id: F-LOCKS-001
|
|
category: verification
|
|
key: dependency-lock-policy
|
|
value: 각 leaf module은 모든 구성을 STRICT 모드로 잠그며 잠금 상태 검증 태스크가 실제 dependency resolution을 수행한다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/build.gradle
|
|
line-start: 109
|
|
line-end: 167
|
|
source-kind: executable-build-rule
|
|
- id: F-CHECK-001
|
|
category: verification
|
|
key: check-aggregation
|
|
value: 각 leaf module의 check는 아키텍처 의존성, 환경 키, 산출물, 타입 배치, 취약점 예외, 격리 테스트 만료, README 명령 검증을 포함한다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/build.gradle
|
|
line-start: 273
|
|
line-end: 280
|
|
source-kind: executable-build-rule
|
|
- path: src/build.gradle
|
|
line-start: 437
|
|
line-end: 550
|
|
symbol: verifyReadmeCommands
|
|
source-kind: executable-build-rule
|
|
- id: F-VERIFICATION-COMMANDS-001
|
|
category: command
|
|
key: documented-verification-tasks
|
|
value:
|
|
- ./gradlew test
|
|
- ./gradlew verifyCleanArchitectureDependencies
|
|
- ./gradlew :app-bootstrap:sampleOffTest
|
|
- ./gradlew check
|
|
assertion-type: derived
|
|
confidence: high
|
|
evidence:
|
|
- path: src/build.gradle
|
|
line-start: 247
|
|
line-end: 280
|
|
source-kind: executable-build-rule
|
|
- path: src/build.gradle
|
|
line-start: 553
|
|
line-end: 615
|
|
symbol: verifyCleanArchitectureDependencies
|
|
source-kind: executable-build-rule
|
|
- path: src/app-bootstrap/build.gradle
|
|
line-start: 135
|
|
line-end: 147
|
|
symbol: sampleOffTest
|
|
source-kind: executable-build-rule
|
|
- id: F-DOCS-001
|
|
category: documentation
|
|
key: detailed-documentation
|
|
value: 빌드 루트, 핵심 모듈, inbound·outbound adapter에 각각 README가 있고 환경·운영 계약은 docs 아래 레지스트리와 runbook으로 분리되어 있다.
|
|
assertion-type: observed
|
|
confidence: high
|
|
evidence:
|
|
- path: src/README.md
|
|
source-kind: documentation-index
|
|
- path: src/domain-core/README.md
|
|
source-kind: module-documentation
|
|
- path: src/application-core/README.md
|
|
source-kind: module-documentation
|
|
- path: src/adapter/inbound/web/README.md
|
|
source-kind: module-documentation
|
|
- path: src/adapter/outbound/persistence-jpa/README.md
|
|
source-kind: module-documentation
|
|
- path: docs/registries/env-keys.yaml
|
|
source-kind: configuration-registry
|
|
- path: docs/runbooks/template.md
|
|
source-kind: runbook-template
|
|
- id: F-TEMPLATE-LIMIT-001
|
|
category: limitation
|
|
key: adoption-decisions
|
|
value: 템플릿은 여러 inbound·outbound adapter seam과 PostgreSQL 로컬 구성을 제공하지만 실제 서비스가 사용할 adapter와 배포 환경 선택은 도입자가 결정해야 한다.
|
|
assertion-type: derived
|
|
confidence: high
|
|
evidence:
|
|
- path: src/settings.gradle
|
|
line-start: 7
|
|
line-end: 25
|
|
source-kind: build-configuration
|
|
- path: docker-compose.local.yml
|
|
line-start: 15
|
|
line-end: 83
|
|
source-kind: container-configuration
|
|
commands:
|
|
- id: CMD-001
|
|
command: ./gradlew bootstrap
|
|
cwd: src
|
|
source:
|
|
path: src/build.gradle
|
|
line-start: 431
|
|
line-end: 435
|
|
verification:
|
|
status: static-verified
|
|
method: gradle-task-discovery
|
|
level: static
|
|
- id: CMD-002
|
|
command: docker compose -f docker-compose.yml -f docker-compose.local.yml down
|
|
cwd: .
|
|
source:
|
|
path: docker-compose.local.yml
|
|
line-start: 15
|
|
line-end: 83
|
|
verification:
|
|
status: static-verified
|
|
method: compose-file-discovery
|
|
level: static
|
|
- id: CMD-003
|
|
command: ./gradlew test
|
|
cwd: src
|
|
source:
|
|
path: src/build.gradle
|
|
line-start: 247
|
|
line-end: 251
|
|
verification:
|
|
status: static-verified
|
|
method: gradle-lifecycle-task
|
|
level: static
|
|
- id: CMD-004
|
|
command: ./gradlew :app-bootstrap:sampleOffTest
|
|
cwd: src
|
|
source:
|
|
path: src/app-bootstrap/build.gradle
|
|
line-start: 135
|
|
line-end: 147
|
|
verification:
|
|
status: static-verified
|
|
method: gradle-task-discovery
|
|
level: static
|
|
- id: CMD-005
|
|
command: ./gradlew verifyCleanArchitectureDependencies
|
|
cwd: src
|
|
source:
|
|
path: src/build.gradle
|
|
line-start: 553
|
|
line-end: 615
|
|
verification:
|
|
status: static-verified
|
|
method: gradle-task-discovery
|
|
level: static
|
|
- id: CMD-006
|
|
command: ./gradlew check
|
|
cwd: src
|
|
source:
|
|
path: src/build.gradle
|
|
line-start: 273
|
|
line-end: 280
|
|
verification:
|
|
status: static-verified
|
|
method: gradle-lifecycle-task
|
|
level: static
|