Launch smoke test — what to click, what to look for
A runbook for an agent (or human) tasked with clicking through the whole drobek surface before a deploy. The agent that runs this is not the agent that built it — assume zero context. The goal: catch broken links, stale copy, layout regressions, and end-to-end flow breakage on the live build.
How to use this doc. Work top to bottom. For each row, perform the action, check the expectation, and report PASS / FAIL with a one-line note + screenshot path. At the end, post the consolidated report (see §10) — not a stream of comments.
1. Setup
task up # docker compose dev stack
task ps # confirm web (3011), mcp (3012), postgres, redis are UpOpen the marketing surface at http://127.0.0.1:3011/. The product surface is reached by clicking Start free → sign-up → onboarding wizard.
If task up is not available, fall back to pnpm --filter @drobek/web dev and pnpm --filter @drobek/mcp dev in two terminals.
Browser: Chromium-based, both light and dark themes. The theme toggle sits in the top-right of the marketing nav.
2. Public marketing surface — every route must return 200 and render
For each row: navigate, wait for full hydration, confirm the page does not flash an error boundary, confirm the listed copy fragment is present, take a screenshot.
| # | Path | Must contain | Notes |
|---|---|---|---|
| 2.1 | / | "Agents plan.", "Built in Brno", "Hosted in Espoo, FI" | Build city = Brno, host city = Espoo, FI (both shown) |
| 2.2 | /features | feature grid renders | |
| 2.3 | /pricing | "Free", "Pro", "Coming soon", FAQ section | NO bullet "Self-host compatible" anywhere |
| 2.4 | /about | "Built in Brno", "Tomáš Grasl", tomasgrasl.cz link | NO "we", NO "team lead", NO hello@drobek.app |
| 2.5 | /faq | 4 categories: Getting started / Pricing / Integrations / Compliance | NO hello@drobek.app anywhere on page |
| 2.6 | /docs | list of every Markdown file from repo docs/*.md | Each entry is a link |
| 2.7 | /docs/onboarding | renders onboarding doc with H1, lists, code blocks | Sidebar "Other docs" shows the rest |
| 2.8 | /docs/mcp-server | renders mcp-server doc | Code blocks display monospace |
| 2.9 | /blog | at least one entry | |
| 2.10 | /blog/<latest-slug> | full article body | |
| 2.11 | /changelog | versioned entries | |
| 2.12 | /status | combined Web / Postgres / Redis / MCP rows | Down rows are red, ok rows green |
| 2.13 | /legal/terms | "Limitation of liability", "EUR 100", "Brno", "Section 12", "Indemnification", "Force majeure" | Numbered lists render as <ol> |
| 2.14 | /legal/privacy | "Sub-processors" table, "72 hours", "Zero Data Retention", "Brno" | Table renders correctly |
| 2.15 | /legal/cookies | tables for "Strictly necessary" + "Functional preferences" | Lists the actual cookies drobek_session, drobek_csrf, drobek_lang, drobek-theme, drobek-cookies-v1 |
| 2.16 | /legal/dpa | Annex A, B, C; "Article 28"; "Audits are limited" | Numbered Article 28 obligations 1-9 |
| 2.17 | /cs/legal/terms | Czech disclaimer banner + EN body underneath | Same for /de/, /es/ |
| 2.18 | /llms.txt | text/plain response | Lists key URLs |
| 2.19 | /robots.txt | text/plain response | |
| 2.20 | /sitemap.xml | valid XML |
Negative routes (must 404)
| Path | Why |
|---|---|
/legal/status | old path; we moved status to /status |
/docs/this-does-not-exist | unknown slug |
/legal/anything-not-in-list | unknown legal slug |
3. Navigation + footer
On /:
- [ ] Top nav has links: Features, Pricing, Docs, Blog, Changelog, Status. Every link navigates to the matching
/pathand shows the active state. - [ ] Theme toggle flips light/dark, persists across reload (check localStorage
drobek-theme). - [ ] Sign in and Start free buttons both go to
/login. - [ ] Footer shows: Product (Features / Pricing / Changelog), Resources (Docs / Blog / Status), Company (About / FAQ / Terms / Privacy / Cookies / DPA). NO
hello@drobek.appmailto. Footer city = Brno. "Built by Tomáš Grasl" links to https://www.tomasgrasl.cz/ in a new tab.
4. Favicon
- [ ]
GET /favicon.svg→ 200,image/svg+xml - [ ]
GET /apple-touch-icon.svg→ 200 - [ ] Browser tab shows the drobek mark (gradient circles), not a generic earth/document icon.
5. Cookie banner
First visit (incognito or clear drobek-cookies-v1):
- [ ] Banner appears at the bottom on every public page (it does not block first paint).
- [ ] Accept all → banner closes,
localStorage.drobek-cookies-v1set with all three categories true. - [ ] Reject non-essential → banner closes, only
strict: truestored. - [ ] Customize → modal with three toggles; _Strictly necessary_ is locked on, others editable; Save preferences closes modal and persists.
6. Sign-up + onboarding flow
This is the core funnel. Run it on a fresh email each time.
- From
/, click Start free →/login. - Click Sign up (or use magic-link, depending on which is wired). Provide a fresh email + password.
- Verify the magic-link email arrives in Mailpit (
http://127.0.0.1:1080if running locally) and click the link. - You should land on
/onboarding/org. Pick a slug → submit. /onboarding/repo— skip (it is optional)./onboarding/agent— submit. Token is shown exactly once; copy it./onboarding/client— verify the page shows:
- the MCP URL, - JSON snippet for Claude Desktop, - "Add to Claude Code" copy button.
- Reload
/onboarding/client— token is replaced with a prefix-only placeholder and a callout pointing at Settings → Agents. - Click Finish → land in the workspace at
/o/<slug>.
Expected post-conditions:
- [ ]
users.onboarding_stepisdone(verify by reloading any product route — no redirect). - [ ] Workspace sidebar shows the org, an empty Plans / Tasks / Knowledge list.
7. MCP end-to-end (the verification engine is the hardest path)
Configure a real MCP client (Claude Desktop or mcp-cli) with the URL + token from §6, then exercise the loop:
- Call
add_taskwith{ title: "Smoke test task", description: "from runbook" }. - Reload
/o/<slug>/tasks→ the task appears with statusproposed. - Approve it from the UI → status moves to
ready. - Open a PR on the connected repo that references the task id (e.g. branch name
drobek/T-XXX-smoke). Or simulate via the GitHub webhook test fixture inapps/mcp/src/routes/webhooks-github.integration.test.ts. - Merge the PR with a green CI check.
- Watch the task transition:
claimed→in_progress→done. The verification engine should close it without any manual "mark done" step.
Bonus:
- [ ] Try
claim_taskfrom a second agent on the same task — second call returnstask.already_claimed. - [ ] Let a lease expire (10 minutes) — task returns to the queue.
8. Status page — make it lie, then make it tell the truth
- [ ] On a healthy stack,
/statusshows "All systems operational" with four green rows. - [ ] Stop the MCP container (
docker compose stop mcp) → reload/status→ MCP row is red with a detail likeconnect ECONNREFUSED. Page itself stays 200. - [ ] Stop redis → Redis row red. Restart everything → all green on next reload.
9. GDPR self-service (DSR)
From Settings → Account:
- [ ] Export downloads a JSON containing the signed-in user's row and every org row they own.
- [ ] Delete shows a 7-day grace warning. Cancel → account remains. Confirm → on next sign-in the account is gone, with a clear "account deleted" message.
10. Reporting format
At the end of the run, post a single comment in this shape (no chat thread):
LAUNCH SMOKE — <date>, <commit sha>
Pass: <count>/<total>
FAIL § 2.4 /about — footer still shows "Built in Prague" on mobile (≤ 640px). screenshot: ./reports/2024-xx-xx/about-mobile.png
FAIL § 7.5 mcp e2e — claim_task returns 500 with NULL org_id when called via agent created in §6. server log attached.
NOTE § 5 cookie banner — text wraps badly at 320px width but functional. low priority.
Done.Rules:
- One line per finding.
- Reference the section number (
§ 2.4) so the fix maintainer can locate it. - Attach screenshots / log excerpts as file paths under
./reports/<date>/, not inline. - Do not file issues; the maintainer triages from this report.
What this runbook deliberately does not cover
- Admin portal (
/admin/*). Audit those changes separately when admin work lands. - Production deploy (Hostinger VPS, nginx). The deploy runbook lives in
docs/runbooks/. - Localised marketing pages other than the legal docs — translations are header-only at v1.
- Performance / Lighthouse scoring. Run that in a separate pass once smoke is green.
If you find a route that exists in the codebase but is not in this doc, add it under §2 and re-run that section. The doc is meant to grow with the surface.