Taskdeck has a lot of capability under the hood. If you click around a fresh instance, some pages look empty because they are event-driven and only populate after specific flows.
This playbook gives you:
- A one-command seed so the UI starts populated.
- Scenario harness commands for repeatable demos.
- A short stakeholder flow and an opt-in recorder.
Use START_HERE.md first if you are trying to understand the product. This playbook is for seeded demos, stakeholder walkthroughs, and regression/operator use, not the main onboarding path.
Core story:
Capture -> Triage -> Proposal -> Apply -> Board
Saul-facing recording contract:
docs/product/SAUL_DEMO_REHEARSAL_CONTRACT.md
- Start backend
cd backend/src/Taskdeck.Api
dotnet run- Start frontend
cd frontend/taskdeck-web
npm install
npm run devDefault URLs:
- API:
http://localhost:5000/api - UI:
http://localhost:5173 - Local fallback ports for UI:
http://localhost:4173,http://localhost:5001 - Health-check endpoints (note: these are not under the
/apiprefix):http://localhost:5000/health/live— liveness probehttp://localhost:5000/health/ready— readiness probe
- Seed baseline demo data
cd frontend/taskdeck-web
npm run demo:seedThe seeder creates demo users, boards, Inbox items, proposals, queue activity, notifications, and Ops logs. On reruns against the canonical demo account, it now reuses the seeded artifacts it can identify instead of appending a fresh copy of every capture, queue sample, comment, chat session, and Ops evidence item.
Use npm run demo:seed -- --reset to delete all demo boards before seeding (clean start).
Use npm run demo:seed -- --help for full usage information.
The canonical dev database is backend/src/Taskdeck.Api/taskdeck.db (SQLite, created by EF Core migration on first backend startup). The connection string is Data Source=taskdeck.db in appsettings.json, resolved relative to the backend's working directory.
To reset the database without --reset (which only deletes demo boards via the API):
cd frontend/taskdeck-web
npm run demo:reset-db # delete canonical dev DB
npm run demo:reset-db -- --all # also delete e2e/demo/ci DB filesThen restart the backend — EF Core will recreate the DB from migrations.
Other DB files in the repo are per-purpose:
taskdeck.e2e*.db— E2E test databases (Playwright)taskdeck.demo*.db— demo director/CI databasesbackend/tests/**/taskdeck.db— backend test databases (created by test runs)taskdeck.dbat repo root — created when the backend is started from the repo root (e.g.dotnet run --project backend/src/Taskdeck.Api/...). Safe to delete when the backend is stopped and your active dev DB isbackend/src/Taskdeck.Api/taskdeck.db.
When running demos with a platform-managed LLM provider key (any configuration where Llm__Provider is set to OpenAI or Gemini with a shared key), presenters should be aware:
- User chat messages and capture content are sent to the configured third-party provider
- Per-user quota limits apply (default: 60 requests/hour, 100K tokens/day)
- Operator kill switches can throttle or block LLM access per user, per surface, or globally
Full policy details: docs/security/MANAGED_KEY_USAGE_POLICY.md
- Demo scripts are local-safe by default. They target
http://localhost:5000/apiunless you overrideTASKDECK_API_BASE_URLorTASKDECK_E2E_API_BASE_URL. - Non-local API targets are rejected unless you explicitly set
TASKDECK_DEMO_ALLOW_NON_LOCAL_API=1. - UI links and Playwright bootstrap default to
http://localhost:5173; local fallback ports4173and5001are also supported. - Demo harness credentials default to
demo/demo123andcollab/demo123unless you override theTASKDECK_DEMO_*/TASKDECK_COLLAB_*environment variables. - Full Playwright-backed demos (
demo:directoror the opt-in stakeholder recorder) now auto-enable a live provider when LLM steps are enabled and a usable key is present. - Gemini is preferred for full demos when
GEMINI_API_KEY,TASKDECK_DEMO_GEMINI_API_KEY, orLlm__Gemini__ApiKeyis set. UseTASKDECK_DEMO_LLM_PROVIDER=OpenAIto force OpenAI instead. - Demo-specific live keys now take effect even when the base development environment is pinned to
Llm__Provider=Mock; useTASKDECK_DEMO_LLM_PROVIDER=MockorTASKDECK_DEMO_DISABLE_LIVE_LLM=1to force mock instead. - When a full demo injects live-provider overrides, Playwright also disables existing-server reuse by default so the intended backend process is launched instead of silently inheriting a stale mock server.
taskdeck-chatautopilot and scenario steps markedrequiresLlm: truestill need a usable live-provider key. Use--skip-llmfor deterministic local or CI runs.demo:directorand the stakeholder recorder require Playwright Chromium (npx playwright install chromium) and write access tofrontend/taskdeck-web/demo-artifacts/.demo:director:smokealso owns a dedicated Playwright/demo database (frontend/taskdeck-web/taskdeck.demo.ci.db) and forces fresh backend/frontend startup so repeated runs do not inherit localtaskdeck.e2e.dbstate.- In fresh-server mode, the director keeps
http://localhost:5000/apiwhen it is free and otherwise auto-selects a free local API port before starting the backend. - Unknown scenario IDs now fail fast during director/recorder setup so autopilot and walkthrough selection do not silently target the engineering board by fallback.
- Director-specific flags must appear before
--; anything after--is forwarded to Playwright unchanged. Unknown director flags now fail fast instead of being silently forwarded.
Scenario reference: SCENARIOS.md
List scenarios:
cd frontend/taskdeck-web
npm run demo:run -- --listRun scenarios:
npm run demo:run -- engineering-sprint
npm run demo:run -- support-triage
npm run demo:run -- content-calendar
npm run demo:run -- --clean engineering-sprint
npm run demo:run -- --clean --dry-run engineering-sprintJSON-runner flags:
# skip default LLM-dependent steps and any step marked requiresLlm: true
npm run demo:run -- support-triage --skip-llm
# keep running after a failed step
npm run demo:run -- engineering-sprint --continue-on-errorAutopilot simulation:
npm run demo:autopilot -- --turns 5 --brain heuristicDeterministic autopilot simulation (seeded):
npm run demo:autopilot -- --turns 5 --brain heuristic --rng-seed 42Optional chat-driven autopilot (requires live provider setup):
npm run demo:autopilot -- --turns 5 --brain taskdeck-chatLoop-specific autopilot runs:
npm run demo:autopilot -- --loop queue
npm run demo:autopilot -- --loop capture
npm run demo:autopilot -- --loop mixedSaul-facing default (recording path):
- Home
- Confirm the product teaches
Inbox -> Review -> Board. - Open the
DEMO: Client Onboarding Demoboard path.
- Inbox/Capture
- Show ACME capture lineage and the proposal handoff action.
- Review
- Confirm review-first trust cues (
nothing changes until approval). - Show the proposal in business wording and apply deliberately.
- Board
- Show the clean onboarding reveal on
DEMO: Client Onboarding Demo.
Extended walkthrough (optional):
- Boards
- Open
DEMO: Client Onboarding Demo. - Explain reviewed proposals are the mutation gate.
- Inbox
- Show ignored and triaged items.
- Follow provenance from capture item to proposal.
- Automations -> Proposals
- Show pending/applied proposals.
- Explain review-first safety and explicit operations.
- Notifications
- Show mention and proposal outcome notifications.
- Activity and Ops (optional)
- Show audit/activity events.
- Show seeded Ops runs/log entries.
- Capture in Inbox.
- Start triage.
- Review in Proposals.
- Approve and execute.
- Continue board execution.
These surfaces are event-driven:
Activityneeds audit events.Notificationsneeds mentions/proposal outcomes.Ops -> Logsneeds Ops runs.Accessneeds board-specific entries.
Use npm run demo:seed and/or npm run demo:run before a manual walkthrough.
Activity, Ops, Access, and Archive are default-off on first run.
Enable them in Settings -> Feature Flags when needed for walkthrough coverage.
Use:
demo/http/taskdeck-demo.http
It is designed for VS Code REST Client and exercises register/login, board creation, capture triage, queue, proposals, and Ops templates.
Spec:
frontend/taskdeck-web/tests/e2e/stakeholder-demo.spec.ts
Skipped by default. Run only when explicitly requested.
PowerShell:
$env:TASKDECK_RUN_DEMO='1'
cd frontend/taskdeck-web
npx playwright test tests/e2e/stakeholder-demo.spec.ts --headedBash:
TASKDECK_RUN_DEMO=1 npx playwright test tests/e2e/stakeholder-demo.spec.ts --headedCI policy:
stakeholder-demo.spec.tsremains opt-in only. Default Playwright CI lanes setTASKDECK_RUN_DEMO=0and do not execute the recorder.- Use the deterministic smoke command below for explicit regression proof instead of adding the full recorder to required CI.
For a one-command, repeatable stakeholder run (including artifacts), use:
cd frontend/taskdeck-web
# Full run with deterministic autopilot seed
npm run demo:director -- --scenario engineering-sprint --turns 18 --brain heuristic --loop mixed --rng-seed demo-1
# Saul-facing deterministic rehearsal artifacts (no autoplay turns)
npm run demo:director -- --output-dir ./demo-artifacts/saul-rehearsal --e2e-db ./taskdeck.demo.saul.db --reset-e2e-db --fresh-servers --scenario client-onboarding --skip-llm --turns 0 --rng-seed saul-rehearsal
# CI-style deterministic run without LLM-required steps
npm run demo:director -- --scenario engineering-sprint --turns 12 --skip-llm --rng-seed ci-1
# Headed run if you want to watch the clickthrough
npm run demo:director -- --scenario engineering-sprint --turns 10 --headed
# Forward Playwright flags after `--`
npm run demo:director -- --scenario engineering-sprint --turns 10 -- --project=chromium
# Deterministic smoke path used for explicit CI/manual regression proof
npm run demo:director:smokeArtifacts are written to:
frontend/taskdeck-web/demo-artifacts/run-<timestamp>/
README.md
run-summary.json
snapshot.json
trace.ndjson
logs/
screenshots/
playwright/
trace.ndjson contains structured scenario/autopilot events and is useful for debugging failed demo runs.
demo:director:smoke writes to frontend/taskdeck-web/demo-artifacts/ci-smoke/, resets frontend/taskdeck-web/taskdeck.demo.ci.db, auto-selects a free local API port when 5000 is occupied, and disables Playwright server reuse so artifact upload paths and seeded board state stay stable across reruns.
If startup still fails because you forced conflicting overrides, the director now prints a remediation hint that points to TASKDECK_E2E_API_BASE_URL and TASKDECK_E2E_FRONTEND_PORT.
When LLM steps are enabled, the full director flow will automatically pass live-provider settings to the backend web server when a usable demo key is present. Smoke runs still stay deterministic because --skip-llm suppresses that auto-enable path.
If you override the board name (--autopilot-board or equivalent env), the recorder walkthrough now follows that same selected board instead of falling back to the scenario default board during the UI clickthrough.
- Required CI and nightly Playwright lanes stay focused on baseline product regressions and explicitly keep the stakeholder recorder off.
ci-extended.ymlexposesdemo-director-smokeas an opt-in lane viaworkflow_dispatchor a PR labeledautomationwhen the PR touches.github/workflows/**,backend/**,frontend/**,deploy/**, orscripts/**.- Full demo walkthrough recording stays manual/headed by default; use
TASKDECK_RUN_DEMO=1only when you intentionally want the recorder.
Treat these as advanced or diagnostic surfaces in MVP demos:
- Ops
- Activity
- Access
- Archive
Primary narrative remains capture-to-proposal with explicit review.