diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index 882ba1e..994f27b 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -36,11 +36,11 @@ Requirements for milestone v2.0. Each requirement must map to exactly one roadma ### Events -- [ ] **EVENT-01**: User can create a scheduled event attached to a tablo with title, start time, optional end time, optional description, and optional location -- [ ] **EVENT-02**: User can edit and delete tablo events -- [ ] **EVENT-03**: Tablo detail page includes an events view listing that tablo's scheduled events -- [ ] **EVENT-04**: Event validation requires an end time to be empty or after the start time -- [ ] **EVENT-05**: Event authorization follows tablo access rules so users cannot read or mutate events for inaccessible tablos +- [x] **EVENT-01**: User can create a scheduled event attached to a tablo with title, start time, optional end time, optional description, and optional location +- [x] **EVENT-02**: User can edit and delete tablo events +- [x] **EVENT-03**: Tablo detail page includes an events view listing that tablo's scheduled events +- [x] **EVENT-04**: Event validation requires an end time to be empty or after the start time +- [x] **EVENT-05**: Event authorization follows tablo access rules so users cannot read or mutate events for inaccessible tablos ### Planning @@ -97,7 +97,7 @@ Populated during roadmap creation. |-------------|-------|--------| | AUTH-08..13 | Phase 8 | Complete | | ETAPE-01..06 | Phase 9 | Pending | -| EVENT-01..05 | Phase 10 | Pending | +| EVENT-01..05 | Phase 10 | Complete | | PLAN-01..04 | Phase 11 | Pending | | CHAT-01..06 | Phase 12 | Pending | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index a014716..97d9759 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -14,7 +14,7 @@ |---|-------|------|--------------| | 8 | Social Sign-in | Google sign-in creates/links local users and issues existing Xtablo sessions; Apple sign-in is disabled | AUTH-08..13 | | 9 | Etapes | Tasks can be grouped under one-level etapes without breaking the kanban model | ETAPE-01..06 | -| 10 | 3/4 | In Progress| | +| 10 | 4/4 | Complete | 2026-05-16 | | 11 | Individual Planning | Users can view their own event agenda across tablos | PLAN-01..04 | | 12 | Native Tablo Chat | Each tablo has persisted discussion with real-time delivery and no managed chat provider | CHAT-01..06 | diff --git a/.planning/STATE.md b/.planning/STATE.md index 051473e..8933126 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -2,15 +2,15 @@ gsd_state_version: 1.0 milestone: v2.0 milestone_name: Collaboration, planning, and social sign-in -status: executing -last_updated: "2026-05-15T22:35:34.974Z" -last_activity: 2026-05-15 +status: ready_to_plan +last_updated: "2026-05-16T04:45:10.000Z" +last_activity: 2026-05-16 progress: total_phases: 5 - completed_phases: 2 + completed_phases: 3 total_plans: 13 - completed_plans: 12 - percent: 92 + completed_plans: 13 + percent: 60 --- # STATE @@ -24,15 +24,15 @@ progress: See: `.planning/PROJECT.md` (updated 2026-05-15) **Core value:** A user can sign in and run the Tablos workflow — organize work, attach files, discuss, and plan scheduled events — without a JS framework or managed chat provider. -**Current focus:** Phase 10 — events +**Current focus:** Phase 11 — individual planning ## Current Position -Phase: 10 (events) — EXECUTING -Plan: 4 of 4 -Status: Ready to execute -Last activity: 2026-05-15 -Resume file: .planning/phases/10-events/10-04-PLAN.md +Phase: 11 +Plan: Not started +Status: Ready to plan +Last activity: 2026-05-16 +Resume file: .planning/phases/11-individual-planning/11-01-PLAN.md ## Phase Status @@ -40,14 +40,15 @@ Resume file: .planning/phases/10-events/10-04-PLAN.md |---|-------|--------| | 8 | Social Sign-in | ✓ Complete | | 9 | Etapes | ◆ UAT passed; security pending | -| 10 | Events | ◆ Ready to execute | -| 11 | Individual Planning | ○ Pending | +| 10 | Events | ✓ Complete | +| 11 | Individual Planning | ○ Ready to plan | | 12 | Native Tablo Chat | ○ Pending | ## Verification Record - 2026-05-15: Phase 8 execution complete. Local verification passed with `go test ./... -count=1`; database-backed integration coverage skips unless `TEST_DATABASE_URL` is configured. - 2026-05-15: Phase 9 UAT complete. Five browser checkpoints passed after fixing the selected-etape create gap; backend verification passed with `TEST_DATABASE_URL='postgres://xtablo:xtablo@localhost:5432/xtablo?sslmode=disable' go test ./... -count=1`. +- 2026-05-16: Phase 10 execution complete. Events UAT approved; backend verification passed with `TEST_DATABASE_URL='postgres://xtablo:xtablo@localhost:5432/xtablo?sslmode=disable' go test ./... -count=1`. ## Decisions diff --git a/.planning/phases/10-events/10-04-SUMMARY.md b/.planning/phases/10-events/10-04-SUMMARY.md new file mode 100644 index 0000000..5644004 --- /dev/null +++ b/.planning/phases/10-events/10-04-SUMMARY.md @@ -0,0 +1,99 @@ +--- +phase: 10-events +plan: 04 +subsystem: events +tags: [events, regression, uat, htmx, templ] + +requires: + - phase: 10-events + provides: Plans 01-03 event schema, CRUD, calendar navigation, and user-scoped aggregation +provides: + - Final regression coverage for Events tab integration and escaping + - Full backend verification for Phase 10 + - Browser UAT approval for create, edit, delete, invalid end time, month navigation, day prefill, and past events +affects: [events, tablo-detail, planning] + +tech-stack: + added: [] + patterns: + - "Phase-level regression tests cover shell fallback, escaping, no-end-time behavior, and event ordering." + - "Manual browser UAT is recorded only after full automated backend verification passes." + +key-files: + created: [] + modified: + - backend/internal/web/handlers_events_test.go + +key-decisions: + - "No-end-time display was verified through the edit form, preserving the D-10 decision that calendar cells show titles only." + - "The Phase 10 browser checkpoint was approved after the full backend suite passed." + +patterns-established: + - "Events final verification pairs targeted regression tests with full `go test ./...` and browser UAT." + +requirements-completed: [EVENT-01, EVENT-02, EVENT-03, EVENT-04, EVENT-05] + +duration: ~10min +completed: 2026-05-16 +--- + +# Phase 10: Events Plan 04 Summary + +**Final Events regression coverage, full backend verification, and approved browser UAT** + +## Performance + +- **Duration:** ~10 min +- **Started:** 2026-05-16T04:35:00Z +- **Completed:** 2026-05-16T04:45:10Z +- **Tasks:** 3 +- **Files modified:** 1 + +## Accomplishments + +- Added final handler regression tests for full-page fallback, escaped event titles, no-end-time behavior, and same-day ordering. +- Ran full backend verification with generated code. +- Started the local app for the browser checkpoint and received user approval for Events UAT. + +## Task Commits + +Each automated task was committed atomically: + +1. **Task 1: Add final regression coverage for tab integration and escaping** - `1d760d5` (test) +2. **Task 2: Run full backend verification and fix regressions** - no code changes required +3. **Task 3: Browser UAT checkpoint for Events tab** - approved by user on 2026-05-16 + +## Files Created/Modified + +- `backend/internal/web/handlers_events_test.go` - Adds final Events regression coverage. + +## Decisions Made + +- Verified the no-end-time behavior through edit-form output rather than calendar cells, because Phase 10 explicitly keeps calendar cells title-only. +- No implementation fixes were needed after full backend verification. + +## Deviations from Plan + +None - plan executed as written. + +## Issues Encountered + +- `just dev` could not bind to ports `8080` or `8081` because they were already in use. The browser checkpoint server was started on `8082` instead, then stopped after approval. + +## Verification + +- `cd backend && TEST_DATABASE_URL='postgres://xtablo:xtablo@localhost:5432/xtablo?sslmode=disable' go test ./internal/web -run 'TestTabloDetailEventsTabFullPageFallback|TestEventContentIsEscaped|TestEventWithoutEndTimeDisplaysOnlyStartTime|TestEventsOrderedByStartTimeThenTitle' -count=1` +- `cd backend && just generate && TEST_DATABASE_URL='postgres://xtablo:xtablo@localhost:5432/xtablo?sslmode=disable' go test ./... -count=1 && git diff --check` +- Browser UAT approved by user. + +## User Setup Required + +None - no external service configuration required. + +## Next Phase Readiness + +Phase 10 is ready to close. Phase 11 can consume `ListUserEventsRange` to build individual planning across the user's tablos. + +--- +*Phase: 10-events* +*Completed: 2026-05-16* diff --git a/.planning/phases/10-events/10-VERIFICATION.md b/.planning/phases/10-events/10-VERIFICATION.md new file mode 100644 index 0000000..ab3d82c --- /dev/null +++ b/.planning/phases/10-events/10-VERIFICATION.md @@ -0,0 +1,56 @@ +--- +phase: 10-events +status: passed +verified_at: 2026-05-16T04:45:10Z +--- + +# Phase 10 Verification + +## Result + +PASS + +Phase 10 delivers tablo-owned scheduled events with create, edit, delete, month calendar browsing, day prefill, end-time validation, ownership enforcement, and a user-scoped planning query surface. + +## Requirements Coverage + +| Requirement | Status | Evidence | +|-------------|--------|----------| +| EVENT-01 | PASS | `TestEventCreateRendersTitleInCalendar`, create form fields, `CreateEvent` query | +| EVENT-02 | PASS | `TestEventEditRendersInlineForm`, `TestEventUpdateChangesCalendarPlacement`, `TestEventDeleteRemovesFromCalendarAndDatabase` | +| EVENT-03 | PASS | `TestEventsTabRendersMonthGrid`, `TestTabloDetailEventsTabFullPageFallback` | +| EVENT-04 | PASS | `TestEventCreateRejectsEndTimeBeforeOrEqualStart`, `TestEventUpdateRejectsInvalidEndTime`, DB `events_end_after_start` constraint | +| EVENT-05 | PASS | `TestEventsTabOwnershipReturns404`, `TestEventMutationOwnershipReturns404`, `TestListUserEventsRangeReturnsOnlyOwnedTablos` | + +## Automated Verification + +Passed: + +```bash +cd backend && just generate && TEST_DATABASE_URL='postgres://xtablo:xtablo@localhost:5432/xtablo?sslmode=disable' go test ./... -count=1 && git diff --check +``` + +Additional focused event checks passed across plans: + +- Create/list/ownership calendar tests +- Edit/update/delete/ownership mutation tests +- Month navigation, day prefill, overflow, submitted-value precedence, and user aggregation tests +- Final full-page fallback, escaping, no-end-time, and ordering regression tests + +## Browser UAT + +Approved by user on 2026-05-16 after running the app locally. + +Manual checkpoint covered: + +- Events tab month grid and toolbar +- Event creation from the general action +- Event creation from a day cell with date prefilled +- Event edit and calendar refresh +- Equal start/end time validation copy +- Event deletion +- Past-month visibility + +## Residual Risk + +No known Phase 10 implementation gaps. The Events UI is intentionally functional and plain; visual polish is deferred per milestone direction.