From 3d729236172a39327b5ed6aca1112e7b7905ca9f Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Wed, 4 Nov 2026 20:25:45 +0100 Subject: [PATCH] docs(33-14): validation map --- .../33-VALIDATION.md | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/.planning/phases/33-seo-output-audit-and-content/33-VALIDATION.md b/.planning/phases/33-seo-output-audit-and-content/33-VALIDATION.md index 7cd80143..b0431816 100644 --- a/.planning/phases/33-seo-output-audit-and-content/33-VALIDATION.md +++ b/.planning/phases/33-seo-output-audit-and-content/33-VALIDATION.md @@ -3,9 +3,9 @@ phase: "33" slug: "seo-output-audit-and-content" # status lifecycle: draft (seeded by plan-phase) → validated (set by validate-phase §6) # audit-milestone §5.5 distinguishes NOT-VALIDATED (draft) from PARTIAL (validated + nyquist_compliant: false) (#2117) -status: draft -nyquist_compliant: false -wave_0_complete: false +status: validated +nyquist_compliant: true +wave_0_complete: true created: "2026-10-28" --- @@ -42,36 +42,37 @@ Filled by the planner per task. Decision → test map from research: | Decision | Behavior | Test Type | Automated Command | File Exists | Status | |----------|----------|-----------|-------------------|-------------|--------| -| D-30 | index + per-type files, stable numbering after delete, lastmod only on real change | integration | `go test ./... -run 'TestSitemapIndex\|TestStableNumbering\|TestLastmod'` (sm-sitemap-plugin) | ❌ W0 | ⬜ pending | -| D-31 | image ≤1000/url, news 2-day window, IndexNow ping on diff | unit + integration | `go test ./... -run 'TestImageSitemap\|TestNewsSitemap\|TestIndexNow'` | ❌ W0 | ⬜ pending | -| D-32 | no priority/changefreq/XSL; url items migrated | integration | `go test ./... -run TestMigrateDefinitions` | ❌ W0 | ⬜ pending | -| D-95/D-24 | SEO filter excludes noindex/canonicalised/redirected; sitemap works without SEO | integration | `go test ./... -run 'TestFilterExcludes\|TestNoFilter'` | ❌ W0 | ⬜ pending | -| D-33 | registry pages resolve; route report upserts | integration | `go test ./... -run TestRegistry` (sm-seo-plugin) | ❌ W0 | ⬜ pending | -| D-43..46 | @graph per kind with @id links; invalid custom JSON-LD refused | unit | `go test ./classes/schema/...` | ❌ W0 | ⬜ pending | -| D-55..57 | alternates only for translated locales; x-default = default | integration | `go test ./... -run TestAlternates` | ❌ W0 | ⬜ pending | -| D-40..42 | `?page=1` → 301; form normalisation; suffix templates | integration | `go test ./... -run TestPagination` | ❌ W0 | ⬜ pending | -| D-50/51 | H1→H2 on every write path; command dry run | integration | `go test ./... -run TestHeadingConversion` (Journal) | ❌ W0 | ⬜ pending | -| D-70 | build fails for indexable `ssr:false` / `.client.vue`; passes when noindex | build smoke | fixture playground builds (expect exit 1/0) | ❌ W0 | ⬜ pending | -| D-20a/D-08/D-103 | middleware 301/410, X-Robots-Tag, verification file at root, cache purge | SSR smoke | `node testing/smoke-ssr.mjs --expect testing/expect-seo.txt` | ❌ W0 | ⬜ pending | -| D-43 (layer) | exactly one ld+json script, one canonical | SSR smoke | same expect file | ❌ W0 | ⬜ pending | -| D-80/81/52 | one anchor per card, H2 cards, no generic anchor | SSR smoke + unit | journal layer `pnpm test` + smoke | ❌ W0 | ⬜ pending | -| D-14 | crawler finds planted issues; each issue has a tool or `fix: code` | integration | `go test ./... -run TestCrawler` | ❌ W0 | ⬜ pending | -| D-10 | every new admin operation has an MCP tool | unit | `go test -short ./... -run TestEveryAdminOperationHasTool` | ✅ (extend) | ⬜ pending | -| D-82/83 | autolink rules; outbound rel | unit | `pnpm test` (vue-seo-layer / journal layer) | ❌ W0 | ⬜ pending | -| D-72 | bm serves `Disallow: /` and noindex | smoke | `curl -sI` in check script | ❌ W0 | ⬜ pending | -| D-90/D-106 | framework additions generic and additive | gate | `scripts/check-phase33.sh --marker --additive` | ❌ W0 | ⬜ pending | +| D-30 | index + per-type files, stable numbering after delete, lastmod only on real change | integration + unit | sm-sitemap-plugin: `go test -count=1 -run 'TestSitemapIndex\|TestStableNumbering\|TestLastmod\|TestExtraDuplicates' .`; `go test -short ./classes -run 'TestAssignSlots\|TestRealChanges\|TestWriteURLSet'` | ✅ | ✅ green | +| D-31 | image ≤1000/url, news 2-day window, IndexNow ping on diff | unit + integration | sm-sitemap-plugin: `go test -count=1 -run 'TestImageSitemap\|TestNewsSitemap\|TestIndexNow' .`; `go test -short ./classes -run 'TestWriteImageURLSet\|TestNewsLimits\|TestIndexNowBatches\|TestIndexNowOutcome'` | ✅ | ✅ green | +| D-32 | no priority/changefreq/XSL; url items migrated | integration + unit | sm-sitemap-plugin: `go test -count=1 -run TestMigrateDefinitions .`; `go test -short ./classes -run TestWriteURLSet` | ✅ | ✅ green | +| D-95/D-24 | SEO filter excludes noindex/canonicalised/redirected; sitemap works without SEO | integration | sm-sitemap-plugin `go test -count=1 -run 'TestFilterExcludes\|TestNoFilter' .`; sm-seo-plugin `go test -count=1 -run 'TestSitemapFilterTracer\|TestFilterReasons' .` | ✅ | ✅ green | +| D-33 | registry pages resolve; route report upserts | integration + unit | sm-seo-plugin `go test -count=1 -run 'TestRegistry\|TestRegistryTimestampsUTC\|TestRouteReport' .`; vue-seo-layer `npm run test` (routes.test.ts, locale copies left out) | ✅ | ✅ green | +| D-43..46 | @graph per kind with @id links; invalid custom JSON-LD refused | unit + integration | sm-seo-plugin `go test -short ./classes/schema/...`; `go test -count=1 -run 'TestGraphTracer\|TestGraphPerKind\|TestCustomJSONLD' .`; elements `npm run test` (schema, graph) | ✅ | ✅ green | +| D-55..57 | alternates only for translated locales; x-default = default | unit + integration | sm-seo-plugin `go test -short ./classes -run TestAlternates`; `go test -count=1 -run TestPagedAlternates .`; sm-sitemap-plugin `go test -count=1 -run TestHreflangAlternates .` | ✅ | ✅ green | +| D-40..42 | `?page=1` → 301; form normalisation; suffix templates | unit + integration | sm-seo-plugin `go test -short ./classes -run 'TestParsePage\|TestPageLocation'`; `go test -count=1 -run TestPagination .`; vue-seo-layer usePagination.test.ts | ✅ | ✅ green | +| D-50/51 | H1→H2 on every write path; command dry run | unit + integration | sm-journal-plugin `go test -short ./classes -run 'TestConvertH1\|TestConvertContentH1\|TestConvertTranslationH1'`; `go test -count=1 -run 'TestHeadingConversion\|TestFixHeadingsCommand' .`; vue-journal-layer postTitle.test.ts | ✅ | ✅ green | +| D-70 | build fails for indexable `ssr:false` / `.client.vue`; passes when noindex; rendered comparison | build smoke + integration | vue-seo-layer `npm run guard:check`; sm-seo-plugin `go test -count=1 -run 'TestRenderSkipped\|TestChromeRenderer' .`, `go test -short ./classes/crawl -run 'TestCompareRendered\|TestAllowRequest\|TestResolverRules\|TestNewRenderer'` | ✅ | ✅ green | +| D-20a/D-08/D-103 | middleware 301/410, X-Robots-Tag, verification file at root, cache purge | SSR smoke | vue-seo-layer `npm run smoke:ssr` and `npm run purge:check` | ✅ | ✅ green | +| D-43 (layer) | exactly one ld+json script, one canonical | SSR smoke | vue-seo-layer `npm run smoke:ssr` (expect-seo.txt); demo `SMOKE_SEO_STRICT=1 scripts/smoke-seo.sh` (33-14 rehearsal) | ✅ | ✅ green | +| D-80/81/52 | one anchor per card, H2 cards, no generic anchor | SSR smoke + unit | vue-journal-layer `npm run test` and its five smoke expectation files (check-phase33.sh --layers); vue-faq-layer block.test.ts; sm-journal-plugin editor outline/forms tests | ✅ | ✅ green | +| D-14 | crawler finds planted issues; each issue has a tool or `fix: code` | unit + integration | sm-seo-plugin `go test -short ./classes/crawl/...`; `go test -count=1 -run 'TestCrawlerTracer\|TestCrawlerChecks' .` | ✅ | ✅ green | +| D-10 | every new admin operation has an MCP tool | unit | sm-seo-plugin `go test -short -run TestEveryAdminOperationHasTool .`; sm-sitemap-plugin `go test -count=1 -run TestSitemapTools .`; sm-journal-plugin `go test -count=1 -run TestJournalSettingsTools .` | ✅ | ✅ green | +| D-82/83 | autolink rules; outbound rel | unit + integration | sm-seo-plugin `go test -short ./classes -run 'TestValidAutolinkURL\|TestNormalizeAutolink'`, `go test -count=1 -run 'TestAutolinks\|TestLinkSuggestions' .`; vue-seo-layer and vue-journal-layer `npm run test` | ✅ | ✅ green | +| D-72 | bm serves `Disallow: /` and noindex | smoke | sm-bm-app `scripts/check-noindex.sh` (33-12) | ✅ | ✅ green | +| D-90/D-106 | framework additions generic and additive | gate | `scripts/check-phase33.sh --marker --additive --compat` | ✅ | ✅ green | +| SC-4 | unit tests for the phase's code | gate | `scripts/check-phase33.sh --all` (required test names per repository in the go, plugins, layers and docker stages) | ✅ | ✅ green | -*Status: ⬜ pending · ✅ green · ❌ red · ⚠️ flaky* +*Status key: ✅ green · ❌ red · ⚠️ flaky; no row is pending* (filled by plan 33-14 from `scripts/check-phase33.sh --all` on 2026-11-04, Docker and Chromium on the host) --- ## Wave 0 Requirements -- [ ] `scripts/check-phase33.sh` — stage engine from check-phase32.sh plus a `layers` stage -- [ ] sm-sitemap-plugin: retire `classes/golden_test.go` + `testdata/*.golden`; multi-type, multi-locale fixtures -- [ ] vue-seo-layer: `.playground`, `testing/` (smoke-ssr, fixture-api, nuxt-server), fixture resolve answers -- [ ] Build-guard fixture playgrounds (indexable ssr:false → fail; noindex → pass; `.client.vue` → fail) -- [ ] Crawler httptest site with planted issues +- [x] `scripts/check-phase33.sh` — stage engine from check-phase32.sh plus a `layers` stage +- [x] sm-sitemap-plugin: retire `classes/golden_test.go` + `testdata/*.golden`; multi-type, multi-locale fixtures +- [x] vue-seo-layer: `.playground`, `testing/` (smoke-ssr, fixture-api, nuxt-server), fixture resolve answers +- [x] Build-guard fixture playgrounds (indexable ssr:false → fail; noindex → pass; `.client.vue` → fail) +- [x] Crawler httptest site with planted issues --- @@ -87,11 +88,11 @@ Filled by the planner per task. Decision → test map from research: ## Validation Sign-Off -- [ ] All tasks have `` verify or Wave 0 dependencies -- [ ] Sampling continuity: no 3 consecutive tasks without automated verify -- [ ] Wave 0 covers all MISSING references -- [ ] No watch-mode flags -- [ ] Feedback latency < 120s -- [ ] `nyquist_compliant: true` set in frontmatter +- [x] All tasks have `` verify or Wave 0 dependencies +- [x] Sampling continuity: no 3 consecutive tasks without automated verify +- [x] Wave 0 covers all MISSING references +- [x] No watch-mode flags +- [x] Feedback latency < 120s +- [x] `nyquist_compliant: true` set in frontmatter -**Approval:** pending +**Approval:** automated map green (33-14, 2026-11-04); the manual-only rows above are checked at and after the release.