Last Updated: 2026-04-13
Status Owner: Repository maintainers
Authoritative Scope: Current implementation, verified test execution, and active phase progress
Companion Active Docs:
docs/STATUS.mddocs/IMPLEMENTATION_MASTERPLAN.mddocs/TESTING_GUIDE.mddocs/MANUAL_TEST_CHECKLIST.mddocs/GOLDEN_PRINCIPLES.md
Taskdeck is a local-first execution system for developers, built with a .NET 8 backend and a Vue 3 frontend. Core board workflows are stable, and advanced slices are implemented for automation proposals, chat, ops/log querying, archive recovery, and worker health reporting.
Rebranding thesis (2026-02-23):
- capture should be near-zero friction
- automation should remain review-first and provenance-visible
- product value is reducing maintenance overhead, not maximizing opaque autonomy
Current constraints are mostly hardening and consistency:
-
security bug discovered 2026-04-03:RESOLVED (#722(SEC-20) �ChangePasswordendpoint does not verify caller identity#722/#732, 2026-04-04):ChangePasswordnow derives userId exclusively from JWT claims;[Authorize]enforced;UserIdremoved from request body;AuthControllerinheritsAuthenticatedControllerBase; 5 integration tests proving the fix -
security and identity behavior is converging but still not uniform across all controller families
-
some UX/operator surfaces are functional but not yet keyboard-first or discoverability-first
-
LLM flow now supports config-gated
OpenAIandGeminiproviders with deterministicMockfallback for safe local/test posture; degraded provider responses are now structurally distinct (messageType: "degraded"+degradedReason) and the health endpoint supports opt-in probe verification (?probe=true); chat-to-proposal pipeline improvements delivered:LlmIntentClassifiernow uses compiled regex patterns with word-distance matching, stemming/plurals, broader verb coverage, and negative context filtering for negations and other-tool questions (#571); parse failures now return structured hint payloads with closest-match suggestions and a frontend hint card with "try this instead" pre-fill (#572); dedicated classifier and chat-to-proposal integration test coverage added (#577); LLM-assisted instruction extraction now delivered (#573): OpenAI and Gemini providers request structured JSON output with a system prompt describing supported instruction patterns, parse the response intoLlmCompletionResult.Instructions, and fall back to the staticLlmIntentClassifierwhen structured parsing fails;ChatServiceiterates LLM-extracted instructions (supporting multiple proposals from a single message) and falls back to raw user message parsing when no instructions are extracted; Mock provider unchanged for deterministic test behavior; multi-instruction batch parsing now delivered (#574):ParseBatchInstructionAsyncsplits multiple natural-language instructions into individual planner calls,ChatServiceroutes multi-instruction messages through batch parsing to generate multiple proposals from a single chat message; board-context LLM prompting now delivered (#575, expanded in#617):BoardContextBuilderconstructs bounded board context (columns, card IDs, titles, labels) grouped per column and appends it to system prompts across OpenAI and Gemini providers viaLlmSystemPromptBuilder; card IDs are included as first-8 hex chars so the LLM can generatemove card <id>instructions; context budget increased to 4000 chars with single-query card fetch; remaining gap: conversational refinement (#576) remains undelivered; analysis atdocs/analysis/2026-03-29_chat_nlp_proposal_gap.md -
managed-key shared-token abuse-control strategy is now explicitly seeded in
#235to#240before broad external exposure -
testing-harness guardrail expansion from
#254to#260is shipped; remaining work is normal follow-up hardening rather than the original wave -
rigorous test expansion wave seeded 2026-04-03 (
#721tracker, 22 issues#699–#726): systematic codebase audit identified 25+ untested infrastructure repositories, zero tests on the central worker, 6 controllers with untested HTTP surfaces, and no golden-path integration test for the capture → proposal → board pipeline; execution is tracked indocs/TESTING_GUIDE.md; first delivery: infrastructure repository integration tests (#699/#730� 77 tests across 7 repo classes against real SQLite); major wave delivery 2026-04-04 (PRs#732–#739, 8 issues, ~300 new tests): SEC-20 ChangePassword fix (#722/#732), golden-path capture→board integration test (#703/#735� 7 tests proving full pipeline), cross-user data isolation tests (#704/#733� 38 tests across all major API boundaries), LlmQueueToProposalWorker integration tests (#700/#734� 24 tests, previously zero coverage), controller HTTP integration tests (#702/#738� 67 tests covering 6 untested controllers, found 2 pre-existing bugs), proposal lifecycle edge cases (#708/#736� 74 tests for state machine/expiry/race conditions), OAuth/auth edge cases (#707/#737� 44 tests, found and fixedSubstringoverflow bug inExternalLoginAsync), MCP full resource/tool inventory (#653/#739� 9 resources + 11 tools with 42 tests, GP-06 compliant, user-scoping gap fixed during review); second wave delivery 2026-04-04 (PRs#740–#755, 8 issues, ~586 new tests with two rounds of adversarial review, 47 review-fix commits): domain entity state machine exhaustive tests (#701/#740� 174 tests across 7 entities: CommandRun, ArchiveItem, ChatSession, UserPreference, NotificationPreference, CardLabel, CardCommentMention), SignalR hub and realtime integration tests (#706/#751� 19 tests covering auth, presence lifecycle, multi-user, authorization, edge cases), LLM provider abstraction and tool-calling edge cases (#709/#747� 101 tests across orchestrator, provider, classifier, registry), data export/import round-trip integrity tests (#713/#752� 64 tests covering JSON, CSV, GDPR, database, cross-format validation), API error contract regression and boundary validation (#714/#753� 57 tests across 7 endpoint families with GP-03 contract enforcement), archive and restore lifecycle integration tests (#715/#755� 74 tests: 45 domain + 29 API covering state machine, cross-user isolation, conflict detection, audit trail), board metrics and analytics accuracy verification (#718/#749� 61 tests: 51 service + 10 controller covering throughput, cycle time, WIP, blocked cards, done-column heuristic), notification delivery, deduplication, and preference filtering (#719/#746� 36 tests covering all 5 notification types, deduplication, preference filtering, cross-user isolation, batch operations) -
MVP dogfooding flow now supports canonical checklist bootstrap in chat (proposal-first, board-scoped); broader template coverage remains future work
-
collaborative editing now includes board/card presence visibility and conflict-hinting guardrails for stale card writes
-
card collaboration now includes threaded comments with mention-linked notifications and moderation-aware edit/delete guardrails
-
capture/inbox realignment is now shipped for the CAP MVP loop (
#200to#211); logging redaction guardrails are delivered in#212, and long-list virtualization for inbox/activity views is delivered in#213 -
frontend interaction latency budgets and instrumentation are delivered in
#250: performance mark composable, route-transition/board/inbox/review/home/diff instrumentation, lazy route splitting, and documented thresholds indocs/PERFORMANCE_BUDGETS.md -
post-demo-expansion planning is now explicitly biased toward product legibility before new surface breadth: novice-first entry, board-context continuity, readable review flows, and stronger in-app guidance take precedence over broad autonomy work
-
cold first-run now has launch-criteria proofing beyond route teaching; guided
Home, durable workspace modes, review-first automation routing, the recoverableTodayonboarding path, board-centered review/capture handoff, key-route contextual help, and the novice-first docs/help-center stack (root entry docs, chaptered manual, and page-level help/workflow guides) are now shipped, and the dedicated first-run smoke plus launch-criteria guardrail is delivered in#328 -
Saul-facing demo reconciliation is now explicit: the core
Home -> Inbox/Capture -> Review -> Boardproof is shipped, the business-facing substrate/trust-cue/hero-path slices are delivered through#354plus demo-critical follow-through from#326and#330; the rehearsal contract is now codified indocs/product/SAUL_DEMO_REHEARSAL_CONTRACT.md(#355), and the GTM baseline is now delivered in#216with a timed demo script (docs/product/DEMO_SCRIPT.md), thesis-aligned landing copy (docs/product/LANDING_COPY.md), and beta intake workflow/cadence (docs/product/BETA_INTAKE_WORKFLOW.md) -
demo rehearsal walkthrough (2026-03-27) confirmed the core loop is visually correct but surfaced 9 runtime issues in seed tooling, scenario runner, and DX ergonomics; two are blockers for one-command deterministic rehearsal: seed re-run 409 conflicts (
#387) and--skip-llmproposal alias resolution failure (#389); tracked in#395with analysis indocs/analysis/2026-03-27_demo-rehearsal-runtime-issues.md -
fresh-registration manual test (2026-03-29) surfaced 2 P0 blockers and 16 additional bugs/observations spanning data isolation, board stability, dark-mode theming, chat utility, and UX polish; full findings at
docs/analysis/2026-03-29_manual_testing_consolidated_findings.md; P0 blockers: queue data not scoped to the authenticated user (#508), board auto-switching on multi-board accounts (#509); P1 issues tracked in#510through#515; P2/P3 in#516through#524; no external user onboarding should occur until#508is resolved; two bugs from this session now resolved: activity audit trail not recording board mutations (#521, fixed � audit logging wired for all board/card/column/label mutations withSafeLogAsyncresilience wrapper), archive board 30-second freeze (#519, fixed � navigation before reactive state teardown prevents cascading re-renders) -
platform expansion strategy (2026-03-29) now covers four strategic pillars: market adoption (
#544), packaging/distribution (#532), cloud/collaboration (#537), and mobile platform (#540); master strategy tracker at#531; strategy documents atdocs/strategy/; release versioning plan:v0.1.0(self-contained exe) →v0.2.0(hosted cloud) →v0.3.0(PWA/mobile) →v0.4.0(collaboration) →v0.5.0(platform maturity) →v1.0.0(GA) -
hands-on UX testing (2026-03-31) surfaced 8 areas of feedback spanning review, inbox, today, home, board, notifications, and LLM chat; 2 P1 issues (capture triage fails on natural-language text
#614, chat response truncation showing raw JSON#616), 11 P2 usability/visual-coherence issues (#611–#613,#615,#617,#620,#622,#624–#627), and 4 P3 polish/strategic items (#618–#619,#621,#623); tracker at#628; full analysis atdocs/analysis/2026-03-31_manual_testing_ux_feedback.md; cross-cutting themes: progressive disclosure needed across review/today/notifications, semantic color vocabulary for status tags, capture pipeline needs LLM-assisted extraction, and chat needs tool-calling/function-calling architecture; LLM tool-calling spike (#618) and MCP server spike (#619) seeded for strategic planning -
UX feedback wave 1 delivered (2026-03-31): 6 of 17 issues from
#628resolved � sidebar footer pinned (#623), card drag layout shift eliminated (#621), starter-pack modal migrated to design tokens (#612), capture triage error messages surfaced with retry hint (#615), board context expanded with card IDs for LLM chat (#617, N+1 query fixed), review proposal cards now use collapsible detail sections with risk color-coding and keyboard-accessible links dropdown (#626) -
UX feedback wave 2 delivered (2026-03-31): 5 additional issues resolved � both P1 blockers closed: capture triage now handles dash-separated (
-) and semicolon-delimited text with first-segment context hints and single-sentence fallback (#614), chat JSON array truncation detection extended to[-started responses with degraded message UX (#616); P2: notification list now has type-colored left borders, type badges, smart same-type grouping, time-based section headers, and batch "Mark all read" with board-scoped optimistic update (#625); P4: global search endpoint now supportsmaxResults/offsetpagination withhasMore/totalCardCountresponse fields and frontend "Load more" in command palette (#610); ops:ci-extended.ymlnow auto-triggers on.csproj/workflow/deploy/script changes, PR template and AGENTS.md updated (#608); remaining open from#628: 0 P2 (delivered in#613#665), 2 P3 strategic spikes (#618,#619) both completed with implementation waves delivered (Phase 1+2 for tool-calling#647, Phase 1 for MCP#648) -
LLM tool-calling spike (
#618) completed (2026-04-01): architecture document atdocs/spikes/SPIKE_618_COMPLETED.md; decided on custom implementation over Semantic Kernel (~800 LOC, zero new dependencies), extendingILlmProviderwithCompleteWithToolsAsync, 11 tools (5 read + 6 write, writes always produce proposals per GP-06), newToolCallingChatOrchestratorwith multi-turn loop (max 5 rounds, 60s timeout), Mock provider with pattern-based dispatch, ~$0.00088 per 3-round conversation on GPT-4o-mini; implementation tracker at#647with phase issues#649(read tools + orchestrator � delivered),#650(write tools + proposals � delivered),#651(Phase 3 refinements � delivered, PR#773) -
LLM tool-calling Phase 1 delivered (
#649, 2026-04-01):CompleteWithToolsAsyncadded toILlmProviderwith OpenAI, Gemini, and Mock implementations; 5 read tool executors (list_board_columns,list_cards_in_column,get_card_details,search_cards,get_board_labels) in Application layer;ToolCallingChatOrchestratorwith multi-turn loop (max 5 rounds, 30s/round, 60s total timeout) and graceful degradation to single-turn on failure; Mock provider uses pattern-matching dispatch table for deterministic simulation; SignalRToolStatusEventintegration for intermediate state streaming;ChatServicedelegates to orchestrator for board-scoped sessions with automatic single-turn fallback; 67 new tests -
LLM tool-calling Phase 2 delivered (
#650/#731, 2026-04-03): 6 write tool executors (propose_create,propose_move,propose_archive,propose_update,propose_bulk_move,propose_create_column) in Application layer; EF migration addsToolCallMetadataJsonfor provenance; orchestrator now serves 11 tools (5 read + 6 write); writes always produce proposals per GP-06; frontend tool-status indicators show write-tool progress via SignalR -
Double LLM call eliminated (
#672/#727, 2026-04-03):ChatServicereuses the orchestrator's text response when no tools are called instead of making a second LLM call; halves latency for non-tool chat messages; remaining follow-up items: argument replay (#673) -
MCP server spike (
#619) completed (2026-04-01): architecture document atdocs/spikes/SPIKE_619_COMPLETED.md; decided on official MCP C# SDK (ModelContextProtocolv1.2.0), embedded in API process with--mcpstartup flag, stdio transport first (Claude Code/Cursor), 9 resources undertaskdeck://URI scheme, 9 tools (2 read + 5 write + 2 proposal management,approve_proposalintentionally excluded), API key auth (tdsk_prefix) for remote HTTP transport, write tools return proposal IDs for review-first compliance; implementation tracker at#648with phase issues#652(minimal prototype),#653(full inventory),#654(HTTP + auth),#655(production hardening, deferred) -
MCP minimal prototype delivered (
#652/#664, 2026-04-01):ModelContextProtocolNuGet v1.2.0 added;IUserContextProviderinterface in Application layer withStdioUserContextProviderimplementation;BoardResourcesclass with[McpServerResource]fortaskdeck://boardsresource returning compact JSON (id, name, columnCount, cardCount, isArchived, updatedAt);--mcpstartup flag inProgram.csselects stdio host builder skipping web server overhead; 11 integration tests covering shape, archived exclusion, counts, empty results, and multi-user scoping -
UX feedback wave 3 delivered (2026-04-01): review proposal card UX improved (
#613/#665) � sticky action footer withposition: sticky; bottom: 0keeps action buttons visible regardless of card content length, cards constrained tomax-height: 70vh(80vh mobile) with internal scrolling, detail section heights capped at12rem -
GDPR data portability delivered (
#83/#666, 2026-04-01):DataExportServiceexports all user-scoped data as versioned JSON package (boards, notifications, captures, proposals, chat sessions, audit trail, preferences);AccountDeletionServicewith password re-authentication + confirmation phrase safeguard, PII anonymization (username/email/password),BoardAccesscleanup, sole-owner guard, transactional rollback on partial failure;DataPortabilityControllerwith[Authorize]+[ResponseCache(NoStore = true)]; PII-free audit logging at request and completion stages; 32 tests; follow-up items: export streaming for large datasets (#670); JWT invalidation after deletion delivered (#671/#698+#728) -
Board metrics dashboard delivered (
#77/#667, 2026-04-01):BoardMetricsServicecomputes throughput (audit-log-based card completion), cycle time (creation-to-done via audit), WIP (cards per column), and blocked card count/duration;MetricsControllerwith date range, board, and label filters; done column resolved by name heuristic (done/complete/finished/shipped/etc.) with positional fallback; frontend dashboard at/workspace/metricswith CSS bar charts, summary cards, tables, board selector, date picker, loading/error/empty states; lazy-loaded route + sidebar nav link; 24 backend + 22 frontend tests; SQL-level filtering follow-up delivered (#675/#724) -
GitHub OAuth frontend integration delivered (
#539/#668, 2026-04-01): conditional "Sign in with GitHub" button in LoginView based on/api/auth/providersresponse; OAuth code exchange flow with demo-mode gating, array-safe query param extraction, and awaited URL cleanup; session store action with error handling and toast notifications; open redirect prevention on both backend (Url.IsLocalUrl) and frontend (sanitizeInternalRedirect); follow-up: distributed auth code store, PKCE, account linking (#676) -
Hardening and UX wave delivered (2026-04-03, PRs
#691–#698): 9 issues resolved across 8 PRs with adversarial review follow-through:- P1 bug fixed (
#681/#691): Archive, Activity, Ops, and Access workspace routes no longer silently redirect to Home � feature flags for shipped surfaces now default totrue; 5 new router guard tests - Expired proposal handling (
#678+#690/#696): Review no longer presents expired proposals as "Approved, ready to apply"; expired proposals show distinct status badge with dismiss/clear action; client-side expiry detection with 60-second reactive clock covers proposals the housekeeping worker hasn't transitioned yet; 9 new tests - Chat card ID continuity (
#677/#695): newCardIdPrefixResolverresolves 8-char hex prefixes to full GUIDs via board-scoped prefix matching; wired intoAutomationPlannerService(6 call sites) andNaturalLanguageInstructionExtractor; full GUIDs pass through without DB hits; 15 new tests - Human-readable proposal diffs (
#682/#697):GetProposalDiffAsyncnow batch-loads cards and columns (2 queries) and resolves operation targets to names; falls back to raw GUID when resolution fails; frontend diff panel with ARIA label and word-wrapping; 4 new tests - Dark theme label manager (
#684/#692): 22 light-theme Tailwind classes replaced with design-token equivalents following ColumnEditModal pattern; 2 new tests - Chat health banner three-state (
#679/#693):verificationStatusfield (unverified/verified/failed) added to health DTO; banner shows amber for configured-but-unverified, green for verified, red for failed; 6 new tests - OpenAI strict mode + loop detection (
#674/#694):strict: trueadded to OpenAI tool schemas; SHA256-based loop detection in orchestrator aborts when consecutive rounds have identical tool-call fingerprints (with error-retry bypass for transient failures); 10 new tests - JWT invalidation after account deletion (
#671/#698):TokenInvalidatedAtfield on User entity with EF migration;TokenValidationMiddlewarechecksIsActiveand compares tokeniatagainst invalidation timestamp on every authenticated request;AccountDeletionServicesets invalidation timestamp during deletion; whole-second precision truncation matches JWTiatgranularity; ADR-0021 documents the design decision; 9 new tests
- P1 bug fixed (
-
Post-hardening delivery wave (2026-04-03, PRs
#724–#731): 6 issues resolved across 6 PRs:- SQL-level board metrics filtering (
#675/#724):BoardMetricsServicenow uses SQL-level filtering via new repository methods (GetForMetricsAsync,CountCardsByColumnAsync,GetBlockedByBoardIdAsync) instead of in-memory filtering; frontendMath.max(...spread)replaced withreducefor empty-array safety - Double LLM call elimination (
#672/#727):ChatServicereuses the orchestrator's text response when no tools are called, halving latency for non-tool chat messages - JWT invalidation hardening (
#671/#728):ActiveUserValidationMiddlewarechecks user active status on every authenticated request with 30-second in-memory cache; cache invalidated on deletion/deactivation - Expired proposal review UX (
#678+#690/#729):IsExpiredflag onProposalDto, domainCanBeDismissedmethod, expired proposals rendered distinctly in Review with dismiss action and disabled apply/approve buttons - Infrastructure repository integration tests (
#699/#730): 77 new tests across 7 repository classes against real SQLite; found and fixed a realLlmQueueRepositoryordering bug - LLM write tools and proposal integration (
#650/#731): 6 write tool executors (propose_create,propose_move,propose_archive,propose_update,propose_bulk_move,propose_create_column), EF migration forToolCallMetadataJson, orchestrator now serves 11 tools total (5 read + 6 write), frontend tool-status indicators for write operations
- SQL-level board metrics filtering (
-
Security + testing + MCP delivery wave (2026-04-04, PRs
#732–#739): 8 issues resolved across 8 PRs with two rounds of adversarial review:- SEC-20 ChangePassword identity bypass fixed (
#722/#732): userId now derived exclusively from JWT claims;[Authorize]enforced;UserIdremoved from request body;AuthControllerrefactored to inheritAuthenticatedControllerBase; 5 new integration tests - Golden-path integration test (
#703/#735): 7 tests exercising full capture → triage → proposal → review → board pipeline; validates card title, column placement, provenance chain, multi-operation atomicity, cross-user isolation, audit trail, and triage failure determinism - Cross-user data isolation tests (
#704/#733): 38 integration tests across all major API boundaries (boards, columns, cards, captures, proposals, notifications, audit trails, chat sessions, knowledge docs, webhooks, board exports, labels, board access controls); includes shared-board grant/scope/revocation tests; adversarial review caught and fixed 3 false-positive tests and missing precondition assertions - LlmQueueToProposalWorker integration tests (
#700/#734): 24 tests covering happy path, empty queue, transient/permanent error, retry/backoff, cancellation, fair-batch interleaving, already-claimed items, and capture triage paths; adversarial review fixed fake repository status-tracking and race condition simulation - Controller HTTP integration tests (
#702/#738): 67 tests covering 6 previously-untested controllers (DataPortability, AbuseContainment, Metrics, Search, AgentProfiles, AgentRuns) + 17 new authz regression matrix entries; discovered 2 pre-existing bugs (agent list 500, empty board export); adversarial review fixed weak assertions and resource leaks - Proposal lifecycle edge cases (
#708/#736): 74 tests (42 domain + 25 application + 7 api) covering expiry timing boundaries, double-apply prevention, comprehensive state machine violations, dismissal edge cases, operation mutation guards, batch expiry, worker-vs-manual race conditions; adversarial review fixed clock-resolution flakiness and added 5 new edge case tests - OAuth/auth edge case tests (
#707/#737): 44 tests covering login/registration edge cases, token validation (malformed/expired/wrong-key/missing-claims), OAuth code exchange, open redirect prevention, middleware enforcement; found and fixed production bug:ExternalLoginAsyncSubstring(0, 50)overflow for short usernames - MCP full resource and tool inventory (
#653/#739): 9 resources undertaskdeck://URI scheme + 11 tools (2 read + 6 write + 3 proposal management); all write tools produce proposals per GP-06;approve_proposalintentionally excluded; 42 MCP-specific tests; adversarial review found and fixed user-scoping gap on proposal resources/tools
- SEC-20 ChangePassword identity bypass fixed (
-
Post-adversarial-review hardening and test expansion wave (2026-04-04, PRs
#741–#756, 9 issues):- Product telemetry taxonomy (
#341/#741):docs/product/TELEMETRY_TAXONOMY.mddefines 35+ named events across 7 categories (Capture, Proposal/Review, Board, Auth, Navigation, Agent, Error) withnoun.verbnaming convention, universal envelope, privacy guardrails (bucketed counts, no PII), and R1/R2/R3 launch gate anchors; telemetry is opt-in and not yet implemented - Board header presence label fixed (
#683/#744):normalizePresenceMembers()inBoardView.vuenow replaces current user's SignalRdisplayNamewith locally-known username, eliminating email/username flip on card open; 3 new tests - Manual card provenance empty state (
#680/#754):cardsApi.getCardProvenance()now returns null only for "Capture provenance not found" 404s (not all 404s); CardModal shows "No capture provenance available." withloadedCaptureProvenanceCardIdguard against flash; 4 new tests; adversarial review caught and fixed 3 bugs (overly broad 404 catch, global Axios log-level regression, empty-state flash) - WIP-limit duplicate toast regression (
#686/#745): 7 regression tests inboardStore.wipLimit.spec.tsguard against future double-toast on WIP limit violations for createCard and moveCard - Auth-flow toast regression coverage (
#685/#742): 20 tests insessionStore.authToast.spec.tscovering login/register/OAuth failure and success toast lifecycle, isolation, and auto-removal; adversarial review fixed timer leak, mock isolation, and inverted assertion - Route and workspace-state stability (
#687/#748):authGuard.spec.ts(auth guard decision table) andworkspaceRouteStability.spec.ts(mode persistence, hydration drift, resetForLogout) with 16-case exhaustive guard table; also fixed pre-existingAuthControllerEdgeCaseTests.cscompile error - Inbox triage action visibility (
#688/#743): 21 new tests inInboxView.spec.tscovering single-item triage action states and bulk action bar visibility with DOM-level assertions - Webhook HMAC signature verification (
#726/#750): 11 tests inOutboundWebhookHmacDeliveryTests.cscovering header format, HMAC round-trip, wrong-key rejection, secret rotation, large payload, and timing-safe comparison; adversarial review fixed rotation test and replaced BCL-testing stubs with real domain property tests - Webhook delivery reliability and SSRF boundary (
#710/#756): 78 webhook tests across 9 files (endpoint guard, service, signature, delivery worker, HMAC delivery, API, repository, domain delivery, domain subscription); SSRF coverage viaOutboundWebhookEndpointGuardTestsincludes private IPv4/IPv6 ranges; delivery reliability covers retry/backoff, dead-letter, concurrent delivery, HMAC at worker boundary;HttpClientresource leak fixed in tests
- Product telemetry taxonomy (
-
Tech-debt, security, and feature hardening wave (2026-04-04, PRs
#765–#770,#776, 7 issues, ~32 new backend tests + 33 new frontend tests, two rounds of adversarial review per PR):- Agent API 500 fix (
#758/#776): root cause wasDateTimeOffsetORDER BY failing in SQLite;AgentProfileRepositoryfixed with materialize-then-sort;AgentRunRepositoryupgraded toIsSqlite()+FromSqlInterpolatedpattern for SQL-level ORDER BY + LIMIT; 2 previously-skipped tests un-skipped; round 2 review caught and fixed the load-all-before-limit performance issue inAgentRunRepository - DataExport exception logging (
#759/#766):ILogger<T>added toDataExportServiceandAccountDeletionServicewithLogErrorin previously-silent catch blocks; round 2 review addedOperationCanceledExceptionfilter to avoid monitoring noise and changed rollback toCancellationToken.Nonefor reliability; 3 new tests - Streaming chat token usage (
#763/#768):LlmTokenEventextended withTokensUsed,Provider, andModelfields; all 3 LLM providers (Mock, OpenAI, Gemini) populate usage on final stream event;ChatService.StreamResponseAsyncnow persists assistantChatMessagewith token usage and records quota viaILlmQuotaService.RecordUsageAsync(matching non-streaming path); 4 new/updated tests - EF Core version alignment (
#760/#767): downgradedMicrosoft.EntityFrameworkCore,.Sqlite,.Design, and.Toolsfrom 9.0.14 to 8.0.14 across Infrastructure and Api projects; removed EF9-onlyPendingModelChangesWarningsuppression; replaced staleMicrosoft.AspNetCore.Http2.3.9 withFrameworkReference Include="Microsoft.AspNetCore.App"; round 2 review addedPrivateAssets="all"to Design package; migration snapshotProductVersion: "9.0.14"is metadata-only, self-corrects on next migration - Frontend HTTP interceptor and auth guard tests (
#725/#765): 33 new tests across 2 files �http.spec.ts(19 tests: token injection, 401 handling, demo mode, X-Request-Id, error propagation) androuterIntegration.spec.ts(14 tests: auth guards, feature flags, legacy redirects, expired token handling);axios-mock-adapteradded as dev dependency; round 2 review fixed CI-breaking ESLintno-import-assignwithvi.hoistedpattern,window.locationrestoration leak, and inaccurate docstring - OAuth token lifecycle tests (
#723/#769): 19 integration tests covering auth code store (valid exchange, expiry, replay prevention, concurrent atomicity, cleanup), JWT lifecycle (expiry, wrong key, garbage token, deactivated user, re-issue after password change), SignalR query-string auth (3 tests), and GitHub OAuth config (2 tests); round 2 review fixed redundant ternary,HttpClientresource leak in concurrent test, misleading SignalR test names, and weak string-contains assertion - Tool argument replay (
#673/#770):Argumentsfield (JsonElement) added toToolCallResultwith backward-compatible default; orchestrator passes original arguments through; OpenAI usesGetRawText()and Gemini uses inlineArgumentsobject in synthetic replay messages instead of hardcoded"{}"/new { }; falls back to empty whenValueKind == Undefined;GeminiLlmProvider.BuildToolCallingPayloadpromoted tointernalfor testability; 6 new tests
- Agent API 500 fix (
-
Dependency hygiene, accessibility, tool-calling refinements, streaming, and test coverage wave (2026-04-04, PRs
#771–#779, 8 issues, ~258 new tests with two rounds of adversarial review per PR):- Vendored dependency cleanup (
#761/#771): removedvendor/ws-7.5.10.tgzfile and orphaned DockerfileCOPY vendor/line;wsnow resolves from npm registry as^7.5.10; no-opp-limit@3.0.2override removed; adversarial review caught stale STATUS.md and MASTERPLAN docs references and updated them - Accessibility lint: 105 warnings → 0 (
#762/#779): form label associations (for/idpairs,aria-label), keyboard event companions for click handlers,role="dialog"+aria-modal+ Escape handler on modal backdrops, redundant-role removals;--max-warnings 20CI threshold enforced; adversarial review found and fixed 2 CI regressions:TdTooltip.vueVue-Fragment breakage (9 failing tests) and invalidtabindex="-1"onrole="option"items; 2 non-blocking ARIA follow-up items filed - Tool-calling Phase 3 refinements (
#651/#773):LlmToolCallingSettingsDI singleton withEnabled(defaulttrue) andMaxToolResultBytes(default 8 000) config keys;ChatServicebypasses orchestrator when disabled;TruncateToolResultenforces UTF-8 byte budget via binary search with zero heap allocations in the search loop; cost tracking DI wiring completed; 17 new tests; adversarial review caught byte-budget contract violation whenmaxBytes < marker lengthand replaced O(n) loop with correct binary search - Export streaming for large datasets (
#670/#774): newGET /api/account/export/streamendpoint streams JSON response body viaUtf8JsonWriter� memory usage is constant regardless of dataset size; N+1 chat-message count query fixed withCountBySessionIdsAsync(single GROUP BY query, 500-session windows to respect SQLite 999-param limit); backward-compatible with original/exportendpoint; 15 tests; adversarial review caughtToErrorActionResult()crash when called afterResponse.HasStarted; streaming HTTP 200 partial-response limitation documented in controller comment - Frontend view vitest coverage (
#716/#775): 83 new tests for 6 previously-untested views (LoginView, RegisterView, BoardsListView, ExportImportView, SavedViewsView, DevToolsView) with DOM-level assertions for loading/error/empty states, user interactions, and form validation; adversarial review fixed 3 ESLint errors (CI blocker: unused vars, invalid[key]selector) and added 3 missing OAuth callback path tests - Pinia store integration tests (
#711/#777): 91 new tests across 6 stores (boardStore, captureStore, workspaceStore, queueStore, notificationStore, sessionStore) mocking HTTP layer rather than API modules, exercising real API client code; covers boardStore auto-switch regression (#509), queueStore data isolation (#508); adversarial review fixed fake timer leak, unreliable microtask drain, and 4as never[]/as nevertype bypasses defeating integration test value - Resilience and degraded-mode tests (
#720/#778): 34 new tests (18 backend + 16 frontend) covering ChatService LLM provider failure/fallback, worker crash/retry/cancellation/max-retries, frontend store error states, SignalR reconnect polling fallback; adversarial review fixed unused import (CI blocker), double-invocation anti-pattern, and 150ms timing race widened to 500ms - E2E error state expansion (
#712/#772): 25 new Playwright scenarios across 3 spec files (error-recovery.spec.ts,multi-board.spec.ts,edge-journeys.spec.ts) usingpage.route()for deterministic error injection without live backend dependency; adversarial review fixed unused import (CI blocker), route glob missing query-param suffix, 3 vacuous soft-assertion blocks replaced with unconditional assertions
- Vendored dependency cleanup (
-
Feature, analytics, MCP, chat, testing, and UX expansion wave (2026-04-08, PRs
#787–#793, 7 issues, ~390+ new tests with two rounds of adversarial review per PR):- Exportable analytics CSV (
#78/#787):MetricsExportServicewith schema-versioned CSV export, CSV injection protection (leading-char and embedded-newline sanitization), UTF-8 BOM for Excel compatibility;GET /api/metrics/boards/{boardId}/exportendpoint with date range/label filters andContent-Dispositionattachment header; frontend "Export CSV" button in MetricsView with error toast;ADR-0022defers PDF export; 29 tests (21 unit + 8 integration); adversarial review caught and fixed embedded-newline injection vector (HIGH), missing CancellationToken forwarding, and silent frontend error swallowing - Forecasting and capacity-planning service (
#79/#790):ForecastingServicewith rolling-average throughput from audit log card-move events, standard-deviation confidence bands (optimistic/expected/pessimistic), average cycle time from creation-to-done;GET /api/forecast/board/{boardId}endpoint with documented assumptions and data-point count; frontend forecast section in MetricsView showing estimated completion, confidence range, and caveats; 32 tests; adversarial review caught and fixed throughput double-counting when cards bounce Done→InProgress→Done (HIGH), history-window calculation using wrong denominator, and regex compiled fresh on every call - MCP HTTP transport and API key authentication (
#654/#792):ApiKeydomain entity withtdsk_prefix and SHA-256 hashing at rest; EF Core migration forApiKeystable with uniqueKeyHashindex;ApiKeyMiddlewarefor Bearer token validation on/mcppath;HttpUserContextProvidermaps API key → user for claims-first identity;ApiKeysControllerREST endpoints (create/list/revoke) with JWT auth;MapMcp()HTTP transport alongside REST endpoints viaModelContextProtocol.AspNetCore; rate limiting per API key (60 req/60s); 31 tests (11 domain + 20 integration); adversarial review caught and fixed key-existence oracle via differentiated error messages (MEDIUM), modulo bias in key generation, and bare catch block - Conversational refinement loop (
#576/#791):ClarificationDetectorwith strong/weak signal pattern split for ambiguity detection, max 2 clarification rounds before best-effort, skip-phrase detection ("just do your best");ChatServiceintegration tracking clarification state and injecting system prompt guidance; Mock provider simulates clarification for deterministic testing; frontend clarification badge and "Skip, just do your best" button in AutomationChatView; 41 tests (22 detector + 7 service + 6 false-positive regression + domain); adversarial review caught and fixed false-positive heuristic classifying normal LLM responses as clarification (HIGH) - Concurrency and race condition stress tests (
#705/#793): 13 stress tests inConcurrencyRaceConditionStressTests.cscovering queue claim races (double-triage, stale timestamp, batch concurrent), card update conflicts (concurrent moves, stale-write 409, last-writer-wins), column reorder race, proposal approval races (double-approve, approve+reject, double-execute), rate limiting under load (burst beyond limit, cross-user isolation), and multi-user board stress; usesSemaphoreSlimbarriers withWaitAsyncfor true simultaneity and separateHttpClientper task; SQLite write serialization limitations documented; proposal decision losers now return409 Conflictvia proposalUpdatedAtoptimistic concurrency; adversarial review fixed misleading doc comments, tightened weak assertions, and replaced non-thread-safe variables withConcurrentDictionary - Property-based and adversarial input tests (
#717/#789): 211 tests across 5 files � 77 FsCheck domain entity tests (adversarial strings: unicode, null bytes, BOM, ZWSP, RTL override, surrogate pairs, XSS, SQL injection; boundary lengths; GUID/position validation), 29 JSON serialization round-trip fuzz tests (GUID format variations, DateTime boundaries, malformed JSON, large payloads), 80 API adversarial integration tests (no 500s from any adversarial input across board/card/column/capture/auth/search endpoints, malformed JSON, wrong content types, concurrent adversarial requests), 16 fast-check frontend input sanitization property tests, 9 store resilience property tests;fast-checkadded as frontend dev dependency; adversarial review fixed capture payload round-trip testing wrong DTO and null handling inconsistency in FsCheck generators - Inbox premium primitives (
#249/#788):InboxView.vuereworked to use shared UI primitive components �TdSkeletonfor loading states,TdInlineAlertfor errors,TdEmptyStatefor empty list,TdBadgefor status chips,TdSpinnerfor detail refresh; ~65 lines of redundant CSS removed; 7 new vitest tests; adversarial review fixed skeleton screen reader announcements (addedrole="status"and sr-only labels) and redundantrole="alert"nesting
- Exportable analytics CSV (
-
Ephemeral integration databases via Testcontainers (
#91):Taskdeck.Integration.Testsproject withTestcontainers.PostgreSqlandNpgsql.EntityFrameworkCore.PostgreSQLpackages;PostgresContainerFixturemanages a shared ephemeral PostgreSQL container per xUnit collection; each test method gets its own isolated database (no cross-test contamination); schema created viaEnsureCreated()from the EF Core model for PostgreSQL provider parity; 20 integration tests across 7 test classes covering Board CRUD, Card operations, Proposal lifecycle, per-test isolation verification, and sequential operation validation; CI workflow atreusable-container-integration.ymlin ci-extended lane (label: testing); guide atdocs/testing/TESTCONTAINERS_GUIDE.md -
Mutation testing pilot now delivered (
#90): Stryker.NET targetingTaskdeck.Domain(backend) and Stryker JS targetingcaptureStore/boardStore(frontend); non-blocking weekly CI lane (.github/workflows/mutation-testing.yml); policy and triage guidance atdocs/testing/MUTATION_TESTING_POLICY.md; 60% low / 80% high thresholds with 0% break (triage signal, not enforcement gate); scope expansion roadmap covers Application layer and additional frontend stores -
Supplementary test depth wave (2026-04-13, PRs
#821–#826, ~429 new tests with two rounds of adversarial review per PR):- Frontend store integration tests (
#711/#821): 88 new tests across 6 files — chatApi integration (22), boardStore column reorder/conflict (11), queueStore polling/transitions (12), sessionStore OIDC/SSO (14), notificationStore realtime (15), workspaceStore mode persistence (14); mocks HTTP layer (not API modules) to test full store → API → HTTP chain; round 2 review fixed missing in-memory state assertions, incorrect resetForLogout test comment, and 12 weakrejects.toBeDefined()assertions replaced with type-specific matchers - E2E scenario expansion (
#712/#822): 20 new Playwright scenarios across 5 spec files — onboarding (5), review proposals (3), capture edge cases (4), keyboard navigation (4), dark mode (4); 17 passing, 3 gracefully skipped (dark mode toggle not present in current UI); round 2 review fixed missingbaseURLin browser context (critical), brittle CSS selectors replaced withgetByLabel, no-op assertions, unreliablebody.click()defocusing, and misleading header comments - Resilience and degraded-mode behavior tests (
#720/#823): 30 new tests across 3 files — LLM provider resilience (13: garbage/empty/missing-choices/429/timeout for OpenAI and Gemini, probe unhealthy), queue accumulation resilience (3: accumulation without corruption, item processability, rapid concurrent captures), frontend slow-API/storage resilience (14: loading states, throttle dedup, corrupted localStorage/token handling); round 2 review fixed CI-breaking unused import, unhandled promise rejections, contradictory test name, and misleading JWT comment - Property-based and adversarial input tests (
#717/#824): 162 new tests across 8 files — domain property tests (93: ChatSession, ChatMessage, Notification, KnowledgeDocument, WebhookSubscription with adversarial strings, boundary lengths, state machine exhaustion), application fuzz tests (19: JSON round-trip for chat/notification DTOs), API adversarial tests (50: raw JSON with adversarial positions, XSS/injection payloads, unicode blocks, extra unknown fields, control chars); round 2 review fixed silent 500-skip, fake[Property]on deterministic tests, 7× copy-pasted generators replaced with shared adversarial generator (~45 vectors), and misleading URL trim comment - Concurrency and race condition stress tests (
#705/#825): 22 new tests across 7 files — queue claim races (4), card update conflicts (5), proposal approval races (4), webhook delivery concurrency (2), board presence concurrency (2), rate limiting (3), cross-user isolation stress (2); usesSemaphoreSlimbarriers for true simultaneous execution; SQLite write serialization limitations documented; round 2 review fixed critical thread-pool deadlock (blockingBarrier.SignalAndWaitin async lambdas), cross-user isolation race condition, silent pass on broken rate limiting, and 2 data-loss-hiding weak assertions - Frontend view and component coverage gaps (
#716/#826): 107 new tests across 8 files — ArchiveView (11), MetricsView (16), BoardView (12), ReviewView (10), AutomationChatView (16), CardItem (21), BoardCanvas (12), BoardActionRail (9); covers loading/error/empty states, user interactions, ARIA attributes, drag events; round 2 review fixed CI-blocking unused import, DOM pollution (missing afterEach cleanup), incorrect generic type, and misleading test name
- Frontend store integration tests (
Target experience metrics for the capture direction:
- capture action to saved artifact should feel under 10 seconds in normal use
- capture artifact to reviewed/applicable proposal should be achievable inside a ~60-second loop
Direction guardrails (explicit):
- no silent/destructive automation by default
- keep proposal-first review gate for board mutations driven by capture triage
- preserve claims-first identity and stable error-contract behavior while expanding surface area
- Architecture: Clean Architecture (
Domain,Application,Infrastructure,Api) - Persistence: EF Core 8.0.14 + SQLite (aligned to net8.0 TFM as of
#760/#767) - Core controllers: boards, columns, cards, labels
- Extended controllers: auth, users, board-access, audit, export/import, external-imports, llm-queue, automation proposals, archive, chat, notifications, ops-cli, logs, health, starter-packs, search, metrics, data-portability, note-import, telemetry, api-keys, forecast, mfa, oidc
- Worker runtime:
LlmQueueToProposalWorkerProposalHousekeepingWorkerWorkerHeartbeatRegistry(used by/health/ready)
- Cross-cutting API consistency:
ApiErrorResponsecontract for stable error payload shape (errorCode,message)ResultExtensionsmapping for domain/app errors to HTTP statuses- JWT challenge/forbidden handlers return
ApiErrorResponsepayloads for middleware-level401/403responses AuthenticatedControllerBasefor claim extraction and authenticated-user guardrails- request correlation middleware (
X-Request-Id) with response echo and log scope propagation - development CORS origin policy keeps localhost defaults (
http://localhost:5173,http://localhost:5174), adds fallback localhost dev ports (http://localhost:4173,http://localhost:5001), and supports additiveCors:DevelopmentAllowedOriginsconfig overrides
- Implemented automation stack:
AutomationProposalService,AutomationPlannerService,AutomationPolicyEngine,AutomationExecutorService(decomposed intoOperationParameterParser,ExecutionAuditRecorder,OperationHandlerRegistry)ArchiveRecoveryService(decomposed intoArchiveConflictDetector,RestorePlanner,RestoreExecutor)StarterPackManifestValidatordecomposed intoStarterPackSchemaValidator,StarterPackSemanticValidator,StarterPackConflictDetector,StarterPackIdempotencyCheckerAbuseDetectionServicewithAbuseActor/AbuseEventdomain entities and a 4-state containment model (Observe → Suspicious → Restricted → Blocked); operator kill-switch API groundwork for SEC-18- agent tool registry substrate (AGT-02):
ITaskdeckTool/ITaskdeckToolRegistrydomain interfaces withToolScope/ToolRiskLevelclassification,PolicyDecisionvalue object,AgentPolicyEvaluator(allowlist + risk-level gating, review-first default),InboxTriageAssistantbounded template (proposal-only, never direct board mutation), singleton registry with scoped evaluation ChatService+ deterministicILlmProviderselection policy (Mockdefault;OpenAI/Geminibehind explicit gates with config validation fallback);ToolCallingChatOrchestratorwrapsChatServicefor board-scoped sessions with multi-turn tool-calling loop (11 tools: 5 read + 6 write, max 5 rounds, 60s timeout, Mock pattern-based dispatch); write tools produce proposals viapropose_*prefix (GP-06 compliant);ChatServicereuses orchestrator text when no tools called to avoid double LLM invocation; streaming responses now persist assistantChatMessagerecords with token usage and record quota viaILlmQuotaService(#763/#768); multi-turn replay preserves original tool arguments in provider-specific wire format (#673/#770); conversational refinement loop (#576/#791):ClarificationDetectorwith strong/weak signal pattern split detects ambiguous requests and asks clarifying questions (max 2 rounds, then best-effort); skip-phrase detection supports "just do your best"; Mock provider simulates clarification for deterministic testingDataExportService(versioned JSON export of all user-scoped data; streaming export via newGET /api/account/export/streamendpoint usingUtf8JsonWriterfor memory-constant large-dataset exports �#670/#774; exception logging viaILoggerwithOperationCanceledExceptionfilter,#759/#766) +AccountDeletionService(password re-auth, confirmation phrase, PII anonymization, sole-owner guard, transactional rollback withCancellationToken.Nonefor rollback reliability) +DataPortabilityControllerwith audit loggingBoardMetricsService(throughput, cycle time, WIP, blocked � audit-log-based completion tracking, done column name heuristic, SQL-level filtering via dedicated repository methods) +MetricsControllerwith date/board/label filters +MetricsExportServicefor schema-versioned CSV export with CSV injection protection (#78/#787)ForecastingService(heuristic completion forecasting using rolling-average throughput from audit log card-move events, standard-deviation confidence bands, cycle time tracking) +ForecastControllerwithGET /api/forecast/board/{boardId}endpoint (#79/#790)- MCP server:
ModelContextProtocolv1.2.0 with full resource and tool inventory (#653/#739); 9 resources undertaskdeck://URI scheme (boards, board detail, columns, cards, card detail, captures, proposals, board labels); 11 tools (2 read:search_cards,get_board_summary; 6 write:create_card,move_card,update_card,archive_card,create_capture,create_column� all produce proposals per GP-06; 3 proposal management:get_proposal_status,list_proposals,dismiss_proposal;approve_proposalintentionally excluded);--mcpstartup flag for stdio transport;StdioUserContextProviderfor local user mapping; user-scoped proposal access enforced; MCP HTTP transport (#654/#792):ModelContextProtocol.AspNetCoreaddsMapMcp()HTTP endpoint alongside REST routes;ApiKeyentity withtdsk_prefix and SHA-256 hashing at rest;ApiKeyMiddlewarevalidates Bearer tokens on/mcppath;HttpUserContextProvidermaps API key → user identity; REST key management (create/list/revoke); rate limiting per API key (60 req/60s) NotificationServicewith per-user preference filtering and deduplication safeguards- outbound webhook integration baseline: board-scoped webhook subscriptions (endpoint + event filters + secret rotation/revocation), mutation-event delivery queueing, and signed delivery worker retries/dead-letter transitions
OpsCliService+LogQueryServiceStarterPackManifestValidator+StarterPackApplyService(idempotent apply with dry-run conflict reporting)- SignalR realtime baseline:
BoardsHubwith board-scoped subscription authz and application-level board mutation event publishing; scale-out readiness (#105/ADR-0023): conditional Redis backplane viaMicrosoft.AspNetCore.SignalR.StackExchangeRedis8.0.25 � enabled whenSignalR:Redis:ConnectionStringis configured, falls back to in-memory when absent;RedisBackplaneHealthCheckreports NotConfigured/Healthy/Unhealthy in/health/ready; operational runbook atdocs/platform/SIGNALR_SCALEOUT_RUNBOOK.md - OpenTelemetry baseline for API + worker metrics/traces with configurable OTLP/console exporters
- security logging redaction baseline for capture/auth-sensitive flows: sanitized exception summaries in middleware/workers/providers, generic invalid-source errors, redacted persisted queue/webhook failure messages, and disabled automatic ASP.NET Core trace exception recording
- Auth posture today:
- JWT middleware is wired
ActiveUserValidationMiddlewarechecks user active status on every authenticated request (30-second in-memory cache, invalidated on deletion/deactivation); tokens issued before account deletion/deactivation are rejected even if JWT is unexpired[Authorize]currently enforced on boards, columns, cards, labels, export/import, audit, llm-queue, board-access, users, chat, notifications, automation-proposals, archive, ops-cli, and logs controllers- GitHub OAuth login (
CLD-03): environment-gated OAuth middleware activates only whenGitHubOAuth:ClientIdandGitHubOAuth:ClientSecretare configured;ExternalLoginentity links GitHub accounts to users without auto-linking by email (prevents account takeover); OAuth callback uses short-lived single-use authorization codes (now DB-backed with atomic consumption, replacing in-memoryConcurrentDictionary); PKCE enabled viaUsePkce = true; account linking endpoints allow existing users to link/unlink GitHub identity from settings; frontend LoginView conditionally shows "Sign in with GitHub" button based on/api/auth/providersresponse; full test coverage in Domain, Application, and frontend layers - OIDC/SSO integration (
SEC-07): config-gated pluggable OIDC provider support (Microsoft Entra ID, Google, generic OIDC) viaIOidcProviderFactory; OIDC login/callback/exchange with open-redirect protection; cross-provider identity isolation (provider + providerUserIdunique key); no auto-linking by email; disabled by default - TOTP MFA (
SEC-07): optional MFA viaMfaPolicyconfiguration; TOTP setup with QR URI and 8 bcrypt-hashed recovery codes; constant-time comparison; replay protection;MfaChallengeModalgates sensitive actions when policy requires
- Stack: Vue 3 + TypeScript + Pinia + Vue Router + Vite
- Workspace routes include:
- home
- boards
- activity
- review
- automation queue/chat (advanced)
- notifications (inbox + read-state actions)
- ops (cli/endpoints/logs)
- metrics (board throughput, cycle time, WIP, blocked trends, CSV export, heuristic forecasting with confidence bands)
- calendar (monthly grid + timeline modes for due-date cards with overdue/blocked indicators)
- agents (agent profiles, runs, run-detail timeline � visible in agent workspace mode only)
- settings (profile/preferences/access/export-import/linked-accounts/mfa-setup/telemetry-consent)
- archive
- Current navigation is now partially product-shaped:
Homeis the default landing route, backed by persistedguided/workbench/agentworkspace modes and a product-shaped workspace summary APITodayis now shipped as the daily agenda route, whileAgents,Runs,Knowledge, andIntegrationsremain planned but not shipped- a static frontend-only UI mock now exists at
frontend/taskdeck-web/public/mock/for lightweight GitHub Pages-style walkthroughs of the currentHome/Today/Review/Inbox/Boardfeel using local example data only, and GitHub Pages now deploys that folder through a dedicated Actions workflow instead of the old branch-basedmain+/docspath
- Feature slices integrated end to end:
- workspace home summary shell with server-backed workspace mode persistence
- workspace
Todayagenda with persisted onboarding state, replay/dismiss controls, and first-use board setup shortcuts - canonical review-first proposal routing/approve/reject/execute and diff viewing with readable proposal presentation cards
- board-centered action rail and board-aware deep links across board, inbox, review, chat, notifications, and capture provenance flows
- dismissible contextual help callouts across
Home,Today,Review,Inbox, board action flow, and selector-heavy activity guidance, with per-surface replay/dismiss persistence - audience-first docs/help-center stack aligned to the shipped
Home/Today/Inbox/Review/Boardsshell, with root entry docs, chaptered manual guidance, workflow recipes, FAQ coverage, and troubleshooting guidance - chat session flow with selector-safe board context and review handoff
- ops template execution and log querying with route-aware tab defaults
- archive listing and restore operations
- notification inbox and per-user notification preference controls
- board realtime subscription lifecycle (SignalR join/leave/reconnect with polling fallback)
- batch triage and suggestion editing for inbox artifacts
- keyboard card movement (Alt+Arrow) and move-to action menu on cards
- Storybook baseline: Storybook 10.3.5 with stories for all 17 Td* primitives;
npm run storybook(dev :6006) andnpm run storybook:buildscripts - Note-style import: markdown file upload (heading-based section splitting) and web clip paste intake tabs in ExportImportView; all content routes through capture pipeline
- OIDC login buttons: config-gated SSO buttons on LoginView for configured OIDC providers
- Error tracking: config-gated Sentry browser SDK, Plausible/Umami analytics script injection, telemetry consent UI in settings
- Cross-cutting UI infrastructure:
- command palette with global search (Ctrl+K): live cross-board search for boards and cards via
/api/search, with 200ms debounced queries, abort-on-supersede, and keyboard-first grouped results navigation - feature flags, correlation IDs, toasts, keyboard shortcuts
- shared UI primitives foundation (UI-02): 15 TdButton/TdInput/TdDialog/TdDropdown/TdTooltip/TdBadge/etc. primitives built on Reka UI via shadcn-vue ownership model with WAI-ARIA keyboard foundation; stack decision documented in
docs/analysis/ui-primitive-stack-decision-spike.md - appshell premium reskin: shell sidebar, topbar, command palette, and keyboard help components now use
--td-*design token system with focus-visible accessibility rings and glass morphism effects - board/card surface polish: board canvas, toolbar, action rail, column lanes, and card components now use design-token-based styling with standardized interactive states and accessibility focus rings
- centralized JWT token storage abstraction (
utils/tokenStorage.ts) with base64url + JSON payload validation,isValidJwtStructureguard, andclearAllhelper; session-token storage ADR atdocs/analysis/session-token-storage-adr.md - CSP hardening: removed
unsafe-inlinefromscript-srcin security headers middleware; OWASP baseline doc updated - performance instrumentation composable (
usePerformanceMark) withPERF_BUDGETSconstants; 7 latency thresholds documented indocs/PERFORMANCE_BUDGETS.md; 16 workspace route views converted to lazy() => import()for initial bundle reduction - WCAG 2.1 AA accessibility baseline: skip-to-content link,
sr-onlyutility,eslint-plugin-vuejs-accessibilityrules, ARIA landmarks and roles across HomeView/TodayView/ReviewView/InboxView/CaptureModal/ToastContainer/BoardView, and Playwright axe-core E2E regression for 6 core views - PWA/offline client readiness (
#95):vite-plugin-pwaconfigured with WorkboxgenerateSW(84 precached app shell entries), runtime caching (NetworkFirst for API, CacheFirst for static assets, StaleWhileRevalidate for fonts), SPA navigateFallback for offline deep links;useOnlineStatuscomposable with reactive connectivity tracking;OfflineBannercomponent with ARIA live region;SwUpdatePromptcomponent for user-controlled SW updates; manifest with correct installability criteria (separateany/maskableicon purposes); offline behavior documented indocs/platform/PWA_OFFLINE_BEHAVIOR.md
- command palette with global search (Ctrl+K): live cross-board search for boards and cards via
- Large view decompositions (hotspot refactor wave):
ActivityView.vuedecomposed from ~735 → ~117 lines viauseActivityQuerycomposable +ActivitySelector+ActivityResultscomponentsBoardView.vuedecomposed from ~771 → ~270 lines viauseBoardDragDrop+useBoardKeyboardNavcomposables +BoardToolbar+BoardActionRail+BoardCanvas+BoardDialogHostcomponents
- Demo baseline (migration batches A + B + C + D + E delivered):
frontend/taskdeck-web/scripts/demo-seed.mjs+npm run demo:seedfor first-run seeded workspace generation, now bounded on reruns so canonical seeded captures, queue samples, chat evidence, comments, and Ops logs are reused instead of appended indefinitelyfrontend/taskdeck-web/scripts/demo-lib.mjs,frontend/taskdeck-web/scripts/demo-run.mjs,frontend/taskdeck-web/scripts/demo-autopilot.mjs,frontend/taskdeck-web/scripts/scenario-json-runner.mjs,frontend/taskdeck-web/scripts/scenarios-json/*, andfrontend/taskdeck-web/scripts/scenarios/*(compatibility path) for reusable scripted scenario/autopilot harness flowsfrontend/taskdeck-web/scripts/demo-director.mjs+frontend/taskdeck-web/scripts/demo-snapshot.mjswithnpm run demo:directorandnpm run demo:snapshotfor one-command orchestration and artifact capture (run-summary.json,trace.ndjson,snapshot.json, screenshots, logs)frontend/taskdeck-web/scripts/demo-director-presets.mjsfor named preset scenarios (happy-path-capture, review-approve-flow, error-recovery-demo, soak-baseline) with override merging and runtime registrationfrontend/taskdeck-web/scripts/demo-trace-assertions.mjsfor exact and structural trace comparison plus step ordering and error detection assertionsfrontend/taskdeck-web/scripts/demo-report-html.mjsfor self-contained HTML report generation with inline styles, trace tables, pass/fail badges, and embedded base64 screenshotsfrontend/taskdeck-web/scripts/demo-soak.mjsfor long-run director scenario loops with configurable iteration counts, cooldown, and cumulative metrics tracking- full Playwright-backed demos now auto-enable a live LLM provider when LLM steps are enabled and usable demo keys are present, preferring Gemini by default for long/manual runs while preserving explicit mock opt-out
- non-demo Playwright backend startup now stays pinned to deterministic
Mockmode by default even when local shell env exports live-provider keys; demo-only overrides still take precedence when explicitly enabled - when demo-specific live-provider overrides need to be injected, Playwright now disables existing-server reuse by default so full demos do not silently stick to an older mock backend unless the operator explicitly forces reuse
frontend/taskdeck-web/package.jsonnow includesnpm run demo:director:smokefor deterministic, LLM-free regression proof with stable artifact output (demo-artifacts/ci-smoke), isolated smoke DB reset (taskdeck.demo.ci.db), forced fresh Playwright servers, automatic local API port fallback when5000is occupied, and actionable conflict hints when explicit runtime port overrides cannot binddocs/product/DEMO_PLAYBOOK.md,docs/product/SCENARIOS.md,docs/product/DOGFOODING_GUIDE.md, anddocs/USER_MANUAL.mdfor seeded stakeholder walkthrough, JSON scenario authoring/runner usage, daily dogfooding cadence, and user-facing operations guidancedemo/http/taskdeck-demo.httpfor local API walkthrough against the dev backend- opt-in stakeholder walkthrough recorder spec:
frontend/taskdeck-web/tests/e2e/stakeholder-demo.spec.ts(gated byTASKDECK_RUN_DEMO=1) with director-mode bootstrap viaTASKDECK_DEMO_DIRECTOR=1, scenario-aware board selection, explicit-board override alignment with autopilot targeting, UI-driven feature-flag enabling for advanced surfaces, and mandatory seeded-card presence checks - scenario runner and legacy JS compatibility checks now fail loudly on unresolved template references, missing starter-pack labels, ambiguous duplicate column/label names, and unknown scenario IDs so demo/test setup does not degrade into half-valid state
demo:directornow validates its own flags before Playwright passthrough (--required for forwarded args) so malformed option usage fails fast instead of silently drifting into partial demo state- required Playwright CI lanes explicitly pin
TASKDECK_RUN_DEMO=0; opt-in demo smoke is exposed inci-extended.ymlvia the reusabledemo-director-smokeworkflow for PRs that touch.github/workflows/**,backend/**,frontend/**,deploy/**, orscripts/**, or through manual dispatch - autopilot loop controls now cover queue/capture/mixed paths with capture-triage flags for inbox-flow demonstration
- autopilot deterministic replay supports
--rng-seed(with--seedbackward compatibility) and emits trace events for artifact summarization - JSON scenarios now support
runOpssteps for seeded Ops evidence inside scenario runs - advanced/diagnostic nav surfaces now default off via feature flags (
Activity,Ops,Access,Archive) Automationsnav now defaults to proposals review path instead of queue path- queue composer now defaults to instruction-first request type with guided helper text and board-context guardrails for board-scoped instructions
- Automation Chat now exposes explicit provider-health truth (
/api/llm/chat/health) so operators and tests can see whether the surface is using a live provider, mock provider, or a degraded/unavailable path;?probe=truesends a minimal completion to verify reachability; degraded responses now carrymessageType: "degraded"withdegradedReasoninstead of embedding failure text in normal response content - opt-in live-provider chat verification now exists at
frontend/taskdeck-web/tests/e2e/live-llm.spec.ts(gated byTASKDECK_RUN_LIVE_LLM_TESTS=1), with headed local entry points innpm run test:e2e:audit:headedandnpm run test:e2e:live-llm:headed
- Shared maintainability utilities:
buildQueryStringfor API query construction across filter-driven endpointsgetErrorMessagefor consistent API/store error extraction
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.
Architecture & Platform:
- PLAT-01 SQLite-to-PostgreSQL migration strategy (
#84/#801): ADR-0023 recommends PostgreSQL as production target; migration runbook atdocs/platform/SQLITE_TO_POSTGRES_MIGRATION_RUNBOOK.mdwith dependency-ordered export/import, FTS5 blocker warning, rollback procedure; 20 provider compatibility tests inDatabaseProviderCompatibilityTests.cscovering CRUD, DateTimeOffset, GUID, collation, Unicode; adversarial review caught phantom ApiKeys table, 5 missing tables, FTS5 crash risk - PLAT-02 Distributed caching (
#85/#805): ADR-0024 documents cache-aside pattern;ICacheServiceinterface 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;CacheSettingsconfig 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 - PLAT-03 SignalR scale-out (
#105/#803): ADR-0025 documents Redis backplane strategy; conditionalAddTaskdeckSignalRextension withSignalR:Redis:ConnectionStringtoggle;RedisBackplaneHealthCheckwith 30s cache and three-state reporting (NotConfigured/Healthy/Unhealthy); runbook atdocs/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
Testing Infrastructure:
- 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/@quarantinetagging strategy; 5 cross-browser + 4 mobile viewport tests with sharedboardUiHelpers.ts;reusable-e2e-cross-browser.ymlwired into nightly/extended CI; flaky test policy atdocs/testing/FLAKY_TEST_POLICY.md; adversarial review fixed CI gate timeout, extracted duplicated helpers, removed conditional assertions - TST-03 Visual regression harness (
#88/#797): Playwright visual comparison viatoHaveScreenshot()with dedicatedplaywright.visual.config.ts(1280x720, animations disabled, 0.5% threshold); 7 visual tests across board, command palette, archive, inbox, home views;reusable-visual-regression.ymlwith diff artifact upload; policy atdocs/testing/VISUAL_REGRESSION_POLICY.md; adversarial review fixed wrong command palette placeholder (would fail all palette tests), double.png.pngextensions, added CI baseline generation - TST-05 Mutation testing pilot (
#90/#796): Stryker.NET config targetingTaskdeck.Domain(60/80/0 thresholds); frontend Stryker JS config targetingcaptureStore/boardStore+ board submodules (~1400 lines) with vitest runner;mutation-testing.ymlweekly schedule + manual dispatch (non-blocking); policy atdocs/testing/MUTATION_TESTING_POLICY.md; adversarial review removed broken schema URL, invalid config properties, fixed CI shellcheck violations, corrected concurrency over-subscription - TST-06 Ephemeral DBs via Testcontainers (
#91/#804): newTaskdeck.Integration.Testsproject withTestcontainers.PostgreSql4.11.0;PostgresContainerFixturewith per-test database isolation via counter-basedCREATE DATABASE;DockerAvailableCheckwithSkippableFactfor graceful skip without Docker; 20 integration tests across Board CRUD, Card operations, Proposal lifecycle, cross-class isolation, parallel execution;reusable-container-integration.ymlwired into extended CI; guide atdocs/testing/TESTCONTAINERS_GUIDE.md; adversarial review fixed race condition (shared DbContext across tasks), deadlock in Docker check, container disposal on partial start
PWA & Offline:
- UX-09 PWA/offline readiness (
#95/#802): VitePWA integration withpromptregisterType,navigateFallbackwith/api/+/mcpdenylist,NetworkFirstAPI caching +CacheFirststatic assets;useOnlineStatuscomposable with reactivenavigator.onLinetracking;OfflineBannercomponent with ARIArole="status";SwUpdatePromptcomponent viavirtual:pwa-registerfor controlled SW update lifecycle; offline behavior doc atdocs/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
Ops & Architecture Documentation:
- OPS-12 Cloud cost observability (
#104/#798): ADR-0026 documents proactive cost observability decision; framework atdocs/ops/CLOUD_COST_OBSERVABILITY.md(6 cost dimensions, 3-tier alerts at 70/90/100%, monthly review workflow, Terraform budget template); hotspot registry atdocs/ops/COST_HOTSPOT_REGISTRY.md(6 features with per-request LLM costs, monthly projections at 4 usage levels); breach runbook atdocs/ops/BUDGET_BREACH_RUNBOOK.md(5-phase playbook); adversarial review fixed phantom config keys, wrong API endpoint, incorrect JSON payload, compute instance types - 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 atdocs/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
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.
Eight parallel worktree agents delivered new features, security infrastructure, ops tooling, and developer experience improvements across 8 PRs. Each PR received two rounds of adversarial review (original self-review + independent cold review). The independent round caught 9 CRITICAL and 11 HIGH findings � all resolved before merge.
Features:
- UX-08 Calendar/timeline views (
#94/#810):WorkspaceService.GetCalendarAsyncwith board-access-scoped date-range card query (90-day cap, 500-result limit);CardRepository.GetByDueDateRangeAsync;GET /api/workspace/calendar?from=&to=endpoint defaulting to current month; frontendCalendarView.vuewith grid mode (monthly calendar, color-coded due-date cards, overflow "+N more") and timeline mode (chronological date-grouped list); month navigation, status indicators (on-track/overdue/blocked), drill-down to board/card; loading/error/empty states; ARIA grid roles; sidebar nav item; 8 backend + 20+ frontend tests; adversarial review fixed UTC timezone mismatch, overdue logic inconsistency, and unbounded query results - INT-05 Note-style import and web clip intake (
#334/#809):NoteImportServicewith markdown heading-based section splitting and web clip metadata intake;CaptureSource.MarkdownImportandCaptureSource.WebClipenum values;NoteImportControllerwithPOST /api/import/notes/markdownandPOST /api/import/notes/webclip(auth + rate limiting); all imported content routes throughICaptureService.CreateAsync(GP-06 compliant � no silent board mutations); provenance viaExternalRef(filename/URL) andTitleHint; frontend markdown upload and web clip paste tabs inExportImportView; security: path traversal validation, URL scheme restriction (http/https only), no outbound requests (no SSRF), content as plain text (no XSS); 38 backend + 6 frontend tests; adversarial review fixed silent success on all-sections-fail and ExternalRef overflow - AGT-03 Agents/Runs surfaces (
#338/#808):AgentsView.vue(profile list with status badges),AgentRunsView.vue(run list per agent with proposal linkage),AgentRunDetailView.vue(vertical event timeline with human-readable labels, JSON payload display, proposal navigation);agentStorePinia store with 3 data slices;agentApiHTTP client with enum normalization for backend integer serialization; 3 lazy-loaded routes under/workspace/agentsgated toagentworkspace mode; sidebar nav item withprimaryModes: ['agent']; loading/error/empty states throughout; 42 frontend tests; adversarial review confirmed clean (no CRITICAL/HIGH) - UI-12 Storybook baseline (
#251/#807): Storybook 10.3.5 (@storybook/vue3-vite) configured for Vue 3 + Vite 8; stories for all 17 Td* UI primitives (TdButton, TdIconButton, TdInput, TdTextarea, TdSelect, TdFieldWrapper, TdDialog, TdDropdown, TdPopover, TdTooltip, TdToast, TdInlineAlert, TdSpinner, TdSkeleton, TdBadge, TdTag, TdEmptyState) showing key state variants; design token CSS import + obsidian theme background;viteFinalhook strips PWA plugin for storybook builds;npm run storybook(dev server :6006) andnpm run storybook:buildscripts; adversarial review confirmed clean
Security & Auth:
- SEC-07 SSO/OIDC with MFA (
#82/#813): configurable OIDC provider support (Microsoft Entra ID, Google, generic OIDC) viaIOidcProviderFactorywith pluggable registration; OIDC is config-gated and disabled by default; OIDC login/callback/exchange endpoints with open-redirect protection and short-lived single-use authorization codes; TOTP-based MFA (RFC 6238) with setup (secret + QR URI + 8 recovery codes), confirm, verify, and disable endpoints; recovery codes bcrypt-hashed at rest; constant-time comparison and replay protection;MfaPolicyconfiguration (EnableMfaSetup,RequireMfaForSensitiveActions) gating password change and account deletion; frontend OIDC login buttons on LoginView (config-gated),MfaSetup.vuesettings component,MfaChallengeModal.vuefor protected actions; no auto-linking by email (prevents account takeover); ADR-0029 documents design decisions; 30+ backend tests; adversarial review fixed dead MFA enforcement code, permanent user lockout via DisableAsync, and OIDC endpoint routing - CLD-03 OAuth PKCE and account linking (
#676/#812): DB-backed auth code store replacing in-memoryConcurrentDictionary�OAuthAuthCodeentity with EF migration,IOAuthAuthCodeRepositorywith atomicTryConsumeAtomicAsync(raw SQLUPDATE WHERE IsConsumed = 0 AND ExpiresAt > now); PKCE support viaUsePkce = truein ASP.NET Core 8 OAuth middleware; account linking endpoints (POST /api/auth/github/link,DELETE /api/auth/github/link,GET /api/auth/linked-accounts) with conflict detection and session verification; frontend Linked Accounts section inProfileSettingsViewwith Link/Unlink buttons and avatar display; 24+ backend tests; adversarial review fixed CSRF on account linking, TOCTOU in expiry check, JWT plaintext in DB, DoS via full-table load, and unbounded table growth
Ops & Observability:
- OPS-09 Staged deployment workflow (
#101/#806): ADR-0028 documents blue/green + canary deployment strategy with rollback criteria;docs/ops/DEPLOYMENT_WORKFLOW.mdcanonical 4-phase workflow (build verification → staging → production canary → production promotion) with rollback procedures, database migration safety, emergency hotfix override, and ownership/escalation model;docs/ops/RELEASE_CHECKLIST.mdversioned smoke verification (7 pre-deploy + 9 automated staging + 7 manual staging + 7 canary + 6 post-promotion + 5 post-release checks) with failure response matrix;scripts/deploy/smoke-test.shportable smoke test (9 automated checks: health, API, auth, board auth gate, frontend, SignalR, static assets, security headers, container restart detection);.github/workflows/cd-staging-gate.ymlwithproductionenvironment manual approval gate; adversarial review fixed script injection in CI workflow and unscoped container checks - OBS-02 Error tracking and product analytics (
#549/#811): config-gated Sentry SDK for backend (Sentry.AspNetCorewithBeforeSendPII scrubbing for emails/JWTs,ServerNameblanked) and frontend; opt-in product telemetry service (TelemetryEventService) aligned withdocs/product/TELEMETRY_TAXONOMY.md� property key allowlist (15 safe keys), max 10 properties, 200-char value truncation;TelemetryControllerwith anonymous config endpoint and authenticated events endpoint; Plausible/Umami analytics script injection (useAnalyticsScript) with HTTPS-only URL validation; PiniatelemetryStorewith consent management, event buffering, and flush; DNT/GPC privacy signal detection prevents auto-restore of consent; telemetry consent toggle inProfileSettingsView;docs/ops/OBSERVABILITY_SETUP.mdconfiguration guide; all telemetry opt-in and disabled by default; 38 backend + 25 frontend tests; adversarial review fixed Sentry PII leak, arbitrary properties injection, XSS via script URL, and DNT non-compliance
Batch merge of 7 PRs (#800, #805, #811, #813, #815, #819, #820) with conflict resolution and documentation sweep. All features are now on main:
- Resilience and degraded-mode behavior tests (PR
#820, 34 tests across 6 files) - OAuth auth code store and token lifecycle tests (PR
#815, 19+ integration tests) - Cross-browser E2E matrix (PR
#800, Chromium/Firefox/WebKit/mobile-chrome/mobile-safari) - Error tracking and product analytics with Sentry integration (PR
#811, telemetry events, consent management) - MCP HTTP transport and API key authentication (PR
#819, CLI commands, HTTP endpoint, rate limiting) - SSO/OIDC integration with optional TOTP MFA (PR
#813, MfaController, recovery codes, OIDC login) - Distributed caching with ICacheService (PR
#805, InMemory/Redis/NoOp implementations, cache-aside pattern)
Test suite recertified: backend 4,279 tests, frontend 2,245 tests, combined ~6,500+ passing.
Progress is tracked against filesAndResources/taskdeck_technical_design_document.md.
- Phase 1 - Core Data Model and API: COMPLETE (100%)
- Phase 2 - Basic Web UI: COMPLETE (100%)
- Phase 3 - UX Improvements: COMPLETE (100%)
- Phase 4 - Advanced Features: IN PROGRESS (97%)
Completed in Phase 4:
- CI gate split and matrix hardening
- authn/authz infrastructure baseline
- boards controller family retrofit to claims-derived identity (
[Authorize]+ owner-scoped board operations) - claims-first retrofit for columns/cards/labels/export-import/queue/board-access (actor identity derived from claims; caller actor query/body IDs removed)
- export/import board JSON flow
- audit and queue service/API slices
- automation proposal lifecycle + diff + execute flow
- archive recovery flow
- chat + ops + logs + worker/health stack
- frontend integration for automations/chat/ops/archive
- archive lifecycle coherence for boards across board settings and archive workspace flows
- drag/edit interaction safety guardrails via explicit card/column drag handles and non-handle drag blocking
- collaborative presence/conflict policy (
#73): SignalR-backed board/card presence snapshots with editor markers, optimistic stale-write conflict handling, and conflict-audit capture with actor identity - collaborative comments/mentions workflow (
#74): board-scoped threaded card comments (create/list/reply/edit/delete), mention-to-user linking, mention notification publication, and authz-safe moderation boundaries - maintainability refactor across API/controller error handling and frontend API/store utilities (PR #23)
- CI hardening follow-up: workflow concurrency cancellation, frontend typecheck/build parity, TRX artifacts, caching
- mechanical checks added: docs governance CI checks (
check-docs-governance+check-github-ops-governance) and architecture boundary test project - API integration harness additions for authz assertions (
AssertUnauthorized,AssertForbidden,AssertNotFoundOrForbidden,AssertCrossUserIsolation) - SEC-04 API error-contract assertions for key auth/validation paths, including middleware-level
401/403payload normalization - starter-pack manifest foundation (
PACK-01): versioned manifest schema doc plus deterministic backend parsing/validation tests - starter-pack apply backend (
PACK-02): idempotent apply endpoint with dry-run conflict reporting and integration coverage for success/re-apply/conflict flows - starter-pack frontend catalog (
PACK-03): board-scoped catalog modal with search, preview (dry-run), and one-click apply flow with frontend interaction tests - starter-pack first-party catalog (
PACK-04): API-backed first-party pack catalog (label/column/blueprint packs) consumed by board starter-pack UI - starter-pack deterministic fixture packs (
PACK-05): Playwright bootstrap helpers and manifest-backed small/medium/edge deterministic E2E fixture coverage - DEBT-01 nullability reduction (
#52): domainCS8618warnings eliminated with EF-safe non-null initialization defaults - DEBT-02 log-query scalability pass (
#53): repository-filtered query flow replaces full-table scans and command-run log N+1 composition - DEBT-03 database export/import (
#54): sandbox-gated SQLite file export/import endpoints with payload signature/size validation and file-replacement rollback guardrails
Remaining for Phase 4 completion:
- UX/operator hardening for remaining keyboard/accessibility/discoverability gaps (WCAG baseline delivered, conversational refinement
#576delivered, calendar views#94delivered, agent surfaces#338delivered) - product-legibility hardening so the app teaches the
capture -> review -> boardloop without relying on demo scripts or internal docs
Backlog seeding was expanded from near-horizon only to a staged future roadmap grounded in docs/WIP research PDFs.
- New future-expansion issues created:
#67to#111 - Wave index issue:
#107(OPS-13) - Priority-label rollout completed across every issue (open and closed):
Priority I: current Phase 4 completion pathPriority II: post-Phase-4 foundation tranchePriority III: analytics/security/compliance expansion tranchePriority IV: platform, UX, testing, docs maturity tranchePriority V: low-urgency/meta/historical tracking
Current open backlog is now split into:
- Phase-4 completion tranche (
#33to#57,Priority I) - Future expansion tranche (
#72to#111,Priority IItoPriority V)
To convert the 2026-02-21 repository scan into executable work, a dedicated issue wave was seeded:
- umbrella tracker:
#151 - engineering hardening issues:
#152to#157 - hotspot refactor issues:
#158to#167 - CI/workflow topology expansion issue:
#168
Priority distribution for this wave:
Priority I:#152Priority II:#151,#153,#154,#155,#157,#168Priority III:#156Priority IV:#158to#167
Analysis record:
docs/analysis/2026-02-21_repo-scan-analysis.mddocs/analysis/2026-02-21_ci-github-actions-expansion-plan.md
A dedicated staged migration wave was seeded to port external demo-expansion assets into the current repository with compatibility guardrails.
Seeded issues:
- tracker:
#297 - batches:
#298to#302(v0baseline ->v3director -> integration hardening)
Execution constraints:
- all wave issues are labeled
Priority I - strict dependency order (
#298->#299->#300->#301->#302) - one branch per batch issue using suggested branch names embedded in issue bodies
- file-scoped commit preference for review/rollback safety
Implementation delivery (shipped in this context):
#298Batch A (v0): baseline demo seeding command + first-run UX defaults + seeded playbook promotion#299Batch B (v1): reusable demo harness scripts (demo:run,demo:autopilot), scenario modules, API walkthrough asset, stakeholder opt-in recorder spec, and expanded demo/dogfooding/user docs#300Batch C (v2): JSON scenario runner + schema/sample scenarios,demo:runJSON-first flags (--list,--skip-llm,--continue-on-error), capture-aware autopilot loop modes (queue|capture|mixed), capture helper library additions, and scenario authoring docs (docs/product/SCENARIOS.md)#301Batch D (v3): demo director + snapshot scripts (demo:director,demo:snapshot), trace-aware scenario/autopilot/runtime events,runOpsscenario step support, and director-mode stakeholder recorder bootstrap with artifact logs/snapshots#302Batch E: integration hardening delivered with explicit demo CI policy (TASKDECK_RUN_DEMO=0in default Playwright lanes), opt-indemo-director-smokeworkflow wiring inci-extended.yml, deterministic smoke command (npm run demo:director:smoke) with isolated smoke DB reset + forced fresh servers, automatic free-port fallback for local API startup, actionable explicit-port remediation hints, and docs/index/runtime-precondition consolidation for the migrated demo tooling
docs/WIP/Taskdeck_Demo_Capability_Specification.md was reconciled against shipped code, canonical docs, and the active GitHub backlog in docs/analysis/2026-03-26_saul-demo-capability-reconciliation.md.
Current state:
- already shipped: capture triage, review-first proposal gating, board-centered follow-through, provenance links, and deterministic seed/director/scenario tooling
- delivered in the demo wave: dedicated client-onboarding starter pack/scenario (
#354), trust-first review wording hardening (demo-critical#326subset), and in-app hero-path/demo-board cues (demo-critical#330subset) - rehearsal contract is now delivered (
#355); GTM baseline (demo script, landing copy, beta intake workflow) is now delivered (#216) - demo rehearsal runtime issues (2026-03-27): seed idempotency blocker (
#387), scenario--skip-llmblocker (#389), DX friction (#388,#390), narrative mismatch (#394), and polish (#391,#392,#393) � tracked in#395
Targeted follow-through seeded:
#354PACK-08: Saul-facing client-onboarding starter pack and deterministic demo scenario#355TST-24: Saul-facing demo rehearsal contract, acceptance checklist, and artifact guide (delivered)#356DEMO-00: Saul-facing demo alignment tracker
Existing reused anchors:
#175for broader starter-pack expansion beyond the pre-demo slice#216for broader demo script / public framing (delivered:DEMO_SCRIPT.md,LANDING_COPY.md,BETA_INTAKE_WORKFLOW.md)#326for proposal readability and trust-cue hardening (demo-critical subset)#330for in-app demoability and hero-board presentation quality (demo-critical subset); nav badges now show pending triage and review counts on Inbox and Review nav items- post-epic follow-through is now tracked in
#311for continued demo/runtime/test hardening without reopening the migration batches
The headed runtime audit in docs/analysis/2026-03-26_manual-product-audit.md was reconciled into a focused follow-through wave rather than left as a standalone artifact.
Canonical follow-through record:
docs/analysis/2026-03-26_manual-product-audit-followthrough.md
Seeded issues:
#363tracker#364realtime hub CORS/SignalR health#365Inbox triage freshness#366Workbench/nav/docs truth alignment#367board-history semantic alignment#368chat live-provider status and first-turn fidelity � degraded message type, probe health, verified UI state#369headed manual-audit Playwright pack (Priority IVby design)
Reused existing anchor:
#326proposal readability � affected entity labels now show named targets instead of raw IDs, correlation IDs truncated in UI
TST-08 (#143) delivered a gap analysis of the current testing/hardening posture across MCP integrations, deployment/container runtime, operational reliability, and security checks.
Analysis record:
docs/analysis/2026-03-29_testing-hardening-strategy.md
Key findings:
- Current posture is strong (1400+ automated tests, comprehensive CI topology, established security baselines)
- Highest-ROI gaps are CI automation of existing manual validation (MCP, Terraform, drills, container runtime) and supply-chain security scanning (SAST, secrets, image CVEs)
- 15 proposed follow-up issues across 4 priority tiers with acceptance criteria and execution sequencing
Proposed issue summary:
- Priority I (SEC-20 to SEC-22): SAST, secret scanning, container image scanning
- Priority II (SEC-23, OPS-21 to OPS-24): dependency blocking gate, container smoke, drill/MCP/Terraform CI wiring
- Priority III (TST-27 to TST-29, SEC-24): repository tests, board sub-store tests, router tests, DAST
- Priority IV (TST-30, TST-31, OPS-25, SEC-25): OpenAPI snapshots, shutdown tests, CSP reporting, HTTP client tests
Windows Git hardening (#121):
scripts/check-git-env.shvalidates Git for Windows resolution (not Cygwin/MSYS2) and detects stale.git/index.lockwith worktree awarenessCLAUDE.mdandAGENTS.mdupdated with script reference and PATH remediation guidance
Dependency update automation (#148):
.github/dependabot.ymlactive for NuGet, npm, and GitHub Actions with weekly cadence and grouped minor/patch updatesdocs/ops/DEPENDENCY_UPDATE_POLICY.mdcovers triage SLAs, escalation, and policy boundaries
Headed manual-audit Playwright pack (#369):
frontend/taskdeck-web/tests/e2e/manual-audit.spec.tscovers coreHome -> Inbox/Capture -> Review -> Boardaudit loop with 18 screenshots- gated behind
TASKDECK_RUN_AUDITenv var; live LLM probes opt-in viaTASKDECK_RUN_LIVE_LLM_TESTS - usage documented in
docs/testing/MANUAL_AUDIT_PACK.md
Manual validation checklists (#130, #131):
- Slice A (
#130): 22 step-indexed scenarios (A-01 to A-22) indocs/testing/manual-validation-a-workspace-board-ux.mdcovering workspace shell, board lifecycle, keyboard UX, and escape behavior stack - Slice B (
#131): 175 step-indexed checks (B-01 to B-175) indocs/testing/manual-validation-b-authz-contracts.mdcovering all 28 controllers with two-user isolation matrix
AppShell premium reskin (#499):
- Shell sidebar, topbar, command palette, and keyboard help components reskinned from hardcoded Tailwind/rgba values to
--td-*design token system - Added focus-visible accessibility rings throughout shell layer
- Glass morphism and smooth transitions for premium visual feel
Board/card surface polish (#501):
- Board canvas, toolbar, action rail, column lanes, and card components reskinned to design token system
- Standardized card visual states (hover, focus, selected, disabled, dragging) with token-based styling
- Fixed combined selected+focus-visible keyboard navigation specificity conflict
- Replaced hardcoded font sizes with token references in filter count badges
AGT-02 tool registry, policy evaluator, and first bounded template (#337, PR #502):
- Added domain primitives:
ToolScope,ToolRiskLevelenums,ITaskdeckTool,ITaskdeckToolRegistryinterfaces,PolicyDecisionvalue object - Added
TaskdeckToolRegistry(thread-safe in-memory registry),AgentPolicyEvaluator(allowlist + risk-level gating), andInboxTriageAssistant(bounded template that creates proposals, never direct board mutations) - DI registration: singleton tool registry with
inbox.triagepre-registered, scoped policy evaluator and triage assistant - Default policy is review-first for all risk levels; auto-apply is opt-in only for low-risk tools
- 42 backend tests covering registry, policy evaluation, and inbox triage assistant
Demo director reporting, assertions, presets, and soak mode (#331, PR #500):
- Added
demo-director-presets.mjswith named preset system for common demo modes (happy-path-capture, review-approve-flow, error-recovery-demo, soak-baseline) - Added
demo-trace-assertions.mjsfor exact and structural trace comparison - Added
demo-report-html.mjsfor self-contained HTML report generation with embedded screenshots - Added
demo-soak.mjsfor long-run director scenario loops with cumulative metrics - 63 frontend tests covering presets, assertions, reports, soak mode, and integration
Incident rehearsal and recovery program (#150, PR #503):
- Added
docs/ops/INCIDENT_REHEARSAL_CADENCE.md(monthly lightweight + quarterly deep drill schedule) - Added
docs/ops/EVIDENCE_TEMPLATE.md(standardized rehearsal outcome format) - Added
docs/ops/REHEARSAL_BACKOFF_RULES.md(finding-to-issue workflow with severity SLAs) - Added 4 rehearsal scenario templates: degraded-api-health, missing-telemetry-signal, mcp-server-startup-regression, deployment-readiness-failure
- Added first execution evidence:
docs/ops/rehearsals/2026-03-29_degraded-api-health.md - Cross-linked from
TESTING_GUIDE.mdandMANUAL_TEST_CHECKLIST.md
Chat-to-proposal NLP gap fix (#570, PR #602):
- Added
NaturalLanguageInstructionExtractorto bridge the intent classification-to-parsing gap: translates natural language into structured instructions the regex parser can consume - MockLlmProvider now produces
Instructionswhen the classifier detects actionable intent - OpenAI and Gemini provider fallback paths also use the extractor when LLM-based JSON extraction fails
- 38 unit tests for the extractor
Multi-instruction batch parsing (#574, PR #591):
- Added
ParseBatchInstructionAsynctoIAutomationPlannerServiceinterface ChatServicenow routes multi-instruction messages through batch parsing to generate multiple proposals from a single chat message- Backend + frontend tests for batch instruction parsing
Board-context LLM prompting (#575, PR #589):
- Added
BoardContextBuilderto construct bounded board context (columns, card titles, labels) for LLM system prompts - Added
LlmSystemPromptBuilderfor centralized system prompt composition - OpenAI and Gemini providers now append board context to system prompts via the builder
- Backend tests for board context builder and ChatService integration
Board keyboard card movement (#248, PR #590):
- Added Alt+Arrow keyboard shortcuts for card movement within and across columns in BoardView
- Added move-to action menu on CardItem for click-based column moves
- Card Movement section added to keyboard shortcuts help dialog
- Frontend unit tests for keyboard movement and ColumnLane coverage
Transcript capture source (#218, PR #592):
- Added
TranscriptFilecapture source with transcript-specific size limits - Added transcript paste/file capture mode to CaptureModal frontend
- Backend validation tests and frontend interaction tests
Contact card YAML parser (#264, PR #588):
- Added
ContactCardYamlParserwith parse/serialize and field validation for card-first outreach CRM use case - Added
ContactCardFrontMattermodel withYamlDotNetdependency - Static serializer/deserializer caching for performance
- Backend unit tests
Global search and quick-action launcher (#93, PR #603):
- Added
SearchServiceand/api/search?q=endpoint for cross-board search respecting authorization boundaries - Enhanced
ShellCommandPalette(Ctrl+K) with live search results alongside command navigation - Added
searchApiclient,useGlobalSearchcomposable with 200ms debounce and abort-on-supersede - Grouped results display (Commands, Boards, Cards) with keyboard-first navigation
- Frontend tests for composable and command palette search integration
Developer portal and OpenAPI (#99, PR #605):
- Added OpenAPI annotations (
[ProducesResponseType], XML doc summaries) to Boards, Cards, Columns, Capture, Chat, Auth, and Webhooks controllers - Enhanced Swagger configuration with API metadata, JWT Bearer security definition, and XML comment inclusion
- Added developer portal docs (
docs/api/):QUICKSTART.md,AUTHENTICATION.md,BOARDS.md,CAPTURE.md,CHAT.md,WEBHOOKS.md,ERROR_CONTRACTS.md - Added developer portal CI workflow and local OpenAPI export script
SBOM and release provenance (#103, PR #606):
- Added reusable workflow (
.github/workflows/reusable-sbom-provenance.yml) for CycloneDX JSON SBOMs (backend + frontend) and SLSA v1-style provenance manifest - Wired into
ci-release.yml(replacing placeholder) andrelease-security.yml - Added
docs/ops/SBOM_RELEASE_PROVENANCE.mddocumentation - Updated dependency vulnerability policy to reference SBOM artifacts
Batch triage and suggestion editing (#220, PR #607):
- Added
POST /api/capture/items/batch-triageendpoint with per-item actions (triage/ignore/cancel), 200/207/422 response semantics, and batch size limit (50) - Added
PUT /api/capture/items/{id}/suggestionfor editing capture text before triage with state-transition guards - Added multi-select checkboxes, select-all toggle, batch action bar, and inline suggestion editing in InboxView
- Backend + frontend tests for batch triage and suggestion editing
Property-based and fuzz testing pilot (#89, PR #601):
- Added FsCheck property-based testing packages to Domain and Application test projects
- Added property-based tests for Board, Card, Column, Label entity invariants and AutomationProposal state machine
- Added fuzz tests for StarterPackManifestValidator, LlmIntentClassifier regex safety, and export/import DTO serialization roundtrip contracts
Accessibility audit and WCAG remediation (#92, PR #604):
- Added skip-to-content link,
sr-onlyutility class, andeslint-plugin-vuejs-accessibilitywith tuned rules - WCAG improvements across BoardView, HomeView, TodayView, ReviewView, InboxView, CaptureModal, and ToastContainer
- Added Playwright axe-core E2E tests for 6 core views (Home, Today, Inbox, Review, Boards, Login) plus skip-link test
role=presentationon virtual scroller wrappers in InboxView
Dependency updates (PRs #593–#600):
@eslint/js9.39.4 → 10.0.1 (with ESLint v10 rule violation fixes in demo scripts and playwright config)@types/node24.10.1 → 25.5.0- GitHub Actions group bump (5 updates)
Microsoft.NET.Test.Sdk17.14.1 → 18.3.0Swashbuckle.AspNetCore6.9.0 → 10.1.7 (with OpenApi v2.x compatibility fix); exported OpenAPI artifact needs regeneration (#609)Microsoft.IdentityModel.TokensandSystem.IdentityModel.Tokens.Jwtupgraded to 8.17.0xunit.runner.visualstudio2.8.2 → 3.1.5
Follow-through issues seeded from changelog audit (docs/analysis/2026-03-31_changelog-audit.md):
#608OPS-26: requireci-extendedpass for workflow and infrastructure PRs (Priority II)#609DOC-04: regenerate and validate OpenAPI spec artifact after Swashbuckle 10 upgrade (Priority III)#610UX-16: add cursor pagination to global search endpoint (Priority IV)
New review packages under docs/InReview/MVP_EXPANSION/ were cross-read against the current repo state and backlog:
MINIMAL/: near-horizon execution filterEXPANDED/: staged product and architecture roadmap
Planning conclusion adopted into canonical docs:
- demoability improved faster than self-serve product clarity
- near-horizon work should prioritize product legibility before adding broad new capability families
- preferred sequence is:
- novice-first shell and entry clarity (
Home,Review, workspace modes, empty/help states, board selectors) - board-centered daily workflow (
Today, proposal readability, board action rails, deep links, onboarding) - docs/help/testing coherence
- agent substrate
- knowledge/integrations surface
- novice-first shell and entry clarity (
Backlog implication:
- existing overlap and reuse anchors are partial (
#96,#93,#77,#75,#98,#216,#218,#219,#311) - the novice-first productization wave is now shipped through docs/help follow-through for
#318,#320,#322,#324,#326,#96,#100, and#328; the first-run smoke and launch-criteria guardrail now lives as a deterministic Playwright contract on the shippedHome -> capture -> review -> execute -> boardloop #320is now shipped: durableUserPreferenceworkspace mode persistence,/api/workspace/home+/api/workspace/preferences,Homedefault routing, and mode-aware shell navigation#322is now shipped:/workspace/reviewis the canonical automation route, legacy proposals URLs redirect compatibly, queue/chat/ops/access are explicitly framed as advanced surfaces, board access/chat common flows prefer selectors over raw board IDs, and primary empty states now point users toward concrete next steps#324is now shipped:/workspace/todayaggregates review, triage, overdue, due-today, and blocked work into one agenda, while Home/Today share a persisted onboarding loop with setup replay/dismiss and first-use starter-board creation#326is now shipped: proposal cards expose plain-language summaries, impact/risk/source cues, and affected-entity headlines from an application-layer presentation contract, while board pages now expose a board action rail (Capture here,Ask assistant,Review proposals,Add card) and board context now travels across inbox/review/chat/notifications/provenance links; affected entity labels now show named targets from operation parameters instead of raw IDs, and correlation IDs are truncated in the review UI#96is now shipped: novice-first contextual help is now present on the key workflow surfaces (Home,Today,Review,Inbox, board action flow, and selector-heavy activity`) with dismiss/replay persistence that keeps guidance discoverable without forcing it on experienced users- the lower-priority secondary follow-through wave is now seeded as
#329to#334, subordinate to Wave P, covering in-app demoability/product evidence, harness/report maturity, saved-view productivity follow-through, and broader note/clip intake follow-through - the remaining expanded-blueprint architecture wave is now seeded as
#335to#341, subordinate to both Wave P and Wave Q, covering agent substrate, knowledge/search, supervised connector architecture, and explicitR1/R2/R3launch-gate framing - planned-but-not-shipped concepts now explicitly tracked in roadmap docs include:
- broader telemetry and release-gate follow-through remain tracked in
#341 Agents,Runs,Knowledge, andIntegrationsproduct surfacesDemo Tools, guided narrative/demo-tour flow, HTML report/assertions, and saved views- explicit release framing for
R1novice-first beta,R2agent foundation alpha, andR3knowledge/integrations alpha
- broader telemetry and release-gate follow-through remain tracked in
- active docs root is now curated as a living-doc spine only; stable reference material is organized under
docs/product,docs/manual,docs/ops,docs/platform,docs/security, anddocs/tooling
Realignment packs (now archived for traceability) were reviewed and reconciled into active backlog seeding:
- automation realignment pack:
docs/archive/2026-02-25_inreview-repo-pack/REPO_PACK/docs/analysis/2026-02-21_capture-automation_realignment_pack/
- security/performance addendum:
docs/archive/2026-02-25_inreview-repo-pack/REPO_PACK/docs/analysis/2026-02-21_capture-security-performance-addendum/
Seeded issue wave:
- umbrella tracker:
#199 - capture delivery sequence:
#200to#211 - linked hardening/performance follow-through:
#212(delivered),#213(delivered) - existing rate-limit issue updated with capture scope (no duplicate issue):
#81 - deferred capture follow-ons seeded:
#218,#219,#220 - adjacent go-to-market and research execution seeds:
#216,#217
Implementation delivery (shipped):
#200CAP-01 delivered and regression-tested:- queue-wrapper capture model locked (
LlmRequest+inbox.capture.v1) - capture source/status contracts and transition policy added
- capture payload invariants enforced (schema version, text limits, actor-field rejection)
- provenance linkage fields added to support
capture item -> triage run -> proposal
- queue-wrapper capture model locked (
#201CAP-02 capture API slice delivered and regression-tested:- added authenticated
/api/capture/itemsendpoints (create/list/detail/ignore/cancel) - create now returns
201and uses queue-wrapper persistence with capture payload normalization - list is user-scoped and excerpt-only (full text returned only by detail endpoint)
- ignore/cancel paths are idempotent for already-ignored items and enforce cross-user
403
- added authenticated
#202CAP-03 queue provenance fix delivered and regression-tested:- planner now accepts explicit proposal source metadata overrides
- queue worker now creates proposals with
SourceType = Queue - queue worker forwards
SourceReferenceIdandCorrelationIdusing queue item id for traceability
#203CAP-04 triage enqueue/state transitions delivered and regression-tested:- added authenticated triage enqueue endpoint:
POST /api/capture/items/{id}/triage(202 Accepted) - triage enqueue now returns deterministic capture state with idempotent
already triagingbehavior - invalid transition attempts now fail with stable
Conflicterror contract payloads - generic queue processing now skips
inbox.capture.v1pending items so capture triage remains explicit
- added authenticated triage enqueue endpoint:
#204CAP-05 worker triage path delivered and regression-tested:- queue worker now routes
inbox.capture.*triaging items through a dedicated capture-triage proposal path (separate from generic instruction parsing) - deterministic extraction baseline now converts checklist/bullet/numbered capture text into proposal operations with stable idempotency keys
- triage outcomes now persist capture provenance linkage (
capture item -> triage run -> proposal) and surfaceProposalCreatedstatus when linkage exists - invalid capture triage inputs (for example boardless capture triage) now fail deterministically without direct board mutation and remain bounded by existing worker retry policy
- queue worker now routes
#205CAP-06 strict triage schema/prompt versioning delivered and regression-tested:- added strict capture triage output contract (
capture-triage-output.v1) with machine-validated schema and contract tests - triage pipeline now enforces schema version + prompt version invariants before proposal generation
- triage provenance now persists prompt version
triage.v1per triage run for capture item linkage/audit visibility - added golden and negative fixture coverage for schema validation failures (missing tasks, wrong prompt version, unknown properties)
- added strict capture triage output contract (
#212SEC-14 logging redaction guardrails delivered and regression-tested:- published
docs/security/SECURITY_LOGGING_REDACTION.mdand linked it from active security docs - invalid capture-source validation now returns generic messages without echoing caller-controlled values
- unexpected middleware/provider/worker failures now log sanitized exception summaries instead of raw exception objects on sensitive paths
- queue and webhook failure persistence now redacts or generalizes sensitive exception text before storage, and ASP.NET Core trace auto-exception recording is disabled to keep raw exception events out of default telemetry
- published
#206CAP-07 inbox frontend route/list/detail delivered and regression-tested:- added workspace inbox route (
/workspace/inbox) with shell navigation integration - inbox list now renders excerpt-first capture summaries and loads full text only on explicit detail open
- inbox detail now supports deterministic ignore/cancel actions with refreshed state from capture API
- keyboard-first navigation (
ArrowUp/ArrowDown/Enter) and escape-stack compliant detail close behavior are now regression-tested
- added workspace inbox route (
#207CAP-08 capture modal + command palette/hotkey integration delivered and regression-tested:- added keyboard-first quick-capture modal with deterministic submit (
Ctrl+Enter) and close (Escape) behavior - command palette now includes capture action entry and retains inbox navigation access
- added global quick-capture hotkey (
Ctrl+Shift+C) with escape-stack compliant modal close ordering - successful capture submission now provides immediate feedback by routing to inbox with the new item rendered in list state
- added keyboard-first quick-capture modal with deterministic submit (
#208CAP-09 inbox triage trigger + proposal-linking UX delivered and regression-tested:- inbox detail now includes deterministic triage enqueue action with explicit in-progress/completion button state semantics
- capture detail contract now surfaces provenance metadata (
capture item -> triage run -> proposal) so proposal linkage is visible to UI consumers - inbox detail now renders direct proposal-review navigation when triage yields a linked proposal
- capture store/api regression tests now cover triage enqueue success/failure behavior and proposal-link rendering
#209CAP-10 card/proposal provenance UX delivered and regression-tested:- cards API now exposes capture provenance contract for capture-created cards (
GET /api/boards/{boardId}/cards/{cardId}/provenance) - triage create-card operations now persist deterministic card target ids so provenance lookup remains stable after proposal execution
- card modal now shows explicit capture-origin marker with direct capture/proposal links and triage-run metadata when provenance exists
- automations proposal surface now shows capture-linked context (capture artifact link + triage run reference), with frontend/backend regression coverage
- cards API now exposes capture provenance contract for capture-created cards (
#210CAP-11 capture loop E2E regression delivered and regression-tested:- added dedicated Playwright regression (
tests/e2e/capture-loop.spec.ts) covering capture create -> triage -> proposal approve/execute -> card provenance verification - coverage validates proposal-first review gate behavior (no direct board mutation from triage output before explicit approve/execute)
- coverage validates provenance deep-links (
Open Capture,Open Proposal) and triage-run metadata visibility from resulting card surfaces - full Playwright suite now includes capture-loop verification in the default regression path
- added dedicated Playwright regression (
#211CAP-12 canonical docs promotion delivered:- updated canonical docs (
STATUS,IMPLEMENTATION_MASTERPLAN,TESTING_GUIDE,MANUAL_TEST_CHECKLIST) to reflect shipped capture runtime behavior and verification posture - promoted capture validation and manual-run guidance into active docs as baseline expectations
- marked the original in-review capture pack READMEs as historical/stale after promotion to canonical docs
- updated canonical docs (
Execution intent:
- preserve proposal-first trust posture (no direct model auto-apply)
- keep claims-first identity and
401/403/404policy semantics - require deterministic schema/error handling and provenance visibility for capture-generated changes
Reconciliation record:
docs/analysis/2026-02-23_capture-realignment-synthesis.mddocs/analysis/2026-02-23_inreview-extraction-audit.mddocs/analysis/2026-02-23_capture-model-decision.md
#232 AUTO-03 is now delivered:
- provider runtime supports
OpenAI+Geminiwith deterministic config/environment-awareMockfallback - live-provider misconfiguration degrades safely without request crashes
- capture triage provenance now persists
provider+modelalongsidepromptVersion - provider adapter coverage now includes Gemini success/failure/invalid-response/cancellation and chat integration coverage with a non-mock provider stub
#236 SEC-16 is now delivered:
- chat provider requests now carry server-derived attribution (
userId, correlation ID, source surface, board/session scope) throughChatCompletionRequest - provider adapters now receive standardized attribution headers (
x-taskdeck-*) and OpenAI now gets a pseudonymoususertoken mapping - capture queue provenance now persists managed-key attribution metadata (
requestedByUserId,correlationId,sourceSurface, scope IDs) for audit and abuse-triage workflows - regression coverage now includes attribution propagation, spoofing rejection, and chat API provider-stub attribution assertions
Documentation baseline for this track:
docs/platform/LLM_PROVIDER_SETUP_GUIDE.md
To capture the security and operational risk of letting users consume model calls via a platform-managed provider key, a dedicated control wave was seeded. Identity attribution foundation is now delivered via #236; user-facing usage policy is now delivered via #240. Remaining controls stay in this wave:
#235tracker: managed-key threat model and control sequencing#236identity attribution contract for managed-key requests (Priority II) -- delivered#237quota/budget/kill-switch guardrails (Priority II) -- pending#238SEC-18 abuse detection + automated containment (Priority III) -- operator tooling + domain groundwork delivered:AbuseActor/AbuseEvententities,AbuseDetectionService(4-state Observe→Suspicious→Restricted→Blocked model), operator evaluation/quarantine/unquarantine/block API; live-traffic automated containment wiring is a follow-up slice#239SEC-19 incident response + key rotation drills (Priority III) -- delivered:docs/security/MANAGED_KEY_INCIDENT_RUNBOOK.md+docs/security/SECRETS_MANAGEMENT_BASELINE.md+scripts/drills/(5 failure-injection drill scripts + orchestrator)#240user-facing fair-use and abuse consequence policy (Priority III) -- delivered:docs/security/MANAGED_KEY_USAGE_POLICY.md
Commit 0aef077f6d46262a844eb796cb9e95f83132ca09 introduced a premium UI planning pack (archived for traceability) under:
docs/InReview/HUMAN/07_FRONTEND_PREMIUM_UI_OVERVIEW.mddocs/archive/2026-02-25_inreview-repo-pack/REPO_PACK/docs/analysis/2026-02-23_frontend-premium-ui-pack/
Issue seeding and reconciliation completed:
- tracker:
#242(UI-00 frontend premium UI wave) - net-new wave issues:
#243to#251 - explicit reuse (no duplicate issue creation):
#154,#88,#92,#213
Execution posture:
- foundations-first sequencing is mandatory (
#243,#245,#244before screen reskins) - no broad global reskin until shared primitives and token contracts are established
- accessibility/keyboard and visual/performance quality gates remain explicit dependencies
Reconciliation record:
docs/analysis/2026-02-23_frontend-premium-ui-synthesis.md
Commit 909db0d introduced a testing-harness improvement pack (archived for traceability) under:
docs/archive/2026-02-25_inreview-repo-pack/REPO_PACK/docs/analysis/taskdeck_testing_harness_improvement_pack_2026-02-23/
Issue seeding and reconciliation completed:
- tracker:
#254(TST-15 testing harness wave) - net-new wave issues:
#255to#260 - existing seeds updated with extracted pack guidance:
#89,#90,#106,#168 - explicit non-duplicate mapping to already-covered scenarios:
- WIP limit enforcement tests already present (
CardServiceTests,CardsApiTests,tests/e2e/smoke.spec.ts) - sandbox gate behavior already present (
ExportApiTests) - starter-pack idempotency/conflict safety already present (
StarterPacksApiTests)
- WIP limit enforcement tests already present (
Delivery posture:
#255removed residual wall-clock flake patterns and centralized E2E polling helpers#256added high-signal drag/drop persistence coverage after full reload#257expanded representative API error-contract coverage#258,#259, and#260added non-blocking CI guardrails (OpenAPI generation/validation, golden principles enforcement, nightly quality artifacts)
Reconciliation record:
docs/analysis/2026-02-23_testing-harness-synthesis.md
Recent follow-through (2026-02-24):
#260adds.github/workflows/nightly-quality.yml(scheduled + manual) to collect non-blocking quality telemetry artifacts onmain- workflow now publishes backend (Domain/Application) coverage artifacts, frontend coverage artifacts, and dependency/security signal artifacts (
dotnet list package --vulnerable,npm audit) - dependency/security signal handling is now policy-backed (
#106): reusable normalized summaries, PR/manual opt-inci-extendedscan lane, nightly scheduled signal collection, release-lane enforcement option, severity SLAs, and expiry-bound exception rules are documented indocs/security/SECURITY_DEPENDENCY_VULNERABILITY_POLICY.md - workflow surfaces signal exits in step summary/warnings while keeping required PR CI path unchanged (reporting-first nightly lane)
#259addsdocs/GOLDEN_PRINCIPLES.mdas a concise invariant baseline and cross-links it from canonical active docs/index and contributor guidance- governance lane now runs
scripts/check-golden-principles.mjsand docs-governance now requires/validates the golden-principles document alongside canonical active docs #258adds a reusable OpenAPI guardrail lane (reusable-openapi-guardrail.yml) wired intoci-extended(PR/manual) andci-nightly- guardrail now generates
artifacts/openapi/taskdeck-api.json, validates JSON/top-level contract shape, and uploads artifact/log outputs for inspection - snapshot/diff gating remains explicitly deferred to follow-up work; current scope is generation + parse-validation + artifact publication
#257expandedApiErrorContractApiTestswith representative400/401/403/404/409coverage in one suite- representative error-path tests now assert
X-Request-Idecho behavior alongside stable JSON error-contract shape assertions
New in-review outreach CRM planning docs were added under:
docs/InReview/outreach-crm/
Issue seeding and reconciliation completed:
- tracker:
#262(OUT-00 outreach CRM deferred wave) - net-new wave issues:
#263to#268 - explicit reuse (no duplicate issue creation):
#75,#77,#175,#107
Execution posture:
- keep outreach CRM expansion in Priority IV until higher-priority active tracks complete
- sequence foundational modeling/UX slices before dashboard/runtime drafting slices
- keep execution-mode behavior configurable (draft/manual default, connector expansion separately gated)
Reconciliation record:
docs/analysis/2026-02-23_outreach-crm-synthesis.md
Verification Date: 2026-03-31 (recertified after PRs #588–#607 merge wave)
Command:
dotnet test backend/Taskdeck.sln -c Release -m:1
Result:
- Domain: 357/357 passing
- Application: 1193/1193 passing
- API integration: 413/413 passing
- CLI contract: 4/4 passing
- Architecture boundaries: 8/8 passing
- Backend Total: 1975/1975 passing
Commands:
cd frontend/taskdeck-web && npm run lintcd frontend/taskdeck-web && npx vitest --runcd frontend/taskdeck-web && npm run typecheckcd frontend/taskdeck-web && npm run build
Result:
- Frontend unit: 1491/1491 passing (134 test files) � stale: post-wave count is 1592/1592 (~125 files); see
docs/TESTING_GUIDE.mdfor latest estimates - Typecheck: passing
- Production build: passing
Command:
cd frontend/taskdeck-web && npx playwright test
Result:
- default required E2E lane remains the smoke + automation/ops + capture loop + starter-pack fixture flow
- opt-in/manual coverage now also includes
stakeholder-demo.spec.ts(TASKDECK_RUN_DEMO=1) andlive-llm.spec.ts(TASKDECK_RUN_LIVE_LLM_TESTS=1) - 2026-03-06 local rerun still passes after frontend E2E startup hardening:
- Playwright frontend port resolution now auto-falls back (
5173->4173->5001) with deterministic runner/worker convergence. - local reuse mode only reuses already-listening ports when the listener is identity-verified as Taskdeck frontend; CI mode prefers bindable ports so stale listeners do not break startup.
- first fallback resolution is now persisted in-process so worker config imports stay pinned to the runner-selected frontend port during CI execution.
- backend Playwright startup stays on deterministic
Mockprovider mode unless the run is an explicit demo flow that injects live-provider overrides. - Investigation record remains at
docs/analysis/2026-02-25_frontend-gate-port-bind-and-cors-blockers.md.
- Playwright frontend port resolution now auto-falls back (
- 2026-03-26 manual audit confirmed the previously published raw API/E2E counts were stale; the next full end-to-end suite recertification should refresh discovery/pass totals rather than continuing to repeat the older 2026-03-06 figures.
- 2026-04-09 cross-browser and mobile E2E matrix delivered (
#87): Playwright config now defines 5 projects (chromium, firefox, webkit, mobile-chrome/Pixel 7, mobile-safari/iPhone 14); tag-based filtering (@cross-browser,@mobile,@quarantine) controls which tests run per project; 5 cross-browser + 4 mobile viewport tests added; PR gate stays chromium-only; full matrix runs nightly and ontestinglabel; flaky test policy documented atdocs/testing/FLAKY_TEST_POLICY.md
Command:
cd frontend/taskdeck-web && npm run demo:director:smoke
Result:
- deterministic demo smoke: passing
- isolated smoke DB reset (
taskdeck.demo.ci.db) and fresh backend/frontend startup both verified
- Combined automated total (backend + frontend unit/build + default frontend E2E): ~6500+ passing (backend ~4279 + frontend unit ~2245 + E2E)
- Backend and frontend totals recertified 2026-04-12 via
dotnet test --list-testsandnpx vitest --run. Seedocs/TESTING_GUIDE.mdfor detailed breakdown.
Required workflow: .github/workflows/ci-required.yml
docs-governance(Ubuntu)backend-architecture(Ubuntu)backend-unit(Ubuntu/Windows)api-integration(Ubuntu/Windows)frontend-unit(Ubuntu/Windows)- lint + typecheck + build + unit tests
container-images(Ubuntu)e2e-smoke(Ubuntu, depends on prior jobs)
Extended/non-blocking workflow: .github/workflows/ci-extended.yml
workflow-lint(Actionlint for workflow YAML drift)dependency-review(PR dependency risk check)- label/manual-triggered backend solution + E2E smoke lanes (
testinglabel orworkflow_dispatch) for PRs that touch.github/workflows/**,backend/**,frontend/**,deploy/**, orscripts/** - label/manual-triggered demo director smoke lane (
automationlabel orworkflow_dispatch) via.github/workflows/reusable-demo-director-smoke.yml; docs-only PRs still need manual dispatch becauseci-extended.ymlpath filters do not watchdocs/** - label/manual-triggered E2E cross-browser matrix lane via
.github/workflows/reusable-e2e-cross-browser.yml(testinglabel orworkflow_dispatch); runs all 5 browser/device projects in parallel withfail-fast: false - label/manual-triggered load/concurrency harness lane via
.github/workflows/reusable-load-concurrency-harness.yml - 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) - label/manual-triggered visual regression lane via
.github/workflows/reusable-visual-regression.yml(PlaywrighttoHaveScreenshot()with diff artifact upload;testing/visuallabel) - label/manual-triggered container integration lane via
.github/workflows/reusable-container-integration.yml(Testcontainers PostgreSQL;testinglabel)
Mutation testing workflow: .github/workflows/mutation-testing.yml
- Weekly schedule (Sunday 04:00 UTC) + manual dispatch
- Backend Stryker.NET (Domain) + Frontend Stryker JS (captureStore/boardStore)
- Non-blocking; HTML/JSON reports uploaded as 30-day artifacts
Release workflow: .github/workflows/ci-release.yml
- SBOM/provenance generation via
.github/workflows/reusable-sbom-provenance.yml(CycloneDX SBOMs for backend + frontend, SLSA v1-style provenance manifest) - Container image build/export artifacts
Security workflow: .github/workflows/release-security.yml
- Dependency inventory/vulnerability reporting
- SBOM/provenance generation alongside existing security scans
Developer portal workflow: .github/workflows/reusable-developer-portal.yml
- OpenAPI spec export and developer portal generation
Nightly workflow: .github/workflows/ci-nightly.yml
- scheduled/manual backend solution regression
- scheduled/manual E2E smoke (reuses
.github/workflows/reusable-e2e-smoke.yml) - scheduled/manual E2E cross-browser matrix (reuses
.github/workflows/reusable-e2e-cross-browser.yml; 5 projects: chromium, firefox, webkit, mobile-chrome, mobile-safari) - scheduled/manual load/concurrency harness (reuses
.github/workflows/reusable-load-concurrency-harness.yml) - scheduled/manual container image regression
Dependency update automation: .github/dependabot.yml
- weekly Dependabot PRs for NuGet, npm, and GitHub Actions ecosystems
- minor/patch grouped; major NuGet/npm individual; Actions fully grouped
- security updates follow severity-based triage SLAs in
docs/ops/DEPENDENCY_UPDATE_POLICY.md - no auto-merge; all dependency PRs require human review and
ci-required.ymlgate pass
Release/security deep workflow: .github/workflows/release-security.yml
- release/tag/manual dependency inventory + vulnerability signal artifacts
- optional strict frontend audit enforcement for manual runs
- container image artifact/checksum lane reused from container baseline workflow
Nightly quality signals workflow: .github/workflows/nightly-quality.yml
- scheduled/manual backend coverage (domain + application)
- scheduled/manual frontend coverage
- dependency and security signal scan (reuses
.github/workflows/reusable-dependency-security-signals.yml)
CI workflow topology is documented in the header comment of .github/workflows/ci-required.yml.
Workflow ownership is enforced via CODEOWNERS (.github/workflows/ requires maintainer review).
Security and identity:
- claims-first identity is now aligned for boards/columns/cards/labels/export/queue/board-access
- claims-first identity is now aligned for audit/users as well (including self-scoped user/audit history flows)
- remaining security convergence work is concentrated on consistent cross-user policy enforcement breadth
- policy decision is now explicit: cross-user authenticated access failures should return
403; remaining work is consistent enforcement across all families/tests
Automation and data:
- active LLM provider policy supports explicit mock vs live-provider switching (
OpenAI/Gemini) with safe defaults for development/test environments - managed-key shared-token controls are now more broadly shipped: identity attribution baseline (
#236), user-facing usage policy (#240,docs/security/MANAGED_KEY_USAGE_POLICY.md), secrets/config management baseline (SEC-10,docs/security/SECRETS_MANAGEMENT_BASELINE.md), incident runbook + drill scripts (SEC-19,docs/security/MANAGED_KEY_INCIDENT_RUNBOOK.md+scripts/drills/), and abuse detection domain groundwork + operator API (#238SEC-18,AbuseActor/AbuseEvent/AbuseDetectionServicewith 4-state model) are all delivered; remaining automated live-traffic containment and quota enforcement remain tracked in#237(kill-switch budget guardrails) and the SEC-18 follow-through slice for live wiring - planner extraction remains rule/regex-based with deterministic validation and expanded board/column operation coverage
- database-level export/import now exists as a minimal safe implementation and is restricted to Development sandbox mode
- database import is file-replacement based and can fail when the SQLite file is actively locked by other operations; run imports during quiescent windows when possible
- capture inbox pipeline and canonical docs promotion are now shipped (
#200to#211); logging redaction follow-through is delivered in#212, and remaining capture-linked scalability follow-through is tracked in#213 - premium UI foundations are delivered (
#243UI-02 shared primitives,#245UI-03 stack spike,#250PERF-08 budgets); appshell premium reskin (#499) and board/card surface polish (#501) are now shipped with design-token-based styling across shell sidebar/topbar/command-palette/keyboard-help and board canvas/toolbar/action-rail/column-lane/card components; remaining premium UI items are tracked in#244,#246to#249, and optional#251 - testing-harness wave guardrails are shipped through
#255to#260; follow-up improvements now belong to normal hardening work rather than the original wave - outreach CRM deferred expansion is not shipped; tracked in
#262to#268with reuse links to delivered#75(import adapters) plus#77and#175
Observability and scalability:
- frontend/CI baseline is now Node 24.13.1 (LTS) to align with Vite 7 engine requirements and longer support runway
- containerized deployment baseline is now shipped (
#69): backend/frontend Dockerfiles, compose profile, reverse proxy compression/security headers posture, and CI image artifacts - Terraform IaC baseline is now shipped (
#102): reusable AWS single-node environment templates (dev/staging/prod), host bootstrap for the existing Docker workload layer, JWT secret retrieval from a pre-created SecureString SSM parameter instead of raw EC2 user-data injection, a dedicated persistent EBS data volume for/var/lib/taskdeck, instance replacement on bootstrap changes without discarding the SQLite path, stop-before-detach protection for planned data-volume attachment changes, protected data-volume destroy defaults forstaging/prod, backup-bucket noncurrent-version expiry with explicit versioning dependency, and an operator drift-check workflow - multi-tenancy strategy ADR is now documented (
#71) with shared-schema +TenantIdas the default rollout target; tenant isolation implementation slices remain pending - local developer MCP posture now includes a Docker Marketplace server bundle with a stable default gateway set (
docker,docker-docs,openapi,time,jetbrains,filesystem,SQLite,terraform) and optional integrations staged behind credentials/config (postman,dockerhub,kubernetes,semgrep) - MCP operations runbook and helper scripts are now available for credential wiring and repeatable baseline/optional MCP dry-run verification
- MCP regression harness now provides actionable optional prerequisite diagnostics and CI-friendly status output modes (
PASS,PASS_WITH_WARNINGS,FAIL) - out-of-code/platform execution is now tracked, but not yet fully shipped:
- production DB migration strategy (
#84, delivered -- ADR-0023) anddistributed cache strategy (delivered (PR#85)#805):ICacheServicewith InMemory/Redis/NoOp implementations, board list cache-aside with TTL, ADR-0024 - backup/restore disaster-recovery playbook (
#86) staged rollout policy (delivered (PR#101)#806): ADR-0028, 4-phase deployment workflow, release checklist, smoke test script- SBOM/provenance (
#103),cost guardrails (#104) cost guardrails (delivered (2026-04-09): cloud cost observability framework with six cost dimensions (compute, storage, LLM API, logging, network, CI/CD), three-tier budget alert thresholds (70%/90%/100%), monthly cost review workflow with checklist, feature cost hotspot registry covering 6 high-variance features (LLM API, logging, database, SignalR, CI/CD, MCP transport), budget breach runbook with detection-triage-mitigation-review phases, Terraform budget alert template, and ADR-0026#104)- cloud target topology and autoscaling ADR (
#111, delivered - ADR-0023 defines ECS Fargate topology, autoscaling policy, SLO targets, health check contract, and cost estimates; companion reference architecture atdocs/ops/CLOUD_REFERENCE_ARCHITECTURE.md) UX and operability (reconciled from product notes):
- production DB migration strategy (
- escape behavior now follows a top-surface-first contract; maintain regression coverage as new overlays and panels are introduced
- primary product gap is now telemetry and release-gate follow-through rather than missing route teaching: the product legibility wave has shipped the main shell, route guidance, docs baseline, and the first-run smoke guardrail, while
#341carries the remaining telemetry/release-gate framing - review/proposal flow now includes readable proposal summaries, impact/risk/source cues, affected-entity headlines, board-centered action rails, and deep links across inbox/review/chat/notifications/provenance (delivered in
#326); remaining polish is incremental rather than structural docs/START_HERE.md,docs/USER_MANUAL.md,docs/manual/*, and the new product help guides now complement the shippedHome/Todayonboarding path and key-route contextual help with a navigation-shaped help-center stack; the first-run smoke and launch-criteria guardrail is now delivered in#328, while broader telemetry and release-gate follow-through stays tracked in#341
Security/compliance hardening backlog added from research cross-check:
- OWASP/security headers + CSRF/XSS baseline (
#80, delivered) - API abuse/rate-limiting policy (
#81, delivered) - SSO/OIDC + optional MFA (
#82, delivered -- PR#813) - data portability/deletion workflow (
#83, delivered) - secrets/configuration management baseline (
#110)
- Unified API error-response shape and HTTP error-code mapping in shared backend helpers.
- Reduced duplicated frontend API/store logic by extracting shared query and error utilities.
- Reconciled active docs and test totals after PR #23 merge.
- Delivered development CORS configurability: default localhost origins remain allowed, development fallback localhost dev ports (
4173,5001) are included for restricted-port workflows, and development-only configured origins (Cors:DevelopmentAllowedOrigins) are merged into the API allowlist with deterministic integration coverage. - Archived stale note artifacts (
personalNotes.txt,notesFromManualTesting.txt) and archiveddocs/InReview/REPO_PACKinto dateddocs/archive/bundles with updated canonical cross-links. - Resolved local frontend E2E gate blocker by hardening Playwright frontend port resolution to avoid runner/worker
baseURLdrift when fallback ports are used; investigation retained indocs/analysis/2026-02-25_frontend-gate-port-bind-and-cors-blockers.md. - Hardened local frontend manual startup (
npm run dev) with deterministic port fallback (5173->4173->5001), bind-first occupied-port skipping for new Vite processes, and strict-port startup so restricted5173environments no longer fail or drift through implicit Vite port auto-increment. - Resolved frontend container-image
npm cipolicy blockers by keeping SignalR-compatiblews@7.5.10via vendored local tarball dependency (file:vendor/ws-7.5.10.tgz) and movingp-limitoverride to compatible3.0.2, removing forbidden registry tarball fetches while avoiding cross-major override drift. - Archived
REFACTOR_AUDIT_AND_ACTION_PLAN_2026-02-13.mdintodocs/archive/2026-02-13_phase4-doc-consolidation/audits-and-history/. - Added CI hardening parity updates: concurrency cancellation, frontend typecheck/build enforcement, TRX/JUnit failure artifacts, and package/browser caches.
- Delivered OPS-19 CI topology first pass (
#168): migrated required pipeline entrypoint to.github/workflows/ci-required.ymland extracted docs-governance lane into reusable workflow.github/workflows/reusable-docs-governance.yml. - Delivered OPS-19 CI topology second pass (
#168): extracted backend architecture and frontend unit lanes into reusable workflows (.github/workflows/reusable-backend-architecture.yml,.github/workflows/reusable-frontend-unit.yml) and routedci-required.ymlthrough them. - Delivered OPS-19 CI topology API-integration extraction (
#168): extracted API integration lane into reusable workflow.github/workflows/reusable-api-integration.ymland routedci-required.ymlthrough it while preserving Ubuntu/Windows matrix behavior. - Delivered OPS-19 CI topology third pass (
#168): addedmerge_grouptrigger parity to.github/workflows/ci-required.ymlso merge-queue evaluation runs the same required checks as PR/push. - Delivered OPS-19 CI topology fourth pass (
#168): extracted backend-unit lane into reusable workflow.github/workflows/reusable-backend-unit.ymland routedci-required.ymlthrough it while preserving Ubuntu/Windows matrix behavior and domain/application/CLI split coverage. - Delivered OPS-19 CI topology fifth pass (
#168): extracted container image and E2E smoke lanes into reusable workflows (.github/workflows/reusable-container-images.yml,.github/workflows/reusable-e2e-smoke.yml) and routedci-required.ymlthrough them while preserving required-gate dependencies and artifact behavior. - Delivered OPS-19 CI topology sixth pass (
#168): added non-blocking and scheduled orchestrator workflows (.github/workflows/ci-extended.yml,.github/workflows/ci-nightly.yml) plus release/security orchestration (.github/workflows/release-security.yml) and reusable full backend regression lane (.github/workflows/reusable-backend-solution.yml) to make nightly and release topology explicit. - Delivered OPS-19 CI topology completion (
#168): addedci-release.ymlrelease build-verification lane with SBOM/provenance placeholder, added comprehensive workflow topology documentation toci-required.ymlheader, added topology reference comments to all orchestrator workflows, addedCODEOWNERSfor.github/workflows/governance, and updated CI Status section inSTATUS.mdto reflect the full topology includingnightly-quality.yml. - Added docs governance script and architecture boundary tests as CI invariants.
- Added GitHub operations governance script to enforce issue-template label hygiene and project-automation doc invariants in CI.
- Retrofitted boards controller family to claims-first authz with integration coverage for 401/403/cross-user/happy path.
- Retrofitted columns/cards/labels/export/queue/board-access to claims-first identity and removed caller-supplied actor query/body IDs.
- Added request-correlation middleware and propagated request IDs into Ops command correlation IDs.
- Added lightweight timing/result diagnostics for log queries and automation proposal execution.
- Recorded cross-user existence policy decision: use
403for authenticated-but-unauthorized access, reserve404for true missing resources. - Aligned active docs cross-links/date stamps across
STATUS,IMPLEMENTATION_MASTERPLAN,TESTING_GUIDE, andMANUAL_TEST_CHECKLIST. - Confirmed GitHub Project operational safety view as
No Status(no:status) and documented release/weekly safety checks. - Enforced
[Authorize]on remaining legacy controllers (columns/cards/labels/export/audit/llm-queue/board-access/users) with expanded API integration401coverage. - Retrofitted audit/users families to claims-first actor identity and self-scoped access with cross-user
403coverage. - Expanded authz regression matrix tests across legacy + advanced protected controllers for explicit
401/403/404policy assertions. - Advanced SEC-11 cross-user convergence (
#152) with proposal-scope authorization enforcement in automation proposal lifecycle endpoints (get/approve/reject/execute/diff) and expanded API integration policy coverage for automation/logs/starter-pack protected routes. - Advanced SEC-11 cross-user convergence (
#152) with archive read-path authorization hardening: archive item list/detail/entity-lookup endpoints now enforce board-read permissions for the authenticated caller (403for cross-user unauthorized,404for true missing), with expanded application/API regression coverage. - Advanced SEC-11 cross-user convergence (
#152) with audit entity-history authorization hardening:GET /api/audit/entities/{entityType}/{entityId}now resolves board-scoped entities (Board/Column/Card/Label) and enforces board-read permissions (403cross-user unauthorized,404true missing), with expanded API regression matrix coverage. - Advanced SEC-11 cross-user convergence (
#152) with LLM queue board-scope authorization hardening:POST /api/llm-queuenow enforces board-read permissions whenboardIdis provided (403cross-user unauthorized,404true missing board), with expanded application/API regression matrix coverage. - Advanced SEC-11 cross-user convergence (
#152) with final API coverage sweep: added explicit cross-user403assertions for board update, board-access management endpoints (list/grant/update/revoke), and chat session/message endpoints; added explicit chat404assertions for true missing session IDs. - Delivered API-06 centralized exception/fallback error-contract hardening (
#153): added global unhandled-exception middleware returning deterministicApiErrorResponse(UnexpectedError) without internal exception leakage, standardized unknown-result fallback500mapping to the same contract shape, and added fault-injection API integration coverage asserting fallback payload shape plus correlation header expectations. - Delivered SEC-06 API rate-limiting hardening (
#81): added partitioned fixed-window rate limiting policies (auth per-IP, capture write per-user, hot-path per-user), deterministic429ApiErrorResponsecontract with retry metadata headers (Retry-After,X-RateLimit-Policy), endpoint-level policy application across auth/capture/chat/llm queue paths, and regression coverage for burst throttling, reset-window recovery, and cross-user false-positive boundaries. - Delivered SEC-06 forwarded-header trust follow-through (
#81): rate-limit partitioning now supports trusted forwarded-header processing behind explicit proxy/network allowlists plus configurable forwarded-hop depth (ForwardedHeaders:ForwardLimit), keeps safe no-trust defaults when allowlists are unset, hardensOnRejectedwrite-order guardrails for started responses, adds regression coverage for trusted multi-hop forwarded-client partition behavior, and documents emergency kill-switch + proxy-topology smoke-check operations. - Delivered SEC-05 OWASP baseline hardening (
#80): added API security-header middleware with environment-aware HSTS behavior, added API integration coverage for security-header presence on success/auth-failure responses and HTTPS HSTS emission posture, and publisheddocs/security/SECURITY_OWASP_BASELINE.mdto document CSRF/XSS posture and tracked follow-up gaps. - Delivered TST-14 architecture-guard expansion (
#157): added deterministic architecture invariants for source-layer purity (forbidden namespace imports in Domain/Application), controller boundary rules (ControllerBasedirect inheritance restricted to auth/health controllers), and protected-controller[Authorize]declaration enforcement. - Delivered AUTH-06 register/login hardening (
#174) by preventing inactive-candidate short-circuit lockout in identifier-collision login paths, adding actionable duplicate-registration guidance, and expanding backend/frontend regression coverage for duplicate-register-then-login flow plus account-state vs invalid-credentials contract behavior. - Delivered TST-01 load/concurrency regression harness (
#70): added k6 board-heavy API profile with thresholds and diagnostics, added Playwright multi-session concurrency scenarios, and wired reusable load harness workflow intoci-extended/ci-nightlywith artifact uploads. - Delivered ARCH-01 multi-tenancy strategy ADR (
#71): documented option tradeoffs (database-per-tenant,schema-per-tenant,shared-schema + TenantId), selected phased target model, and published tenant-isolation readiness + test strategy checklist. - Delivered FE-11 frontend lint baseline + CI gate (
#154): added Vue 3 + TypeScript ESLint baseline (.eslintrc.cjs), introducednpm run lintwith zero-warning enforcement, integrated lint into reusable frontend CI workflow, and documented lint suppression guidance in active testing docs. - Delivered FE-12 frontend coverage threshold gate (
#155): enforced global + critical-surface Vitest coverage thresholds (src/api,src/store,src/composables,src/utils,src/components/board), switched required frontend CI lane to thresholded coverage execution, and standardized JUnit+coverage artifact upload for triage. - Delivered COL-02 notification framework (
#72): added notification domain/persistence + preferences model, shipped authenticated inbox/preferences/read-state APIs with preference-aware deduped event publication for mention/assignment/proposal-outcome families, integrated frontend inbox/preferences routes + stores, and expanded backend/frontend regression coverage. - Delivered COL-04 card comments/mentions workflow (
#74): added threaded card comments with reply constraints and moderation-aware edit/delete policy, integrated mention parsing with board-scope user linking and notification publication, shipped board/card comment APIs + frontend modal interactions, and expanded backend/frontend regression coverage. - Delivered INT-01 external import adapters foundation (
#75): added board-scoped external import endpoint with provider-registry orchestration, shipped CSV adapter path with outreach-contact mapping and deterministic dedupe-key ordering (linkedin_url->email-> normalizeddisplay_name+company), added dry-run/apply create-update-skip/conflict reporting and rollback-safe apply semantics, enforced CSV payload/row guardrails plus archived-board import rejection behavior, and documented mapping guidance indocs/platform/IMPORT_ADAPTERS_GUIDE.md. - Delivered INT-02 webhook integration security model (
#76): added board-scoped outbound webhook subscription/delivery runtime with endpoint + event-filter + secret-rotation/revocation controls, signed delivery dispatch, atomic claim/reload worker processing, and retry/dead-letter handling for non-success dispatch outcomes. - Standardized middleware-level auth failures to emit
ApiErrorResponsepayloads and added SEC-04 API integration assertions for auth + validation contract stability. - Aligned board archive lifecycle UX/API contract: board settings archive action now reflects soft-delete semantics, archive workspace lists/restores archived boards, and API integration covers archive-to-restore roundtrip.
- Delivered UX-02 drag/edit interaction safety guardrails: card/column drag now starts from explicit handles only, and non-handle drag gestures are blocked with unit + E2E regression coverage.
- Delivered UX-03 command palette keyboard model: shell command palette now supports keyboard-first item filtering, selection, and activation with unit + E2E regression coverage.
- Delivered UX-04 activity selector discoverability: activity workflows now use selector-first board/entity/user exploration with ID copy affordance and unit + E2E regression coverage.
- Delivered UX-04 shared input-assist scaffolding: shared combobox/listbox input-assist is now integrated into Ops template selection and automation chat board targeting with keyboard-first option navigation and dedicated unit coverage.
- Delivered UX-05 escape behavior contract: Escape now closes only the top-most transient surface per key press, board routes exit to
/workspace/boardswhen clean, and regression coverage spans shell/unit and board keyboard-flow E2E paths. - Delivered AUTO-01 provider strategy: deterministic environment-aware
ILlmProviderselection now gates OpenAI usage behind explicit config while keeping mock default safety, with policy + provider tests for switching behavior. - Delivered AUTO-03 provider-agnostic runtime (
#232): expandedILlmProviderruntime support toOpenAI+Geminiwith deterministic config validation fallback toMock, added Gemini provider adapter + policy/test coverage, and extended capture/chat integration assertions for provider/model provenance and non-mock provider stubs. - Delivered SEC-16 managed-key identity attribution baseline (
#236): added server-derived chat provider attribution contract (userId, correlation ID, source surface, board/session scope), standardized provider attribution header mapping with pseudonymous provider user-token usage, persisted capture provenance attribution metadata for audit follow-through, and expanded backend regression coverage for attribution propagation and spoofing rejection. - Delivered AUTO-02 planner/executor hardening: expanded deterministic planner instruction coverage (board/column intents), hardened executor parameter validation and partial-failure semantics, and improved audit entity attribution with new regression coverage.
- Delivered MVP-01 chat-to-project bootstrap: canonical Markdown checklist paste now creates a proposal-first board bootstrap plan in chat, with one-click approve+execute path and regression coverage for happy path + key validation failures.
- Delivered PACK-01 starter-pack manifest foundation: added v1 manifest schema documentation and deterministic backend validator/test coverage for parsing, compatibility rules, and cross-reference validation.
- Delivered PACK-02 starter-pack apply backend: added
/api/boards/{boardId}/starter-packs/applywith idempotent apply semantics, dry-run actionable conflict reporting, and API integration coverage for apply success/re-apply/conflict paths. - Delivered PACK-03 starter-pack frontend catalog: added board-level starter pack catalog UI with search, preview (dry-run), and one-click apply flow, plus frontend API/component interaction tests.
- Delivered PACK-04 first-party starter packs v1: added API-backed first-party starter-pack catalog with common labels, common column flow, and 3 board blueprints, plus backend/frontend coverage for catalog usability and validity.
- Delivered PACK-05 deterministic fixture packs: added Playwright starter-pack fixture bootstrap helpers with manifest-backed small/medium/edge scenarios and dedicated E2E regression coverage.
- Delivered PACK-07 warning-first starter-pack apply UX (
#176): non-blocking seed-card conflicts now return warning severity (not hard-stop409), apply now proceeds when only warnings exist, and the starter-pack modal now surfaces explicit applied/skipped/blocked/warning outcomes with updated backend/frontend regression coverage. - Delivered OPS-20 ops role discoverability and permission guidance (
#179): Ops console now surfaces current role + runnable-template context, restricted template failures now return actionable role-escalation guidance with runnable fallback lists, profile settings now expose role/capability posture, and operator/manual docs now document the role-assignment workflow. - Delivered UX-11 archive lifecycle control refinement (
#177): board settings now use a single lifecycle action (archive/restore) instead of duplicated archive controls, archive workspace now supports hide/unhide behavior for archived boards with explicit hidden-board reveal toggles, and regression coverage now includes API lifecycle transitions plus archive visibility filtering behavior. - Delivered DEBT-01 nullability reduction: removed current domain
CS8618warnings using EF-safe non-null default initialization patterns and verified backend regression suite pass. - Delivered DEBT-02 log-query scalability pass: replaced broad in-memory + command-run N+1 log composition with repository-filtered query paths while preserving logs API behavior and contracts.
- Delivered COL-01 realtime board updates (
#67): added authz-safe SignalR board subscriptions, app-layer mutation event publishing, frontend realtime lifecycle with polling fallback, and regression coverage across API/unit/E2E suites. - Delivered OBS-01 observability baseline (
#68): added OpenTelemetry tracing/metrics wiring, worker/queue/heartbeat telemetry emission, correlation-to-trace tagging, and versioned runbook/alert threshold documentation. - Delivered OPS-07 containerized deployment baseline (
#69): added production-oriented backend/frontend Dockerfiles, compose-based proxy stack with gzip/security header posture, CI image artifact packaging, and deployment runbook coverage. - Delivered OPS-16 deployment/container hardening verification matrix (
#142): addedscripts/deploy/Verify-TaskdeckDeploymentHardening.ps1to automate secret-enforcement, proxy-header, unauthorized-path, and startup/restart/shutdown checks; published pass/fail matrix criteria indocs/ops/DEPLOYMENT_HARDENING_MATRIX.md; and extended testing/manual/deployment runbooks with the new verification path. - Expanded local Docker MCP Marketplace setup: enabled additional Docker catalog servers (including SQLite/JetBrains/Postman candidates), configured Docker gateway defaults in project Codex config, and documented optional credential-gated integrations.
- Added MCP operator runbook + scripts (
Set-MarketplaceMcpCredentials.ps1,Test-DockerMcpProfile.ps1) for daily/weekly workflow integration and deterministic optional-server verification. - Delivered TST-07 MCP integration smoke/regression harness (
#141): optional-server prerequisite diagnostics are now explicit, strict/warning/skip policies are codified, and CI-friendly deterministic status output is documented and shipped. - Seeded capture realignment wave issues (
#199to#213), updated the wave index (#107) with a dedicated capture wave, and extended SEC-06 rate-limiting scope (#81) to include capture endpoints. - Seeded future-expansion backlog issues (
#67to#111) and added execution-wave index (#107). - Applied
Priority IthroughPriority Vlabels to every repository issue. - Seeded testing-harness wave issues (
#254to#260) and updated in-review extraction records with duplicate prevention notes. - Seeded outreach CRM deferred-wave issues (
#262to#268) and reconciled overlapping scope into existing issues (#75,#77,#175,#107). - Delivered TST-CODEX-01 to TST-CODEX-15 unit test coverage wave (
#415to#429, PRs#436to#448): added frontend API/composable/store tests and backend domain entity/application service/API tests across 13 PRs, with adversarial review fixes for tautological assertions, missing guard branches, modifier-key coverage, and edge-case gaps. - Delivered AGT-01 follow-up (PR
#453): removedFromSqlInterpolatedraw-SQL SQLite branch fromAgentRunRepository; now uses pure LINQ path for all agent-run queries. - Delivered KNOW-01 follow-up (PR
#454):KnowledgeChunkRepository.DeleteByDocumentIdAsyncnow usesExecuteDeleteAsyncfor a single-roundtrip server-side delete;KnowledgeFtsSearchServiceGUID lookups use.ToUpperInvariant()to match EF Core uppercase storage;SourceTypecolumn typed asint?; application-managed FTS sync viaUpdateFtsIndexAsync/DeleteFtsIndexAsyncreplaces broken trigger pattern;SanitizeFtsQueryinternal method added for FTS5 query safety. - Delivered UI-01 follow-up (PR
#455): DRY accent-color refactor indesign-tokens.css� 9 hardcoded hex values replaced with--_td-light-accentand--_td-light-accent-hoverCSS variables; single source of truth for the primary action accent. - Delivered TST-26 knowledge service tests (PR
#456): 32 new backend tests acrossKnowledgeServiceChunkContentTests,KnowledgeFtsSearchServiceSanitizeTests,KnowledgeServiceAuthorizationTests, andKnowledgeApiTests; includes EF Core migration with proper Designer snapshot, SQLite DateTimeOffset ORDER BY fix viaFromSqlInterpolated, and FTS5 trigger-removal migration. - Delivered UI-03 primitive stack decision spike (PR
#457):docs/analysis/ui-primitive-stack-decision-spike.mddocuments the selection of shadcn-vue over Reka UI direct and Headless UI across 6 evaluation criteria (component count, ARIA baseline, copy-paste ownership, accessibility maturity, Vue 3 compatibility, ecosystem trajectory). - Delivered DOC-05 / SEC-17 managed-key usage policy (PR
#458):docs/security/MANAGED_KEY_USAGE_POLICY.md� user-facing fair-use limits, prohibited patterns (scraping, bulk operations, key extraction), enforcement ladder (warn → restrict → suspend → ban), and appeals process; linked from active security docs. - Delivered SEC-10 secrets and configuration management baseline (PR
#459):docs/security/SECRETS_MANAGEMENT_BASELINE.mdwith secret inventory, per-environment storage model, and rotation runbooks;deploy/docker-compose.ymlupdated to wireLlm__EnableLiveProviders,Llm__Provider,Llm__OpenAi__ApiKey, andLlm__Gemini__ApiKeyenv vars through to the API container. - Delivered SEC-19 incident response drills (PR
#460):docs/security/MANAGED_KEY_INCIDENT_RUNBOOK.mdcovering 4-stage incident lifecycle (detect → contain → eradicate → recover) with identity-scope quarantine accuracy note (caller-self only);scripts/drills/with 5 failure-injection drill scripts (drill-api-auth-failure.sh,drill-api-rate-limit-exhaustion.sh,drill-budget-threshold-breach.sh,drill-mcp-config-validation.sh,drill-provider-degradation.sh) andrun-all-drills.shorchestrator. - Delivered ActivityView decomposition (PR
#461):ActivityView.vuereduced from ~735 → ~117 lines via extracteduseActivityQuerycomposable (API fetching/filtering state),ActivitySelector.vue(board/entity/user picker UI), andActivityResults.vue(result list rendering); unit + component tests added for each piece. - Delivered PERF-08 frontend latency budgets (PR
#462):usePerformanceMarkcomposable withperformance.mark()/performance.measure()API and reactiveduration/overBudgetrefs;PERF_BUDGETSconstants; 16 workspace route views converted to lazy() => import()for route splitting;docs/PERFORMANCE_BUDGETS.mdwith 7 documented latency thresholds; CaptureModal instrumented. - Delivered BoardView decomposition (PR
#463):BoardView.vuereduced from ~771 → ~270 lines viauseBoardDragDrop(column/card DnD logic),useBoardKeyboardNav(j/k/h/l keyboard selection),BoardToolbar.vue(header, presence, filter, settings actions),BoardActionRail.vue(board-context action strip),BoardCanvas.vue(column DnD scaffold + ColumnLane),BoardDialogHost.vue(all modal/overlay hosting); unit + component tests added. - Delivered UI-02 shared UI primitives foundation (PR
#464): 15 shared primitive components insrc/components/ui/�TdButton,TdIconButton,TdInput,TdTextarea,TdSelect,TdFieldWrapper,TdDialog,TdDropdown,TdPopover,TdTooltip,TdToast,TdInlineAlert,TdSkeleton,TdSpinner,TdBadge,TdTag,TdEmptyState; built on Reka UI via shadcn-vue copy-paste ownership; WAI-ARIA keyboard foundation throughout. - Delivered OUT-01 JSON manifest import tab (PR
#465):StarterPackCatalogModal.vuegains a JSON Import tab with paste/file-upload, validate→dry-run→apply flow; JSON payload parsed against the v1 manifest schema with actionable error display before apply. - Delivered SEC-12 session-token storage hardening (PR
#466):utils/tokenStorage.tscentralizes all JWT token/session key access behindgetToken/setToken/clearAll;isValidJwtStructurevalidates base64url segment count AND decodes the payload as JSON (rejecting structurally invalid tokens likeaaa.bbb.ccc);router/index.tsandsessionStoremigrated to tokenStorage abstraction; CSPunsafe-inlineremoved fromscript-src; OWASP baseline doc updated with CSP note; session-token storage ADR atdocs/analysis/session-token-storage-adr.md. - Delivered StarterPack service decomposition (PR
#467):StarterPackManifestValidatorextracted intoStarterPackSchemaValidator(structure/field/collection validation),StarterPackSemanticValidator(content/cross-reference constraints),StarterPackConflictDetector(dry-run board-state conflict detection), andStarterPackIdempotencyChecker(re-apply idempotency logic); duplicate null-collection validation bug fixed in self-review. - Delivered SEC-18 abuse detection operator tooling + domain groundwork (PR
#468):AbuseActor.cs+AbuseEvent.csdomain entities with 4-state containment model (Observe → Suspicious → Restricted → Blocked);AbuseDetectionServicewith signal evaluation, state-machine transitions, operator quarantine/unquarantine/block/list API groundwork; live-traffic wiring is an explicit follow-up slice. - Delivered ArchiveRecovery service decomposition (PR
#469):ArchiveRecoveryServiceextracted intoArchiveConflictDetector(pre-restore board-name/column/label conflict detection),RestorePlanner(produces ordered restore operations), andRestoreExecutor(applies restore operations transactionally). - Delivered AutomationExecutor pipeline decomposition (PR
#470):AutomationExecutorServiceextracted intoOperationParameterParser(type-safe parameter extraction),ExecutionAuditRecorder(per-operation audit emission), andOperationHandlerRegistry(handler dispatch table); each piece unit-tested independently. - Delivered deploy/MCP failure injection drills (PR
#471):scripts/drills/with 5 shell scripts covering API auth failure, rate-limit exhaustion, budget threshold breach, MCP config validation/unknown-server handling, and provider degradation scenarios;run-all-drills.shorchestrator with pass/fail summary; corrected drill-mcp scope to config validation (not credential injection) in self-review.
Authoritative docs:
docs/STATUS.mddocs/IMPLEMENTATION_MASTERPLAN.mddocs/TESTING_GUIDE.mddocs/MANUAL_TEST_CHECKLIST.md
Audience-first product docs:
docs/START_HERE.mddocs/USER_MANUAL.mddocs/product/DEMO_PLAYBOOK.md
Historical/spec detail material:
docs/archive/(latest consolidation bundle:docs/archive/2026-02-13_phase4-doc-consolidation/)
Rule:
- If archive content conflicts with active docs, active docs win.