Skip to content

Commit 3aa443d

Browse files
committed
docs: unified post-merge sweep for platform expansion wave (PRs #796-#805)
Pre-resolve expected merge conflicts across all 10 platform expansion PRs: - STATUS.md: consolidated wave summary, new CI workflow entries - IMPLEMENTATION_MASTERPLAN.md: delivery entry #130, next-steps item #20 - TESTING_GUIDE.md: cross-browser, visual regression, mutation, Testcontainers - decisions/INDEX.md: canonical ADR numbering (0023-0027) resolving the 5-way ADR-0023 collision across PRs
1 parent 58e07c9 commit 3aa443d

File tree

4 files changed

+123
-3
lines changed

4 files changed

+123
-3
lines changed

docs/IMPLEMENTATION_MASTERPLAN.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Taskdeck Implementation Masterplan
22

3-
Last Updated: 2026-04-08
3+
Last Updated: 2026-04-09
44
<br>
55
Planning Horizon: Next 8 to 12 weeks
66
Companion Active Docs:
@@ -621,6 +621,20 @@ Delivered in the latest cycle:
621621
- E2E error state expansion (`#712`/`#772`): 25 Playwright scenarios across 3 spec files using `page.route()` interception; adversarial review fixed CI blocker (unused import), route glob, and 3 vacuous assertions
622622
- TST-32–TST-57 wave: 23 of 25 issues now delivered (added `#723`/`#769` and `#725`/`#765` from parallel wave); remaining open: `#705`, `#717`; frontend suite ~1734 passing
623623

624+
130. Platform expansion wave delivery (PRs `#796``#805`, 2026-04-09):
625+
- 10 parallel worktree agents delivered platform hardening, testing infrastructure, ops documentation, and PWA readiness with two rounds of adversarial review per PR (22 CRITICAL + 32 HIGH findings caught and resolved)
626+
- **PLAT-01** SQLite-to-PostgreSQL migration strategy (`#84`/`#801`): ADR-0023 (PostgreSQL target), migration runbook, 20 provider compatibility tests; review caught phantom table, 5 missing tables, FTS5 crash
627+
- **PLAT-02** Distributed caching (`#85`/`#805`): ADR-0024 (cache-aside), `ICacheService` with Redis/InMemory/NoOp implementations, board list caching, 32 tests; review removed unsafe board-detail cache, fixed permanent Redis disable
628+
- **PLAT-03** SignalR scale-out (`#105`/`#803`): ADR-0025 (Redis backplane), conditional `AddTaskdeckSignalR`, health check, runbook, 14 tests; review fixed per-probe connection creation, thread-unsafe fields
629+
- **TST-02** Cross-browser E2E matrix (`#87`/`#800`): Firefox/WebKit/mobile projects, tagging strategy, 9 tests, CI workflows, flaky test policy; review fixed CI gate timeout, extracted shared helpers
630+
- **TST-03** Visual regression harness (`#88`/`#797`): Playwright `toHaveScreenshot()`, 7 visual tests, CI artifact upload, policy doc; review fixed wrong placeholder (guaranteed test failures), double extensions
631+
- **TST-05** Mutation testing pilot (`#90`/`#796`): Stryker.NET + Stryker JS configs, weekly CI workflow (non-blocking), policy doc; review removed broken schema URL, invalid properties
632+
- **TST-06** Ephemeral DBs via Testcontainers (`#91`/`#804`): `Taskdeck.Integration.Tests` project, PostgreSQL containers, per-test isolation, 20 tests, Docker skip; review fixed DbContext race condition, deadlock
633+
- **UX-09** PWA/offline readiness (`#95`/`#802`): VitePWA, service worker, `useOnlineStatus` composable, offline banner, SW update prompt, 18 tests; review eliminated double-reload race, fixed misleading text
634+
- **OPS-12** Cloud cost observability (`#104`/`#798`): ADR-0026, cost framework, hotspot registry, breach runbook; review fixed phantom config keys, wrong API endpoints
635+
- **OPS-14** Cloud topology ADR (`#111`/`#799`): ADR-0027 (ECS Fargate), autoscaling policy, SLO targets, ~$147-152/month estimate, reference architecture; review fixed cost inconsistency, missing worker, health check accuracy
636+
- ADR numbering: PRs originally all created ADR-0023; canonical numbering is ADR-0023 (PLAT-01) through ADR-0027 (OPS-14); file renames needed during merge
637+
624638
## Current Planning Pivot (2026-03-07)
625639

626640
The 2026-03-06 MVP expansion review packages change the next-cycle emphasis without invalidating the current architecture.
@@ -1215,6 +1229,7 @@ Additional P1 issues from the same session (tracked in `#510`–`#515`) cover ex
12151229
10. Keep issue `#107` synchronized as the single wave index and maintain one-priority-label-per-issue discipline (`Priority I` to `Priority V`).
12161230
11. Treat the demo-expansion migration wave (`#297` -> `#302`) as delivered; route any further demo-tooling work through normal scoped follow-up issues such as `#311`, `#354`, `#355`, and `#369` instead of reopening the migration batches.
12171231
12. Test suite baseline counts recertified 2026-04-08: backend ~3,460+ passing, frontend ~1,891 passing, combined ~5,370+. Rigorous test expansion wave (`#721`) fully delivered (25/25 issues).
1232+
20. **Platform expansion wave (2026-04-09)**: 10 issues (`#84`, `#85`, `#87`, `#88`, `#90`, `#91`, `#95`, `#104`, `#105`, `#111`) across 10 PRs (`#796``#805`) delivered platform hardening (PLAT-01/02/03), testing infrastructure (TST-02/03/05/06), PWA readiness (UX-09), and ops documentation (OPS-12/14). 5 new ADRs (ADR-0023 through ADR-0027). Two rounds of adversarial review per PR caught 22 CRITICAL + 32 HIGH issues, all resolved. New test projects: `Taskdeck.Integration.Tests` (Testcontainers). New CI workflows: cross-browser matrix, visual regression, mutation testing, container integration. New infra: `ICacheService`, SignalR Redis backplane, VitePWA service worker.
12181233

12191234
## Documentation Operating Model
12201235
Active docs:

docs/STATUS.md

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Taskdeck Status (Source of Truth)
22

3-
Last Updated: 2026-04-08
3+
Last Updated: 2026-04-09
44
<br>
55
Status Owner: Repository maintainers
66
Authoritative Scope: Current implementation, verified test execution, and active phase progress
@@ -243,6 +243,30 @@ Direction guardrails (explicit):
243243
- `buildQueryString` for API query construction across filter-driven endpoints
244244
- `getErrorMessage` for consistent API/store error extraction
245245

246+
## Platform Expansion Wave (2026-04-09, PRs `#796``#805`, 10 issues)
247+
248+
Ten parallel worktree agents delivered platform hardening, testing infrastructure, ops documentation, and PWA readiness across 10 PRs with two rounds of adversarial review per PR. All CRITICAL and HIGH findings were resolved.
249+
250+
**Architecture & Platform:**
251+
- **PLAT-01 SQLite-to-PostgreSQL migration strategy** (`#84`/`#801`): ADR-0023 recommends PostgreSQL as production target; migration runbook at `docs/platform/SQLITE_TO_POSTGRES_MIGRATION_RUNBOOK.md` with dependency-ordered export/import, FTS5 blocker warning, rollback procedure; 20 provider compatibility tests in `DatabaseProviderCompatibilityTests.cs` covering CRUD, DateTimeOffset, GUID, collation, Unicode; adversarial review caught phantom ApiKeys table, 5 missing tables, FTS5 crash risk
252+
- **PLAT-02 Distributed caching** (`#85`/`#805`): ADR-0024 documents cache-aside pattern; `ICacheService` interface in Application layer; `InMemoryCacheService` (ConcurrentDictionary + sweep timer + 10K cap), `RedisCacheService` (lazy reconnect, safe degradation), `NoOpCacheService`; board list caching with 60s TTL and write-through invalidation; `CacheSettings` config binding; 32 tests; adversarial review removed stale board-detail cache (columns mutated by non-cache-aware services), fixed permanent Redis disable on transient failure, added eviction and timer safety
253+
- **PLAT-03 SignalR scale-out** (`#105`/`#803`): ADR-0025 documents Redis backplane strategy; conditional `AddTaskdeckSignalR` extension with `SignalR:Redis:ConnectionString` toggle; `RedisBackplaneHealthCheck` with 30s cache and three-state reporting (NotConfigured/Healthy/Unhealthy); runbook at `docs/platform/SIGNALR_SCALEOUT_RUNBOOK.md`; 14 tests; adversarial review replaced per-probe ConnectionMultiplexer with singleton lazy connection, fixed thread-unsafe cache fields, corrected ADR Degraded/Unhealthy mismatch
254+
255+
**Testing Infrastructure:**
256+
- **TST-02 Cross-browser E2E matrix** (`#87`/`#800`): Playwright config expanded with Firefox, WebKit, mobile-chrome (Pixel 7), mobile-safari (iPhone 14) projects; `@smoke`/`@cross-browser`/`@mobile`/`@quarantine` tagging strategy; 5 cross-browser + 4 mobile viewport tests with shared `boardUiHelpers.ts`; `reusable-e2e-cross-browser.yml` wired into nightly/extended CI; flaky test policy at `docs/testing/FLAKY_TEST_POLICY.md`; adversarial review fixed CI gate timeout, extracted duplicated helpers, removed conditional assertions
257+
- **TST-03 Visual regression harness** (`#88`/`#797`): Playwright visual comparison via `toHaveScreenshot()` with dedicated `playwright.visual.config.ts` (1280x720, animations disabled, 0.5% threshold); 7 visual tests across board, command palette, archive, inbox, home views; `reusable-visual-regression.yml` with diff artifact upload; policy at `docs/testing/VISUAL_REGRESSION_POLICY.md`; adversarial review fixed wrong command palette placeholder (would fail all palette tests), double `.png.png` extensions, added CI baseline generation
258+
- **TST-05 Mutation testing pilot** (`#90`/`#796`): Stryker.NET config targeting `Taskdeck.Domain` (60/80/0 thresholds); frontend Stryker JS config targeting `captureStore`/`boardStore` + board submodules (~1400 lines) with vitest runner; `mutation-testing.yml` weekly schedule + manual dispatch (non-blocking); policy at `docs/testing/MUTATION_TESTING_POLICY.md`; adversarial review removed broken schema URL, invalid config properties, fixed CI shellcheck violations, corrected concurrency over-subscription
259+
- **TST-06 Ephemeral DBs via Testcontainers** (`#91`/`#804`): new `Taskdeck.Integration.Tests` project with `Testcontainers.PostgreSql` 4.11.0; `PostgresContainerFixture` with per-test database isolation via counter-based `CREATE DATABASE`; `DockerAvailableCheck` with `SkippableFact` for graceful skip without Docker; 20 integration tests across Board CRUD, Card operations, Proposal lifecycle, cross-class isolation, parallel execution; `reusable-container-integration.yml` wired into extended CI; guide at `docs/testing/TESTCONTAINERS_GUIDE.md`; adversarial review fixed race condition (shared DbContext across tasks), deadlock in Docker check, container disposal on partial start
260+
261+
**PWA & Offline:**
262+
- **UX-09 PWA/offline readiness** (`#95`/`#802`): VitePWA integration with `prompt` registerType, `navigateFallback` with `/api/`+`/mcp` denylist, `NetworkFirst` API caching + `CacheFirst` static assets; `useOnlineStatus` composable with reactive `navigator.onLine` tracking; `OfflineBanner` component with ARIA `role="status"`; `SwUpdatePrompt` component via `virtual:pwa-register` for controlled SW update lifecycle; offline behavior doc at `docs/platform/PWA_OFFLINE_BEHAVIOR.md`; 18 tests (11 composable + 7 component); adversarial review eliminated duplicate SW lifecycle handlers (double-reload race), fixed misleading sync text, corrected opaque response caching and SVG icon sizes
263+
264+
**Ops & Architecture Documentation:**
265+
- **OPS-12 Cloud cost observability** (`#104`/`#798`): ADR-0026 documents proactive cost observability decision; framework at `docs/ops/CLOUD_COST_OBSERVABILITY.md` (6 cost dimensions, 3-tier alerts at 70/90/100%, monthly review workflow, Terraform budget template); hotspot registry at `docs/ops/COST_HOTSPOT_REGISTRY.md` (6 features with per-request LLM costs, monthly projections at 4 usage levels); breach runbook at `docs/ops/BUDGET_BREACH_RUNBOOK.md` (5-phase playbook); adversarial review fixed phantom config keys, wrong API endpoint, incorrect JSON payload, compute instance types
266+
- **OPS-14 Cloud topology ADR** (`#111`/`#799`): ADR-0027 documents container-based ECS Fargate topology; autoscaling policy (CPU 65%/25%, 1000 req/min, 500 WS connections); health checks (liveness/readiness/startup); SLO targets (99.5% availability, p95 read <300ms, write <800ms); cost estimate ~$147-152/month; reference architecture at `docs/ops/CLOUD_REFERENCE_ARCHITECTURE.md` (VPC layout, ECS tasks, CI/CD pipeline, DR strategy); adversarial review fixed cost inconsistency, missing worker service, latency alarm gap, health check endpoint accuracy, connection pooling risk
267+
268+
**ADR numbering note**: All 5 PRs that created ADRs originally used ADR-0023. The canonical numbering is ADR-0023 (SQLite migration) through ADR-0027 (cloud topology). PR branches need ADR file renames during merge to match this index.
269+
246270
## Phase Progress (Reconciled)
247271

248272
Progress is tracked against `filesAndResources/taskdeck_technical_design_document.md`.
@@ -863,6 +887,15 @@ Extended/non-blocking workflow: `.github/workflows/ci-extended.yml`
863887
- label/manual-triggered backend solution + E2E smoke lanes (`testing` label or `workflow_dispatch`) for PRs that touch `.github/workflows/**`, `backend/**`, `frontend/**`, `deploy/**`, or `scripts/**`
864888
- label/manual-triggered demo director smoke lane (`automation` label or `workflow_dispatch`) via `.github/workflows/reusable-demo-director-smoke.yml`; docs-only PRs still need manual dispatch because `ci-extended.yml` path filters do not watch `docs/**`
865889
- label/manual-triggered load/concurrency harness lane via `.github/workflows/reusable-load-concurrency-harness.yml`
890+
- label/manual-triggered cross-browser E2E matrix lane via `.github/workflows/reusable-e2e-cross-browser.yml` (5-project parallel matrix: Chromium, Firefox, WebKit, mobile-chrome, mobile-safari)
891+
- label/manual-triggered visual regression lane via `.github/workflows/reusable-visual-regression.yml` (Playwright `toHaveScreenshot()` with diff artifact upload; `testing`/`visual` label)
892+
- label/manual-triggered container integration lane via `.github/workflows/reusable-container-integration.yml` (Testcontainers PostgreSQL; `testing` label)
893+
894+
Mutation testing workflow: `.github/workflows/mutation-testing.yml`
895+
896+
- Weekly schedule (Sunday 04:00 UTC) + manual dispatch
897+
- Backend Stryker.NET (Domain) + Frontend Stryker JS (captureStore/boardStore)
898+
- Non-blocking; HTML/JSON reports uploaded as 30-day artifacts
866899

867900
Release workflow: `.github/workflows/ci-release.yml`
868901

docs/TESTING_GUIDE.md

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
This is the active testing guide for Taskdeck.
44

5-
Last Updated: 2026-04-08
5+
Last Updated: 2026-04-09
66
Companion Active Docs:
77
- `docs/STATUS.md`
88
- `docs/IMPLEMENTATION_MASTERPLAN.md`
@@ -31,6 +31,73 @@ Verification note:
3131
- significant test growth in 2026-04-04 wave 4 (PRs `#765``#770`, `#776`, 7 issues): OAuth token lifecycle integration (19 backend tests, `#723`/`#769`), tool argument replay (6 backend tests, `#673`/`#770`), streaming chat token usage (4 backend tests, `#763`/`#768`), DataExport exception logging (3 backend tests, `#759`/`#766`), Agent API 500 fix (2 un-skipped tests, `#758`/`#776`), frontend HTTP interceptor + router auth guard tests (33 new tests, `#725`/`#765`); all 7 PRs received two rounds of adversarial review with review-fix commits addressing CI failures, performance bugs, resource leaks, misleading test names, and weak assertions
3232
- significant test growth in 2026-04-04 wave 5 (PRs `#771``#779`, 8 issues, ~258 new tests): tool-calling Phase 3 refinements (17 backend tests, `#651`/`#773`), export streaming (15 backend tests, `#670`/`#774`), resilience/degraded-mode (34 tests: 18 backend + 16 frontend, `#720`/`#778`), frontend view vitest coverage (83 tests across 6 views, `#716`/`#775`), Pinia store integration (91 tests across 6 stores, `#711`/`#777`), E2E error state expansion (25 Playwright scenarios, `#712`/`#772`), accessibility lint (105 warnings → 0, `#762`/`#779`), vendored dependency cleanup (`#761`/`#771`); all 8 PRs received two rounds of adversarial review
3333

34+
## Platform Expansion Testing Capabilities (2026-04-09)
35+
36+
The platform expansion wave (PRs `#796``#805`) delivered four new testing capabilities:
37+
38+
### Cross-Browser and Mobile E2E Matrix (TST-02, `#87`/`#800`)
39+
40+
Playwright config expanded with 5 projects: `chromium` (all tests), `firefox`/`webkit` (`@cross-browser` only), `mobile-chrome` Pixel 7/`mobile-safari` iPhone 14 (`@mobile` only). Global `@quarantine` tag exclusion.
41+
42+
Run commands:
43+
```bash
44+
cd frontend/taskdeck-web
45+
npx playwright test --project=chromium # PR gate (default)
46+
npx playwright test --project=firefox # Firefox cross-browser
47+
npx playwright test --grep @mobile # All mobile tests
48+
npx playwright test # Full matrix (nightly)
49+
```
50+
51+
Tagging convention: `@smoke` (quick CI), `@cross-browser` (multi-browser), `@mobile` (viewport), `@quarantine` (flaky, excluded). See `docs/testing/FLAKY_TEST_POLICY.md`.
52+
53+
CI: `reusable-e2e-cross-browser.yml` in nightly + extended (testing label/manual). PR gate stays Chromium-only.
54+
55+
### Visual Regression Testing (TST-03, `#88`/`#797`)
56+
57+
Playwright `toHaveScreenshot()` with dedicated config: 1280x720 viewport, animations disabled, 0.5% pixel tolerance, light color scheme.
58+
59+
Run commands:
60+
```bash
61+
cd frontend/taskdeck-web
62+
npx playwright test --config playwright.visual.config.ts # Run visual tests
63+
npx playwright test --config playwright.visual.config.ts --update-snapshots # Update baselines
64+
```
65+
66+
7 visual tests: board (empty + populated), command palette (open + search), archive, inbox, home. Policy at `docs/testing/VISUAL_REGRESSION_POLICY.md`.
67+
68+
CI: `reusable-visual-regression.yml` in extended CI (testing/visual label). Uploads diff artifacts on failure.
69+
70+
### Mutation Testing (TST-05, `#90`/`#796`)
71+
72+
Backend (Stryker.NET): targets `Taskdeck.Domain` with `Taskdeck.Domain.Tests`. Thresholds: break=60, high=80.
73+
Frontend (Stryker JS): targets `captureStore`, `boardStore`, and `board/*.ts` submodules with vitest runner.
74+
75+
Run commands:
76+
```bash
77+
# Backend
78+
cd backend && dotnet tool install dotnet-stryker && dotnet stryker
79+
# Frontend
80+
cd frontend/taskdeck-web && npm run mutation:test
81+
```
82+
83+
CI: `mutation-testing.yml` runs weekly (Sunday 04:00 UTC) + manual dispatch. Non-blocking, reports uploaded as artifacts. Policy at `docs/testing/MUTATION_TESTING_POLICY.md`.
84+
85+
### Container Integration Tests (TST-06, `#91`/`#804`)
86+
87+
New `Taskdeck.Integration.Tests` project using `Testcontainers.PostgreSql` for ephemeral database isolation. Each test method gets a fresh PostgreSQL database. Requires Docker.
88+
89+
Run commands:
90+
```bash
91+
# Run all (skips gracefully without Docker)
92+
dotnet test backend/tests/Taskdeck.Integration.Tests -c Release
93+
# Run alongside main suite (integration tests auto-skip without Docker)
94+
dotnet test backend/Taskdeck.sln -c Release -m:1
95+
```
96+
97+
20 integration tests: Board CRUD, Card operations, Proposal lifecycle, cross-class isolation, parallel execution. Guide at `docs/testing/TESTCONTAINERS_GUIDE.md`.
98+
99+
CI: `reusable-container-integration.yml` in extended CI (testing label).
100+
34101
## Product-Coherence Testing Priorities (2026-03-07)
35102

36103
Testing priorities have shifted from "does the harness exist?" toward "does the product remain understandable under change?"

docs/decisions/INDEX.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,8 @@
2424
| [0020](ADR-0020-plugin-extension-architecture.md) | Plugin/Extension Architecture RFC and Sandboxing Constraints | Proposed | 2026-04-01 |
2525
| [0021](ADR-0021-jwt-invalidation-user-active-middleware.md) | JWT Invalidation — User-Active Middleware over Token Blocklist | Accepted | 2026-04-03 |
2626
| [0022](ADR-0022-analytics-export-csv-first-pdf-deferred.md) | Analytics Export — CSV First, PDF Deferred | Accepted | 2026-04-08 |
27+
| [0023](ADR-0023-sqlite-to-postgresql-migration-strategy.md) | SQLite-to-PostgreSQL Migration Strategy | Accepted | 2026-04-09 |
28+
| [0024](ADR-0024-distributed-caching-cache-aside.md) | Distributed Caching — Cache-Aside with Redis/InMemory Fallback | Accepted | 2026-04-09 |
29+
| [0025](ADR-0025-signalr-scaleout-redis-backplane.md) | SignalR Scale-Out — Redis Backplane | Accepted | 2026-04-09 |
30+
| [0026](ADR-0026-cloud-cost-observability.md) | Cloud Cost Observability and Budget Guardrails | Accepted | 2026-04-09 |
31+
| [0027](ADR-0027-cloud-target-topology-autoscaling.md) | Cloud Target Topology and Autoscaling Reference Architecture | Accepted | 2026-04-09 |

0 commit comments

Comments
 (0)