Files
GearBox/.planning/phases/14-postgresql-migration/14-DISCUSSION-LOG.md

91 lines
3.5 KiB
Markdown

# 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