From 8f5325300c94fe7fb18e60b47102bc2443a0a17c Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Thu, 15 Oct 2026 19:56:21 +0200 Subject: [PATCH] docs(19.3-05): validation map filled, wave 0 complete --- .../19.3-VALIDATION.md | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/.planning/phases/19.3-framework-transport-and-infrastructure-for-wavepath/19.3-VALIDATION.md b/.planning/phases/19.3-framework-transport-and-infrastructure-for-wavepath/19.3-VALIDATION.md index 3eb8c94..4950781 100644 --- a/.planning/phases/19.3-framework-transport-and-infrastructure-for-wavepath/19.3-VALIDATION.md +++ b/.planning/phases/19.3-framework-transport-and-infrastructure-for-wavepath/19.3-VALIDATION.md @@ -5,7 +5,7 @@ slug: "framework-transport-and-infrastructure-for-wavepath" # audit-milestone §5.5 distinguishes NOT-VALIDATED (draft) from PARTIAL (validated + nyquist_compliant: false) (#2117) status: draft nyquist_compliant: false -wave_0_complete: false +wave_0_complete: true created: "2026-10-15" --- @@ -39,26 +39,28 @@ created: "2026-10-15" ## Per-Task Verification Map -Filled by the planner per task. Requirement → test map from RESEARCH.md: +Filled by plan 05. Every row is a stage of `scripts/check-phase19.3.sh`, which runs the named tests and fails when one is missing, skipped or red (go test -json and TAP detectors). Statuses from the run of 2026-10-15 on a Docker host. | Req | Behavior | Test Type | Automated Command | File Exists | Status | |-----|----------|-----------|-------------------|-------------|--------| -| SC-1 | TokenCookie attrs, MaxAge=refresh_ttl, forget cookie, refresh handler rotates + blacklists JTI, invalid cookie config fails boot | unit | `go test -short ./modules/bouncer -run 'TestTokenCookie\|TestCookieRefresh'` | ❌ W0 | ⬜ pending | -| SC-1 | CORS credentials+`*` boot error, exact origin echo, `Vary: Origin` on preflight, api↔www, `*` non-credentialed unchanged, profile OPTIONS route | unit | `go test -short ./modules/surf -run 'TestCORS'` | partial | ⬜ pending | -| SC-2 | Memory driver Get/Set/Has/Forget/Remember/Increment/Flush, TTL, prefix | unit | `go test -short ./modules/cooler -run TestMemory` | ❌ W0 | ⬜ pending | -| SC-2 | Redis driver, Flush only under prefix | unit + docker | `go test ./modules/cooler -run TestRedis` | ❌ W0 | ⬜ pending | -| SC-2 | Redis `Attempt` parity with `MemoryStore` | unit + docker | `go test ./modules/cooler -run TestRateLimitParity` | ❌ W0 | ⬜ pending | -| SC-2 | BuildRouter uses published `surf.Store`; route:list does not dial | unit | `go test -short ./modules/surf -run TestBuildRouterStore` | ❌ W0 | ⬜ pending | -| SC-3 | `s3://` without tag fails naming `summercms_s3`; with tag opens | unit (both tag modes) | `go test -short ./modules/lagoon/attach -run TestOpenBucketS3` | ❌ W0 | ⬜ pending | -| SC-3 | `summer.yaml` `build.tags` → `go build -tags`; SaveManifest round-trip | unit | `go test -short ./internal/build -run 'TestManifestBuildTags\|TestSaveManifest'` | ❌ W0 | ⬜ pending | -| SC-3 | `public_url` URL building | unit | `go test -short ./modules/lagoon/attach -run TestPublicURL` | partial | ⬜ pending | -| D-15 | PNG as `x.html` → `.png`; docx keeps docx; html-as-txt stays txt | unit | `go test -short ./modules/lagoon/attach -run TestStoreDiskExtension` | ❌ W0 | ⬜ pending | -| SC-3 | `/api-docs` pinned version + SRI; `/api-docs.json`; off by default | unit | `go test -short ./modules/surf -run TestAPIDocs` | ❌ W0 | ⬜ pending | -| SC-3 | Turnstile open/closed matrix, timeout, body restored | unit | `go test -short ./modules/bouncer -run TestTurnstile` | ❌ W0 | ⬜ pending | -| D-10/11 | Purger after-commit only, failure never fails save, alias keys | unit | `go test -short ./modules/cooler -run TestSiteCache` | ❌ W0 | ⬜ pending | -| D-11 | cabana reorder hook runs inside the tx | unit | `go test -short ./modules/cabana -run TestReorderHook` | ❌ W0 | ⬜ pending | -| D-11 | Nuxt shared purge route | unit (node) | `pnpm -C ../vue-menu-layer test` (and faq, journal) | ❌ W0 | ⬜ pending | -| SC-4 | Docs identifiers/links | docs | `go test ./cmd/summer -run TestDocsTree` | ✅ | ⬜ pending | +| SC-1, D-01..D-03 | TokenCookie attributes, Max-Age = refresh window, forget cookie, refresh handler rotates and blacklists the jti, missing cookie 401, LoadCookieConfig errors | unit | `bash scripts/check-phase19.3.sh go` (BOUNCER_TESTS: `TestTokenCookieMaxAgeIsRefreshWindow`, `TestCookieRefreshHandlerRotatesAndBlacklists`, ...) | ✅ `modules/bouncer/cookie_test.go` | ✅ green | +| SC-1, D-04, D-05 | CORS credentials+`*` boot error, patterns, wildcard origin entries, `Vary: Origin`, api↔www credentialed, `*` unchanged, profiles and their OPTIONS routes | unit | `bash scripts/check-phase19.3.sh go` (SURF_TESTS: `TestCORSSubdomainCredentialed`, `TestCORSProfilePreflightRoute`, `TestCORSOptionsMatchesLaravel`, ...) | ✅ `modules/surf/cors_profile_test.go` | ✅ green | +| SC-2, D-07 | Memory driver methods, TTL, bound, atomic Increment; Remember degrades | unit | `bash scripts/check-phase19.3.sh go` (COOLER_TESTS: `TestMemoryCache`, `TestMemoryCacheBounded`, `TestMemoryIncrementConcurrent`, `TestRememberDegrades`) | ✅ `modules/cooler/memory_test.go` | ✅ green | +| SC-2, D-07 | Redis driver (miniredis, `FastForward`), Flush only under `cache:` | unit + docker | `bash scripts/check-phase19.3.sh go` (`TestRedisCache`, `TestRedisFlushOnlyPrefix`); `... docker` (`TestRedisCacheDocker`) | ✅ `redis_test.go`, `docker_test.go` | ✅ green | +| SC-2, D-08 | Redis `Attempt` parity with `surf.MemoryStore`, never more than max under concurrency, fallback on error, key prefix | unit + docker | `bash scripts/check-phase19.3.sh go` (`TestRateLimitParity`, `TestRateLimitConcurrentNeverExceedsMax`, `TestRateLimitFallbackOnError`, `TestRateLimitKeyPrefix`); `... docker` (`TestRateLimitParityDocker`) | ✅ `modules/cooler/ratelimit_test.go` | ✅ green | +| SC-2, D-09 | Install config errors, ping warning, FromApp lazy and reused | unit | `bash scripts/check-phase19.3.sh go` (`TestInstallConfigErrors`, `TestInstallPingWarning`, `TestInstallReusesFromApp`, `TestFromAppLazy`) | ✅ `modules/cooler/install_test.go` | ✅ green | +| SC-2, D-09 | BuildRouter uses a published `surf.Store`, falls back, never dials | unit | `bash scripts/check-phase19.3.sh go` (`TestBuildRouterStoreFallback`, `TestBuildRouterUsesPublishedStore`, `TestBuildRouterNeverDials`) | ✅ `modules/surf/store_lookup_test.go` | ✅ green | +| SC-3, D-12 | `s3://` without the tag names `summercms_s3`; with it opens | unit (both tag modes) | `bash scripts/check-phase19.3.sh go` (ATTACH_TESTS, untagged and `-tags summercms_s3`: `TestOpenBucketS3`) | ✅ `modules/lagoon/attach/s3_test.go` | ✅ green | +| SC-3, D-13 | `summer.yaml` `build.tags` load, validate, round-trip, reach `go build` | unit | `bash scripts/check-phase19.3.sh go` (BUILD_TESTS: `TestManifestBuildTags`, `TestSaveManifestKeepsBuildTags`, `TestGoBuildArgs`, ...) | ✅ `internal/build/manifest_tags_test.go` | ✅ green | +| SC-3 | `public_url` URL building and validation | unit | `bash scripts/check-phase19.3.sh go` (`TestPublicURLBase`, `TestPublicURLValidation`) | ✅ `modules/lagoon/attach/url_test.go` | ✅ green | +| D-15 | DiskExtension table; Store regression through Postgres | unit + docker | `bash scripts/check-phase19.3.sh go` (`TestDiskExtensionTable`); `... docker` (`TestStoreDiskExtension`) | ✅ `diskext_test.go`, `store_test.go` | ✅ green | +| SC-3, D-16, D-17 | `/api-docs` off by default, pinned 5.33.1 with SRI, ordered compact spec JSON | unit | `bash scripts/check-phase19.3.sh go` (`TestAPIDocsServesPinnedPage`, `TestAPIDocsSpecJSONOrder`, ...) | ✅ `modules/surf/apidocs_test.go` | ✅ green | +| SC-3, D-18 | Turnstile open/closed matrix, timeout, form fields, body restored, secret never logged | unit | `bash scripts/check-phase19.3.sh go` (`TestTurnstileVerifyMatrix`, `TestTurnstileMiddlewareRestoresBody`, ...; `TestTurnstileFactoryParams` in surf) | ✅ `modules/bouncer/turnstile_test.go` | ✅ green | +| D-10, D-11 | Purger after commit only, failure and slow receiver never fail the save, SiteCacheFromApp, Install validation | unit + docker | `bash scripts/check-phase19.3.sh go` (`TestSiteCachePurgeConfig`, `TestSiteCachePurgeRequest`, `TestSiteCacheFromApp`, `TestInstallSiteCacheValidation`); `... docker` (`TestSiteCacheAfterCommitOnly`, `TestSiteCacheFailureNeverFails`) | ✅ `modules/cooler/sitecache_test.go` | ✅ green | +| D-11 | cabana reorder hook runs inside the transaction, rolls back on error | docker | `bash scripts/check-phase19.3.sh docker` (`TestReorderHookRunsInTx`, `TestReorderHookErrorRollsBack`, `TestReorderWithoutHookUnchanged`) | ✅ `modules/cabana/reorder_hook_test.go` | ✅ green | +| D-10, D-11 | Plugin purge helpers; Journal framework keys win, alias keys deprecated | unit + docker | `bash scripts/check-phase19.3.sh plugins` (`TestPurgeSiteCacheWithoutTx`, `TestPurgeSiteCacheWithoutPurger`, `TestSiteCacheFrameworkKeysWin`, `TestSiteCacheAliasKeysDeprecated`, `TestSiteCacheNoKeys`); `... docker` (`TestFaqAdminPurgesSiteCache`, `TestMenuAdminPurgesSiteCache`, `TestCategoriesAdminPurgesSiteCache`, `TestPostsAdminPurgesSiteCache`, `TestCategoriesAdminFrameworkKeysWin`) | ✅ three plugins | ✅ green | +| D-11 | Nuxt shared purge route (lib and route handler), shared files byte-identical | unit (node) | `bash scripts/check-phase19.3.sh layers` (11 `sitePurge:` names per layer, `cmp` of the three shared files) | ✅ `tests/sitePurge.test.ts` in three layers | ✅ green | +| SC-4 | Docs identifiers and links; no consuming application named in framework lines of the phase | docs | `bash scripts/check-phase19.3.sh docs` | ✅ | ✅ green | *Status: ⬜ pending · ✅ green · ❌ red · ⚠️ flaky* @@ -66,13 +68,13 @@ Filled by the planner per task. Requirement → test map from RESEARCH.md: ## Wave 0 Requirements -- [ ] `modules/cooler/*_test.go`: memory, redis (miniredis), Docker TestMain, rate-limit parity table shared with `MemoryStore` -- [ ] `modules/bouncer/cookie_test.go`, `turnstile_test.go` -- [ ] `modules/surf/cors_profile_test.go`, `apidocs_test.go`, store-lookup test -- [ ] `modules/lagoon/attach/s3_test.go` (both tag modes), `diskext_test.go`, Store regression -- [ ] `internal/build` manifest tags + SaveManifest round-trip -- [ ] `modules/cabana` reorder hook test -- [ ] Dependency install: `github.com/alicebob/miniredis/v2@v2.40.0` (after its decision note) +- [x] `modules/cooler/*_test.go`: memory, redis (miniredis), Docker suites (per-test containers instead of a TestMain), rate-limit parity table shared with `MemoryStore` +- [x] `modules/bouncer/cookie_test.go`, `turnstile_test.go` +- [x] `modules/surf/cors_profile_test.go`, `apidocs_test.go`, store-lookup test +- [x] `modules/lagoon/attach/s3_test.go` (both tag modes), `diskext_test.go`, Store regression +- [x] `internal/build` manifest tags + SaveManifest round-trip +- [x] `modules/cabana` reorder hook test +- [x] Dependency install: `github.com/alicebob/miniredis/v2@v2.40.0` (test-only, after the Task 4 human check: "approved") ---