diff --git a/.planning/phases/33-seo-output-audit-and-content/33-14-SUMMARY.md b/.planning/phases/33-seo-output-audit-and-content/33-14-SUMMARY.md new file mode 100644 index 00000000..925680e5 --- /dev/null +++ b/.planning/phases/33-seo-output-audit-and-content/33-14-SUMMARY.md @@ -0,0 +1,181 @@ +--- +phase: 33-seo-output-audit-and-content +plan: 14 +subsystem: release +tags: [tests, gate, release, tags, changelog, deploy, seo, sitemap, journal, nuxt-layers, nodynamic] +status: complete + +requires: + - phase: 33-01..33-13 + provides: the phase's framework seams, plugins, layers, app patches and the release checkpoint + - phase: 33-15, 33-16, quick-261104-xae + provides: the gap closure re-verified in 33-VERIFICATION.md (human_needed, no gaps) +provides: + - "Unit tests for all new phase 33 code (SC-4) and the full check-phase33.sh gate (Tasks 1-2)" + - "Tags: summercms v0.6.1; sm-journal-plugin v0.4.0; sm-sitemap-plugin v0.2.0; sm-seo-plugin v0.2.0 (requires sitemap v0.2.0); vue-seo-layer v0.2.0; vue-journal-layer v0.8.0 and v0.8.1; vue-menu-layer v0.5.0 and v0.5.1; vue-faq-layer v0.5.0 and v0.5.1" + - "Content layers declare vue-seo-layer as a ^0.2.0 peer dependency plus a git devDependency (v0.8.1 / v0.5.1); apps list vue-seo-layer#v0.2.0 directly" + - "Apps pinned to the tags and patched: sm-demo-app (Polish under /pl/), sm-summercmsio-app, sm-grzybyfunkcjonalne-app; static release binaries with -tags nodynamic" + - "Changelog posts for the framework and the three Go plugins" + - "Deploys: summercms.io, demo.summercms.io, bm.jakubzych.com, grzybyfunkcjonalne.pl (production)" +affects: [phase-34, v0.6.2-backlog] + +actuals: + tokens: 40000 + tasks: 4 + commits: 7 +plan_head_before: 9c11b70 +plan_head_after: 6875627 +plan_heads_task4: + summercms.go: { before: 9c11b70, after: 6875627, commits: 7, note: "6d14f71 style: gofmt plus six planning-doc commits; this SUMMARY and the ROADMAP commit follow" } + sm-journal-plugin: { before: cf13c60, after: 6823dcc, commits: 2 } + sm-sitemap-plugin: { before: b2b3a1d, after: fdbe593, commits: 1 } + sm-seo-plugin: { before: c71b58e, after: 22f108b, commits: 1 } + vue-journal-layer: { before: 761c7fc, after: f5dc9b2, commits: 2 } + vue-menu-layer: { before: a7602c9, after: dc38f79, commits: 2 } + vue-faq-layer: { before: 5e5950a, after: a092363, commits: 2 } + sm-summercmsio-app: { before: ca06049, after: 395ed78, commits: 5 } + vue-summercmsio-app: { before: f36cbf1, after: 16ab519, commits: 1 } + sm-demo-app: { before: da481c9, after: da03c06, commits: 9 } + vue-demo-app: { before: 9a12701, after: fe5d38d, commits: 1 } + sm-grzybyfunkcjonalne-app: { before: 35d3664, after: 0554f3e, commits: 10 } + vue-grzybyfunkcjonalne-app: { before: e45ffe8, after: 0771c14, commits: 1 } + sm-bm-app: { before: bd7ee84, after: 43f2fc9, commits: 1, note: "push also carried 552cdce, c2a7823, 9dd0fe4 of other sessions (approved)" } + jz.bm: { before: 0dd0185, after: a27a162, commits: 1 } + +tech-stack: + added: [] + patterns: + - "A Nuxt layer that builds on another git-installed layer declares it as a semver peer dependency and a git devDependency; the app lists both (pnpm 12 refuses git subdependencies by default, blockExoticSubdeps)" + - "Apps that mount the Journal build their release binary with -tags nodynamic, so gen2brain/webp does not link glibc through purego" + - "Smoke expectations that run against production check only the fixed parts of data-dependent text" + +key-files: + created: + - .planning/phases/33-seo-output-audit-and-content/33-14-SUMMARY.md + modified: + - .planning/phases/33-seo-output-audit-and-content/33-release-log.md + - .planning/phases/33-seo-output-audit-and-content/33-13-deploy-log.md + - .planning/phases/33-seo-output-audit-and-content/33-14-notes-vue-journal-layer-v0.8.0.md + - .planning/phases/33-seo-output-audit-and-content/33-14-notes-vue-menu-layer-v0.5.0.md + - .planning/phases/33-seo-output-audit-and-content/33-14-notes-vue-faq-layer-v0.5.0.md + - ../vue-journal-layer/scripts/check-git-install.sh + - ../vue-journal-layer/package.json + - ../vue-menu-layer/package.json + - ../vue-faq-layer/package.json + - ../sm-grzybyfunkcjonalne-app/scripts/urls.txt + - ../sm-grzybyfunkcjonalne-app/scripts/check-deploy.sh + +decisions: + - "Content layers v0.8.1 / v0.5.1 take vue-seo-layer as a ^0.2.0 peer dependency (Jakub, option B); v0.8.0 and v0.5.0 stay published but do not install with pnpm 12 defaults" + - "WebP build option B: every app mounting the Journal builds static with -tags nodynamic" + - "The demo keeps /subscriptions as an Additional address; the route report's noindex list leaves it out (G1 confirmed live)" + - "grzybyfunkcjonalne.pl step 12: keep the deploy and fix the fixture-bound /autor/admin expectation (Jakub, option A)" + - "W5 production SQL length check skipped (Jakub: no production fonoteka)" +--- + +# Phase 33 Plan 14: Unit tests, the phase gate and the release Summary + +**Phase 33 shipped: SummerCMS v0.6.1 with sm-journal-plugin v0.4.0, sm-sitemap-plugin v0.2.0, sm-seo-plugin v0.2.0 and the four SEO-aware Nuxt layers (installable as v0.2.0 / v0.8.1 / v0.5.1 / v0.5.1). Four changelog posts are live. The demo, summercms.io, bm and production grzybyfunkcjonalne.pl run the tagged, statically linked builds, and every smoke ends ok.** + +## Performance + +- Tasks: 4 of 4. Tasks 1 and 2 (unit tests, gate, VALIDATION) and the Task 3 checkpoint ran earlier. Task 4 (the release) ran on 2026-11-05, about 00:30–01:35 UTC, with two checkpoints in between: the layer dependency and the grzyby smoke. +- Task 4 commits: 7 in summercms.go before this SUMMARY, plus the per-repository commits listed in the frontmatter. + +## Accomplishments + +Every step is in 33-release-log.md, steps 0 to 10 (TAG lines for all 11 tags). + +1. **Pre-checks.** + - gofmt fixes: framework 6d14f71 (15 files, several unformatted since v0.6.0) and sm-journal-plugin b8d98ce. + - `check-phase33.sh --all` green with Docker. + - Every repository is on its default branch, and the patches apply. +2. **Framework v0.6.1** (tag 5db8c61 on 6d14f71), master and tag pushed. +3. **Go plugins.** Each got the framework bump, a regenerated plugin.yaml, its README dependency lines, a GOWORK=off build, vet and `test -short`, then a commit, a tag and a push: + - journal v0.4.0; + - sitemap v0.2.0; + - seo v0.2.0, which also requires sitemap v0.2.0. +4. **Layers.** + - vue-seo-layer v0.2.0. + - journal v0.8.0, menu v0.5.0 and faq v0.5.0 after the link: swap. + - `check-git-install.sh v0.8.0` then failed with ERR_PNPM_EXOTIC_SUBDEP (checkpoint). Under option B the patch releases v0.8.1, v0.5.1 and v0.5.1 make vue-seo-layer a peer dependency. + - `check-git-install.sh v0.8.1` passes, and a scratch app on pnpm defaults installs and builds with the menu and FAQ tags too. +5. **Changelog posts.** + - summercms-0-6-1 (id 66); + - sm-sitemap-plugin-0-2-0 (67); + - sm-seo-plugin-0-2-0 (68); + - sm-journal-plugin-0-4-0 (69). + - All four answer 200, and the plugin posts are listed on /changelog/plugins. +6. **Apps.** + - **sm-summercmsio-app:** framework and journal bumps, the 33-12 changelog patch with the layer pins, and nodynamic. Built in a clean worktree: release v0.6.1, static. Smoke ok. + - **sm-demo-app:** three plugin bumps, the 33-12 patches, then the 33-14 locale patches (Polish under /pl/), nodynamic, and a roadmap sync. Docker tests and check-pins passed; the release build is static; smoke ok. + - **sm-grzybyfunkcjonalne-app:** three plugin bumps and the 33-13 patches, with the Binary row saying "static". nodynamic and a check-deploy fix. Full rehearsal `smoke: ok (128 urls)`, later 129. + - **sm-bm-app:** the frontend build with the robots meta and robots.txt went into jz.bm, then the pointer bump, then the push. +7. **Deploys.** + - **summercms.io:** pg_dump; Journal migrations (2); `journal:image-variants`; public checks ok. + - **Demo:** + - pg_dump; the SEO tokens added without printing them; 15 migrations; the vhost reinstalled after `nginx -t`. + - The "After" block with `/subscriptions` kept. G1 confirmed live: it is left out as noindex. + - `journal:image-variants`, then `check-live` ok and strict `smoke-seo` ok. + - **bm:** pg_dump, binary swap, and the X-Robots-Tag on the live vhost, `/pliki/` included. Verified. + - **grzybyfunkcjonalne.pl:** DEPLOY steps 1 to 12. + - Backups first, then 15 migrations. + - `en` was already disabled. + - seo-settings: 3 changed. + - Route report: 4 routes and 1 noindex path. + - New vhost installed. + - Pages renamed, CSV imported, Additional addresses emptied. + - Rebuild: 74 addresses. 285 WebP variants written. + - Production smoke `ok (149 urls)` after the urls.txt fix; `smoke-seo` ok. + - The smoke's 14 entries in the 404 log removed. + +## Deviations from Plan + +### Auto-fixed issues + +1. **[Rule 1 - Bug] Content layers could not be installed (ERR_PNPM_EXOTIC_SUBDEP).** I stopped at the checkpoint, and Jakub chose B: v0.8.1, v0.5.1 and v0.5.1 declare vue-seo-layer as a peer dependency. check-git-install's scratch app now lists vue-seo-layer at the tag's dev pin. +2. **[Rule 3 - Blocking] grzyby check-deploy.sh looked for the old exact build tag list.** It now requires `summercms_mcp,nodynamic` (75736b4). +3. **[Rule 1 - Bug] grzyby urls.txt `/autor/admin` expected the rehearsal author's name.** Production failed 1 of 148 lines. I stopped without rolling back, and Jakub chose A. The line now checks only the fixed parts of the title (0554f3e). The production rerun is ok. +4. **[Rule 3 - Blocking] The sm-summercmsio-app live checkout carries another session's untracked binary,** which `require_clean` refuses. The release build ran in a clean worktree instead. The journal changelog post was published from a clean worktree at v0.4.0 for the same reason (an untracked go.work.sum). +5. **[Rule 2 - Missing] bm's live vhost location `^~ /pliki/` sets its own add_header.** The header was added there as well, not only in the topics location. +6. **Grzyby Nuxt upload.** The build went to `.output.new` and was swapped at the restart instead of being rsynced over the running `.output`. +7. **Demo DEPLOY "After" block.** It no longer removes `/subscriptions` by hand (G1), per Jakub's instruction. +8. **33-13 patch.** The `plugins/grzyby/go.mod` hunk conflicted only with the v0.6.1 bump and was applied by hand (sitemap require and replace). + +### Known follow-ups (not fixed here) + +- **`check-phase33.sh --consumers` needs a post-release mode.** It checks the release patches against unpatched app HEADs, so after the release it refuses (`33-12-sm-demo-app.patch does not apply`). Compat passes, and the apps' builds, tests and smokes ran directly. +- **Posts now send `X-Robots-Tag: index, follow`.** vue-seo-layer sends the CMS robots value as a header. The 2026-10-31 cutover check expected no X-Robots-Tag on a post. This is harmless, but the DEPLOY "Verify" line should be updated. +- **The G2 journal-tag drift warning still appears at every Nuxt start** on the demo and on grzyby. It is deferred to v0.6.2. +- **Some gofmt fixes landed in the framework** without a docs change. The docs checker passes. + +## Human checks still open (33-VERIFICATION.md) + +1. Production grzybyfunkcjonalne.pl, from the 33-13-deploy-log.md check list: + - item 3: SEO › Pages in /gfadmin; + - item 5: a crawl from SEO › Site audit; + - item 6: the visual check on desktop and mobile; + - item 7: resubmit the sitemap in Search Console. +2. SC3 live MCP workflow: a crawl, then dry run and apply from a real client. +3. D-46: Google's Rich Results Test for a post, a category and an FAQ page. +4. Visual checks: + - grzyby; + - the demo on /pl/: the LanguageSwitcher, /pl/mapa-strony and /sitemap, the footer link; + - the new admin screens; + - the Blog Editor outline at 360px (J2). +5. W5 (33-14-risk-max.sql) was skipped by decision. + +## For the orchestrator + +- **g15office:** post a comment on the phase 33 task. Text: "Phase 33 released: SummerCMS v0.6.1, journal v0.4.0, sitemap v0.2.0, seo v0.2.0, layers seo v0.2.0 / journal v0.8.1 / menu v0.5.1 / faq v0.5.1; demo, summercms.io, bm and grzybyfunkcjonalne.pl deployed; open: human checks listed in 33-14-SUMMARY". Close g15office task w8kupqi3 if it is still open. +- **STATE.md:** updated through the handlers only and not committed. The grzyby blocker is resolved. + +## Self-Check: PASSED + +- Files: 33-release-log.md, 33-13-deploy-log.md and this SUMMARY exist. +- Tags: all 11 are on their origins (the plan's verify loop printed "tags-ok"). +- Package files: no content layer package.json has `link:`. +- Commits: + - summercms.go: 6d14f71, 8edc869, 143b4db, ef164dd, 211687f, 201fd0f and 6875627 are present. + - Every repository: HEAD equals its origin default branch after the pushes. The exception is summercms.go, whose planning-doc commits after the v0.6.1 push are local (6 before this SUMMARY), and it is not pushed. +- Changelog: the four post URLs answer 200.