From f098ffdbf958d2240d2d92e695f0a49dcb63ba46 Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Tue, 27 Oct 2026 14:18:11 +0100 Subject: [PATCH] docs(32-06): complete the unit tests and v0.5.1 release plan --- .../phases/32-seo-foundation/32-06-SUMMARY.md | 375 ++++++++++++++++++ .../32-seo-foundation/32-06-release-log.md | 29 ++ .../32-seo-foundation/deferred-items.md | 23 ++ 3 files changed, 427 insertions(+) create mode 100644 .planning/phases/32-seo-foundation/32-06-SUMMARY.md create mode 100644 .planning/phases/32-seo-foundation/32-06-release-log.md create mode 100644 .planning/phases/32-seo-foundation/deferred-items.md diff --git a/.planning/phases/32-seo-foundation/32-06-SUMMARY.md b/.planning/phases/32-seo-foundation/32-06-SUMMARY.md new file mode 100644 index 00000000..11a9f96b --- /dev/null +++ b/.planning/phases/32-seo-foundation/32-06-SUMMARY.md @@ -0,0 +1,375 @@ +--- +phase: 32-seo-foundation +plan: 06 +subsystem: release +tags: [release, apisurface, additive-gate, compat-gate, unit-tests, vitest, sm-seo-plugin, sm-journal-plugin, sm-demo-app, changelog] + +requires: + - phase: 32-01 + provides: cross-plugin admin form extensions (pact.AdminFormExtension, cabana compile and save) + - phase: 32-02 + provides: record events (pact.RecordSaved/RecordDeleted, cabana.EmitRecord*), content descriptors (pact.ContentDescriptor, signpost lookups), Journal adoption + - phase: 32-03 + provides: sm-seo-plugin core (entries, rules, settings, resolver, history) + - phase: 32-04 + provides: redirects, 404 log, robots.txt + - phase: 32-05 + provides: management API, MCP tools, batches, undo, CSV, check-phase32.sh, 32-05-demo-mount.patch +provides: + - "scripts/check-phase32.sh stages additive (scripts/apisurface API-surface comparison with the previous release) and compat (three consumers tested, every other sibling built), with self-tests" + - "Framework unit matrices for form extensions, record events and content descriptors" + - "sm-seo-plugin unit tests (classes) and 52 vitest element tests; sm-journal-plugin descriptor, journal-tag and translated-slug tests" + - "SummerCMS v0.5.1 (patch, strictly additive), sm-journal-plugin v0.2.5, sm-seo-plugin v0.1.0 (first release), all pushed" + - "sm-demo-app mounts golem15.seo v0.1.0 (pushed, not deployed)" + - "Changelog post https://summercms.io/changelog/summercms-0-5-1" +affects: [33, sm-demo-app, sm-grzybyfunkcjonalne-app, sm-summercmsio-app, vue-seo-layer] + +actuals: + tokens: 51000 + tasks: 5 + commits: 4 +plan_head_before: 49502e8ccb98e29a067961641dd08e2d39e42f27 +plan_head_after: a9a7f58eedaf70edd3472b6aebe01b2db4cbb498 + +tech-stack: + added: [] + patterns: + - "Release gate: the API surface of every changed framework package is compared with the previous release tag (tags containing HEAD skipped); removed or changed elements and methods added to existing interfaces are refused" + - "Compat gate reads sibling repositories through temporary-index snapshots or detached worktrees and builds them in a symlinked scratch sibling layout" + - "Release steps are logged as they complete (32-06-release-log.md) so a resumed run never re-tags, force-pushes or re-posts" + +key-files: + created: + - scripts/apisurface/main.go + - modules/cabana/form_extensions_test.go + - modules/cabana/record_events_test.go + - modules/signpost/content_test.go + - .planning/phases/32-seo-foundation/32-06-release-log.md + - .planning/phases/32-seo-foundation/deferred-items.md + - ../sm-seo-plugin/classes/*_test.go (resolver, redirect_graph, normalize, robots_value, robots, templates, csv, owner, issues, helpers) + - ../sm-seo-plugin/tests/elements/{text,robots,serp,robotstxt,transfer}.test.ts, tests/elements/css.ts + - ../sm-journal-plugin/content_descriptors_test.go + - ../sm-demo-app/config/golem15.seo.yaml, seo_mount_test.go, seo_mcp_test.go + modified: + - scripts/check-phase32.sh + - .planning/phases/32-seo-foundation/32-VALIDATION.md + - ../sm-seo-plugin/go.mod, README.md, classes/redirect_graph.go, classes/issues.go, classes/robots.go, assets/src/elements/measure.ts, assets/dist/seo.js + - ../sm-journal-plugin/go.mod, README.md, menu_item_types_test.go + - ../sm-demo-app/go.mod, go.sum, go.work, .gitmodules, summer.yaml, plugins.gen.go, boot_test.go, DEPLOY.md, deploy/nginx/demo.summercms.io.conf, plugins/golem15/journal, plugins/golem15/seo + +key-decisions: + - "Release per Jakub's go-ahead: SummerCMS v0.5.1, sm-journal-plugin v0.2.5, sm-seo-plugin v0.1.0, all pushed with their branches; sm-demo-app's three commits pushed; nothing deployed" + - "The additive gate compares with the newest tag that does not contain HEAD, so a run on the tagged release commit compares it with the previous release, not with itself" + - "The demo Journal bump replaces the other session's uncommitted journal pointer drift on the same path (b129902, an ancestor of v0.2.5) with the v0.2.5 pointer; the oauthserver drift is left untouched" + - "check-pins is proven on the committed demo tree (clean detached worktree), because the live tree carries another session's oauthserver drift" + - "The optional app Journal bumps and per-plugin changelog posts were not named and are deferred" + +patterns-established: + - "Post-release gate runs pick the previous release as the additive baseline (git tag --no-contains HEAD)" + +requirements-completed: [SC-5, SC-1, SC-2, SC-3, SC-4, Q-01, D-106, D-90, D-91, D-92, D-93, D-98, D-22, D-25, D-09] + +coverage: + - id: D1 + description: "Additive and compat gate stages: the v0.5.1 API surface keeps every v0.5.0 element (cabana +2, pact +87, signpost +8 lines, nothing removed or changed, no interface method added); consumers build and test unchanged" + requirement: "D-106" + verification: + - kind: other + ref: "bash scripts/check-phase32.sh --additive (release commit 15b0d0d vs v0.5.0); bash scripts/check-phase32.sh --self-test" + status: pass + - kind: other + ref: "bash scripts/check-phase32.sh --all (compat stage: 3 consumers tested, 20 siblings built)" + status: pass + human_judgment: false + - id: D2 + description: "Framework unit matrices for form extensions, record events and content descriptors" + requirement: "SC-5" + verification: + - kind: unit + ref: "go test ./modules/cabana ./modules/signpost (form_extensions_test.go, record_events_test.go, content_test.go)" + status: pass + human_judgment: false + - id: D3 + description: "sm-seo-plugin class unit tests and element tests; Journal descriptor, journal-tag and translated-slug tests" + requirement: "SC-5" + verification: + - kind: unit + ref: "go -C ../sm-seo-plugin test ./... (TestResolverPrecedence, TestRedirectGraph, TestNormalizeMatrix, TestRobotsValueRoundTrip, TestRobotsMatcherGoogleExamples, TestTemplates, TestCSV, TestOwnerResolution, TestIssues)" + status: pass + - kind: unit + ref: "npm --prefix ../sm-seo-plugin run test (52 element tests)" + status: pass + - kind: unit + ref: "go -C ../sm-journal-plugin test ./... (content_descriptors_test.go, menu_item_types_test.go)" + status: pass + human_judgment: false + - id: D4 + description: "Releases tagged and pushed: SummerCMS v0.5.1, sm-journal-plugin v0.2.5, sm-seo-plugin v0.1.0" + requirement: "Q-01" + verification: + - kind: other + ref: "git ls-remote --tags origin v0.5.1 / v0.2.5 / v0.1.0 (aa6e0a5, 16d9326, 9cf0447)" + status: pass + human_judgment: false + - id: D5 + description: "sm-demo-app mounts golem15.seo v0.1.0 with tagged requires; SEO tab and MCP catalog proven" + requirement: "SC-4" + verification: + - kind: integration + ref: "go -C ../sm-demo-app test -count=1 -tags summercms_mcp -run 'TestSEOToolsCatalog|TestGoModRequiresTags|TestSEOTabMounted|TestBootAllPlugins' . (Docker)" + status: pass + - kind: other + ref: "scripts/check-pins.sh in a clean worktree of 9451b31: check-pins: ok (17 modules)" + status: pass + human_judgment: false + - id: D6 + description: "Full phase gate green with the demo mounted and no skips" + requirement: "D-90" + verification: + - kind: other + ref: "bash scripts/check-phase32.sh --all (exit 0, Phase 32 gate passed)" + status: pass + human_judgment: false + - id: D7 + description: "Changelog post for v0.5.1 on summercms.io reads well and says the right things to users" + verification: + - kind: other + ref: "https://summercms.io/changelog/summercms-0-5-1 answers 200; API shows published at the tag date" + status: pass + human_judgment: true + rationale: "Wording and emphasis of public release notes are an editorial call" + +duration: 1h 25m +completed: 2026-10-27 +status: complete +--- + +# Phase 32 Plan 06: Unit tests, additive release gate and the v0.5.1 release Summary + +**The phase is proven and released. An API-surface gate shows the framework change is strictly additive against v0.5.0, and a compat gate builds every sibling consumer unchanged. Unit tests cover the framework seams, the SEO plugin (Go and elements) and Journal. SummerCMS v0.5.1, sm-journal-plugin v0.2.5 and sm-seo-plugin v0.1.0 are tagged and pushed. sm-demo-app mounts golem15.seo v0.1.0 and is pushed, not deployed. The changelog post is at https://summercms.io/changelog/summercms-0-5-1.** + +## Performance + +- **Duration:** about 1h 25m in two executor contexts (Tasks 1 to 3, then Task 5 after the Task 4 checkpoint) +- **Started:** 2026-10-27T11:51Z (plan base 49502e8) +- **Completed:** 2026-10-27T13:20Z +- **Tasks:** 5 (4 executed, 1 decision checkpoint) +- **Files modified:** 6 in this repository, 23 in sm-seo-plugin, 4 in sm-journal-plugin, 14 in sm-demo-app + +## Task 4 answer (Jakub) + +- **Decision:** release. Versions confirmed: v0.5.1, v0.2.5 and v0.1.0. +- **Approved pushes:** + - framework master and v0.5.1 (master carried 64 commits, including other sessions' work; accepted) + - sm-journal-plugin main and v0.2.5 + - sm-seo-plugin main (first push) and v0.1.0 + - sm-demo-app master with three commits +- **Changelog:** a post for v0.5.1. +- **Not named:** the optional app Journal bumps. **Nothing deployed.** +- **Gate:** the full run with the demo mounted and no test skips. The fixture is readable after the chown. + +## Accomplishments + +- `check-phase32.sh` has two new stages: + - **additive:** `scripts/apisurface` compares the exported API with the previous release and refuses removed or changed elements and methods added to existing interfaces. The self-test plants each case. + - **compat:** sm-sitemap-plugin, sm-journal-plugin and sm-demo-app are tested; every other sibling that requires the framework is built. +- **Unit tests:** + - framework matrices for form extensions, record events and content descriptors + - sm-seo-plugin classes (resolver, redirect graph, normalisation, robots value and matcher, templates, CSV, owner, issues) and 52 vitest element tests + - Journal: descriptors, the journal-tag type and translated slugs +- **Releases:** v0.5.1, v0.2.5 and v0.1.0 are tagged and pushed. Both plugins require v0.5.1. +- **Demo:** sm-demo-app requires v0.5.1, bumps Journal to v0.2.5 and mounts golem15.seo v0.1.0 (the 32-05 patch, the submodule and go.work). +- **Changelog:** v0.5.1 is announced. + +## Task Commits + +**summercms.go** +1. **Task 1: additive and compat stages** - `2b300ec` (test) +2. **Task 2: framework unit matrices** - `8c961f5` (test) +3. **Task 3D: validation map** - `15b0d0d` (docs). This is the release commit, tagged v0.5.1. +4. **Task 5 fix: additive baseline after tagging** - `a9a7f58` (fix). Local only, after the tag. + +**sm-seo-plugin** +- Task 3 fixes and refactors: + - `e957c00` refactor: run the redirect simulation over a rule list + - `79567b3` fix: a loop through the site's absolute URL lists each address once + - `6d54fc7` refactor: build the issue report from loaded data + - `9461c74` fix: the result preview truncates at the last word boundary +- Task 3A: `9e45ddc` test: unit tests for the SEO classes +- Task 3B: `dcfbdc0` test: element backstops +- Task 5: `b19cd06` chore: require SummerCMS v0.5.1. Tagged v0.1.0. + +**sm-journal-plugin** +- Task 3C: `fea88f8` test: content descriptors, journal-tag type and translated slugs +- Task 5: `f5a0394` chore: require SummerCMS v0.5.1. Tagged v0.2.5. + +**sm-demo-app** (Task 5) +- `11f64bf` chore: require SummerCMS v0.5.1 (go.mod, go.sum) +- `11d485f` chore: bump journal to v0.2.5 (go.mod, go.sum, plugins/golem15/journal) +- `9451b31` feat: mount golem15.seo v0.1.0 (13 paths, all from this plan) + +**Plan metadata:** the commit that adds this SUMMARY (docs). + +`commits: 4` is measured in this repository with `git rev-list --count 49502e8..HEAD` before this SUMMARY's commit. Sibling commits are listed above. + +## Release steps (from 32-06-release-log.md) + +- **Pre-checks:** + - framework: newest tag v0.5.0; master was 64 ahead of origin/master and 0 behind. + - admin/: only `admin/tests/form/FormView.test.ts` changed, so no dist rebuild was needed. +- **Step 1, framework:** + - `go vet` and `go test -short` green. + - Annotated tag v0.5.1: tag object aa6e0a5 on commit 15b0d0d. + - `git push origin master`: 223f87e..15b0d0d, fast-forward checked after `git fetch`. + - `git push origin v0.5.1`; `ls-remote` confirms it. +- **Step 2, sm-journal-plugin:** + - `go get summercms@v0.5.1` with `GOWORK=off` and `GOPRIVATE`. + - README dependency line updated to v0.5.1 (signpost is now a runtime dependency). + - Build, vet and `test -short` green. + - Commit f5a0394; tag v0.2.5 (tag object 16d9326). + - Pushed main 7fc07d8..f5a0394 and the tag. +- **Step 3, sm-seo-plugin:** + - The same require, plus the README dependency line "SummerCMS v0.5.1 modules". + - Build, vet and `test -short` green. + - Commit b19cd06; tag v0.1.0 (tag object 9cf0447). + - `git push -u origin main` (a new branch on the empty remote) and the tag. +- **Step 4, sm-demo-app:** + - Found at the start: ` M plugins/golem15/journal` and ` M plugins/golem15/oauthserver`. + - Commit 11f64bf: require v0.5.1. + - The journal submodule HEAD (b129902) is an ancestor of v0.2.5, so it was moved to v0.2.5. Commit 11d485f: only the v0.2.5 pointer was staged, and it replaces the foreign journal drift on that path. + - Mount: + - `git apply` the 32-05 patch + - `git submodule add -b main` sm-seo-plugin, checked out at v0.1.0 + - go.work `use ./plugins/golem15/seo` + - `go get sm-seo-plugin@v0.1.0` and `go mod tidy` (GOWORK=off) + - `summer build` printed ✓ Built bin/demo + - Build (plain and summercms_mcp), vet and `test -short` green. With Docker, TestBootAllPlugins, TestGoModRequiresTags, TestSEOToolsCatalog and TestSEOTabMounted pass. + - Commit 9451b31. + - check-pins: the live tree fails only on the foreign oauthserver drift. A clean worktree of 9451b31 prints `check-pins: ok (17 modules)`, and `GOWORK=off go build ./...` builds from the published tags (plain and mcp). + - Pushed master 8fcdbdd..9451b31. Not deployed. +- **Step 5, gate:** `check-phase32.sh --all` passes (details under Gate output). +- **Step 6, changelog:** + - `changelog-post.py source v0.5.1`, then the notes (## Highlights, ## Added). + - `publish` returned post id 45: https://summercms.io/changelog/summercms-0-5-1. It is published at the tag date and the page answers 200. + - The script read the token itself; it was never printed. +- **Step 7, deferred items:** deferred-items.md is written. + +## Gate output (step 5) + +`bash scripts/check-phase32.sh --all` ran with Docker, the demo mounted, no `PHASE32_*` overrides and no test skips. It exited 0 with "Phase 32 gate passed". + +- **Stages:** PASS for self-test, go, plugins (TestNoTideJournalFixtures included), consumers, admin, docs, marker, additive, compat and docker. +- **compat:** sm-sitemap-plugin, sm-journal-plugin and sm-demo-app are tested. fonoteka.go, sm-bm-app, sm-grzybyfunkcjonalne-app and every sibling plugin are built. +- **docker:** TestSEOTabMounted and TestSEOToolsCatalog pass in the demo. +- **No failure lines:** no FAIL, `refuse:`, NOT MOUNTED or additive refusal. +- **Additive baseline:** the additive line of that run compared v0.5.1 with itself, which led to fix a9a7f58. Re-run on the release commit, it compared against v0.5.0: cabana +2, pact +87, signpost +8 lines. + +## Decisions Made + +See `key-decisions` in the frontmatter. + +## Deviations from Plan + +### Auto-fixed Issues + +**1. [Rule 1 - Bug] Behaviour-neutral refactors so TestRedirectGraph and TestIssues run under -short** +- **Found during:** Task 3A +- **Fix:** the redirect simulation runs over a rule list, and the issue report is built from loaded data. +- **Commits:** sm-seo-plugin e957c00, 6d54fc7 + +**2. [Rule 1 - Bug] A loop notice listed an address twice** +- **Found during:** Task 3A +- **Fix:** a loop through the site's absolute URL lists each address once. +- **Commit:** sm-seo-plugin 79567b3 + +**3. [Rule 1 - Bug] The result preview did not truncate per UI-SPEC E-1** +- **Found during:** Task 3B +- **Fix:** the preview truncates at the last word boundary plus " …", and the dist bundle was rebuilt. +- **Commit:** sm-seo-plugin 9461c74 + +**4. [Rule 3 - Blocking] Extra test support files** +- **Found during:** Task 3 +- **Fix:** classes/helpers_test.go and tests/elements/css.ts were added, and gorm.io/driver/postgres became a direct require in sm-seo-plugin's go.mod. +- **Commits:** 9e45ddc, dcfbdc0 + +**5. [Rule 3 - Blocking] No layout in happy-dom** +- **Found during:** Task 3B +- **Fix:** the 320 and 360 px element rows check the stylesheet's layout contract. +- **Commit:** dcfbdc0 + +**6. [Rule 3 - Blocking] The compat stage has to read other repositories without touching their trees** +- **Found during:** Task 1 +- **Fix:** it reads them through temporary-index snapshots or detached worktrees and builds in a symlinked scratch sibling layout. There is a new PHASE32_SKIP_TESTS knob. +- **Commit:** 2b300ec + +**7. No separate RED commits** +- **Found during:** Tasks 2 and 3 +- **Reason:** the green-at-every-commit rule in CLAUDE.md. + +**8. Element tests: 52, against the plan's minimum of 20.** + +**9. [Rule 1 - Bug] The additive stage compared the release with itself once HEAD was tagged** +- **Found during:** Task 5, step 5 +- **Issue:** `last_tag` picked the newest tag, which was v0.5.1 on HEAD. +- **Fix:** `git tag --sort=-v:refname --no-contains HEAD`. The re-run against v0.5.0 passes, and so does `--self-test`. +- **Commit:** a9a7f58 (local; it is after the pushed tag and was not pushed) + +**10. [Rule 3 - Blocking] The live demo tree fails check-pins** +- **Found during:** Task 5, step 4 +- **Issue:** another session's uncommitted oauthserver drift (b6a9586 against v0.1.2, 8bbec72). +- **Fix:** none in the live tree; the drift was left alone. check-pins is proven on a clean detached worktree of the pushed commit. + +**11. [Rule 2 - Docs] Journal README dependency line** +- **Found during:** Task 5, step 2 +- **Issue:** the plan named only the sm-seo-plugin README. +- **Fix:** the Journal README now names SummerCMS v0.5.1, and signpost moved from "in tests" to a runtime dependency (CLAUDE.md documentation rule). +- **Commit:** f5a0394 + +**12. [Rule 3 - Blocking] The demo's TestSEO* tests skip under -short (they need Docker)** +- **Fix:** they were run without -short with Docker. Both pass, tagged and untagged. + +**13. `go mod tidy` in the demo** +- **Why:** to make sm-seo-plugin a direct require. +- **Effect:** go.sum gained grobotstxt's test-dependency checksums and dropped the obsolete v0.5.0 and v0.2.3 lines. +- **Commit:** 9451b31 + +--- + +**Total deviations:** 13 (5 Rule 1, 1 Rule 2, 5 Rule 3, 2 notes). **Impact:** the fixes are bugs in plugin code or in the gate, plus test scaffolding. No scope creep and no API change. + +## Issues Encountered + +- **g15office comment not posted.** This executor has no g15office tool. The orchestrator posts the release comment on Phase 32's milestone task `8gldeain` (`.planning/G15OFFICE.md`). +- **Retracted dependency in the demo.** sm-demo-app pins `github.com/gabriel-vasile/mimetype v1.4.15`, which upstream has retracted. This was there before the plan; it is recorded in deferred-items.md. + +## Deferred (deferred-items.md) + +- Journal bumps in sm-grzybyfunkcjonalne-app (with `golem15.journal.tag_pages: false`) and sm-summercmsio-app. Not named in the go-ahead. +- Changelog posts of their own for sm-journal-plugin v0.2.5 and sm-seo-plugin v0.1.0. +- Deploying the demo. +- The demo's oauthserver drift (another session's) and the retracted mimetype pin. + +## Known Stubs + +None. + +## User Setup Required + +None. + +## Next Phase Readiness + +- Phase 33 can build on the tagged v0.5.1 seams and on sm-seo-plugin v0.1.0. +- The demo is pushed but not deployed. Deploy per `../sm-demo-app/DEPLOY.md` when Jakub says so. +- Local commits after the release: a9a7f58 and this SUMMARY's commit. They go out with the next framework push. + +## Self-Check: PASSED + +- Files: scripts/apisurface/main.go, modules/cabana/form_extensions_test.go, modules/cabana/record_events_test.go, modules/signpost/content_test.go, 32-06-release-log.md and deferred-items.md exist. +- Commits: 2b300ec, 8c961f5, 15b0d0d and a9a7f58 are in this repository. e957c00, 79567b3, 6d54fc7, 9e45ddc, 9461c74, dcfbdc0 and b19cd06 are in sm-seo-plugin; fea88f8 and f5a0394 in sm-journal-plugin; 11f64bf, 11d485f and 9451b31 in sm-demo-app. +- Remote tags: v0.5.1 (aa6e0a5), v0.2.5 (16d9326) and v0.1.0 (9cf0447). +- Changelog URL answers 200. + +--- +*Phase: 32-seo-foundation* +*Completed: 2026-10-27* diff --git a/.planning/phases/32-seo-foundation/32-06-release-log.md b/.planning/phases/32-seo-foundation/32-06-release-log.md new file mode 100644 index 00000000..d2ddf877 --- /dev/null +++ b/.planning/phases/32-seo-foundation/32-06-release-log.md @@ -0,0 +1,29 @@ +# Plan 32-06 release log + +Resume record of Task 5 (one-way). A resumed run confirms each `step done` line and skips it: no tag is created twice, no push is forced, the changelog is posted once. + +## Task 4 answer (Jakub, 2026-10-27) + +- **Decision:** release (full Task 5). +- **Versions:** framework `v0.5.1`, sm-journal-plugin `v0.2.5`, sm-seo-plugin `v0.1.0`. +- **Pushes approved:** framework master + v0.5.1 (master carries 64 commits incl. other sessions' work, accepted); sm-journal-plugin main + v0.2.5; sm-seo-plugin main (first push, `-u`) + v0.1.0; sm-demo-app master (three commits: framework pin, Journal bump, golem15.seo mount). +- **Changelog:** post v0.5.1 on summercms.io. +- **Not named:** optional Journal bumps in sm-grzybyfunkcjonalne-app and sm-summercmsio-app (deferred). +- **Nothing is deployed.** +- **Gate:** full `check-phase32.sh --all` with the demo mounted, no PHASE32_ALLOW_UNMOUNTED, no TestNoTideJournalFixtures skip (fixture readable after the chown). + +## Pre-checks + +- framework: `git fetch --tags origin`; newest tag v0.5.0; master is 64 ahead, 0 behind origin/master (fast-forward). +- admin/: only `admin/tests/form/FormView.test.ts` changed since v0.5.0; the embedded dist is unaffected, no rebuild. + +## Steps + +- step 1 done: framework `go vet ./...` + `go test -short ./...` green; annotated tag v0.5.1 (tag object aa6e0a5, commit 15b0d0d) created; `git push origin master` 223f87e..15b0d0d (fast-forward checked after `git fetch origin`); `git push origin v0.5.1` new tag; `git ls-remote --tags origin v0.5.1` prints aa6e0a5. +- step 2 done: sm-journal-plugin `GOWORK=off GOPRIVATE=git.golem15.com/* go get git.golem15.com/golem15/summercms@v0.5.1` (v0.5.0 => v0.5.1; go.sum unchanged, the module's replace points at ../summercms.go), README dependency line v0.5.1 (signpost now a runtime dependency); `GOWORK=off go build ./... && go vet ./... && go test -short ./...` green; commit f5a0394 `chore: require SummerCMS v0.5.1` (go.mod, README.md); annotated tag v0.2.5 (tag object 16d9326, commit f5a0394); `git push origin main` 7fc07d8..f5a0394 (fast-forward checked); `git push origin v0.2.5` new tag; ls-remote prints 16d9326. +- step 3 done: sm-seo-plugin `GOWORK=off GOPRIVATE=git.golem15.com/* go get git.golem15.com/golem15/summercms@v0.5.1` (v0.5.0 => v0.5.1; go.sum unchanged, replace to ../summercms.go), README dependency line "SummerCMS v0.5.1 modules"; `GOWORK=off go build ./... && go vet ./... && go test -short ./...` green; commit b19cd06 `chore: require SummerCMS v0.5.1` (go.mod, README.md); annotated tag v0.1.0 (tag object 9cf0447, commit b19cd06); `git push -u origin main` new branch (first push, origin was empty); `git push origin v0.1.0` new tag; ls-remote prints main b19cd06 and v0.1.0 9cf0447. +- step 4 done: sm-demo-app (pre-existing drift ` M plugins/golem15/journal` (4ab94da recorded, b1299021 checked out) and ` M plugins/golem15/oauthserver` (8bbec72 recorded, b6a9586 checked out) found at start). Commit 11f64bf `chore: require SummerCMS v0.5.1` (go.mod, go.sum; build, mcp build, vet, test -short green). Journal submodule HEAD b129902 confirmed an ancestor of v0.2.5, checked out at v0.2.5 (f5a0394); commit 11d485f `chore: bump journal to v0.2.5` (go.mod, go.sum, plugins/golem15/journal: 4ab94da -> f5a0394; this pointer replaces the other session's journal drift on the same path, only the intended v0.2.5 pointer staged). Mount: `git apply 32-05-demo-mount.patch`, `git submodule add -b main git@git.golem15.com:golem15/sm-seo-plugin.git plugins/golem15/seo` checked out at v0.1.0 (b19cd06), `./plugins/golem15/seo` in go.work, `GOWORK=off go get sm-seo-plugin@v0.1.0` + `GOWORK=off go mod tidy` (seo a direct require), `go run ../summercms.go/cmd/summer build` (✓ Built bin/demo; plugins.gen.go as in the patch, main.go unchanged); `go build ./...`, `go build -tags summercms_mcp ./...`, `go vet ./...`, `go test -short ./...` green; Docker runs: TestBootAllPlugins, TestGoModRequiresTags, TestSEOToolsCatalog, TestSEOTabMounted PASS (tagged), TestBootAllPlugins, TestSEOTabMounted PASS (untagged); commit 9451b31 `feat: mount golem15.seo v0.1.0` (13 paths, this plan's only). `scripts/check-pins.sh` in the live tree fails only on the other session's oauthserver drift; in a detached worktree of 9451b31 with `git submodule update --init plugins/` it prints `check-pins: ok (17 modules)`, and `GOWORK=off go build ./...` (plain and summercms_mcp) builds from the published tags; scratch worktree removed. `git push origin master` 8fcdbdd..9451b31 (fast-forward checked). Not deployed. ` M plugins/golem15/oauthserver` left as found. +- step 6a: `scripts/changelog-post.py source v0.5.1` (from ../sm-summercmsio-app) printed the tag message and 64 commit subjects since v0.5.0; user-facing notes written to a scratch file (## Highlights, ## Added; no Changed/Fixed entries in this release). +- step 5 done: `bash scripts/check-phase32.sh --all` (no PHASE32_* overrides, Docker, demo mounted at 9451b31, no test skips) exit 0, "Phase 32 gate passed": PASS self-test, go, plugins (TestNoTideJournalFixtures included), consumers, admin, docs, marker, additive, compat (sm-sitemap-plugin, sm-journal-plugin, sm-demo-app tested; every other sibling built), docker (TestSEOTabMounted, TestSEOToolsCatalog in sm-demo-app). No FAIL, refuse:, NOT MOUNTED or additive refusal lines. The additive stage of that run compared v0.5.1 with itself (last_tag picked the tag on HEAD); fixed in a9a7f58 `fix(32-06): the additive stage compares with the previous release once HEAD is tagged` (last_tag uses `--no-contains HEAD`); `check-phase32.sh --additive` on the release commit then compared with v0.5.0: cabana +2, pact +87, signpost +8 lines, nothing removed or changed, no interface method added; `--self-test` passes. a9a7f58 is local (after the tag, not pushed). +- step 6 done: `scripts/changelog-post.py publish v0.5.1 --excerpt "Plugins can extend each other's admin forms, react to record writes and map URLs to records. Strictly additive."` posted id=45, https://summercms.io/changelog/summercms-0-5-1 (title "SummerCMS 0.5.1", published_at 2026-10-27T13:00:42Z, the tag's date). Token read by the script from ~/.config/summercms/journal-token; never printed or copied. +- step 7 done: deferred-items.md lists the unnamed app Journal bumps (sm-grzybyfunkcjonalne-app, sm-summercmsio-app), plugin release posts, the deploy, the demo's oauthserver drift and the retracted mimetype pin. Nothing deployed. diff --git a/.planning/phases/32-seo-foundation/deferred-items.md b/.planning/phases/32-seo-foundation/deferred-items.md new file mode 100644 index 00000000..fd1cc106 --- /dev/null +++ b/.planning/phases/32-seo-foundation/deferred-items.md @@ -0,0 +1,23 @@ +# Phase 32 deferred items + +Work left out of plan 32-06 on purpose, each with its next command. + +## Not named in the release go-ahead (Task 4) + +1. **sm-grzybyfunkcjonalne-app: Journal bump.** The app requires sm-journal-plugin as a pseudo-version (`v0.0.0-00010101000000-000000000000`, through a replace) and SummerCMS v0.4.4. Journal v0.2.5 needs SummerCMS v0.5.1, and its layer has no tag pages, so the bump sets `golem15.journal.tag_pages: false`. Next, after Jakub names it: + ```sh + cd ../sm-grzybyfunkcjonalne-app + GOWORK=off GOPRIVATE='git.golem15.com/*' go get git.golem15.com/golem15/summercms@v0.5.1 git.golem15.com/golem15/sm-journal-plugin@v0.2.5 + git -C plugins/golem15/journal fetch --tags origin && git -C plugins/golem15/journal checkout v0.2.5 + # config: golem15.journal.tag_pages: false + go build ./... && go test -short ./... + git add go.mod go.sum plugins/golem15/journal && git commit -m "chore: bump journal to v0.2.5" + ``` +2. **sm-summercmsio-app: Journal bump.** The app requires sm-journal-plugin v0.1.0 and SummerCMS v0.5.0. Next, after Jakub names it: the same `go get` of `summercms@v0.5.1` and `sm-journal-plugin@v0.2.5`, the submodule checkout at v0.2.5, build and tests, commit `chore: bump journal to v0.2.5`. Decide whether the changelog site wants tag pages (`golem15.journal.tag_pages`). +3. **Plugin release posts.** summercms.io/changelog also carries posts for plugin releases (for example "sm-sociallogin-plugin 0.1.5"). Only the framework post for v0.5.1 was named; sm-journal-plugin v0.2.5 and sm-seo-plugin v0.1.0 have no post of their own (both are listed under "Released together" in the v0.5.1 post). Next, if wanted: the same Journal API post by hand (`../sm-summercmsio-app/DEPLOY.md`, "Posting to the changelog", step 3). +4. **Deploy.** Nothing was deployed. demo.summercms.io runs the previous demo build until a deploy per `../sm-demo-app/DEPLOY.md` (the new `location = /robots.txt` nginx block ships with it). + +## Found during the release, not this plan's + +- sm-demo-app: ` M plugins/golem15/oauthserver` (checked out b6a9586, recorded 8bbec72 = v0.1.2) is another session's uncommitted drift. It makes `scripts/check-pins.sh` fail in the live tree; the committed tree passes (`check-pins: ok (17 modules)` in a clean worktree). Left as found. +- sm-demo-app: `github.com/gabriel-vasile/mimetype v1.4.15` (indirect) is retracted upstream; `go get` warns. Pre-existing; next: `GOWORK=off go get github.com/gabriel-vasile/mimetype@latest` in a dependency-bump commit.