docs(33-13): grzyby patches for the release

- sm-grzybyfunkcjonalne-app: Journal tag pages off and author pages at
  /autor/:author, the sitemap and SEO config, nginx without the root-file
  locations (P33-49), check-deploy, smoke.sh (companions, route report,
  page names, seo-pages.csv, Additional addresses, rebuild), smoke-seo.sh,
  urls.txt, pl as the only enabled locale, seo-settings.yaml with the
  author templates and page suffix, DEPLOY.md release steps, tests
- vue-grzybyfunkcjonalne-app: nuxt.config on the SEO layer options
  without @nuxtjs/seo keys, no page useSeoMeta, footer sitemap link,
  title template for pages the CMS does not answer, SEO fixtures from
  the rehearsal
- local wiring note and the deferred findings
This commit is contained in:
Jakub Zych
2026-11-04 18:17:26 +01:00
parent c59b3e61ed
commit 7199b26bb7
4 changed files with 3374 additions and 0 deletions

View File

@@ -0,0 +1,116 @@
# 33-13 local wiring (P33-46)
How grzybyfunkcjonalne.pl was run on the phase 33 stack before any tag, on 2026-11-04. Nothing here is committed in the app repositories: the wiring lives only in the scratch worktrees, and the two patches leave it out (P33-47).
## Directories
| What | Path |
|------|------|
| Scratch directory (shared with 33-12) | `/media/nvme/dev/golem15/summercms.io/scratch-33` |
| App worktree, detached at `35d3664` | `/media/nvme/dev/golem15/summercms.io/scratch-33/sm-grzybyfunkcjonalne-app` |
| Nuxt worktree, detached at `e45ffe8` | `/media/nvme/dev/golem15/summercms.io/scratch-33/sm-grzybyfunkcjonalne-app/vue-grzybyfunkcjonalne-app` |
| The plan's name for the Nuxt worktree | `/media/nvme/dev/golem15/summercms.io/scratch-33/vue-grzybyfunkcjonalne-app`, a symlink to the path above |
vue-grzybyfunkcjonalne-app is not a top-level sibling: it is the submodule `vue-grzybyfunkcjonalne-app` of sm-grzybyfunkcjonalne-app (`git@git.golem15.com:golem15/vue-grzybyfunkcjonalne-app.git`, git dir `sm-grzybyfunkcjonalne-app/.git/modules/vue-grzybyfunkcjonalne-app`). Its worktree sits at the submodule path inside the app worktree, because `scripts/build.sh` builds `$ROOT/vue-grzybyfunkcjonalne-app` and git refuses a symlink at a submodule path (`expected submodule path ... not to be a symbolic link`).
## Commands
```sh
S=/media/nvme/dev/golem15/summercms.io/summercms
SC=/media/nvme/dev/golem15/summercms.io/scratch-33
APP=$S/sm-grzybyfunkcjonalne-app
W=$SC/sm-grzybyfunkcjonalne-app
mkdir -p $SC
git -C $APP worktree add --detach $W HEAD # 35d3664
git -C $APP/vue-grzybyfunkcjonalne-app worktree add --detach $SC/vue-grzybyfunkcjonalne-app HEAD # e45ffe8
rmdir $W/vue-grzybyfunkcjonalne-app
git -C $APP/vue-grzybyfunkcjonalne-app worktree move $SC/vue-grzybyfunkcjonalne-app $W/vue-grzybyfunkcjonalne-app
ln -s $W/vue-grzybyfunkcjonalne-app $SC/vue-grzybyfunkcjonalne-app
# Go: the sibling plugin checkouts at their committed HEADs, copied into the
# (uninitialised) submodule paths; a symlink there breaks git status.
for p in faq journal menu seo sitemap translate user; do
rmdir $W/plugins/golem15/$p && mkdir $W/plugins/golem15/$p
git -C $S/sm-$p-plugin archive HEAD | tar -x -C $W/plugins/golem15/$p
done
sed -i "s#^replace git.golem15.com/golem15/summercms => ../summercms.go#replace git.golem15.com/golem15/summercms => $S/summercms.go#" $W/go.work
# summer build records the copies as local sources (new descriptions, no
# versions): plugins.gen.go drifts by wiring only, so build.sh's drift
# check is told to look away in this worktree's index. 33-14 regenerates
# plugins.gen.go after the real submodule bumps.
git -C $W update-index --assume-unchanged plugins.gen.go
# Nuxt: the four layers linked to the sibling checkouts.
cat >> $W/vue-grzybyfunkcjonalne-app/pnpm-workspace.yaml <<EOF
overrides:
vue-seo-layer: link:$S/vue-seo-layer
vue-journal-layer: link:$S/vue-journal-layer
vue-menu-layer: link:$S/vue-menu-layer
vue-faq-layer: link:$S/vue-faq-layer
EOF
pnpm -C $W/vue-grzybyfunkcjonalne-app install --no-frozen-lockfile
# Build, check, rehearse (Docker for Postgres).
cd $W
SUMMERCMS_FRAMEWORK=$S/summercms.go bash scripts/build.sh
bash scripts/check-deploy.sh
bash scripts/smoke.sh # default ports 18096 and 13016
SMOKE_KEEP=1 SMOKE_GO_PORT=18196 SMOKE_NUXT_PORT=3016 bash scripts/smoke.sh & # held stack for the SEO checks
bash scripts/smoke-seo.sh http://127.0.0.1:3016
go test ./... ./plugins/grzyby/... && go test -tags summercms_mcp ./...
pnpm -C vue-grzybyfunkcjonalne-app test
pnpm -C vue-grzybyfunkcjonalne-app smoke:ssr && pnpm -C vue-grzybyfunkcjonalne-app smoke:ga
```
Stop a held rehearsal with SIGTERM to its own `bash scripts/smoke.sh` (the parent of the Go process on its port), never by pattern: 33-12 runs its own smoke at the same time.
## Inputs at the time
| Repository | Commit |
|------------|--------|
| summercms.go | `617e15d` (v0.6.0 plus phase 33) |
| sm-seo-plugin | `49cc241` |
| sm-sitemap-plugin | `9e5c393` |
| sm-journal-plugin | `4f5bd19` |
| sm-menu-plugin, sm-faq-plugin, sm-translate-plugin, sm-user-plugin | `98df4c7`, `3bf54cd`, `7e64224`, `97f83cc` (their tags v0.1.2, v0.1.2, v0.1.3, v0.1.19) |
| vue-seo-layer, vue-journal-layer, vue-menu-layer, vue-faq-layer | `7af91fc`, `1080a3f`, `8b5da67`, `f7ec4fe` (linked, working trees clean) |
## Ports
| Use | Go | Nuxt |
|-----|----|------|
| `scripts/smoke.sh` defaults | 18096 | 13016 |
| Held rehearsal for `smoke-seo.sh` | 18196 | 3016 (the plan's port) |
| Baseline of the 2026-10-31 production build | 18296 | 13996 |
The demo stack of 33-12 used 3020 (Nuxt) and its own Go port at the same time; none of these clash with it or with the other local services (8080, 8120, 3000, 5432).
## Baseline ("before") run
To compare the heads with what production serves today, the live checkout's own Oct 31 build (`bin/grzybyfunkcjonalne`, `build/nuxt/.output`) ran in its unchanged rehearsal from a scratchpad copy (`git archive HEAD config deploy scripts`, symlinks to `bin/`, `build/nuxt` and `plugins/grzyby`, a hold loop appended to the copied `smoke.sh`): `smoke: ok (107 urls)`. The live repository was only read.
## Patches
```sh
cd $W && git add -N config/golem15.journal.yaml config/golem15.sitemap.yaml deploy/seo-pages.csv scripts/smoke-seo.sh
git diff --binary -- . ':(exclude)go.work' ':(exclude)vue-grzybyfunkcjonalne-app' ':(exclude)plugins/golem15' ':(exclude)plugins.gen.go' \
> $S/summercms.go/.planning/phases/33-seo-output-audit-and-content/33-13-sm-grzybyfunkcjonalne-app.patch
cd $W/vue-grzybyfunkcjonalne-app && git add -N tests/fixtures/api/seo
git diff --binary -- . ':(exclude)pnpm-lock.yaml' ':(exclude)pnpm-workspace.yaml' \
> $S/summercms.go/.planning/phases/33-seo-output-audit-and-content/33-13-vue-grzybyfunkcjonalne-app.patch
git -C $APP apply --check <app patch> && git -C $APP/vue-grzybyfunkcjonalne-app apply --check <nuxt patch> # both pass
```
Left out on purpose: `go.work` (framework replace), `plugins.gen.go` (wiring drift), the submodule pointers, `pnpm-lock.yaml` and `pnpm-workspace.yaml` (link overrides). The pin bumps (go.mod requires, submodule pointers, `package.json` layer tags, the lockfile) are 33-14's.
## Cleanup (after Task 4 or the deferral)
```sh
unlink $SC/vue-grzybyfunkcjonalne-app # the symlink
git -C $APP/vue-grzybyfunkcjonalne-app worktree remove --force $W/vue-grzybyfunkcjonalne-app
git -C $APP worktree remove --force $W
git -C $APP worktree list; git -C $APP/vue-grzybyfunkcjonalne-app worktree list
```
`--force` because both worktrees hold the uncommitted wiring and patch sources; the patches are committed in summercms.go first.

View File

@@ -128,3 +128,34 @@ Out-of-scope discoveries logged during execution; not fixed in the plan that fou
status: open
- **Possible fix:** 33-14 decides per app: add `nodynamic` to `scripts/build.sh` (and summer.yaml `build.tags`), or change the DEPLOY.md table to "dynamically linked (glibc)".
- **Why deferred:** the linking decision is 33-14's (33-11).
## From 33-13 (grzybyfunkcjonalne.pl on local links)
- **An enabled locale without content gives every page an `/en/` hreflang link and sitemap address (sm-seo-plugin, sm-sitemap-plugin).** sm-grzybyfunkcjonalne-app's translate plugin kept its seeded `en` row enabled (migrate.sh only made `pl` the default). Every record then counts as available in `en` through fallback: post pages render `<link rel="alternate" hreflang="en" href="…/en/blog/…">` and `sitemap-posts-1.xml` lists each post twice, with `x-default` on the `/en/` address, all 404 on the Polish-only site. The 33-13 patch makes `pl` the only enabled locale in migrate.sh step 3 and in a DEPLOY.md release step (`UPDATE golem15_translate_locales SET is_enabled = (code = 'pl')`).
status: open
- **Possible fix:** list a locale's address only when the record has content in it (a translation row, or the default locale), not through fallback.
- **Why deferred:** a plugin behaviour change; the site is fixed by its data.
- **Saving a registry page through `PUT /_seo/api/v1/pages/{id}` writes `updated_at` in local time (sm-seo-plugin).** In the 33-13 rehearsal (database in UTC, machine in CET), the renamed `/trwaja-prace` got `updated_at` 17:58:54 while the route-reported pages got 16:58:54, so `sitemap-pages-1.xml` and the index carried a lastmod one hour in the future.
status: open
- **Possible fix:** write UTC (or a `timestamptz` column) on the page update path, as the route report does.
- **Why deferred:** a plugin bug outside 33-13's files; the lastmod corrects itself on the next content change.
- **`/` as a registry page loses the home title template (sm-seo-plugin).** Once the route report registers `/` ("Strona główna"), its title comes from the record through `title_template` ("Strona główna | Grzyby Funkcjonalne") instead of `home_template` ("Witamy | %site%"). 33-13's `deploy/seo-pages.csv` sets the home title explicitly.
status: open
- **Possible fix:** the home page keeps `home_template` unless its record sets a title.
- **Why deferred:** a resolver precedence question for the plugin.
- **The route report names pages without diacritics (sm-seo-plugin).** `/trwaja-prace` becomes "Trwaja prace", shown in the HTML sitemap, the breadcrumbs and the WebPage node. 33-13 renames it in SEO › Pages (DEPLOY.md step).
status: open
- **Possible fix:** the layer reports each static page's title (its page meta) with the path.
- **Why deferred:** a contract change across vue-seo-layer and sm-seo-plugin.
- **No personal-token scope covers the SEO or sitemap management API (sm-seo-plugin, sm-sitemap-plugin).** `admin:token:scopes` lists `*`, `admin:read`, `journal` and `journal:read` only, so a script that imports a CSV or edits sitemap settings needs a full-scope token. smoke.sh creates one and revokes it after its steps.
status: open
- **Possible fix:** declare `seo`, `seo:read`, `sitemap` and `sitemap:read` scopes.
- **Why deferred:** a plugin feature.
- **`journal:image-variants` cannot run from the generated CLI (framework or sm-journal-plugin).** It stops with `journal: database is not configured`, like `journal:reindex` (which grzyby wraps as `grzyby:reindex`). The one-time backfill of existing featured images that 33-11 names needs a wrapper or a framework fix; new uploads get their variants from the worker in `serve`.
status: open
- **Possible fix:** the generated CLI opens the database for plugin commands, or the app adds `grzyby:image-variants`.
- **Why deferred:** decided with 33-14's release steps.
- **The Journal's seeded `uncategorized` category is listed in `sitemap-categories-1.xml` (sm-grzybyfunkcjonalne-app data).** It has no posts and the PHP sitemap never listed it (7 categories), but `/uncategorized` answers 200 and the per-type file lists every published category.
status: open
- **Possible fix:** delete the empty seeded category on the server, or mark it noindex in its SEO tab.
- **Why deferred:** an editorial data decision for Jakub.