docs(17): re-verify phase 17 — passed, release gap closed
This commit is contained in:
228
.planning/phases/17-blog-companions/17-VERIFICATION.md
Normal file
228
.planning/phases/17-blog-companions/17-VERIFICATION.md
Normal file
@@ -0,0 +1,228 @@
|
||||
---
|
||||
phase: 17-blog-companions
|
||||
verified: 2026-10-19T10:31:07Z
|
||||
status: passed
|
||||
score: 6/6 must-haves verified
|
||||
covered_files:
|
||||
- .planning/phases/17-blog-companions/17-01-PLAN.md
|
||||
- .planning/phases/17-blog-companions/17-01-SUMMARY.md
|
||||
- .planning/phases/17-blog-companions/17-02-PLAN.md
|
||||
- .planning/phases/17-blog-companions/17-02-SUMMARY.md
|
||||
- .planning/phases/17-blog-companions/17-03-PLAN.md
|
||||
- .planning/phases/17-blog-companions/17-03-SUMMARY.md
|
||||
- .planning/phases/17-blog-companions/17-04-PLAN.md
|
||||
- .planning/phases/17-blog-companions/17-04-SUMMARY.md
|
||||
- .planning/phases/17-blog-companions/17-05-PLAN.md
|
||||
- .planning/phases/17-blog-companions/17-05-SUMMARY.md
|
||||
- .planning/phases/17-blog-companions/17-06-PLAN.md
|
||||
- .planning/phases/17-blog-companions/17-06-SUMMARY.md
|
||||
- .planning/phases/17-blog-companions/17-REVIEW-DISPOSITION.md
|
||||
- .planning/phases/17-blog-companions/17-REVIEW-FIX.md
|
||||
- .planning/phases/17-blog-companions/17-REVIEW.md
|
||||
- .planning/phases/17-blog-companions/17-VALIDATION.md
|
||||
- admin/src/views/ListView.vue
|
||||
- admin/src/views/ReorderView.vue
|
||||
- admin/src/views/SettingsIndexView.vue
|
||||
- modules/cabana/field_dependent.go
|
||||
- modules/cabana/field_repeater.go
|
||||
- modules/cabana/field_richeditor.go
|
||||
- modules/cabana/reorder.go
|
||||
- modules/cabana/singleton.go
|
||||
- modules/pact/capabilities.go
|
||||
- modules/party/registry.go
|
||||
- modules/seaglass/seaglass.go
|
||||
- modules/signpost/signpost.go
|
||||
- scripts/check-phase17.sh
|
||||
covered_digest: "v2:sha256:a4fca52795435a44b393e2a0bd4fe7b2bd59103ef04ae72df6d68de0b7bb72fc"
|
||||
behavior_unverified: 0
|
||||
overrides_applied: 0
|
||||
re_verification:
|
||||
previous_status: gaps_found
|
||||
previous_score: 5/6
|
||||
gaps_closed:
|
||||
- "Release discipline (REL): the framework fixes are in pushed tags (v0.1.24 and later), the host requires v0.1.24, every host plugin gitlink contains the review fixes, and sm-sitemap-plugin main requires v0.2.0 and builds against it without the local replace"
|
||||
gaps_remaining: []
|
||||
regressions: []
|
||||
gaps: []
|
||||
deferred: []
|
||||
advisory:
|
||||
- finding: "The host requires summercms v0.1.24, but its pinned journal, menu and faq commits (19.3-04) import modules/cooler, which first appears in v0.1.27. The host builds only through its committed `replace => ../summercms.go`; resolving from tags alone, Go has to raise the requirement to v0.2.3. The pinned plugin commits still declare `require summercms v0.1.23`."
|
||||
category: other
|
||||
reason: "Release chain of phase 19.3-04, not phase 17. Phase 17 code needs nothing beyond v0.1.24 (signpost.ValidItemPattern is in v0.1.24). To fix: bump the host require (and the plugin requires on their next bump) to a tag that contains cooler, e.g. v0.2.0 or later."
|
||||
evidence_status: "reproduced: GOWORK=off go build -modfile=<host go.mod without the summercms replace> -mod=mod printed 'found .../modules/cooler in summercms v0.2.3'"
|
||||
- finding: "Gap-closure host commit 4bab6f1 bumps the faq, journal, menu, sitemap and user gitlinks and go.mod in one commit, against the 17-05 rule that every gitlink bump is its own host commit"
|
||||
category: other
|
||||
reason: "Process deviation in pushed history; the content is correct (all fixes are ancestors of the pins). Nothing to fix retroactively; keep one gitlink per commit on future bumps."
|
||||
evidence_status: "git show --stat 4bab6f1 in sm-grzybyfunkcjonalne-app"
|
||||
behavior_unverified_items: []
|
||||
coincidental_reliance_items: []
|
||||
human_verified:
|
||||
- test: "Header menu on the site"
|
||||
uat_row: 2
|
||||
recorded_at: "2026-10-19T10:24:39Z"
|
||||
- test: "Homepage FAQ"
|
||||
uat_row: 3
|
||||
recorded_at: "2026-10-19T10:24:39Z"
|
||||
- test: "Edit a menu entry in the admin"
|
||||
uat_row: 4
|
||||
recorded_at: "2026-10-19T10:24:39Z"
|
||||
- test: "Reorder menu entries"
|
||||
uat_row: 5
|
||||
recorded_at: "2026-10-19T10:24:39Z"
|
||||
- test: "Edit a FAQ answer with the rich editor"
|
||||
uat_row: 6
|
||||
recorded_at: "2026-10-19T10:24:39Z"
|
||||
- test: "Sitemap definition and settings in the admin"
|
||||
uat_row: 7
|
||||
recorded_at: "2026-10-19T10:24:39Z"
|
||||
- test: "UAT sitemap matches the live PHP sitemap"
|
||||
uat_row: 8
|
||||
recorded_at: "2026-10-19T10:24:39Z"
|
||||
---
|
||||
|
||||
# Phase 17: Blog companions Verification Report
|
||||
|
||||
**Phase Goal:** As a blog site editor, I want to manage menus, FAQs and the sitemap in the SummerCMS admin through the shared sitemap, menu and FAQ plugins, so that they are no longer hardcoded in the Nuxt app.
|
||||
**Verified:** 2026-10-19T10:31:07Z
|
||||
**Status:** passed
|
||||
**Re-verification:** Yes. The previous report (2026-10-12, gaps_found, 5/6) had one gap, release coherence (REL). It is closed.
|
||||
|
||||
## Summary
|
||||
|
||||
The REL gap is closed:
|
||||
|
||||
- The framework fixes are in pushed tags.
|
||||
- The host requires a tag that contains them.
|
||||
- Every host plugin gitlink contains the review fixes, and every pinned commit is on origin.
|
||||
- The UAT binary was built from that host master with those checkouts.
|
||||
|
||||
The recorded human UAT (17-UAT.md, 40/40, 2026-10-19T10:24:39Z, after the redeploy) settles every human item from the previous report. `verification.uat-evidence` reports no covered file changed since then.
|
||||
|
||||
The strict phase gate passed again here, Docker stage included, after the later phases (18, 18.1, 19.3 and quick tasks) touched cabana, reorder and the admin views. That rules out regressions.
|
||||
|
||||
There are two non-blocking release notes (advisory) and one known editor-facing divergence (warning). None of them blocks the goal.
|
||||
|
||||
## User Flow Coverage
|
||||
|
||||
Story: As a **blog site editor**, I want to **manage menus, FAQs and the sitemap in the SummerCMS admin through the shared sitemap, menu and FAQ plugins**, so that **they are no longer hardcoded in the Nuxt app**. (`user-story.validate`: valid.)
|
||||
|
||||
| Step | Expected | Evidence | Status |
|
||||
| ---- | -------- | -------- | ------ |
|
||||
| 1. Editor opens Menus / Menu entries in /gfadmin and edits an entry, picking a Journal reference from the dependent dropdown | Save persists, site shows it | UAT row 4 pass (after the 2026-10-19 redeploy); `TestMenuAdminSmoke` (pg) pass | VERIFIED (human UAT, row 4) |
|
||||
| 2. Editor reorders menu entries by mouse and keyboard | Tree saved, site shows new order | UAT row 5 pass; `TestCompanionsReorderSmoke`, ReorderView WR-02 specs pass | VERIFIED (human UAT, row 5) |
|
||||
| 3. Editor edits an FAQ answer in the rich editor | Toolbar works, unsafe markup stripped with a notice, homepage shows the edit | UAT row 6 pass; `TestFaqAdminSmoke`, `TestCompanionsRichEditorSmoke` pass | VERIFIED (human UAT, row 6) |
|
||||
| 4. Editor adds a sitemap URL item and saves sitemap settings | /sitemap.xml lists it, renders through the XSL | UAT row 7 pass; `TestSitemapAdminSmoke` pass | VERIFIED (human UAT, row 7) |
|
||||
| 5. Outcome: the Nuxt app no longer hardcodes menu/FAQ/sitemap | Header from MenuNav over /_menu, FAQ from FaqBlock over /_faq, sitemap from Go | Host pin `vue-grzybyfunkcjonalne-app@0ee97d0`: `SiteHeader.vue:15` `<MenuNav`, `FaqSection.vue:21` `<FaqBlock`, `nuxt.config.ts:15` extends the menu and FAQ layers, `app/data/` holds only `contact.ts`, robots points at the Go `/sitemap.xml`; UAT rows 2, 3, 8 pass | VERIFIED |
|
||||
|
||||
## Goal Achievement
|
||||
|
||||
### Observable Truths
|
||||
|
||||
| # | Truth | Status | Evidence |
|
||||
| - | ----- | ------ | -------- |
|
||||
| SC-1 | The three plugins port their PHP schema, models, admin screens and import commands 1:1, each in its own repo with a README | VERIFIED | Regression check: repos pushed (`main` local = origin for sitemap 46898c2, menu f7eddd5, faq 2efe351), gate postgres stage `TestSitemapAdminSmoke`, `TestMenuAdminSmoke`, `TestFaqAdminSmoke`, the import smokes pass; READMEs checked by UAT row 9. Details unchanged from the 2026-10-12 report |
|
||||
| SC-2 | Typed successor of `pages.menuitem.*`; Journal registers through it; menu and sitemap consume it | VERIFIED | Gate go stage (`TestRegistryDuplicateKey`, `TestRegistryActivate`, `TestActivateMenuItemTypesOrder`, `TestMenuItemTypeContracts`) and pg `TestMenuItemTypes`, `TestMenuItemTypesSmoke` pass; UAT row 10 |
|
||||
| SC-3 | sitemap.xml/xsl match PHP incl. frontend_url rewrite and hreflang; menu and FAQ public read APIs | VERIFIED | `TestSitemapGolden`, `TestURLTo`, `TestRewrite`, `TestXMLEscaping` pass; pg `TestMenuAPISmoke`, `TestFaqAPISmoke` pass; layer TAP 37 + 24 pass; UAT rows 7, 8 (loc set equals live modulo the one UAT-only post) |
|
||||
| SC-4 | grzybyfunkcjonalne.pl reads its menu and FAQ from the plugins instead of app config | VERIFIED (human UAT, rows 2, 3) | Host wiring plus `TestCompanionsHost` (pg) pass against the host's pinned submodules; site app uses MenuNav/FaqBlock with the data files removed; UAT rows 1-3 on the 2026-10-19 build |
|
||||
| SC-5 | The new code has unit tests, delivered in the phase's last plan | VERIFIED | `PHASE17_REQUIRE_POSTGRES=1 bash scripts/check-phase17.sh --all` rerun here: exit 0, "Phase 17 gate passed" (self-test, go, plugins, admin 1431 vitest in 93 files + 7 browser, layers, docs, postgres 11+2+5+6+5+1) |
|
||||
| REL | Release discipline: plugins and host require a released framework tag containing what the phase code calls; the host commits the pushed, fixed plugin heads | VERIFIED (previously FAILED) | See "REL re-verification" below |
|
||||
|
||||
**Score:** 6/6 truths verified (0 present, behavior-unverified)
|
||||
|
||||
### REL re-verification (the previous gap)
|
||||
|
||||
| Check | Command | Result |
|
||||
| ----- | ------- | ------ |
|
||||
| Framework fixes in a pushed tag | `git tag --contains` for 964f1a7, 6312929, e1ac983, 9d7c21d, 27bb13b, d9d6b26 | each is in v0.1.24, v0.1.25, v0.1.26, v0.1.27, v0.2.0 .. v0.2.3; all on origin (`git ls-remote --tags origin`) |
|
||||
| Host requires a tag with the fixes | `grep summercms ../sm-grzybyfunkcjonalne-app/go.mod` | `require summercms v0.1.24` (contains `signpost.ValidItemPattern`; `git grep` over the tags) |
|
||||
| Host gitlinks include the review fixes | `git submodule status`; `git merge-base --is-ancestor <fix> <pin>` per plugin repo | sitemap `1bb89ce` contains c42bc26 (CR-01), 433202b (WR-03), cf5c40e (WR-05); menu `559d96b` contains 7255d34 (WR-01), 64215f2 (WR-03), 9c0f833 (WR-06); journal `d7943fb` contains 31d901c (WR-04); faq `c60ae6e` contains 919cf06, 1585f06. All ancestors |
|
||||
| Pinned commits published | `git branch -r --contains <pin>` | every pin is on `origin/main`; host master `129c0df` equals origin |
|
||||
| Submodule checkouts match the pins | `git -C plugins/golem15/<p> rev-parse HEAD`, `status --short` | at the pinned commit, clean; `AllowedItemURL`, `ValidItemPattern`, `BucketSitemap`, `publishedPosts` present in the checkouts |
|
||||
| sitemap main builds against its required tag | `go vet ./...` (committed setup) and `GOWORK=off go build -modfile=<go.mod without the summercms replace>` | both exit 0; module resolves to `summercms v0.2.0` |
|
||||
| Host builds as committed | `go vet . ./plugins/golem15/{sitemap,menu,faq,journal}/...` in the host | exit 0 |
|
||||
| UAT binary | `sha256sum bin/grzybyfunkcjonalne`; `go version -m` | sha256 `31a5e3662966dd6d...`, built 2026-10-19 12:12; `vcs.revision=129c0df` (host master); the plugins are built from the submodule checkouts. vcs.modified=true comes from untracked `.gsd/` and a stray nested `sm-grzybyfunkcjonalne-app/` directory, not from tracked changes |
|
||||
|
||||
The pinned sitemap commit `1bb89ce` still declares `require summercms v0.1.23` and on its own would not build. The host does not build it on its own: the host requires v0.1.24, so the module graph selects a version that contains `ValidItemPattern`. sitemap `main` (46898c2) is fixed to require v0.2.0. This matches the acceptance criterion given for the re-verification.
|
||||
|
||||
### Required Artifacts (regression check)
|
||||
|
||||
| Artifact | Status | Details |
|
||||
| -------- | ------ | ------- |
|
||||
| `modules/signpost`, `modules/seaglass`, cabana field types, reorder, singleton | VERIFIED | Gate go, docs and postgres stages pass; `check-admin-dist.sh` matches a fresh build; openapi check passes |
|
||||
| `../sm-sitemap-plugin`, `../sm-menu-plugin`, `../sm-faq-plugin`, Journal menu item types | VERIFIED | Pushed; gate plugins and postgres stages pass |
|
||||
| `../vue-menu-layer`, `../vue-faq-layer` | VERIFIED | TAP 37/37, 24/24; site app pins `#v0.2.0` (moved on from v0.1.0 in later work) |
|
||||
| `../sm-grzybyfunkcjonalne-app` wiring and pins | VERIFIED | `TestCompanionsHost` passes; pins contain the fixes |
|
||||
| `scripts/check-phase17.sh` | VERIFIED | Strict run exit 0; now requires the review-fix tests by name (6e5a8e7) |
|
||||
|
||||
### Key Link Verification
|
||||
|
||||
| From | To | Via | Status |
|
||||
| ---- | -- | --- | ------ |
|
||||
| party.Activate | signpost registry | `signpost.Activate` before first Boot | WIRED |
|
||||
| Journal | registry | `pact.HasMenuItemTypes` | WIRED |
|
||||
| menu / sitemap | registry | `app.Lookup[*signpost.Registry]()` | WIRED |
|
||||
| Site header / FAQ | /_menu, /_faq APIs | MenuNav, FaqBlock | WIRED |
|
||||
| Host | fixed plugin commits | submodule gitlinks | WIRED (was NOT_WIRED) |
|
||||
| Host | tagged framework | `require summercms v0.1.24` (+ dev replace) | WIRED for phase 17 code; see advisory 1 for the 19.3 cooler import |
|
||||
|
||||
### Data-Flow Trace (Level 4)
|
||||
|
||||
Unchanged from the previous report: menu API, FAQ API and sitemap generator query the database and the registry (FLOWING). UAT rows 4-7 show admin edits reaching the public site end to end.
|
||||
|
||||
### Behavioral Spot-Checks
|
||||
|
||||
| Behavior | Command | Result | Status |
|
||||
| -------- | ------- | ------ | ------ |
|
||||
| Whole phase gate, strict | `PHASE17_REQUIRE_POSTGRES=1 bash scripts/check-phase17.sh --all` | exit 0, "Phase 17 gate passed" | PASS |
|
||||
| sitemap main standalone against v0.2.0 | `GOWORK=off GOFLAGS=-mod=mod go build -modfile=$SCRATCH/sitemap.mod ./...` | exit 0, summercms v0.2.0 | PASS |
|
||||
| Host vet as committed | `go vet . ./plugins/golem15/...` | exit 0 | PASS |
|
||||
| Live UAT endpoints | `curl https://uat.grzybyfunkcjonalne.pl/sitemap.xml` etc. | 401 (basic auth in front of UAT) | SKIP, covered by the recorded UAT |
|
||||
|
||||
### Probe Execution
|
||||
|
||||
Step 7c: SKIPPED. No `scripts/*/tests/probe-*.sh` exists and no plan declares a probe; `scripts/check-phase17.sh` is the declared gate and was run.
|
||||
|
||||
### Requirements Coverage
|
||||
|
||||
ROADMAP lists `Requirements: TBD`; REQUIREMENTS.md maps nothing to Phase 17, so nothing is ORPHANED. Plan IDs SC-1..SC-5 and D-01..D-19 remain SATISFIED as in the previous report (regression gate green).
|
||||
|
||||
### Anti-Patterns Found
|
||||
|
||||
No `TBD|FIXME|XXX` in the covered framework files or the host-pinned sitemap, menu and faq trees.
|
||||
|
||||
### Warnings (non-blocking)
|
||||
|
||||
| # | Finding | Severity | Notes |
|
||||
| - | ------- | -------- | ----- |
|
||||
| W-1 | Hook `ValidationError` details reach the admin as phrase keys (`writeCRUDError`, `modules/cabana/crud.go:831-834`, writes `ve.Details` untranslated). An editor whose save is refused (javascript: URL, missing FAQ locale, parent from another menu) sees e.g. `golem15.menu::lang.errors.url_scheme` | WARNING | Known: deferred-items.md 17-04 #1, explicitly excluded from UAT row 4. The refusal itself works. Only tracked in deferred-items.md; no todo or roadmap entry found. Suggest a todo |
|
||||
| W-2 | Host requires v0.1.24 while the 19.3-04 plugin pins import `modules/cooler` (v0.1.27+) | Advisory | Out of phase 17 scope; see `advisory` frontmatter |
|
||||
| W-3 | Gap-closure commit 4bab6f1 bundles five gitlinks and go.mod | Advisory | Process only; see `advisory` frontmatter |
|
||||
|
||||
### Advisory (New Scope, Unevidenced)
|
||||
|
||||
None unevidenced. The two advisory entries in the frontmatter are evidenced, but they are outside this phase (W-2) or historical process (W-3), so they do not block.
|
||||
|
||||
### Human Verification
|
||||
|
||||
All seven human items from the previous report are settled by the recorded UAT (no covered file changed since 2026-10-19T10:24:39Z):
|
||||
|
||||
| Previous item | Settled by |
|
||||
| ------------- | ---------- |
|
||||
| Header menu desktop/mobile/Esc/active | UAT row 2 |
|
||||
| Homepage FAQ | UAT row 3 |
|
||||
| Admin menu entries: edit, reorder, cross-menu move with children (WR-01), type and reference dropdown | UAT rows 4, 5; the cross-menu subtree move and refusal are exercised by `TestMenuAdminSmoke` (menu_smoke_test.go:382-400, required by the gate, pass) |
|
||||
| Reorder quick moves then reload (WR-02) | UAT row 5; ReorderView WR-02 specs pass |
|
||||
| FAQ richeditor, sitemap screens, singleton in a new tab (WR-07) | UAT rows 6, 7; WR-07 by spec "the list route of a singleton, opened directly (a new tab), opens its record" (SingletonForm.test.ts:115, pass in the admin stage) |
|
||||
| Refusal text shown as phrase keys | Not a verification question any more: code and UAT row 4 confirm raw keys are shown. Carried as warning W-1 |
|
||||
| /sitemap.xml in a browser after the rebuild | UAT rows 7 (XSL renders) and 8 (loc set equals live) |
|
||||
|
||||
No human verification items remain.
|
||||
|
||||
### Gaps Summary
|
||||
|
||||
None. The REL gap from 2026-10-12 is closed: the tags, host require, gitlinks and UAT build are all in place. The phase goal (editors manage menus, FAQs and sitemap in the admin; the Nuxt app no longer hardcodes them) is met in code, by the gate and by the recorded human UAT.
|
||||
|
||||
---
|
||||
|
||||
_Verified: 2026-10-19T10:31:07Z_
|
||||
_Verifier: Claude (msd-verifier)_
|
||||
Reference in New Issue
Block a user