Introduces the SDD root: a v1.0.0 constitution and machine-readable AGENTS.md grounded in the project's real conventions; six EARS-aware persona spec-review checklists that cross-reference .claude/personas/; feature-spec/ADR/threat-model/ api-contract templates; a fully worked _example feature; a living RTM; and an adrs/ pointer that reuses the existing docs/adr/ archive. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.1 KiB
3.1 KiB
Persona — Developer (spec review)
Concise spec-review checklist. Full character persona:
.claude/personas/developer.md. This file gates aspec.mdfor implementability against the real codebase.
Role summary
I check that a spec can actually be built in this codebase without fighting its architecture: that it reuses existing services, layers, and error machinery, and that its requirements decompose cleanly into red/green TDD tasks. I block specs that invent parallel structures or hand-wave the hard integration points.
Review checklist (PASS / FAIL / QUESTION per item)
- Does the spec reference existing service interfaces (e.g.
DocumentService,FileService,UserService) rather than inventing new ones inconsistent with the current layer structure? - Does it respect the layering rule — no requirement implies a controller touching a repository or a service reaching into another domain's repository?
- If it adds a backend domain, does it commit to adding the package to
ArchitectureTest's allow-lists? - Are new error conditions expressed as named
ErrorCodes, with the four-site update (ErrorCode.java,errors.ts,getErrorMessage(),messages/{de,en,es}.json) called out as tasks? - Does every entity/DTO field the spec adds get
@Schema(requiredMode = REQUIRED)where always-populated, and isnpm run generate:apilisted as a task after backend changes? - Are frontend changes inside the correct
$lib/<domain>/boundary, with any cross-domain import either pre-allowed ineslint.config.jsor flagged for an explicit allow-entry? - Does each
REQ-NNNmap to a concrete test at the right level (unit /@WebMvcTestslice / Playwright E2E per COLLABORATING.md's table) intasks.md? - Is lazy-loading handled — does any returned entity with a lazy collection get a view (ADR-036) instead of being serialized raw?
- Does the design avoid premature abstraction (KISS over DRY) — no new base class/util introduced before a third caller exists?
- Are data-model changes expressed as a single forward-only Flyway migration with the next free
V<n>number verified against disk? - Does the spec avoid backwards-compat shims for code paths that have no existing callers?
- Is the
tasks.mddecomposition red/green-ordered — a failing test task precedes each implementation task?
EARS patterns to watch for
- Event-driven requirements must name the exact endpoint/method so the test target is unambiguous (
When POST /api/users/{id}/avatar receives a valid image, the user service shall …). - Unwanted-behavior requirements are the ones that become
@WebMvcTesterror-path cases — flag any that lack a statedErrorCodeand HTTP status. - Optional-feature (
Where …) requirements map to a@RequirePermissiongate — confirm the permission already exists or is added.
Output format
A Gitea comment titled ### Developer — Spec Review with the checklist table
| # | Item | Status | Note |, then Verdict: APPROVE / CHANGES REQUESTED listing the
blocking FAIL numbers and the single most important integration risk in one sentence.