Skip to content

Commit 0cf1d01

Browse files
committed
docs: comprehensive post-merge sweep for PRs #800-#820
Update STATUS.md with post-merge housekeeping entry, recertified test counts (4279 backend + 2245 frontend = ~6500+), and delivered status for distributed caching, SSO/OIDC/MFA, and staged rollout. Update TESTING_GUIDE.md with current test counts and new test categories (resilience, MFA/OIDC, telemetry, cache). Update IMPLEMENTATION_MASTERPLAN.md marking all expansion wave items as delivered. Extend AUTHENTICATION.md with OIDC/SSO login flow, MFA setup/verify/ recovery, API key management, and account linking endpoints. Update MANUAL_TEST_CHECKLIST.md: mark all PRs as merged, add testing tasks for error tracking (#811), MCP HTTP transport (#819), distributed caching (#805), and resilience tests (#820).
1 parent edec77a commit 0cf1d01

File tree

5 files changed

+335
-38
lines changed

5 files changed

+335
-38
lines changed

docs/IMPLEMENTATION_MASTERPLAN.md

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

3-
Last Updated: 2026-04-09
3+
Last Updated: 2026-04-12
44
<br>
55
Planning Horizon: Next 8 to 12 weeks
66
Companion Active Docs:
@@ -650,6 +650,12 @@ Delivered in the latest cycle:
650650
- **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
651651
- 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
652652

653+
133. Post-merge housekeeping (2026-04-12):
654+
- batch-merged 7 PRs (`#800`, `#805`, `#811`, `#813`, `#815`, `#819`, `#820`) with conflict resolution
655+
- comprehensive documentation sweep: STATUS.md, TESTING_GUIDE.md, IMPLEMENTATION_MASTERPLAN.md, AUTHENTICATION.md updated to reflect all shipped features
656+
- stale worktrees pruned and merged-PR local branches cleaned up
657+
- test suite recertified: backend 4,279, frontend 2,245, combined ~6,500+ passing
658+
653659
## Current Planning Pivot (2026-03-07)
654660

655661
The 2026-03-06 MVP expansion review packages change the next-cycle emphasis without invalidating the current architecture.
@@ -783,7 +789,7 @@ Focus:
783789
Current status:
784790
- tool registry, policy evaluator, and first bounded template are now delivered (`#337`): `ITaskdeckTool`/`ITaskdeckToolRegistry` domain interfaces, `AgentPolicyEvaluator` with allowlist + risk-level gating, and `InboxTriageAssistant` bounded template (proposal-only, review-first default)
785791
- LLM tool-calling architecture spike completed (`#618`); Phase 1 delivered (`#649`): read tools + orchestrator + provider tool-calling extension; `#674` delivered (OpenAI strict mode + loop detection with error-retry bypass, PR `#694`); `#677` delivered (card ID prefix resolution for chat-to-proposal continuity, PR `#695`); `#650` delivered (write tools + proposal integration, PR `#731`); `#672` delivered (double LLM call elimination, PR `#727`); `#651` delivered (Phase 3 refinements: cost tracking, `LlmToolCalling:Enabled` feature flag, `TruncateToolResult` byte budget with binary search — 17 new tests, PR `#773`); ~~`#673`~~ delivered (argument replay — `Arguments` field on `ToolCallResult`, OpenAI/Gemini replay uses real arguments, 6 new tests, PR `#770`)
786-
- MCP server architecture spike completed (`#619`); Phase 1 delivered (`#652`/`#664`): minimal prototype with `taskdeck://boards` resource over stdio; ~~`#653`~~ delivered (full inventory — 9 resources + 11 tools, PR `#739`); remaining: `#654` (HTTP + auth), `#655` (production hardening, deferred)
792+
- MCP server architecture spike completed (`#619`); Phase 1 delivered (`#652`/`#664`): minimal prototype with `taskdeck://boards` resource over stdio; ~~`#653`~~ delivered (full inventory — 9 resources + 11 tools, PR `#739`); ~~`#654`~~ delivered (HTTP transport + API key auth, PR `#792`/`#819`); remaining: `#655` (production hardening, deferred)
787793
- remaining work: `AgentProfile`/`AgentRun`/`AgentRunEvent` runtime primitives (`#336`), agent mode surfaces (`#338`), inspectable run detail
788794

789795
Exit Criteria:
@@ -855,7 +861,7 @@ Master tracker: `#531`.
855861
- email notification delivery
856862
- activity feed per board
857863
- LLM tool-calling for chat (`#647`: ~~`#649`~~ delivered → ~~`#650`~~ delivered → ~~`#651`~~ delivered)
858-
- MCP server for external agent integration (`#648`: ~~`#652`~~ delivered → `#653`→`#654`)
864+
- MCP server for external agent integration (`#648`: ~~`#652`~~ delivered → ~~`#653`~~ delivered→~~`#654`~~ delivered)
859865

860866
- `v0.5.0` **Power Up** (target: Week 15-20):
861867
- platform installers (Inno Setup, DMG, AppImage)
@@ -936,9 +942,9 @@ Master tracker: `#531`.
936942

937943
### Priority III (Expansion Tranche: Analytics, Security, Compliance, Premium UI Foundations)
938944

939-
- Analytics and forecasting: `#77` (delivered — board metrics dashboard, PR `#667`; SQL-level filtering follow-up ~~`#675`~~ delivered, PR `#724`), `#78`, `#79`
940-
- Security/compliance expansion: `#80` (delivered), `#81` (delivered; capture scope extended), `#82`, `#83` (delivered — GDPR data portability + account deletion, PR `#666`; follow-ups `#670`, ~~`#671`~~ (delivered — JWT invalidation after account deletion, PRs `#698`+`#728`, ADR-0021)), `#106`, `#110` (SEC-10 delivered), `#156`, `#212` (delivered), `#238` (SEC-18 operator tooling + groundwork delivered; live wiring follow-up pending), `#239` (SEC-19 delivered), `#240` (delivered)
941-
- Frontend premium UI foundations wave: `#242`, `#243` (UI-02 shared primitives delivered), `#244`, `#245` (UI-03 stack spike delivered), `#246`, `#247`, `#248`, `#249`, `#250` (PERF-08 delivered)
945+
- Analytics and forecasting: `#77` (delivered — board metrics dashboard, PR `#667`; SQL-level filtering follow-up ~~`#675`~~ delivered, PR `#724`), ~~`#78`~~ (delivered -- exportable analytics CSV, PR `#787`), ~~`#79`~~ (delivered -- forecasting service, PR `#790`)
946+
- Security/compliance expansion: `#80` (delivered), `#81` (delivered; capture scope extended), ~~`#82`~~ (delivered -- SSO/OIDC + MFA, PR `#813`), `#83` (delivered — GDPR data portability + account deletion, PR `#666`; follow-ups `#670`, ~~`#671`~~ (delivered — JWT invalidation after account deletion, PRs `#698`+`#728`, ADR-0021)), `#106`, `#110` (SEC-10 delivered), `#156`, `#212` (delivered), `#238` (SEC-18 operator tooling + groundwork delivered; live wiring follow-up pending), `#239` (SEC-19 delivered), `#240` (delivered)
947+
- Frontend premium UI foundations wave: `#242`, `#243` (UI-02 shared primitives delivered), `#244`, `#245` (UI-03 stack spike delivered), `#246`, `#247`, `#248`, ~~`#249`~~ (delivered -- inbox premium primitives, PR `#788`), `#250` (PERF-08 delivered)
942948
- Frontend premium wave reused dependencies: `#154` (lint/CI), `#88` (visual regression), `#92` (a11y remediation), `#213` (virtualization)
943949
- Seeded secondary MVP follow-through wave (lower priority than Wave P):
944950
- `#329` tracker
@@ -961,10 +967,11 @@ Master tracker: `#531`.
961967
- MCP server implementation wave (from completed spike `#619`):
962968
- `#648` tracker
963969
- ~~`#652` Phase 1: minimal prototype — one resource + stdio + Claude Code~~ (delivered 2026-04-01, PR `#664`)
964-
- `#653` Phase 2: full resource + tool inventory (2-3 weeks)
965-
- `#654` Phase 3: HTTP transport + API key auth (1-2 weeks)
970+
- ~~`#653` Phase 2: full resource + tool inventory~~ (delivered 2026-04-04, PR `#739`)
971+
- ~~`#654` Phase 3: HTTP transport + API key auth~~ (delivered 2026-04-08, PR `#792`)
966972
- `#655` Phase 4: production hardening (deferred to v0.4.0+ demand, `Priority IV`)
967973
- Dependency chain: ~~`#652`~~ → `#653` → `#654` → `#655`
974+
- Dependency chain: ~~`#652`~~ ~~`#653`~~ ~~`#654`~~ `#655`
968975
- Phase 2 mirrors LLM tool-calling tool abstractions; shared Application layer services
969976

970977
### Platform Expansion Wave (2026-03-29 — Priority II)

docs/MANUAL_TEST_CHECKLIST.md

Lines changed: 72 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -899,15 +899,15 @@ Summary scope:
899899
5. Error payload contract verification for auth/validation/sandbox paths (B-100 to B-110)
900900
6. Advanced controller families: ops/logs/users/abuse/llm-quota/agents/knowledge/webhooks/external-imports (B-130 to B-175)
901901

902-
## Z. Outstanding PR Test Backlog (2026-04-10)
902+
## Z. Outstanding PR Test Backlog (2026-04-12)
903903

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.
904+
This section captures testing tasks extracted from PR test plans. All PRs (#797#820) are now merged as of 2026-04-12. Organized by category with source PR references.
905905

906906
Status legend: `[ ]` = not yet performed, `[x]` = verified.
907907

908908
---
909909

910-
### Z1. Security: OIDC/SSO and MFA (PR #813open)
910+
### Z1. Security: OIDC/SSO and MFA (PR #813merged 2026-04-12)
911911

912912
1. [ ] Verify OIDC login flow with a test provider (e.g., Entra ID or Google).
913913
- Precondition: configure `Oidc:Providers` in backend config with a real or test OIDC provider.
@@ -924,7 +924,7 @@ Status legend: `[ ]` = not yet performed, `[x]` = verified.
924924
- Enable MFA for a user. Attempt password change or account deletion.
925925
- Expected: MFA challenge modal appears requiring TOTP code before proceeding.
926926

927-
### Z2. Security: OAuth PKCE and Account Linking (PR #812open)
927+
### Z2. Security: OAuth PKCE and Account Linking (PR #812merged)
928928

929929
1. [ ] Verify GitHub OAuth login still works end-to-end.
930930
- Precondition: `GitHubOAuth:ClientId` and `GitHubOAuth:ClientSecret` configured.
@@ -936,7 +936,7 @@ Status legend: `[ ]` = not yet performed, `[x]` = verified.
936936
- Open browser dev tools Network tab. Click "Sign in with GitHub".
937937
- Expected: authorization URL contains `code_challenge` and `code_challenge_method=S256` parameters.
938938

939-
### Z3. Calendar and Timeline Views (PR #810open)
939+
### Z3. Calendar and Timeline Views (PR #810merged)
940940

941941
1. [ ] Navigate to `/workspace/calendar` and verify the grid renders with cards grouped by due date.
942942
- Expected: cards with due dates appear on the correct calendar days; cards without due dates are not shown.
@@ -949,7 +949,7 @@ Status legend: `[ ]` = not yet performed, `[x]` = verified.
949949
5. [ ] Verify empty state when no cards have due dates.
950950
- Expected: helpful empty state message (not a blank page or error).
951951

952-
### Z4. Note Import and Web Clip Intake (PR #809open)
952+
### Z4. Note Import and Web Clip Intake (PR #809merged)
953953

954954
1. [ ] Verify markdown with multiple headings creates separate capture items in inbox.
955955
- Import a markdown file with 3+ `## Heading` sections via the import API or UI.
@@ -960,12 +960,12 @@ Status legend: `[ ]` = not yet performed, `[x]` = verified.
960960
3. [ ] Verify imported content appears in capture inbox, not directly on board.
961961
- Expected: imports go through the standard capture → triage → proposal flow, not directly to board.
962962

963-
### Z5. Storybook Tooling Validation (PR #807open)
963+
### Z5. Storybook Tooling Validation (PR #807merged)
964964

965965
1. [ ] Run `npm run storybook` and verify dev server launches and all 17 stories render.
966966
- Expected: Storybook opens in browser, all `Td*` component stories load without errors.
967967

968-
### Z6. Deployment and Operations (PRs #806, #798, #799open)
968+
### Z6. Deployment and Operations (PRs #806, #798, #799merged)
969969

970970
**Staged Deployment (PR #806):**
971971
1. [ ] Verify `scripts/deploy/smoke-test.sh` runs successfully against a local Docker Compose stack.
@@ -995,23 +995,23 @@ Status legend: `[ ]` = not yet performed, `[x]` = verified.
995995

996996
### Z7. Testing Infrastructure and Harness (PRs #804, #800, #797, #796 — open/closed)
997997

998-
**Testcontainers (PR #804open):**
998+
**Testcontainers (PR #804merged):**
999999
1. [ ] Verify solution builds cleanly: `dotnet build backend/Taskdeck.sln -c Release`
10001000
2. [ ] Verify existing backend tests pass: `dotnet test backend/Taskdeck.sln -c Release -m:1`
10011001
3. [ ] Verify container integration tests pass locally with Docker running:
10021002
- `dotnet test backend/tests/Taskdeck.Integration.Tests/Taskdeck.Integration.Tests.csproj -c Release`
10031003
4. [ ] Verify CI extended workflow triggers on `testing` label.
10041004
5. [ ] Verify cross-class isolation tests prove no data leakage between test classes.
10051005

1006-
**Cross-Browser E2E Matrix (PR #800open):**
1006+
**Cross-Browser E2E Matrix (PR #800merged):**
10071007
6. [ ] Verify `npx playwright test --project=chromium` runs all existing tests (no `@mobile` exclusion regression).
10081008
7. [ ] Verify `npx playwright test --project=firefox --grep="@cross-browser"` runs only tagged tests.
10091009
8. [ ] Verify `npx playwright test --project=mobile-chrome --grep="@mobile"` runs only mobile-viewport tests.
10101010
9. [ ] Verify CI required workflow still passes with `--project=chromium` flag.
10111011
10. [ ] Verify nightly cross-browser matrix workflow YAML is valid.
10121012
11. [ ] Review flaky test policy doc for completeness (`docs/testing/FLAKY_TEST_POLICY.md`).
10131013

1014-
**Visual Regression (PR #797open):**
1014+
**Visual Regression (PR #797merged):**
10151015
12. [ ] Run `npm run test:visual:update` to generate initial baselines.
10161016
- Expected: baseline screenshots created in `tests/visual/__screenshots__/`.
10171017
13. [ ] Verify visual tests pass after baseline generation: `npx playwright test --config playwright.visual.config.ts`
@@ -1027,7 +1027,7 @@ Status legend: `[ ]` = not yet performed, `[x]` = verified.
10271027
21. [ ] Run `npm run mutation:test` locally to validate frontend Stryker setup (after `npm install`).
10281028
22. [ ] Run `dotnet stryker --config-file stryker-config.json` locally in `backend/` to validate backend setup.
10291029

1030-
### Z8. Platform: PWA and Offline Readiness (PR #802open)
1030+
### Z8. Platform: PWA and Offline Readiness (PR #802merged)
10311031

10321032
1. [ ] Verify offline banner appears when network is disconnected.
10331033
- Open the app, then disable network in browser DevTools.
@@ -1039,14 +1039,14 @@ Status legend: `[ ]` = not yet performed, `[x]` = verified.
10391039
- Open DevTools > Application > Manifest.
10401040
- Expected: manifest is valid, icons are present, start_url is correct, app is installable.
10411041

1042-
### Z9. Platform: SignalR Scale-Out (PR #803open)
1042+
### Z9. Platform: SignalR Scale-Out (PR #803merged)
10431043

10441044
1. [ ] Verify CI pipeline passes for PR #803.
10451045
2. [ ] Verify `/health/ready` returns `signalrBackplane: NotConfigured` on local dev (no Redis configured).
10461046
- Call `GET http://localhost:5000/health/ready`.
10471047
- Expected: response includes `signalrBackplane` component with `NotConfigured` status.
10481048

1049-
### Z10. Platform: PostgreSQL Migration Compatibility (PR #801open)
1049+
### Z10. Platform: PostgreSQL Migration Compatibility (PR #801merged)
10501050

10511051
1. [ ] Verify CI pipeline passes for PR #801.
10521052
- Expected: all 20 `DatabaseProviderCompatibilityTests` pass in CI; no new warnings.
@@ -1118,6 +1118,64 @@ Status legend: `[ ]` = not yet performed, `[x]` = verified.
11181118
1. [ ] Verify CI pipeline passes for concurrency stress tests.
11191119
- Expected: all 13 `ConcurrencyRaceConditionStressTests` pass in CI without deadlocks or flakiness.
11201120

1121+
### Z18. Error Tracking and Product Analytics (PR #811 — merged 2026-04-12)
1122+
1123+
1. [ ] Verify telemetry consent toggle in Profile Settings.
1124+
- Navigate to Profile Settings. Toggle "Product telemetry" on/off.
1125+
- Expected: toggle state persists across page refreshes; no errors in console.
1126+
2. [ ] Verify telemetry events are batched and sent when consent is given.
1127+
- Enable telemetry. Perform several actions (create board, capture item, navigate).
1128+
- Expected: `POST /api/telemetry/events` called within 30s with batched events.
1129+
3. [ ] Verify Sentry integration captures backend errors.
1130+
- Configure `Sentry:Dsn` in backend config. Trigger a 500 error.
1131+
- Expected: error appears in Sentry dashboard with request context.
1132+
4. [ ] Verify DNT/GPC browser signals are respected.
1133+
- Set `navigator.doNotTrack` or `navigator.globalPrivacyControl` to true.
1134+
- Expected: analytics scripts are not injected; telemetry is disabled.
1135+
1136+
### Z19. MCP HTTP Transport and API Key CLI (PR #819 — merged 2026-04-12)
1137+
1138+
1. [ ] Verify `taskdeck api-key create --name "test"` generates a key with `tdsk_` prefix.
1139+
- Expected: key displayed once, starts with `tdsk_`, stored hashed.
1140+
2. [ ] Verify `taskdeck api-key list` shows created keys with masked values.
1141+
- Expected: list shows key name, created date, last-used date; value is masked.
1142+
3. [ ] Verify `taskdeck api-key revoke <id>` removes the key.
1143+
- Expected: key no longer appears in list; API calls with that key return 401.
1144+
4. [ ] Verify MCP HTTP transport accepts API key Bearer tokens.
1145+
- Start API with `--mcp --transport http --port 8080`.
1146+
- Call `POST http://localhost:8080/mcp` with `Authorization: Bearer tdsk_...`.
1147+
- Expected: MCP protocol response with tool listing.
1148+
5. [ ] Verify MCP rate limiting (60 req/60s per API key).
1149+
- Send 61 requests within 60 seconds using the same API key.
1150+
- Expected: 61st request returns 429 Too Many Requests.
1151+
1152+
### Z20. Distributed Caching (PR #805 — merged 2026-04-12)
1153+
1154+
1. [ ] Verify board list is cached (second request faster with cache hit log).
1155+
- Call `GET /api/boards` twice. Check backend logs.
1156+
- Expected: first call logs cache miss; second logs cache hit.
1157+
2. [ ] Verify cache invalidation on board create.
1158+
- Call `GET /api/boards`. Create a new board. Call `GET /api/boards` again.
1159+
- Expected: new board appears immediately (cache invalidated).
1160+
3. [ ] Verify Redis fallback to InMemory when Redis is unavailable.
1161+
- Start backend without Redis configured.
1162+
- Expected: app starts with InMemory cache; no errors; cache still functions.
1163+
4. [ ] Verify NoOp cache mode when caching is explicitly disabled.
1164+
- Set `Cache:Provider` to `None` in config.
1165+
- Expected: no caching behavior; all requests go to database.
1166+
1167+
### Z21. Resilience and Degraded Mode (PR #820 — merged 2026-04-12)
1168+
1169+
1. [ ] Verify board CRUD works when LLM provider is unavailable.
1170+
- Start backend with no LLM provider configured (mock disabled).
1171+
- Expected: board/card/column CRUD works normally; only LLM features degrade.
1172+
2. [ ] Verify SignalR hub errors don't disconnect other clients.
1173+
- Connect two clients to the same board hub. Cause an error on client 1.
1174+
- Expected: client 2 remains connected and functional.
1175+
3. [ ] Verify webhook delivery retries with exponential backoff.
1176+
- Create a webhook subscription pointing to an unreachable endpoint.
1177+
- Expected: delivery retries with increasing intervals; dead-lettered after max retries.
1178+
11211179
---
11221180

11231181
## Incident Rehearsals

0 commit comments

Comments
 (0)