diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 0cbc4a9..22645f6 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -999,7 +999,7 @@ Plans: **Goal:** Plugins can register their own admin form field types (todo: cabana-richeditor-field-type), and the Journal plugin ships a first-class Blog Editor formwidget for post content — beyond the current markdown field or a plain rich editor — that edits imported HTML posts losslessly. **Requirements**: TBD **Depends on:** Phase 16.1 -**Plans:** 6/7 plans executed +**Plans:** 7/7 plans complete Plans: **Wave 1** @@ -1017,7 +1017,7 @@ Plans: - [x] 16.2-06-PLAN.md — Unit tests: resave contract at every layer, strip-and-report and notices, policy cross-check corpus (both policies, identical copies), category strip, full Go and JS coverage, Postgres tests for a Docker host, phase gate scripts/check-phase16.2.sh, validation map **Wave 5** *(gap closure, blocked on Wave 4 completion)* -- [ ] 16.2-07-PLAN.md — Gap closure G-16.2-1 and G-16.2-2: conformance cases for GET /field-types and the field upload route, Docker-free route inventory in the gate, TestJournalSVGEmbed fix; Journal post/category admin saves purge the host Nuxt route cache after commit through a token-protected vue-journal-layer route (browsers revalidate); full gate incl. postgres, release summercms v0.1.20 and vue-journal-layer v0.3.0, UAT redeploy, re-run of UAT Tests 3 and 2 +- [x] 16.2-07-PLAN.md — Gap closure G-16.2-1 and G-16.2-2: conformance cases for GET /field-types and the field upload route, Docker-free route inventory in the gate, TestJournalSVGEmbed fix; Journal post/category admin saves purge the host Nuxt route cache after commit through a token-protected vue-journal-layer route (browsers revalidate); full gate incl. postgres, release summercms v0.1.20 and vue-journal-layer v0.3.0, UAT redeploy, re-run of UAT Tests 3 and 2 ### Phase 16.3: Backend admin personal API tokens with scopes (INSERTED) diff --git a/.planning/STATE.md b/.planning/STATE.md index a8fcd23..ba4a6f1 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -1,19 +1,20 @@ --- msd_state_version: "1.0" milestone: v1.0 -current_phase: "16.2" -current_phase_name: Plugin-provided field types and the Blog Editor formwidget (INSERTED) -status: executing -stopped_at: Completed 16.2-07-PLAN.md -last_updated: "2026-10-10T19:05:40.959Z" +current_phase: "16.3" +current_phase_name: Backend admin personal API tokens with scopes +status: planning +stopped_at: "Phase 16.2 complete (re-verified after 16.2-07, UAT 5/5); Phase 16.3 ready to plan" +last_updated: "2026-10-10T21:39:28.413Z" last_activity: 2026-10-10 -last_activity_desc: Phase 16.2 execution started -state_head: aba063f723fbf629d1a2968dc1c8309926dc36fd +last_activity_desc: Phase 16.2 complete, next Phase 16.3 +state_head: ed8210132ed77af6a5abdf65949357d4b5b14f8c progress: total_phases: 35 completed_phases: 13 total_plans: 158 completed_plans: 154 + percent: 48 gsd_state_version: "1.0" milestone_name: milestone --- @@ -25,22 +26,22 @@ milestone_name: milestone See: .planning/PROJECT.md (updated 2026-09-16) **Core value:** An existing WinterCMS-shaped app can be ported plugin by plugin to a single Go binary without its frontend noticing: the PHP version's API contract is the acceptance test. -**Current focus:** Phase 16.2 — Plugin-provided field types and the Blog Editor formwidget (INSERTED) +**Current focus:** Phase 16.3 — Backend admin personal API tokens with scopes ## Current Position -Phase: 16.2 (Plugin-provided field types and the Blog Editor formwidget (INSERTED)) — EXECUTING -Plan: 2 of 7 -Status: Ready to execute -Last activity: 2026-10-10 — Phase 16.2 execution started +Phase: 16.3 (Backend admin personal API tokens with scopes) — READY TO PLAN +Plan: Not started +Status: Ready to plan +Last activity: 2026-10-10 — Phase 16.2 complete, next Phase 16.3 -Progress: [██████████] 100% +Progress: [█████░░░░░] 48% ## Performance Metrics **Velocity:** -- Total plans completed: 65 +- Total plans completed: 71 - Average duration: 21 min - Total execution time: 104 min @@ -59,6 +60,7 @@ Progress: [██████████] 100% | 10 | 5 | - | - | | 10.2 | 2 | - | - | | 14.1 | 2 | - | - | +| 16.2 | 7 | - | - | **Recent Trend:** @@ -750,5 +752,5 @@ Items acknowledged and carried forward from previous milestone close: ## Session Continuity Last session: 2026-10-10T19:05:40.225Z -Stopped at: Completed 16.2-07-PLAN.md +Stopped at: Phase 16.2 complete, ready to plan Phase 11 Resume file: None diff --git a/.planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-VERIFICATION.md b/.planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-VERIFICATION.md index 99b97e1..f5e4e78 100644 --- a/.planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-VERIFICATION.md +++ b/.planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-VERIFICATION.md @@ -1,8 +1,8 @@ --- phase: 16.2-plugin-provided-field-types-and-the-blog-editor-formwidget -verified: 2026-10-10T17:05:00Z -status: human_needed -score: 13/14 must-haves verified +verified: 2026-10-10T20:10:00Z +status: passed +score: 14/14 must-haves verified covered_files: - .planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-01-PLAN.md - .planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-01-SUMMARY.md @@ -16,6 +16,8 @@ covered_files: - .planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-05-SUMMARY.md - .planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-06-PLAN.md - .planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-06-SUMMARY.md + - .planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-07-PLAN.md + - .planning/phases/16.2-plugin-provided-field-types-and-the-blog-editor-formwidget/16.2-07-SUMMARY.md - admin/src/app/fieldTypes.ts - admin/src/components/form/fields/MLPluginField.vue - admin/src/components/form/fields/PluginField.vue @@ -26,42 +28,39 @@ covered_files: - modules/cabana/field_type.go - modules/cabana/field_type_upload.go - modules/cabana/http.go + - modules/cabana/openapi_conformance_test.go - modules/cabana/relation_field.go - modules/cabana/tx_context.go - modules/pact/capabilities.go - scripts/check-phase16.2.sh -covered_digest: "v2:sha256:9eb467f60a452579c8faedf8900a27909d5234623d4f6760fef9f5691bbf6d75" -behavior_unverified: 1 +covered_digest: "v2:sha256:1172372f0148895ed07ee76d9d0d9996ba7497c35d22ad3443e564c7a817e5d4" +behavior_unverified: 0 overrides_applied: 0 -behavior_unverified_items: - - truth: "D-19 (amended): Journal category content uses blogeditor and is stripped and reported like post content; the 422 CheckHTML gate is retired" - test: "On a Docker host run `bash scripts/check-phase16.2.sh postgres` (TestCategoriesAdminContent, TestCategoriesAdminBlogEditor); on UAT change one word of a category's content in the Blog Editor and save" - expected: "Both Postgres tests pass; on UAT the save succeeds with no removal notice and the category page on the site shows the change" - why_human: "The code is present and wired (fields.yaml type blogeditor, prepareCategoryWrite no longer refuses, the shared Decode is unit-tested), but the end-to-end category save only runs in the Docker-only harness and the UAT category step was never performed (WINDOWS entry 18)" -human_verification: +re_verification: "2026-10-10, after gap closure plan 16.2-07 (G-16.2-1, G-16.2-2) and human UAT on the v0.1.20 UAT deploy; manual re-verification because msd-core 1.14.0 loops stale/human_needed after gap closure" +human_verification_resolved: - test: "On a host with Docker, run `bash scripts/check-phase16.2.sh postgres` from summercms.go" - expected: "TestFieldTypeSavePostgres, TestListRelationSearchPostgres, TestPostsFormCompiles, TestPostsAdminCreateSmoke, TestPostsAdminResaveKeepsHTML, TestPostsAdminSaveSanitizesHTML, TestCategoriesAdminContent, TestCategoriesAdminBlogEditor and TestJournalSVGEmbed all pass (closes WINDOWS 11, 12, 14, 15, 16, 20, 21)" - why_human: "No Docker daemon on this host; the suites compile under go vet but have never run. They are the only end-to-end proof of the CR-01 and WR-04 Load changes, which landed after the UAT acceptance" + result: pass + evidence: "Full gate at ee62410 (gate2.log, 2026-10-10 18:44): phase16.2 postgres passed, 293 cabana and 78 sm-journal-plugin top-level tests; 'Phase 16.2 gate passed', exit 0. No non-planning change since. UAT Test 1" - test: "D-19 on UAT: change one word of a category's content in the Blog Editor and save" - expected: "The save succeeds with no removal notice; the category page shows the change" - why_human: "WINDOWS entry 18; not among the four UAT steps the human ran" - - test: "After the next deploy (v0.1.19 with the review fixes), save post 1 and post 64 untouched again and re-run the read-only md5 SELECT" - expected: "md5(content), md5(content_html) and the post 64 en translation md5 equal the 16.2-05 snapshot; updated_at moved" - why_human: "The UAT D-03 evidence was taken on the v0.1.18 binary. The review fixes changed Load (CR-01: blank content served as content_html; WR-04: '<'-prefixed values compared with content_html). By reading the code the served value for posts 1 and 64 is unchanged, but the deployed proof predates the change" - - test: "Blog Editor preview pane in a real browser (quick 261010-iwu): toggle Preview in light and dark mode, narrow the window, put a