๐งช QA Playbook
TrueBalance ร TrueCredits Hackathon ยท June 11โ12, 2026 ยท all teams ยท deploy playbook ยท design playbook
Prime directive โ test the user journey through the live app, not just your API. A
200 OK doesn't mean the screen rendered, the button fired, the result is correct, or the page survives a refresh.Feed it to your Claude session:
Machine-readable original: /playbooks/qa.md ยท two tiers โ quick pass below, full 9-card handbook collapsed at the bottom.
ยงA ยท Quick pass โ the 20-minute version
curl is necessary, not sufficient. Open your real deployed URL (https://<your-slug>.hackathon.afinit.dev) in a fresh browser and walk the demo flow end to end. If you only tested in Postman / curl, you have not tested your app.If the URL shows the "warming up" page, your app isn't on port 8080 yet โ fix that via the deploy playbook first.
The 6 checks (~3 min each โ each is something a judge will do to you)
- Cold-start as a stranger โ open your URL in an incognito window: no cached login, no
localStorage, no warm backend. First screen loads fast, or hangs / blanks / throws? Judges arrive cold; your laptop is warm. The #1 way live demos die. - Walk the golden path twice โ run your headline flow, then do it again without reloading. Stateful bugs (double-submit, "already exists", stale cache, a counter that never resets) surface on run #2 โ exactly when you're demoing live.
- Happy + one ugly input per step โ for every field/button try the happy value and one bad one: empty, huge, emoji, wrong type, the Back button, a double-click. Reject gracefully, never white-screen or 500.
- Every screen has empty / loading / error โ no spinner-of-death, no blank where data failed, no raw stack trace. Show a loading state, an empty state, and a human error message. (Design playbook move #6 โ
--tb-text-subfor placeholders,--tb-errorfor failures.) - Mobile + desktop โ judges open links on a phone. Resize to ~390px wide (or use your phone): layout holds, buttons tappable, nothing off-screen? Your demo path must survive both.
- Refresh & deeplink survival โ hit F5 mid-flow, and paste your "share this" URL into a new tab. Does state survive, or does the user land on a broken / empty screen? Cold-loadable URLs are what judges click.
Got real data wired in? Re-run the golden path against a fresh record, not the one row you've hand-tested all day. The demo always uses a new user.
60-second pre-demo check โ
- Opened in a fresh incognito window โ first screen loads, no blank / hang?
- Golden path runs twice in a row without a reload?
- Every screen shows loading / empty / error instead of a spinner-of-death or a blank?
- One bad input per form is handled (no white-screen, no 500)?
- Works at mobile width and survives a refresh?
Five out of five = demo-proof. Nothing loses a room faster than a blank screen on the judge's first click.
ยงB ยท Full handbook โ the 9-card engineering self-QA (open when a check needs depth)
Engineer-grade version (modeled on the TFS Deployment & Change cards). At the hackathon you are the QA โ the gate is "before a judge clicks it." Use the cards your build touches; a static web demo can skip the adb / prod-ticket bits. Full card detail, AI prompts, and the adb/emulator commands live in the raw /playbooks/qa.md.
Card 1 โ API smoke (happy + 1 error)
Goal: happy + one error path of every touched endpoint return the right status + body shape. Trap: a 200 with data.result: "FAIL" / code: 50001 is NOT a pass โ read the wrapped body.
Card 2 โ E2E on the app (critical โ do not skip)
Goal: drive the user journey through the actual app/browser, screenshotting each affected screen. API-only passes don't count. Web app? Your "device" is a browser โ cold-load your URL in incognito and walk it (the adb/emulator how-tos in the raw md are for the real TB/TC Android build).
Card 3 โ Cross-platform coverage
Goal: for each surface (Android / iOS / Web) that hits the change, decide: test here, inherits, or out of scope. Pass if: every required platform has Card 2 done.
Card 4 โ Impact on other features
Goal: list every feature that depends on the touched code/endpoint/shared resource and spot-check each. Pass if: no new failures in any dependent feature.
Card 5 โ Backward compatibility
Goal: old clients / API consumers / DB rows keep working โ additive API + schema, graceful degrade, tolerant deserializers. Hackathon: mostly N/A for a throwaway; matters only if you extend the real stage backend.
Card 6 โ Regression sanity (5-min golden path)
Goal: the 3-5 most critical journeys still work end to end. Pass: zero new failures, known flakes documented.
Card 7 โ PR review (gate, shared repo)
Goal: โฅ1 human approval + AI review (/ultrareview), no open CRITICAL, CI green โ before it's relied on. Hackathon: skip on a throwaway repo; keep it for a real TechSquad/* PR.
Card 8 โ Production-hot-path readiness
Goal: flag default OFF, rollback documented, on-call paged, dashboard linked, BCM/TCM/SIM attached. Hackathon: not part of the event โ here for when this playbook is reused for real work.
Card 9 โ QA / demo handover note
Goal: one note of what you covered, what you tested on, and what you did NOT cover. At the hackathon this is your demo run-sheet โ the exact happy path you'll click on stage.
Why Card 2 is the hardest non-negotiable: most change-induced incidents pass API testing but fail app testing โ 200 + blank screen from a shape change, a silent backend success behind a UI error, a deeplink to the wrong screen, validation that breaks on a real device. Walking the actual app catches all of these in ~10 minutes.