|
2 | 2 |
|
3 | 3 | Use this checklist to manually validate current Taskdeck behavior on `main`. |
4 | 4 |
|
5 | | -Last Updated: 2026-04-05 |
| 5 | +Last Updated: 2026-04-10 |
6 | 6 | Companion Active Docs: |
7 | 7 | - `docs/STATUS.md` |
8 | 8 | - `docs/IMPLEMENTATION_MASTERPLAN.md` |
@@ -899,6 +899,225 @@ Summary scope: |
899 | 899 | 5. Error payload contract verification for auth/validation/sandbox paths (B-100 to B-110) |
900 | 900 | 6. Advanced controller families: ops/logs/users/abuse/llm-quota/agents/knowledge/webhooks/external-imports (B-130 to B-175) |
901 | 901 |
|
| 902 | +## Z. Outstanding PR Test Backlog (2026-04-10) |
| 903 | + |
| 904 | +This section captures testing tasks extracted from PR test plans (open PRs #797–#813 and closed PRs #768–#799) where items were marked unchecked at time of merge or remain pending on open PRs. Organized by category with source PR references. |
| 905 | + |
| 906 | +Status legend: `[ ]` = not yet performed, `[x]` = verified. |
| 907 | + |
| 908 | +--- |
| 909 | + |
| 910 | +### Z1. Security: OIDC/SSO and MFA (PR #813 — open) |
| 911 | + |
| 912 | +1. [ ] Verify OIDC login flow with a test provider (e.g., Entra ID or Google). |
| 913 | + - Precondition: configure `Oidc:Providers` in backend config with a real or test OIDC provider. |
| 914 | + - Expected: clicking the OIDC button redirects to the provider, callback authenticates user, workspace loads. |
| 915 | +2. [ ] Verify MFA setup/confirm/verify/disable flow. |
| 916 | + - Navigate to user settings, enable MFA setup, scan TOTP QR code in authenticator app, enter confirmation code. |
| 917 | + - Expected: MFA is enabled; TOTP code required on subsequent sensitive actions; disable flow removes MFA requirement. |
| 918 | +3. [ ] Verify OIDC login buttons only appear when providers are configured. |
| 919 | + - With no `Oidc:Providers` configured, navigate to `/login`. |
| 920 | + - Expected: no OIDC buttons visible. Only username/password form. |
| 921 | + - With at least one provider configured, navigate to `/login`. |
| 922 | + - Expected: OIDC button(s) visible with provider display names. |
| 923 | +4. [ ] Verify MFA challenge modal appears for sensitive actions when `RequireMfaForSensitiveActions` is `true`. |
| 924 | + - Enable MFA for a user. Attempt password change or account deletion. |
| 925 | + - Expected: MFA challenge modal appears requiring TOTP code before proceeding. |
| 926 | + |
| 927 | +### Z2. Security: OAuth PKCE and Account Linking (PR #812 — open) |
| 928 | + |
| 929 | +1. [ ] Verify GitHub OAuth login still works end-to-end. |
| 930 | + - Precondition: `GitHubOAuth:ClientId` and `GitHubOAuth:ClientSecret` configured. |
| 931 | + - Click "Sign in with GitHub", authorize, verify callback completes and workspace loads. |
| 932 | +2. [ ] Test account linking from Settings page. |
| 933 | + - Log in with username/password. Navigate to account settings. Link a GitHub account. |
| 934 | + - Expected: GitHub identity linked; subsequent logins with that GitHub account land in the same user account. |
| 935 | +3. [ ] Verify PKCE parameters in GitHub authorization URL. |
| 936 | + - Open browser dev tools Network tab. Click "Sign in with GitHub". |
| 937 | + - Expected: authorization URL contains `code_challenge` and `code_challenge_method=S256` parameters. |
| 938 | + |
| 939 | +### Z3. Calendar and Timeline Views (PR #810 — open) |
| 940 | + |
| 941 | +1. [ ] Navigate to `/workspace/calendar` and verify the grid renders with cards grouped by due date. |
| 942 | + - Expected: cards with due dates appear on the correct calendar days; cards without due dates are not shown. |
| 943 | +2. [ ] Switch to timeline mode and verify chronological grouping. |
| 944 | + - Expected: cards appear in a vertical timeline ordered by due date. |
| 945 | +3. [ ] Click month navigation arrows and the "Today" button. |
| 946 | + - Expected: calendar view shifts months correctly; Today returns to current month. |
| 947 | +4. [ ] Click a card in the calendar to verify board drill-down navigation. |
| 948 | + - Expected: navigates to the card's board and opens the card modal. |
| 949 | +5. [ ] Verify empty state when no cards have due dates. |
| 950 | + - Expected: helpful empty state message (not a blank page or error). |
| 951 | + |
| 952 | +### Z4. Note Import and Web Clip Intake (PR #809 — open) |
| 953 | + |
| 954 | +1. [ ] Verify markdown with multiple headings creates separate capture items in inbox. |
| 955 | + - Import a markdown file with 3+ `## Heading` sections via the import API or UI. |
| 956 | + - Expected: each heading section becomes a separate capture item in the inbox. |
| 957 | +2. [ ] Verify web clip preserves URL in provenance. |
| 958 | + - Submit a web clip with a source URL via the import endpoint. |
| 959 | + - Expected: capture item provenance includes the original URL. |
| 960 | +3. [ ] Verify imported content appears in capture inbox, not directly on board. |
| 961 | + - Expected: imports go through the standard capture → triage → proposal flow, not directly to board. |
| 962 | + |
| 963 | +### Z5. Storybook Tooling Validation (PR #807 — open) |
| 964 | + |
| 965 | +1. [ ] Run `npm run storybook` and verify dev server launches and all 17 stories render. |
| 966 | + - Expected: Storybook opens in browser, all `Td*` component stories load without errors. |
| 967 | + |
| 968 | +### Z6. Deployment and Operations (PRs #806, #798, #799 — open) |
| 969 | + |
| 970 | +**Staged Deployment (PR #806):** |
| 971 | +1. [ ] Verify `scripts/deploy/smoke-test.sh` runs successfully against a local Docker Compose stack. |
| 972 | + - Run: `docker compose -f deploy/docker-compose.yml up -d --build` then `bash scripts/deploy/smoke-test.sh` |
| 973 | + - Expected: all 9 automated smoke checks pass (health, API, auth, frontend, SignalR, static assets, security headers, container restart). |
| 974 | +2. [ ] Verify `.github/workflows/cd-staging-gate.yml` YAML is valid. |
| 975 | + - Run: `docker compose -f deploy/docker-compose.yml config` or use a YAML validator. |
| 976 | + - Expected: no syntax errors. |
| 977 | +3. [ ] Confirm ADR-0028 follows template from `docs/decisions/README.md`. |
| 978 | +4. [ ] Review deployment workflow for completeness against rollback criteria in ADR-0028. |
| 979 | +5. [ ] Verify cross-references between all new and existing deployment docs are consistent. |
| 980 | + |
| 981 | +**Cloud Cost Observability (PR #798):** |
| 982 | +6. [ ] Verify all cross-references between cost docs are valid (ADR links, ops doc mutual references). |
| 983 | +7. [ ] Verify ADR appears in `docs/decisions/INDEX.md` with correct number and status. |
| 984 | +8. [ ] Verify LLM cost estimates reference actual supported providers (OpenAI GPT-4o-mini, Gemini 2.5 Flash). |
| 985 | +9. [ ] Verify mitigation actions reference actual Taskdeck config keys and API endpoints. |
| 986 | +10. [ ] Verify runbook phases are actionable given the current architecture (single-node, SQLite, in-process workers). |
| 987 | + |
| 988 | +**Cloud Topology ADR (PR #799 — closed):** |
| 989 | +11. [ ] Verify ADR follows existing template format (matches ADR-0001 through ADR-0022 structure). |
| 990 | +12. [ ] Verify ADR index entry is correctly formatted and numbered. |
| 991 | +13. [ ] Verify topology diagram is consistent with the described components. |
| 992 | +14. [ ] Verify cost estimates reference current AWS pricing tiers. |
| 993 | +15. [ ] Verify follow-up tasks reference existing tracked issues where applicable. |
| 994 | +16. [ ] Verify `STATUS.md` and `IMPLEMENTATION_MASTERPLAN.md` updates are consistent. |
| 995 | + |
| 996 | +### Z7. Testing Infrastructure and Harness (PRs #804, #800, #797, #796 — open/closed) |
| 997 | + |
| 998 | +**Testcontainers (PR #804 — open):** |
| 999 | +1. [ ] Verify solution builds cleanly: `dotnet build backend/Taskdeck.sln -c Release` |
| 1000 | +2. [ ] Verify existing backend tests pass: `dotnet test backend/Taskdeck.sln -c Release -m:1` |
| 1001 | +3. [ ] Verify container integration tests pass locally with Docker running: |
| 1002 | + - `dotnet test backend/tests/Taskdeck.Integration.Tests/Taskdeck.Integration.Tests.csproj -c Release` |
| 1003 | +4. [ ] Verify CI extended workflow triggers on `testing` label. |
| 1004 | +5. [ ] Verify cross-class isolation tests prove no data leakage between test classes. |
| 1005 | + |
| 1006 | +**Cross-Browser E2E Matrix (PR #800 — open):** |
| 1007 | +6. [ ] Verify `npx playwright test --project=chromium` runs all existing tests (no `@mobile` exclusion regression). |
| 1008 | +7. [ ] Verify `npx playwright test --project=firefox --grep="@cross-browser"` runs only tagged tests. |
| 1009 | +8. [ ] Verify `npx playwright test --project=mobile-chrome --grep="@mobile"` runs only mobile-viewport tests. |
| 1010 | +9. [ ] Verify CI required workflow still passes with `--project=chromium` flag. |
| 1011 | +10. [ ] Verify nightly cross-browser matrix workflow YAML is valid. |
| 1012 | +11. [ ] Review flaky test policy doc for completeness (`docs/testing/FLAKY_TEST_POLICY.md`). |
| 1013 | + |
| 1014 | +**Visual Regression (PR #797 — open):** |
| 1015 | +12. [ ] Run `npm run test:visual:update` to generate initial baselines. |
| 1016 | + - Expected: baseline screenshots created in `tests/visual/__screenshots__/`. |
| 1017 | +13. [ ] Verify visual tests pass after baseline generation: `npx playwright test --config playwright.visual.config.ts` |
| 1018 | +14. [ ] Verify CI Extended pipeline runs visual regression job when `visual` label is applied. |
| 1019 | +15. [ ] On an intentional UI change, regenerate baselines and verify diff detection works. |
| 1020 | + |
| 1021 | +**Mutation Testing (PR #796 — closed):** |
| 1022 | +16. [ ] Verify Stryker.NET config is valid JSON and references correct project paths. |
| 1023 | +17. [ ] Verify Stryker JS config exports valid options and references correct vitest config. |
| 1024 | +18. [ ] Verify CI workflow syntax passes GitHub Actions validation. |
| 1025 | +19. [ ] Verify mutation testing workflow is NOT listed in `ci-required.yml` (non-blocking, nightly only). |
| 1026 | +20. [ ] Verify `StrykerOutput` directories are in `.gitignore`. |
| 1027 | +21. [ ] Run `npm run mutation:test` locally to validate frontend Stryker setup (after `npm install`). |
| 1028 | +22. [ ] Run `dotnet stryker --config-file stryker-config.json` locally in `backend/` to validate backend setup. |
| 1029 | + |
| 1030 | +### Z8. Platform: PWA and Offline Readiness (PR #802 — open) |
| 1031 | + |
| 1032 | +1. [ ] Verify offline banner appears when network is disconnected. |
| 1033 | + - Open the app, then disable network in browser DevTools. |
| 1034 | + - Expected: offline indicator/banner appears promptly. |
| 1035 | +2. [ ] Verify service worker update prompt appears when deploying a new build. |
| 1036 | + - Deploy a code change, revisit the app in browser. |
| 1037 | + - Expected: "Update available" prompt appears; clicking it refreshes to the new version. |
| 1038 | +3. [ ] Verify Chrome DevTools > Application > Manifest passes installability checks. |
| 1039 | + - Open DevTools > Application > Manifest. |
| 1040 | + - Expected: manifest is valid, icons are present, start_url is correct, app is installable. |
| 1041 | + |
| 1042 | +### Z9. Platform: SignalR Scale-Out (PR #803 — open) |
| 1043 | + |
| 1044 | +1. [ ] Verify CI pipeline passes for PR #803. |
| 1045 | +2. [ ] Verify `/health/ready` returns `signalrBackplane: NotConfigured` on local dev (no Redis configured). |
| 1046 | + - Call `GET http://localhost:5000/health/ready`. |
| 1047 | + - Expected: response includes `signalrBackplane` component with `NotConfigured` status. |
| 1048 | + |
| 1049 | +### Z10. Platform: PostgreSQL Migration Compatibility (PR #801 — open) |
| 1050 | + |
| 1051 | +1. [ ] Verify CI pipeline passes for PR #801. |
| 1052 | + - Expected: all 20 `DatabaseProviderCompatibilityTests` pass in CI; no new warnings. |
| 1053 | + |
| 1054 | +### Z11. Forecasting and Capacity Planning (PR #790 — closed) |
| 1055 | + |
| 1056 | +1. [ ] Verify forecast endpoint returns correct JSON for a board with completed cards. |
| 1057 | + - Call `GET /api/metrics/boards/{boardId}/forecast` with bearer token. |
| 1058 | + - Expected: JSON with throughput forecast, confidence bands, and projected completion dates. |
| 1059 | +2. [ ] Verify MetricsView shows forecast section with confidence bands. |
| 1060 | + - Navigate to `/workspace/metrics`, select a board with history. |
| 1061 | + - Expected: forecast section renders below the metrics charts with projected dates and confidence intervals. |
| 1062 | +3. [ ] Verify zero-throughput board shows appropriate caveats. |
| 1063 | + - Select a board where no cards have ever been moved to Done. |
| 1064 | + - Expected: forecast section shows a caveat/warning about insufficient throughput data. |
| 1065 | +4. [ ] Verify new board with no history shows "insufficient data" messaging. |
| 1066 | + - Create a brand new board, navigate to metrics. |
| 1067 | + - Expected: forecast section shows "insufficient data" message, not an error or crash. |
| 1068 | + |
| 1069 | +### Z12. Inbox Premium UX Primitives (PR #788 — closed) |
| 1070 | + |
| 1071 | +1. [ ] Verify skeleton loading state appears during slow network. |
| 1072 | + - Throttle network in DevTools to "Slow 3G". Navigate to `/workspace/inbox`. |
| 1073 | + - Expected: skeleton/shimmer loading placeholders appear while data loads. |
| 1074 | +2. [ ] Verify error state renders with retry button on API failure. |
| 1075 | + - Block the inbox API endpoint in DevTools. Navigate to `/workspace/inbox`. |
| 1076 | + - Expected: error state with message and "Retry" button. Clicking retry re-fetches. |
| 1077 | +3. [ ] Verify empty state renders correctly with action buttons. |
| 1078 | + - Navigate to inbox with no captures. |
| 1079 | + - Expected: empty state illustration/message with guidance on how to capture items. |
| 1080 | +4. [ ] Verify dark mode compatibility (all colors use design tokens). |
| 1081 | + - Toggle dark mode. Navigate through inbox list and detail views. |
| 1082 | + - Expected: no hardcoded light-theme colors; all surfaces use design tokens. |
| 1083 | +5. [ ] Verify responsive layout at mobile breakpoints. |
| 1084 | + - Resize browser to 375px width or use mobile device emulation. |
| 1085 | + - Expected: inbox layout adapts (no horizontal overflow, readable text, tappable targets). |
| 1086 | + |
| 1087 | +### Z13. CSV Export UI (PR #787 — closed) |
| 1088 | + |
| 1089 | +1. [ ] Verify "Export CSV" button appears in the metrics dashboard and triggers download. |
| 1090 | + - Navigate to `/workspace/metrics`, select a board. |
| 1091 | + - Expected: "Export CSV" button is visible. Clicking it downloads a `.csv` file with `schema_version=1.0` header comment. |
| 1092 | + |
| 1093 | +### Z14. Accessibility Regression (PR #779 — closed) |
| 1094 | + |
| 1095 | +1. [ ] Visual inspection: modal backdrops, board cards, inbox rows, and form inputs all function normally after a11y fixes. |
| 1096 | + - Navigate through key surfaces: card modal, label manager, inbox, command palette. |
| 1097 | + - Expected: no visual regressions from the aria/a11y attribute changes. |
| 1098 | +2. [ ] Keyboard navigation: modals dismiss on Escape, board cards respond to Enter/Space, inbox rows respond to Enter. |
| 1099 | + - Use only keyboard to navigate through board → open card → close card → open command palette → close palette. |
| 1100 | + - Expected: all interactions work without mouse. |
| 1101 | + |
| 1102 | +### Z15. E2E Error/Edge Scenario Execution (PR #772 — closed) |
| 1103 | + |
| 1104 | +1. [ ] Verify Playwright recognizes all new specs: `npx playwright test --list` shows error-recovery, multi-board, and edge-journey specs. |
| 1105 | +2. [ ] Run the expanded E2E suite against a live backend: |
| 1106 | + - `cd frontend/taskdeck-web && TASKDECK_E2E_DB=taskdeck.e2e.local.db npx playwright test tests/e2e/error-recovery.spec.ts tests/e2e/multi-board.spec.ts tests/e2e/edge-journeys.spec.ts --reporter=line` |
| 1107 | + - Expected: all scenarios pass. |
| 1108 | + |
| 1109 | +### Z16. Dependency Hygiene Verification (PR #771 — closed) |
| 1110 | + |
| 1111 | +1. [ ] Verify frontend builds after ws/p-limit override cleanup: `cd frontend/taskdeck-web && npm run build` |
| 1112 | + - Expected: build completes with no warnings about vendored packages. |
| 1113 | +2. [ ] Verify typecheck passes: `cd frontend/taskdeck-web && npm run typecheck` |
| 1114 | + - Expected: 0 type errors. |
| 1115 | + |
| 1116 | +### Z17. Concurrency Stress Tests CI (PR #793 — closed) |
| 1117 | + |
| 1118 | +1. [ ] Verify CI pipeline passes for concurrency stress tests. |
| 1119 | + - Expected: all 13 `ConcurrencyRaceConditionStressTests` pass in CI without deadlocks or flakiness. |
| 1120 | + |
902 | 1121 | --- |
903 | 1122 |
|
904 | 1123 | ## Incident Rehearsals |
|
0 commit comments