From 2274cd6b9b82eec8ec6e0629a7a717a4a2c1c1a0 Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Mon, 12 Oct 2026 19:51:07 +0200 Subject: [PATCH] docs(17-06): fill the phase 17 validation map from the gate run --- .../17-blog-companions/17-VALIDATION.md | 77 ++++++++++--------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/.planning/phases/17-blog-companions/17-VALIDATION.md b/.planning/phases/17-blog-companions/17-VALIDATION.md index 7ef454b..84ec8e1 100644 --- a/.planning/phases/17-blog-companions/17-VALIDATION.md +++ b/.planning/phases/17-blog-companions/17-VALIDATION.md @@ -3,10 +3,11 @@ phase: "17" slug: "blog-companions" # 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-11" +validated: "2026-10-12" --- # Phase 17 — Validation Strategy @@ -21,9 +22,9 @@ created: "2026-10-11" |----------|-------| | **Framework** | Go `testing` (+ testcontainers Postgres), vitest (admin SPA), `node --test` (Nuxt layers) | | **Config file** | none for Go; `admin/vite.config` (vitest); layer `package.json` `test` script | -| **Quick run command** | `go test -short ./modules/pact ./modules/cabana/... ./modules//... ./modules//...` (plus the touched plugin repo's `go test -short ./...`) | -| **Full suite command** | `bash scripts/check-phase17.sh --all` (new; staged like `check-phase16.2.sh`) | -| **Estimated runtime** | ~180 seconds (full, with Docker) | +| **Quick run command** | `go test -short ./modules/pact ./modules/party ./modules/signpost ./modules/seaglass ./modules/cabana` (plus the touched plugin repo's `go test -short ./...`) | +| **Full suite command** | `bash scripts/check-phase17.sh --all` (stages self-test, go, plugins, admin, layers, docs, postgres) | +| **Estimated runtime** | ~195 seconds (full, with Docker; measured 3m14s on 2026-10-12) | --- @@ -38,28 +39,28 @@ created: "2026-10-11" ## Per-Task Verification Map -Task IDs filled by the planner (2026-10-11; module names fixed: registry `signpost`, sanitizer `seaglass`). Smoke tests land with the feature task; the full unit tests land in plan 06 (lean rule 2). Plan 06 Task 4 updates File Exists and Status from the gate run. +Filled by plan 06 Task 4 from the `bash scripts/check-phase17.sh --all` run of 2026-10-12 (Docker available, every stage PASS, final line "Phase 17 gate passed"). Commands are the gate's own invocations; each `-run` list is the stage's required-name list, and a name that skips, fails or does not run fails the stage. Smoke tests from plans 01 to 05 keep their names and sit in the same lists. | Task ID | Ref | Behavior | Test Type | Automated Command | File Exists | Status | |---------|-----|----------|-----------|-------------------|-------------|--------| -| 17-01-01 / 17-06-01, 17-06-02 | SC-2/D-01..D-03 | Duplicate type key fails boot; DefaultPattern and PatternFrom boot checks; host override checks; pattern layers incl. PatternFrom inheritance; registry before Boot; ReferenceOptions | unit | `go test -count=1 -short ./modules/signpost ./modules/party -run 'TestSignpostSmoke\|TestRegistry\|TestReferenceOptions\|TestActivateMenuItemTypesOrder'` | ❌ W0 | ⬜ pending | -| 17-01-01 / 17-06-02 | D-08 | dependsOn compile, dependent-options route, save recheck 422 | unit+pg+conformance | `go test -count=1 ./modules/cabana -run 'TestDependentDropdownCompile\|TestCompanionsDependentSmoke\|TestDependentRecheck\|TestPhase10ConformanceInventory'` | ❌ W0 | ⬜ pending | -| 17-01-02 / 17-06-01, 17-06-02 | D-10 | seaglass byte-stable, removal report, bypass corpus; richeditor save gate; settings/relation refusal | unit+pg | `go test -count=1 ./modules/seaglass ./modules/cabana -run 'TestSeaglassSmoke\|TestSanitize\|TestCheck\|TestRichEditor\|TestCompanionsRichEditorSmoke'` | ❌ W0 | ⬜ pending | -| 17-01-03 / 17-06-02 | D-07 | Repeater compile refusals, decode, per-row errors, min/max, nested notices and recheck | unit+pg | `go test -count=1 ./modules/cabana -run 'TestRepeater\|TestCompanionsRepeaterSmoke'` | ❌ W0 | ⬜ pending | -| 17-01-04 / 17-06-02 | D-09, D-11 | Reorder exact set, 409 stale/foreign, 422 cycle/depth, both columns; singleton first-or-create, 404 list/delete | pg | `go test -count=1 ./modules/cabana -run 'TestReorder\|TestSingleton\|TestCompanionsReorderSmoke\|TestCompanionsSingletonSmoke\|TestPhase10OpenAPIConformance'` | ❌ W0 | ⬜ pending | -| 17-02-02..04 / 17-06-02 | D-06..D-11 (SPA) | RichEditorField (untouched byte-identical), RepeaterField, dependent dropdown states, ReorderView, singleton form | vitest | `npm --prefix admin run typecheck && npm --prefix admin test` | ❌ W0 | ⬜ pending | -| 17-02-05 | D-06 | dist and OpenAPI in sync before the tag | script | `bash scripts/check-admin-dist.sh && bash scripts/check-admin-openapi.sh --check` | ✅ | ⬜ pending | -| 17-03-01, 17-03-02 / 17-06-03 | D-04 | Journal 5 types: DefaultPattern on each, list children follow the record type host pattern and the item override, references, nesting, list order, published filters, alternates order, x-default | unit+pg | `go -C ../sm-journal-plugin test -count=1 -run 'TestMenuItemTypes' ./...` | ❌ W0 | ⬜ pending | -| 17-03-01, 17-03-03 / 17-06-03 | SC-3 | Sitemap golden parity, Url::to table, tiers, rewrite, 50k cap | unit (goldens) | `go -C ../sm-sitemap-plugin test -count=1 -short -run 'TestSitemapGolden\|TestURLTo\|TestTiers\|TestRewrite\|TestURLCap' ./...` | ❌ W0 | ⬜ pending | -| 17-03-03 / 17-06-03 | D-14 | XmlEscaping and MassAssignment spec ports; BeforeAddItem skip, AddItem extra; manifest; tolerant item JSON | unit | `go -C ../sm-sitemap-plugin test -count=1 -short -run 'TestXMLEscaping\|TestFillable\|TestHooks\|TestManifest\|TestDefinitionItemJSON' ./...` | ❌ W0 | ⬜ pending | -| 17-03-03, 17-03-04 / 17-06-03 | SC-1, D-11..D-13 | sitemap:import and sitemap:import-winter; singleton admin; settings | pg | `go -C ../sm-sitemap-plugin test -count=1 -run 'TestSitemapImportSmoke\|TestSitemapAdminSmoke\|TestImportWinter' .` | ❌ W0 | ⬜ pending | -| 17-04-01..03 / 17-06-03 | SC-1, D-05, D-07..D-10 | FAQ and menu admin, PHP save rules, URL scheme, reorder per menu, Winter imports | pg | `go -C ../sm-faq-plugin test -count=1 ./... && go -C ../sm-menu-plugin test -count=1 ./...` | ❌ W0 | ⬜ pending | -| 17-04-05 / 17-06-03 | D-16 | Menu API tree, published filter, URL scheme filter, expansion, locale, url_pattern | pg | `go -C ../sm-menu-plugin test -count=1 -run 'TestMenuAPI\|TestMenuTree\|TestAllowedURL' ./...` | ❌ W0 | ⬜ pending | -| 17-04-05 / 17-06-03 | D-17 | FAQ API locale default, active only, lowest id, sanitized output (raw-SQL rows) | pg | `go -C ../sm-faq-plugin test -count=1 -run 'TestFaqAPI' ./...` | ❌ W0 | ⬜ pending | -| 17-05-03 / 17-06-04 | D-18 | Layer clients, link safety, active matching, SSR smoke | node test | `pnpm -C ../vue-menu-layer test && pnpm -C ../vue-faq-layer test` | ❌ W0 | ⬜ pending | -| 17-05-02 / 17-06-03 | SC-4, D-19 | Host boot with three plugins; imports of export-shaped fixtures; menu, FAQ and sitemap from the host; CORS | pg/host | `go -C ../sm-grzybyfunkcjonalne-app test -count=1 ./...` | partial | ⬜ pending | -| 17-05-04 | SC-4, D-15 | Site app uses MenuNav and FaqBlock, data files removed, Nuxt sitemap off | node test + SSR smoke | `pnpm -C ../sm-grzybyfunkcjonalne-app/vue-grzybyfunkcjonalne-app test && pnpm -C ../sm-grzybyfunkcjonalne-app/vue-grzybyfunkcjonalne-app smoke:ssr` | ✅ | ⬜ pending | -| 17-06-01..04 | SC-5 | Phase gate, fail-closed | script | `bash scripts/check-phase17.sh --all` | ❌ W0 | ⬜ pending | +| 17-01-01 / 17-06-01, 17-06-02 | SC-2/D-01..D-03 | Duplicate type key fails boot naming both plugins; empty key, nil Resolve, empty/relative DefaultPattern, bad PatternFrom, unknown/relative host override; pattern layers incl. PatternFrom; registry before the first Boot; ReferenceOptions depths; Option.Depth omitempty | unit | `go test -short -count=1 -run '^(TestSignpostSmoke\|TestRegistryDuplicateKey\|TestRegistryActivate\|TestRegistryHostOverrideUnknown\|TestRegistryPatternLayers\|TestReferenceOptions)$' ./modules/signpost` + `-run '^(TestActivateMenuItemTypesOrder)$' ./modules/party` + `-run '^(TestOptionDepthOmitEmpty\|TestMenuItemTypeContracts)$' ./modules/pact` (gate `go`) | ✅ | ✅ green | +| 17-01-01 / 17-06-02 | D-08 | dependsOn compile refusals, dependent field paths, value normalization and the save recheck (Docker-free); options route, 404/401, recheck 422 and null on Postgres | unit+pg | `go test -short -run '^(TestDependentDropdownCompile\|TestDependentValues)$' ./modules/cabana` (gate `go`); `go test -run '^(TestCompanionsDependentSmoke\|TestDependentRecheck)$' ./modules/cabana` (gate `postgres`) | ✅ | ✅ green | +| 17-01-02 / 17-06-01, 17-06-02 | D-10 | seaglass byte-stable, removal report, bypass corpus, Check; richeditor keys, notices and value check; settings and relation forms refuse the type; save stores clean value with notices | unit+pg | `go test -short -run '^(TestSeaglassSmoke\|TestSanitizeByteStable\|TestSanitizeReport\|TestSanitizeBypassCorpus\|TestCheck)$' ./modules/seaglass` + `-run '^(TestRichEditorCompile)$' ./modules/cabana` (gate `go`); `-run '^(TestCompanionsRichEditorSmoke\|TestRichEditor)$' ./modules/cabana` (gate `postgres`) | ✅ | ✅ green | +| 17-01-03 / 17-06-02 | D-07 | Repeater compile refusals (every key and nested type), decode, coercion, per-row required paths, min/max, nested notices; save through the route with nothing written on refusal | unit+pg | `go test -short -run '^(TestRepeaterCompile\|TestRepeaterDecode)$' ./modules/cabana` (gate `go`); `-run '^(TestCompanionsRepeaterSmoke\|TestRepeaterSave)$' ./modules/cabana` (gate `postgres`) | ✅ | ✅ green | +| 17-01-04 / 17-06-02 | D-09, D-11 | Reorder config boot checks; exact set, 409 stale/foreign/unknown, 422 cycle/duplicate/self/outside/maxDepth, both columns, nothing written on refusal; singleton boot rules, first-or-create once (also under concurrent first opens), 404 list/create/delete/bulk; conformance of the documented 404/409/422 answers | unit+pg+conformance | `go test -short -run '^(TestReorderConfigCompile\|TestSingletonCompile\|TestPhase10ConformanceInventory)$' ./modules/cabana` (gate `go`); `-run '^(TestCompanionsReorderSmoke\|TestCompanionsSingletonSmoke\|TestReorderPostgres\|TestSingleton\|TestPhase10OpenAPIConformance)$' ./modules/cabana` (gate `postgres`) | ✅ | ✅ green | +| 17-02-02..04 / 17-06-02 | D-06..D-11 (SPA) | RichEditorField (untouched byte-identical, empty paragraph "", lossy note, link allowlist, notices callout, chunk failure fallback), RepeaterField (bounds, remove confirm, keyboard/button reorder, collapsed rows), DependentDropdown (every state, last request wins, stale value), ReorderView (debounced full-set POST, revert, 409 reload, announcements, partition switch, tree rules), SingletonForm | vitest | `npm --prefix admin run typecheck && npm --prefix admin test` (gate `admin`: vue-tsc plus the vitest JSON report with 5 required spec files and 46 required test names) | ✅ | ✅ green | +| 17-02-05 | D-06 | dist and OpenAPI in sync | script | `bash scripts/check-admin-dist.sh && bash scripts/check-admin-openapi.sh --check` (gate `docs`) | ✅ | ✅ green | +| 17-03-01, 17-03-02 / 17-06-03 | D-04 | Journal 5 types: registration, ordered pattern fill, date parts only when published, alternates and fallbacks (Docker-free); host override of one record type reaching only its lists, item/list-key overrides, references, nesting, order ties, published filters, descendants, alternates in sort_order with ties by id | unit+pg | `go -C ../sm-journal-plugin test -short -run '^(TestMenuItemTypesPatterns)$' ./classes` (gate `plugins`); `go -C ../sm-journal-plugin test -run '^(TestMenuItemTypesSmoke\|TestMenuItemTypes)$' .` (gate `postgres`) | ✅ | ✅ green | +| 17-03-01, 17-03-03 / 17-06-03 | SC-3 | Sitemap golden parity, Url::to golden table, tiers, rewrite, 50k cap | unit (goldens) | `go -C ../sm-sitemap-plugin test -short -run '^(TestSitemapGolden\|TestSitemapTiersConfig\|TestURLTo\|TestXMLEscaping\|TestTiers\|TestRewrite\|TestHooks\|TestManifest\|TestURLCap)$' ./classes` (gate `plugins`) | ✅ | ✅ green | +| 17-03-03 / 17-06-03 | D-14 | XmlEscaping and MassAssignment ports; BeforeAddItem skip, AddItem extra; manifest; tolerant item JSON; trusted forwarded proto | unit | `go -C ../sm-sitemap-plugin test -short -run '^(TestFillable\|TestDefinitionItemJSON)$' ./models` + `-run '^(TestBackendURL)$' .` (gate `plugins`) | ✅ | ✅ green | +| 17-03-03, 17-03-04 / 17-06-03 | SC-1, D-11..D-13 | sitemap:import and sitemap:import-winter (maps, drops, --theme, --dry-run, --force, settings upsert, refusals); singleton admin; settings | pg | `go -C ../sm-sitemap-plugin test -run '^(TestSitemapTracer\|TestSitemapImportSmoke\|TestSitemapAdminSmoke\|TestImportWinter)$' .` (gate `postgres`) | ✅ | ✅ green | +| 17-04-01..03 / 17-06-03 | SC-1, D-05, D-07..D-10 | FAQ and menu admin, PHP beforeSave rules, URL scheme, reorder per menu, Winter imports and their edge cases | unit+pg | `go -C ../sm-menu-plugin test -short -run '^(TestMenuEntryModel)$' ./models`, `go -C ../sm-faq-plugin test -short -run '^(TestFaqContentDecode)$' ./console` + `-run '^(TestFaqModel)$' ./models` (gate `plugins`); `go -C ../sm-menu-plugin test -run '^(TestMenuAdminSmoke\|TestMenuImportSmoke\|TestMenuEntryBeforeSave\|TestMenuImport)$' .`, `go -C ../sm-faq-plugin test -run '^(TestFaqAdminSmoke\|TestFaqImportSmoke\|TestFaqImport)$' .` (gate `postgres`) | ✅ | ✅ green | +| 17-04-05 / 17-06-03 | D-16 | Menu API tree, published filter, URL scheme filter, expansion, locale, url_pattern, JSON 404s | unit+pg | `go -C ../sm-menu-plugin test -short -run '^(TestAllowedURL\|TestMenuTree)$' ./classes` (gate `plugins`); `go -C ../sm-menu-plugin test -run '^(TestMenuAPISmoke\|TestMenuAPI)$' .` (gate `postgres`) | ✅ | ✅ green | +| 17-04-05 / 17-06-03 | D-17 | FAQ API locale default, active only, lowest active id, sanitized output (raw-SQL rows), JSON 404s | unit+pg | `go -C ../sm-faq-plugin test -short -run '^(TestFaqSerialize)$' ./controllers/api` (gate `plugins`); `go -C ../sm-faq-plugin test -run '^(TestFaqAPISmoke\|TestFaqAPI)$' .` (gate `postgres`) | ✅ | ✅ green | +| 17-05-03 / 17-06-04 | D-18 | Layer clients and composable bases, link safety, active and trail matching, rendered markup | node test | `pnpm -C ../vue-menu-layer test && pnpm -C ../vue-faq-layer test` (gate `layers`: TAP with 2 + 1 required files and 24 + 11 required names) | ✅ | ✅ green | +| 17-05-02 / 17-06-03 | SC-4, D-19 | Host boot with the plugins; imports of export-shaped fixtures; menu, FAQ and sitemap from the host; CORS preflight and simple requests; sitemap headers | unit+pg/host | `go -C ../sm-grzybyfunkcjonalne-app test -short -run '^(TestBootUserTranslateJournal\|TestBackendURIGfadmin\|TestGrzybyCommandsRegistered\|TestCORS)$' .` (gate `plugins`); `-run '^(TestCompanionsHost)$' .` (gate `postgres`) | ✅ | ✅ green | +| 17-05-04 | SC-4, D-15 | Site app uses MenuNav and FaqBlock, data files removed, Nuxt sitemap off | node test + SSR smoke | `pnpm -C ../sm-grzybyfunkcjonalne-app/vue-grzybyfunkcjonalne-app test && pnpm -C ../sm-grzybyfunkcjonalne-app/vue-grzybyfunkcjonalne-app smoke:ssr` (run by plan 05, site-ok; outside the gate) | ✅ | ✅ green (17-05) | +| 17-06-01..04 | SC-5 | Phase gate, fail-closed; detectors proven on planted output | script | `bash scripts/check-phase17.sh --all` (PHASE17_REQUIRE_POSTGRES=1 for a strict run) | ✅ | ✅ green | *Status: ⬜ pending · ✅ green · ❌ red · ⚠️ flaky* @@ -67,10 +68,10 @@ Task IDs filled by the planner (2026-10-11; module names fixed: registry `signpo ## Wave 0 Requirements -- [ ] `scripts/check-phase17.sh` — staged gate (copy the 16.2 structure, named-test PASS checks) -- [ ] PHP golden generator (e.g. `../sm-sitemap-plugin/tests/php/gen-goldens.php`) plus committed `testdata/*.golden` -- [ ] `go.work` per new plugin repo (`use .` + replaces to `../summercms.go`, `../sm-translate-plugin`) -- [ ] Test harness per plugin (`TestMain` with `flag.Parse()` + `testing.Short()`) +- [x] `scripts/check-phase17.sh` — staged gate (stages go, plugins, admin, layers, docs, postgres; `--self-test`, `--all`) (17-06-01) +- [x] PHP golden generator `../sm-sitemap-plugin/tests/php/gen-goldens.php` plus committed `classes/testdata/*.golden` (17-03-01) +- [x] `go.work` per new plugin repo (`use .` + replaces to `../summercms.go`, `../sm-translate-plugin`) (17-03, 17-04) +- [x] Test harness per plugin (`TestMain` with `flag.Parse()` + `testing.Short()`): sitemap, menu and FAQ from plans 03/04; Journal's three harnesses corrected in 17-06-03 --- @@ -78,18 +79,18 @@ Task IDs filled by the planner (2026-10-11; module names fixed: registry `signpo | Behavior | Requirement | Why Manual | Test Instructions | |----------|-------------|------------|-------------------| -| Menu and FAQ render from the API on grzybyfunkcjonalne.pl | SC-4 | Needs the deployed site and nginx routing | Load the homepage and FAQ page, compare with the PHP rendering | -| `/sitemap.xml` via nginx equals the expected golden; robots.txt Sitemap line | SC-3/SC-4 | Needs the on-server route | Extend `scripts/smoke.sh`, diff against the golden | +| Menu and FAQ render from the API on grzybyfunkcjonalne.pl | SC-4 | Needs the deployed site and nginx routing | Load the homepage and FAQ page, compare with the PHP rendering. Plan 05 human check: UAT smoke 105/105 through nginx, human reply "vhost installed, all passes, i see sitemap loading, all plugins in backend etc"; header and FAQ interaction stays for /msd-verify-work (17-05 coverage D7) | +| `/sitemap.xml` via nginx equals the expected golden; robots.txt Sitemap line | SC-3/SC-4 | Needs the on-server route | Extend `scripts/smoke.sh`, diff against the golden. Plan 05 human check: loc set of UAT equals live modulo host apart from one UAT-only post (17-05 coverage D6) | --- ## 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 < 60s -- [ ] `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 < 60s (quick loop; the full gate with Docker takes about 3 minutes) +- [x] `nyquist_compliant: true` set in frontmatter -**Approval:** pending +**Approval:** validated 2026-10-12 by plan 17-06 (gate run: every stage PASS with Docker, "Phase 17 gate passed")