# SPEC — F-002 Database foundation with module-owned schemas ## Problem Modules need PostgreSQL with clear ownership and safe migrations. No schema tooling exists yet. ## Goal Migration tooling, table naming convention per module, and a local dev database (PostgreSQL + Redis) that starts with one command. ## Non-goals - No business tables yet (they arrive with their modules). - No Redis usage beyond making the service available for future tickets. - No production deployment concerns. ## User story As a developer, I can run one command to get PostgreSQL + Redis locally, apply migrations forward and backward deterministically, and every future module knows exactly how to name and own its tables. ## Functional requirements 1. SQL migrations run through a deterministic tool, tracked in the database, ordered, idempotent per version. 2. Migrations support up and down. 3. Naming convention `_` is documented and visible in the baseline migration. 4. `docker-compose.yml` provides PostgreSQL 16 and Redis 7 with one command. 5. A typed DB access point lives in `src/infrastructure/db/` (pool creation from env, fail fast on missing config). 6. Baseline migration: enable extensions + `app_meta` key/value table (foundation-only, not business). ## Business rules - No schema change without migration. - Modules own tables by prefix; cross-module table access is forbidden (enforced later at module API level, documented now). ## Inputs - `DATABASE_URL` (runtime), `TEST_DATABASE_URL` (integration tests). ## Outputs - Migration CLI exit codes 0/1, log lines per applied/reverted migration. ## Edge cases - Re-running `migrate up` on an up-to-date DB is a no-op. - `migrate down` reverts exactly the last applied migration. - Missing `DATABASE_URL` → clear error, non-zero exit, no partial state. ## Acceptance criteria 1. Given a fresh database, When migrations run, Then schema is created and repeating the run is a no-op. 2. Given applied migrations, When down runs, Then schema rolls back cleanly. 3. Table naming convention documented and enforced (documented rule + exemplar). 4. Dev PostgreSQL and Redis start with one command. 5. `verify.sh` green. ## Dependencies - F-001 (project skeleton). ## Security implications - Dev credentials live only in docker-compose dev file and `.env.example`; never real secrets in repo. - DB user for tests should be dedicated (documented). ## SEO implications - None. ## Performance implications - Pool defaults conservative (max 10); no caching layer yet.