The staff console's content side: console orientation, the publishing lifecycle, submissions review, every authoring studio and content-admin screen · Requires: Admin + Super Admin — many cases need BOTH roles; cases only a Super Admin can run carry a Super Admin chip · related: doc 05 for operations/people, doc 06 for journeys · app under test: https://app.sprinklejelly.com
Before you start
Roles. "Staff" in a routes table means both Admin and Super Admin. tester-staff-1/tester-admin-1 are Admins; sprinklejelly/yashmini are Super Admins — coordinate before using the owner accounts.
The publishing switch decides half this doc. Many cases come in an ON and an OFF variant. Check the current state at /admin/settings/publishing (Super Admin) before running lifecycle cases, and agree in the team channel before anyone flips it.
The main-site check. Protected writes (publish, archive, delete, decisions, settings) need a main-site check no older than 15 minutes. A stale check turns the confirming button into "Confirm on the main site" and sends you to the main site and back — typed input is held and restored. That round-trip is expected, and there are dedicated cases for it.
Tag your content. Everything you create gets the tester tag: "QA-VK 15 Nov — …" (your initials + date) so it can be told apart from showcase content and cleaned up.
Two-browser cases are marked 🖥🖥 and need two different signed-in accounts at once (e.g. Admin in one browser, Super Admin in another — or a normal + private window).
1 · The staff console — orientation & access
One persistent shell holds every staff page. Its navigation has seven spaces — Operations, Content, People, WizBit, Messages, Insights and System — always expanded; destinations appear only when the role permits them. The console header carries a compact health light (the Operations hub's own detail is doc 05's), the breadcrumb names real pages only, and a direct address gets the same access decision as its navigation link.
Route
Screen
Role
/admin
Operations hub — landing page
Staff
/admin/submissions
Submissions queue
Staff (deciding is Super Admin)
/admin/submissions/:submissionId
Review a submission
Super Admin
/admin/reports
Content reports
Staff
/admin/settings/publishing
Publishing — the Allow Admins to publish switch
Super Admin
/admin/vocabulary
Skills and topics
Super Admin
/admin/provenance · /admin/provenance/:kind/:id
Content sources · one source record
Staff (changing defaults: Super Admin)
/admin/import/:kind/:id
Import into one item
Staff
/admin/content-gaps
Content gaps
Staff
/admin/aptitude
Manage Aptitude — coming soon
Staff
/admin/audit
Audit history (detail in doc 05)
Staff — Admin sees content-kind entries only
1.1 The shell and its spaces
TC-CON-001The console shows seven always-expanded spaces in orderP1
Preconditions
Signed in as Admin (tester-staff-1) on a computer-width viewport.
Steps
Open /admin.
Read the navigation and the header, then open the Content space.
Expected
Seven spaces, always expanded, in this order: Operations, Content, People, WizBit, Messages, Insights, System.
Operations holds: Operations, Submissions, Content reports. Content is one plain list in the order learners meet the areas: Courses, Video courses, Daily Challenges, Challenges, Tracks, Debug cases, Aptitude, Typing Quest, Mock Tests, Company Tests, Workspace templates, Skills and topics, Content sources.
Content gaps sits under Insights (not Content); Home suggestion under Insights; Runtimes, Maintenance, Main-site changes, Audit history under System; Broadcasts under Messages.
The header carries the health light and the account menu; the Operations hub is the landing page.
Also try
Open a page from another space — the shell persists; only the page body changes.
TC-CON-002The breadcrumb names real pages and folds on a phoneP3
Preconditions
Signed in as Admin; at least one challenge exists to open.
Steps
Open /admin/challenges, then one challenge's studio.
Read the breadcrumb. Resize to 390 px and read it again.
Expected
Breadcrumb names real pages only — the space as plain text, the page matched by its pattern (e.g. Content · Challenges · the challenge).
On a phone width it folds to one link, to the nearest page above; where the page's own header has a way back, the breadcrumb steps aside — one way back, never two.
TC-CON-005An Admin opening a Super Admin page reads "Only a Super Admin can open this page."P1
Preconditions
Signed in as Admin.
Steps
Open /admin/settings/publishing.
Open /admin/vocabulary.
Open a submission's review address /admin/submissions/<id> if one exists.
Expected
Each renders "Only a Super Admin can open this page." inside the shell — not a crash, not the page's own content, and never a partial render of protected controls.
The same result from a direct address as from any link.
Also try
/admin/tests/:test/invalidate on a real test id — same message for an Admin.
TC-CON-006An Admin's navigation omits Super Admin destinationsP2
Preconditions
Two browsers or two sessions available: one Admin, one Super Admin. 🖥🖥
Steps
As Admin, read the full console navigation.
As Super Admin, read it again.
Expected
Destinations appear only when the role permits them: the Admin does not see Skills and topics, Publishing (under System/settings), WizBit matching, WizBit look, WizBit nudges, Maintenance, Main-site changes, Send a broadcast, name corrections, economy settings/corrections.
The Super Admin sees them all.
A shared staff destination (Submissions, Content reports, Challenges) renders for both.
TC-CON-008Staff keep the learner view — and earn nothing by itP2
Preconditions
Signed in as Admin.
Steps
From the account menu or address bar, open a learner page: /challenges, then a published challenge.
Run and Submit a solution as the staff account.
Expected
Every learner page opens for staff; where spec'd, staff extras appear (e.g. the way to the item's editor).
Staff activity earns no XP and stays out of learner-facing counts (solve rates, participation figures) — the staff solve is not counted in the challenge's public Solve rate.
TC-CON-009One web session per person — the newer sign-in ends the olderP2
Preconditions
The same staff account signed in from two browsers. 🖥🖥
Steps
Sign in as tester-staff-1 in browser A.
Sign in as the same account in browser B.
Return to browser A and navigate or act.
Expected
Browser A is told the account was opened on another browser or device — the "opened on another browser or device" notice — and is not silently signed back in.
Work already typed in browser A's page stays on screen under the notice; nothing is silently discarded.
Every authored item in this document follows the shared lifecycle: draft → submitted → published → archived, with Daily adding scheduled and voided. "Return to Draft" is an action, not a state. The single global switch Allow Admins to publish (/admin/settings/publishing, Super Admin) decides what an Admin's studio offers: ON → Publish/Update directly; OFF → Submit for approval, and a Super Admin approves the exact submitted revision or sends it back with a reason. Publishing, approving, archiving and deleting are protected writes — each needs a main-site check no older than 15 minutes.
Transition
Who may do it
Notes
draft → published
Super Admin, or Admin while the switch is ON
The item's check must pass first; only the checked revision goes live
draft → submitted
Admin while the switch is OFF
Optional note for the reviewer, up to 500 characters
submitted → published
Super Admin — "Approve and publish" on the exact submitted revision
Editing the draft afterwards makes it Superseded
submitted → draft
Super Admin — "Send back…" with a reason (3–300 characters)
The draft is preserved; the submitter reads the reason
published → published
Same authority as first publish
Edits show "changes not live" until republished; same checks
published → draft
Super Admin — Unpublish / Return to Draft, where the area supports it
Learner records preserved; republish re-checks, never re-arms rewards
any → archived
Super Admin — final
Earned learner records survive; not a Trash state
delete
Per area: drafts any staff; live content Super Admin; only where safe
Names the item; typed confirmation; refuses where learner work would be lost — offers Archive instead
2.1 The publishing switch Super Admin
TC-PUB-001The switch page shows one global on/off and changes it with confirmationP1
Preconditions
Signed in as Super Admin; note the current state first and tell the team you are changing it.
Steps
Open /admin/settings/publishing.
Read the current state, then flip Allow Admins to publish.
Confirm — the main-site check must be fresh — then reload the page.
Expected
One global on/off for all Admins — no per-person switches, no permission matrix.
Changing it asks for explicit confirmation and a fresh main-site check; the change and its old/new values are audited together.
The persisted value survives reload and reads the same in a second browser.
Put it back when done and note the restored state in the case notes.
TC-PUB-003Switch ON: an Admin publishes directly, no approvalP1
Preconditions
Switch ON. Signed in as Admin; a checked challenge draft ready ("QA-VK 15 Nov — publish me").
Steps
In the challenge studio, press Check and publish.
Confirm through the main-site check if asked.
Expected
The lit button offers Publish/Update — not Submit.
The challenge goes live at once on /challenges for learners; nothing waits in Submissions.
Validation, protection and domain rules still apply — the switch grants publication only, not approval powers, Unpublish, Archive or protected settings.
TC-PUB-007The queue orders Waiting oldest-first and Decided newest-firstP2
Preconditions
Switch OFF; at least two Admin submissions exist (create them if needed).
Steps
Open /admin/submissions.
Read the Waiting view; switch to Decided.
Expected
Waiting lists oldest first — nothing waits longest out of sight. Each row: title, its kind label, the submitter, and the submitted time.
Decided lists newest first, each with its state chip: Approved and published, Sent back, or Superseded — with who decided, when, and the reason where given.
Empty states are honest: "Nothing is waiting" / "When an Admin submits content for approval, it appears here." and "Nothing decided yet" / "Approved, sent-back and superseded submissions appear here."
TC-PUB-009A Super Admin's review shows what was submitted, wholeP1
Preconditions
Switch OFF; a waiting submission exists. Signed in as Super Admin.
Steps
Open /admin/submissions, then the waiting submission.
Read the review pane.
Expected
The pane reads "Loading the submission…" until the review arrives — it is fetched apart from the queue.
It shows the item, its kind, the submitter, the submitter's note (where left, above what was submitted), the check result, what the change replaces, and the source record in force with where it differs.
Kinds with a learner preview (challenges, Debug cases, Dailies, lessons) offer "Preview it as learners will see it"; kinds without one show the submitted content itself under "As submitted", part by part (a typing text's passage, a paper's sections/questions, a template's files/checklist…); a part over 12 lines or 1,200 characters folds until asked for.
TC-PUB-010Approve and publish takes the exact submitted revision live — then the next waiting opensP1
Preconditions
Switch OFF; a waiting submission; Super Admin; note what the submitted revision contains.
Steps
Open the submission's review.
Approve and publish, confirming through the main-site check.
Check the queue, the item's learner page, and the submitter's inbox (submit as Admin first if needed). 🖥🖥 helps.
Expected
Approval is publication in one action — the exact reviewed revision goes live; a changed-then-approved draft cannot slip extra edits in.
The row reads "Approved and published" in Decided; the next waiting submission opens for decision (with none, the decided one stays open saying what became of it).
The submitter gets one inbox notice naming who approved what (title and kind) and that it is live now, opening the item's studio — a course decided with its lessons is told once, naming the course.
TC-PUB-016A course submitted with lessons is decided togetherP2
Preconditions
Switch OFF; Admin has a course with details and at least one lesson changed; Super Admin for the decision.
Steps
Admin: submit the course's choice together from the one Publish dialog with a reviewer note.
Super Admin: review from the builder ("Review {n} waiting…") — each item's check, changes, preview and source record.
Approve together, then repeat with a send-back on another submission.
Expected
A waiting item opens read-only until "Edit it"; editing takes only that item out of the queue.
Approve publishes the chosen items together; send back returns them together with one reason (3–300 characters) the author sees on the course and on each item.
The submitter is told once, naming the course, however many items were sent.
Challenges, Tracks, Daily Challenges and Debug Detective share one problem-authoring studio: a page whose sections sit beside it (Details → Statement → Languages & Code → Test cases → Hints → Editorials → the area's own part → Limits). It saves itself about two seconds after typing stops; "Check and publish" (Check and submit / Check and schedule where applicable) saves first, validates the saved revision, then acts — stopping at the first failure and never resuming by itself. The challenge studio is the fullest expression, so the shared behaviours are exercised here and re-checked once per other studio.
Route
Screen
Role
/admin/challenges
Challenges list — search, views, orders
Staff
/admin/challenges/:id
Challenge studio
Staff write · publish per switch · Unpublish/Archive/Delete: Super Admin or safe-draft staff
/admin/challenges/:id/editorial
Challenge editorial studio
Staff write · publish per switch
/admin/challenges-review
Challenge review — solve rates & signals
Staff
3.1 The staff list
TC-STC-001The list searches, filters by view and orders — all kept in the addressP2
Preconditions
Signed in as staff; showcase challenges exist plus one archived (create+archive one if needed).
Steps
Open /admin/challenges.
Type a title search; switch views: All, Waiting for approval, Archived.
Change the order: Saved, newest first vs Title, A to Z.
Expected
Each view says how many it holds for the search as typed; the search, view and order live in the address (?search=…&view=waiting|archived&sort=title).
A value the list does not know is refused — never quietly dropped.
Counts and rows agree; a search with no match differs from a failed read.
TC-STC-003Save states never claim a save that did not happenP1
Preconditions
A draft open; dev tools for going offline.
Steps
Go offline (devtools), type a change; wait.
Try the bar's retry; come back online; wait again.
Expected
Offline, the bar never reads Saved — it reads not saved, tap to retry (or keeps "Unsaved changes" where the studio saves by hand), and backs off after a failed save.
On reconnection it saves at once and then reads Saved — only ever one of: saving · saved · not saved, tap to retry · saved locally.
Leaving with unsaved changes asks first; the check never runs on an autosave.
TC-STC-004Text over a field's limit is typed but not saved — and blocks Check and publishP1
Preconditions
A draft open; a way to paste more than a field's limit.
Steps
Paste over-limit text into a bounded field (e.g. a hint or the statement).
Wait for the autosave; press Check and publish; try to leave the page.
Expected
The text stays in the field — never silently cut — but the bar never says Saved while it is there: "Not saved: a field is over its limit. Shorten it to save it."
Check and publish stops on it; leaving or reloading asks first.
TC-STC-007The check names every blocker at its field and validates the saved revisionP1
Preconditions
A draft missing several required parts (no reference solution, no hidden case, no classification).
Steps
Press Check and publish.
Fix the named problems; run it again.
Expected
The check runs on the saved revision — unsaved typing is saved first — and stops at the first failure.
Each blocking issue is explained at its item/field and leads to the right section; a check that cannot run reads "Not yet verifiable", never Passed.
Publishing requires: complete title/statement, difficulty and classification, a stated comparison rule, ≥1 visible and ≥1 hidden test case, valid starters and reference solutions — each reference passing every test case, no starter already solving the task.
TC-STC-008Fill a hidden case's expected output from a reference solutionP2
Preconditions
A draft with a reference solution written and a hidden test case with input but no expected output.
Steps
Use the fill-from-reference control on the hidden case.
Review each offered value: Accept, Discard, or Accept all.
Expected
Each produced value is shown for acceptance — marked "From the {Python} reference" until edited by hand, and checked against a second reference where there is one.
TC-STC-011Preview shows the learner presentation — and records nothingP1
Preconditions
A draft with hints and hidden test cases.
Steps
Press Preview — it opens in a side sheet.
Read it as a learner would; then check the item's learner-facing stats.
Expected
The preview draws the learner presentation — statement, examples, visible cases — without hidden test cases, reference solutions, internal notes or unrevealed hint bodies.
It creates no solve count, progress, XP or evidence; it is not an unrestricted run environment.
TC-STC-012The editorial has its own studio and is checked like contentP2
Preconditions
A published challenge (or a draft meant for publish).
Steps
Open the Editorial section / /admin/challenges/:id/editorial.
Write an editorial per language; run the check.
Expected
The editorial is written in its own studio at its own address; it is separately authored learner-facing explanation, never the private reference answer.
It is validated — its example must pass — and unlocks for learners only after their first accepted solve.
TC-STC-016Archive is final, Super Admin only, and keeps earned recordsP2
Preconditions
Super Admin A tagged published challenge ready to retire.
Steps
Archive it; look at the staff list's Archived view and the learner catalogue.
As Admin, confirm no Archive control is offered.
Expected
Archive removes it from new discovery and solving while preserving earned learner records — a retirement, not a hidden soft-delete; archived items do not silently reactivate.
TC-STC-017Delete is offered only where learner history is safe — otherwise Archive is offeredP1
Preconditions
One never-touched tagged draft; one published challenge with learner work.
Steps
Delete the untouched draft — it names the item and asks for the typed title.
Try Delete on the one with learner work.
Expected
Deleting an eligible draft: confirmation names it and requires its title typed; mistyped performs nothing; there is no Trash to restore from.
Where learner work exists, delete refuses or explains the consequence — earned solves/XP/retained solutions are never destroyed; the refusal offers Archive.
A deleted challenge leaves no broken selectable link anywhere.
Signed in as staff; showcase challenges have learner activity.
Steps
Open /admin/challenges-review.
Sort lowest solve rate first; filter by review reason if offered.
Compare a challenge's rate with what learners see on its page.
Expected
Staff and learners read the same Solve rate definition on the same population; rates count distinct eligible learners, never repeated tries.
Small samples read "Not enough data"; a never-submitted item reads as unknown, never a zero-success failure; missing figures say unavailable with no invented denominator.
Review signals prompt inspection — nothing declares content defective automatically; staff never see learner source here.
A track is a named, ordered set of its own single-language challenges. Its language is chosen at creation from the runtimes the grading service offers and becomes fixed once the track holds challenges. Track challenges are written in the same challenge studio, fixed to the track's language, each published on its own; the track itself has no code to check and goes live on its summary and description once it holds published problems.
Route
Screen
Role
/admin/tracks
Tracks list — search, views, orders
Staff
/admin/tracks/:id
Track studio — details, challenges, order
Staff write · publish per switch · Unpublish/Archive/Delete: Super Admin
4.1 Language and challenges
TC-STT-001A track's language is chosen at creation and fixed once it holds challengesP1
Preconditions
Signed in as staff.
Steps
Create a track "QA-VK 15 Nov — track", choosing Python.
Add a challenge inside it; look for a language control afterwards.
Expected
The language is offered at creation from the runtimes the grading service runs.
Once the track holds a challenge the language is fixed — a different language means a separately authored track, never reinterpreted source.
TC-STT-003Reordering is deliberate and goes live with the trackP2
Preconditions
A track with at least two challenges.
Steps
Move a challenge up and down with the order controls.
Publish the track; check the learner-facing order.
Expected
Order is changed with up/down controls in the track studio and goes live with the track — one deliberate change, never a series of partially applied moves.
Daily Challenges publishes one staff-selected challenge per product date — the product day runs 09:00 → 09:00 IST. The studio is the shared practice studio plus the Daily's own parts (date, 0–200 XP bonus). Scheduling a date is publishing: it obeys the Allow Admins to publish switch and the main-site check. Once a date's 09:00 passes, its grading fields lock; after that only Void Daily (Super Admin, reason, irreversible) can intervene, making the date neutral for everyone's streak while preserving solves, runs and hints.
Route
Screen
Role
/admin/daily-challenges · ?item=
Daily list + studio (open item is a state of the page)
Staff write · schedule per switch · unschedule/void: Super Admin
/admin/daily-challenges/schedule
Daily schedule — six weeks from today
Staff
/admin/daily-challenges/schedule-health
Schedule health — next seven dates
Staff
/admin/daily-challenges/review
Daily review — last 120 dates
Staff
5.1 Drafting and scheduling
TC-STD-001The list and the studio: shared sections plus date and bonusP1
Preconditions
Signed in as staff.
Steps
Open /admin/daily-challenges; create "QA-VK 15 Nov — daily".
Read its sections and the Daily-specific fields.
Expected
The list reads like the other practice lists — search, views All/Waiting/Archived with counts, orders in the address.
The open Daily is a state of the page (?item=); the shared sections are present plus the Daily's own part: date and bonus (0–200 XP; a new Daily starts at Economy's default, then is its own).
TC-STD-007Once a date begins, its grading fields lockP1
Preconditions
A Daily whose product date has begun (today's, after 09:00 IST).
Steps
Open it in the studio; try to edit the date, difficulty, bonus, classification, offered languages, test cases, reference solutions and comparison rule.
Edit statement wording instead and save.
Expected
The grading fields are locked: date, difficulty, bonus, classification, languages, test cases and fixtures, reference solutions, comparison rule.
Cosmetic corrections are still editable — they do not change grading.
No generic Unpublish bypass is offered for a begun date.
TC-STD-010Learners read schedule changes at once through the cacheP2
Preconditions
🖥🖥 A learner's Daily page open; a tagged checked draft ready.
Steps
Schedule the draft onto a free future date.
On the learner side, open that date's future cell / past list where visible.
Expected
Putting a Daily on a date, moving it, taking it off, archiving, deleting and voiding each move the published view in their own transaction — learners never read a stale schedule.
Future dates never disclose the challenge's title, difficulty or other hidden content to learners — only that a date is claimed.
TC-STD-012Daily review lists 120 dates with honest figures and a scoped CSVP3
Preconditions
Signed in as staff; showcase Dailies have history.
Steps
Open /admin/daily-challenges/review.
Download the CSV and read its first line.
Expected
It lists the most recent 120 dates, newest first: solve rate, solves on the day vs catch-up, graded submissions, hint use, and the median time from a learner's first graded submission to their solve.
The CSV's first line states what it covers; figures never include staff or invented denominators.
TC-STD-013Delete and Archive on Daily keep the begun-date safeguardsP2
Preconditions
Super Admin A tagged draft Daily (untouched) and a begun/past Daily.
Steps
Delete the untouched draft.
On the begun one, look for Delete/Archive and weigh what is offered.
Expected
Draft deletion follows the ordinary safe rules — names the item, typed title.
A begun day's grading conditions cannot be casually removed: Archive/Delete cannot silently replace Void Daily — voiding is the explicit operation, preserving solves and making the date neutral.
TC-STD-014A submission received just before 09:00 still counts for its dateP2
Preconditions
🖥🖥 A learner able to submit near the boundary (or review records around a past 09:00).
Steps
As a learner, submit a correct solution shortly before 09:00 IST on a Daily's date.
Let grading finish after 09:00; check the date's standing and the streak.
Expected
The submission keeps its receipt: received during its date, it counts for that date however late grading finishes — the date reads awaiting its result meanwhile, never a false break.
A submission first received on a later date is catch-up: full award, but it does not repair a missed on-time date.
Debug cases use the shared studio plus the case's own parts: The bug (1–10 planted bugs, 1–3 curated bug types, an optional "This is the bug" text) and a debrief per offered language (broken code, reference fix, validation). Publishing requires visibly different broken and fixed code, a broken starter that fails at least one test case, a fix that passes all, at least one visible and one hidden case, and a checked debrief for every offered language. Material changes to a live case (test cases, languages, limits, comparison, timed settings) must state their active-window impact first: affected windows end as platform-caused with allowances restored — an unavailable count blocks the action.
Route
Screen
Role
/admin/debug-detective
Debug cases list
Staff
/admin/debug-detective/:id
Debug studio
Staff write · publish per switch · Unpublish/Archive/Delete: Super Admin
/admin/debug-detective-bug-types
Bug types
Staff read · add/correct label: Super Admin · never deleted
/admin/debug-detective-review
Debug review — fix rates
Staff
6.1 Authoring a case
TC-STG-001The bug part holds planted bugs, bug types and the optional cueP1
Preconditions
Signed in as staff; create a tagged draft case.
Steps
Open "The bug" part of the studio.
Set planted bugs and bug types; add a "This is the bug" text.
Expected
Planted bugs accepts 1–10; bug types 1–3 from the curated list (its seeded entries include off-by-one, boundary, state, logic, resource, typo).
"This is the bug" is one optional text per case; a new draft's Planted bugs says nothing until a number is typed, and the checks' items about them lead to The bug, not Details.
TC-STG-002Every offered language needs broken code, a fix and a checked debriefP1
Preconditions
A tagged case draft offered in two languages; only one debrief written.
Steps
Run the check.
Complete the missing debrief; run it again.
Expected
The check runs each written language on the grading service: the fix must pass every test case and the broken code must fail at least one.
Every offered language requires a validated debrief — covering root cause, why the starter failed, the repair approach, an important edge case and corrected learner-facing code — before publish.
A case offered only in languages the author wrote broken code for — not every graded language.
TC-STG-003Identical broken and fixed code refuses publish; so does a passing broken starterP1
Preconditions
A tagged case draft.
Steps
Set the broken starter equal to the reference fix; run the check.
Then make the broken starter pass every test case; run it again.
Expected
Both are blockers, named at their source: broken and fixed source cannot be identical, and the broken starter must fail at least one case in every offered language.
Publish also requires ≥1 visible and ≥1 hidden test case with well-formed expected results.
TC-STG-004Case addresses are generated, normalised and uniqueP2
Preconditions
Two tagged case drafts.
Steps
Title one normally and let its address generate.
Give the second the same address by hand; try an invalid address too.
Expected
With none supplied, a readable address is generated from the title and shown; a supplied one is normalised as entered and validated against the shared rules.
An invalid or already-used address is rejected with a clear reason while the draft is preserved; one address resolves to exactly one case.
Changing a title alone does not silently regenerate an established address.
TC-STG-008Unpublish applies the same active-window protectionP1
Preconditions
Super Admin A published case — ideally with an open timed window.
Steps
Super Admin: Unpublish / Return to Draft the case.
Read the impact shown; confirm; check the learner side.
Republish afterwards.
Expected
The action shows the exact affected windows; they end as platform-caused with allowances restored and acknowledged code preserved; if protection cannot be established it does not pretend to complete safely.
Earned fixes, rewards, drafts and retained solutions remain; republish needs the ordinary checks and renews no first-fix rewards; archived is not restored by this.
TC-STG-009Archive/Delete on a live case protects windows and keeps records readableP2
Preconditions
Super Admin A tagged live case to retire.
Steps
Archive it (or Delete a safe one).
Check learner records that referenced it.
Expected
The same active-window protection applies; new starts stop; earned records stay readable.
No invented in-app notification — the persistent affected-window message explains what happened; a deletion that cannot protect history refuses and offers Archive.
TC-STG-011Debug review keeps timed and practice apart, worst firstP2
Preconditions
Signed in as staff; published cases have learner activity.
Steps
Open /admin/debug-detective-review.
Read the columns; export the CSV if offered.
Expected
Every case ever published, lowest Fix rate first: learners, fixes, validations, failures, hint use, median time to fix — timed figures in their own columns, never averaged with practice.
Staff practice is left out; small samples read "Not enough data".
The export states what it covers and says when older cases were left out.
Written Lessons and Video Courses share one hierarchy — Subject → Chapter → Lesson — and one builder: the outline (chapters and lessons, each with where it stands) beside the open item (course details, a chapter or a lesson) with its checklist and panels. Details and lessons save themselves two seconds after typing stops; a live course holds structure moves under "Order changed" until "Apply for learners" makes them one recorded change. Lesson kinds: reading, video, quiz, assigned project, integration reference — a kind is fixed once the lesson is live; changing it names what is lost. A subject that was ever published is archived, never deleted.
Route
Screen
Role
/admin/courses
Written courses list
Staff
/admin/video-courses
Video courses list
Staff
/admin/courses/approvals
Courses on Waiting for approval
Staff
/admin/courses/transfer
Course import and export
Staff
/admin/courses/:content (+ /settings)
Subject details / How it runs
Staff write · publish per switch · archive/delete: SA or safe rules
/admin/courses/:content/chapters/:ch
Chapter (title + delete; lessons live in the outline)
Staff
/admin/courses/lessons/:l (+ /revisions)
Lesson editor / earlier saves
Staff
/admin/courses/:content/order-preview
Learner order
Staff
/admin/courses/:content/publish
Check and publish — the one Publish
Publish per switch
/admin/courses/:content/retirement
Archive or delete a subject
Super Admin (delete: never-published subjects)
/admin/courses/:content/review
How it's going
Staff
7.1 Lists and the outline
TC-SCB-001Courses and Video courses are two lists of the same shapeP2
Preconditions
Signed in as staff; showcase written subjects exist.
Steps
Open /admin/courses and /admin/video-courses.
Use search, views (All, the format's, Waiting for approval, Archived) and orders; press New on each.
Expected
Each list counts and shows only its own format; search, view and order live in the address.
Each card has Edit; New asks only for a title and makes a course of that list's format.
The builder's back link leads to the course's own list.
TC-SCB-002The builder is one page: outline beside the open itemP1
Preconditions
Signed in as staff; a showcase subject ("Python Fundamentals") to read.
Steps
Open /admin/courses/:content for a subject.
Open a chapter, then a lesson, from the outline.
Check the older addresses resolve: /settings, /order-preview, /publish, /retirement, /review.
Expected
The outline — chapters and their lessons, each with where it stands — sits beside whatever is open: the course's details, a chapter, or a lesson, each with its own checklist and side panels.
Every earlier address is a view of this one page: details, settings (How it runs), chapter, lesson, revisions, learner order, the one Publish, retirement, How it's going.
Chapters and lessons are added in the outline; no chapter inside a chapter, no lesson outside one.
TC-SCB-003Outline moves: drag, menus, Alt+↑↓ — held on a live courseP1
Preconditions
A tagged never-published course; a showcase live course.
Steps
On the never-published course, move a lesson by dragging, by its menu, and with Alt+↑/↓.
On the live course, move two lessons; read what the outline says before applying.
Expected
A course never published saves each move at once.
A live one holds its moves under "Order changed" until "Apply for learners" — several moves make one change record and one notice; a stale outline is never applied over someone else's moves (held moves are let go and the author told when the order moves on beneath them).
TC-SCB-004Applying an order needs the publish right and a fresh main-site checkP1
Preconditions
A live course with held order moves; test both: Super Admin, and Admin with the switch OFF.
Steps
As Admin (switch OFF): open the live course and try to apply.
As Super Admin: Apply for learners; then check the learner-facing order and the change record.
Expected
An Admin while the switch is off is told to ask a Super Admin — applying a new order, renaming a chapter and toggling required/optional each need a fresh main-site check and the right to publish.
Applied, the order lands for learners as one recorded change; a video lesson made required must have its captions and transcript first.
Create a reading lesson: add headings, text, a callout, a display-only code block, an image block and a runnable example.
Create a quiz lesson and an assigned-project lesson; note the integration reference kind.
Expected
Reading, assigned project and integration reference lessons use the block editor: headings, formatted text, note/tip/warning callouts, display code, images, executable examples.
A runnable example offers only the runtimes it can run in (plus HTML/CSS/browser-JavaScript where supported); a program may take input; a CSS/browser-JS example may take the page it is shown inside.
An assigned-project lesson selects an available workspace template and required/optional — no invented grader or completion override.
Paste a formatted-text section over 50,000 characters; a code block over 64 KiB; an outcome over 240 characters.
Try a picture over its limit.
Expected
Each exceeded limit is rejected clearly at its field — subject outcomes 1–8, published lesson outcomes 1–5 (each ≤240 chars), heading/callout titles 120, formatted text 50,000 chars, code sections 64 KiB.
A picture over the limit is refused before it is read; a larger one is said to be too large rather than unreadable.
TC-SCB-009A video lesson cannot publish unready or required without captions/transcriptP2
Preconditions
A video-subject draft; a video upload to stage (or an existing Processing/Failed one).
Steps
Watch the upload's state; try to publish the lesson while the video is Processing/Failed or while a required video lacks captions/transcript.
Expected
Staff read Processing, Ready or Failed honestly — a long preparation stays Processing (the operator is told after 30 minutes), never labelled successful.
Publish refuses an unready video or a required video without captions/transcript; a failed upload can be replaced.
Captions added to a video a live lesson already plays reach learners at once — and ask what a publication asks: fresh check + publish right.
A tagged draft course missing pieces (e.g. a chapter holding lessons none of which is going live).
Steps
Open the one Publish (/publish).
Read the blockers; fix them; publish.
Expected
What stands in the way is listed with a way to each item — blockers only, apart from what is ready: a chapter holding no published lesson is the classic blocker on first publication; a chapter with no lessons at all never holds a course back.
Everything chosen goes live in one request or nothing does, naming each item that would not; a live subject gains a lesson the moment that lesson goes live, without the subject being republished.
Also checked: usable unique addresses, outcomes valid, required lessons reachable, parents available before children, no prerequisite circle (names the course that closes it), image sections holding a kept picture.
TC-SCB-011The one Publish dialog: changed items ticked, nothing fake offeredP2
Preconditions
A live course; edit two lessons and the details; leave a third untouched.
Steps
Open Publish.
Read what it offers; untick one and publish; then reopen.
Expected
The dialog offers the course details when changed and every lesson with something new — each ticked; what still has something to fix is listed apart with a way to it.
With nothing chosen its button reads Publish (or Submit for approval), never "Publish 0 lessons"; a draft saved back to the live version reads Live, not "changes not live", and is not offered.
First publication or update asks for a reason in the author's words on update — kept for staff, never shown to learners.
TC-SCB-013Revisions are bounded author undo, named by the save that replaced themP2
Preconditions
A lesson with several saved edits.
Steps
Open the lesson's /revisions.
Read an entry's name; Put this back on one.
Expected
The newest ten of the last ninety days are offered — a save keeps what the lesson said before it, one author's saves within ten minutes keeping one; the version learners see, a put-back and a kind change are always kept.
Each is named by the save that replaced it: "Before the save of 10 Nov 2026, 01:58 IST by Asha".
Put this back fills the draft and never touches what learners see — it must then pass the current checks to go live; after someone else's newer save it is refused as a save is.
TC-SCB-014Preview and order-preview record no learningP2
Preconditions
A course with required/optional lessons and sequential navigation.
Steps
Open the lesson preview and the learner order (/order-preview).
Check for created progress.
Expected
Preview uses the learner presentation and course order — required/optional work and the sequential frontier visible — and creates no enrollment, progress, reward or certificate; executable content does not run.
A failed preview is explained and does not by itself block saving or an otherwise valid publish.
TC-SCB-015A shared draft link reads for a day, can be revoked, and says so afterwardsP3
Preconditions
A draft lesson; a second signed-in account for the recipient view. 🖥🖥
Steps
From the lesson editor, make the read-only preview link; open it as the other person (/course-previews/:previewId).
Revoke it; open the link again.
Expected
The link lets any signed-in person read that draft for 24 hours — no editing, no running an example (examples say as much where Run would be), no quiz, no enrolment, no completion.
A withdrawn or expired link says it is no longer active — it never falls through to the live content; a lesson holds at most ten live draft links.
Open /settings: set navigation, prerequisites, classification and tags.
On the video subject find the certificate switch; on the written one confirm its absence.
Expected
Video subjects offer open/sequential navigation and required/optional lessons — chapter progress derives from required lessons only; written subjects keep their own completion rules.
Prerequisites list each required completion explicitly — never inferred from XP, scores or levels; a configuration that dead-ends a required journey cannot publish.
The certificate switch is on for a new video subject, read at first completion; turning it on later does not back-issue, and off does not remove issued ones; written subjects never award a certificate.
Tags: up to ten of forty letters each — the catalogue filters by them.
TC-SCB-017Retirement shows consequences first: archive keeps, delete is for never-publishedP1
Preconditions
Super Admin A showcase (or tagged) published subject with enrolled learners; a tagged never-published subject.
Steps
Open /retirement on each and read the consequence preview.
Archive the published one; delete the never-published one (typed title).
Expected
The dialog explains what each action affects before confirmation — affected chapters/lessons, live references, learner-facing consequences.
Archive removes new discovery and new starts; existing learners keep readable access and their Course Workspaces; it never resets progress or revokes certificates — and an unfinished required assignment without a workspace is called out.
Delete is offered only for a subject never published — title typed to confirm; a published subject is archived, never deleted, by either role.
TC-SCB-018Import/export is whole-file, all-or-nothing, and never publishesP2
Preconditions
Signed in as staff; a subject to export; a deliberately broken file to import.
Steps
Export a subject from its page.
Import it back at /admin/courses/transfer; then import a corrupted/edited file and an oversized one (>10 MiB or >500 lessons).
Expected
The export file carries the subject, chapters and every lesson's content — no learner progress, no video (it stays with its service), no completions.
Import reads and describes the file before writing, naming problems by place ("chapter 3, lesson 2"); one fault refuses the whole file — nothing is written; a file with many problems names its first twenty and how many more.
What arrives is a draft under the file's own name ("(copy)" on a name clash), with its own addresses — importing never publishes; a foreign file reads "not a course file this platform wrote".
TC-SCB-019How it's going: reach and completion, named as of when — never zerosP3
Preconditions
A showcase subject with learner activity.
Steps
Open /admin/courses/:content/review.
Read the per-lesson figures.
Expected
It says how many learners started and completed the subject and finished each published lesson — with the moment the figures were worked out.
Staff are not counted and nobody is named; figures that cannot be worked out say so rather than reading as zero.
A change learners were told about (the change record) is readable on the subject — Added/Updated/Moved/Removed, when, by whom, and the author's reason.
8 · Typing studio — texts, templates, lessons & the Daily pool
/admin/typing-quest holds every text in one in-page editor: English passages (with their level), code snippets (with their language), templates (language + target time) and lessons (order + steps). The body is a plain monospace field — the code editor would fight writing a text exactly as learners type it — with the checks listed under it as they run. Publish/Submit saves what is unsaved first, then acts on the saved revision through the content engine and the main-site check. Return to Draft and Archive are a Super Admin's; Delete is not offered.
Route
Screen
Role
/admin/typing-quest · ?text= · ?daily
Manage Typing Quest — list, editor, Typing Daily
Staff write · publish per switch · Return to Draft/Archive: Super Admin
8.1 The list and the editor
TC-STY-001The list filters by kind, level, language and stateP2
Preconditions
Signed in as staff; showcase texts exist.
Steps
Open /admin/typing-quest.
Filter by kind (English, Code, Template, Lesson), then level, language and state.
Expected
Filters work together; with none chosen they read Any level, Any language and Any state.
A text opens in its editor as a state of the same page (?text=<id>) — the domain keeps its one staff route.
Each text's figures (rounds, average speed and accuracy) are visible — the signals for spotting too-hard texts.
TC-STY-002The checks run under the body as it is typed — a problem text cannot publishP1
Preconditions
A new text draft open.
Steps
Paste a body with a curly quote (é, —), a tab, a trailing space and an unbalanced bracket in a code text.
Read the check list; fix them; watch the list clear.
Expected
The checks are listed under the body as it is typed; they refuse: any character but the 95 a US keyboard types (naming each once, in order: "These characters are not on a US keyboard: é, —."), a space at a line's end, a blank start or end, and an unbalanced bracket in code.
Length bounds per kind: common words 20–1,000 words ≤24 letters; simple 100–1,500 chars; complex 150–2,500; level check 600–6,000 chars with its 1–5 minutes; code 40–3,000 chars ≤100 lines ≤100 chars; title ≤120; source note ≤300.
A text with any problem cannot be published or submitted.
TC-STY-003Each kind carries its own fields; converting keeps only what the new kind needsP2
Preconditions
A draft text.
Steps
Set it to English — read the level field; to code — the language; to template — language + target time; to lesson — order + steps.
Convert a filled English draft to code and back.
Expected
English asks its level, code its language, a template its language and target time, a lesson its place and steps; choosing code clears the level and time, choosing English clears the language.
Conversion keeps only what the new kind needs — nothing stale lingers invisibly in the draft.
TC-STY-006Lessons: step bounds and a unique place in the orderP2
Preconditions
A draft lesson; a published lesson already holding order place 1.
Steps
Give the draft the same place; run the check.
Break a step's bounds (<10 or >400 chars, >8 lines, tabs, new keys with spaces).
Expected
A place already held is refused at the check, naming the lesson holding it — publishing waits until another is chosen; the editor knows the places other published lessons hold as the place is typed.
Step bounds named per step: 10–400 characters, up to 8 lines of up to 100, US-keyboard characters, no tab, no line-end space, no blank start/end; new keys without spaces.
TC-STY-007The Daily pool switch applies at once to poolable kinds onlyP2
Preconditions
A published simple/complex English passage or code snippet; a common-words list and a level-check passage.
Steps
Toggle "In the Typing Daily pool" on the poolable text.
Look for the switch on the other two kinds.
Expected
The switch sits under "On the way to learners" for a simple/complex English passage or a code snippet — any staff member's, applying at once with no approval (the text itself was already published through approval).
A common-words list or a level-check passage is refused — not poolable; archived or returned-to-draft texts leave the pool.
TC-STY-008The Typing Daily tab replaces future slots only — begun dates are lockedP2
Preconditions
Signed in as staff; texts in the pool.
Steps
Open the studio's Typing Daily (?daily).
Replace a future date's English slot; confirm; try a begun date.
Expected
It lists the next 14 dates, today first, each with its text in English and in each code language — or "Nothing in the pool" for an empty slot.
Replace asks once, naming the slot and its date, the text offered now and the one it would offer instead (titles cut to 40 chars); a toast names the date, text and slot; a choice whose text left the pool gives way to the draw.
A begun date reads Begun — its texts are locked and replacement is refused.
TC-STY-009Add from our content copies lesson examples and challenge starters — never secretsP1
Preconditions
Published showcase content: a reading lesson with a code example, a challenge with a hand-written starter.
Steps
Press "Add from our content" beside New text.
Pick a language; search; inspect what is offered; copy one into a new draft.
Expected
The dialog offers lesson code examples and runnable blocks from published subjects, then challenge starters — up to 25 of each — each with title, file and first four lines.
Never offered: a reference solution, an editorial, a hidden test case, or any other part; code that is empty or too long is not offered; no match says so with Clear filters; a failed read says so with Try again.
The copy lands as an independent draft titled "lesson or challenge: file" with its source note under Copied from — the source changing later never changes it.
One studio serves Mock and Company papers: Mock Tests (/admin/mock-tests) and Company Tests (/admin/company-tests) are two card lists; a paper's parts keep their own addresses inside the studio — Details & Sections → Questions → Import → Checklist → Live paper → Settings → Extra time → Tests → Figures. Parts save by themselves against the revision they were opened from; a conflict offers keep-mine/load-theirs and never merges. Publishing freezes a copy for tests to begin on; a live paper is corrected in place — there is no Unpublish. Questions' kinds are fixed once written; a saved update reaches only future starts.
Staff write · publish per switch · settings/Extra time/invalidation/archive: Super Admin
/admin/tests/:test/recorded-events
Recorded events of one test
Staff
/admin/tests/:test/invalidate
Invalidate a result
Super Admin
/admin/companies/:company/analytics
Company figures
Staff
9.1 Lists, companies and a paper's shape
TC-SPA-001The two card lists count their views and keep state in the addressP2
Preconditions
Signed in as staff; showcase papers exist.
Steps
Open /admin/mock-tests and /admin/company-tests.
Open /admin/papers; use the status views, search and orders.
Expected
Cards with status views and counts: drafts, waiting for approval, published, changes not live, archived — with a title search, two orders, and "Live tests at once" at the foot.
/admin/papers opens Mock Tests, or Company Tests for company papers (?type=company opens the company cards).
Company Tests shows companies as cards: their roles, papers by state (archived left out; a live paper with a waiting change counts as published and waiting) and the learners who started one of its tests this calendar month — staff left out.
TC-SPA-002A new Mock paper starts with Standard strictness and needs category + difficultyP1
Preconditions
Signed in as staff.
Steps
Create a Mock paper "QA-VK 15 Nov — paper".
Read its defaults: strictness, review settings, duration, passing percentage, grace.
Try to publish without category/difficulty.
Expected
Defaults: strictness Standard with every review setting on; duration 60 (5–240); submission grace 60 s (0–300); passing 50% (1–100%); Strict event ceiling 3 (1–10); fullscreen/observation categories optional.
A Mock paper needs a category (free text; the field suggests categories already in use, one per spelling whatever its capitals) and a difficulty — publish blocks without them.
A category typed in other capitals than a published paper's saves in that paper's spelling, shown back as soon as the save answers.
TC-SPA-003A company holds its details, roles and papers — changes are Super Admin'sP1
Preconditions
Both roles. 🖥🖥 helps.
Steps
As Admin, open /admin/company-tests/:company (e.g. Northvale Systems) — read details, roles, papers.
As Super Admin, change a company detail or role (main-site check), then look for Delete/Deactivate.
Try a javascript: address as the company's website.
Expected
Staff read the company's details, roles and its papers by role and state; every change is a Super Admin's through the main-site check, recorded in audit old and new.
A role name must be unique within the company; "New test" makes a draft already in that company with its role chosen from the company's roles.
A company with papers cannot be deleted — it is deactivated instead (removed from browsing, records kept); Delete is for a company without papers, naming what goes.
The website accepts empty or https:///http:// only — anything else is said under the field as typed, holds Save back, and the server refuses it.
TC-SPA-004Sections carry briefing, suggested duration and run allowanceP2
Preconditions
A tagged draft paper.
Steps
Add, name, order and remove sections; give one a suggested duration and a visible-case run allowance; exclude one from the paper.
Expected
Each section carries its subject and an introductory briefing, an optional suggested duration (pacing help — never an enforced sectional limit) and an optional visible-case run allowance (none = unlimited; a configured one is shown to learners).
Included/excluded sections are explicit; changes to a published paper apply only to future starts.
TC-SPA-005Five question kinds — kind fixed once written, penalty never above marksP1
Preconditions
A tagged draft paper with a section.
Steps
Add a question of each kind: single-choice, multiple-choice, numerical, true/false, coding.
Give one a penalty above its marks; try to change a written question's kind.
Expected
Each kind asks its own fields: options + one right answer / the right set / the number + tolerance / the boolean / prompt + languages + starter/reference/cases + limits; every question also has marks, optional fixed penalty, difficulty and skill/topic classification; explanation and target time optional.
A wrong answer loses at most the question's own marks — "At most its marks, 2, so it is not saved." under the field, and the api refuses it naming the question.
A question's kind is fixed once written — changing it goes through add/remove, not a kind switch.
The question is open in every graded language like a challenge; each written reference must pass every test case and no starter may already pass them all.
References are checked on the grading service before the paper can go live; a check that could not run reads Not yet verifiable — and one the full service turns away waits for it (the paper reads as being checked), reading Not yet verifiable only if still turned away a day on.
A change to any coding question — or to which are included — needs the check again; an untouched-questions save (details, other questions) leaves a passed check standing.
TC-SPA-007The paper saves as one document — conflicts never mergeP1
Preconditions
🖥🖥 The same paper open by two staff members.
Steps
A edits details and lets the part save.
B, on the older revision, edits questions and waits for its save.
Expected
Each part saves itself two seconds after typing stops; what is waiting is saved before another part opens.
A save against a stale revision is refused — B keeps theirs (saved over the newer version) or loads the other; never a silent merge; typed input is preserved either way.
TC-SPA-008Question import validates every row and adds all or noneP1
Preconditions
A draft paper; the CSV template downloaded; a batch with deliberate bad rows.
Steps
Open /admin/papers/:paper/import; get the template.
Paste rows: one with a bad kind, one a coding row, one naming a new section, one valid; Check.
Fix and import; then try a batch over 200 questions.
Expected
Check reads every row and names each problem by row and column; nothing is added until every row passes — then it says how many questions go into which section, new ones marked.
A coding row is refused with a pointer to the studio (its cases/references are checked there); a section title not in the paper makes a new section at the end, within limits; blank marks/penalty take the company's then the platform's defaults.
An over-limit batch (>200 questions, or one taking the paper past its 4 MB cap) is refused whole with the bound named — never only the rows that fit.
Imported questions land in the draft even of a live paper; learners see them at next publish.
TC-SPA-009The shared import address leads to the paper's own importer — and nowhere elseP2
Preconditions
Signed in as staff.
Steps
From the paper studio, follow "Import questions".
Open /admin/import/assessment-paper/:paper directly; then /admin/import/<some-other-kind>/:id.
Expected
The studio's import goes through /admin/import/:kind/:id to the owning area's importer — a Mock or Company paper is the one kind with an importer today.
Any other kind is told there is nothing to import into there — no generic importer, no central bank.
TC-SPA-010The checklist reports every failure together, each pointing at its viewP1
Preconditions
A draft paper with several problems (no included section, no questions, missing key).
Steps
Open /checklist.
Fix the named failures; re-check.
Expected
Every failure is listed together — never stopping at the first — each pointing at the view that fixes it.
Checked: usable title, positive duration, an availability window that opens before it closes, ≥1 included section and question, positive total marks, valid classifications, well-formed keys, Mock's passing percentage, Company's owning company + matching role, coding references validated.
An Actual paper needs a dated source and documented permission to reproduce; a Pattern paper must not claim to be an employer's actual released paper.
TC-SPA-011Publishing freezes a copy — ongoing and completed tests keep what they began withP1
Preconditions
🖥🖥 helps. A published paper with a test in progress or completed; edits staged.
Steps
Edit a question and a setting; publish through the main-site check.
Compare a test taken before with a new one started after.
Expected
Publishing keeps a frozen copy of exactly that revision — a test already running or finished keeps the questions, keys, marks, section order, strictness and timing it started with; its result and review never substitute the new content.
The update reaches only tests started after; the same checks apply to updates as to first publish.
"Why, for the record" is not asked at publish (it was never kept); Archive/Delete/Publish/Update confirm through the main-site check.
TC-SPA-013Live settings changes reach learners only when a Super Admin publishes themP1
Preconditions
Super Admin A published paper whose settings are changed.
Steps
As Admin, change a live paper's setting and submit (switch OFF) — or try to publish it (switch ON means direct publish is for content; live timing/scoring settings stay SA's — note which).
As Super Admin, publish the settings change: read each old → new value, the optional notice and its recipient count; confirm.
Expected
A change to a live paper's settings is published by a Super Admin; an Admin's is submitted for approval — and a submission approved later tells nobody.
The confirmation lists each old and new setting, the eligible recipient count, and that a sent notice cannot be recalled; if the count cannot be calculated there is no confirmation against an invented audience.
"After a test" says a result keeps the settings its test began with — the change reaches only tests started after it and open practice as it now stands.
TC-SPA-014A relief grant rides only with a notice — one more test for already-finished learnersP2
Preconditions
Super Admin A live paper with finalized learner results; a settings change ready to publish.
Steps
Publish with the notice on and the relief grant chosen.
Check who was told and who got the grant; try to grant without the notice.
Expected
The grant is offered only with the notice: learners who had finalized on that paper get one more recorded test; learners not yet tested or still in progress get none; grants do not stack — a holder of an unused grant keeps just that one.
The learner's notice says what changes after their next test in a sentence; a grant's notice survives the learner's Delete/Clear.
The change and grants are kept on the publication's transaction; notices go out afterwards a page at a time, retried until raised, never undoing the change; learners being erased are skipped as each page is told.
Audit keeps the settings as from → to and "Gave relief grants" with how many.
TC-SPA-015Downgrade to Pattern relabels a live Actual paper everywhere — never the reverseP2
Preconditions
Super Admin A Company paper whose live copy is Actual (or stage one).
Steps
Super Admin: More → Downgrade to Pattern, give a reason, main-site check.
Read the draft, the live copy, a frozen copy's result and the audit trail.
Look for a way to make a Pattern paper Actual.
Expected
The label becomes Pattern on its draft, its live copy and every frozen copy — results already taken read Pattern; nothing else changes; it is audited with the reason.
A later Actual is only ever a new publication: results keep the label of the copy they began on; a finished Pattern test is never relabelled Actual.
TC-SPA-016Extra time: staff read the list; only a Super Admin gives or removes itP1
Preconditions
Both roles; a learner who has signed in (tester-learner-1); a published paper.
Steps
As Admin, open /admin/papers/:paper/accommodations.
As Super Admin, find the learner by name and give 1.5×; then remove it.
Expected
Both staff roles read who has extra time; the page tells an Admin giving/removing is a Super Admin's and offers them neither.
Learners are found by name from two letters, twenty at a time; multipliers 1.25, 1.5 or 2.0 — or the usual time set on purpose (1.0 is never silently reported as an accommodation).
It cannot be given or removed while that learner's test on the paper is in progress or while their account is being erased; it applies to the next Start — the learner's paper page and clock show the lengthened time and that it includes agreed extra time.
Each change is audited with its old and new value.
TC-SPA-017The tests list shows standing, never a score — and bulk-invalidate is Super Admin'sP1
Preconditions
Super Admin A paper with learner tests (showcase papers have some).
Steps
Open /admin/papers/:paper/tests.
As Super Admin, choose two ended tests and invalidate together — one reason, one note, one main-site check.
As Admin, read the same list.
Expected
Newest first: the learner's name, when it started, where it stands, how it ended and its counted events — never a score or an answer; a test still grading an hour on is marked and reads that it keeps trying, not a technical reason.
Bulk invalidation gives each test's outcome — invalidated, already invalidated, or refused with why — each under the single test's rules; only an ended test (being graded or final) can be invalidated; none of someone being erased.
The note is a Super Admin's to read — an Admin never sees it; the learner reads only the reason's sentence.
TC-SPA-018Recorded events show the ordered timeline — Off says nothing was recordedP2
Preconditions
A paper with tests at different strictness levels (Off included if possible).
Steps
Open /admin/tests/:test/recorded-events for a Standard/Strict test, then an Off one.
Expected
The facts of the test and its events oldest first, each marked counted or not — read-only; no screen/audio/video capture, clipboard contents or inferred misconduct.
Under Off it says nothing was recorded because of the setting — a recorded Off is never presented as missing monitoring data.
Super Admin An ended learner test (ideally a relief-grant test and a replaced result somewhere to observe consequences).
Steps
Open /admin/tests/:test/invalidate; choose a reason, write a note, confirm through the main-site check.
Check the learner's history, XP and Skills; try invalidating again.
Expected
The flow is reason → note → confirm → done, offered only once the test has ended; the reasons are a fault on our side, faulty content, account security and a staff decision.
The test keeps its place in the learner's history as Invalidated with the reason's sentence — the private staff note never reaches the learner; the paper can be taken again; Mock XP is reversed through Economy (paid instead to another valid Mock test of theirs where there is one, and the confirm says so); skill evidence is set aside; achievements stay earned.
Invalidating a relief-grant test gives the grant back and the replaced result stands again; invalidating an already-replaced result leaves the newer one and gives no new test; repeating invalidation has no duplicate effect.
TC-SPA-020Archive is final and says how many relief grants it endsP1
Preconditions
Super Admin A tagged live paper — ideally one holding unused relief grants.
Steps
Archive the paper; read the confirmation first.
Check the catalogue, a running test, and a grant holder's paper page.
Expected
Archive retires the paper from catalogues and stops new starts — final, never a republish loop; existing tests finish under their original rules and history stays readable.
Its confirm says how many unused relief grants it ends before it is pressed; a grant holder's paper page tells them it can no longer be used; no notice is sent.
No score is invalidated and no earned history removed by archiving.
TC-SPA-021Delete keeps frozen copies; Duplicate to… copies a Company paper across companiesP2
Preconditions
Super Admin A tagged paper with tests taken; a Company paper.
Steps
Delete the paper — read what the confirm says.
On a Company paper, More → Duplicate to… another active company; try it on a Mock paper.
Expected
Delete says how many tests were taken on it and how many are still running; the frozen copies keep those tests gradeable and reviewable — the staff list of a deleted paper's tests still answers; deleting never cascades into learner results.
Duplicate to… puts an independent draft in another active company — no role chosen yet, no Actual label and no source (the copy re-declares Actual/Pattern with its own permission); the server refuses an inactive company and refuses Duplicate-to for a Mock paper.
TC-SPA-022Paper figures and company figures: learner-only, dated, pass rate for Mock onlyP3
Preconditions
Papers and a company with learner tests.
Steps
Open /admin/papers/:paper/analytics on a Mock and a Company paper.
Open /admin/companies/:company/analytics; read the question review prompts.
Expected
Each reads learners' recorded tests only — says so and when it was worked out: learners, tests started, share of ended tests submitted, average score (a tenth, rounded down), accuracy, middle result's time, results by score, section averages, tests per day for thirty days, and per-question results/accuracy/skips/partly-right with its prompts.
Pass rate appears for Mock only — Company figures have no pass/fail measure; a company's figures list its papers lowest completion first.
The six neutral prompts (accuracy <25% or >95%, skipping >35%, slow answering, partial credit ≥40%, grading failures) are advisory — never a verdict on a question or a learner; staff tests are left out; the questions export is CSV.
Templates are staff-authored starting projects — a name, description and technology; a topic (whose skill is the primary); a language from the project's runtime list; text/code files with a start file; and an optional ordered checklist of up to 12 tasks. A template saves whole against its read revision (≤12 MiB with files); the check runs on the worker — a terminal starter must exit 0 or still be running (waiting for input), a web starter must contain every file its start page names, a SQL starter's statements are run on a fresh database, a Flask app's files and compiles are proven without running it. Only a revision that passed goes live; Return to Draft and Archive are a Super Admin's.
Route
Screen
Role
/admin/workspace/templates
Template cards — views, search, order
Staff
/admin/workspace/templates/:templateId
The template studio — Details, Files, Checklist, check
Staff write · publish per switch · Return to Draft/Archive: Super Admin · Delete: staff on never-published, SA otherwise
10.1 The list and the studio
TC-SWT-001The card list shows views, counts and projects-made — never whoP2
Preconditions
Signed in as staff; the showcase template set exists.
Steps
Open /admin/workspace/templates.
Use the status views, search and orders; load more.
Expected
Status views with counts for the search as typed: All, Draft, Submitted, Published, Archived; orders Recently saved / Name — all in the address; 25 more per load.
Each card names the language by its runtime-registry name ("Python 3.14", "React", "SQL in the browser"), its status and whether changes are live, when and by whom saved, its files, its tasks, and how many projects were made from it — a count, never who; the one action is Edit.
TC-SWT-002A template drafts whole — over-limit text stays typed and unsavedP1
Preconditions
Signed in as staff.
Steps
Create "QA-VK 15 Nov — template": name, description, technology, topic, language, two files, a start file, three checklist tasks.
Paste over-limit text into a bounded field and try to save.
Expected
Details, Files and Checklist sit beside their index with the checks beside them; a template is classified by one topic whose skill becomes its primary skill.
Text past a field's limit stays in the field and is not saved — the bar keeps "Unsaved changes" while it is there; a server refusal names the part and its limit in the studio's words ("A task (number 3) is over the most it can hold, 120 characters.").
Removing a file or task acts at once with an Undo toast — Undo puts a file back with its start file and the tasks about it.
TC-SWT-003The check runs on the worker like a learner's project — per starter kindP1
Preconditions
Drafts of a terminal starter (e.g. Python) and a web starter; a deliberately broken one.
Steps
Run the check on the good starter and on the broken one.
Read the failure output.
Expected
A name, a description, a topic, a language and at least one file are needed before a check; technology and checklist optional.
A terminal starter passes on exit code 0 or still running after its watch (waiting for input counts); otherwise it fails showing the first 2,000 characters it printed; compiled languages are watched for their build time too.
A web starter passes when its start page and every file it names are present; a SQL starter's statements run on a fresh database; a Flask app's checks prove files and compilation — and say they do not prove the app runs.
The result belongs to the revision checked — a later save needs a new check before publish.
TC-SWT-005Return to Draft, Archive and Delete protect existing learner projectsP1
Preconditions
Super Admin A published template learners have created projects from (a showcase one); a never-published tagged draft.
Steps
Read the projects-made count on the published one, then Return to Draft it — or Archive it.
Delete the never-published draft; try Delete on a published template as Admin.
Check a project made earlier still opens.
Expected
Return to Draft and Archive are a Super Admin's; each says how many projects were made from the template — and none is touched: existing learner projects and course-assignment starters stay independent.
Delete is any staff member's for a template never published, a Super Admin's for any — projects made from it are copies, so no learner's work goes with it; the confirm explains the effect without ever exposing learner project names or files.
An archived template leaves the picker and new selection; a course assignment keeps the starter it captured.
TC-SWT-007The studio never opens a learner's project — there is no inspection pathP2
Preconditions
A learner project exists (a tagged template instantiated by tester-learner-1).
Steps
As either staff role, hunt for any way to open that project's files — the template's page, the learner's support view, any link.
Expected
None exists: no open-as-learner, file-inspection, grade-project, completion-override or promote-learner-project-to-template action — staff manage templates, not learners' project content; project limits are not adjustable from this studio.
The content engine owns the shared classification — skills and their topics — and Administration hosts its page at /admin/vocabulary, a Super Admin's page: the skills stand beside the chosen one's topics (?skill=) with the lifetime allowance as a meter. Every write (add a skill, add a topic, correct a label, archive a topic) goes through the main-site check at confirm and is audited; a label correction preserves identity — a meaning change needs a different classification, never a misleading rename. Bug types are the debug list's own page (§6.3).
Route
Screen
Role
/admin/vocabulary · ?skill=
Skills and topics
Super Admin
11.1 The page and its roles
TC-VOC-001The page stands the skills beside one skill's topics with the allowance meterP2
Preconditions
Super Admin Signed in.
Steps
Open /admin/vocabulary; choose a skill (?skill=).
Read the allowance meter.
Expected
Skills beside the chosen one's topics; the lifetime allowance reads as a meter — the ceiling is 2,000 entries counting active, archived and merged-source alike; it warns above 1,800.
The difficulty scale and language catalogue are read-only here.
TC-VOC-005Archiving a topic reads what carries it first — and is never undoneP1
Preconditions
Super Admin A topic attached to tagged items across a couple of areas (tag a challenge and a course first).
Steps
Archive the topic from its row.
Read the affected-content dialog; confirm with a reason through the main-site check.
Expected
First the dialog reads what carries the topic: every authored item tagged with it, whatever its state, counted by area (challenges, track challenges, Debug cases, Dailies, courses, Workspace templates, papers) — each area opening to its items by title, linked to its editor.
While that cannot be read, Archive waits — never confirmed against a guess; the reason (3–300) is kept in audit; however often asked, it happens and is recorded once, and is never undone.
Afterwards: the pickers omit it for new choices; items already carrying it show "(archived)" and can take it off; learner topic filters omit it; a paper's question import refuses it; what carries it keeps it readable, checks still accept it, it still counts against the lifetime ceiling and its label stays taken.
Each area keeps source defaults — author, owner, source, permission to use, permitted uses, cited-as-of date, company-name/logo basis, third-party/generated contributions — and each item can carry its own values. /admin/provenance lists the items whose own values differ from their area's defaults (newest first, twenty a page), with each area's defaults folded behind its name. Every publication keeps the record in force with that revision; a Super Admin changes defaults in place through the main-site check, and a provenance downgrade is audited. /admin/import/:kind/:id opens the owning area's importer for one item — today that is only the assessment paper's.
Route
Screen
Role
/admin/provenance
Content sources
Staff read · changing defaults: Super Admin
/admin/provenance/:kind/:id
One item's source record
Staff write own values
/admin/import/:kind/:id
Import into one item
Staff
12.1 The sources list and a record
TC-SRC-001The sources list leads with the items that differ from their defaultsP2
Preconditions
Signed in as staff.
Steps
Open /admin/provenance.
Open an item; unfold an area's defaults.
Expected
Items whose own values differ from their area's defaults list first, newest change first, twenty a page — each opening its source record; an item differs too where the area sets no default and the item sets one.
TC-SRC-002Changing an area's defaults is a Super Admin's audited, checked writeP1
Preconditions
Super Admin
Steps
Unfold an area's defaults; change one in place (main-site check).
As Admin, confirm the same change is not offered.
Check the audit entry.
Expected
A Super Admin changes an area's defaults in place, recently checked with the main site and recorded in the audit history — a provenance-downgrading change is audited.
Either staff role prepares an item's own values; only the Super Admin changes defaults.
TC-SRC-003A source record marks each field's origin and keeps its historyP2
Preconditions
An item with its own values (or a submission review linking to one).
Steps
Open /admin/provenance/:kind/:id.
Edit one own value from the bar at the foot; read the history.
Expected
Each field shows the record in force — marked when it is the area's default or differs from it — the item's own values, the record kept with its latest publication, and every change.
Each publication in the history names the staff member who made it go live (directly or by approving); the cited-as-of date reads as a day ("27 Oct 2026").
TC-SRC-004A later default change never rewrites what a publication stood onP2
Preconditions
Super Admin An item published under today's defaults.
Steps
Publish the item; change its area's defaults.
Re-open its source record's history.
Expected
The record kept with the publication still shows what it stood on — the changed default does not reach back; a submission's review shows the record in force and where it differs before approval.
Learners report existing content (a lesson, a challenge — a track challenge reports its track — a track, a Debug case) as Spam, Incorrect, Inappropriate or Other, with a note up to 500 characters that Other requires. /admin/reports is one queue both staff roles work: one row per reported item, items with an open report first, the longest waiting first; each row carries its reasons and how many of each, how many reports, the oldest and its most pressing state. Staff never see who reported. States: Open → Investigating → Resolved / Dismissed; reopen only with a reason.
Route
Screen
Role
/admin/reports
Content reports — the queue
Staff
13.1 The queue and its moves
TC-CRP-001The queue's rows, filters and counts are realP1
Preconditions
Reports exist on a few items (file some as learners first if the queue is empty).
Steps
Open /admin/reports.
Filter by area and by state; compare counts to rows; page through.
Expected
One row per reported item — its reasons and how many of each, how many reports, the oldest and its most pressing state; open items first, longest waiting first; 20 to a page.
An area filter narrows rows and the status counts; a status filter narrows rows, not the cross-status breakdown — every state and area says how many reports it holds, and zero counts are real.
TC-CRP-002An item's panel shows every report, its history and the way to its editorP2
Preconditions
An item with several reports (one with a renamed title if possible).
Steps
Open the item beside the queue at its own address.
Read each report's note, state and moves.
Expected
Each report shows the item as learners open it now, with "Reported as …" when its title changed since; the reason and note, its outcome or dismissal, every move with who made it and when — fifty reports at a time.
The way to the item's editor is offered only while learners can open it — it does not pretend the editor shows the historical screen.
Staff never see who sent a report; the note stays staff-readable.
TC-CRP-003Moves: Open↔Investigating, resolve with an outcome, dismiss with a reasonP1
Preconditions
An open report.
Steps
Mark it Investigating, then back to Open.
Resolve it — try each outcome (Corrected / No action / Escalated / Duplicate) with and without the optional note.
Dismiss another without a reason, then with one.
Expected
Open and Investigating move between each other or to closed; moving a report to where it already is changes nothing; repeated moves create no duplicate actions.
Resolve records the outcome with an optional note named by it — the correcting change, why nothing needs changing, where it went and why, or which report it repeats; a note past 200 characters is kept whole and said to be too long while Resolve waits.
Dismiss requires a reason; the history reads Back to open, Reopened, Resolved with its outcome.
TC-CRP-005Bulk moves apply per report — the page says how many moved and why notP2
Preconditions
Several items selected.
Steps
Choose several items; mark investigating / resolve / dismiss together.
Read the result message.
Expected
One request moves each item's reports the move may take — at most the 500 oldest — each still on its own: one refusal undoes nothing, and the page says how many moved and why any did not, saying when more are left for the same move again.
TC-CRP-006Removed or unreachable content keeps its reports — and says soP2
Preconditions
A report exists on a tagged item; then archive/delete that item (or use one learners can no longer open).
Steps
Remove the content learners-side.
Re-open the report row.
Expected
Removed content does not remove the report: the row says learners can no longer open it, under the title it was last reported as — never passing the old title off as current.
An item its area could not be asked about just now says that too; the editor link is offered only while learners can open it.
/admin/content-gaps (under Insights) shows demand in two separate panels: "Asked for" — the topic requests learners filed — beside "Searched for and not found" — WizBit's recurring safe product-help search misses. The two are never summed into one figure; neither panel exposes requester identity or raw queries; one unavailable source does not blank the other, and search outages are not counted as demand.
Route
Screen
Role
/admin/content-gaps
Content gaps
Staff
TC-CGP-001Two separate panels — never one summed figureP2
Preconditions
Signed in as staff; topic requests exist (file one as a learner if needed).
Steps
Open /admin/content-gaps.
Read both panels.
Expected
"Asked for" (topic requests) beside "Searched for and not found" (WizBit search misses) — each its own counts, never added together.
Neither panel exposes requester identity or raw queries; a failed lookup is not a content gap.
These hold across every screen in this document — run them wherever a case lands, and once deliberately here. They are the staff-side half of the handbook's universal rules (index §8).
TC-CON-012The stale main-site check turns every protected write into "Confirm on the main site"P1
Preconditions
A session whose check is over 15 minutes old (idle past it, or re-verify only at sign-in).
Steps
Try each protected write with the stale check: publish, archive, delete, a submission decision, a vocabulary add, a company change, an invalidation.
Type a reason/note first, then take the trip and return.
Expected
Every confirming button reads "Confirm on the main site" once the check has lapsed — the session itself says until when it is fresh.
You come straight back to the same address; what you typed (reasons, notes, labels, a change's own id) is held in the tab and restored — the same change confirms once. A typed name confirmation is typed again.
The api still refuses a write sent with a stale check regardless of the button — the trip is convenience, not the guard.
TC-CON-015The audit trail shows an Admin content-kind entries onlyP1
Preconditions
Both roles; some writes from today's session exist (publishes, vocabulary changes, an invalidation, an accommodation). 🖥🖥 helps.
Steps
As Admin, open /admin/audit; filter by action, who, item and day.
As Super Admin, read the same trail; open an action-on-people entry (e.g. an invalidation) and then try it as Admin.
Expected
The trail groups entries by IST day — action, item, time and who (by role name, or "The platform, automatically"); an entry opens beside the list at its own address.
Admin reads the content entries — publications, approvals, skills and topics — and is offered only the actions an Admin can read; an action-on-people or settings entry reads to an Admin as not found.
Super Admin reads the whole trail; no role can edit or delete entries; a content change shows as from → to where it carries one.
TC-CON-016Unavailable is never zero or empty on staff pagesP1
Preconditions
Dev tools to fail selected reads.
Steps
Block one read at a time on: a staff list's counts, a review page's figures, schedule health, the submissions queue, content reports.
Reload and read each failed panel beside the working ones.
Expected
A failed read says so — never rendered as 0, an empty list, or a falsely healthy state; usable panels keep their information when another fails.
Lists show actual counted totals only — a failed count does not erase readable rows; an unavailable exact impact count blocks the irreversible action relying on it (never confirmed on an estimate).
Nothing authored, no matches, unauthorized, unavailable and a genuine zero are five different states.
TC-CON-017Over-limit input is held and named — never silently cutP2
Preconditions
Any bounded field in any studio.
Steps
Paste text past a field's limit; paste a CSV row past a bound; drop an oversized file on an upload.
Expected
The text stays typed and the save state stays honest — "Not saved: a field is over its limit…" or "Unsaved changes" — until shortened; nothing is silently truncated or partly saved.
A document over its cap is refused with the cap named (lesson/paper 4 MB; challenge/Daily/Debug/template 12 MB; subject import 10 MB) and nothing is saved.
TC-CON-018Staff pages read as Wizly Learning — no spec sentences, raw errors or leaked internalsP3
Preconditions
Any session.
Steps
Walk today's screens reading the words: headings, empty states, refusals, confirm dialogs.
Expected
No "Labs", no internal state names, no specification sentences, no raw errors or secrets in any message — a calculated figure may say when it was worked out in plain words.
Times and dates are labelled IST where a learner or colleague could misread them; numbers use Indian grouping.
TC-CON-019Console and studios stay usable at phone and tablet widthsP3
Preconditions
Browser at 390 and 768 px.
Steps
Walk the queue, a practice studio, the paper studio's index, the course builder's outline and the reports queue at both widths.
Expected
Nothing overflows or traps; the console's bottom dock serves navigation; a practice studio's checks sit behind a Checks button on a narrower screen; confirm dialogs remain reachable and readable.
Authoring stays a computer-shaped job but never breaks or lies at a small width.
Tab through the console nav, a staff list's filters, a studio's sections and a confirm dialog.
Expected
Navigation is usable with a keyboard; focus is visible; dialogs trap and return focus to their opener; destructive confirms still need their typed text — no accidental confirms.