docs(05-02): record plan close-out in STATE and ROADMAP
- Advance to plan 3 of 6 and mark DATA-04/05/07/09 complete
This commit is contained in:
@@ -39,12 +39,12 @@ Requirements for v1 (the Płytarium port). Each maps to roadmap phases. "User" b
|
|||||||
- [x] **DATA-01**: GORM on Postgres through one shared *sql.DB (pgx stdlib) with a separate small pgx pool reserved for River's listener
|
- [x] **DATA-01**: GORM on Postgres through one shared *sql.DB (pgx stdlib) with a separate small pgx pool reserved for River's listener
|
||||||
- [x] **DATA-02**: Each plugin ships a gormigrate migration set with up and down; sets run in plugin dependency order with per-plugin version tracking; AutoMigrate is never the schema source
|
- [x] **DATA-02**: Each plugin ships a gormigrate migration set with up and down; sets run in plugin dependency order with per-plugin version tracking; AutoMigrate is never the schema source
|
||||||
- [x] **DATA-03**: Models get timestamps, soft delete, and lifecycle hooks (beforeValidate, beforeCreate, beforeSave, beforeDelete, afterDelete) that can cascade soft deletes inside a transaction
|
- [x] **DATA-03**: Models get timestamps, soft delete, and lifecycle hooks (beforeValidate, beforeCreate, beforeSave, beforeDelete, afterDelete) that can cascade soft deletes inside a transaction
|
||||||
- [ ] **DATA-04**: Relations cover belongsTo, hasOne, hasMany and belongsToMany with ordered results and dedicated pivot models carrying business columns (CollectionEditor role/granted_at/granted_by, album_artists sort_order)
|
- [x] **DATA-04**: Relations cover belongsTo, hasOne, hasMany and belongsToMany with ordered results and dedicated pivot models carrying business columns (CollectionEditor role/granted_at/granted_by, album_artists sort_order)
|
||||||
- [ ] **DATA-05**: Model rule strings (required, between, unique:table, nullable, integer, in) are validated on save via go-playground/validator with translated messages and a 422 error map shaped like Laravel's
|
- [x] **DATA-05**: Model rule strings (required, between, unique:table, nullable, integer, in) are validated on save via go-playground/validator with translated messages and a 422 error map shaped like Laravel's
|
||||||
- [x] **DATA-06**: Mass assignment goes through per-endpoint request DTOs honoring each model's fillable allow-list; serialization honors a hidden deny-list with an explicit per-call override
|
- [x] **DATA-06**: Mass assignment goes through per-endpoint request DTOs honoring each model's fillable allow-list; serialization honors a hidden deny-list with an explicit per-call override
|
||||||
- [ ] **DATA-07**: Custom casts exist for jsonable columns, money as a fixed four-decimal string, and encrypted-at-rest secrets (AES-GCM, app-key derived) that are also hidden from serialization
|
- [x] **DATA-07**: Custom casts exist for jsonable columns, money as a fixed four-decimal string, and encrypted-at-rest secrets (AES-GCM, app-key derived) that are also hidden from serialization
|
||||||
- [ ] **DATA-08**: A polymorphic file attachment table (owner type, owner id, field, disk path, sort order, public/private) backs attachOne and attachMany, stored via gocloud.dev/blob with the same public URL shape
|
- [ ] **DATA-08**: A polymorphic file attachment table (owner type, owner id, field, disk path, sort order, public/private) backs attachOne and attachMany, stored via gocloud.dev/blob with the same public URL shape
|
||||||
- [ ] **DATA-09**: All 25 Płytarium models and their squashed migration set are ported with matching table names, columns, indexes and defaults (migration count is not itself an acceptance number — squashed per plan-time decision D-01 in 05-CONTEXT.md)
|
- [x] **DATA-09**: All 25 Płytarium models and their squashed migration set are ported with matching table names, columns, indexes and defaults (migration count is not itself an acceptance number — squashed per plan-time decision D-01 in 05-CONTEXT.md)
|
||||||
- [x] **DATA-10**: Paginated responses use the exact `{data, meta{current_page, last_page, per_page, total}}` envelope without a links key
|
- [x] **DATA-10**: Paginated responses use the exact `{data, meta{current_page, last_page, per_page, total}}` envelope without a links key
|
||||||
- [ ] **DATA-11**: Other plugins can hook a model's lifecycle through the GORM callback registry and extend its schema with a companion migration
|
- [ ] **DATA-11**: Other plugins can hook a model's lifecycle through the GORM callback registry and extend its schema with a companion migration
|
||||||
|
|
||||||
@@ -175,12 +175,12 @@ Which phases cover which requirements. Updated during roadmap creation.
|
|||||||
| DATA-01 | Phase 3 | Complete |
|
| DATA-01 | Phase 3 | Complete |
|
||||||
| DATA-02 | Phase 3 | Complete |
|
| DATA-02 | Phase 3 | Complete |
|
||||||
| DATA-03 | Phase 5 | Complete |
|
| DATA-03 | Phase 5 | Complete |
|
||||||
| DATA-04 | Phase 5 | Pending |
|
| DATA-04 | Phase 5 | Complete |
|
||||||
| DATA-05 | Phase 5 | Pending |
|
| DATA-05 | Phase 5 | Complete |
|
||||||
| DATA-06 | Phase 5 | Complete |
|
| DATA-06 | Phase 5 | Complete |
|
||||||
| DATA-07 | Phase 5 | Pending |
|
| DATA-07 | Phase 5 | Complete |
|
||||||
| DATA-08 | Phase 5 | Pending |
|
| DATA-08 | Phase 5 | Pending |
|
||||||
| DATA-09 | Phase 5 | Pending |
|
| DATA-09 | Phase 5 | Complete |
|
||||||
| DATA-10 | Phase 5 | Complete |
|
| DATA-10 | Phase 5 | Complete |
|
||||||
| DATA-11 | Phase 5 | Pending |
|
| DATA-11 | Phase 5 | Pending |
|
||||||
| HTTP-01 | Phase 3 | Complete |
|
| HTTP-01 | Phase 3 | Complete |
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ Plans:
|
|||||||
|
|
||||||
**Wave 2** *(blocked on Wave 1 completion)*
|
**Wave 2** *(blocked on Wave 1 completion)*
|
||||||
|
|
||||||
- [ ] 05-02-PLAN.md — Album/Collection slice: migrations, models, casts, validation engine, write services
|
- [x] 05-02-PLAN.md — Album/Collection slice: migrations, models, casts, validation engine, write services
|
||||||
|
|
||||||
**Wave 3** *(blocked on Wave 2 completion)*
|
**Wave 3** *(blocked on Wave 2 completion)*
|
||||||
|
|
||||||
@@ -391,7 +391,7 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 →
|
|||||||
| 2. API parity harness bootstrap | 5/5 | Complete | 2026-09-17 |
|
| 2. API parity harness bootstrap | 5/5 | Complete | 2026-09-17 |
|
||||||
| 3. First vertical slice — genres end to end | 4/4 | Complete | 2026-09-17 |
|
| 3. First vertical slice — genres end to end | 4/4 | Complete | 2026-09-17 |
|
||||||
| 4. CLI scaffolding, i18n and mail | 4/4 | Complete | 2026-09-18 |
|
| 4. CLI scaffolding, i18n and mail | 4/4 | Complete | 2026-09-18 |
|
||||||
| 5. Data layer full fidelity | 1/6 | In Progress| |
|
| 5. Data layer full fidelity | 2/6 | In Progress| |
|
||||||
| 6. HTTP routing, auth groups and rate limiting | 0/TBD | Not started | - |
|
| 6. HTTP routing, auth groups and rate limiting | 0/TBD | Not started | - |
|
||||||
| 7. User plugin and authentication | 0/TBD | Not started | - |
|
| 7. User plugin and authentication | 0/TBD | Not started | - |
|
||||||
| 8. OAuth2.1 authorization server | 0/TBD | Not started | - |
|
| 8. OAuth2.1 authorization server | 0/TBD | Not started | - |
|
||||||
|
|||||||
@@ -3,15 +3,15 @@ gsd_state_version: 1.0
|
|||||||
milestone: v1.0
|
milestone: v1.0
|
||||||
milestone_name: milestone
|
milestone_name: milestone
|
||||||
status: executing
|
status: executing
|
||||||
stopped_at: Completed 05-01-PLAN.md
|
stopped_at: Completed 05-02-PLAN.md
|
||||||
last_updated: "2026-09-18T16:50:24.472Z"
|
last_updated: "2026-09-18T17:24:46.649Z"
|
||||||
last_activity: 2026-09-18
|
last_activity: 2026-09-18
|
||||||
progress:
|
progress:
|
||||||
total_phases: 15
|
total_phases: 15
|
||||||
completed_phases: 4
|
completed_phases: 4
|
||||||
total_plans: 23
|
total_plans: 23
|
||||||
completed_plans: 18
|
completed_plans: 19
|
||||||
percent: 78
|
percent: 83
|
||||||
---
|
---
|
||||||
|
|
||||||
# Project State
|
# Project State
|
||||||
@@ -26,11 +26,11 @@ See: .planning/PROJECT.md (updated 2026-09-16)
|
|||||||
## Current Position
|
## Current Position
|
||||||
|
|
||||||
Phase: 05 (data-layer-full-fidelity) — EXECUTING
|
Phase: 05 (data-layer-full-fidelity) — EXECUTING
|
||||||
Plan: 2 of 6
|
Plan: 3 of 6
|
||||||
Status: Ready to execute
|
Status: Ready to execute
|
||||||
Last activity: 2026-09-18
|
Last activity: 2026-09-18
|
||||||
|
|
||||||
Progress: [████████░░] 78%
|
Progress: [████████░░] 83%
|
||||||
|
|
||||||
## Performance Metrics
|
## Performance Metrics
|
||||||
|
|
||||||
@@ -64,6 +64,7 @@ Progress: [████████░░] 78%
|
|||||||
| Phase 04 P04-03 | 6 min | 3 tasks | 15 files |
|
| Phase 04 P04-03 | 6 min | 3 tasks | 15 files |
|
||||||
| Phase 04 P04-04 | 8 min | 3 tasks | 9 files |
|
| Phase 04 P04-04 | 8 min | 3 tasks | 9 files |
|
||||||
| Phase 05 P01 | 16 min | 4 tasks | 37 files |
|
| Phase 05 P01 | 16 min | 4 tasks | 37 files |
|
||||||
|
| Phase 05 P02 | 27 min | 3 tasks | 32 files |
|
||||||
|
|
||||||
## Accumulated Context
|
## Accumulated Context
|
||||||
|
|
||||||
@@ -124,6 +125,11 @@ Recent decisions affecting current work:
|
|||||||
- [Phase 05]: Lifecycle Has* interfaces use GORM-native signatures; WithSoftDeleteCascade does not open a new transaction — DATA-03 primitive
|
- [Phase 05]: Lifecycle Has* interfaces use GORM-native signatures; WithSoftDeleteCascade does not open a new transaction — DATA-03 primitive
|
||||||
- [Phase 05]: Paginate coerces nil data to []; RegisterJoinTable fails loud on nil db — DATA-10 and pivot-write contract
|
- [Phase 05]: Paginate coerces nil data to []; RegisterJoinTable fails loud on nil db — DATA-10 and pivot-write contract
|
||||||
- [Phase 05]: DATA-09 migration count is not an acceptance number (D-01); HTTP DTO fuzz moves to Phase 12 (D-07)
|
- [Phase 05]: DATA-09 migration count is not an acceptance number (D-01); HTTP DTO fuzz moves to Phase 12 (D-07)
|
||||||
|
- [Phase 05]: Jsonable payload field is Data, not Value, because driver.Valuer.Value() collides under go vet — go vet rejects a field and method both named Value; type Jsonable[T] T is illegal
|
||||||
|
- [Phase 05]: KeepMarketPriceSource is a gorm-ignored Album flag set by SaveAlbum when requested contains market_price_source — GORM has no Eloquent isDirty; the flag preserves stampMarketPrice source provenance
|
||||||
|
- [Phase 05]: CollectionFillFields is name+description; PHP has no CollectionWriteService — D-05 service list is a subset of Fillable excluding owner_id
|
||||||
|
- [Phase 05]: Various Artists natural key is name_key='various artists' (PHP seed), slug various-artists — seed_genre_and_various_artist_taxonomy.php uses a spaced name_key
|
||||||
|
- [Phase 05]: go-playground/validator v10.30.4 is the STACK-named rule engine behind lagoon.Validate — STACK.md already named this library; lagoon.Validate translates Laravel rule strings onto Var()
|
||||||
|
|
||||||
### Pending Todos
|
### Pending Todos
|
||||||
|
|
||||||
@@ -145,6 +151,6 @@ Items acknowledged and carried forward from previous milestone close:
|
|||||||
|
|
||||||
## Session Continuity
|
## Session Continuity
|
||||||
|
|
||||||
Last session: 2026-09-18T16:50:24.446Z
|
Last session: 2026-09-18T17:24:44.978Z
|
||||||
Stopped at: Completed 05-01-PLAN.md
|
Stopped at: Completed 05-02-PLAN.md
|
||||||
Resume file: None
|
Resume file: None
|
||||||
|
|||||||
Reference in New Issue
Block a user