docs(19.7-09): validation rows for every gap-closure test

One row per new behaviour of plans 06-09 with its final command; every row
green after the plan 09 gate run; nyquist_compliant stays true.
This commit is contained in:
2026-10-23 18:54:51 +02:00
parent 33faa44e53
commit a636933299

View File

@@ -61,8 +61,41 @@ Filled in by the planner per task; the behaviour → test map is:
| D-15/D-16 | Journal tools compile through pier; input keys are the routes' keys; prompt | unit | blog plugin `go test -short . -run '^TestJournalMCP$'` | ✅ `sm-journal-plugin/mcp_test.go` | ✅ green |
| SC-4/D-08/D-18/D-20/D-26 | end-to-end in sm-demo-app incl. unlink list_changed, read grant, revoked grant, personal tokens off | e2e | `cd ../sm-demo-app && go test -tags summercms_mcp . -run '^TestMCPEndToEnd$'` | ✅ `sm-demo-app/mcp_e2e_test.go` | ✅ green |
| D-31 | plugins additive against their pre-phase commits; consumers build and pass at bumped pins | build | `bash scripts/check-phase19.7.sh --plugins` and `--consumers` | ✅ `scripts/check-phase19.7.sh` | ✅ green |
| A-CR-01/A-IN-01/A-IN-06 | reaper closes expired copies (memory, Redis per instance), store error keeps the copy, GET stream ends when its record is gone, `ephemeral` label | integration | `go test -short ./modules/pier -run '^TestSessionReaper$'` (also `-tags summercms_mcp`) | ✅ `modules/pier/reaper_test.go` | ✅ green |
| A-WR-03 | 50 concurrent initializes open exactly `max_per_binding` (memory, two instances on miniredis); a failed initialize releases its slot; Count/Put fallback | integration | `go test -short ./modules/pier -run '^TestSessionReserve$'` | ✅ `modules/pier/reserve_test.go` | ✅ green |
| A-WR-07 | a call, a DELETE and a stateless request finish while an initialize blocks in a guard check | integration | `go test -short -race ./modules/pier -run '^TestLockScope$'` | ✅ `modules/pier/lock_scope_test.go` | ✅ green |
| A-WR-04 | a returning binding with read write, or with a backend subject, lists the new tools on both paths; narrowing hides them | integration | `go test -short ./modules/pier -run '^TestScopeWidening$'` | ✅ `modules/pier/widening_test.go` | ✅ green |
| A-WR-05/A-WR-06 | a stateless-only Redis instance applies a revocation; a listen stream ends with its bearer; LRU eviction closes the stream | integration | `go test -short ./modules/pier -run '^TestStatelessFanOut$'` | ✅ `modules/pier/stateless_fanout_test.go` | ✅ green |
| A-WR-09 | a subject without TokenID is 401; two users' personal tokens get distinct bindings | integration | `go test -short ./modules/pier -run '^TestPersonalTokenBinding$'` | ✅ `modules/pier/personal_binding_test.go` | ✅ green |
| A-WR-01/A-WR-02/A-WR-08/A-IN-04/A-IN-05/A-IN-08 | traversal and empty segments refused before the route; missing path value refused; fixed provider error text; large integers keep their digits; outer Host and forwarding headers; contradicting dispatch refused | unit | `go test -short ./modules/pier -run '^TestDispatchHardening$'` | ✅ `modules/pier/dispatch_hardening_test.go` | ✅ green |
| A-WR-02/A-IN-07 | an omitempty path field and an embedded struct on a GET tool fail boot | unit | `go test -short ./modules/pier -run '^TestCatalogPathFields$'` | ✅ `modules/pier/catalog_path_fields_test.go` | ✅ green |
| C-IN-01 | a `Writes` prompt is listed only for read and write grants | integration | `go test -short ./modules/pier -run '^TestPromptWriteCeiling$'`; blog plugin `go test -short . -run '^TestJournalPromptWrites$'` | ✅ `modules/pier/prompt_ceiling_test.go`, `sm-journal-plugin/mcp_prompt_writes_test.go` | ✅ green |
| B-WR-04/C-IN-02 | a TokenID event ends only that token's sessions, a ClientID event only that client's, neither all; through Redis between instances | integration | `go test -short ./modules/pier -run '^TestTokenScopedRevoke$'` | ✅ `modules/pier/token_events_test.go` | ✅ green |
| B-IN-04 | a resolver sees `towel.ClientIP` (RemoteAddr host, or the host's trusted-proxy answer); towel round trip; `ResolveBackendToken` logs `remote` | unit + Postgres | `go test -short ./modules/pier -run '^TestResolveClientAddress$'`; `go test -short ./modules/towel -run '^TestClientIP$'`; `go test ./modules/cabana -run '^TestResolveBackendTokenRemote$'` | ✅ `modules/pier/token_events_test.go`, `modules/towel/client_ip_test.go`, `modules/cabana/token_resolver_remote_test.go` | ✅ green |
| C-CR-02/D-05 | `auth_time` at mint (both audiences), unchanged through every refresh path, absent for legacy tokens; `VerifyAuthTime` refusals | unit | `go test -short ./modules/bouncer -run '^TestAuthTime$'` | ✅ `modules/bouncer/auth_time_test.go` | ✅ green |
| E-2 (framework) | `ValidTokenScopeName` table; `HasFrontendTokenScopes` discovered; cabana's scope validation agrees with pact | unit | `go test -short ./modules/pact -run '^TestFrontendTokenScopes$'`; `go test -short ./modules/cabana -run '^TestTokenScopeNameParity$'` | ✅ `modules/pact/frontend_token_scopes_test.go`, `modules/cabana/token_scope_name_test.go` | ✅ green |
| B-WR-03 | `javascript:`, `data:`, `vbscript:` and `//` action URLs dropped and logged without the URL; https and same-origin kept | unit | `go test -short ./modules/cabana -run '^TestAccountContributionURL$'` | ✅ `modules/cabana/account_contributions_hardening_test.go` | ✅ green |
| B-WR-06/B-IN-03 | a failing Status marks only its section, a failing Applies drops only its action, 200; dynamic status text not looked up | unit | `go test -short ./modules/cabana -run '^TestAccountContributionsIsolation$'` | ✅ `modules/cabana/account_contributions_hardening_test.go` | ✅ green |
| B-IN-02 | a non-string prompt payload answers the localized `action_prompt_invalid` text (en, pl) | unit | `go test -short ./modules/cabana -run '^TestRecordActionPromptLocalized$'` | ✅ `modules/cabana/record_action_prompt_localized_test.go` | ✅ green |
| B-WR-04 | revoking one `g15_` token fires one revoked event with its TokenID | Postgres | `go test ./modules/cabana -run '^TestAccountTokenRevokeEvent$'` | ✅ `modules/cabana/account_token_events_test.go` | ✅ green |
| B-WR-01/B-WR-02 | plain keys ignored from an open shadow root and a custom field element in a form; Ctrl+S and Ctrl+Enter save the taglist draft | vitest | `npm --prefix admin run test` (`tests/app/hotkeysEditing.test.ts` required by the gate) | ✅ `admin/tests/app/hotkeysEditing.test.ts` | ✅ green |
| B-WR-03/B-WR-06/B-IN-01 | no link and no `window.open` for a `javascript:` URL; section error text; toast and kept sections on a failed reload; My account confirm and stale texts | vitest | `npm --prefix admin run test` | ✅ `admin/tests/account/AccountContributions.test.ts` | ✅ green |
| E-2 | E-2's acceptance list item by item (mint and `middleware.Scope`, the 403 message, 422, listing, discovery in en and pl), per-application catalog, legacy fallback | Postgres | user plugin `GOWORK=off go test . -run '^TestMemberTokenScopes$'` | ✅ `plugins/golem15/user/member_token_scopes_test.go` | ✅ green |
| E-2 | duplicate (both plugins named), redeclared built-ins, bad names, empty label and a missing phrase key fail boot | unit | user plugin `GOWORK=off go test -short . -run '^TestMemberTokenScopesBoot$'` | ✅ `plugins/golem15/user/member_token_scopes_test.go` | ✅ green |
| C-CR-02 | the link proof against login, request, refresh and re-login orders, no `auth_time`, another user's session token | Postgres | user plugin `GOWORK=off go test . -run '^TestBackendLinkAuthTime$'` | ✅ `plugins/golem15/user/backend_link_auth_time_test.go` | ✅ green |
| C-WR-01/C-IN-06 | POST show answers like GET with no-store; fragment URL; `backend_links.page_path` | Postgres | user plugin `GOWORK=off go test . -run '^TestBackendLinkShowPost$'` | ✅ `plugins/golem15/user/backend_link_show_test.go` | ✅ green |
| C-CR-01 | `AccessRevokedEvent` from ban, reset, change and admin-set password (ids, Before, reason, transaction, subject event after commit, rollback); banned user loses the link | Postgres | user plugin `GOWORK=off go test . -run '^TestAccessRevocation$'` | ✅ `plugins/golem15/user/access_revocation_test.go` | ✅ green |
| C-IN-04 | MCP personal-token resolve stamps `last_used_ip` | Postgres | user plugin `GOWORK=off go test . -run '^TestUserMCPGuardClientIP$'` | ✅ `plugins/golem15/user/mcp_guard_client_ip_test.go` | ✅ green |
| C-IN-02 | `DELETE /tokens/{id}` fires one revoked event with that TokenID | Postgres | user plugin `GOWORK=off go test . -run '^TestAPITokenRevokeEvent$'` | ✅ `plugins/golem15/user/api_token_events_test.go` | ✅ green |
| E-1 | logo fileupload after the avatar; upload stored with field `logo`; `OrganisationLogoFields` with and without a logo; delete removes both attachments | Postgres | user plugin `GOWORK=off go test . -run '^TestOrganisationLogo$'` | ✅ `plugins/golem15/user/organisation_logo_test.go` | ✅ green |
| C-CR-01 | the verifier and refresh refuse pre-cutoff (same-second), banned and deleted users without a revoke listener; untruncated `Before` | Postgres | oauthserver plugin `go test . -run '^TestMCPVerifierRevocation$'` | ✅ `sm-oauthserver-plugin/mcp_revocation_test.go` | ✅ green |
| C-CR-01/C-WR-02/C-IN-02 | MCP and OIDC grants before `Before` revoked, later kept; consents and unused codes deleted; link changes revoke only backend tokens with client events after commit; authorized-apps revoke event | Postgres | oauthserver plugin `go test . -run '^TestMCPGrantRevocation$'` | ✅ `sm-oauthserver-plugin/mcp_revocation_test.go` | ✅ green |
| SC-4/C-CR-01/C-WR-02/C-IN-01/C-IN-02 | demo revocation matrix through the SDK client: ban via the bulk route, unlink and a new consent, read-only prompts, one `usr_` token revoked | e2e | `cd ../sm-demo-app && go test -tags summercms_mcp . -run '^TestMCPRevocationEndToEnd$'` | ✅ `sm-demo-app/mcp_revocation_e2e_test.go` | ✅ green |
| C-WR-01 | `readLinkCode` and `isLinkCode` | vitest | `pnpm --dir ../sm-demo-app/vue-demo-app run test` (`app/lib/linkCode.test.ts` required by the gate) | ✅ `sm-demo-app/vue-demo-app/app/lib/linkCode.test.ts` | ✅ green |
| T-19.7-64 (P-40) | workspace check, consumers built against the unreleased user plugin, unreleased-pin policy and `PHASE197_RELEASED` strict mode | gate | `bash scripts/check-phase19.7.sh --self-test`, `--plugins`, `--consumers`; `PHASE197_RELEASED=1 bash scripts/check-phase19.7.sh --consumers` exits 1 before the release | ✅ `scripts/check-phase19.7.sh` | ✅ green |
| A-IN-02 | cooler's `KeyPrefix` and `keyPrefix` carry their own doc comments | docs | `bash scripts/check-phase19.7.sh --docs` | ✅ `scripts/check-phase19.7.sh` | ✅ green |
*Status legend: ✅ green · ❌ red · ⚠️ flaky. Every row is green as of the plan 05 gate run.*
*Status legend: ✅ green · ❌ red · ⚠️ flaky. Every row is green as of the plan 09 gate run (`bash scripts/check-phase19.7.sh --all`, every stage PASS). The rows after D-31 are the gap closure (plans 06-09).*
---
@@ -93,4 +126,4 @@ Filled in by the planner per task; the behaviour → test map is:
- [x] Feedback latency < 120s for the quick run (the full gate with Docker takes several minutes)
- [x] Nyquist compliance recorded in the frontmatter
**Approval:** plan 19.7-05 (the gate passes in full)
**Approval:** plan 19.7-05 (the gate passes in full); extended by plan 19.7-09 for the gap closure (the gate passes in full)