# CLAUDE.md Repository guidance for the Java 21 + Spring Boot 4.0.0 Clean Architecture template. ## Prime Directive Preserve architecture before optimizing for speed. The following eight HARD-STOP conditions are a synchronized summary of the canonical local policy in `AGENTS.md`: 1. `domain-core` gains framework, transport, database, or cloud dependencies. 2. A controller directly uses a repository, Spring Data interface, or persistence entity. 3. An inbound DTO leaks into `application-core` or `domain-core`. 4. Business rules move into mappers, filters, configuration, settings, or controllers. 5. Project dependencies violate `src/config/architecture/modules.json` or the Gradle dependency gate. 6. Completion is claimed without the relevant verification or a named reason it could not run. 7. A repository/corpus conclusion is made without evidence proportional to its scope and risk. 8. Non-trivial work closes without the required LLM Wiki capture or a reported capture block. If this summary drifts from `AGENTS.md`, `AGENTS.md` wins and this summary must be resynchronized. ## Gradle policy authorities - `src/config/architecture/modules.json`: every registered leaf identity, repository-relative source paths, Gradle paths, allowed production project dependency edges, and the exact runtime memberships of both composition roots. The registry owns the leaf list and its size; no document restates the count, because a number written in prose drifts the moment a leaf is added. - `src/settings.gradle`: fail-closed registry validation, project inclusion, and directory mapping. - `src/build.gradle`: `verifyCleanArchitectureDependencies` and the other architecture-wide verification tasks. Commit policy is `human-only`: agents do not stage, commit, amend, or push implementation changes. ## Proportional workflow - Low risk: work in the owning leaf, follow its nearest guidance, and run the focused check. - Medium risk: use the relevant Superpowers design, planning, TDD, debugging, and review workflows in proportion to the affected boundaries. - High risk: make architecture and behavior decisions explicit, use staged architecture/spec/quality review, and run architecture-wide verification authorized by the task. Risk comes from change surface and runtime, security, data, or public-contract impact, not file count. ## Module families `src/config/architecture/modules.json` owns the complete leaf list. Root guidance summarizes families; the nearest `src/**/CLAUDE.md` owns local rules. `verifyDocumentedLeafCount` fails the build when a policy document states a leaf count that the registry does not agree with. | Family | Responsibility | Stable dependency direction | | --- | --- | --- | | `domain-core` | Pure domain model, invariants, events, ports | Java stdlib and registered value-only contracts | | `application-core` | Commands, use cases, application policies, transaction ports | `domain-core`, `shared-contract` | | `adapter:inbound:*` | HTTP, gRPC, GraphQL, WebSocket transport boundaries | application/domain/shared contracts | | `adapter:outbound:persistence-*` | JPA/PostgreSQL and MongoDB persistence adapters | application/domain/shared contracts as registered | | `adapter:outbound:*` | support, messaging, cache, notification, storage, file, HTTP client, identifier capabilities | application/domain/shared and registered support edge | | `shared-contract` | Skeleton-wide operational contracts | Java stdlib only | | `sample-portfolio` | Fixture/reference consumer | registered runtime leaves; never a production dependency | | `app-bootstrap` | Spring Boot entrypoint and composition root | registered runtime leaves | Never infer an individual leaf's Gradle path, allowed dependency, or test command from this table. Read its `gradle_path`, `allowed_dependencies`, and `runtime_memberships` from `src/config/architecture/modules.json`; derive the focused test from that Gradle path. ## Layer workflow For a full use case, work in this order: ```text domain-core -> application-core -> adapter:outbound:* (or persistence/identifier) -> adapter:inbound:* -> app-bootstrap wiring ``` Layer-only work stays inside that registered leaf plus its tests. If a required fix crosses a layer or writable scope, stop and request context rather than expanding silently. ## Testing - `domain-core`: pure JUnit unit tests. - `application-core`: use-case tests with hand-rolled fakes; no web or persistence context. - inbound adapters: focused transport slice/contract tests. - persistence adapters: mapping/port contract tests; use a real datastore only when vendor semantics require it. - other outbound adapters: port contract tests with fake external systems; no real network. - identifier: pure deterministic unit tests. - bootstrap/settings: binding, validation, wiring, and architecture tests. From `src/`, read the owning leaf's `gradle_path` from `config/architecture/modules.json` and run `./gradlew :test --console=plain`. Architecture-wide commands: ```bash ./gradlew verifyCleanArchitectureDependencies --console=plain ./gradlew :app-bootstrap:test --tests '*CleanArchitectureTest' --console=plain ./gradlew verifyPublicPathSnapshot --console=plain ./gradlew verifyEnvKeys --console=plain ``` Use public-path and env-key checks only when their surfaces changed. Full `test` or `check` requires the controller's workflow authorization. ## Advisory and reporting Use dependency-DAG/topological reasoning and 3–5 materially distinct alternatives when that many exist; use fewer when the option set is smaller. Judgment findings include falsifiable assumptions and counterarguments. Deterministic compile, dependency, secret, or failed-test findings use Rule → Evidence → Fix without manufactured debate. Citation verification is profile-based: none for `review-lite`, blocking citations for `review-standard`, and all material citations for `audit-deep`/`regulated`. Durable reports are triggered by high risk, at least 3 blocking findings, an architecture decision, explicit user request, or the regulated profile. Otherwise a concise result is allowed. ## LLM Wiki capture For non-trivial implementation or workflow changes, use the exact vault path and capture sequence in `AGENTS.md`. If the controller explicitly excludes wiki writes for a dispatched task, report the handoff instead of writing outside scope.