docs(10): re-verify after go-stage fixes, phase 10 human_needed

This commit is contained in:
2026-10-11 17:12:55 +02:00
parent 77ca4b0b93
commit f31ea9387f

View File

@@ -1,8 +1,8 @@
---
phase: 10-admin-vue-spa
verified: 2026-10-11T14:32:00Z
status: gaps_found
score: "4/4 roadmap success criteria hold; plan truths 45/46 (1 failed: the phase acceptance command check-phase10.sh --all is red at its --go stage, for causes outside Phase 10 code)"
verified: 2026-10-11T15:11:15Z
status: human_needed
score: "4/4 roadmap success criteria hold; plan truths 46/46 (the --go gap is closed: check-phase10.sh --go exit 0 in the verifier's own run)"
covered_files:
- ".gitignore"
- ".planning/phases/10-admin-vue-spa/10-01-PLAN.md"
@@ -224,7 +224,7 @@ covered_files:
- "scripts/check-admin-dist.sh"
- "scripts/check-admin-openapi.sh"
- "scripts/check-phase10.sh"
covered_digest: "v2:sha256:5507fd87e64537741dc9c3ffffadce6ff2e21e1366c2ee6364878edc4c54c356"
covered_digest: "v2:sha256:dce85ba35408764f2ce0d7cc0f1297800a2a70d4c263b033a556c19bd3c6e604"
behavior_unverified: 0
overrides_applied: 0
mvp_mode_note: "ROADMAP marks Phase 10 mode: mvp, but the goal is not a User Story. Following the Phase 1/3/5/8 precedent, the four ROADMAP success criteria are the contract and User Flow Coverage is derived from them."
@@ -234,47 +234,34 @@ decision_coverage:
not_honored: []
re_verification:
previous_status: gaps_found
previous_score: "4/4 roadmap success criteria hold in substance; plan truths 43/46 (3 failed, one root cause: the Phase 10 hygiene gate is red at HEAD)"
previous_head: 07e579a
head: 6c74342
reason: "Gap closure by quick task 261011-mag (42b5cf8 gate exemption and self-test plants, 1541cd4 direct-import tests). Only scripts/check-phase10.sh and five admin test files changed since 07e579a; admin/src, modules/ and modules/boardwalk/dist are unchanged."
previous_score: "4/4 roadmap success criteria hold; plan truths 45/46 (1 failed: the phase acceptance command check-phase10.sh --all is red at its --go stage, for causes outside Phase 10 code)"
previous_head: fc7cfaf
head: 77ca4b0
reason: "Narrow re-verification of the one --go gap. summercms.go 77ca4b0 adds -skip '^TestBootstrapEndToEnd$' to the framework go test run. In the sibling repos, sm-user-plugin 569768e (local commit, not pushed, fonoteka.go pointer not bumped) and fonoteka.go 03dad50 and 7db5ef8 (local commits, fonoteka.go is 13 ahead of origin) bring the migration-history and parity tests up to date. No file under admin/src, modules/ or modules/boardwalk/dist changed since fc7cfaf."
gaps_closed:
- "SC-4 mechanical enforcement: scripts/check-phase10.sh --hygiene passes"
- "Every .ts and .vue file under admin/src except main.ts, api/schema.d.ts and env.d.ts is imported by at least one test file"
- "--self-test proves each detector fails closed (self-test now exit 0, with new xhr and apifile plants)"
gaps_remaining:
- "scripts/check-phase10.sh --all is green at HEAD (now red at the --go stage; previously masked because --self-test, the first stage, already failed)"
regressions:
- "10-05 truth 'both repositories pass go vet ./... and go test ./...' was carried from baseline in the previous report without a run. Running the gate's --go stage this session fails it: the framework run is refused for the opt-in skip of modules/sunrise TestBootstrapEndToEnd (cfd110e, 14.3-02, 2026-10-08), and the app run fails git.golem15.com/golem15/sm-user-plugin/updates TestCreateOrganisationsMigration (history test not updated after f0d3b8b, 14.1-02, 2026-10-05)."
gaps:
- truth: "scripts/check-phase10.sh --all, the phase acceptance command, passes at HEAD: both repositories pass go vet ./... and go test ./... with no unexpected skip (10-05 must-haves)"
status: partial
reason: "--self-test, --hygiene, --security, --postgres, --openapi, --dist and --evidence all exit 0 this session, and Vitest plus typecheck pass. The --go stage exits 1 for two drifts introduced after Phase 10, neither in Phase 10 code: (a) summercms.go go test ./... exits 0 but includes the env-gated skip 'set SUMMERCMS_BOOTSTRAP_CHECK=1 to run the bootstrap script end to end' in modules/sunrise TestBootstrapEndToEnd (cfd110e, 14.3-02), and the Phase 10 detector refuses every unexpected skip; (b) in fonoteka.go, git.golem15.com/golem15/sm-user-plugin/updates TestCreateOrganisationsMigration fails because its expected migration history lacks 202610050001_create_oauth_identities (added by f0d3b8b, 14.1-02). The detectors themselves behave as designed: they caught both."
artifacts:
- path: "scripts/check-phase10.sh"
issue: "run_go has no expected-skip entry for the framework's opt-in TestBootstrapEndToEnd; the APP_PENDING_SKIPS/PHASE10_EXPECT_SKIP mechanism exists but is only used for the app run"
- path: "../fonoteka.go/plugins/golem15/user/updates/organisations_test.go"
issue: "want list stops at 202610040003_create_frontend_permissions; the run also applies 202610050001_create_oauth_identities"
missing:
- "check-phase10.sh run_go: accept exactly the modules/sunrise TestBootstrapEndToEnd skip with its SUMMERCMS_BOOTSTRAP_CHECK text (PHASE10_EXPECT_SKIP plus PHASE10_SKIP_TEXT for the ROOT run, or -skip '^TestBootstrapEndToEnd$' with a comment pointing at check-phase14.3.sh, which runs it for real), and prove it in --self-test as the existing pending-skip cases do"
- "sm-user-plugin: add 202610050001_create_oauth_identities to TestCreateOrganisationsMigration's want list, commit and push in that repo, then bump the plugins/golem15/user pointer in fonoteka.go as a separate commit"
- "Re-run scripts/check-phase10.sh --all (or --go) and record the result"
- "scripts/check-phase10.sh --all, the phase acceptance command, passes: --go exit 0 (verifier run, 4m50s, 'phase10 go passed'); the other stages were run by the orchestrator this session and all exit 0"
gaps_remaining: []
regressions: []
human_verification:
- test: "Re-walk the Phase 10 admin flows in a real browser on the current build: run the fonoteka binary, open /plytadmin as a superuser and as a genres-only admin, then use the list and form of each of the five controllers (search, sort, filter, paging, save, 422 field errors), link and unlink a Collection editor, open Ustawienia, and glance at light and dark mode."
expected: "Everything still behaves as approved in 10-UAT.md tests 2 to 5. The limited admin sees only fonoteka > Genres. Lists and forms render. The editor round trip works. The Albums form's later widgets, partials and field types do not break the Phase 10 form; list state persisted in the URL and storage does not confuse paging or filtering."
why_human: "10-UAT.md was approved on 2026-09-27 against c7487f6. Since then phases 10.1, 12.2, 14.2.1, 16.1, 16.2 and 16.3 changed ListView.vue, FormView.vue, FormField.vue, formState.ts, registry.ts, AppShell.vue, PluginRail.vue, UserMenu.vue, useAuth.ts and main.css. Vitest and the Postgres acceptance test cover behavior, but D-23 keeps the real browser out of the automated suite. 10.1-UAT.md is still status: testing with all six items pending; closing its tests 1 and 4 with Genres, Collections and Settings included also closes this item. Quick 261011-mag did not touch admin/src, so this item is unchanged."
why_human: "D-23 keeps the real browser out of the automated suite. Vitest (83 files, 1279 tests) and the Postgres acceptance test cover behavior, but not rendering in a browser."
retest_reason: "10-UAT.md tests 2 to 5 passed on 2026-09-27 against c7487f6. Since then phases 10.1, 12.2, 14.2.1, 16.1, 16.2 and 16.3 changed ListView.vue, FormView.vue, FormField.vue, formState.ts, registry.ts, AppShell.vue, PluginRail.vue, UserMenu.vue, useAuth.ts and main.css, so those rows no longer cover the current code. 10.1-UAT.md is status: testing with all six rows pending; its tests 1 and 4 (Albums, Genres, Settings in a real browser) overlap this walk but do not cover it yet."
- test: "Publish the sibling-repo test fixes the --go pass depends on: push sm-user-plugin 569768e, then commit the plugins/golem15/user pointer bump (cf5c6b9 -> 569768e) in fonoteka.go as a separate commit, and push fonoteka.go (03dad50, 7db5ef8 and the bump) when you choose."
expected: "A clean checkout of fonoteka.go at its committed pointer passes check-phase10.sh --go, as the working tree does now."
why_human: "Pushing needs the user's go-ahead (CLAUDE.md). The --go pass was proven against the go.work working tree. At fonoteka.go's committed pointer cf5c6b9, sm-user-plugin TestCreateOrganisationsMigration still fails as before, because the fix exists only in the local commit 569768e."
- test: "Carried: decide CR-01 (refresh ignores tokens_valid_after / is_activated)"
expected: "Fix now or accept with override"
why_human: "Security-policy decision"
resolution: "Fixed (be4a923, a13a121), approved in 10-UAT.md test 1. TestAdminRefreshRevocation passes in this session's --security/--evidence run."
resolution: "Fixed (be4a923, a13a121), approved in 10-UAT.md test 1. No auth or refresh code changed since."
- test: "Carried: Secure cookie on http://localhost (assumption A3)"
expected: "Chrome and Firefox store summer_admin with default cookie_secure"
why_human: "Browser cookie policy, non-inferable"
resolution: "Approved in 10-UAT.md test 6. No auth.go or cookie change since the previous report."
resolution: "Approved in 10-UAT.md test 6. No auth.go or cookie change since."
- test: "Carried: review the 17 judgment-tier prohibitions"
expected: "Accept or reject the verifier's non-authoritative verdicts"
why_human: "Judgment-tier prohibitions need human resolution"
resolution: "Accepted in 10-UAT.md test 7. Re-checked at HEAD; still not violated (see Prohibitions)."
resolution: "Accepted in 10-UAT.md test 7. The --hygiene stage, which enforces the mechanical ones, is still green."
human_verified:
- item: "CR-01 decision"
uat: "10-UAT.md test 1 (pass)"
@@ -287,147 +274,122 @@ human_verified:
# Phase 10: Admin Vue SPA Verification Report
**Phase Goal:** A minimal Vue 3 + TypeScript admin SPA renders login, permission-gated navigation, lists, forms and the relation manager for Albums, Artists, Collections, Genres and Styles, typed from the generated OpenAPI document.
**Verified:** 2026-10-11T14:32:00Z (summercms.go HEAD 6c74342, fonoteka.go HEAD e074028 with the plugins/golem15/user submodule checked out at 7a6fa0e, uncommitted; recorded pointer cf5c6b9 differs only in go.mod)
**Status:** gaps_found
**Re-verification:** Yes, after quick task 261011-mag closed the three hygiene gaps of the 07e579a report.
**Verified:** 2026-10-11T15:11:15Z (summercms.go HEAD 77ca4b0; fonoteka.go HEAD 7db5ef8 with plugins/golem15/user checked out at 569768e, which is not the recorded pointer cf5c6b9)
**Status:** human_needed
**Re-verification:** Yes, narrow. It re-checks only the one gap left by the fc7cfaf report (`check-phase10.sh --all` red at `--go`) and carries the other truths forward, because no Phase 10 code changed.
## What changed since 07e579a
## What changed since fc7cfaf
| Commit | Files | Effect |
|---|---|---|
| 42b5cf8 | `scripts/check-phase10.sh` | Network rule exempts one line-anchored statement in `admin/src/api/files.ts`; api-listing rule exempts the exact path `admin/src/api/files.ts`; self-test gains `xhr` and `apifile` plants |
| 1541cd4 | `admin/tests/form/{mlLocale,MLField,FileCaptionModal}.test.ts` (new), `admin/tests/account/{ApiTokensPanel,ApiTokenCreateDialog}.test.ts` (extended) | Direct imports and behavior assertions for the five untested modules |
| 6c74342 | planning docs | none on code |
| Repo | Commit | Files | Effect |
|---|---|---|---|
| summercms.go | 77ca4b0 | `scripts/check-phase10.sh` (+2/-1) | `run_go` runs the framework suite with `-skip '^TestBootstrapEndToEnd$'` and a comment naming the opt-in guard (SUMMERCMS_BOOTSTRAP_CHECK=1, 14.3-02) |
| sm-user-plugin (local only, ahead 1) | 569768e | `updates/organisations_test.go`, `user_groups_test.go`, `user_session_test.go` | `TestCreateOrganisationsMigration` expects `202610050001_create_oauth_identities`; five rollback loops count one more migration |
| fonoteka.go (local, ahead 13) | 03dad50 | `parity/migrate_test.go`, `parity/schema_diff_test.go` | Expects 11 user migrations (was 10); allows the `backend_api_tokens` table in the schema diff |
| fonoteka.go | 7db5ef8 | `parity/oauth_flow_test.go` | `TestOAuthFlows` writes `mcp-lifecycle.vars` under `$PARITY_ROOT` or `t.TempDir()` instead of a fixed `/tmp/summercms-parity/...` path |
`git diff 07e579a HEAD` touches no file under `admin/src`, `modules/` or `modules/boardwalk/dist`.
`git diff fc7cfaf HEAD` in summercms.go touches only `scripts/check-phase10.sh`. No file changed under `admin/src`, `modules/` or `modules/boardwalk/dist`.
## Gap closure
## Gap closure: `check-phase10.sh --all` at `--go`
### Gap 1 (closed): SC-4 hygiene rule vs `admin/src/api/files.ts`
### Independent run
`bash scripts/check-phase10.sh --hygiene`: `phase10 hygiene passed`, exit 0.
`bash scripts/check-phase10.sh --go` (verifier's own process): `phase10 go passed`, **exit 0**, 4m50s. The orchestrator separately reports `--self-test`, `--security`, `--postgres`, `--openapi`, `--dist`, `--hygiene` and `--evidence` all exit 0 this session, plus typecheck and Vitest (83 files, 1279 tests). Only `npm ci` inside `--spa` was skipped, as before.
**Is the exemption narrow?** Yes. I reproduced the gate's `hygiene_checks` on a scratch copy of the hygiene directories and planted violations next to the exemption:
### Do the fixes weaken the gate? No.
| Plant (scratch copy) | Result |
|---|---|
| clean copy | exit 0 |
| `fetch("/y")` appended to `admin/src/api/files.ts` | refused: `direct fetch outside admin/src/api/client.ts: admin/src/api/files.ts:320` |
| a second, inline `const r = new XMLHttpRequest()` in `files.ts` | refused (the filter is anchored to the whole line `const request = new XMLHttpRequest()`) |
| `admin/src/api/sub/files.ts` (same name, other path) | refused three ways: direct fetch, `unexpected files in admin/src/api`, imported by no test (the listing rule uses `-path`, not `-name`) |
| the exact exempted line in `admin/src/components/x.ts` | refused: direct fetch (the filter is anchored to the path `admin/src/api/files.ts`) |
**77ca4b0 (framework skip).**
- The `-skip` pattern is anchored (`^...$`) and matches exactly one test in the repo: `modules/sunrise/sunrise_test.go:242`. Its body calls `t.Skip` unless `SUMMERCMS_BOOTSTRAP_CHECK=1`, so under this gate it never asserted anything.
- That test still runs for real in `scripts/check-phase14.3.sh:484` (`SUMMERCMS_BOOTSTRAP_CHECK=1 go test ./modules/sunrise/ -run '^TestBootstrapEndToEnd$'`).
- `phase10_detect` is unchanged. Any other skip in either repo is still refused, and `--self-test` exits 0.
- `KNOWN_APP_FAILURES=""` and `APP_PENDING_SKIPS=""` are unchanged, so the app run allows no failures and no skips.
- The fix takes the `-skip` option the previous report offered. It adds no self-test case because no skip event reaches the detector.
- Residual (ℹ️): a future top-level test with the same name in another framework package would also be skipped silently.
The one residual hole is a second byte-identical `const request = new XMLHttpRequest()` line inside `files.ts`; that matches the precision of the accepted MarkdownField (27711b7) and listState (9cac45c) precedents.
**569768e (sm-user-plugin).**
- The plugin defines exactly 11 migration IDs. The new ID, `202610050001_create_oauth_identities`, is the 11th and the last in order.
- The `want` list gains only that ID, and the five `RollbackLast` loops each go up by one to account for it.
- No assertion was removed or loosened. The tests still require exact history equality and roll back to the same target migration.
**Is it justified?** Yes. The single XHR exists because only XHR reports upload progress (`files.ts:7`, `uploadWithProgress`). It sends `X-Requested-With` from `client.ts`'s `REQUESTED_WITH`, refreshes through `client.ts`'s `refreshSession`/`reportUnauthorized`, and every wire shape is a generated alias imported from `./types` (`FileItem`, `FileMutationResult`, `AdminFileCaptionRequest`, `ErrorBody`, `ControllerParams`). The adapter types `files.ts` declares (`FileCallResult`, `UploadResult`, `UploadHandle`, `FileRoutes`, the local `TypedResult` envelope) describe client-side results, not server payloads. The `types.ts` alias-only rules are unchanged. SC-4's "no hand-maintained duplicate type" still holds, and the gate now records the exception with a reason instead of being red.
**03dad50 (fonoteka parity).**
- The count change from 10 to 11 matches the plugin's real migration count.
- `backend_api_tokens` is a real Go-only framework table from 16.3-01 (`modules/cabana`, `modules/lagoon/backend_admin_migrations_test.go`). The allowlist names it explicitly with a reason, the same way it handles `backend_jwt_blacklist`.
### Gap 2 (closed): every SPA module imported by a test
**7db5ef8 (TestOAuthFlows vars path).**
- Only where the vars store is written changed. The replay and every assertion are the same.
- I found no reader of `mcp-lifecycle.vars` anywhere in fonoteka.go. The new comment says "php_parity.sh reads these vars from PARITY_ROOT", which overstates things (php_parity.sh only defines `PARITY_ROOT`), but it does not affect behavior. ℹ️ Info.
The hygiene stage's import rule passes. Direct imports confirmed: `tests/form/FileCaptionModal.test.ts:11`, `tests/form/MLField.test.ts:9,12`, `tests/form/mlLocale.test.ts:10`, `tests/account/ApiTokenCreateDialog.test.ts:3`, `tests/account/ApiTokensPanel.test.ts:3`. The tests assert behavior rather than just importing (19, 16 and 19 `expect` calls in the three new form tests; the account tests assert request counts, POST bodies, emitted events and DOM state). `npx vitest run` on the five files: 5 files, 61 tests passed.
### Caveat: the pass depends on uncommitted, unpushed sibling state
### Gap 3 (partly closed): `--self-test` and `--all`
`bash scripts/check-phase10.sh --self-test`: `phase10 self-test passed`, exit 0. The plant loop now covers `vhtml fetch appname storage xhr apifile`, and each plant must be refused for its own rule. The `--self-test` half of the truth is verified.
The `--all` half is not. Docker was available, so I ran the stages `--all` chains (except `--spa`'s `npm ci`, replaced by a direct typecheck and Vitest run so the shared `admin/node_modules` of concurrent sessions was not reinstalled):
| Stage | Result |
|---|---|
| `--self-test` | exit 0 |
| `--go` | **exit 1** (see below) |
| `--security`, `--postgres`, `--openapi` (via `--evidence`) | exit 0, `phase10 evidence passed` |
| `--spa` (equivalent) | `npm run typecheck` exit 0; `npm test` 83 files, 1279 tests passed |
| `--dist` (`check-admin-dist.sh`) | exit 0 |
| `--hygiene` | exit 0 |
| `--evidence` | exit 0 |
`--go` refusals:
1. `refuse: skipped git.golem15.com/golem15/summercms/modules/sunrise TestBootstrapEndToEnd` then `refuse: go test ./... in .../summercms.go (test=0 detect=2)`. The framework's `go vet ./...` and `go test ./...` themselves pass (test exit 0). The skip is the opt-in guard `SUMMERCMS_BOOTSTRAP_CHECK=1` added by cfd110e (14.3-02, 2026-10-08); `check-phase14.3.sh` runs that test for real. The Phase 10 detector refuses any skip it was not told to expect.
2. With the framework half bypassed (gate functions sourced, same detector and env): fonoteka `go vet` passes, then `refuse: failed git.golem15.com/golem15/sm-user-plugin/updates TestCreateOrganisationsMigration`. Re-run alone: `organisations_test.go:54: history = [... 202610040003_create_frontend_permissions 202610050001_create_oauth_identities]`. The test's `want` list was not updated when f0d3b8b (14.1-02, 2026-10-05) added the OAuth identities migration. The submodule working tree is at 7a6fa0e (an uncommitted pointer bump from another session), but `git diff cf5c6b9 7a6fa0e` is `go.mod` only, so the recorded pointer fails the same way.
Neither cause is Phase 10 code, and both detectors did exactly what 10-05 asked of them. Still, the phase acceptance command is red at HEAD and the 10-05 truth "both repositories pass go vet ./... and go test ./..." is not met by the command that is meant to prove it. The previous report carried that truth from baseline without running it; this run evidences the failure with named tests, so it blocks.
The `--go` pass was proven against the go.work working tree, where `plugins/golem15/user` is checked out at 569768e. fonoteka.go's recorded pointer is still cf5c6b9. At that commit, `TestCreateOrganisationsMigration` fails exactly as in the previous report. Pushing 569768e and bumping the pointer needs the user's go-ahead, so this is an escalation item (human_verification #2), not a code gap. The previous report accepted the same arrangement, with an uncommitted pointer at 7a6fa0e.
## Goal Achievement
### Observable Truths (ROADMAP contract)
| # | Truth | Status | Evidence (this session) |
| # | Truth | Status | Evidence |
|---|---|---|---|
| 1 | An admin logs in through the SPA and sees only the navigation items their permissions allow. | ✓ VERIFIED | `--postgres` (via `--evidence`) passes `TestPhase10AssembledAcceptance`, `TestPhase10AdminAuth`, `TestPhase10TracerSPA`; `--security` passes `TestPhase10CookieAuth`, `TestPhase10CSRF`, `TestPhase10CookieGuard`, `TestPhase10CollectionOwnerReadOnly`. Full Vitest green. No `admin/src` change since the previous report. |
| 2 | Each of the five controllers renders a working list and form generated from its JSON schema. | ✓ VERIFIED | `TestPhase10Controllers` and the SC-2 block of `TestPhase10AssembledAcceptance` pass. Browser re-check of the views changed by later phases stays the open human item. |
| 3 | The Collections form's relation manager lets an admin search, link and unlink an editor. | ✓ VERIFIED | `TestPhase10AlbumRelations`, `TestPhase10RelationOptions`, `TestPhase10RelationSave` and the SC-3 block of the assembled acceptance pass. |
| 4 | API calls in the SPA use TypeScript types generated from the OpenAPI document, with no hand-maintained duplicate type. | ✓ VERIFIED | `--hygiene` exit 0 (mechanical gate now green, exemption judged narrow and justified above). `check-admin-openapi.sh --check` exit 0; `TestPhase10OpenAPIConformance`, `TestPhase09ContractInventory` pass; `types.ts` alias-only rules unchanged. |
| 1 | An admin logs in through the SPA and sees only the navigation items their permissions allow. | ✓ VERIFIED | Carried from fc7cfaf (no admin/src or Go change). `--security`/`--postgres`/`--evidence` exit 0 this session (orchestrator); `--go` exit 0 (verifier). |
| 2 | Each of the five controllers renders a working list and form generated from its JSON schema. | ✓ VERIFIED | Carried: `TestPhase10Controllers` and the assembled acceptance SC-2 block are in the green `--postgres` stage. The browser re-check stays open as human item #1. |
| 3 | The Collections form's relation manager lets an admin search, link and unlink an editor. | ✓ VERIFIED | Carried: `TestPhase10AlbumRelations`, `TestPhase10RelationOptions`, `TestPhase10RelationSave` and the SC-3 block are in green stages. |
| 4 | API calls in the SPA use TypeScript types generated from the OpenAPI document, with no hand-maintained duplicate type. | ✓ VERIFIED | Carried: `--hygiene` and `--openapi` exit 0; the files.ts exemption is unchanged since it was judged narrow in fc7cfaf. |
**Score:** 4/4 ROADMAP truths verified. Plan truths 45/46 (0 present, behavior-unverified).
**Score:** 4/4 ROADMAP truths verified. Plan truths 46/46 (0 present, behavior-unverified).
### Plan must-have truths
### Plan must-have truths (re-checked rows)
| Truth (10-05) | Status | Evidence |
|---|---|---|
| SC-4 hygiene: `admin/src/api` holds only the generated schema, client, aliases (and now the files.ts adapters); no direct network call outside client.ts | ✓ VERIFIED | `--hygiene` exit 0; scratch plants above |
| Every `admin/src` .ts/.vue (except main.ts, schema.d.ts, env.d.ts) imported by a test | ✓ VERIFIED | `--hygiene` exit 0; five direct imports listed above; 61 tests pass |
| `--all` exits non-zero on any failing stage, a zero-test run or a skip, drift, a hygiene violation or an evidence gap; `--self-test` proves each detector fails closed | ✓ VERIFIED | `--self-test` exit 0; the live `--go` run refused a skip and a failure as designed |
| Every Phase 10 Go change has named tests, and both repositories pass go vet ./... and go test ./... | ✗ FAILED (gate) | `--go` exit 1: sunrise opt-in skip refused; sm-user-plugin `TestCreateOrganisationsMigration` fails. Named Phase 10 tests all pass. |
| TestPhase10AssembledAcceptance proves SC-1..SC-4 | ✓ VERIFIED | `--postgres` exit 0 |
| Every Phase 10 Go change has named tests, and both repositories pass go vet ./... and go test ./... | ✓ VERIFIED (was ✗ FAILED) | `check-phase10.sh --go` exit 0 in the verifier's run. The framework excludes only the opt-in sunrise test, which `check-phase14.3.sh` runs for real; the app run has no allowances. Working-tree caveat above. |
| `--all` exits non-zero on any failing stage, zero-test run, skip, drift, hygiene violation or evidence gap; `--self-test` proves each detector fails closed | ✓ VERIFIED | `--self-test` exit 0 (orchestrator). `phase10_detect` and the allowance variables are unchanged. |
| `scripts/check-phase10.sh --all` passes at HEAD | ✓ VERIFIED | Every stage exits 0 this session: `--go` in the verifier's run, the rest in the orchestrator's. `--spa` used its typecheck and Vitest equivalent without `npm ci`. |
The remaining 41 plan truths are carried from the baseline. Their code is unchanged since 07e579a, and the stages that cover them (`--security`, `--postgres`, `--openapi`, `--dist`, `--hygiene`, full Vitest, typecheck) passed this session.
Backstop truths (A1 prefix, A3 cookie, A10 blacklist grace, A8 pivot order, required-relation hint, A6 dark mode) are unchanged; the A3 approval (10-UAT test 6) carries over.
The other 43 plan truths are carried from fc7cfaf. Their code is unchanged, and the stages that cover them passed this session.
### Prohibitions (judgment tier)
Accepted in 10-UAT.md test 7, re-checked at HEAD through the green `--hygiene` stage: no consumer application names in `admin/src`, `admin/tests`, `admin/openapi`, `modules/boardwalk`, `modules/cabana`, `modules/phrasebook`; one allowlisted `v-html` (`MarkdownField.vue`, `sanitizedHtml`); browser storage only in `useSidebar.ts` and `listState.ts`; no foreign origin in `modules/boardwalk/dist`; cookie login/refresh never return the JWT in a body (`TestPhase10CookieAuth` pass). All 17 remain not violated.
Unchanged. All 17 were accepted in 10-UAT.md test 7, and the mechanical subset is still enforced by the green `--hygiene` stage. None is violated.
### Required Artifacts
| Artifact | Status | Details |
|---|---|---|
| `admin/` SPA | ✓ VERIFIED | Unchanged; `check-admin-dist.sh` exit 0 |
| `admin/openapi/admin.json`, `schema.d.ts`, `types.ts` | ✓ VERIFIED | `check-admin-openapi.sh --check` exit 0 |
| `admin/tests/form/{mlLocale,MLField,FileCaptionModal}.test.ts`, `admin/tests/account/*` | ✓ VERIFIED | Exist, import their modules directly, 61 tests pass |
| `modules/cabana`, `bouncer`, `surf`, `boardwalk`, `phrasebook` Phase 10 code | ✓ VERIFIED | `--security` and `--postgres` named tests pass; framework `go test ./...` exit 0 |
| `scripts/check-phase10.sh` | ⚠️ PARTIAL | `--self-test`, `--hygiene`, `--security`, `--postgres`, `--openapi`, `--dist`, `--evidence` exit 0; `--go` exit 1 (gap) |
| fonoteka `admin_phase10_*_test.go` | ✓ VERIFIED | Acceptance, Tracer, Controllers, AdminAuth, AlbumRelations, CollectionOwnerReadOnly pass |
| `admin/` SPA, `admin/openapi`, generated types | ✓ VERIFIED | Unchanged since fc7cfaf; `--dist`, `--openapi`, `--hygiene` exit 0 |
| `modules/cabana`, `bouncer`, `surf`, `boardwalk`, `phrasebook` Phase 10 code | ✓ VERIFIED | Unchanged; `--security`, `--postgres`, `--go` exit 0 |
| `scripts/check-phase10.sh` | ✓ VERIFIED (was ⚠️ PARTIAL) | All stages exit 0; the 77ca4b0 change is narrow (see above) |
| fonoteka `admin_phase10_*_test.go` | ✓ VERIFIED | Pass within the `--go` app run and `--postgres` |
### Key Link Verification
| From | To | Via | Status |
|---|---|---|---|
| `admin/src/api/client.ts` | generated `schema.d.ts` | `createClient<paths>` | WIRED |
| `admin/src/api/files.ts` | generated aliases + client headers/refresh | imports from `./types` and `./client` | WIRED (now inside the gate's recorded exception) |
| `scripts/check-phase10.sh` hygiene | `admin/src/api/files.ts` exception | line- and path-anchored filters | WIRED, fail-closed (`xhr`, `apifile` plants) |
| `scripts/check-phase10.sh` run_go | `go test -json` both repos | `phase10_detect` skip/failure detection | WIRED (it refused the two drifts) |
| `ListView.vue` / `FormView.vue` / `RelationManager.vue` | schema, record and relation endpoints | typed client | WIRED (unchanged) |
| `modules/boardwalk` | `admin` build | `go:embed dist`, drift gate | WIRED |
| `scripts/check-phase10.sh` run_go | `go test -json` in both repos | `phase10_detect`, with no app allowances and one anchored framework `-skip` | WIRED |
| `check-phase10.sh` `-skip '^TestBootstrapEndToEnd$'` | `check-phase14.3.sh --bootstrap` | the skipped test runs for real in its own phase gate | WIRED |
| All other links (client.ts to schema.d.ts, files.ts to aliases and client, views to endpoints, boardwalk to dist) | | | WIRED (unchanged) |
### Data-Flow Trace (Level 4)
Unchanged since the previous report (no `admin/src` or Go change): every flow FLOWING (navigation from `GET /navigation` filtered server-side, lists and forms from schema endpoints and records, relations from `/relations/{name}` and `/candidates`, strings from `GET /lang`).
Unchanged. Every flow is FLOWING.
### Behavioral Spot-Checks (run this session)
### Behavioral Spot-Checks
| Behavior | Command | Result | Status |
|---|---|---|---|
| Hygiene gate | `bash scripts/check-phase10.sh --hygiene` | `phase10 hygiene passed`, exit 0 | ✓ PASS |
| Gate self-test | `bash scripts/check-phase10.sh --self-test` | `phase10 self-test passed`, exit 0 | ✓ PASS |
| Exemption narrowness | `hygiene_checks` on a scratch copy with 4 plants | all 4 refused, clean copy exit 0 | ✓ PASS |
| Five direct tests | `npx vitest run` on the five test files | 5 files, 61 tests passed | ✓ PASS |
| SPA suite | `npm run typecheck`; `npm test` | exit 0; 83 files, 1279 tests | ✓ PASS |
| Security, Postgres, OpenAPI, evidence | `bash scripts/check-phase10.sh --evidence` | `phase10 evidence passed`, exit 0 | ✓ PASS |
| Dist and OpenAPI drift | `scripts/check-admin-dist.sh`; `scripts/check-admin-openapi.sh --check` | exit 0; exit 0 | ✓ PASS |
| Go stage | `bash scripts/check-phase10.sh --go` | exit 1, skipped sunrise `TestBootstrapEndToEnd` | ✗ FAIL |
| Go stage, app half | gate functions sourced, `phase10_go "$APP" ./... ./plugins/golem15/fonoteka/... ./plugins/golem15/user/...` | go vet ok; `sm-user-plugin/updates TestCreateOrganisationsMigration` FAIL | ✗ FAIL |
| Go stage | `bash scripts/check-phase10.sh --go` (verifier) | `phase10 go passed`, exit 0, 4m50s | ✓ PASS |
| `-skip` target is unique | `grep -rn "func TestBootstrapEndToEnd"` | one hit, `modules/sunrise/sunrise_test.go:242` (env-gated `t.Skip`) | ✓ PASS |
| Skipped test still runs elsewhere | `grep` in `scripts/check-phase14.3.sh` | line 484 runs it with `SUMMERCMS_BOOTSTRAP_CHECK=1` | ✓ PASS |
| App allowances empty | `grep` for `KNOWN_APP_FAILURES` and `APP_PENDING_SKIPS` | both `""` | ✓ PASS |
| User plugin migration count | migration ID grep in `plugins/golem15/user/updates` | 11 unique IDs, `202610050001_create_oauth_identities` last | ✓ PASS |
| Other stages | orchestrator run: `--self-test`, `--security`, `--postgres`, `--openapi`, `--dist`, `--hygiene`, `--evidence`, typecheck, Vitest | all exit 0; 83 files, 1279 tests | ✓ PASS (reported) |
### Probe Execution
No `probe-*.sh` declared or present; `check-phase10.sh` is the phase gate (stages above).
No `probe-*.sh` is declared or present. `check-phase10.sh` is the phase gate.
### Requirements Coverage
| Requirement | Source Plan | Description | Status | Evidence |
|---|---|---|---|---|
| ADMIN-06 | 10-01..10-05 | Minimal Vue 3 + TS SPA renders login, permission-gated navigation, lists, forms and the relation manager for the five controllers using generated types | ✓ SATISFIED (substance and SC-4 gate); acceptance command red on `--go`; browser re-check pending | Truths 1-4; REQUIREMENTS.md marks it Complete for Phase 10 |
| ADMIN-06 | 10-01..10-05 | Minimal Vue 3 + TS SPA renders login, permission-gated navigation, lists, forms and the relation manager for the five controllers using generated types | ✓ SATISFIED; browser re-walk pending | Truths 1-4; acceptance command green |
Orphaned requirements: none.
@@ -435,35 +397,40 @@ Orphaned requirements: none.
| File | Pattern | Severity | Impact |
|---|---|---|---|
| `scripts/check-phase10.sh` run_go vs `modules/sunrise` | Phase gate not updated for a later-phase opt-in skip | 🛑 Blocker (evidenced: `--go` run red) | Phase 10 acceptance command fails |
| sm-user-plugin `updates/organisations_test.go` | Migration history test not updated after a new migration | 🛑 Blocker for the gate (evidenced: named test FAIL); defect lives in the sibling repo | Phase 10 acceptance command fails |
| `admin/src/api/files.ts` | Local adapter types (`TypedResult` mirrors the openapi-fetch envelope) | ℹ️ Info | Wire payloads are generated aliases; not a duplicate API type |
| Phase 10 review WR-04..WR-08 | carried from baseline | ⚠️ Warning | Unchanged |
| fonoteka.go `plugins/golem15/user` pointer | The fix lives in an unpushed local commit; the recorded pointer cf5c6b9 still fails `TestCreateOrganisationsMigration` | ⚠️ Warning | A clean checkout of fonoteka.go fails `--go` until 569768e is pushed and the pointer is bumped (human item #2) |
| `scripts/check-phase10.sh:293` | `-skip` matches by test name across all framework packages | ℹ️ Info | A future same-named test elsewhere would be skipped silently; today the name is unique |
| fonoteka.go `parity/oauth_flow_test.go:288` | Comment says php_parity.sh reads the vars; nothing reads `mcp-lifecycle.vars` | ℹ️ Info | Misleading comment only |
| Phase 10 review WR-04..WR-08 | carried | ⚠️ Warning | Unchanged |
No `TBD`/`FIXME`/`XXX`/`TODO`/`HACK` in the six files changed since 07e579a.
There are no `TBD`, `FIXME` or `XXX` markers in the changed lines.
### Human Verification Required
### 1. Browser re-walk of the Phase 10 flows on the current build
**Test:** Run the fonoteka binary and open /plytadmin. Log in as a superuser and then as a genres-only admin. Use the list and form of each of the five controllers (search, sort, filter, paging, save, 422 field errors). Link and unlink a Collection editor. Open Ustawienia. Glance at light and dark mode.
**Expected:** Behaves as approved in 10-UAT.md tests 2 to 5; later widgets, field types and persisted list state do not break the Phase 10 views.
**Why human:** Later phases changed the views that the 2026-09-27 approval covered; D-23 keeps browser e2e out of the suite. 10.1-UAT tests 1 and 4 are still pending and overlap.
**Test:** Run the fonoteka binary and open /plytadmin. Log in as a superuser, then as a genres-only admin. Use the list and form of each of the five controllers (search, sort, filter, paging, save, 422 field errors). Link and unlink a Collection editor. Open Ustawienia. Glance at light and dark mode.
**Expected:** Everything behaves as approved in 10-UAT.md tests 2 to 5. Later widgets, field types and persisted list state do not break the Phase 10 views.
**Why human:** D-23 keeps the browser out of the suite.
**UAT coverage:** Not covered by an existing passing row. 10-UAT.md is complete with all 7 rows pass, but rows 2 to 5 were recorded against c7487f6 (2026-09-27), and later phases have since changed the views they cover (retest_reason in the frontmatter). 10.1-UAT.md is status: testing with 0 of 6 rows passed. Its tests 1 and 4 overlap this walk; passing them with Genres, Collections and Settings included would also close this item.
Carried items CR-01, A3 and the 17 prohibitions stay resolved by 10-UAT.md tests 1, 6 and 7.
### 2. Publish the sibling-repo test fixes
**Test:** Push sm-user-plugin 569768e. Commit the `plugins/golem15/user` pointer bump (cf5c6b9 to 569768e) in fonoteka.go as a separate commit, then push fonoteka.go when you choose.
**Expected:** A clean fonoteka.go checkout passes `check-phase10.sh --go`.
**Why human:** Pushing needs the user's go-ahead. The verified pass relies on the working-tree submodule state.
Carried items CR-01, A3 and the 17 prohibitions stay resolved by 10-UAT.md tests 1, 6 and 7 (code unchanged).
### Gaps Summary
Quick task 261011-mag closed what it set out to close: the hygiene stage and the self-test are green. The files.ts exemption is narrow (line- and path-anchored, each half proven fail-closed by a self-test plant and by my own scratch plants) and justified (upload progress needs XHR; headers, refresh and all wire types come from `client.ts` and the generated aliases). The gate was not weakened.
The one remaining gap from fc7cfaf is closed. `check-phase10.sh --go` passes in the verifier's own run, and every other stage passed this session. None of the four fixes weakens the gate:
- The framework `-skip` is anchored to a single opt-in test that `check-phase14.3.sh` runs for real.
- The app run still allows no failures and no skips.
- The migration-history and parity tests were updated to match the real 11 migrations and a real 16.3 table, with no assertion loosened.
One gap remains, and it is new evidence rather than a regression from the fix: the phase acceptance command `check-phase10.sh --all` is red at its `--go` stage. The previous report never got that far because `--self-test` (the first stage) already failed, and it carried the "both repositories pass go test" truth without running it. Two later-phase drifts cause it:
- the framework's opt-in `modules/sunrise` `TestBootstrapEndToEnd` skip (14.3-02), which the Phase 10 skip detector refuses; fix it in `check-phase10.sh` as a narrow expected skip with its text and a self-test case;
- `sm-user-plugin` `TestCreateOrganisationsMigration`, whose expected history misses `202610050001_create_oauth_identities` (14.1-02); fix it in the plugin repo, then bump the pointer in fonoteka.go.
No later roadmap phase takes over this gate, so nothing is deferred. Once both are fixed and `--all` (or `--go`) passes, the phase returns to human_needed for the browser re-walk.
No code gaps remain. Status is human_needed for two items: the browser re-walk, which no passing UAT row covers for the current code, and publishing the sibling-repo fixes so a clean checkout matches the verified working tree.
---
_Verified: 2026-10-11T14:32:00Z_
_Verified: 2026-10-11T15:11:15Z_
_Verifier: Claude (msd-verifier)_