wip: phase 5 web-push paused after discuss (ready to plan)
This commit is contained in:
+17
-18
@@ -1,35 +1,34 @@
|
||||
{
|
||||
"version": "1.0",
|
||||
"timestamp": "2026-06-08T01:52:24.365Z",
|
||||
"phase": "4",
|
||||
"phase_name": "Shared Lists + Live Sync",
|
||||
"phase_dir": ".planning/phases/04-shared-lists-live-sync",
|
||||
"timestamp": "2026-06-09T19:14:03.727Z",
|
||||
"phase": "5",
|
||||
"phase_name": "Web Push Notifications",
|
||||
"phase_dir": ".planning/phases/05-web-push-notifications",
|
||||
"plan": null,
|
||||
"task": null,
|
||||
"total_tasks": null,
|
||||
"status": "paused",
|
||||
"stage": "discuss-complete; entry-gate-cleared; ready-to-plan",
|
||||
"stage": "discuss-complete; ready-to-plan",
|
||||
"completed_tasks": [
|
||||
{"id": 1, "name": "discuss-phase 4 → 04-CONTEXT.md + 04-DISCUSSION-LOG.md (18 decisions D-01..D-18)", "status": "done", "commit": "05e1c9e"},
|
||||
{"id": 2, "name": "Ran SSE-over-Pangolin smoke test live — PASS (~6 min, 35 heartbeats, buffering off, no cut)", "status": "done"},
|
||||
{"id": 3, "name": "Recorded gate PASS via quick task 260607-u8o (01-HUMAN-UAT item 4 + 03-GATE2-RESULTS Part C)", "status": "done", "commit": "9ee5906"},
|
||||
{"id": 4, "name": "Saved project memory: N-member expansion principle", "status": "done"}
|
||||
{"id": 1, "name": "discuss-phase 5 → 05-CONTEXT.md + 05-DISCUSSION-LOG.md (D-01..D-14, 3 areas discussed)", "status": "done", "commit": "e74f24d"},
|
||||
{"id": 2, "name": "Recorded STATE.md session (phase 5 context gathered)", "status": "done", "commit": "3bbfbbc"}
|
||||
],
|
||||
"remaining_tasks": [
|
||||
{"id": 5, "name": "Plan Phase 4: /gsd-plan-phase 4 (reads 04-CONTEXT.md)", "status": "not_started"},
|
||||
{"id": 6, "name": "Optionally /gsd-ui-phase 4 for the lists UI design contract (UI hint: yes)", "status": "not_started"},
|
||||
{"id": 7, "name": "Execute Phase 4 plans", "status": "not_started"}
|
||||
{"id": 3, "name": "Optional: /gsd-ui-phase 5 — UI design contract (permission prompt, settings toggle, notification flow)", "status": "not_started"},
|
||||
{"id": 4, "name": "/gsd-plan-phase 5 — research + plan (reads 05-CONTEXT.md → RESEARCH.md, PLAN.md files)", "status": "not_started"},
|
||||
{"id": 5, "name": "Execute Phase 5 plans", "status": "not_started"}
|
||||
],
|
||||
"blockers": [],
|
||||
"human_actions_pending": [
|
||||
{"action": "Log out / invalidate the Authelia session whose oidc-auth cookie was pasted into the transcript during the SSE test", "context": "Cookie embeds a refresh token valid until ~2026-06-08; it is now in conversation history. Non-blocking but a security hygiene follow-up.", "blocking": false}
|
||||
{"action": "Create + share the shared Family calendar and mark is_shared=1 on the primary Fastmail account", "context": "Phase 2 D-16 deferred. Reminders (NOTIF-01) fire ONLY on shared-calendar events (D-05), so live verification of reminders needs a real shared calendar with events. Implementation/planning is not blocked — the reminder path handles the empty-shared-calendar case correctly.", "blocking": false}
|
||||
],
|
||||
"decisions": [
|
||||
{"decision": "Phase 4 entry gate (SSE-over-Pangolin, D-14/#1034) CLEARED", "rationale": "Live smoke test held a heartbeat stream open ~6 min through Pangolin with incremental delivery and no cut; buffering confirmed off", "phase": "4"},
|
||||
{"decision": "All Phase 4 implementation decisions captured in 04-CONTEXT.md (D-01..D-18)", "rationale": "Discuss-phase complete; downstream planner/researcher consume CONTEXT.md", "phase": "4"},
|
||||
{"decision": "Design member-count-agnostic (N family members, not hard-coded 2)", "rationale": "User stated future expansion; drives list_shares join table + per-list-scoped SSE fan-out", "phase": "4"}
|
||||
{"decision": "Reminders fire for SHARED Family-calendar events ONLY (not personal)", "rationale": "Native device calendar apps already remind for personal events; FamilySync must not duplicate. Deliberately narrows literal NOTIF-01 — single most consequential decision; revisit if the household expects all-event reminders.", "phase": "5"},
|
||||
{"decision": "Coalesce list-change pushes per list; events specific / list pings generic; name the actor; meaningful event-changes only (description-only edits silent)", "rationale": "Anti-spam for the chatty list source; clear attribution for a two-person household.", "phase": "5"},
|
||||
{"decision": "Contextual permission prompt after install; single master toggle (v1); silent auto re-subscribe on dead subscription", "rationale": "Low-friction for the non-technical member; per-category opt-out deferred to v1.x.", "phase": "5"},
|
||||
{"decision": "Fixed 15-min lead time; no all-day reminders", "rationale": "MVP simplicity; custom/per-event lead time is v1.x.", "phase": "5"}
|
||||
],
|
||||
"uncommitted_files": [],
|
||||
"next_action": "/clear then /gsd-plan-phase 4 (entry gate is cleared; no infra precondition remains)",
|
||||
"context_notes": "Phase 4 = app-native shared lists (MariaDB, NOT CalDAV) with SSE live co-edit sync. Discussion is done and committed; the SSE transport gate that was blocking the build is now verified and recorded. Nothing is mid-edit — clean stopping point between discuss and plan. Key locked choices for the planner: default-shared lists + private toggle via list_shares join table; checked items sink to completed section; optimistic UI + per-field PATCH last-write-wins (no CRDT); delete-wins; full-refetch-on-reconnect + capped-backoff + polling fallback; string fractional-index ordering; bottom tab bar + react-router. Open for planner: in-memory EventEmitter vs Redis pub/sub (single Node process today, ioredis not installed); new tables must use drizzle generate+migrate, NOT push."
|
||||
"next_action": "/clear then /gsd-plan-phase 5 (CONTEXT.md is the source of truth; entry gates from Ph3/Ph4 already cleared).",
|
||||
"context_notes": "Just finished discuss-phase for Phase 5 (Web Push, MVP mode, depends on Ph3+Ph4). 05-CONTEXT.md + 05-DISCUSSION-LOG.md written and committed; clean stopping point between discuss and plan, nothing mid-edit. Most consequential locked choice: D-05 shared-only reminder scope (deliberate NOTIF-01 narrowing — flagged for planner + verification). For the planner: the new push-subscription table MUST use drizzle generate+migrate (db:push unsafe on populated MariaDB); push dispatch reuses the existing in-memory listEmitter publish points (apps/api/src/lib/listEmitter.ts) + poller/outboxWorker change-detection; web-push and ioredis are NOT installed (VAPID keys need generating, no Redis — single Node process); SW is vite-plugin-pwa generateSW + autoUpdate so the push/notificationclick handler likely needs an injectManifest switch; iOS subscription health-check + event.waitUntil() + visible-notification-on-every-push are mandatory from day one (STATE.md)."
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user