From 4fb9f142dfcc10079a241962bddc31bb05066e03 Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Sun, 18 Oct 2026 23:16:08 +0200 Subject: [PATCH] =?UTF-8?q?docs(roadmap):=20reorder=20=E2=80=94=20demo=20a?= =?UTF-8?q?t=2020,=20P=C5=82ytarium=20cutover=2020=E2=86=9230,=20chat=20po?= =?UTF-8?q?lish=2019.2=E2=86=9231?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New Phase 20 is a public demo instance on sm-demo-app with every shared plugin. Phases 21-29 stay off the roadmap until their goals firm up. The cutover (closing v1.0) moves to 30; WavePath work starts at 31 with the former 19.2, Horoskopia follows at 36-40. Seeds, notes and the 30-CONTEXT now point at the new numbers. --- .planning/ROADMAP.md | 79 ++++++++++++------- .planning/STATE.md | 22 +++--- ...8-roadmap-reorder-demo-release-wavepath.md | 32 ++++++++ .planning/notes/core-plugin-port-inventory.md | 2 + .../notes/wavepath-framework-asks-division.md | 8 +- .../19.6-CONTEXT.md | 2 +- .../.gitkeep | 0 .../30-CONTEXT.md} | 8 +- .../30-DISCUSSION-LOG.md} | 4 +- .../.gitkeep | 0 .../seeds/SEED-261007-0tb-wavepath-port.md | 4 +- .../seeds/SEED-261007-j2b-horoskopia-port.md | 4 +- 12 files changed, 112 insertions(+), 53 deletions(-) create mode 100644 .planning/notes/2026-10-18-roadmap-reorder-demo-release-wavepath.md create mode 100644 .planning/phases/20-demo-instance-with-every-shared-plugin/.gitkeep rename .planning/phases/{20-cutover/20-CONTEXT.md => 30-cutover/30-CONTEXT.md} (96%) rename .planning/phases/{20-cutover/20-DISCUSSION-LOG.md => 30-cutover/30-DISCUSSION-LOG.md} (98%) rename .planning/phases/{19.2-chat-polish-against-wavepath-clients => 31-chat-polish-against-wavepath-clients}/.gitkeep (100%) diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 7f66f82c..0e438b11 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -4,6 +4,8 @@ v1 ports the Płytarium (fonoteka) headless PHP backend to a single Go binary without vue-fonoteka-app or fonoteka-mcp noticing. The journey starts with the smallest possible kernel plus a day-one parity harness, proves the whole stack on one real endpoint (`GET /_fonoteka/api/v1/genres`) before any further kernel design, then broadens outward: full data-layer fidelity, the three-auth-group HTTP layer, the user plugin, OAuth2.1 for MCP/ChatGPT, the admin schema pipeline and its Vue SPA, jobs/realtime/search infrastructure, the 154-route API surface (split into two delivery slices), domain jobs and external integrations, a local Nuxt-on-Go dress rehearsal, the Journal plugin and a first blog (grzybyfunkcjonalne.pl) on reusable views, and finally production cutover of Płytarium where the parity harness is green on every manifest route and both real clients run unchanged against the Go backend. +Reordered 2026-10-18 (`.planning/notes/2026-10-18-roadmap-reorder-demo-release-wavepath.md`): the remaining 19.x phases polish the framework and shared plugins, Phase 20 is a public demo instance with every shared plugin, Phases 21 to 29 are added as their goals firm up (security, more plugin ports, backend fixes), and the Płytarium cutover at Phase 30 closes v1. The WavePath work starts at Phase 31 (formerly 19.2). + ## Phases **Phase Numbering:** @@ -34,13 +36,14 @@ Decimal phases appear between their surrounding integers in numeric order. - [x] **Phase 18: Payment Gateway** - Port Golem15.PaymentGateway and its Stripe operator, with Horoskopia as the acceptance consumer (completed 2026-10-14) - [x] **Phase 19: Chat and ChatChannels** - Port Golem15.Chat and Golem15.ChatChannels on lighthouse (completed 2026-10-17) - [x] **Phase 19.1: Chat satellites** - Port chatbots, chatvideo, forum, herald and userfriends (completed 2026-10-18) -- [ ] **Phase 19.2: Chat polish against WavePath clients** - Replay WavePath's chat traffic through `tide` against the ported chat plugins until green - [ ] **Phase 19.3: Framework transport and infrastructure for WavePath** - Cookie refresh, credentialed CORS, cache and Redis rate limits, S3 option, OpenAPI page, Turnstile - [ ] **Phase 19.4: OIDC provider on wristband** - Discovery, JWKS with key rotation, id_token, userinfo, consent and pairwise subjects - [ ] **Phase 19.5: Social login in sm-user-plugin** - Google and Facebook login with the SPA one-time-code handoff - [ ] **Phase 19.6: Two-factor auth and device flow in sm-user-plugin** - TOTP, WebAuthn, email and recovery codes, trusted devices, device authorization - [ ] **Phase 19.7: Generic MCP module** - Opt-in MCP endpoint, plugin-declared tools filtered by permissions, one connector per person via OAuth and a verified account link -- [ ] **Phase 20: Płytarium cutover** - Parity harness green, both real clients run unchanged in production +- [ ] **Phase 20: Demo instance with every shared plugin** - Public showcase site on sm-demo-app: chat, video calls, presentations, journal and the rest; backend by request +- [ ] **Phase 30: Płytarium cutover** - Parity harness green, both real clients run unchanged in production +- [ ] **Phase 31: Chat polish against WavePath clients** - Replay WavePath's chat traffic through `tide` against the ported chat plugins until green ## Phase Details @@ -652,7 +655,7 @@ Plans: **Requirements**: TBD **Depends on:** Phase 12 (user groups tables and the `Groups` relation from 12-01) **Repos:** `sm-user-plugin` (mounted in fonoteka.go at `plugins/golem15/user`); `summercms.go` only if the admin pipeline is missing a feature the screens need -**Ordering:** independent of Phase 13; must land before Phase 20 (Płytarium cutover) +**Ordering:** independent of Phase 13; must land before Phase 30 (Płytarium cutover) **Success Criteria** (what must be TRUE): 1. Users, User Groups and Organisations each have a list (columns, search, filters as in the PHP `config_filter.yaml`) and a create/update form ported from the PHP model YAML, reachable from admin navigation and gated by backend permissions. @@ -1250,25 +1253,6 @@ Plans: **Wave 3** *(blocked on Waves 1–2)* - [x] 19.1-06-PLAN.md — PHP method maps, goldens, scripts/check-phase19.1.sh -### Phase 19.2: Chat polish against WavePath clients (INSERTED) - -**Goal:** The ported chat and chat satellites carry WavePath's chat traffic exactly as PHP does. The chat routes that WavePath's clients call are recorded with `tide`, replayed against the Go plugins and fixed until green, so that chat, the core feature of WavePath, is not the risk in the WavePath migration. -**Mode:** mvp -**Depends on:** Phase 19, Phase 19.1 -**Repos:** `sm-chat-plugin`, `sm-chatchannels-plugin` and the satellite repos; `summercms.go` only for `lighthouse` or `tide` gaps -**Requirements**: TBD -**Success Criteria** (what must be TRUE): - - 1. A `tide` corpus of the chat, channel, thread, video-room and push routes, recorded from the PHP backend through `vue-wavepath-app`, `wavepath-mcp` and `hubot-wavepath`, replays green against the Go plugins. - 2. Realtime events on the `chat`, `video` and `presence:` namespaces match the PHP broadcasts recorded by the `tide` Centrifugo recorder. - 3. Behaviour stays neutral to the other consumers of these plugins (QuestStream, Horoskopia, Portal). Framework READMEs and docs still name no application. - 4. The new code has unit tests, delivered in the phase's last plan. - -**Plans:** 0 plans - -Plans: -- [ ] TBD (run /msd-plan-phase 19.2 to break down) - ### Phase 19.3: Framework transport and infrastructure for WavePath (INSERTED) **Goal:** The framework has the transport and infrastructure pieces a multi-client, multi-instance application needs: JWT cookie refresh across subdomains, credentialed CORS, a cache module with a Redis-backed rate-limit store, an S3 blob option, an OpenAPI page and Turnstile verification. @@ -1377,11 +1361,30 @@ Plans: Plans: - [ ] TBD (run /msd-plan-phase 19.7 to break down) -### Phase 20: Płytarium cutover +### Phase 20: Demo instance with every shared plugin + +**Goal:** `sm-demo-app` runs every shared Golem15 plugin collected so far in one binary, and its public Nuxt site shows them working: chat and channels with realtime, video calls, presentations, quizzes, journal, FAQ, subscriptions and the rest. The admin backend is not public; the site carries a call to action to contact Golem15 for a backend tour. +**Mode:** mvp +**Depends on:** Phase 19, Phase 19.1, Phases 19.3 to 19.7 +**Repos:** `sm-demo-app` and its `vue-demo-app`; the shared plugin repos and `summercms.go` only for gaps the demo exposes +**Requirements**: TBD +**Success Criteria** (what must be TRUE): + + 1. `sm-demo-app` builds with every shared plugin, including `chat`, `chatchannels`, `chatvideo`, `chatbots`, `forum`, `herald` and `userfriends`, and `demo:seed` fills each one with showcase data. + 2. The public Nuxt site has pages that show chat and channels with realtime updates, video calls, presentations, the journal and the other plugins working through the shared layers. + 3. The demo is deployed publicly: the frontend is open, `/backend` is not reachable from the public internet, and the site carries a "want to see the backend? contact Golem15" call to action. + 4. The new code has unit tests, delivered in the phase's last plan. + +**Plans:** 0 plans + +Plans: +- [ ] TBD (run /msd-plan-phase 20 to break down) + +### Phase 30: Płytarium cutover **Goal**: The parity harness is green on every manifest route and `vue-fonoteka-app` and `fonoteka-mcp` run unchanged against the Go backend in daily use in production — the Płytarium definition of done. **Mode:** mvp -**Depends on**: Phase 2, Phase 8, Phase 9, Phase 10, Phase 12, Phase 12.1, Phase 13, Phase 14, Phase 14.1, Phase 14.2, Phase 15, Phase 16, Phases 19 to 19.6 (decided 2026-10-11: the 19.x WavePath readiness work lands before the cutover) +**Depends on**: Phase 2, Phase 8, Phase 9, Phase 10, Phase 12, Phase 12.1, Phase 13, Phase 14, Phase 14.1, Phase 14.2, Phase 15, Phase 16, Phase 19, Phase 19.1, Phases 19.3 to 19.7, Phase 20 (this phase was Phase 20 until 2026-10-18. The 19.x readiness work still lands first, as decided 2026-10-11; chat polish against WavePath moved out to Phase 31) **Repos:** fonoteka.go, summercms.go **Requirements**: API-09, QA-05 **Success Criteria** (what must be TRUE): @@ -1393,10 +1396,29 @@ Plans: **Plans**: TBD +### Phase 31: Chat polish against WavePath clients + +**Goal:** The ported chat and chat satellites carry WavePath's chat traffic exactly as PHP does. The chat routes that WavePath's clients call are recorded with `tide`, replayed against the Go plugins and fixed until green, so that chat, the core feature of WavePath, is not the risk in the WavePath migration. +**Mode:** mvp +**Depends on:** Phase 19, Phase 19.1, Phase 30 (formerly Phase 19.2; moved 2026-10-18 so the `tide` recording is made just before the WavePath migration, while the PHP routes still move) +**Repos:** `sm-chat-plugin`, `sm-chatchannels-plugin` and the satellite repos; `summercms.go` only for `lighthouse` or `tide` gaps +**Requirements**: TBD +**Success Criteria** (what must be TRUE): + + 1. A `tide` corpus of the chat, channel, thread, video-room and push routes, recorded from the PHP backend through `vue-wavepath-app`, `wavepath-mcp` and `hubot-wavepath`, replays green against the Go plugins. + 2. Realtime events on the `chat`, `video` and `presence:` namespaces match the PHP broadcasts recorded by the `tide` Centrifugo recorder. + 3. Behaviour stays neutral to the other consumers of these plugins (QuestStream, Horoskopia, Portal). Framework READMEs and docs still name no application. + 4. The new code has unit tests, delivered in the phase's last plan. + +**Plans:** 0 plans + +Plans: +- [ ] TBD (run /msd-plan-phase 31 to break down) + ## Progress **Execution Order:** -Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10 → 11 → 12 → 13 → 14 → 14.1 → 14.2 → 14.2.1 → 14.3 → 15 → 16 → 17 → 18 → 18.1 → 19 → 19.1 → 19.2 → 19.3 → 19.4 → 19.5 → 19.6 → 19.7 → 20 +Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10 → 11 → 12 → 13 → 14 → 14.1 → 14.2 → 14.2.1 → 14.3 → 15 → 16 → 17 → 18 → 18.1 → 19 → 19.1 → 19.3 → 19.4 → 19.5 → 19.6 → 19.7 → 20 → (21 to 29, added as planned) → 30 → 31 (Phase 2 depends on Phase 1's command kernel; the two are no longer parallel.) | Phase | Plans Complete | Status | Completed | @@ -1435,13 +1457,14 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → | 18.1. Payment Gateway Subscriptions | 9/9 | Complete | 2026-10-16 | | 19. Chat and ChatChannels | 7/7 | Complete | 2026-10-17 | | 19.1. Chat satellites | 6/6 | Complete | 2026-10-18 | -| 19.2. Chat polish against WavePath clients | 0/TBD | Not started | - | | 19.3. Framework transport and infrastructure for WavePath | 6/6 | In Progress| | | 19.4. OIDC provider on wristband | 0/TBD | Not started | - | | 19.5. Social login in sm-user-plugin | 0/TBD | Not started | - | | 19.6. Two-factor auth and device flow in sm-user-plugin | 0/TBD | Not started | - | | 19.7. Generic MCP module | 0/TBD | Not started | - | -| 20. Płytarium cutover | 0/TBD | Not started | - | +| 20. Demo instance with every shared plugin | 0/TBD | Not started | - | +| 30. Płytarium cutover | 0/TBD | Not started | - | +| 31. Chat polish against WavePath clients | 0/TBD | Not started | - | ## Backlog @@ -1449,7 +1472,7 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → **Goal:** Visitors to summercms.io subscribe for updates through the initial Go version of the Golem15 Newsletter plugin, which confirms each email by double opt-in. The signup widget is added to the Phase 11.2 landing page, and the site gains Polish alongside English. **Requirements**: TBD -**Deferred:** 2026-10-02, formerly Phase 11.3. It is one more Golem15 plugin port; Journal is Phase 15 and Płytarium cutover is Phase 20. Before planning, re-check what 11.2 shipped since: the landing-page design has no signup slot, nginx on rome blocks `/backend` and non-GET methods, and rome has no mail relay configured. +**Deferred:** 2026-10-02, formerly Phase 11.3. It is one more Golem15 plugin port; Journal is Phase 15 and Płytarium cutover is Phase 30 (Phase 20 when this was written). Before planning, re-check what 11.2 shipped since: the landing-page design has no signup slot, nginx on rome blocks `/backend` and non-GET methods, and rome has no mail relay configured. **Repos:** `sm-newsletter-plugin` (new, under `git.golem15.com/golem15/`, Go package `newsletter`), plus changes to the Phase 11.2 repos (`vue-summercmsio-app` for the widget and Polish locale, `sm-summercmsio-app` to wire the plugin). `summercms.go` changes only if a framework feature is missing. **Port source:** Golem15.Newsletter, `github.com/golem15com/wn-newsletter-plugin`, checked out at `/media/nvme/dev/golem15/horoskopia.eu/plugins/golem15/newsletter`. The PHP plugin is work in progress. Its audience comes from registered users (it requires `Golem15.User`), and its only public routes are unsubscribe. It has no public subscriber model or signup widget, so this phase adds those in Go. The PHP original is not changed. **Success Criteria** (what must be TRUE): diff --git a/.planning/STATE.md b/.planning/STATE.md index 37cc9d43..da3f1bac 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -1,20 +1,19 @@ --- msd_state_version: "1.0" milestone: v1.0 -current_phase: "19.2" -current_phase_name: Chat polish against WavePath clients +current_phase: "19.4" +current_phase_name: OIDC provider on wristband status: planning -stopped_at: Phase 19.1 complete, ready to plan Phase 19.2 -last_updated: "2026-10-18T17:25:43.450Z" +stopped_at: Roadmap reordered 2026-10-18; ready to plan Phase 19.4 +last_updated: "2026-10-18T21:15:16.568Z" last_activity: 2026-10-18 -last_activity_desc: Phase 19.1 complete, transitioned to Phase 19.2 -state_head: f1ff2f940bc60281ec0f58cb07978516df7c1a8f +last_activity_desc: "Roadmap reordered: demo at 20, cutover 20→30, chat polish 19.2→31" +state_head: 6aaaf59f4381607e0c93d62d264aa7554a608e91 progress: - total_phases: 41 + total_phases: 42 completed_phases: 34 total_plans: 204 completed_plans: 204 - percent: 83 gsd_state_version: "1.0" milestone_name: milestone --- @@ -30,10 +29,10 @@ See: .planning/PROJECT.md (updated 2026-10-12) ## Current Position -Phase: 19.2 — Chat polish against WavePath clients +Phase: 19.4 — OIDC provider on wristband Plan: Not started Status: Ready to plan -Last activity: 2026-10-18 — Phase 19.1 complete, transitioned to Phase 19.2 +Last activity: 2026-10-18 — Roadmap reordered: demo at 20, cutover 20→30, chat polish 19.2→31 Progress: [████████░░] 83% @@ -291,6 +290,7 @@ Progress: [████████░░] 83% - Phase 19.5 inserted after Phase 19.4: Social login in sm-user-plugin (WavePath framework asks, 2026-10-11) - Phase 19.6 inserted after Phase 19.5: Two-factor auth and device flow in sm-user-plugin (WavePath framework asks, 2026-10-11) - Phase 19.7 inserted after Phase 19.6: Generic MCP module: opt-in endpoint, plugin-declared tools, one connector per person (from /msd-explore 2026-10-17) +- Phase 20 reordered: Roadmap reordered (/msd-explore 2026-10-18): new Phase 20 Demo instance with every shared plugin; Płytarium cutover moved 20 → 30; Chat polish against WavePath clients moved 19.2 → 31; 21–29 added as their goals firm up ### Decisions @@ -959,5 +959,5 @@ Items acknowledged and carried forward from previous milestone close: ## Session Continuity Last session: 2026-10-18T14:01:53.356Z -Stopped at: Phase 19.1 complete, ready to plan Phase 19.2 +Stopped at: Roadmap reordered 2026-10-18; ready to plan Phase 19.4 Resume file: None diff --git a/.planning/notes/2026-10-18-roadmap-reorder-demo-release-wavepath.md b/.planning/notes/2026-10-18-roadmap-reorder-demo-release-wavepath.md new file mode 100644 index 00000000..8ff68fd9 --- /dev/null +++ b/.planning/notes/2026-10-18-roadmap-reorder-demo-release-wavepath.md @@ -0,0 +1,32 @@ +--- +title: Roadmap reorder — demo at 20, Płytarium release at 30, WavePath from 31, Horoskopia from 36 +date: 2026-10-18 +context: /msd-explore after Phase 19.1 closed. Revises the phase numbers set in `wavepath-framework-asks-division.md` (2026-10-11) and the port order in `core-plugin-port-inventory.md` (2026-10-07). +--- + +# Roadmap reorder: demo at 20, Płytarium release at 30, WavePath from 31, Horoskopia from 36 + +## Decisions + +- **The remaining 19.x phases come first** (19.3 verification, then 19.4 to 19.7). They polish the framework and the shared plugins before anything is shown or released. +- **Phase 20 is a demo instance with every shared plugin.** It builds on the existing `sm-demo-app` (14 plugins, `demo:seed`, Nuxt site `vue-demo-app`, no deployment yet). The phase adds the chat family (`chat`, `chatchannels`, `chatvideo`, `chatbots`, `forum`, `herald`, `userfriends`), frontend pages that show chat, video calls, presentations, journal and the rest, and a public deployment. + - The frontend is public. The admin backend is not; the site carries a "want to see the backend? contact Golem15" call to action. +- **Phases 21 to 29 are not on the roadmap.** Security phases, more plugin ports and backend fixes are expected over the next 2 to 3 weeks, and each is added when its goal is clear. `phase add` numbers a new phase as the highest number plus one, so these need an explicit id: `msd_run phase add "" --id 21` (then move the section to sit between 20 and 30 in ROADMAP.md). +- **Phase 30 is the Płytarium cutover** (was Phase 20; its CONTEXT and decisions D-01 to D-13 moved unchanged to `30-cutover/`). It closes milestone v1.0. +- **Phase 31 opens the WavePath work** (was 19.2, chat polish against WavePath's clients). Recording the `tide` corpus right before the migration is worth more than recording now, because WavePath's PHP routes are not frozen. +- **Phases 31 to 35: WavePath** off WinterCMS onto Go, and WavePath's community off Mattermost. Target: this winter. Expected to be a v1.1 milestone. +- **Phases 36 to 40: Horoskopia-driven development.** Expected to be a v1.2 milestone. WavePath before Horoskopia matches the 2026-10-11 change to the seeds. + +## Milestones + +All phases currently sit in the v1.0 roadmap. When v1.0 closes at Phase 30, Phase 31 moves into the next milestone with `/msd-new-milestone`. + +## Pointers for later + +- **Mattermost exit (31 to 35):** WavePath's own roadmap has the PHP-side pattern, milestone v1.13 "Mattermost Import" (Phases 99 to 103 in `/media/nvme/dev/jz/wavepath.org/.planning/`). It is a generic `wn-mattermostimport-plugin`: a resumable, re-runnable import with delta runs and a ledger, which never writes to the Mattermost source. Host seams live in the app plugin. Not scoped here. +- **WavePath `import:winter` stress cases** stay in `wavepath-framework-asks-division.md` and apply to the Phase 30 runner. + +## Open for the Phase 20 discussion + +- Can visitors sign up and use chat and video calls themselves, or do they browse seeded content through prepared demo accounts? This decides how much abuse protection is needed (Turnstile from 19.3, rate limits), whether LiveKit usage needs caps, and whether the demo data is reset on a schedule. +- Where the demo is hosted and under which domain. diff --git a/.planning/notes/core-plugin-port-inventory.md b/.planning/notes/core-plugin-port-inventory.md index c6cec504..1f6648e6 100644 --- a/.planning/notes/core-plugin-port-inventory.md +++ b/.planning/notes/core-plugin-port-inventory.md @@ -56,6 +56,8 @@ Third-party plugins in many projects: `winter/location` is in 19, `winter/blocks 5. **Phase 20, Płytarium cutover.** 6. **After Phase 20:** the Horoskopia port comes first, then the Wavepath port. Neither is planned yet. This stretch is about preparing the shared plugins, not migrating apps, and a stabilization phase may come first. See the seeds for both ports. +**Superseded 2026-10-18** (`.planning/notes/2026-10-18-roadmap-reorder-demo-release-wavepath.md`): Phase 20 is a demo instance with every shared plugin, Phases 21 to 29 are added as needed, the Płytarium cutover is Phase 30, the WavePath phases are 31 to 35 (from 2026-10-11 WavePath comes before Horoskopia), and Horoskopia-driven development is 36 to 40. + ## Related - `core-plugins-own-repos.md`: each shared plugin gets an `sm--plugin` repo diff --git a/.planning/notes/wavepath-framework-asks-division.md b/.planning/notes/wavepath-framework-asks-division.md index 849cc9d3..4cdb79bc 100644 --- a/.planning/notes/wavepath-framework-asks-division.md +++ b/.planning/notes/wavepath-framework-asks-division.md @@ -10,6 +10,8 @@ WavePath's agent wrote a list of what it needs from SummerCMS (section A) and wh ## Decisions +> **Updated 2026-10-18** (`.planning/notes/2026-10-18-roadmap-reorder-demo-release-wavepath.md`): the Płytarium cutover is now Phase 30, after a demo instance at Phase 20. Chat parity against WavePath's clients moved from 19.2 to Phase 31 and opens the WavePath phases (31 to 35). The other 19.x phases still land before the cutover. Phase numbers below are as of 2026-10-11. + - **The 19.x block comes before the cutover.** Chat first, then chat polish, then the other framework and user-plugin asks. Phase 20 waits for 19 to 19.6. The WavePath migration milestone opens after Phase 20. - **Chat is ported from the WavePath copy**, with `root_id` threading and `thread_summaries`. This settles the open chat-source question for Phase 19. - **The seed's trigger is now "Phase 20 complete".** The WavePath milestone no longer waits for the Horoskopia port. @@ -20,19 +22,19 @@ WavePath's agent wrote a list of what it needs from SummerCMS (section A) and wh |---|---| | A9: chat and chatchannels | Phase 19 | | A9: chatbots, chatvideo (LiveKit, reconcile job), forum, herald (web push), userfriends | Phase 19.1 | -| Chat parity against WavePath's clients | Phase 19.2 | +| Chat parity against WavePath's clients | Phase 19.2, now Phase 31 | | A3 cookie refresh and CORS, A6 cache and Redis `surf.Store`, A8 S3 option, `/api-docs`, Turnstile | Phase 19.3 (`summercms.go`) | | A1 OIDC provider | Phase 19.4 (`wristband`) | | A2 social login | Phase 19.5 (`sm-user-plugin`) | | A4 2FA, A5 device flow | Phase 19.6 (`sm-user-plugin`) | -| A7 `summer import:winter` | Phase 20 (D-02 runner), with the WavePath stress cases below | +| A7 `summer import:winter` | Phase 20, now Phase 30 (D-02 runner), with the WavePath stress cases below | ## Corrections to the hand-off list - **The user plugin is already shared.** `sm-user-plugin` (`git.golem15.com/golem15/sm-user-plugin`) is its own repo, checked out by both fonoteka.go and sm-bm-app. Phases 19.5 and 19.6 add to it directly. Both consuming apps must still build after each change. - **Plugin-registrable token scopes (A8) are dropped for now.** `sm-user-plugin` already mints scoped tokens (`MintAPIToken`, `HasScope`). Its allowed list (`read`, `write`, `ai`) is a static package variable. WavePath's `wave.scope.public:*` scopes belong to its own `wave_token` guard and `golem15_wavepath_api_tokens` table, which section B ports on the WavePath side. Add a `RegisterAPITokenScope` hook only if WavePath confirms that its user-plugin tokens carry custom scopes. -## `import:winter` stress cases from WavePath (for Phase 20) +## `import:winter` stress cases from WavePath (for Phase 30, formerly 20) - The source is MariaDB. That is the same MySQL wire protocol, but check type coercion. - About 90 tables, including large chat and channel message tables. Batching must handle them. diff --git a/.planning/phases/19.6-two-factor-auth-and-device-flow-in-sm-user-plugin/19.6-CONTEXT.md b/.planning/phases/19.6-two-factor-auth-and-device-flow-in-sm-user-plugin/19.6-CONTEXT.md index 8977f695..0a82d254 100644 --- a/.planning/phases/19.6-two-factor-auth-and-device-flow-in-sm-user-plugin/19.6-CONTEXT.md +++ b/.planning/phases/19.6-two-factor-auth-and-device-flow-in-sm-user-plugin/19.6-CONTEXT.md @@ -179,7 +179,7 @@ Repos: `sm-mfa-plugin` (new), `sm-user-plugin`, `sm-sociallogin-plugin` (it call - Per-group 2FA exemptions (settings on user groups), replacing PHP's child-account exemption. Long term. - Notification mails on 2FA enabled/disabled or a new trusted device (not in PHP). -- Winter import of the 2FA and device tables (Phase 20 `import:winter`, hashing plaintext tokens per D-06). +- Winter import of the 2FA and device tables (Phase 30 `import:winter`, numbered 20 when this was written, hashing plaintext tokens per D-06). diff --git a/.planning/phases/20-demo-instance-with-every-shared-plugin/.gitkeep b/.planning/phases/20-demo-instance-with-every-shared-plugin/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/.planning/phases/20-cutover/20-CONTEXT.md b/.planning/phases/30-cutover/30-CONTEXT.md similarity index 96% rename from .planning/phases/20-cutover/20-CONTEXT.md rename to .planning/phases/30-cutover/30-CONTEXT.md index 4867e87d..5d92b99c 100644 --- a/.planning/phases/20-cutover/20-CONTEXT.md +++ b/.planning/phases/30-cutover/30-CONTEXT.md @@ -1,4 +1,4 @@ -# Phase 20: Płytarium cutover - Context +# Phase 30: Płytarium cutover - Context **Gathered:** 2026-10-04 **Status:** Ready for planning @@ -52,7 +52,7 @@ Not in scope: anything on the PHP side after the swap. The user handles the PHP ### "All routes green" gate - **D-11:** The acceptance set is every route in `fonoteka.go/parity/manifest.yaml`: 175 entries today, covering the fonoteka, user, oauth, realtime and feedback routes. Every entry must be `ported`, with passing recorded cases, zero `pending` entries, and `routes.snapshot` matching PHP on path, method and auth group. API-09, QA-05 and the ROADMAP success criteria are reworded at plan time from "154 routes" to "every manifest route". - **D-12:** Fixtures: the whole corpus is re-recorded from the current PHP backend (`summer parity:record`) shortly before the freeze, and the Go replay must be green on it. A drift report lists every fixture whose PHP response changed since it was committed, and each drift is resolved (a Go fix, or an accepted normalizer change) before the swap. In addition, a **read-only smoke diff runs on the rehearsal import**. A scripted set of authenticated GET requests (as real users, via minted JWTs and personal tokens) is replayed against PHP on the restored MariaDB and against Go on the Postgres imported from the same dump, and both are diffed with the tide normalizer. The smoke diff runs locally on the dump only. -- **D-13 (prerequisites):** Phase 14.1 (the 3 pending routes), Phase 12.1 (the user admin screens) and Phase 14.2 (local Nuxt against Go) are hard prerequisites, and they are on Phase 20's depends-on in ROADMAP. Phase 14's open UAT items must also be closed: the CR-01 decision record, and the WR-02/WR-05 dispositions, which `fonoteka.go` commits suggest are already fixed. Phase 20's first plan opens with a preflight gate that fails unless all of this holds and the manifest has zero pending routes. Planning may start before the prerequisites close. +- **D-13 (prerequisites):** Phase 14.1 (the 3 pending routes), Phase 12.1 (the user admin screens) and Phase 14.2 (local Nuxt against Go) are hard prerequisites, and they are on Phase 30's depends-on (numbered Phase 20 when this was written) in ROADMAP. Phase 14's open UAT items must also be closed: the CR-01 decision record, and the WR-02/WR-05 dispositions, which `fonoteka.go` commits suggest are already fixed. Phase 30's first plan opens with a preflight gate that fails unless all of this holds and the manifest has zero pending routes. Planning may start before the prerequisites close. ### Daily-use acceptance - **D-14:** The soak is 7 days of normal household use on Go with no rollback-worthy issue. During it, the wishlist digest and the notification prune schedules each run at least once, and at least one CSV import and one Discogs match complete. The end of the soak is the phase sign-off and closes the rollback window. @@ -85,7 +85,7 @@ Not in scope: anything on the PHP side after the swap. The user handles the PHP ### Prior decisions this phase builds on - `.planning/PROJECT.md`: Postgres only, the out-of-scope MySQL support, the core value. - `.planning/REQUIREMENTS.md`: API-09 and QA-05, which are reworded per D-11. -- `.planning/phases/05-data-layer-full-fidelity/05-RESEARCH.md`: D-10 (Laravel decrypt is import-only), D-14/D-17 (`system_files` shape and thumb reuse), and the cutover import deferred to Phase 20. +- `.planning/phases/05-data-layer-full-fidelity/05-RESEARCH.md`: D-10 (Laravel decrypt is import-only), D-14/D-17 (`system_files` shape and thumb reuse), and the cutover import deferred to Phase 20 (now Phase 30). - `.planning/phases/07-user-plugin-and-authentication/07-CONTEXT.md`: D-06 (wire-compatible JWTs, blacklist not migrated) and D-15 (reset codes). - `.planning/phases/09-backend-admin-authentication-and-schema-pipeline/09-CONTEXT.md`: D-01 (Winter-shaped `backend_users`, copied straight in at cutover) and WR-17 (user-level permissions). - `.planning/phases/14-domain-jobs-and-external-integrations/14-CONTEXT.md`: D-18 (golem/feedback settings importers), D-20 (`GOLEM15_SSRF_ALLOWED_HOSTS`), and D-09 (the routes now in 14.1). @@ -151,5 +151,5 @@ Not in scope: anything on the PHP side after the swap. The user handles the PHP --- -*Phase: 20-cutover* +*Phase: 30-cutover* *Context gathered: 2026-10-04* diff --git a/.planning/phases/20-cutover/20-DISCUSSION-LOG.md b/.planning/phases/30-cutover/30-DISCUSSION-LOG.md similarity index 98% rename from .planning/phases/20-cutover/20-DISCUSSION-LOG.md rename to .planning/phases/30-cutover/30-DISCUSSION-LOG.md index 3838301b..77cd4da5 100644 --- a/.planning/phases/20-cutover/20-DISCUSSION-LOG.md +++ b/.planning/phases/30-cutover/30-DISCUSSION-LOG.md @@ -1,10 +1,10 @@ -# Phase 20: Płytarium cutover - Discussion Log +# Phase 30: Płytarium cutover - 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-10-04 -**Phase:** 20-cutover +**Phase:** 30-cutover **Areas discussed:** MariaDB → Postgres data move, production switch and rollback, the "all routes green" gate, daily-use acceptance Before the discussion started, the scout found that production runs on MariaDB (with a Redis queue), not Postgres. It also found that the parity manifest holds 175 routes (172 ported, 3 pending), not 154, and that Phases 14.1 and 12.1 have not started. diff --git a/.planning/phases/19.2-chat-polish-against-wavepath-clients/.gitkeep b/.planning/phases/31-chat-polish-against-wavepath-clients/.gitkeep similarity index 100% rename from .planning/phases/19.2-chat-polish-against-wavepath-clients/.gitkeep rename to .planning/phases/31-chat-polish-against-wavepath-clients/.gitkeep diff --git a/.planning/seeds/SEED-261007-0tb-wavepath-port.md b/.planning/seeds/SEED-261007-0tb-wavepath-port.md index e1cdf6d2..7fd6bac6 100644 --- a/.planning/seeds/SEED-261007-0tb-wavepath-port.md +++ b/.planning/seeds/SEED-261007-0tb-wavepath-port.md @@ -3,7 +3,7 @@ id: SEED-261007-0tb status: dormant planted: 2026-10-07 planted_during: Phase 16 (context gathered) -trigger_when: Phase 20 (Płytarium cutover) is complete. Phases 19 to 19.6 already deliver the framework and shared-plugin work WavePath needs. +trigger_when: Phase 30 (Płytarium cutover) is complete. The WavePath work then runs as Phases 31 to 35, starting with chat polish against WavePath's clients (Phase 31, formerly 19.2) and including the move off Mattermost. scope: Large --- @@ -15,7 +15,7 @@ Wavepath (`/media/nvme/dev/jz/wavepath.org`) is the largest Golem15 app and the ## When to Surface -**Trigger:** once Phase 20 is complete. Phases 19 to 19.6 come first and cover WavePath's framework asks (chat, chat polish, transport and infrastructure, OIDC, social login, 2FA and device flow). The milestone no longer waits for the Horoskopia port (changed 2026-10-11). +**Trigger:** once Phase 30 (Płytarium cutover) is complete. Phases 19 to 19.7 come first and cover WavePath's framework asks (chat, transport and infrastructure, OIDC, social login, 2FA and device flow); chat polish against WavePath's clients moved to Phase 31 and opens the WavePath phases (31 to 35, including the move off Mattermost). The milestone no longer waits for the Horoskopia port (changed 2026-10-11). Reordered 2026-10-18, see `.planning/notes/2026-10-18-roadmap-reorder-demo-release-wavepath.md`. ## Scope Estimate diff --git a/.planning/seeds/SEED-261007-j2b-horoskopia-port.md b/.planning/seeds/SEED-261007-j2b-horoskopia-port.md index 46c26114..420b68a9 100644 --- a/.planning/seeds/SEED-261007-j2b-horoskopia-port.md +++ b/.planning/seeds/SEED-261007-j2b-horoskopia-port.md @@ -3,7 +3,7 @@ id: SEED-261007-j2b status: dormant planted: 2026-10-07 planted_during: Phase 16 (context gathered) -trigger_when: Phase 20 (Płytarium cutover) is complete, plus the stabilization phase if one is added. It comes before the Wavepath port. +trigger_when: The WavePath phases (31 to 35) are complete. Horoskopia-driven development takes Phases 36 to 40. scope: Large --- @@ -15,7 +15,7 @@ Horoskopia (`/media/nvme/dev/golem15/horoskopia.eu`) is the second app port afte ## When to Surface -**Trigger:** Phase 20 (Płytarium cutover) is complete, plus the stabilization phase if one is added. This port comes before the Wavepath port (SEED-261007-0tb). +**Trigger:** the WavePath phases (31 to 35, SEED-261007-0tb) are complete. Horoskopia-driven development takes Phases 36 to 40. This port used to come before WavePath; the order flipped on 2026-10-11 and the numbers were set on 2026-10-18, see `.planning/notes/2026-10-18-roadmap-reorder-demo-release-wavepath.md`. ## Scope Estimate