# Phase 14: PostgreSQL Migration - Discussion Log

> **Audit trail only.** Do not use as input to planning, research, or execution agents.
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.

**Date:** 2026-04-04
**Phase:** 14-postgresql-migration
**Areas discussed:** Migration strategy, Data migration script, Test infrastructure, Docker Compose layout
**Mode:** --auto (all decisions auto-selected as recommended defaults)

---

## Migration Strategy

| Option | Description | Selected |
|--------|-------------|----------|
| Clean schema rewrite | Rewrite schema.ts using drizzle-orm/pg-core with fresh migration history | ✓ |
| Convert existing migrations | Transform SQLite migrations to Postgres equivalents | |
| Dual-dialect schema | Maintain both SQLite and Postgres schema definitions | |

**User's choice:** [auto] Clean schema rewrite (recommended default)
**Notes:** SQLite and Postgres dialects differ enough (type system, auto-increment vs serial, pragma vs native features) that converting migrations is error-prone. Fresh start is cleaner.

| Option | Description | Selected |
|--------|-------------|----------|
| Fresh Postgres migration history | New directory, archive SQLite migrations | ✓ |
| Convert SQLite migrations | Rewrite each .sql file for Postgres | |

**User's choice:** [auto] Fresh Postgres migration history (recommended default)
**Notes:** 10 existing SQLite migrations would need manual conversion. Starting fresh avoids dialect translation bugs.

---

## Data Migration Script

| Option | Description | Selected |
|--------|-------------|----------|
| Standalone TypeScript script | Reads SQLite, writes Postgres, one-time use | ✓ |
| Drizzle migration | Built into the migration pipeline | |
| SQL dump + import | pg_dump-style approach | |

**User's choice:** [auto] Standalone TypeScript script (recommended default)
**Notes:** One-time operation that doesn't belong in the migration pipeline. Script can handle type conversions explicitly.

---

## Test Infrastructure

| Option | Description | Selected |
|--------|-------------|----------|
| Per-test PGlite instance | Fresh database per test, migrations applied each time | ✓ |
| Shared PGlite with transaction rollback | One instance, wrap each test in a rolled-back transaction | |
| Shared PGlite with cleanup | One instance, truncate tables between tests | |

**User's choice:** [auto] Per-test PGlite instance (recommended default)
**Notes:** Matches current in-memory SQLite pattern. Avoids test pollution. PGlite is lightweight enough for per-test instances.

---

## Docker Compose Layout

| Option | Description | Selected |
|--------|-------------|----------|
| Separate dev compose file | docker-compose.dev.yml with Postgres for development | ✓ |
| Single compose with profiles | Use Docker Compose profiles for dev vs prod | |
| Extend existing compose | Add Postgres to the single docker-compose.yml | |

**User's choice:** [auto] Separate dev compose file (recommended default)
**Notes:** Separation of concerns. Production compose will also need Postgres eventually but with different configuration.

| Option | Description | Selected |
|--------|-------------|----------|
| PostgreSQL 16 | Latest stable release | ✓ |
| PostgreSQL 15 | Previous stable | |

**User's choice:** [auto] PostgreSQL 16 (recommended default)

---

## Claude's Discretion

- Drizzle Postgres driver choice (node-postgres vs postgres-js)
- PGlite configuration details
- Column type mapping specifics
- Migration script error handling
- Test driver choice for PGlite

## Deferred Ideas

None
