The learner's "You"-space, personal records, and every platform-wide behaviour · Requires: a learner account (tester-learner-1..5); some cases need staff (tester-staff-1), the denied or lapsed accounts, or a signed-out browser · Related docs: 01 · Practice, 02 · Tests & Workspace, 06 · End-to-End Journeys
0 · How this document is laid out
Sections 1–12 walk the learner's own pages: Home, Skills, Annual Recap, Profile, all eight Settings addresses, Certificates (including the public verification page), the Inbox and the bell, Achievements, XP history, Topic Requests, Quick Notes and WizBit. Sections 13–19 cover what the shell and platform do everywhere: navigation, themes, motion, toasts, live updates, the deliberately absent Credits, sessions and access pages, and offline/performance/responsive/accessibility. Section 20 is the platform-wide matrix — a checklist of honesty rules with the best place to see each one.
Read this before reporting wording bugs
The expected strings in these cases were taken from the product's own wording files. Quote the exact text you see, not a paraphrase — a changed label is a finding only when it breaks a rule in index §8 (internal state names, "Labs", spec sentences, missing IST labels) or contradicts the domain document.
1 · Home — the way back in HOM
Home is the learner's landing page: a greeting by the product's own clock (IST, whatever the device says), the way back into unfinished work, and small true views of the record. It is built of regions — the opening, then Today, Your record, Notes and news and Around your learning. Every widget reads and fails on its own; a part that cannot be read says so in its own place ("This could not be read just now." + Try again) while the rest stay. Home never invents a competing value — it shows what the owning domain says, or says it could not read it.
Address
Page
Who
/
Home — greeting, continue, launch, Today, Your record, Notes and news, Around your learning
learner (+ staff, who see no Focus card or Explore)
Region: opening
Greeting ("Good morning/afternoon/evening, name" by IST), today's date, lead "Pick up where you left off, or start something new.", facts (level, streak, when today's Daily closes), the Continue card, quick-launch tiles (Challenges, Daily Challenges, Debug Detective, Code Lab) and — only while an earned certificate waits for a name — a "Set certificate name" action.
Region: Today
The Daily Challenge card, the activity chart card, and the curated Suggestion; when nothing is suggested, "Tests to take" stands in its place.
Region: Your record
Level card, the seasonal Recap (Year) card, latest achievements; eyebrow "Since <month year>" when membership start is known.
Region: Notes and news
My Notes, Announcements (newest four, read-only), Recent activity (recent solutions).
Region: Around your learning
"Short and current": Tests to take (when not already in Today), Tracks in progress, Recent projects, Topic requests, Your certificate — and, only while generated assistance is on, a Credits card (absent on this deployment).
Learner-only extras
A Focus Mode question card for a learner never asked, and "Explore more of Wizly" at the foot listing what the focus hides. Staff see neither.
TC-HOM-001Greeting, date and lead open the pageP1
Preconditions
Signed in as a learner with a display name on the main site.
Steps
Open /.
Read the header area: greeting, eyebrow date, lead sentence.
Open / again after 17:00 IST (or compare morning vs evening).
Expected
Greeting reads "Good morning" (before 12:00 IST), "Good afternoon" (12:00–16:59) or "Good evening" (from 17:00), followed by the display name — the product's clock (IST), not the device's.
The eyebrow shows the day only, e.g. "Tuesday 6 October" — no year, no ticking clock.
The lead reads "Pick up where you left off, or start something new."
With an account that has no display name, the greeting is just "Good evening" — no blank space or "undefined".
Also try
Change the device clock to a wildly different time zone and reload — the greeting still follows IST.
TC-HOM-002Continue picks the most recently active resumable workP1
Preconditions
A learner with at least two unfinished items (e.g. a started challenge with a saved draft and a part-read lesson).
Steps
Work on item A (type a draft, let it save), then work on item B.
Return to / and read the Continue card.
Finish item B (solve/complete it). Reload Home.
Expected
The Continue card offers the most recently touched resumable item — item B first — with what it is and when it was last worked on ("Last worked on 6 Oct 2026, 14:05 IST").
Following it lands on that item with the saved work intact.
Once B is completed, it leaves the card; the next most recent resumable item (A) takes its place.
Completed and withdrawn work is never offered. An archived item the learner still holds may remain resumable — that is intended, not a bug.
Also try
A fresh account with no resumable work: the card shows an honest empty state, not a broken or fake "continue".
Four ways in, each with its space's shape and a plain line: Challenges ("By topic and difficulty"), Daily Challenges ("One a day, the same for everyone"), Debug Detective ("Find the bug, fix it"), Code Lab ("Write and run code, nothing graded").
Each lands on its page. None 404s, none requires a second sign-in.
Also try
With Focus Mode hiding an area (set it in Settings → Your learning), its tile leaves the launch list rather than dead-ending.
TC-HOM-004Today holds the Daily card, activity and a suggestionP1
Preconditions
A learner who has solved at least one thing recently; today's Daily Challenge published (showcase seed covers today±).
Steps
Read the Today region's three cards.
Follow the Daily Challenge card, then the Suggestion card.
Expected
The Daily card shows today's challenge standing (Not started / Tried / Solved), streak facts, and leads to /daily-challenges or today's daily.
The activity card shows the recent-activity chart — real dated activity, honest about empty days.
The Suggestion card names one curated thing with its kind word ("Course", "Lesson", "Challenge", "Track" or "Debug case") — never a random pick dressed as advice. When there is nothing to suggest, "Tests to take" stands here instead.
Each leads where it says.
Also try
Complete today's Daily, reload — the card's standing changes to Solved rather than still inviting you.
TC-HOM-008Around your learning: tracks, projects, requests, certificate — and no Credits cardP1
Preconditions
A learner with a started track, a saved project, a sent topic request, and (ideally) one issued certificate.
Steps
Read Around your learning (eyebrow "Short and current").
Follow each widget's "see more" link (All tracks / My Projects / Your requests / Certificates).
Look for any Credits widget anywhere on Home.
Expected
Tracks in progress shows real progress "N of M solved"; Recent projects shows projects with "saved <time>"; Topic requests shows your requests with status words (Pending/Approved/Implemented/Rejected/Archived).
Your certificate appears only once one is issued, with its code and "Issued <date>" and "Copy verification link" (or "Hidden from verification" when hidden). No certificate earned → the widget is left out entirely, not shown empty.
No Credits card exists anywhere on Home — generated assistance is off on this deployment (see §18).
Also try
"Copy verification link" puts a full /certificates/verify/<code> address on the clipboard and says so in a toast.
TC-HOM-009A failing region fails alone and says so honestlyP1
Preconditions
Browser dev tools open; signed in as a learner.
Steps
On Home, open dev tools → Network. Block one page-part request (e.g. add /api/v1/analytics/around or the notifications read to the request blocking list) and reload.
Observe the affected region versus the rest.
Press the region's "Try again" after unblocking.
Expected
Only the blocked region shows "This could not be read just now." with a Try again button; the rest of Home draws normally.
No region invents values — no fake streak, no "0" for an unread count, no cached-looking dummy.
After unblocking, Try again fills the region with real data.
Also try
Block the whole page read — Home says the page itself could not be read, rather than rendering half-empty regions.
TC-HOM-010"Set certificate name" appears only while a certificate waits for oneP2
Preconditions
Needs staging: an account that earned a certificate before setting a certificate name (see §6 for how certificates are earned; staff can verify in the certificates admin).
Steps
With no certificate awaiting a name, open Home and inspect the header actions.
On an account whose certificate awaits a name, open Home.
Follow "Set certificate name".
Expected
No button at all when nothing waits — it is not greyed out, it is absent.
When a certificate waits, "Set certificate name" shows as a lit action leading to /profile/settings/certificates (the Certificates section of Settings).
After the name is saved, the action disappears on the next Home read.
Skills (/skills) reads what the learner's work shows, skill by skill, for a chosen period — an estimate, never a score to chase. Periods offered: 7, 30, 90 and 365 days (30 is the default; the choice is kept on this browser). Each skill's reading is a band — Needs practice · Developing · Strong — or an honest non-figure: "Not enough evidence yet", "Studied for N in this period, with no practice or test evidence yet", "Nothing recorded yet." Trends come from dated evidence, not volume: "Improving: up N points", "Declining: down N points", "Stable", or "Not enough recent practice to read a trend". The page also carries: Your numbers, Practice patterns, the assessment-owned summary (Mock month-on-month change; the most recently tested company's readiness and recent form), a "How your stats work" panel, and a per-skill "Why this result?" evidence panel — panels on the page, never routes.
TC-SKL-001Every skill reads as a band or an honest non-figureP1
Preconditions
A learner with mixed history: some skills with test evidence, some with only practice, some untouched.
Steps
Open /skills.
Scan the skill list end to end.
Expected
Each skill shows either a band (Needs practice / Developing / Strong) or a plain reason there is no band — "Not enough evidence yet: N items so far, worth X of the Y points a figure needs", "Studied for … with no practice or test evidence yet", or "Nothing recorded yet."
Nothing reads as 0%, "0 points", "F" or a made-up grade.
An unavailable reading says it could not be read — never renders as the lowest band.
Also try
Compare the "Not enough evidence" counts to what you actually did — items and points should reconcile.
TC-SKL-002The period switch re-reads, and is remembered on this browserP2
Preconditions
Same learner as TC-SKL-001.
Steps
Switch the period 7 → 90 → 365 days.
Watch the figures and the "The last N days" line.
Leave Skills, come back (same browser).
Expected
The heading line says "The last N days · worked out at <time>" — a calculated figure says when it was worked out, in plain words.
Wider periods never show fewer counted items silently; readings change consistently (old evidence falls out of "too old" windows, short-period figures may say "Before this period").
While a new period is read, the previous reading stays shown rather than blanking — and the page never shows period A's numbers labelled as period B.
Reopening Skills lands on the last chosen period (kept on this device, not the account).
Also try
Open Skills in a second browser — it defaults to 30 days there (device preference).
TC-SKL-003"Why this result?" opens an evidence panel, not a routeP1
Preconditions
A skill with a band.
Steps
Press "Why this result?" on a skill.
Read the panel; follow a piece of evidence; close the panel.
Check the address bar throughout.
Expected
A panel opens on the page (the address does not become a new route) listing the evidence behind the reading: source areas in learner words (Challenges, Tracks, Daily Challenges, "Debug Detective, timed", Mock Test, Company Test) and each item's standing — Counts / Replaced by a newer result on the same item / Too old to count now / Before this period / Set aside: its test was invalidated.
Hidden test cases still hide — the evidence names items and standings, never hidden inputs or expected outputs.
The panel is labelled for assistive tech ("Why this result? for <skill>").
Also try
Open the same panel for a "Not enough evidence" skill — the shortfall is explained in items and points.
TC-SKL-004Trends reflect dated evidence, not volumeP2
Preconditions
A skill whose older results were weak and newer results stronger (e.g. fails then passes).
Steps
Read the trend line on that skill.
Compare with a skill having one result only.
Expected
Improving evidence reads "Improving: up N points"; worsening reads "Declining: down N points"; level evidence reads "Stable"; too little dated evidence reads "Not enough recent practice to read a trend".
Doing ten easy solves in one day does not manufacture "Improving" — the trend compares older and newer dated evidence, not counts.
TC-SKL-005Assessment summary: Mock change and company recent formP2
Preconditions
A learner who has finished ≥2 Mock Tests in different months and ≥2 Company Tests in the last 180 days (otherwise stage or mark N/A honestly).
Steps
Read the assessment-owned region on Skills.
Check the recent-form band and its caption.
Expected
The Mock figure shows this month against last — Assessments' own figure, never combined with skill bands into one score.
Company readiness and Recent form show for the company whose test the learner finished most recently in the period; recent form counts tests in the last 180 days with results halving in weight each 60 days, and needs ≥2 tests.
Band labels: <25% At risk (danger), 25–<50% Needs work (warning), 50–<75% On track (info), 75–100% Excellent (success), captioned "N% over M tests in the last 180 days".
Under 2 tests: "Not enough yet: N of 2 tests in the last 180 days". No company test in the period: "No Company Test finished in this period." + a way to Company Tests.
TC-SKL-006"How your stats work" explains the page in learner wordsP3
Preconditions
Any learner.
Steps
Open the "How your stats work" panel on Skills.
Read it as a learner would.
Expected
It explains what the readings are, what counts as evidence and how periods work — in plain words, with no spec sentences, state names or implementation facts.
It is a panel on the page, not a route; closing it returns you to the same scroll position.
TC-SKL-007Your numbers and practice patterns stay honest at zeroP2
Preconditions
A nearly-new account (one solve) and your regular account.
Steps
Read Your numbers and Practice patterns on both accounts for the same period.
Expected
On the fresh account: honest "Nothing first solved in this period." / "No graded submissions in the last N days" style lines — never invented averages.
Practice patterns describe your own submissions (first-try pass rate, hints used, time) — never another learner's data and never a site-wide "acceptance rate" relabelled as yours.
TC-SKL-009Skills for staff and for a focused learnerP3
Preconditions
tester-staff-1; a learner with a focus that hides an area.
Steps
Open /skills as staff.
Open it as the focused learner.
Expected
Staff see a working Skills page (staff carry no learner evidence, so honest non-figures are expected — the page must not error).
For the focused learner the hidden area's skills are left out and the page says the view is narrowed ("… · in your focus"); the total XP elsewhere still counts everything.
Recap (/recap) is the learner's private year-in-review — theirs alone, never a public page. A learner picks an eligible year and reads what they solved, when, and what they earned. Home's Year card links to it.
Address
Page
Who
/recap
Annual Recap — one eligible year at a time
learner (+ staff)
TC-RCP-001Recap opens for an eligible year and tells the truthP1
Preconditions
A learner whose activity spans an eligible year.
Steps
Open /recap.
Choose an eligible year if a chooser is offered.
Read the figures against your own history (XP history, achievements, calendar).
Expected
The recap presents that year's real record — solves, streaks, awards — never a template with invented highlights.
A year with no activity either is not offered, or shows an honest nothing rather than fake milestones.
Every figure reconciles with the domain that owns it (XP, badges, streaks).
Profile (/profile) is the owner's own page: identity as the main site holds it, their stats and activity, a certificate summary that leads to the collection, and recent solutions. It is reached from the account menu — it is not a public profile; nobody else can open yours.
TC-PRF-004No public or other-person profile existsP1
Preconditions
Two learner accounts.
Steps
On account B, try /profile, /profile/anything, and guessed identifiers for account A.
Expected
/profile always resolves to the signed-in person; probing addresses answer not-found — the same plain not-found as any missing page, giving away nothing about whether the thing exists.
No learner-search or public-profile surface appears anywhere in the shell.
Settings is one page reached at eight addresses. Every address renders the same page with h1 "Settings", opened at the section the address names; the section index scrolls to a section and never changes the address. Each setting saves on its own with its own save state — there is no global Save. Sections in order: Appearance ("Mostly on this device"), Your learning (Focus Mode — learners only, no address of its own), Notifications, Dailies, Companion, Certificates ("Follows your account"), Account ("From the main site"), Data and privacy ("This browser and your account"). The header's lead: "What you can change, and where each choice applies. Every change saves on its own."
Account and Data and privacy read their content only once you reach them (scrolled near or opened at their address) — a blank panel above the fold is them waiting, not a bug. Everything else reads with the page.
5.1 The page itself
TC-SET-001All eight addresses open the same Settings pageP1
Preconditions
Signed in as a learner.
Steps
Open each of the eight addresses in turn (table above).
Compare the h1, the section list and the index.
Expected
Every address renders the same page, h1 "Settings", eyebrow "Your account", lead "What you can change, and where each choice applies. Every change saves on its own."
Each addressed address opens scrolled to its section (a deep link lands you at the section, not the top).
No address is a different page with a different h1 — there are no "Notification settings"-titled pages.
Also try
Share a deep link into a fresh tab — it still opens at its section.
TC-SET-003Every setting saves on its own — no global SaveP1
Preconditions
Open /profile/settings.
Steps
Flip one switch; immediately flip another in a different section.
Look for any page-wide Save/Apply button.
Expected
Each control applies itself with its own save state (saving → saved, or an honest failure beside that control) — a second change never cancels or batches the first.
There is no global Save, Apply, or "unsaved changes" banner: the page's word is literal.
Each says what it holds, e.g. System: "Announcements from the team, course changes, topic request updates, certificate notices and progress resets made by staff."
Changes save per-switch with their own state; an off switch means new notices in that category are not created while it is off — existing inbox items are not deleted.
Also try
The empty-category hint in the Inbox mentions the switch: "If you have switched this category off, new notices in it are not created while it is off."
TC-SET-005Course-change notices still arrive with System offP2
Preconditions
A learner enrolled in a course's progress, with System notifications off; a staff account to publish a course change (coordinate; may be N/A if unstagable).
Steps
Switch System off.
Have staff change the course's published content.
Watch the learner's inbox.
Expected
The course-change notice still arrives — that one exclusion survives the System switch, by spec.
Ordinary System notices (broadcasts etc.) stop being created while the switch is off.
TC-SET-007Staff see no daily switches and no Your-learning sectionP2
Preconditions
Signed in as tester-staff-1.
Steps
Open /profile/settings and /profile/settings/dailies.
Compare the section index with a learner's.
Expected
Staff are not shown the Dailies switches or the Your learning (Focus Mode) section — both are learners' alone. The sections are absent from the index and the page, not disabled.
The theme swaps the whole presentation at once: Prism (daylight, dock default, spring feel) vs Halo (night-first, sidebar default, glide feel) — colours, shapes, icon artwork and section colours all change.
Mode flips light/dark at once everywhere, including the header switch — the header's mode control and this setting share one preference.
No reload, no flash of the old theme on next page open.
Also try
Change mode from the header switch instead — Settings shows the same choice.
Sidebar: the rail with collapsible space groups down the side; Dock: the bottom bar; the same six spaces + Bounties appear in both, with the same destinations.
The choice applies at once and persists across pages and sign-out (device preference).
In Dock, a space with more than one page opens a mini popover of its pages; a one-page space (Home) goes straight there.
Walk Home, Skills, a challenge page; watch Halo's sky / WizBit's idle / transitions.
Also set the OS-level reduced-motion preference and reload with the setting off.
Expected
Under reduced motion (setting or OS preference): every decorative animation holds still — no looping sky, no idle motion, no glide; content still works, nothing essential is conveyed by motion alone.
The setting is honest — it is not an "animations off" that also kills functional feedback (a saved tick can still appear).
TC-SET-013Presentation, name and reset: Companion vs Plain, rename/resetP2
Preconditions
Open /profile/settings/companion.
Steps
Switch presentation Companion → Plain and back.
Rename WizBit to a custom name; open the help panel from the corner.
Reset the name.
Expected
Plain swaps the companion's characterful presentation for a plain helper style — the same help, the same answers, only dressed differently (parity, not fewer features).
The chosen name appears wherever the companion speaks or is named ("Ask <name> about …").
TC-SET-014Dress-up is level-gated and honest; orientation replaysP3
Preconditions
Open /profile/settings/companion; a low-level and a higher-level account if possible.
Steps
Open the dress-up choices (skin, decals, chest, lights).
Equip an unlocked look; try a level-locked one.
Replay the first-run orientation.
Expected
Unlocked looks apply at once to the corner companion; locked looks are marked with what they need (a level), never silently dead or secretly equipable.
"Replay orientation" runs the first-run introduction again on demand — the same one Home shows a new learner.
TC-SET-015Certificate name rules are enforced with a live print previewP1
Preconditions
Open /profile/settings/certificates on an account whose name is not yet locked (no certificate made).
Steps
Try names that break each rule: test lowercase is fine; try A alone (too short), digits/symbols (Name123!), a web address (name.com), a name with no letters, and a 101-character name.
Watch the "Printed as" preview and error text.
Save a valid name.
Expected
Rules: letters A–Z with spaces, apostrophes, hyphens and full stops; 2–100 characters; must contain a letter; no web address. The field's hint says exactly that.
Invalid names show their specific error and "Save name" does not send; a valid name shows "Printed as <name>" before saving.
Saving a valid name confirms "Saved." — and if certificates were waiting, "Saved. Your certificate is being prepared." / "Your N certificates are being prepared."
Also try
Extra spaces and mixed case are tidied in the preview — check the printed form, not just the typed one.
TC-SET-016Saving the name with waiting certificates asks, then locks itP1
Preconditions
An account with ≥1 certificate awaiting a name (staff may need to award one — coordinate; otherwise N/A).
Steps
Enter a valid name and press "Save name".
Read the confirm: "Print your certificates with this name?" → confirm "Save and prepare".
Return to the section after certificates generate.
Expected
With waiting certificates the save asks first; the dialog names the printed name and warns the name locks once the first certificate is made.
Confirming releases the waiting certificates into generation.
After a certificate is made, the name shows as locked ("It is locked, because a certificate was made with it.") — editable no more; only a correction staff approve can change it.
TC-SET-017Collection visibility controls who can see the certificates pageP2
Preconditions
Open /profile/settings/certificates.
Steps
Find the collection-visibility setting; change it; save.
Check its effect where it claims one (e.g. what the collection shows).
Expected
The setting saves independently and says in plain words what it changes — visibility of the collection as shown to you/on your pages; it never claims to unpublish a certificate's public verification (hiding a certificate is per-certificate, §6).
TC-SET-018Account shows main-site facts and owns nothing it shouldn'tP1
Preconditions
Open /profile/settings/account (scroll to it — it reads when reached).
Steps
Read every fact shown: identity, email, role, membership, session.
Look for any edit field, password form, or billing control.
Expected
Facts match the main site: display name, email, Labs role in plain words, membership level and end date as the main site supplies it ("Active when last checked, <time>" or an honest "It can't be checked just now.").
No password field, no email edit, no billing form, no role editor — each points to the main site where the owner acts ("From the main site").
Session facts (e.g. the current sign-in) are described, not editable.
Also try
A lapsed-but-signed-in check is out of scope here; for the lapsed account see §19's privacy-only session cases.
TC-SET-019Local-state disclosures are true, and policy links leave for the main siteP2
Preconditions
Open /profile/settings/data-privacy; have device data present (a saved note, Code Lab draft, chosen filters).
Steps
Read what the page says this browser keeps.
Follow each policy link.
Expected
It honestly lists what this browser/device holds (drafts, Code Lab, Tools state, project recovery copies, Scratchpad) and what clears at sign-out — matching Data and Privacy's rules.
Policy links go to the main site's real policy pages — no 404s, no placeholder "#" links.
Erasing account data is presented as the serious action it is, separate from device data.
TC-SET-020Erasure: request, 7-day cancel window, live statusP1
Preconditions
A throwaway learner account if you intend to let it run — otherwise request then CANCEL within the window (safe, leaves no erasure). Requires a fresh main-site check (≤15 min): if your sign-in is old, expect the "Confirm on the main site" trip first.
Steps
Open /profile/settings/data-privacy → the erasure part.
Read what erasure removes (it names the record it deletes — on this deployment "XP and preferences" style wording, since Credits are off).
Type the required confirmation and send the request.
Read the status; cancel within the seven-day window.
Check status again.
Expected
Requesting asks for explicit typed confirmation and a recently-checked main-site verification; a stale check offers "Confirm on the main site" and returns with your input held.
Once sent, status shows the request live, with the seven-day cancellation window made plain.
Cancelling stops it and the status reflects that — the request did not silently proceed.
Throughout, wording is honest: erasure deletes learning records (XP, preferences, etc.) — it never pretends to keep or to delete more than it does.
Also try
Sign in elsewhere after requesting — the pending request and its status follow the account.
Certificates mark completed subjects (a completed video subject may award one automatically when the domain's switch is on). Every certificate travels one pipeline:
State
Word on the page
Meaning
awaiting-name
"Waiting for your name"
Earned, but no certificate name set — "Set the name to print on it, and it will be prepared."
generating
"Being prepared"
"Your certificate is being prepared. This can take a few minutes."
failed
"Not made yet"
Generation failed — "a problem on our side, not anything you did, and the certificate is not lost: staff can make it again."
"This certificate has been revoked and is no longer valid." Verification must say so — old PDFs cannot be recalled.
Address
Page
Who
/profile/certificates
The collection — every certificate, any state
owner
/profile/certificates/:id
A certificate's entry — what it is and anything it still needs
owner
/profile/certificates/:id/detail
Detail — the document, its facts, sharing controls
owner (issued/revoked only; other states redirect to the entry)
/certificates/verify
"Check a certificate" — type a code
anyone, signed in or not
/certificates/verify/:identifier
The check's answer
anyone
Staging help
Earning a certificate means completing a subject for real. If your account has none, complete a short subject (doc 01 covers lessons) or coordinate with staff, who can see certificate administration. Duplicates are not created: completing again returns the existing certificate.
6.1 The collection and its states
TC-CRT-001The collection lists every certificate with its true stateP1
Preconditions
A learner with certificates in ≥2 states (e.g. one issued, one awaiting name).
Steps
Open /profile/certificates.
Read each row's name, state word and what it offers.
Expected
Each certificate shows what it was awarded for and its state word ("Waiting for your name" / "Being prepared" / "Not made yet" / "Issued" / "Revoked") with the matching tone.
An empty collection is an honest empty state, never dummy certificates.
TC-CRT-002Awaiting-name → name saved → generation startsP1
Preconditions
A certificate in "Waiting for your name" state (name not yet locked).
Steps
Open the certificate's entry; it says what it needs.
Set the certificate name (Settings → Certificates) and confirm.
Return to the collection and watch the state.
Expected
The entry explains: "Set the name to print on it, and it will be prepared." — not a dead end.
Saving the name releases the waiting certificate(s): the state moves to "Being prepared", then "Issued" within a few minutes (poll by reloading — do not expect a toast).
Once any certificate is made, the name locks (TC-SET-016).
TC-CRT-003A failed generation is named honestly and loses nothingP2
Preconditions
Hard to stage deliberately — mark N/A unless a generation genuinely fails. Staff can confirm in certificates admin.
Steps
If a certificate shows "Not made yet", open its entry.
Expected
The wording blames the platform, not the learner: "Your certificate could not be made yet. This is a problem on our side, not anything you did, and the certificate is not lost: staff can make it again."
The certificate is not deleted, not marked revoked, not silently retried forever.
TC-CRT-005Hide it → verification answers unknown → show againP1
Preconditions
An issued certificate; a second browser or device signed OUT for the public check.
Steps
In "Sharing it", press "Hide it from the public check"; read the confirm ("Hide this certificate from verification?") and confirm "Hide it".
In the signed-out browser, open the certificate's verify address.
Back on the owner's detail page: confirm "Sharing it" now says hidden; press "Show it again".
Check the public verify address again.
Expected
Hiding asks first and explains: "Anyone who checks its code, or scans the QR code on a copy you shared, is told no certificate can be verified, until you show it again. It stays valid, and you can still download it."
While hidden, the public check answers "No certificate can be verified for this code" — the same words as an unknown code (deliberately indistinguishable).
The certificate remains issued and downloadable — hiding never invalidates.
"Show it again" restores verification without a confirm (hiding is the consequential one).
TC-CRT-007Revoked: named on the page, not valid in public, not downloadableP2
Preconditions
A revoked certificate (staff-side revoke — coordinate in team channel; otherwise N/A).
Steps
Open the revoked certificate's detail.
Try its public verify address signed out.
Expected
Detail shows the danger note "This certificate has been revoked and is no longer valid." and "Sharing it" says "Its check now says it is not valid, and it can no longer be downloaded." — no Download button.
Public verify answers "This certificate is not valid" — "…was issued by Wizly Learning and is no longer valid." Old printed PDFs cannot be recalled, so the check is the source of truth.
TC-CRT-009Propose a correction: one at a time, with a reasonP2
Preconditions
An account whose certificate name is locked (any issued certificate).
Steps
Settings → Certificates → "Propose a correction".
Send a corrected name with a reason.
While it waits: replace it, then cancel it.
Expected
The correction form asks for the corrected name (same print rules) and "Why it needs correcting" — reason required; "Staff approve the name exactly as written, or say why not. No documents are asked for. Issued certificates keep the old name until staff reissue them."
While pending it reads "Waiting for staff: <name>" with your reason, and offers "Cancel it" and "Replace it" — one proposal at a time.
Cancel removes it; replace swaps the proposal, not a second request.
TC-CRT-011The verify page works signed out, standalone, no chromeP1
Preconditions
A signed-out (or private) browser.
Steps
Open https://app.sprinklejelly.com/certificates/verify signed out.
Note the page furniture.
Expected
The page opens with no sign-in demand and no learner shell — a standalone page titled "Check a certificate": "Enter the code printed on a Wizly Learning certificate to see whether it is valid."
No inbox, no navigation into member pages, nothing learner-private.
TC-CRT-012A valid code answers valid with the public fields onlyP1
Preconditions
A real unhidden certificate code (copy it from TC-CRT-006).
Steps
Signed out, open /certificates/verify/<code> (or type it and press Check).
Read the answer panel.
Expected
Title "This certificate is valid" with a Valid status; rows: Certificate (the code, mono), Name (printed name), Awarded for, Issued — then "Checked <date time>." in small text and the assurance line.
Nothing else: no email, no score/percentage, no account name beyond the printed name, no staff reason, no history.
The address itself carries the code — the answer is the same whether typed or addressed.
TC-CRT-013Unknown, hidden and malformed all read alikeP1
Preconditions
A hidden certificate's code (TC-CRT-005) plus invented codes.
Steps
Check: (a) the hidden code, (b) WZ-AAAA-BBBB-CCCC invented, (c) a malformed string, (d) an address with an over-long identifier.
Compare every answer word for word.
Expected
All four answer identically: title "No certificate can be verified for this code" — "Check the code for mistakes. A certificate its owner has hidden cannot be verified either." plus "Checked <date time>."
An identifier too long for the address also gets the unknown answer — never an error page, never a hint that the length itself failed.
Nothing distinguishes "exists but hidden" from "never existed".
7 · Inbox & the bell — in-app notices, honestly counted NTF
Notifications exist in-app only: the bell in the header and the Inbox page. No email, SMS or push — their absence is correct. The bell badge counts unread up to 99 ("99+" beyond); a confirmed zero hides the badge; an unreadable count shows a small hollow mark — an unknown count must never look like zero. The panel previews the newest six, marks nothing read by opening, and offers "Mark whole inbox read" (undoable while its toast shows). The Inbox groups notices under Today / This week / Earlier, twenty at a time with "Load more", per category or All; a row's ⋯ marks read/unread, deletes, or reads a notice in full; Delete and Mark all read act at once and send when their Undo ends; Clear asks first. Notices age out at 90 days; deleting a notice never deletes what it told you about.
Earn an achievement (finish a first Mock), level up, keep a Daily streak to a milestone, or ask staff to send a broadcast. Each event creates one notice, once — duplicates are a bug.
7.1 The bell
TC-NTF-001Badge counts unread, caps at 99+, hides at zeroP1
Preconditions
Accounts with 0, some, and (if stageable) >99 unread notices.
Steps
Read the bell on each account.
Mark all read; watch the badge.
Expected
Badge shows the exact unread count (Indian grouping if ever relevant); above 99 it reads "99+".
At a confirmed zero the badge is gone entirely — not a grey "0".
The button's accessible name carries the truth too: "Notifications. N unread." / "Notifications. Nothing unread." / "Notifications. Unread count unavailable right now."
TC-NTF-008Category filter + "Mark all <category> read" scopes correctlyP2
Preconditions
Unread notices in ≥2 categories.
Steps
Filter the inbox to one category (e.g. Achievements).
"Mark all Achievements read" → let the toast send.
Check other categories and the address bar.
Expected
The toast scopes itself: "Every Achievements notice is marked as read — Only Achievements; the other categories stay as they are." Other categories' unread stand.
The chosen category lives in the address (so a filtered view is shareable/bookmarkable) and is remembered on this browser.
An empty category says "No Achievements notices." plus the switch hint when relevant.
A populated inbox (a relief-grant notice would be staff-staged — N/A if none).
Steps
Inbox → Clear (all, or within a filtered category).
Read the confirm: "Delete every notice?" / "Delete every <category> notice?"
Confirm; read the outcome toast.
Expected
The confirm spells out it deletes every notice including any not on this page — and that no award or result is taken back.
The result toast tells the truth: "Deleted N notices." / "There was nothing to delete."
Notices kept for a live relief grant survive and say why: "Kept until it ages out: it tells you about a relief grant you hold." (On this deployment relief grants belong to Mock Tests — see doc 02.)
TC-NTF-011A notice created while offline lands on the next visitP2
Preconditions
Two conditions you can stage: keep the learner's browser closed/offline while an event happens (e.g. staff broadcasts to all learners — coordinate in team channel).
Steps
Sign out / close the learner's tab.
Have the event fire.
Sign back in and open the inbox.
Expected
The notice is waiting — delivery is not "live only"; anything missed while away arrives on the next visit.
It shows its real time, not "just now" if it is old.
TC-NTF-012Deleting a notice never deletes the thing it announcedP2
Preconditions
A notice announcing something real (achievement unlocked, result corrected).
Steps
Delete the notice.
Open the thing it announced (achievements page, test result).
Expected
The award/result stands untouched — the inbox is a copy of news, not the record. A notice that could not be delivered never reverses the action it described.
A fresh account; dev tools to block the inbox read.
Steps
Open /inbox on the fresh account.
Block the inbox read on yours and open it.
Expected
Empty: "Your inbox is empty." + "When something happens elsewhere — an achievement, a new level, a test result, a course update — the notice arrives here and stays for 90 days."
Blocked: an honest "could not be read" with retry — never the empty state pretending.
Achievements (/achievements) are milestones that unlock by themselves — "there is nothing to claim, they unlock no content, and nobody is ranked against anybody." Views: All · Earned · Not earned yet, plus Closest to unlocking (the three you are nearest to, by how much of each requirement is done — "a view of your progress, not a goal you have set"). The chosen view is remembered on this browser. Families: Mock Tests (5 badges), Daily streak (100/200/365 days), Projects (first), completion badges per written subject, per video subject and per Track (a subject or Track gets its badge into the catalogue once you start it), Typing Quest (13).
Address
Page
/achievements
The badge catalogue with your standings
TC-ACH-001Views filter honestly and the choice is rememberedP1
Preconditions
A learner with ≥1 earned and ≥1 unearned badge.
Steps
Open /achievements; switch All → Earned → Not earned yet.
Leave and return (same browser); try a second browser.
Expected
All shows the whole catalogue; Earned lists the newest earned first with "Earned <date>"; Not earned yet hides the earned.
The last view is restored on return (device preference) — a different browser defaults to All.
Empty earned view: "Nothing earned yet." + how badges unlock — never fake badges.
Every badge earned: "Every badge in the catalogue is already earned."
An earned badge; (for the second half) a staff-invalidated test that had paid a badge — coordinate, else N/A.
Steps
Have staff reset some unrelated progress (or just observe over time).
Check the badge stays.
For invalidation: check the badge's card and XP history after a test is invalidated.
Expected
Badges survive time, progress resets and content updates — the page says so: "Achievements stay earned through time passing, progress resets and content updates."
When the fact behind one is invalidated, the correction stays visible (e.g. "Taken back with an invalidated test. The next Mock Test that meets the requirement pays +300 XP.") — the record never quietly disappears.
TC-ACH-006Starting a subject or Track brings its badge into the catalogueP2
Preconditions
A learner who has not started a particular published subject/track; another who has.
Steps
Compare the completion-badge lists of both accounts.
Expected
The second account's catalogue includes that subject's/track's badge; the first's does not (or does so per spec) — "the total grows as you take on more", so catalogue size differing between learners is correct, not a bug.
TC-ACH-007Company Tests earn no achievements — and the page does not pretend otherwiseP2
Preconditions
A learner about to finish a first Company Test.
Steps
Finish a Company Test.
Check achievements and inbox.
Expected
No badge and no badge progress from the Company Test — on this deployment Company Tests earn "no XP or achievements" (the XP page's own note says it; see §9).
XP history (/xp-history) lists every award, reversal and correction, newest first — "Every award you have earned, with what it was for. XP recognises activity; it is not a skill score and it unlocks nothing." Rates in force: challenge/track first-accept by difficulty — easy 30, medium 60, hard 100, extreme 150 (a challenge and its track twin pay independently; re-solving in any language never repays); Daily bonus 0–200 by difficulty (hard=40); completing a written subject 250; first Mock completed 200, first Mock passed 300; Typing Daily 20 per date; Company Tests pay nothing. Levels: threshold 250×(L−1)², display cap 100 — "Levels are shown up to 100; XP keeps counting."
Address
Page
/xp-history
Standing + the full award ledger
TC-XPC-001The ledger lists awards newest-first with signed valuesP1
Preconditions
A learner with several awards of different kinds.
Steps
Open /xp-history.
Read the top entries: sign, area, what it was for, when.
Expected
Entries are newest first, signed (+30 XP style; reversals negative), each naming the area (Challenges, Tracks, Daily Challenges, Debug Detective, Courses, Mock Tests, Workspace Projects, Typing Quest) and what it was for.
Fresh account: "No entries yet." + "Your first XP comes with your first accepted solve."
TC-XPC-003Total, level and "what pays XP" reconcile and stay honestP1
Preconditions
A learner with awards.
Steps
Read the standing (Total XP, level, progress to next).
Sum the ledger entries and compare.
Read the "What pays XP" part.
Expected
The total equals the sum of the entries — including reversals and corrections.
"Level N begins at <X> XP." matches 250×(N−1)²; above level 100 the page still says "Levels are shown up to 100; XP keeps counting."
"What pays XP" lists the real rates and the honest exclusions: "Lessons, quizzes, video subjects, Track completion, projects, Code Lab runs, hints, notes, typing tests and drills, and time spent pay nothing. Company Tests earn no XP or achievements. Re-solving something you have already solved pays nothing more, in any language." (On this deployment, no mention of Credits.)
The note "These are the rates in force now. An award keeps the rate it was paid at; a later change reaches later awards only."
TC-XPC-006Focus-hid areas are excluded from the list, and say soP3
Preconditions
A learner with a focus that hides an XP-earning area.
Steps
Open /xp-history under that focus.
Expected
A line above the history says which areas' XP is left out and that "Your total and level count everything." — the ledger is filtered, the standing is not.
Topic Requests are how a learner asks the content team for missing material. Creation happens in a contextual dialog on the page it's missing from — a catalogue whose search found nothing offers it (the search may prefill the title, ≤120 chars), as do eligible course/challenge/track/daily/debug/template pages ("Request a topic" / "Request a course" / "Request a template"). Title ≤120 chars, description ≤2000, up to five linked items, a daily send cap. Standings: Pending → Approved/Rejected → Implemented; Archived means the learner retracted. "Requests are suggestions, not promises."
Address / surface
What it is
/requests
Your requests, newest first — 20 at a time + Load more; decided rows show when
request dialog
Opens from eligible pages, carrying that page's context
TC-TRQ-001/requests lists your own requests, newest first, with standingsP1
Preconditions
A learner with ≥1 request; another with none.
Steps
Open /requests on both.
Expected
Lead: "What you've asked the content team for, newest first. Requests are suggestions, not promises."
Each row: your title, where it was asked from, "sent <date>", and its standing word — Pending / Approved / Implemented / Rejected / Archived.
Empty: "Nothing requested yet" — "Where a course, a practice topic or a template is missing, the page it's missing from offers a way to ask for it."
TC-TRQ-002The dialog opens from eligible pages, carrying real contextP1
Preconditions
Open the challenge catalogue; search for something absent (e.g. "quantum flux").
Steps
Search the catalogue for a term with no results → press the request offer.
Read the dialog: title, description, "Sent with your request" context rows.
Cancel; then open the dialog from a course subject page instead.
Expected
The catalogue's empty result offers "Request a topic"; the dialog's title starts from your search (first letter capitalised) until you type your own.
"Sent with your request" lists what goes with it — Asked from, About/Topic/Difficulty, "You searched for …" — or "Nothing else goes with it: only your title and description." when there is none.
From a subject page the button says "Request a course"; on a lesson the heading reads "Ask for more on this lesson".
A footer note: "For a problem with your account or with Wizly Learning itself, use the contact page on the main site instead."
TC-TRQ-003Field limits are counted live and enforcedP1
Preconditions
The request dialog open.
Steps
Type a 121+ char title — watch the counter turn danger.
Paste a >2000-char description.
Try to send empty fields.
Expected
Title shows a live "N / 120" count that warns past the limit; description holds ≤2000. Send refuses invalid fields with per-field errors — nothing is silently truncated.
Hint text: title "What's missing, in a few words."; description "What you'd like to learn or practise, and why it would help."
TC-TRQ-004Sending lands as Pending; a duplicate is refused distinctlyP1
Preconditions
The dialog open.
Steps
Send a real request ("QA-<initials> <date> — <topic>").
Send the same titled request again from the same place.
Send several quickly to find the daily cap (if reachable).
Expected
Success reads "Your request has arrived." — "The content team will see it. Follow where it stands in Topic Requests; arriving is not a promise that it will be made." The row lands on /requests as Pending.
The same open request again answers "You already asked for this here, and that request is still open." — "A differently titled request is welcome." It is not double-filed.
At the daily cap the form says to "Try again shortly." — never a fake success.
Failure keeps your words: "It could not be sent. Your words are still here; try again."
TC-TRQ-007Submitted text is immutable — no edit surface existsP2
Preconditions
A sent request.
Steps
Look for any way to edit the title/description of a sent request (row, dialog, address probing).
Expected
None exists — the sent text stands as sent; the only actions are Retract (pending) and opening linked content. Staff edits happen in the console review, never silently on your row.
Quick Notes is a panel opened from the header button (or Ctrl+Alt+N / ⌥⌘N), never a page. Two modes: Notes — one persistent private note saved to the account — and Scratchpad — temporary text kept in the tab until it closes or you sign out, never saved to the account. Its save states are literal: "Saving…", "Saved just now / N minutes ago", "Not saved, tap to retry", "Saved locally", "Work at risk…", "Read only while maintenance is under way.", "Signed out, so nothing more is saved here." During a live test it is closed entirely: "Quick Notes is closed while your test is running."
Surface
What it is
Header button "Quick Notes"
Opens the one panel (also via Home's My Notes → Notes mode)
No address
There is deliberately no route — the panel travels with you
TC-QN-001The panel opens from the header and travels between pagesP1
Preconditions
Signed in as a learner.
Steps
Press the Quick Notes header button (or Ctrl+Alt+N).
Type in Notes; navigate to another page with the panel open.
Expected
The panel opens over the page — the address never changes, there is no /notes route (an address probed for one is not-found).
Navigating keeps the panel and its text — it is one shell-level panel, not a per-page widget.
It can be minimised/restored and moved (arrow keys on its move control: "Move Quick Notes. Use the arrow keys.").
TC-QN-002Scratchpad is per-tab temporary; Notes persistsP1
Preconditions
Two tabs on the same account/browser.
Steps
Type "scratch-123" in Scratchpad in tab A; open the panel in tab B.
Type "note-456" in Notes in tab A; wait for its save state; check tab B.
Close tab A entirely; reopen the product in a new tab.
Expected
Scratchpad in tab B does not contain "scratch-123" — it is this tab's own, and says so: "Temporary. Kept in this tab until you close it or sign out, and never saved to your account."
Notes' "note-456" appears in tab B once saved — it persists to the account.
After closing the tab, the Scratchpad text is gone for good; the Note remains.
TC-QN-003Save states are literal, including "Saved locally"P1
Preconditions
Panel open in Notes; dev tools for going offline.
Steps
Type and pause: watch "Saving…" → "Saved just now".
Go offline (dev tools → Network → Offline), type more.
Come back online; watch the recovery.
Expected
Saving shows "Saving…" then "Saved just now" (then ages: "Saved N minutes ago", "Saved <date>").
Offline writes read "Saved locally. Trying to save again…" (kept on this device) or "Work at risk: not saved, and not kept on this device. Trying again…" — the two are never blurred; locally-kept text is never described as saved to the account.
Retry is pressable when it stalls ("Saved locally · Not saved, tap to retry").
Back online it lands and says Saved — the panel's word is the truth.
TC-QN-004Live test closes it; maintenance makes it read-only; signed-out statesP2
Preconditions
A live test in progress (see doc 02) or N/A; a maintenance window if scheduled; a second browser to end the session.
Steps
During a live test, look for the Quick Notes button/panel.
During a maintenance window, check the panel's state.
End the session from another browser; return to this tab's panel.
Expected
During a live test: "Quick Notes is closed while your test is running." — nothing of either mode is readable or writable.
Maintenance: "Read only while maintenance is under way." — your text shows but cannot be changed; "Your latest words are saved locally and are saved once it ends."
After the session ends: "Signed out, so nothing more is saved here." (or "Someone else signed in on this browser, so nothing more is saved here.") — and locally-kept words "come back when you sign in again."
TC-QN-005Privacy: only the owner can ever read a noteP1
Preconditions
Learner A with a saved note; staff account B.
Steps
As staff B, hunt the console for any way to read A's note.
Read the panel's own words about privacy.
Expected
The panel declares "Only you can see these" / "Only you can see your notes." — and it is true: no staff surface can read learner notes (both staff roles are barred by spec).
Home's My Notes card also only ever shows the owner's own note.
TC-QN-006Character limits and conflicts are said in wordsP2
Preconditions
Panel open; a second tab/device for conflicts.
Steps
Paste a text far past the note's character limit.
In tab B edit the note while tab A holds an older copy, then type in A.
Expected
Overflow says so: "That didn't fit: notes hold up to N characters." / "N characters were left out: notes hold up to M." — near the limit it warns "Approaching the limit".
A cross-device conflict reads "A newer version was saved in another tab or device. Your next edit here will replace it." — one tab's save never silently erases another's.
An unkeepable character: "Not saved: your notes hold a character they cannot keep."
TC-QN-008Sign-out clears the Scratchpad but keeps what the spec keepsP2
Preconditions
A tab with Scratchpad text and a saved Note; a way to end the session (main-site sign-out or second browser).
Steps
End the session; reopen the product signed in again on this browser.
Open the panel.
Expected
The Scratchpad is gone (sign-out clears it, by spec); the saved Note returns from the account; locally-kept unconfirmed note text may return per "Your words are saved locally and come back when you sign in again."
WizBit is the product's companion: a small character in the bottom-right corner (64 px on a computer, 48 px on a phone, 44 px on quiet pages — solving pages, Code Lab, Workspace, paper practice) which opens the help panel when asked. It never opens on its own, never covers content, is suppressed during live tests, in the staff console and on sign-in pages, sleeps after a long idle, and creates no inbox items. Its help panel offers a "Guide to this page" (ordered steps that reset when you navigate), suggested chips, and a product-question field answered from an authored knowledge base — which works fully with generated assistance off (as on this deployment). Settings → Companion controls its presence (Present/Quiet), presentation (Companion/Plain), name and dress-up.
Surface
What it is
corner (bottom-right)
The character; opens the help panel; never self-opens
help panel
Guide to this page, suggested chips, question field; bottom-sheet on phone
TC-WZB-002Suppressed where it must be: live test, staff console, sign-inP1
Preconditions
A live test (doc 02), tester-staff-1, a signed-out view of /handoff and /certificates/verify.
Steps
Look for the corner in the test room; in the staff console; on standalone pages.
Expected
Absent from the test room (a live test suppresses it entirely), the staff console, /handoff, /restricted, /unavailable, /not-found and /certificates/verify.
TC-WZB-004Suggested chips and the question field answer from authored knowledgeP1
Preconditions
The help panel open on a content page.
Steps
Press a suggested chip; read the answer.
Type a product question ("how do mock tests work?", "what is a streak?").
Ask something the KB cannot know.
Expected
Suggested chips match the page (not on hidden-area pages); each answers with the authored entry.
Typed questions are answered from the authored knowledge base — clear, product-true answers with generated assistance off: authored guidance works, nothing claims to "think".
Unanswerable questions get an honest "I don't know"/point to the right place — never a hallucinated feature.
An answer about a coming-soon feature is marked "Coming soon" rather than described as live.
Open the panel and any place the companion is named.
Expected
The custom name appears wherever the companion is named ("Ask <name> about …"); resetting returns "WizBit" everywhere — no stale name left in any surface.
13 · Shell & navigation — the way the product is walked PLT
The learner shell gives every page its frame: the wordmark (leads Home), header tools (Quick Notes, bell, light/dark switch on computer, level/XP pill, account menu), and navigation in one of two presentations — Sidebar (collapsible space groups, a draggable Pinned group) or Dock (bottom bar; a space with more than one page opens a mini popover). The learner's spaces, in order: Home · Learn · Practice · Assessments · Build · You, plus the standalone Bounties page in no space. Staff also see a Console link and a staff console↔learner view switch. Pages beneath the shell mark their own active link; a nested address lights the longest-matching nav link.
Assessments dashboard, Mock Tests, Company Tests, Test results
Build
Code Lab, My Projects, Course Workspaces, Tools
You
Skills, Achievements, Certificates, XP history, Annual Recap, Topic Requests, Inbox (+ Credits, only while generated assistance is on)
—
Bounties (own standalone entry, no space)
TC-PLT-001Every space and link in You is present and leads somewhere realP1
Preconditions
Signed in as a learner, Sidebar presentation.
Steps
Open the You group; follow every link: Skills, Achievements, Certificates, XP history, Annual Recap, Topic Requests, Inbox.
Look specifically for a Credits link.
Expected
All seven links open their page; the active link lights correctly on each, including nested addresses (a certificate's detail still lights Certificates).
No Credits link exists — it is offered only while generated assistance is on (§18).
Bounties sits outside the spaces as its own entry.
Open the account menu; on phone, check the mode switch moves into it.
Expected
On computer: Quick Notes button, notifications bell, light/dark switch, the level/XP pill (real level, real XP — never "Lv 0" unless truly 0), and the account menu.
Account menu: heading = display name + "User · Member since <month year>" (or just role when unknown); links Profile, Settings; on phone also "Switch to dark/light mode"; "Back to Wizly Learning" leading to the main site's front page. No Sign out — the main site owns that.
On phone the header drops the mode switch into the account menu rather than crowding.
TC-PLT-006Wordmark leads Home; space chips name where a page livesP3
Preconditions
Any learner page.
Steps
Press the wordmark.
On a nested page, read the space chip/header context.
Expected
The wordmark always leads Home.
Pages name their space ("You · Skills" style context) and offer the space's sibling pages as chips where spec'd — orientation never requires the browser's Back button.
TC-PLT-007Learners opening /admin get the same nothing as any unknown addressP1
Preconditions
A learner account.
Steps
Open /admin, /admin/people, /admin/anything as a learner.
Expected
The same plain not-found page as any unknown address — no staff menu, no "you are not allowed" that confirms the pages exist, no redirect that leaks structure.
TC-PLT-008Deep links, Back/Forward and refresh keep their honestyP2
Preconditions
Any learner.
Steps
Deep-link into /profile/settings/dailies in a fresh tab.
Navigate around, then Back through several pages.
Refresh mid-page.
Expected
Deep links land on their page/section with real data — no signed-out flicker, no redirect to Home.
Back/Forward restore the pages actually visited with their scroll place; refresh rebuilds the page fresh and honestly (loading states, then real data).
TC-PLT-009The header veil and sticky chrome behave on scrollP3
Preconditions
A long page (Skills or Inbox), both themes.
Steps
Scroll slowly past the top; keep scrolling.
Watch the header for jank, jump or content clipping.
Expected
The header stays put; its veil (shadow or glass, as the theme draws it) fades in once content scrolls under it — only the veil's opacity moves; no layout shift.
Under lite mode (§15) the veil snaps without a fade and no blur is applied.
14 · Bounties & Aptitude — the two small pages PLT
Two pages exist deliberately at the edges of finished. Bounties (/bounties) is a text-only page explaining the programme — no eligibility check, entry point or progress UI exists yet. Aptitude (/aptitude) is the product's only unbuilt page — the model case for coming-soon: it renders "This page is coming soon." inside the shell with same-domain links, never a blank page or error.
TC-PLT-011Bounties reads as an honest programme page with working linksP3
Preconditions
Signed in as a learner.
Steps
Open /bounties; read it end to end; follow every link.
Hunt for any interaction — form, button, progress bar.
Expected
A text page inside the shell explaining the programme plainly — who it is for and what it means, in learner words.
Every link goes somewhere real in the product (same-domain).
No eligibility checker, no "enrol", no progress UI, no promise of a feature that is not there — its honesty is the test.
TC-PLT-012Aptitude is coming-soon done right — the model caseP2
Preconditions
Signed in as a learner.
Steps
Open /aptitude from the Practice navigation.
Check it at phone width and for staff.
Expected
The page renders "This page is coming soon." inside the shell — navigation, header and theme all present; it is a page that is not built yet, not a missing one.
It offers same-domain ways onward (back to real pages) — never a dead end, an error, a blank page or a fake interface.
Staff's /admin/aptitude behaves the same way inside the console.
Two themes draw the whole product: Prism (daylight; dock default; spring motion; section colours) and Halo (night-first; sidebar default; glide motion; accent). Each has light and dark mode via the header switch — one shared preference with Settings. Appearance is a device preference: it survives sign-out and is not account data. Motion is kept, never removed: it stills only under reduced motion (setting or OS), during a live test, while the learner types or runs code, and while a modal is open. Lite mode — device-driven, and forcible for testing via dev tools (document.documentElement.setAttribute("data-lite","")) — removes blur, looping decoration and layout glides.
TC-PLT-014Prism × light/dark draws every surface of this doc's pagesP1
Preconditions
Theme Prism.
Steps
Walk Home, Skills, Settings, Inbox, Achievements, XP history, Requests, a certificate detail in light mode.
Flip to dark mode (header switch); repeat.
Expected
Every surface renders in-theme: backgrounds, cards, chips, statuses, editor panes — no stray white/black boxes, no unreadable text, no unthemed scrollbars or dialogs.
Section colours mark the spaces as Prism defines them.
Toasts are brief on-screen messages, top-right under the header. Rules (Interface): info/success/earned pass in ~5 s; warning and danger persist until dismissed; a toast may carry one action (Undo waits ~6 s, and the change is sent only when the toast ends — dismissed, timed out, or the page hidden/left); at most three show at once and the rest queue, never dropped; an identical passing toast does not double; a toast never takes focus (F8 reaches them); while a live test runs, every toast is held and shown once it ends. A toast is a passing word — the page itself shows the outcome.
TC-PLT-021Passing toasts leave in ~5s and pause under pointer or focusP2
Preconditions
Any toast-raising action (e.g. "Copy the verification link", mark a notice read).
Steps
Raise one; time it.
Raise another; hover it; move focus into it.
Expected
Top-right, slides in, leaves on its own in ~5 s.
Hovering or focusing it pauses the countdown — it never vanishes while you are reading or reaching for its button.
TC-PLT-023An Undo waits ~6s and sends its change only when the toast endsP1
Preconditions
An undoable action (delete a notice, mark all read).
Steps
Delete a notice; on another tab/device (or after reload) verify the delete has not yet been sent while the toast shows.
Let the toast expire; verify the delete lands.
Repeat: press Undo — it is never sent.
Expected
~6 s for an Undo toast; the destructive change is committed only when the toast ends without Undo (timeout, dismissal, or the page being hidden/left mid-wait).
Undo is a real undo — the item returns, the control re-enables, focus returns to where it was.
TC-PLT-025The page owns the outcome — a toast is never the only recordP1
Preconditions
Any outcome that toasts (save, delete, award).
Steps
Raise the outcome; let the toast pass; re-check where the outcome lives on the page.
Expected
The page itself reflects the outcome durably (the row is gone, the switch is on, the badge earned) — the toast was a word about it, not the record. Missing the toast never means missing the fact.
Live updates ride one server-sent stream per browser — shared across tabs via Web Locks/BroadcastChannel, so ten tabs cost one stream. A hidden tab releases its hold (~60 s); a dropped stream reconnects within ~60 s; stream states are opening · live · paused · reload · over, and there is no silent fallback — a stream that cannot run says so rather than pretending to poll. Polling pages stop polling while hidden or signed out and back off to ≤5 min. Api reads time out at ~30 s, writes at ~60 s — a timeout surfaces as an honest failure, never a hang.
TC-PLT-026One stream per browser, whichever tabs are openP2
Preconditions
Dev tools → Network filtered on the live-channel request.
Steps
Open the product in one tab; find the stream request.
Open two more tabs on live-updated pages; count the stream connections.
Close the tab that owns the stream; watch another take over.
Expected
One connection per browser — tabs share it (Web Locks/BroadcastChannel), not one each.
When the owning tab closes or hides long enough, another tab claims the stream; notices keep arriving in all tabs.
18 · Credits — expected ABSENT on this deployment PLT
GENERATED_ASSISTANCE=false on this deployment. That makes the whole Credits surface absent by design: no header balance, no /credits link in You, /credits and /credits/history answering as unknown addresses, no paid "Analyse my code"/"Explain" actions, no generated help in Workspace, no Credit lines in Data-and-privacy wording. Verifying the absence is the test.
What would exist when it is on (do not test for presence)
A header/balance affordance and a /credits page: "Credits pay for generated assistance and nothing else…"; a monthly cycle with a base grant, a one-time continuation grant, a "Clears on <date>" line ("Nothing rolls over"), a hold-then-capture charge flow shown before confirming a request, a /credits/history ledger, warning toasts at high use, and the "Held for a request in progress" figure. None of this may appear while the switch is off.
TC-PLT-030/credits and /credits/history answer as not-foundP1
Preconditions
Signed in as a learner.
Steps
Open /credits and /credits/history.
Expected
The same plain not-found as any unknown address — not a Credits page, not a permission error, not a redirect that reveals the pages exist-but-are-off.
TC-PLT-031No Credit surface anywhere: header, You nav, Home, SettingsP1
Preconditions
Signed in as a learner.
Steps
Inspect the header end for a balance/credits pill.
Open the You nav group, Home's regions, Settings' sections, the Data-and-privacy wording, the XP page's "what pays" note.
Expected
No credit balance or Credits link anywhere: not in the header, not in You, not as a Home card, not as a Settings section.
Wording agrees: XP's note reads "Company Tests earn no XP or achievements" (not "…Credits or achievements"); erasure names "XP and preferences" (not "XP, Credits and preferences").
TC-PLT-032No paid-assistance entry points exist in any featureP1
Preconditions
Walk the likely places.
Steps
On a challenge page, lesson, Workspace, Code Lab and test review: hunt for "Analyse my code", "Explain", "Ask AI", priced buttons, or Credit confirmations.
Expected
None — generated assistance has no entry point anywhere; nothing offers a feature and then asks for Credits.
TC-PLT-033Staff surfaces likewise hide the switch's world correctlyP2
Preconditions
tester-staff-1.
Steps
Open the console's Economy area and Settings-like pages; look for Credit configuration surfaces that make sense while off.
Expected
Where the console still shows Economy administration, it presents the off state truthfully (configuration exists, no learner balances) — it never pretends the feature is live for learners.
WordPress owns identity, sign-in and sign-out — the product has no forms of its own. A web session lives 12 h from the last handoff with a 2 h inactivity allowance; one web session per person, newest wins — a newer sign-in ends the older, which is told why on its next request. The standalone access pages: /handoff (signing-in trip), /restricted (confirmed refusals only), /unavailable (platform down), /not-found (missing, hidden, or not yours — all alike).
Signed-out notice reads
Recorded ending
"You are signed out."
own sign-out / main-site sign-out
"Your account was opened on another browser or device, so it is signed out here."
a newer web sign-in
"Your password was changed, so you are signed out here."
password change
"Your account was deleted, so you are signed out."
account deleted
"Your sign-in reached the end of its time, so you are signed out."
past its 12 h life
"You were away for a while, so you are signed out."
idle past 2 h
"Your access changed, so you are signed out."
restriction / standing / reversal / erasure begun
"You were signed out to keep your account safe."
cookie-key change / operator command
"Someone else signed in on this browser after this page opened." (+ "Reload the page")
page held by a different account
Each notice keeps its second sentence: "What is on this page stays until you leave it, but nothing more is saved until you sign in again." + "Sign in here" (or "Reload the page" for the someone-else variant). Nothing ever signs itself back in.
TC-SES-001Signed-out → /handoff → main site → back to the page wantedP1
Preconditions
A signed-out browser.
Steps
Open https://app.sprinklejelly.com/skills signed out.
Let the handoff run; sign in on the main site.
Expected
You land on /handoff ("Signing you in") which goes to the main site once per tab, and returns you to /skills — not always Home.
The handoff never redirects to an arbitrary external address.
TC-SES-002A failed handoff explains itself and offers Try again — never a loopP2
Preconditions
Stage a failed handoff (abandon the main-site step, or block it).
Steps
Come back from the main site without a session (or let the handoff stall/fail).
Expected
/handoff says the sign-in could not be finished — explicitly not a membership problem — and offers "Try again" for the same page rather than bouncing you round again.
TC-SES-003🖥🖥 Newest sign-in ends the older, which is told whyP1
Preconditions
Two browsers (or normal + private window) — same account.
Steps
Sign in on browser A; open a page.
Sign in with the same account on browser B.
On A, make any request (navigate or act).
Expected
A's next request finds it signed out: the notice reads "Your account was opened on another browser or device, so it is signed out here." + "What is on this page stays until you leave it, but nothing more is saved until you sign in again." + "Sign in here".
The page and whatever was typed stay visible — nothing is wiped before your eyes — but nothing more saves.
A never signs itself back in (that would end B's newer session). Signing A back in ends B — newest always wins.
TC-SES-004🖥🖥 Someone-else variant offers Reload, not sign-inP2
Preconditions
One browser: page open as account A; sign out at the main site; sign in as account B in the same browser.
Steps
Return to A's still-open page; make a request.
Expected
The notice reads "Someone else signed in on this browser after this page opened." with "What is on this page stays until you leave it, but nothing more is saved from it." and a "Reload the page" button — B's session is not offered to "continue as A".
TC-SES-006Device data clears at sign-out — appearance and the note's kept text exceptedP2
Preconditions
Device state present: Code Lab draft, a Scratchpad text, changed filters, dark mode.
Steps
Sign out at the main site; sign back in on this browser.
Check Code Lab, Scratchpad, filters, theme.
Expected
Per-person device data under the labs. keys is cleared — drafts, Code Lab, Tools state, project recovery copies, Scratchpad are gone (the product clears them the moment it learns the sign-in ended).
Appearance (theme/mode/nav) survives — it is the device's, not the person's.
TC-SES-007denied (no membership) is refused by the gate on /restrictedP1
Preconditions
The denied account: WordPress account, no membership.
Steps
Sign in on the main site as denied; arrive at the app.
Expected
The gate refuses: /restricted explains access is required and points to the main site — it does not drop them into the product, does not call it an error, and does not fabricate a reason it cannot confirm.
Every member address gives the same refusal — nothing partially opens.
TC-SES-008lapsed gets the privacy-only sign-in — erasure controls and nothing elseP1
Preconditions
The lapsed account: membership ended, and Labs let them in before.
Steps
Sign in as lapsed.
Read the page; try to open /, /skills, /inbox.
Use the erasure controls (request → cancel within 7 days → read status).
Expected
The page says the membership is past its end and offers "Erasing your learning records" — request erasure, cancel within the seven-day window, and read its status — nothing else: no learning content, no member pages.
Every other page and route answers as for someone not signed in.
The sign-in ends when the main site's answer changes — a renewed member comes back through an ordinary sign-in.
TC-SES-009/restricted tells only confirmed refusals — it never guessesP2
Preconditions
Open /restricted (a) signed in and admitted, (b) with a crafted ?reason=banned address while admitted.
Steps
Open the address in both states; also /restricted?reason=erased&until=never.
Expected
An admitted person goes to Home — the address never displays a refusal it has not confirmed, whatever reason/until the address claims.
Real refusals are the gate's own: past-its-end (offers Renew on the main site + Try again), suspended (end shown when known + Try again), banned (getting in touch, no Try again), erasing/erased, no-access — each factual, none guessed.
TC-SES-010/unavailable and /not-found are honest and privacy-safeP1
Preconditions
Probe both; a hidden/another-person's object for not-found.
Steps
Open /unavailable; (if the platform genuinely degrades, observe the real one too).
Open /not-found, a gibberish address, a hidden certificate's detail as another learner, a deleted object's address.
Expected
/unavailable says Wizly Learning is unavailable with an honest retry — never a fake "everything is fine".
Missing page, hidden object, another person's private object and unmatched /admin/* all answer the same plain not-found — no hint which case it is, no stack trace, no nav leak.
TC-SES-01112 h life / 2 h idle: the ending reasons read right when reachedP3
Preconditions
Hard to stage live — review item; stage by leaving a session idle >2 h if the test window allows, else N/A.
Steps
Leave a session idle past its allowance; return and act.
Expected
The notice matches the reason: idle → "You were away for a while, so you are signed out."; past its life → "Your sign-in reached the end of its time, so you are signed out." — each honest, never a random kick.
TC-PLT-034Going offline tells the truth on every surface of this docP1
Preconditions
Dev tools → Network → Offline.
Steps
Go offline on Home, Inbox, Skills, Settings, a certificate detail.
Try actions; come back online.
Expected
Each surface says the connection is down or the read could not run — never "0", never an empty list presented as the truth, never a fake save.
Writes degrade per their own rule (Quick Notes "saved locally…trying again", settings showing their failure) — and recover honestly when the connection returns.
TC-PLT-036Responsive sweep across 390 / 768 / 1280 / 1440 px, both themesP2
Preconditions
Device toolbar.
Steps
At each width: Home, Skills, Settings (index behaviour), Inbox, a certificate detail, Topic Requests, the help panel.
Repeat the worst page in the other theme.
Expected
No horizontal scroll; panels/sheets reflow (WizBit's help becomes a bottom sheet on phone); the Settings index adapts (beside sections on wide, along the top on narrow); nothing overlaps the dock, header or WizBit corner.
TC-PLT-038The product speaks as "Wizly Learning" — vocabulary sweepP1
Preconditions
Any page.
Steps
Scan user-facing text across this doc's pages for banned words: "Labs", "attempt", "expired", "surface", "frame", "sample" (for a visible test case), internal state names, spec sentences.
Check numbers and times.
Expected
People text says "Wizly Learning" (title, verify page, toasts) — "Labs" never appears in interface text; the right-hand vocabulary words are absent.
Numbers group the Indian way (12,34,567); dates/times carry IST where a clock matters; a calculated figure may say when it was worked out in plain words ("worked out at 14:05"), never raw internal metadata.
21 · Platform-wide matrix — where to check each honesty rule
The universal rules from index §8, mapped to the cheapest place in this document's scope to see each one kept (or broken). Any of these failing is a finding wherever it happens — this table is a spot-check map, not the whole law.
Rule
Best places to check it here
Watch for
Unavailable is not empty
Home regions (TC-HOM-009), Skills read (TC-SKL-008), Inbox (TC-NTF-013), verify failures (TC-CRT-015)
"could not be read/asked" + retry — never an empty list or zero
Unknown is not zero
Bell badge hollow mark (TC-NTF-002), unreadable achievement progress (TC-ACH-003), unreadable XP (TC-XPC-007)
hollow mark / "could not be read" — never a fabricated 0
Nothing claims it saved when it didn't
Settings independent saves (TC-SET-003), Quick Notes states (TC-QN-003/004), certificate name save (TC-SET-015/016)
"saved" only after confirm; "saved locally" only on device