From 9a76c7ec1c0c17e93e00086231af78648eb40c43 Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Sun, 25 Oct 2026 22:25:33 +0100 Subject: [PATCH] docs(32): split SEO into phase 32 and a large phase 33 --- .../phases/32-seo-foundation/32-CONTEXT.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.planning/phases/32-seo-foundation/32-CONTEXT.md b/.planning/phases/32-seo-foundation/32-CONTEXT.md index df43b93b..ec692214 100644 --- a/.planning/phases/32-seo-foundation/32-CONTEXT.md +++ b/.planning/phases/32-seo-foundation/32-CONTEXT.md @@ -1,7 +1,7 @@ # Phase 32: SEO foundation - Context **Gathered:** 2026-10-24 -**Status:** Ready for planning. On 2026-10-25 Jakub resolved the phase split (Q-01), confirmed D-32 and set the code layout (section 0, D-90 to D-97). +**Status:** Ready for planning. On 2026-10-25 Jakub resolved the phase split (Q-01: 32 plus a large 33), confirmed D-32 and set the code layout (section 0, D-90 to D-97). **Participant:** Dawid (SEO specialist, delegated by Jakub for the SEO discussion). The discussion was in Polish; every decision below is recorded in English. @@ -43,25 +43,28 @@ Out of scope: e-commerce structured data and product or category shop pages (no ## Implementation Decisions ### Phase split (resolved) -- **Q-01 (resolved by Jakub, 2026-10-25): three consecutive phases.** Dawid left the split to Jakub. Each phase delivers a working slice that can ship to Płytarium, and every decision in this document applies to all three: +- **Q-01 (resolved by Jakub, 2026-10-25): two consecutive phases, the second one large.** Dawid left the split to Jakub. Every decision in this document applies to both phases: - **32 Foundation:** - the three framework seams (D-91 to D-93), with the field placement rules of D-91; - `sm-seo-plugin` core: data model, SEO tab, global settings; - meta, canonical, robots; - redirects, URL normalisation, strict URLs; - robots.txt, MCP tools, history. - - **33 Output:** + + The seams are one-way framework API. Phase 32 ends with a framework release tag, and Phase 33 builds on that tagged version rather than on a `replace`. + - **33 Output, audit and content** (about 12–15 plans): - `sm-sitemap-plugin` rewrite (D-32): XML and HTML sitemaps; - page registry; - JSON-LD, pagination, hreflang; - headings, breadcrumbs; - - the Nuxt SEO layer and the SSR rules in the layers. - - **34 Audit and content:** + - the Nuxt SEO layer and the SSR rules in the layers; - crawler and issue report; - internal linking and auto-links; - media (alt, file names, formats). - ROADMAP.md still lists one Phase 32 with the full scope. Before `/msd-plan-phase 32`, narrow Phase 32 and add Phases 33 and 34 through `/msd-phase`, with their g15office tasks. The planner must not split or merge phases on its own. + **Exception to the lean-planning rule, approved by Jakub:** Phase 33 is planned as many smaller plans instead of a few large ones, so the planner must not merge them into 3–4 plans. The other project rules still apply: the plan list with a one-line scope each is shown to Jakub before PLAN.md files are written, and unit tests are the last plan. + + ROADMAP.md still lists one Phase 32 with the full scope. Before `/msd-plan-phase 32`, narrow Phase 32 and add Phase 33 through `/msd-phase`, with its g15office task. The planner must not split or merge phases on its own. ### 0. Code layout (Jakub, 2026-10-25) - **D-90:** **The framework carries no SEO code.** SEO lives in two shared plugins: a new `sm-seo-plugin` (Golem15.SEO) and an updated `sm-sitemap-plugin` (Golem15.Sitemap). The framework gets only the generic seams those plugins need (D-91 to D-93); none of them names SEO, and each is useful to other plugins. The pattern is the PixelPixel `mpseo` WinterCMS plugin (see Reference implementations): @@ -90,7 +93,7 @@ Out of scope: e-commerce structured data and product or category shop pages (no - a job that creates missing entries (the `mpseo` GenerateSeoEntriesJob), run through `conga`; - the frontend API: effective SEO by URL, redirects, robots.txt, llms.txt, verification files, JSON-LD `@graph`, breadcrumbs; - admin widgets: the result preview, the placeholder list, revisions; - - MCP through `pier` from its admin routes, plus CSV import/export and the issue report; the crawler (Phase 34) lives here too. + - MCP through `pier` from its admin routes, plus CSV import/export and the issue report; the crawler (Phase 33) lives here too. - **D-95:** **`sm-sitemap-plugin` (Golem15.Sitemap)** produces the sitemaps of D-30, D-31 and D-34 from signpost (D-93). It knows nothing about SEO: it defines its own small filter interface (exclude a URL, noindex, `lastmod` override) and looks it up with `app.Lookup`. `sm-seo-plugin` implements it and requires Sitemap (`Requires()`); Sitemap works without SEO. - **D-96:** **Content plugins keep only their own fixes.** Journal gets the translated-slug fix (D-58), the H1 → H2 conversion (D-50), its schema types and the D-93 descriptors. It does not depend on the SEO plugin. - **D-97:** **The Nuxt side is one new shared layer** (`vue-seo-layer`, name to confirm): `` from the effective-SEO API, redirect middleware, JSON-LD, breadcrumbs, the SSR build guard (D-70). Journal, menu and FAQ layers and the apps extend it.