88 lines
3.6 KiB
Markdown
88 lines
3.6 KiB
Markdown
---
|
|
gsd_state_version: 1.0
|
|
milestone: v1.0
|
|
milestone_name: milestone
|
|
status: Ready to plan
|
|
stopped_at: Completed 02-02-PLAN.md (Server struct refactor, test isolation with NewTestServer)
|
|
last_updated: "2026-03-24T07:42:42.222Z"
|
|
progress:
|
|
total_phases: 4
|
|
completed_phases: 2
|
|
total_plans: 4
|
|
completed_plans: 4
|
|
---
|
|
|
|
# Project State
|
|
|
|
## Project Reference
|
|
|
|
See: .planning/PROJECT.md (updated 2026-03-23)
|
|
|
|
**Core value:** Reliable, persistent visibility into which services need updating — data never disappears, and the dashboard is the one place you trust to show the full picture.
|
|
**Current focus:** Phase 02 — backend-refactor
|
|
|
|
## Current Position
|
|
|
|
Phase: 3
|
|
Plan: Not started
|
|
|
|
## Performance Metrics
|
|
|
|
**Velocity:**
|
|
|
|
- Total plans completed: 0
|
|
- Average duration: —
|
|
- Total execution time: —
|
|
|
|
**By Phase:**
|
|
|
|
| Phase | Plans | Total | Avg/Plan |
|
|
|-------|-------|-------|----------|
|
|
| - | - | - | - |
|
|
|
|
**Recent Trend:**
|
|
|
|
- Last 5 plans: —
|
|
- Trend: —
|
|
|
|
*Updated after each plan completion*
|
|
| Phase 01 P01 | 2 | 2 tasks | 2 files |
|
|
| Phase 01-data-integrity P02 | 7 | 2 tasks | 2 files |
|
|
| Phase 02-backend-refactor P01 | 7min | 2 tasks | 7 files |
|
|
| Phase 02-backend-refactor P02 | 3min | 2 tasks | 4 files |
|
|
|
|
## Accumulated Context
|
|
|
|
### Decisions
|
|
|
|
Decisions are logged in PROJECT.md Key Decisions table.
|
|
Recent decisions affecting current work:
|
|
|
|
- Fix SQLite bugs before any other work — data trust is the #1 priority; bug-fix tests become the regression suite for the refactor
|
|
- Backend refactor must be behavior-neutral — all existing tests must pass before PostgreSQL is introduced
|
|
- No ORM or query builder — raw SQL per store implementation; 8 operations across 3 tables is too small to justify a dependency
|
|
- `DATABASE_URL` present activates PostgreSQL; absent falls back to SQLite with `DB_PATH` — no separate `DB_DRIVER` variable
|
|
- [Phase 01]: Use named-column UPSERT (ON CONFLICT DO UPDATE) to preserve tag_assignments child rows on re-insert
|
|
- [Phase 01]: Enable PRAGMA foreign_keys = ON in InitDB() before DDL to activate ON DELETE CASCADE for tag deletion
|
|
- [Phase 01-data-integrity]: Use MaxBytesReader + errors.As(*http.MaxBytesError) per-handler (not middleware) for request body size limiting — consistent with no-middleware architecture
|
|
- [Phase 01-data-integrity]: Oversized body tests need valid JSON prefix so decoder reads past 1MB limit; all-x bytes fail at byte 1 before MaxBytesReader triggers
|
|
- [Phase 02-backend-refactor]: Store interface with 9 methods is the persistence abstraction; SQLiteStore holds *sql.DB and sync.Mutex as struct fields (not package globals)
|
|
- [Phase 02-backend-refactor]: golang-migrate v4.19.1 database/sqlite sub-package confirmed to use modernc.org/sqlite (no CGO); single 0001 baseline migration uses CREATE TABLE IF NOT EXISTS for backward compatibility
|
|
- [Phase 02-backend-refactor]: Option B for test store access: internal helpers in export_test.go (TestUpsertEvent, TestGetUpdatesMap) instead of exported Store() accessor - keeps store field unexported
|
|
- [Phase 02-backend-refactor]: NewTestServer pattern: each test gets its own in-memory SQLite DB (RunMigrations + NewSQLiteStore + NewServer) - eliminates shared global state between tests
|
|
|
|
### Pending Todos
|
|
|
|
None yet.
|
|
|
|
### Blockers/Concerns
|
|
|
|
- Phase 3: Verify `pgx/v5/stdlib` import path against pkg.go.dev before writing PostgreSQL query strings
|
|
- Phase 3: Re-confirm `golang-migrate` v4.19.1 `database/sqlite` sub-package uses `modernc.org/sqlite` (not `mattn/go-sqlite3`) at implementation time
|
|
|
|
## Session Continuity
|
|
|
|
Last session: 2026-03-24T07:39:15.370Z
|
|
Stopped at: Completed 02-02-PLAN.md (Server struct refactor, test isolation with NewTestServer)
|
|
Resume file: None
|