Requires: Admin (tester-staff-1, tester-admin-1) + Super Admin (sprinklejelly, yashmini) — most writes are Super Admin + main-site-check; destructive actions are flagged · Related: doc 04 for studios & content lifecycle, doc 06 for cross-role journeys · app under test: https://app.sprinklejelly.com
How this doc is organised
Each section covers one staff-console area: a route table, what the screens must do, then test cases. Cases a Super Admin alone can perform carry a Super Admin chip in the title; everything else works signed in as Admin (and should be re-checked as Super Admin where marked). Destructive or irreversible cases carry a Destructive — coordinate first warning: the owner accounts and the learner accounts (tester-learner-1..5) are shared, so agree targets in the team channel before running them.
The gate that guards every write
Every protected write in this doc (moderation, resets, reversals, erasure, holds, certificate actions, economy writes, broadcasts, WizBit settings, maintenance, publishing) is confirmed through the main-site check ≤15 minutes old. When it has lapsed, the confirming button reads "Confirm on the main site" — click through, verify on the main site, and you return to the same address with everything you typed (reasons, notes, ids) held in the tab. A typed name is typed again. That round-trip is expected; treat it as a feature to verify, not friction.
GENERATED_ASSISTANCE is off
Generated assistance is switched off on this deployment. Credit surfaces in Economy admin may legitimately read zero, empty or "off" — the test is honesty (nothing fabricated, nothing claiming activity), not the presence of Credit activity. XP corrections and settings still work and are fully testable.
1 · Operations hub & the staff console
/admin is the console's landing page for both staff roles. It lists up to ten needs-attention rows in priority order, the kept health signals, the owner-alert conditions, background work by area, and failed work waiting for recovery. Each reading says when it was taken; a part that cannot be read says so on its own and never counts as clear. The page reads again about once a minute while open, backing off after a failed read; the console header's health light shares the readings.
TC-OPS-002Needs-attention rows carry what, detail, count and a way to their pageP1
Preconditions
Operations hub open as Super Admin.
Steps
Read each row of Needs attention.
Follow several rows' Open arrows (erasure, submissions, topic requests, Daily Challenges).
Expected
Each row shows an icon, a linked name (its page), a Detail line (e.g. "2 past due · 1 stopped by a failure", "Waiting for approval"), a Since time where one applies, and a count with its unit ("1 erasure", "3 submissions").
Links land on the owning page — erasure → /admin/lifecycle?stage=attention already narrowed, Daily Challenges → /admin/daily-challenges/schedule-health, grading waiting scrolls to #background-work.
Priority order is as listed above — operational attention only: no learner-performance, low-balance or content-inventory rows.
Also try
Where nothing waits for a row, it folds into the single "Also clear: …" line naming each clear area as a link.
TC-OPS-003A row that cannot be read says "Couldn't be read" — never counted as clearP2
Preconditions
Hub open; needs one attention part to fail its read (hard to stage — mark N/A if it never happens, or catch it during a partial outage).
Steps
Observe the hub while a backend read is failing (or during deployment hiccup), then restore.
Expected
The affected row keeps its place and shows "Couldn't be read" as its count badge and "Couldn't be read. Read again." as detail — it never folds into "Also clear".
Other rows keep their real counts; the page keeps working.
TC-OPS-004Admin vs Super Admin on the hub — main-site changes and the publishing factP2
Preconditions
Both staff accounts available; compare the hub in two sessions.
Steps
Open /admin as Super Admin; note the Main-site changes row and the header.
Open it as Admin; compare.
Expected
Super Admin: the Main-site changes row links to /admin/identity-delivery and details "N could not be verified · M waiting longer than they should"; the header shows "Admins publish: On|Off" linking to /admin/settings/publishing.
Admin: the same row shows the count but is not a link, and its detail reads "A Super Admin follows these up"; no publishing fact in the header.
TC-OPS-007Background work by area — waits, runs, outcomes and timing figuresP2
Preconditions
Hub open.
Steps
Open the "By area, over the last 24 hours" disclosure under Background work.
Read a few areas' rows.
Expected
The disclosure is folded away when nothing is overdue or waiting for recovery — and opens itself when anything is.
Areas are named in staff words (Sign-ins, Mock and Company Tests, XP and Credits, Account erasure, Notifications, Worker upkeep…), never raw job kinds.
Columns: Waiting (with a "N overdue" danger chip when any), Running, Succeeded, Failed, For recovery, Queue wait (middle · slowest twentieth), Running time (middle · slowest twentieth).
Unmeasured timing reads "Not measured", never 0; waiting/running are current readings, the rest are the last 24 hours — the explainer line says so.
TC-OPS-008Waiting for recovery — failed work in staff words, linked to its owner's pageP2
Preconditions
Hub open; ideally a real failed job exists (a paused reward notice or parked certificate works). If none exists, mark N/A — do not manufacture failures.
Steps
Open the Waiting for recovery disclosure.
Read each row; follow the link on one that has one.
Expected
"No failed work waits for recovery." is the healthy empty state.
Each row names the work in words ("A reward notice", "Making a certificate's document", "One part of an erasure", "Checking a main-site change"), the producing area, failed/queued times, tries and the last failure class in words.
Rows with an owning page link there: main-site change → /admin/identity-delivery, certificate document → /admin/certificates/parked-generations, reward notice → /admin/economy/failed-rewards, erasure part → /admin/lifecycle?stage=attention.
No generic resume button — the note says each is recovered on its owner's own page, never by editing the work.
As Admin, a Super-Admin-owned kind shows "A Super Admin follows it up" with no link.
TC-OPS-009Owner alerts — delivery honesty, condition order, the kept noticesP2
Preconditions
Hub open.
Steps
Read the Owner alerts region: the delivery line, the condition list, and any "would have been sent" disclosure.
Expected
"Delivery to the owner is not set up yet, so no alert is sent." — no claim that alerts reach anyone.
Conditions ordered: Standing → Clear → "Cannot be checked yet". Standing ones say "standing since …"; checked ones "checked …".
Five conditions legitimately read "Cannot be checked yet", each saying why (platform reachability needs an outside check; backup/restore; disk space; video processing; WizBit silence).
When notices were kept, a disclosure lists the newest 20: the condition in owner words, what was found, when, and Began · Still standing · Recovered.
TC-OPS-014Phone layout — bottom dock, folded breadcrumb, side panels over listsP3
Preconditions
A phone-width viewport (~390 px) as staff.
Steps
Open the console on a narrow window.
Navigate into People and open a person's panel; open an audit entry.
Expected
Bottom dock: Operations · Content · People · More; More opens the other four spaces. No drawer.
The breadcrumb folds to one link to the nearest page above; a page with its own way back never shows two ways back.
Side panels (person, audit entry, broadcast, erasure) slide over the list's right side on narrow windows and sit between the header and dock, which stay usable.
/admin/people lists everyone who has signed in — most recently checked with the main site first, 25 to a page — searchable by name and narrowed by role, membership, standing and saved view, every filter kept in the address. A person opens beside the list at their own address: an audited read-only support view of identity/access facts, headline progress, standing, certificates and administrative actions — never their private code, notes, project files, terminal content or answers.
Route
Screen
Role
/admin/people
People — directory, saved views, filters, search
Both staff roles
/admin/people/:identity
Person — the audited support panel
Both staff roles (actions: Super Admin)
The saved views are All people · Suspended or banned · Main-site check failing; role filter offers User, Admin, Super Admin only. Opening a person is recorded in the audit history before anything is shown — if that record cannot be written, nothing about the person appears.
2.1 The directory
TC-PPL-001Directory lists everyone signed in, most-recently-checked first, 25 a pageP1
Preconditions
Signed in as staff.
Steps
Open /admin/people.
Read the rows and the match count; use Load more if offered.
Expected
Columns: Name, Role, Standing, Membership ("Since …" or "Never"), Last checked with the main site (IST).
Default order is last-checked, newest first; the view says how many it holds ("N people") — only when actually counted.
Roles shown are the normalized Labs roles (User / Admin / Super Admin); "Not known" where the role is unread, never guessed.
TC-PPL-003Saved views — All people · Suspended or banned · Main-site check failingP1
Steps
Cycle the segmented view control through the three views.
Compare each view's count.
Expected
Each view shows its own whole-directory count beside its label.
"Suspended or banned" lists only restricted people with their standing badge; "Main-site check failing" lists genuine verification faults (rows tagged "Check failing").
An empty view says "Nobody is in this view" and points back to All people — honest, not an error.
TC-PPL-006Row badges — standing, "Check failing", "Erasure in progress"P2
Preconditions
A suspended/banned person and, if one exists, someone mid-erasure or with a failing check.
Steps
Read the Standing column across the directory and the Suspended-or-banned view.
Expected
Suspended/banned rows carry the standing badge; a failing main-site check tags "Check failing"; an account being erased is tagged "Erasure in progress" (danger tone).
TC-PPL-009Access facts — role from the main site, membership, checks, the way to the main siteP1
Steps
Open a person's panel and read the Access section and the badge row.
Expected
Badges: one Labs role chip, the standing badge, "Erasure in progress" where it applies, and "This is you" on your own account.
Access shows: Role "…, set on the main site" (or "Not known yet"), Membership ("Member since …"/"Has not been a member yet"), Last checked (IST), Main-site check "Working" or "Failing since …".
"Manage on the main site" opens the main site's user administration in a new tab — Labs has no role editor, and nothing here changes identity or membership.
A stale or unreadable fact says so plainly rather than implying an inactive or banned account.
TC-PPL-011The privacy boundary — no code, notes, files, answers, or live factsP1
Steps
Open the panel of a learner with code, notes and project files.
Look for any path into their private work.
Expected
The page itself states: "Their code, notes, project files and answers are never shown here."
No section offers submitted/saved code, typed input, clipboard content, terminal output, Notes, Workspace files, generated prompts, or a download/impersonation route into their work.
TC-PPL-012Standing & moderation history — who, when, reason, note, how it endedP1
Preconditions
A person with at least one past or current restriction (run TC-PPL-019 first if none exists).
Steps
Open their panel; read Standing and its history list.
Expected
Current standing reads explicitly: "In good standing", "Suspended until …" or "Banned since …" — never inferred absence.
"No suspensions or bans." when none; otherwise each entry: "Suspended for N days" or "Banned", the reason, any private note, who placed it (name + role), when it started, and how it ended ("In force until …", lifted, reached its end, or "Replaced by a ban").
TC-PPL-013Certificates, erasure and legal holds sectionsP2
Preconditions
A person holding a certificate; a person mid-erasure if available.
Steps
Read the Certificates section of a certificate holder.
Read the Erasure and legal holds section on someone mid-erasure and on someone with a hold.
Expected
Certificates: course, "Issued …" or "Not issued yet", state chip (Waiting for a name · Being made · Not made yet · Issued · Revoked); each opens its record. "No certificates yet." when empty; "Couldn't be read." on failure.
Erasure under way shows a meter "Erasure: N of M parts done" (or "Erasure: starting") + started time + "Open in Erasure and holds" → /admin/lifecycle?erasure=….
Holds list each: "Legal hold placed …", "Review by …" / "Ends by …" or Released with when and by whom; "In force" chip while active.
TC-PPL-014Administrative actions — Admin sees who/when; most reasons are Super-Admin-onlyP1
Preconditions
A person with several kinds of actions recorded (a suspension + a hold + a correction, e.g. after earlier cases).
Steps
As Admin, open their panel and read "Administrative actions".
As Super Admin, compare.
Expected
Both roles see each action's name, who took it ("The platform" for automatic ones) and when.
Admin reads reasons only for a suspension, its early lift, a ban and an erasure — a hold's, a reset's, a reversal's or a correction's reason never reaches the Admin's browser; the section lead says "…the rest are for Super Admins."
Super Admin reads every reason.
"No administrative actions involve this person." when none. Support-view openings are not listed here.
TC-PPL-016Support view of someone being erased — only the hold remainsP2
Preconditions
An account past its cancellation window being erased (after TC-LFC-011, or an existing one). Super Admin.
Steps
Open the person's panel while erasure runs.
Open their /suspend address directly.
Expected
The panel still opens, says Erasure in progress with the parts meter, and offers exactly one action: "Place a legal hold…" — "Their account is being erased. A legal hold, which pauses it, is the one action left."
A moderation address says "Their account is being erased, so their standing is not changed here." — no dialog.
Moderation acts live at four addresses of their own under a person. Each is Super-Admin-only, each shows a confirmation dialog naming the person, each requires what it requires (a reason, a duration, or the person's typed name), and every protected confirmation passes through the main-site check. A restricted learner meets a factual restricted page — never the reason, the private note, or the moderator's name.
Route
Screen
Role
/admin/people/:identity/suspend
Suspend dialog
Super Admin
/admin/people/:identity/lift-suspension
Lift-suspension-early dialog
Super Admin
/admin/people/:identity/ban
Ban dialog
Super Admin
/admin/people/:identity/unban
Unban dialog
Super Admin
Suspend asks for a reason, a duration (1, 7, 30 or 90 days, or Other 1–365) and an optional private team note. Ban asks for a reason, the typed name and an optional note. Unban asks for the typed name alone. Records and main-site membership are untouched by a suspension; a ban replaces a suspension where one stands.
Destructive — coordinate first
Every case in this section restricts a real shared account and ends its sign-ins. Agree the target learner (tester-learner-2..5 suggested; keep tester-learner-1 usable) with the Super Admin before running, and lift/undo the restriction when the case passes.
TC-PPL-017Suspend dialog — named title, presets, live "come back" line, reason required Super AdminP1
Preconditions
Signed in as Super Admin; an unrestricted learner chosen (coordinate — tester-learner-2).
Steps
From their panel, choose Suspend (or open …/suspend).
Pick each duration preset; choose Other and try 0 and 366 days.
Type and remove the reason; watch the confirm button.
Expected
Dialog titled "Suspend <name>" — the person's own name.
Presets 1 · 7 · 30 · 90 days plus Other → a day count 1–365; "They can come back in on …" shows the concrete end date/time and ticks as the choice changes.
Reason is required (confirm stays unavailable until typed); private note is optional and labelled staff-only.
Consequences stated before confirming: sign-ins end now, a live test ends scored on saved answers, programs stop; records and main-site membership stay untouched.
TC-PPL-019The restricted learner's page — factual wording, no staff detailP1
Preconditions
The learner suspended in TC-PPL-018, signed in in another browser/profile.
Steps
As the suspended learner, open any app page; use Try again.
Expected
A restricted page: "Your access to Wizly Learning is suspended" with when it ends and a route to the main site — never the reason, the private note, or who placed it.
Try again keeps showing the restricted page until the suspension ends or is lifted; after it ends the app admits at once.
Also try
Lift early (next case), then Try again — the learner gets straight back in.
TC-PPL-024Not-offered addresses say so plainly — no dead dialogsP2
Steps
Open …/lift-suspension on someone not suspended.
Open …/suspend on someone already suspended; …/ban on someone banned; …/unban on someone not banned.
Expected
Each address explains in words instead of showing a form: "They are not suspended, so there is nothing to lift." / "They are suspended already." / "They are banned already." / "They are not banned, so there is nothing to undo."
The support view still shows behind/beside the message — the address never errors.
Two Super-Admin-only person actions that are irreversible by design. A reset walks three steps — choose scopes → preview exactly what would change → confirm with reason and typed name — then runs each scope independently. A reversal records that the main site already reversed a payment: it selects the certificates that invalidates, ends all sign-ins, and commits together with its audit entry.
Nine reset scopes: Courses, Workspace Projects, Skills, Learning preferences & Continue, Challenges & Tracks, Daily Challenges, Timed Debug, Mock Tests, Company Tests. Preview counts are owner-supplied and exact; a scope that cannot be counted blocks confirmation. Reversal stores no amount, invoice or payment method — it records a reference and a reason.
Destructive — coordinate first
Both actions are irreversible, end sign-ins, and notify the learner. Run them only against a learner the team has agreed (tester-learner-4 is the suggested expendable account), never against another staff member, and record what you changed.
4.1 Progress reset
TC-PPL-031Step 1 — nine scopes grouped, each saying what resets and what stays Super AdminP1
Steps
Open /admin/people/<tester-learner-4>/reset.
Read every scope's description; select a subset.
Expected
Step "Choose what to reset" lists nine scopes grouped (Learn / Practise / Assessments / Build / You): Courses, Workspace Projects, Skills, Learning preferences and Continue, Challenges and Tracks, Daily Challenges, Timed Debug, Mock Tests, Company Tests.
Each scope names what resets and what stays (solved items, submissions, completed tracks, paid rewards, quiz results, certificates, files, project last-edited time).
A scope not available for this person is disabled with "not available" wording rather than hidden silently.
TC-PPL-033Uncountable or blocked scope stops confirmation Super AdminP1
Preconditions
A scope that cannot be counted right now, or a learner inside a running timed window / live test.
Steps
Select the affected scope; try to proceed.
Expected
The scope is reported as unable to run ("Could not be counted just now" / the blocked reason in words) and confirmation cannot proceed while it stays selected.
The message names the scope; deselecting it unblocks the rest.
TC-PPL-037One learner notice, only when something changed Super AdminP2
Steps
After a reset with changes, check the learner's notifications as that learner.
Run a reset where every selected scope changes nothing.
Expected
Exactly one System notice once all changed scopes complete, naming what was reset and what stays — not one per scope, and none on an empty reset ("Nothing needed changing, so they were not told.").
TC-PPL-039What stays stays — verify the preserved facts on the learner Super AdminP2
Preconditions
A completed reset on a learner who had XP, certificates, achievements, solved challenges and paid rewards.
Steps
As the learner, check level/XP, certificates, achievements, solutions, rewards and profile after the reset.
Expected
Level/XP, certificates, achievements, solve facts, paid rewards, saved files, quiz results and last-edited times all survive exactly as the scope text promised.
TC-PPL-040?scope=skills preselects the Skills scopeP3
Steps
Open /admin/people/<identity>/reset?scope=skills directly.
Expected
The Skills scope arrives preselected; every other behaviour is identical (same preview, same confirm, same audit) — the address never grants a different operation.
A learner holding at least one certificate whose access you may end (coordinate — tester-learner-5).
Steps
Open /admin/people/<the learner>/payment-reversal.
Step 1: enter a main-site reference and a reason.
Step 2: read the certificate list; tick a subset.
Step 3: read the consequence list; try confirm without the typed name, then correctly.
Expected
Step 1 asks for the main-site reference (bounded ~120 chars) and a reason — and states Labs does not process payments: this records a reversal the main site already made.
Step 2 lists the person's un-revoked certificates as checkboxes; none is pre-ticked; already-revoked ones are absent.
Step 3 lists consequences: every selected certificate revoked, all sign-ins ended, next entry asks the main site — plus typed-name confirm and the main-site check.
TC-PPL-043Same reference, same person — returns the recorded result, does nothing twice Super AdminP1
Steps
Repeat TC-PPL-041/042 entering the same main-site reference for the same person.
Expected
The page returns the already-recorded result: "This reference was confirmed <date>. Nothing happened again." — no second revocation, no second audit write, no extra sign-out storm.
The lifecycle page is readable by both staff roles: a filterable table of erasure requests and a table of legal holds, each with a side panel. Staff never approve, reject or cancel a learner's own erasure request — the learner alone can cancel inside its window. Super Admin places, reviews and releases legal holds and retries failed erasure work; Admin sees that holds exist and their dates, never the confidential reason or authorizer.
Erasure stages: Learner can still cancel · Scheduled · Erasure in progress · Held · Failed · Erased · Cancelled by the learner. Holds are In force · Due for review · Released; a review date may be at most 90 days ahead and must be after today. Releasing the last applicable hold resumes an erasure from its first unfinished part; a hold never restores already-erased data.
Destructive — coordinate first
Erasure permanently deletes a real account. Use a dedicated throwaway learner or one the team has already agreed to erase; never erase a tester account still needed by other cases. Place holds on agreed accounts only.
At least one erasure exists (a learner's own request or one begun by staff).
Steps
Open /admin/lifecycle; read the Erasures table rows.
Expected
Each row: the person (link, or "An erased person (xxxxxxxx)" once gone), asked-for source and time, stage chip with the seven possible states, an "Overdue" chip where it applies, the parts meter ("N of M parts done"), due-by/erased dates, and — for failed rows — the failure in words.
TC-LFC-003Erasure side panel — part-by-part truth, due dates, stage honestyP1
Steps
Click an erasure row; read the side panel (address gains ?erasure=…).
Compare an early-stage erasure with a finished one.
Expected
Panel shows the person, the stage, who asked (learner themselves / staff name), the reason where the role permits, the cancel-until time during its window, and Due by / Erased dates.
A part-by-part list: each part's state and "N removed" count, with failure detail in words on failed parts.
An erasure never reads "Erased" before its last part finishes; in-progress and held states name themselves.
TC-LFC-007Confidential fields are Super-Admin-only — Admin sees existence and datesP1
Preconditions
A hold in force with a reason and authorizer.
Steps
As Admin, read the hold row and open its panel.
As Super Admin, compare.
Expected
Admin sees the hold exists, who placed it, and its dates — the reason, the basis and the authorizer never reach the Admin's browser (check the network response, not just the UI).
Super Admin reads reason and authorizer in the row/panel and in the Review/Release dialogs.
TC-LFC-008Placing a hold — exact scope, reason, authorizer, ≤90-day review date Super AdminP1
Steps
On a learner's panel, open ?act=hold.
Try a review date of today, of 91+ days out, then a valid one; optional end date before today.
Complete with reason + named authorizer; confirm through the main-site check.
Expected
Dialog names the person; asks for reason, the named authorizer, a review-by date (after today, at most 90 days ahead — a valid default is offered), and an optional end-by date that must be after today.
Invalid dates are called out under the field immediately and refused again at the server — not silently corrected.
Consequences are stated (the hold pauses erasure work and is confidential); on confirm, the hold appears In force.
TC-LFC-009Reviewing a hold — renew the basis, next review within 90 days Super AdminP1
Preconditions
A hold in force.
Steps
Open the hold's Review dialog.
Confirm the basis, set the next review date, confirm.
Expected
The dialog shows the hold's basis (person, reason, authorized-by, ends-by) before asking for the next review date — again ≤90 days, validated live and server-side.
The review is recorded; the hold stays In force with the new review date.
TC-LFC-013"Erase this account" — typed name, reason, begins at once Super AdminP1
Destructive — coordinate first
Permanently erases a real account without the learner's seven-day window. Use only an agreed throwaway account.
Steps
On the agreed learner's panel, open ?act=erase.
Read the consequences; type a reason and the exact name; confirm.
Expected
Dialog "Erase this account" states: erasure begins at once (no seven-day wait), the sign-in ends, certificates stop being found; reason + typed name required; main-site check on confirm.
After the toast ("Erasure has begun"), the person panel reads "Erasure in progress" and only the legal-hold action remains.
TC-LFC-014Being-erased refusals — every person action says the same sentenceP1
Preconditions
An account mid-erasure.
Steps
As Super Admin, open each person-action address: suspend, ban, unban, lift-suspension, reset, payment-reversal, correction, extra, certificate actions, invalidate.
Expected
Every one refuses with the same meaning: "Their account is being erased, so nothing more is changed for them." — only a legal hold can still be placed.
The refusal is server-enforced, not just a hidden button.
TC-LFC-015Erasure is independent of age-based cleanupP2
Steps
Compare an erasure's parts with any retention/age-based cleanup mentioned on the page or in audit.
Expected
Erasure rows name their own parts and source; nothing conflates a requested erasure with routine age-based pruning, and one does not silently stand in for the other.
Certificates admin gives both staff roles the aggregate counts, the searchable certificate list, and every certificate's record and history. All writes — retrying a failed document, approving or rejecting a name correction, reissuing, revoking, making valid again — are Super-Admin-only and pass the main-site check. Revocation invalidates public verification at once but never deletes the record.
Route
Screen
Role
/admin/certificates
Certificates — attention figures, per-item counts, search/filter, the list
Both staff roles
/admin/certificates/:id
Certificate record — status, names, document history, actions
Both staff roles (actions: Super Admin)
/admin/certificates/name-corrections
Name-correction queue — approve / reject
Super Admin
/admin/certificates/parked-generations
Paused document generations — retry
Both read; retry: Super Admin
/admin/certificates/:id/revoke
Revocation flow
Super Admin
States: Waiting for the learner's name · Being made · Not made yet · Issued · Revoked · Hidden from verification. Staff records are labelled and kept out of learner counts. Approving a name correction affects certificates not yet made; issued documents keep the old name until an explicit reissue.
TC-CAD-001Certificates home — attention figures, per-item counts, find and filterP1
Steps
Open /admin/certificates.
Search by learner name and by certificate code; filter by awarded item, state and completion period where offered.
Expected
Awaiting-attention figures up top (name corrections waiting, documents needing attention), per-item counts (pending/issued/revoked), and the list.
Search finds by learner and by code; filters combine; staff-awarded records are labelled as staff and excluded from learner-facing counts.
The page is a reading desk — "nothing here makes one": no create control.
TC-CAD-002Certificate record — chips, code, printed vs current name, attributionP1
Steps
Open an issued certificate's record.
Open a revoked one and one hidden from verification, if any exist.
Expected
Status chip (+ "Hidden from verification" / "Replacement on its way" where true), the code in mono, printed name vs the learner's current name, completed and issued dates, and a staff flag note where the holder is staff.
A revoked certificate shows a danger note: revoked by, when, the permitted reason, and the staff private note.
History groups by day: earned, name set, issued, document events, revocation — each attributed to a person or "The platform".
As Admin, open a certificate record, the name-corrections queue and parked-generations.
Expected
All readable; the record states "Only a Super Admin can change a certificate." — no Revoke, retry or reissue buttons for Admin, and no approve/reject in the queue.
Reading is not the same as power: no write control is merely hidden — the role note is displayed.
TC-CAD-004Revocation flow — the four permitted reasons, private note, public invalidation Super AdminP1
Destructive — coordinate first
Revokes a real certificate and notifies the learner once. Agree the target before running.
Steps
On an issued certificate, open …/revoke.
Read the reasons; pick one, type a private note; confirm through the main-site check.
Check the public verify page for the code and the learner's notifications.
Expected
Two steps; the reason list is exactly: the awarding record is invalid · duplicate issue · defective award · issuance error; a private staff note (≤500) is required.
On confirm: the record stays, the certificate reads Revoked, public verification answers invalid at once, download stops, and the learner is told once.
Revocation does not delete — the record and its history remain.
TC-CAD-009Approval alone does not rename issued documents — reissue does Super AdminP1
Preconditions
TC-CAD-008's approved correction with issued certificates.
Steps
Open an affected issued certificate — check the printed name.
Use Reissue: read the preview count; confirm.
Expected
After approval, issued documents still show the old name — the record explains they keep it until reissued.
Reissue previews the affected count ("Reissue N certificates with the corrected name"), confirms through the check, and lists each certificate with its code; old documents stay usable until their replacements are ready.
TC-CAD-012Public verification cross-check — revoked and erased states read honestlyP3
Steps
On the public verification page, check a revoked code and an erased person's code.
Expected
A revoked code answers invalid with no certificate detail; an erased account's certificate is not found — each honest, neither pretending the certificate never existed in the staff record.
The operations page is aggregate-only: monthly grant figures, captured Credits by action, cleared and failed amounts, paused reward notices — each saying when it was worked out, nobody ever named or ranked. Failed rewards are listed for both roles; retrying them is Super-Admin-only and never pays twice. Configuration, corrections and extra Credits are Super-Admin writes through the main-site check.
Route
Screen
Role
/admin/economy/operations
Economy operations — aggregate figures with read times
Both staff roles
/admin/economy/failed-rewards
Failed reward notices — list, retry one or all
Both read; retry: Super Admin
/admin/economy/configuration
Economy settings — allowances, XP awards, other awards
Super Admin
/admin/economy/correction
Correct an account — one XP/Credit accounting error
Super Admin
/admin/economy/extra
Extra Credits — bounded addition to one learner's month
Super Admin
Setting ranges: monthly base allowance 0–5,000 Credits; monthly continuation allowance 0–5,000; first-solve XP Easy/Medium/Hard/Extreme 0–500 each; default Daily bonus 0–200; written-subject award 0–1,000. Active-time and practice-evidence values are owned by another domain and shown as such. Changes govern later occasions only.
7.1 Operations figures & failed rewards
TC-ECO-001Operations page — aggregates only, each figure with its read timeP1
Steps
Open /admin/economy/operations.
Read every figure group; press Read again.
Expected
"Worked out …" stamp and a Read again control; every figure states its window (current Credit months, ended months in the last 31 days, etc.).
Figures include: months running (count, base granted, continuation granted + grants), Credits captured by action, holds released, cleared unused Credits, failed grants, and paused reward notices with the oldest's age.
TC-ECO-003GENERATED_ASSISTANCE off — honest emptiness, no invented activityP2
Steps
On this deployment, read the Credits figures.
Expected
With generated assistance off, Credit figures may read zero or empty — stated honestly (e.g. no months running), never populated with invented activity; the screens still exist and still read.
Rows: the reward and its category (Achievement / Level-up), the learner's name linking to their person ("A learner with no name on record" otherwise), what's owed, when it paused, tries, and the last failure in words.
Paginated oldest-first (50 a page); the Operations hub's failed-rewards row counts the same set.
Admin reads the whole list; there is no write-off option.
TC-ECO-006Retry all — bounded batches, stops at the first refusal Super AdminP2
Steps
With several failed rows, use Retry all (with a stale main-site check, then a fresh one).
Expected
A stale check asks first ("Confirm on the main site first.") before anything runs.
Retries proceed in bounded batches (100 a transaction, page after page); the run stops at the first refusal and reports where it stopped — it never ploughs through a refusal.
TC-ECO-007Configuration — every setting shows in-force, standard, range, last change Super AdminP1
Steps
Open /admin/economy/configuration.
Read all three groups and the Progress-owned values.
Expected
Three groups: membership allowance (base 0–5,000, continuation 0–5,000), first-solve XP (Easy/Medium/Hard/Extreme, each 0–500), other awards (default Daily bonus 0–200; written-subject award 0–1,000).
Each setting shows the in-force value, the standard value, its allowed range, its effective scope, and who/when last changed it.
Progress-owned settings (active time 15–480 default 120; practice evidence 0–100) are visibly labelled as owned elsewhere — readable, not editable here.
Each group states its changes govern later occasions only — not existing grants, cycles or results.
TC-ECO-010Correction flow — person, account now, live preview, apply Super AdminP1
Steps
Open /admin/economy/correction; pick a learner (search or ?person=).
Read "Account now"; enter a direction and amount; watch the preview; apply with incident/reference + reason through the check.
Expected
Steps: the person → the account now → the correction with a live preview (current, signed change, resulting balance/level) → Apply.
Apply restates the typed change in words ("deduct 300 XP" / "add 50 Credits"), asks for an incident or reference where applicable plus a reason, and passes the main-site check.
It repairs one accounting error — it is never presented as a gift, a test result or an achievement.
TC-ECO-014Extra Credits — bounded by the month's headroom, reasoned, audited Super AdminP1
Steps
Open /admin/economy/extra for a learner.
Read the month figure and the extras added so far; try an amount over the headroom (max 5,000 a cycle).
Add a valid amount with a reason.
Expected
The page shows the learner's current Credit month and how much extra has been added so far; an amount beyond the remaining headroom is refused with what's left — never trimmed.
A reason is required; the write is gated and audited (economy-credits-added); the learner's history labels it "Extra Credits added by staff" without the reason or the name (and, while generated assistance is off, the learner may never see it — honesty either way).
It is not a correction and not an ordinary reward; repeated identical applies are idempotent.
Refusals: picking your own account or a being-erased account refuses in words — no form submits.
The queue at /admin/topic-requests lists requests newest-first, searchable across title and description, filterable by status with retracted requests left out until asked for. Both staff roles review; Approve and Reject act at once behind a ~6-second Undo toast, and the learner is told only after the Undo lapses. Linking content to an implemented request is the one Super-Admin-only act.
Route
Screen
Role
/admin/topic-requests
Queue + request panel (?request=) — statuses, team note, linked content, history
Both staff roles (implemented-link replace: Super Admin)
Staff tag: requests staff file are marked QA-VK 15 Nov —. A request can be marked implemented only when at least one linked item is openable by learners; replacing links on an implemented request is Super-Admin-only, keeps at least one valid link, and is audited.
TC-TRA-001Queue — search, status filter, counts, retracted omitted until askedP1
Steps
Open /admin/topic-requests.
Search title and description text; cycle the status filter.
Expected
Newest first; search matches title and description; the count is of the filtered set.
Retracted requests are omitted by default and appear under their filter state only; every status's count is shown when actually counted.
TC-TRA-002Request panel — full detail beside the queue at its own addressP1
Steps
Open a request from the queue.
Expected
Panel beside the queue at ?request=…: title, where it was asked from (topic, difficulty, the words searched "…"), filed date, status-changed date, a "staff" mark on staff-filed requests, and the full description.
Broadcasts send one System notice to the whole learner audience. Composing and sending are Super-Admin-only; the history is readable by both roles. The audience estimate excludes staff and learners with System notifications disabled; delivered broadcasts cannot be edited or recalled — a running delivery can only be stopped for what has not been reached yet.
History — aggregate states, side panel (?broadcast=), stop
Both read; stop: Super Admin
States: Delivering · Delivered · Stopped · Failed. History shows estimate, delivered count, System-off count, sender, timestamps and stop reason — never recipient identity or read tracking.
Destructive — coordinate first
Sending reaches every learner account. Use only an agreed test broadcast (e.g. title starting QA-VK), and coordinate the Stop case while a broadcast is delivering.
TC-BRC-001Compose — bounds, learner preview, audience estimate Super AdminP1
Steps
Open /admin/broadcasts.
Type a title >120 chars and a message >4000; then valid text.
Expected
Over-limit text stays whole in the field, the field says it's too long, and Send is disabled — nothing is truncated silently.
The preview shows exactly what learners see — the bell row and the opened notice.
The audience estimate reads "up to N learners" or honestly "could not be estimated" — never a fake count.
TC-BRC-004History — aggregate counts and states, no recipientsP1
Steps
Open /admin/broadcasts/history as Admin.
Open a broadcast's side panel (?broadcast=…).
Expected
Table: title, sent-by, sent time (IST), estimate ("Not estimated" where so), Delivered (a meter while delivering), System off, and state chip Delivering / Delivered / Stopped / Failed.
Side panel adds the body, sender, all timestamps, delivered count, System-off count, finish time, and stop-by/when/reason where stopped.
No recipient identity and no read/open tracking anywhere.
The knowledge base holds every answer — drafts included — each with its lifecycle (draft → published → archived), synonyms, tags and a learner preview. The responses page holds the approved message set in both voices. Matching thresholds, identity artwork and nudges are Super-Admin-only settings; protected lifecycle and settings writes pass the main-site check.
Route
Screen
Role
/admin/wizbit/kb
KB list — answers, views, review states, where-tags, try-a-question
Nothing here is a learner-facing control: nudges reduce what producers send, never grant permission to interrupt; the evaluation set is private and its questions never appear as learner content.
TC-WZA-001KB list — drafts included, views, review states, where-tagsP1
Steps
Open /admin/wizbit/kb.
Cycle the views (All / Due for review); read where-tags.
Expected
Every answer is listed including drafts; review state chips read "Never reviewed" / due honestly.
Where-tags read "Anywhere" or name the places an answer serves.
TC-WZA-003Answer editor — fields, lifecycle, learner preview, Return to DraftP1
Steps
Open an answer; read every field and the preview.
Walk the lifecycle: Save draft → Publish (or Submit for approval under the publishing switch) → Archive → Return to Draft → Delete where offered.
Expected
Fields: question, answer, synonyms, tags, and the "way to learners".
The learner preview shows what they'd see; lifecycle actions use the product words — Return to Draft (an action, not a state), Archive, Delete — each with its own dialog and consequences.
Archived/deleted answers stop being served as promised (re-try the question to prove it).
TC-WZA-007Matching — hundredths-bounded thresholds, staff-only preview Super AdminP1
Steps
Open /admin/wizbit/kb-administration.
Try an out-of-range threshold; preview against test questions; save thresholds + test questions together with a reason.
Expected
Thresholds are decimals bounded to hundredths; an out-of-range value is refused.
The preview runs against staff's own private test questions only — never learners' real questions; outcomes read in words (Answers / Offers topics / No clear answer).
Thresholds and the evaluation set save together with a reason through the main-site check; test questions are saved as a whole set.
Private test questions never appear as learner content.
TC-WZA-008Identity — approved artwork only, contrast-checked accent Super AdminP1
Steps
Open /admin/wizbit/identity.
Read artwork sizes and expressions; change the accent; save.
Expected
Only approved artwork is offered (four sizes + expressions); no uploader, no name editor.
Accent offers the theme's own or the five tints (Ember, Jade, Orchid, Glacier, Azure), contrast-checked; an invalid/unavailable asset is refused rather than half-applied.
TC-WZA-009Nudges — producer reductions only, nothing arbitrary Super AdminP1
Steps
Open /admin/wizbit/nudges.
Read every control; save a change with a reason.
Expected
The controls only reduce: once-a-day vs off, lengthening the wait for the same suggestion — nothing raises the ceiling, shortens the quiet hour, or adds a new kind.
There is no per-learner intervention or permission system here.
Saving requires a reason through the main-site check and lands in the audit.
Reporting is aggregate and anonymous — participation by area, flagged practice items, WizBit use — with staff activity and tools excluded and no learner ever named or ranked. Home suggestion and next-action mappings choose which published destinations learners see; skill-evidence reset is a doorway into the person's reset page. Writes are Super-Admin and audited.
Skill-evidence reset — learner lookup → redirects to the person reset
Super Admin
Periods: 7 / 30 / 90 days, kept on the browser and shared across tabs. Flags are prompts ("Few solve it"), never verdicts. Downloads are bounded, safe and audited as report-exported (readable by Super Admin only).
TC-INS-001Reporting — three tabs, address-kept, shared periodP1
Steps
Open /admin/analytics/reporting; cycle Participation / Content review / WizBit use.
Change the period; reload; check the address.
Expected
The tab lives in the address; the period (7/30/90 days) is shared across tabs and survives a reload.
Everything is aggregate and anonymous: staff activity and tools are excluded; no learner is ever named or ranked.
TC-INS-003Content review — flagged items with reason words, owner linksP1
Steps
Read the Content review tab; open a flagged item.
Expected
Flags are reason words — No primary skill / Few solve it / Almost everyone solves it / Many submissions per solve / Most learners open a hint — with the population and threshold stated.
An item opens its owner's admin page; a flag is presented as a prompt to look, never a verdict.
TC-INS-004CSV download — recorded first, IST filename, coverage line, no personal detailP1
Steps
Download a report; open the CSV; check the audit as Super Admin.
Expected
The export is recorded first (audit report-exported, Super-Admin-readable); the filename carries the view, the period and the IST time (e.g. participation-30-days-…-IST.csv).
The first line states coverage and when it was worked out; no personal detail anywhere; cell content is formula-safe.
TC-INS-007Skill-evidence reset is a doorway — same operation, no second policy Super AdminP1
Steps
Open /admin/analytics/skill-evidence-reset; find a learner (User-role list).
Choose "Reset skill evidence…".
Expected
It lands on /admin/people/<identity>/reset?scope=skills with the Skills scope chosen — the identical preview, confirm, run and audit as any person reset. No separate, weaker policy lives here.
12 · System — runtimes, maintenance windows, main-site changes
Three operational surfaces. The language registry is a read-only table of what runs where — honest per-service lanes that distinguish "not running" from "could not be asked". Maintenance windows are a Super-Admin-only declaration with a live learner-banner preview and a lifecycle the worker ends by measurement, never by hand. Identity delivery lists the main-site changes Labs was told about and lets a Super Admin re-ask about the ones that could not be verified.
Route
Screen
Role
/admin/language-registry
Runtime registry — languages × service lanes
Both staff roles (read-only)
/admin/maintenance-windows
Maintenance — declare, list, cancel
Super Admin
/admin/identity-delivery
Main-site changes — waiting and verified lists, re-ask
Super Admin
Window states: Scheduled · In progress · Ending · Overrunning · Ended · Cancelled. Expected end ≤7 days after start; learner explanation ≤300 chars; affected capabilities are grading, interactive programs and file storage.
12.1 Language registry
TC-SYS-001The registry reads as committed — language, version, availability, service lanesP1
Steps
Open /admin/language-registry; read several languages' rows.
Expected
Each language shows name + version, availability (Available / interactive-only / Coming soon / Off), and a per-service lane reading Running / Not running / Not yet / Could not be asked / Not offered.
Nothing is editable — the registry is committed with the platform; the page says so.
TC-SYS-005The learner banner — in-progress and next-day windows only Super AdminP1
Steps
With a scheduled window starting within a day, and again while one is in progress, view the app as a learner.
Cancel the scheduled window and watch the banner leave.
Expected
The banner shows for active windows and ones starting within ~24h: affects, times and the explanation, with "taking longer than expected" while Overrunning.
An Ending window reads the same as In progress — nothing new appears; after cancellation or Ended the banner leaves within about a minute.
TC-SYS-006No manual end — the worker decides Ended vs Overrunning Super AdminP1
Steps
Look for a "Force healthy" / "End now" control on an in-progress window.
Watch a window cross its expected end.
Expected
There is no manual End or Force-healthy control anywhere.
When the expected end passes the window reads Ending — "waiting for the first check after its expected end" — and becomes Ended only once the affected capabilities measure healthy; otherwise Overrunning.
TC-SYS-008The hub's Maintenance signal tracks windows honestlyP2
Steps
While a window is in progress / overrunning, read the hub's Maintenance signal.
Expected
Maintenance reads Degraded while a window is in progress, ending or overrunning, and names the next planned window otherwise — not a fabricated Healthy during a window.
TC-SYS-009Waiting and verified lists — change kinds in words, verified paged Super AdminP1
Steps
Open /admin/identity-delivery.
Read the waiting list and the verified list (Load more if offered).
Expected
Waiting, oldest first: person link, the change kind in words (signed out / password changed / account deleted / role, membership or identity changed), sent time, due-since, tries, last failure in words.
Verified: 100 a page with Load more and a "how many it shows" line — not a fabricated total; the window is bounded (~180 days).
Change kinds stay distinct — signed-out, password, account-deleted and role/membership/identity changes never collapse into one generic "change"; each row's verification state is visible.
The audit at /admin/audit is the immutable record — IST-day groups, newest first, every entry naming who (a staff member or "The platform, automatically"). Admin reads only the content-kind actions; Super Admin reads everything (~80 action types). The publishing switch is the single global Allow Admins to publish setting: Super-Admin-only, no undo, and reflected on the Operations hub.
Retention is one year; platform cleanup entries are attributed to "The platform, automatically". Filters persist in the address; Item search debounces ~350 ms; an invalid date range keeps the other filters and says exactly: "From is after To, so the dates were not used."
TC-LFC-016Audit list — IST day groups, attribution, Load moreP1
Steps
Open /admin/audit as Super Admin.
Read the rows and group headers; Load more.
Expected
Grouped by IST day, newest first; each row reads "Action: item · time · who" with the who being a staff name + role or "The platform, automatically".
Stable paging — Load more appends without reordering or repeating rows.
TC-LFC-017Admin scope — content-kind actions only, lead says soP1
Steps
Open the audit as Admin; open the Show/action filter.
Compare with Super Admin's filter.
Expected
Admin's Show filter offers only content-kind actions (publications, approvals, skills/topics changes…); settings, people and platform actions are absent — and the page lead says the Admin sees a subset.
Super Admin's filter lists the full ~80 action types.
TC-LFC-022Publishing switch — the confirm dialogs and the no-undo warning Super AdminP1
Steps
Open /admin/settings/publishing; read the switch and the last-changed stamp.
Toggle it; read the confirm dialog.
Expected
The page shows the switch ("Allow Admins to publish"), what On and Off each mean, and when it last changed + by whom.
Confirming shows "Allow Admins to publish?" / "Stop Admins publishing?" with the explanatory text — and it warns there is no undo (you change it back by changing it again, recorded).
The confirm passes the main-site check; the audit records the change old → new.
14 · Test records — recorded events & invalidation
Every Mock/Company test keeps a staff-readable events page and a Super-Admin-only invalidation flow. Recorded events show what the counter recorded in factual words — never recordings, clipboard contents, source or hidden test material. Invalidation keeps the history row, marks the result out, restores fresh-test eligibility and reverses Mock rewards exactly so they can be earned again.
Route
Screen
Role
/admin/tests/:test/recorded-events
Recorded events — test facts + the counted/not-counted event list
Both staff roles
/admin/tests/:test/invalidate
Invalidate — reason → staff note → confirm → done
Super Admin
Invalidation reasons are neutral and honest: platform input · defective content · account security · staff decision. The learner reads a neutral explanation — never blame, never the staff note.
TC-LFC-026Recorded events — test facts and the counted/not-counted event listP1
Preconditions
A completed Mock/Company test with events (run one with strictness on first if needed).
Steps
Open /admin/tests/<the test>/recorded-events.
Read the facts header and the event list.
Expected
Header: learner, started, ended with the ending in words, state (+ Archived / a grading-since warning where it applies), strictness and the counted-event ceiling.
Events list oldest-first in "what happened" words, each with a counted / not-counted chip, and a summary "N counted of M recorded".
TC-LFC-027Strictness-off and empty lists read as the setting, not missing dataP1
Steps
Open recorded-events for a strictness-off test, and for a test that recorded nothing.
Expected
Strictness off: "Nothing was recorded … That is the setting, not missing information." — distinct from a genuine "Nothing was recorded during this test."
TC-LFC-029Invalidate — the link's gate, the four reasons, the staff note Super AdminP1
Destructive — coordinate first
Marks a real test result out and reverses its rewards. Agree the test first.
Steps
On an ended, not-yet-invalidated test, open /admin/tests/<test>/invalidate.
Read the reason choices; pick one; write the staff note (≤500); confirm through the check.
Expected
The link/control exists only for Super Admin, on an ended test, not already invalidated; Admin reads the page without it.
Steps: reason (the four neutral choices, each previewing what the learner is told) → staff note (required, ≤500, SA-only) → confirm listing consequences → done; the confirm passes the main-site check.
Checks that belong to the whole console rather than one screen. Wherever this doc already covers the behaviour, these cases verify the invariant holds across areas rather than repeating steps.
TC-OPS-015Every protected write survives the main-site gate — spot-check across areasP1
Steps
With a stale main-site check, attempt one protected write in each of three different areas (e.g. suspend, broadcast send, economy save).
Expected
Each one routes through "Confirm on the main site" and returns to the same dialog/page with everything typed held — the handoff pattern is uniform, not bespoke per screen.
TC-OPS-016A downgraded role loses access on the next privileged actionP2
Preconditions
Coordinate: an account's role changed on the main site while a staff session is open (or simulate by sign-out/sign-in).
Steps
With a staff session open, remove its staff role on the main site; continue working in the console.
Expected
Privileged actions stop being granted once the role no longer holds — a stale main-site check or a cached page never confers authority; the next protected write asks and fails honestly.
TC-OPS-017Unknown is never zero, empty, healthy or "not running" — the sweepP1
Steps
Revisit each area: the hub's signals and rows, people headlines, economy figures, registry lanes, broadcast estimate, audit list.
Expected
Everywhere an "unavailable/unknown/could-not-be-read" state appeared during your run, it was named as itself — never silently rendered as 0, an empty list, Healthy or Not running.
TC-PPL-046Vocabulary sweep — the product's own words, never "Labs"P1
Steps
Re-read every screen visited in this doc (or use a text search across them).
Expected
People-facing copy says Wizly Learning — never "Labs".
Actions say Suspend / Ban / typed-name confirm / Return to Draft (action, not state); credits speak of a relief grant, holds of reserved / captured / released; "try" and "test" where the product does — no "attempt", "unpublish" (for Return to Draft), "retention hold", "gift".
Times and dates are labelled IST; numbers use Indian grouping.
TC-LFC-033Every write in this doc lands in the audit — spot-check the trailP1
Steps
After a testing session, open /admin/audit as Super Admin and find each write you performed (suspension, reset, hold, certificate action, correction, broadcast, mapping change, publishing toggle, invalidation).
Expected
Every one is present with your name, the item and the reason where required; nothing wrote silently. Platform-side transitions (a suspension reaching its end, a scheduled window starting) are attributed to "The platform, automatically", never to a staff member.
TC-OPS-019Responsive + dark — 390 / 768 / 1280 / 1440 px in both themesP3
Steps
Walk the main staff pages at 390, 768, 1280 and 1440 px in light and dark.
Expected
Tables scroll or reflow without losing columns' meaning; the console dock and panels behave as on the hub; dialogs stay inside the viewport; nothing is unreadable in dark.
TC-OPS-020Keyboard, focus, dialogs and reduced motion across the consoleP3
Steps
Operate a moderation dialog, a side panel and a table with keyboard alone; repeat with reduced motion on.
Expected
Dialogs trap and release focus correctly; every confirm and field is reachable by keyboard; focus is visible; reduced motion calms transitions without breaking them.