End-to-End Journeys

Pipelines across domains and roles · each journey lists its cast: learner / staff / two browsers · app under test: https://app.sprinklejelly.com

Before you run these

A journey is a pipeline: it starts in one place, crosses features — and usually roles — and ends somewhere else, with the product's promises checked at each hand-off. Page-level behaviour (a button's states, a list's paging, a form's validation) is covered in docs 01–05; a journey references those case IDs where a step is already covered page-deep, and only asserts what the hand-off must deliver.

Anatomy
Cast — who must be signed in where · Steps — the pipeline, with the expected hand-off inside each step · Expected — at every step — the invariants that hold throughout · Also try — edge legs worth taking while staged
Tags on the cast line
🖥🖥 two browsers needs two signed-in people (or learner + staff) at once — use different accounts in different browsers or a normal + private window. Super Admin needs sprinklejelly/yashmini. destructive — coordinate changes shared state other testers see; announce it in the team channel first.
The one-account trap
One web session per person — newest wins. Every 🖥🖥 journey uses different accounts, except TC-JRN-42, which deliberately signs the same account in twice. Sign back in between legs if the older browser was displaced.
Timing
The product day rolls at 09:00 IST. Journeys marked "timing" wait for real clocks — run them when you can keep a browser open or across two sittings, and mark N/A with a note rather than faking a wait you did not do.
Generated assistance
GENERATED_ASSISTANCE=false on this deployment: Credits and AI help legs are absence checks — verifying nothing appears is the test (TC-JRN-33).
Reporting
Report by journey ID (e.g. TC-JRN-19) and name the leg that failed ("step 5: learner never received the notice").

The rules that judge every leg

Unavailable is not empty · unknown is not zero · nothing claims it saved when it didn't · platform failures never look like the learner's failure · hidden material stays hidden · not-found is privacy-safe · once means once · pending is named, not faked · people-facing text says "Wizly Learning", never "Labs". The full table is in index.html §8 — any journey fails on them even when its own steps pass.

A · First-day learner

What a brand-new account experiences, in order: the main-site handoff, the one-time orientation, the first solve and all it produces, the first Daily, the first lesson — and coming back the next day. These are the journeys every other journey quietly assumes.

TC-JRN-01First sign-in: main site → handoff → orientation → HomeP1

Cast

A learner account that has never signed in to Labs (the orientation runs once per account — if every tester account has already been in, re-run the sign-in/orientation legs anyway and mark the "only once" expectations from your first run's notes).

Steps

  1. Fully signed out (clear cookies or a private window), open https://app.sprinklejelly.com → you land on /handoff saying Signing you in and are sent to the WordPress main site — once, in that tab.
  2. Sign in on the main site as the learner → you are returned to the app with a session and land on Home (/). No sign-in or sign-up form exists anywhere inside the app.
  3. On the first arrival, WizBit's orientation dialog opens on Home: an introduction, then exactly four landmarks lit one at a time with the rest of the page dimmed — the Continue card, the primary navigation, where help is, and Settings — then a theme question.
  4. Pick Halo at the theme question → it previews live → answer the closing presentation question → the orientation closes and Home is fully usable.
  5. Home greets by the main-site display name (a time-of-day greeting in India time when there is none), with the page's regions: Continue, today's Daily, the suggestion or Tests to take, your record, Notes and news.
  6. Reload Home, open a second tab, sign in again → the orientation never opens again on its own.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-02First accepted solve, and everything one acceptance producesP1

Cast

A learner with at least one unsolved easy challenge (showcase: "Running Total of Marks", "Balanced Brackets", "Climbing the Stairs").

Steps

  1. /challenges → open an easy challenge → note its standing Not started and the XP shown beside it (30 XP for easy).
  2. Choose a language, write a deliberately wrong program → Run → the visible examples fail, with output, errors and case results clearly separated. Run costs nothing and creates no submission.
  3. Submit → the same wrong code is checked against every case including hidden ones → verdict is not accepted → standing becomes Tried on the page and on the catalogue card.
  4. Fix the program → Run passes the examples → Submit → Accepted.
  5. Check the wake the acceptance leaves: the challenge reads Solved; /solutions holds a new entry under Challenges; the accepted result offers Read the editorial (where authored), Next challenge and Open it in My Solutions; the editorial tab is now unlocked.
  6. /xp-history → newest entry is the award with its source and amount (30 XP); the shell's level pill re-reads to the new total.
  7. /inbox → if the award crossed a level boundary (250 XP to Level 2, 1,000 to Level 3) there is exactly one Level Ups notice; an ordinary solve sends no inbox message of its own.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-03First Daily, and the product day that follows itP1

Cast

A learner; today's Daily is published (the showcase seeds one per date). Two sittings, one product day apart, or a staged equivalent.

Steps

  1. Home → the Daily card → today's Daily opens (/daily-challenges), showing difficulty, base reward and bonus where present, languages, Solve rate and when it closes: Open until 09:00 IST tomorrow (after 09:00) or …this morning (before 09:00).
  2. Solve it before the product day ends → accepted → the streak reads 1; today's calendar cell reads Solved; XP history shows the difficulty award plus the Daily's authored bonus (40 XP where the default applies).
  3. Come back after the next 09:00 IST → the streak still reads 1 and today's unsolved date shows At risk today.
  4. Solve that day's Daily → streak reads 2; the "At risk" warning clears.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-04A course lesson → Home Continue → the next-day returnP1

Cast

A learner; a showcase written subject ("Python Fundamentals" / "Data Structures in Python" / "SQL Basics"). Two sittings or a staged equivalent.

Steps

  1. /courses → open a subject → Start now → the first lesson opens in the lesson player.
  2. Read it → Complete and continue (Complete lesson on the last) → the next lesson; the lesson is marked done in the outline.
  3. Leave the subject and open Home → the Continue card names the subject at the lesson last opened — its kind, title, course, chapter and place, with the course's progress.
  4. Continue → you land on that saved position, not the subject's start and not the next lesson.
  5. Sign back the next day (same account, same browser) → Continue still resumes the same place.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-05The grand tour — every space opens honestly on day oneP2

Cast

A learner, fresh after TC-JRN-01.

Steps

  1. Walk each navigation destination in turn: Home, Courses, Video courses, Challenges, Tracks, Daily Challenges, Debug Detective, Code Lab, Typing Quest, Mock Tests, Company Tests, Test results (/test-results), the Assessments dashboard (/tests-dashboard), My Projects (/projects), Tools (/tools), My Solutions (/solutions), Achievements (/achievements), XP history (/xp-history), Skills (/skills), Recap (/recap), Inbox (/inbox), Quick Notes, Topic Requests (/requests), Profile, Settings.
  2. Open /aptitude and /bounties directly.
  3. Try /credits and /credits/history directly.
  4. Try a nonsense address and any /admin/… address.
  5. Click every Quick-launch tile on Home (Challenges, Daily Challenges, Debug Detective, Code Lab).

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________

B · Content pipeline — author → publish → learn

The lifecycle every piece of authored content lives: draft → submitted → published → archived. These journeys prove the pipeline end to end — that a studio draft becomes catalogue content a learner can solve, that the learner's records survive the content's retirement, and that the publishing switch and the submissions queue gate exactly what they should. Studio mechanics are covered page-deep in doc 04; here we care about the hand-offs.

Coordinate the publishing switch

Allow Admins to publish (/admin/settings/publishing) is global — it changes what every Admin's studio offers. Note its state before touching it and put it back; the queue journeys need it off, TC-JRN-08 needs it on.

TC-JRN-06Challenge pipeline: draft → submitted → approved → catalogue → solvedP1

Cast

🖥🖥 two browsersSuper Admin Admin (tester-staff-1) in one browser, Super Admin in another, a learner for the last leg. Prerequisite: Allow Admins to publish is off.

Steps

  1. SA confirms the publishing switch is off (/admin/settings/publishing). Note its previous state for cleanup.
  2. Admin: /admin/challenges → new challenge → title it "QA-<initials> <date> — …" → write the statement, pick languages, starters, at least one visible and one hidden test case, a reference solution that passes every case, difficulty easy, a topic → save the draft.
  3. Run the studio's checks → all green → Submit for approval (Publish is not offered while the switch is off). The item now waits in /admin/submissions.
  4. SA: open /admin/submissions → the item appears in the queue → open it → the review pane loads ("Loading the submission…" first) with the learner preview, the submitted changes, validation results and impact.
  5. SA: Approve & publish → one action; the item leaves the queue and is published at the exact revision reviewed.
  6. Admin: the inbox receives a System notice — "Your submission was approved", naming who approved what (title and kind) and that it is live; it opens the item's studio page.
  7. Learner: /challenges → the QA challenge is findable → open it → solve → standing Solved, XP paid, Solutions entry — exactly as TC-JRN-02.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-07Sent back with a reason → fixed → resubmitted → approvedP2

Cast

🖥🖥 two browsersSuper Admin Admin + Super Admin + the same QA draft as JRN-06 or a new one. Publishing switch off.

Steps

  1. Admin submits a QA draft for approval.
  2. SA opens its review → Send back with a reason ("the third example contradicts the statement").
  3. Admin's inbox: "Your submission was sent back" naming who sent it back, with their note, telling them to make the changes and submit it again; it opens the studio page.
  4. The draft is editable again → Admin fixes → Submit for approval → a fresh queue entry.
  5. SA approves → published; the submitter's approval notice arrives as in JRN-06.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-08Switch on: an Admin publishes directlyP2

Cast

🖥🖥 two browsersSuper Admindestructive — coordinate SA + Admin + a learner. The switch is global — announce before flipping.

Steps

  1. SA turns Allow Admins to publish on at /admin/settings/publishing (recent main-site check; the change and its old/new value land in the audit history).
  2. Admin's open studio is refused the moment its next save meets the new policy — or on a fresh save now offers Publish rather than Submit. Admin publishes the QA item directly through the checklist.
  3. Learner sees it in the catalogue at once; no queue entry ever existed.
  4. SA turns the switch back off → an Admin studio left open gets its next Publish refused, says so, re-reads the item without a reload and offers Submit for approval with the draft kept.
  5. Audit history holds both switch changes with who and the old/new value.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-09A submission the draft moved past is refused, never approved blindP2

Cast

🖥🖥 two browsersSuper Admin Admin + Super Admin. Publishing switch off.

Steps

  1. Admin submits a QA draft → it waits in the queue.
  2. Admin edits the same item further (a studio that takes a waiting item back warns once first — editing takes it out of the queue).
  3. SA opens the submission's review: where the kind keeps only the draft, the review says nothing is shown as submitted and it needs submitting again; where the item left the queue, it is simply not there to approve.
  4. Admin resubmits the current draft → SA approves → what goes live is the revision reviewed, never the earlier one.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-10Unpublish: the catalogue loses it, the learner keeps the recordsP1

Cast

Super Admindestructive — coordinate SA + the learner who solved the QA challenge in JRN-06.

Steps

  1. Learner first: note the standing Solved, the Solutions entry and the XP history line.
  2. SA: open the QA challenge's studio → Unpublish (recent main-site check) → the catalogue stops listing it for learners.
  3. Learner: the challenge is gone from /challenges; a saved direct link opens read-only or the area's honest not-found — never a broken editor, never a fake "Not started".
  4. The learner's records are untouched: standing, Solutions entry, XP line and any achievement all remain.
  5. SA republishes (or leaves it down): if it returns, the learner is not paid again — the first-solve fact is permanent.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-11Subject completed → certificate → public verifyP2

Cast

Super Admin Learner + SA + any signed-out browser for the public check. Longest staging in this doc: completing a subject means finishing every required lesson — either finish a showcase subject over sessions, or author a tiny QA subject (one chapter, one reading lesson, one quiz) through the JRN-06 pipeline and have SA enable its Certificate switch in the subject studio.

Steps

  1. Confirm the subject awards a certificate: its catalogue card and subject page carry the Certificate mark (a video subject, or a written subject whose certificate switch is on).
  2. Learner completes every required lesson → the completion page (/courses/:subject/completion) leads with the certificate in its state — Awaiting name if none is set — then what the completion earned, then where next.
  3. The written-subject award lands once: completion page names it ("Finishing a written subject earned you 250 XP, once."), /xp-history shows it, the subject's achievement unlocks in /achievements.
  4. Home shows Set certificate name while the certificate waits → Settings → Certificates → type a name (2–100 chars, English letters and ordinary punctuation) → preview of the exact printed name → confirm → the name locks.
  5. The document generates in the background → "Your certificate is ready" System notice → state Issued → Download works and Copy verification link gives the public address.
  6. Signed-out browser: open /certificates/verify/:identifier → it shows the identifier, display name, awarding item, issue date and current status, the time checked and the assurance statement — and nothing else.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-12A published course change reaches learners even with System notices offP2

Cast

🖥🖥 two browsers Staff + a learner enrolled in (or who completed) the subject being changed. Learner pre-step: turn System notifications off at /profile/settings/notifications.

Steps

  1. Learner switches the System category off and saves it alone.
  2. Staff publish a real change to the subject (edit a lesson's text and publish — a draft autosave does not count).
  3. Learner: a System notice still arrives — the mandatory course-change exception; it explains the meaningful change, not merely "something changed".
  4. The subject's change page (/courses/:subject/changes) groups what was added/updated/moved/removed and stays authoritative whether the notice is read, deleted or delayed.
  5. A completed learner's completion and any issued certificate are untouched.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________

C · Assessment pipelines

The full recorded-test life: a paper authored and published, the learner's systems check and conditions, the timed room, grading, the result, what comes after (review, practice, a relief grant, invalidation) and the cross-feature restrictions while a test is live. The test room's own behaviour is covered page-deep in doc 02 (TC-TST-…); these journeys prove the pipeline around it.

Staging papers

Use the showcase papers where they fit ("Programming Fundamentals", "Python Foundations", "Data Structures Essentials", "SQL Queries"; companies Northvale, Corvane, Kestrelworks, Tamarind Grove). Where a journey needs a specific setting — Strict limit 3, a short duration — author a QA paper through JRN-13 rather than changing showcase content.

TC-JRN-13The whole recorded test: paper authored → published → taken → graded → resultP1

Cast

🖥🖥 two browsersSuper Admin Staff (Admin with the switch on, or SA for direct publish / submit-and-approve) + a learner on a computer at ≥1024 px.

Steps

  1. Staff: /admin/mock-tests → New → title "QA-<initials> — …" → Details (category, difficulty, pass %) → two sections → questions across kinds (single-choice, multiple-choice, numerical, one coding with cases + reference) → Settings (duration, strictness, the six navigation features) → Checks view lists every failure together → fix them → publish.
  2. Learner: /mock-tests → the paper card → Start → /papers/:paper → the systems check runs by itself on arrival, each item Passed / Warning / Could not check.
  3. Read the conditions → tick to accept (required when the check warned; nothing that could not be checked is accepted) → Accept the conditions and start → the test room opens in the focus frame.
  4. Answer across sections; mark one for review; on the coding question Run the examples (the section's run allowance shows, if set). Each answer shows its own save state: Saving → Saved.
  5. Submit test → the confirm shows time left, answered/not answered/marked counts and links to the first unanswered/marked → confirm → the test ends once.
  6. /tests/:test/result reads Grading until it is done (it says so after thirty seconds, calmly after five) → Final: the score against the pass mark, counts, time used, each section, what it earned, the permitted review.
  7. First completion pays 200 XP; a first pass pays 300 XP — a first completed Mock that is also the first pass earns both, once each.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-14Standard strictness: recorded and warned, never auto-submittedP2

Cast

Learner + a paper set to Standard (author a QA paper, or check a showcase paper's setting on its page).

Steps

  1. Start the test → the header shows Recorded events: 0.
  2. Switch to another tab and back → the header shows Recorded events: 1 and a note appears after the event, staying until OK is pressed.
  3. Blur and refocus several times quickly → identical signals inside two seconds count once; genuinely separate leaves count each.
  4. Refresh the page → it is recorded for staff, never counted, and the test does not end.
  5. Finish normally → the result and staff's Recorded Events view show the real count and ending reason — never a misconduct verdict.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-15Strict: the counted-event limit ends the test itselfP2

Cast

Learner + a paper set to Strict, event limit 3 (default; studio allows 1–10).

Steps

  1. Start → produce counted events one at a time (leave the tab and return) → the header reads 1 of 3, then 2 of 3, each with its note.
  2. At the third counted event the test submits itself → the result and history say the event limit ended it — phrased as the recorded fact, not an accusation.
  3. The confirmed answers are scored as for any ended test.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-16Deadline passes while away → Overdue → the worker completes itP3

Cast

Learner + a paper short enough to stage (staff can set a QA paper's duration toward its 5-minute minimum; grace default 60 s).

Steps

  1. Start the paper → answer some questions → close the laptop or walk away past the deadline plus grace.
  2. Come back after the deadline → the test no longer accepts answers; its row in /test-results reads Overdue until the worker completes it.
  3. The worker ends a test nobody came back to within about a minute of its deadline + grace; the overdue label clears to a graded result shortly after.
  4. The result scores confirmed answers; questions are distinguished Not reached / Skipped / Not answered — never described as wrong.
CheckpointHonest label
Test still open past deadline+grace, nobody returnedOverdue — visibly unfinished, never lost
Worker completes itResult graded on confirmed answers; "time ended" as the ending reason
Late answer or late SubmitReported as late or completes the ending from confirmed answers — never mislabelled Saved

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-17Review honors reveal settings; open practice unlocks only after finalP1

Cast

Learner + staff; a finished test from JRN-13.

Steps

  1. On the final result, the answer tiles (All, Correct, Partly correct, Wrong, Not answered) filter the review; each section's questions are listed; rows open to the answers, the explanation and the code.
  2. What the review shows follows the paper's reveal settings captured at Start: correct answers, explanations, reference solutions each only where allowed — a withheld element explains the policy, it does not look broken.
  3. From the current result, Practice opens /papers/:paper/practice: no clock, no recorded events, each question checked on its own; a coding one on every test case with hidden cases counted.
  4. Practise the N you missed limits practice to the questions not answered correctly where the paper shows its questions; Show all brings the rest.
  5. Check: nothing from practice reaches history, Skills, Economy or a notice; the score so far lives on the page.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-18A relief grant: settings change → told → second test → old result archivedP2

Cast

🖥🖥 two browsersSuper Admin SA + a learner with a finalized result on the paper.

Steps

  1. SA edits the live paper's settings → the publish dialog shows each setting old → new → choose to tell the learners who have its result and, only with that, give each a relief grant → confirm lists the changes, the number told, and that a notice cannot be recalled.
  2. Learner: the notice names what changed (in a sentence of what they will see after their next test where it applies) and the next action reads Use your relief grant.
  3. Learner starts the second test → finishes → once the new result is final it becomes the measured result; the earlier result stays in history marked Archived and no longer counts toward readiness.
  4. The grant's notice is protected — it survives Delete and Clear, saying beside it why it stays.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-19Invalidation: the learner sees the true reason and the XP reversesP2

Cast

🖥🖥 two browsersSuper Admindestructive — coordinate SA + a learner with a final Mock result on the paper (ideally one where another valid Mock test also stands, to see the re-pay leg).

Steps

  1. SA: the paper's /admin/papers/:paper/tests view lists its tests (learner, when started, where it stands, how it ended, counted events — never a score) → open the test → Invalidate → choose a reason (a fault on our side / faulty content / account security / a staff decision), write a private note → recent main-site check → confirm.
  2. Learner: the history row stays, marked Invalidated with the reason's sentence — never the staff note; the paper offers a fresh test where availability allows; open practice closes until it finalizes.
  3. Learner gets the invalidation notice — a fresh test restored — and /xp-history shows the reversal of exactly what that test paid.
  4. If another valid Mock test stands, the first-completion/first-pass XP is paid onto it instead — that test's result then shows the reward as earned, and the notice says whether the XP now counts for another Mock Test or is taken back.
  5. Skills sets the invalidated test's evidence aside; readiness no longer counts it.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-20Company readiness: two tests and half the coverage before a ring appearsP2

Cast

Learner on a computer + a company with at least two published papers (showcase: Northvale Systems and Corvane Software have two each). Multi-session by nature — each paper gives one recorded test.

Steps

  1. /company-tests → the company card → its page (/company-tests/:company) → note the readiness figure's starting state (untouched: visibly untested).
  2. Take and finish a test on one of its papers → the readiness shows Not enough evidence with the relevant count — one finalized test of the two needed, coverage short of half — never a 0% ring.
  3. Finish a test on a second paper of the same company → once coverage reaches at least half of currently published papers and two tests are final, the ring computes: 40% coverage + 60% performance, shown to one decimal, rounded down.
  4. The band reads Not ready (below 50), Developing (50 to below 75) or Well prepared (75 to 100), decided on the shown figure (74.96 → 74.9, Developing).
  5. The Assessments dashboard (/tests-dashboard) shows the same company's ring among its readiness rings; the Company result leads with accuracy and readiness rings of its own — no pass/fail, no XP.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-21The live-test cap: a second start points to Resume, never replacesP2

Cast

Learner on a computer + two startable papers (any mix of Mock and Company).

Steps

  1. Start a test on paper one → it is live.
  2. In another tab of the same session, open paper two's page and try Start → refused, pointing to Resume the running test — the running test is never displaced or discarded.
  3. Resume → the first test is intact: clock, answers, position.
  4. End the first test → the second paper's Start now works.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________

D · Streaks, time & lifecycle

The product day is 09:00 → 09:00 IST and only the two dailies turn on it. These journeys prove the boundary, the streak's on-time honesty, the scheduled-to-live pipeline, catch-up, voiding, and how timed activities coexist. Several legs wait for a real clock — stage them across sittings, and mark N/A where the wait is not practical.

TC-JRN-22A scheduled Daily goes live at 09:00 IST — and not a minute earlierP3

Cast

🖥🖥 two browsers Staff + a learner who keeps /daily-challenges open across the boundary.

Steps

  1. Staff: /admin/daily-challenges → author a QA Daily (statement, language, cases, reference, bonus if wanted) → validate → /admin/daily-challenges/schedule → schedule it onto a free future date (scheduling is publishing — the Admin-publishing switch rules apply; with it off it waits in Submissions for a Super Admin).
  2. Before 09:00 IST on the date: learner's Daily page discloses nothing of it — no title, difficulty or hidden content.
  3. Across 09:00: the open page refreshes at the boundary; the date is now live and its facts (difficulty, bonus, languages) lock.
  4. Learner solves it on its date → ordinary on-time rules (JRN-03): streak, calendar, award.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-23Solving between midnight and 09:00 counts for the date still openP3

Cast

Learner willing to test after midnight IST (or stage with staff's own account). N/A-friendly if nobody can.

Steps

  1. Between 00:00 and 09:00 IST, open /daily-challenges → the page reads Open until 09:00 IST this morning — the Daily that began the previous 09:00 is still today's.
  2. Solve it → the receipt stamps it to the product date that opened yesterday morning → the streak counts that date, not the calendar date.
  3. Keep the page open through 09:00 → it refreshes to the new product date and its own challenge.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-24A missed day breaks the streak — catch-up pays in full but never repairs itP2

Cast

A learner with at least one missed eligible date behind them (leave a Daily unsolved for a product day, or use an account whose calendar already shows a Missed cell).

Steps

  1. After a missed eligible date: the streak ends when the day changes; the lapse is acknowledged once — previous length named, a fresh-start message, no repeated blame, nothing to buy.
  2. Open /daily-challenges/past → the missed date is listed → solve it → the full award pays: difficulty XP plus the authored bonus, as catch-up.
  3. The calendar cell now reads solved with a Catch-up mark — not a streak repair: the current streak stays broken, the run does not reconnect.
  4. The longest streak is a lifetime record and does not shrink.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-25Void a Daily: neutral for everyone, solves preserved, irreversibleP2

Cast

Super Admindestructive — coordinate SA + a learner. Voiding makes the date neutral for every learner — safest staging: schedule a QA Daily onto a near date (JRN-22), let it begin, void that. Voiding today's showcase Daily is allowed but affects everyone — announce it.

Steps

  1. With the date begun, a learner solves it (or just has it open) — note their streak and reward.
  2. SA: on the Daily's staff page → Void Daily → confirm the affected date and a reason → recent main-site check → confirm.
  3. New submissions stop; the date reads neutral for everyone — the calendar marks it Voided/Neutral and it still opens for Runs and hints (not falsely described as missing).
  4. Existing valid solves and rewards survive; the date neither adds nor breaks anyone's streak — no At risk warning on a neutral day.
  5. The Operations hub and audit history keep the void with its reason; there is no un-void.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-26A timed Debug window beside a live test — neither clock pausesP2

Cast

Learner on a computer + a startable test + a "Timed then practice" Debug case.

Steps

  1. Start a recorded test → it is live.
  2. In another tab open the Debug case → Start timed window in one language → its clock and Finish now sit under the title — allowed: one timed Debug window may coexist with one recorded test.
  3. While the test is live, its account-wide restrictions hold in the Debug tab too: hints, editorials, Quick Notes, WizBit help and problem-reporting are closed — asking for them anywhere does not bypass.
  4. Finish the timed window (accepted or time out → the acknowledged checkpoint is validated) → the Debug deadline ran its own course; the test keeps its own clock untouched.
  5. End the test → the help restrictions release; Debug's own rules and deadline were never paused by either side.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-27Typing Daily: same-day completion, its own streak, 20 XP once per dateP1

Cast

Learner on a computer (Typing Quest is computer-only).

Steps

  1. /typing-quest/daily → today's English passage, or the day's snippet in the learner's chosen code language → type it whole and finish at ≥90% accuracy → the date completes.
  2. /xp-history gains "Typing Daily completed" — 20 XP, once per date, catch-up included.
  3. The Typing streak — separate from the Daily Challenges streak — increments; its calendar shows the date Done; milestones and At risk today read as the Daily's do.
  4. Open a past date (?date=) → its text types as catch-up → 20 XP pays, the streak never counts it.
  5. Next product day: the streak holds; today's round undone shows At risk today.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-28Daily off → on: each turn-off is a cut no run crossesP2

Cast

A learner with an active Daily streak.

Steps

  1. On the Daily page's streak panel or Settings → Dailies (/profile/settings/dailies) → turn the Daily off → with a streak to lose it asks first → the streak is cancelled at once — no "your streak ended" message, ever.
  2. While off: the Daily stays open as ordinary practice — solve it → XP pays as usual, but no streak day, no At risk, no evening reminder; Home and Profile read Daily turned off, never a zero.
  3. Missed dates while off draw Off on the calendar, never Missed.
  4. Turn it back on → applies at once → a fresh streak starts with the next on-time solve — including a solve the same day made after turning on (a solve earlier that day while off does not count).
  5. Off → on → off on the same day → each turn-off is a cut; the earlier run is not repaired.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________

E · Money, rewards & corrections

XP, levels, achievements and their staff-side repair — where the learning fact becomes economy and where an economy mistake gets fixed without touching the learning fact. The award table for reference: easy 30 · medium 60 · hard 100 · extreme 150 · Daily bonus 40 default · written subject 250 · first Mock completion 200 · first Mock pass 300 · Typing Daily 20. Level L begins at 250 × (L − 1)² XP (Level 2 at 250, Level 3 at 1,000, Level 4 at 2,250).

TC-JRN-29Solve → XP history → level pill → a level crossing told onceP1

Cast

A learner — ideally one a single award short of a level boundary (e.g. 100–240 XP from Level 2 at 250).

Steps

  1. Complete any XP-paying activity (solve, Daily, subject completion) → the award applies with the acceptance/completion itself — it cannot "arrive later".
  2. /xp-history → the entry appears newest-first under its month: its source and amount, twenty per page.
  3. The shell's level pill re-reads after the change and when a stale view returns — total XP, current level, next threshold and XP remaining agree everywhere they appear.
  4. Crossing a boundary (250 / 1,000 / 2,250 …) → the pill shows the new level and the inbox gets exactly one Level Ups notice.
  5. No crossing → no notice; a plain solve creates no inbox item of its own.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-30An achievement unlocks — exact progress before and afterP1

Cast

A learner who can still earn something cheap: a first Typing Quest round ("First round"), a first completed project, or the Mock first-completion from JRN-13.

Steps

  1. /achievements → find the target card among Not earned yet → read its exact progress in the requirement's own units ("0 of 1 Mock Test completed", "3 of 8 lessons", "12 of 100 days").
  2. Note "Closest to unlocking" — up to three unearned badges already begun, by share completed.
  3. Earn it → the card shows Earned with its date; the Achievements-category notice arrives once (a streak badge is named inside the daily's milestone notice instead of a duplicate item).
  4. Home's achievements card counts up and names it among the newest three.
  5. Re-do the earning activity → nothing unlocks twice.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-31A failed reward notice surfaces to staff — and a retry pays it onceP2

Cast

Super Admin SA + whatever is listed on /admin/economy/failed-rewards. N/A-friendly: a reward's notice is what fails (the XP already committed), and you cannot force one — if the list is genuinely empty, verify the honest empty state and mark the retry legs N/A.

Steps

  1. Staff open /admin/economy/failed-rewards: each paused notice with its reward and category, the learner by name ("A learner with no name on record" otherwise), what is owed, when it paused, its tries and why — in words; and how many are still being tried.
  2. An Admin reads the page but has no retry — that is a Super Admin's.
  3. SA retries one → recent main-site check → the notice delivers to the learner once → it leaves the list; a retry that fails keeps it visible.
  4. Retry all → retries page after page on one transaction each, answers which went and which were left, and stops at the first refusal.
  5. Learner side: the notice exists exactly once — the XP it described was already in the history; nothing double-pays.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-32An economy correction: previewed, typed, audited — and readable by the learnerP2

Cast

Super Admindestructive — coordinate SA + a tester learner's account (announce the figure you will move, e.g. +50 XP, and pick an account that can hold it).

Steps

  1. SA: from the person's support view → Correct XP or Credits (or /admin/economy/correction?person=…) → choose XP, add, 50.
  2. The preview shows the current total, the signed change, the resulting total and any level change — a non-whole or out-of-range amount shows no preview.
  3. Enter the reason and a nonempty incident reference, type the change in words ("add 50 XP") → main-site check → Apply → it commits with its audit entry; repeated confirms apply once.
  4. Learner: /xp-history gains a correction entry showing the reason and the reference — never who made it; the level follows the new total with no level-up notice or celebration.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-33Generated assistance is off — the Credit legs are absence checksP2

Cast

Learner + SA. GENERATED_ASSISTANCE=false platform-wide on this deployment — the expected result of every leg is absence, honestly.

Steps

  1. As the learner: the header and You menu carry no Credits balance or /credits link; /credits and /credits/history answer as unknown addresses (not-found back to Home).
  2. On a challenge, editorial, lesson and in Workspace: no "Analyse my code", no "Explain" paid action, no generated help or agent panel.
  3. As SA: /admin/economy/configuration still opens — it says prices are not charged and the allowance is still granted, and the "where generated assistance answers" section says it is off or not yet configured; the eight saved settings show honestly.
  4. A staff-side Credit correction or extra (/admin/economy/correction, /admin/economy/extra) still works where permitted — and stays hidden from the learner's history like the rest of the Credit experience.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-34First Mock completed and passed: both awards, once each, never againP2

Cast

A learner who has never taken a Mock test + any published Mock paper they can pass.

Steps

  1. Take the first Mock test and pass it → the result finalizes.
  2. /xp-history shows two entries: 200 XP first completion and 300 XP first pass — the occasions are distinct, each once per learner, never to staff.
  3. The two first-Mock achievements unlock (First completion, First pass) — each card earns its date; recognition-only high-score/perfect badges follow their own thresholds.
  4. Any later Mock — a relief-grant test or another paper — pays neither award again.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________

F · Moderation & safety

The pipelines that protect people: learner content reports reaching the staff queue, topic requests reaching implementation, and restrictions reaching a real session. Moderation actions are Super Admin's, behind the ≤15-minute main-site check, and each one lands in the audit history. Page-deep moderation controls are in doc 05; here we prove what they do to the other side.

Destructive — coordinate every suspension and ban

Suspending or banning a tester account ends its sessions immediately — including any live test (scored on saved answers) and any running programs. Announce the account and the window in the team channel, use a dedicated tester learner (e.g. tester-learner-5), and lift/unban when done.

TC-JRN-35Content report: learner flags it → staff investigate → resolved with an outcomeP1

Cast

🖥🖥 two browsers Learner + staff (Admin or SA).

Steps

  1. Learner on an eligible detail page (a challenge, Daily, Debug case) → Report → choose Spam, Incorrect, Inappropriate (note optional) or Other (note required) → send.
  2. Staff: /admin/reports → the queue lists reports oldest first, with Open / Investigating / Resolved / Dismissed states, domain filters and real status counts.
  3. Open the report → mark Investigating → the link opens the content's current editor — with an explanation when it differs from what was reported.
  4. Correct through the owning domain's normal validated update (no report-specific publication bypass) → Resolve with an outcome: Corrected, No action, Escalated or Duplicate — optionally referencing the correcting change.
  5. The report's history keeps the whole arc; domain filters and the cross-status breakdown reflect the real totals.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-36A report outlives the content it namesP2

Cast

Super Admindestructive — coordinate Learner + staff + a QA item staff will delete.

Steps

  1. Learner reports a QA-authored item (JRN-06's challenge, say).
  2. SA deletes that item (typed title where required, recent check).
  3. Staff open the report: it is still in the queue; its link explains the content's current editor is gone or differs — it never pretends the historical screen is openable.
  4. Resolve the report with an outcome → the history is intact and correctly attributed.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-37Topic request: submitted → approved → implemented → fulfilled and toldP1

Cast

🖥🖥 two browsers Learner + staff (either role; only SA replaces links after implementation).

Steps

  1. Learner: on a mapped page's foot callout (e.g. beneath the Challenges catalogue — "Request a topic", or beside a challenge — "Request a topic like this") → the form takes title (≤120) and description (≤2,000) with a read-only context summary → Send → the acknowledgement says it arrived and points to Your Requests — not that anyone read it or promised work.
  2. /requests shows it Pending, newest first.
  3. Staff: /admin/topic-requests → find it (search across titles and descriptions; newest first) → its words and context open beside the list — never who sent it → Approve (optionally a private team note).
  4. Learner: a System notice — "Your topic request was approved" — unless their System switch is off; the status is visible on /requests either way.
  5. Staff: on the request, find real published content by title and link it (up to five items) → Mark implemented becomes available once at least one linked item can actually be opened → confirm.
  6. Learner: "Your topic request was implemented" names the linked content → the request reads Implemented → Open content opens it.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-38Retract vs decide: one outcome, never bothP2

Cast

🖥🖥 two browsers Learner + staff with the request open.

Steps

  1. Learner sends a request, then on /requests chooses Retract while it is Pending → confirm → it reads Archived — final, no restoration.
  2. Staff had it open mid-decision → their pending move is refused with the current state shown; archived requests are read-only to staff and absent from the working queue.
  3. Race leg: the learner retracts at the same moment staff approves → exactly one outcome stands — both is impossible.
  4. Learner files the same title again (the earlier one is Archived, not open) → a fresh request is allowed.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-39Suspend → the session dies into /restricted → lift early → access returnsP1

Cast

🖥🖥 two browsersSuper Admindestructive — coordinate SA + a dedicated tester learner signed in and using the app.

Steps

  1. SA: /admin/people → find the learner → Suspend → reason, optional private note, duration (presets 1 / 7 / 30 / 90 days or custom 1–365) → the dialog says when they could come back in, ticking with the clock → recent main-site check → confirm.
  2. At once: the learner's sign-ins end on web and app; any live test ends as access ended and scores its saved answers; running programs stop.
  3. Learner's browser: its next request shows the notice — "Your access changed, so you are signed out." — and any page leads to /restricted: "Your access to Wizly Learning is suspended", with its end, a Try again, and the main-site contact route. No staff reasons, notes or the moderator's name appear.
  4. SA: Lift early → the dialog names the active suspension → capture a reason → confirm → the person's standing returns.
  5. Learner: Try again on /restricted (or a fresh sign-in) → asks afresh → access returns; the restriction history records suspend and lift with who and when.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-40Ban with the name typed → unban — the harshest confirmationP2

Cast

Super Admindestructive — coordinate SA + a spare tester learner.

Steps

  1. SA: the person's support view → Ban → reason + type the person's name exactly as shown (or the start of their address where the main site gave no name) → recent check → confirm.
  2. Learner: sessions end; the restricted page reads "Your access to Wizly Learning is banned" with the main-site contact route — and nothing to try again.
  3. SA: Unban → typed name again + attribution, no reason required (the explicit exception) → confirm → access returns.
  4. The standing history shows the ban, its reason, who placed it, and the unban — newest first.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-41The main-site check goes stale mid-action: the round-trip holds everything typedP2

Cast

Any staff role on a protected write (suspend dialog, publish confirm, correction apply — wherever the check bites).

Steps

  1. Sign in as staff, then let more than 15 minutes pass without a fresh main-site verification (or open the console well after signing in).
  2. Open a protected action and fill it — a reason, a note, a typed name.
  3. The confirming button itself reads "Confirm on the main site" → it takes you to the main site and back to the same address.
  4. Back in the console: everything typed is held in the tab and restored — the reason, the note, the broadcast, the change's own id. A typed person-name confirmation is typed again.
  5. Confirm once → it applies; the api refuses a stale write regardless of what the page showed.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________

G · Sessions & account lifecycle

One account, one active place per kind — newest sign-in wins — and the gate outcomes that decide who gets in at all. Session mechanics and notices are covered page-deep in doc 03 (TC-SES-…/TC-PLT-…); these journeys cross the browser boundary and the account's whole life.

TC-JRN-42Newest wins: the same account in two browsersP1

Cast

🖥🖥 two browsers The same learner account in browser A and browser B — the one journey where sharing an account is the point.

Steps

  1. Browser A: sign in, open a page with work on it (a draft answer, an open challenge).
  2. Browser B: sign in with the same account → B gets the session.
  3. Browser A's next request → the top-of-page notice: "Your account was opened on another browser or device, so it is signed out here." — the page and what is typed on it stay visible; it offers Sign in here and never signs itself back in (that would end B).
  4. A live-test leg: if A had a test running, it is not displaced — the test keeps running and resumes on B (or the next computer sign-in) with its confirmed answers; unsent answers stay on A's device.
  5. A clicks Sign in here → through the main site → A's session opens and B is now the one told it was opened elsewhere.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-43A main-site password change ends the session politelyP2

Cast

A learner + access to change the password on the main site (coordinate — change it back).

Steps

  1. Learner signed in and working → on the WordPress main site, change the account's password.
  2. The app's next request → the notice: "Your password was changed, so you are signed out here." — page and typed work stay visible; protected actions stop.
  3. Sign back in with the new password → a fresh session opens; the old one cannot resume.
  4. Both kinds of session end — web and app alike.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-44Idle two hours, alive twelve — the documented waitsP3

Cast

A learner; mostly a documentation-and-spot-check journey — real waits are impractical for most testers.

Steps

  1. Document the expectations before testing: web session life 12 hours from the latest handoff; inactivity allowance 2 hours; the worker's sweep ends sessions idle past their allowance.
  2. If practical: leave a signed-in page untouched for over two hours → its next request → "You were away for a while, so you are signed out." (idle).
  3. Longer still (past 12 h of life): "Your sign-in reached the end of its time, so you are signed out." (past-its-life).
  4. An ended session is kept 30 days, so a returning browser is told the real reason — then it reads as an ordinary signed-out visit.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-45The denied account: the gate refuses, honestlyP1

Cast

The denied account — verified on the main site, holding no membership.

Steps

  1. Sign in on the main site as denied → return to the app → the handoff resolves and the gate refuses.
  2. /restricted explains that access is required and points to the main site — factual wording, no invented "your membership ended", no misconduct hint, no partial entry to learner pages.
  3. Every app page and deep link answers the same way — there is nothing to reach by guessing addresses.
  4. The refusal is kept in that browser for the handoff's ten minutes; after that the visit reads as ordinary signed-out and asks the main site afresh.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-46Lapsed member: privacy-only sign-in → erasure request → cancel in the windowP1

Cast

The lapsed account — membership ended 2026-09-23, previously admitted to Labs.

Steps

  1. Sign in as lapsed → the page says the membership is past its end, offers Renew on the main site, and beneath it "Erasing your learning records" → the privacy-only sign-in opens.
  2. That session reaches only the person's own erasure: every other page and route answers as for someone not signed in — try /, /daily-challenges, /admin/….
  3. Request erasure: type the confirmation (email or name as shown) → recent main-site check ("Confirm on the main site" if stale — the privacy-only session takes the same trip) → the request starts its seven-day window and shows its status.
  4. Cancel the request inside the window → the status shows it cancelled; learning access is not restored (the membership is still past its end).
  5. Request again later — allowed; the window restarts.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-47Staff-initiated erasure: /admin/lifecycle stages to a privacy-safe endP2

Cast

Super Admindestructive — coordinate SA + a disposable account — this permanently erases it. Use a spare tester learner created for the purpose; do not run on an account other testers need.

Steps

  1. SA: the person's support view → Erase this account → a mandatory reason + the person's name typed + recent main-site check → confirm. It begins at once — no seven-day window.
  2. /admin/lifecycle lists it: source, stage, relevant dates, due date (thirty days out), whether overdue, per-step progress and any failure — never "Erased" until the last required step succeeds.
  3. Effect: the person's sign-ins end at once and they are answered as being erased; their browser shows the erasure gate outcome, not a generic logout.
  4. Each owner removes what it holds as background steps; a step that fails retries, and a spent-failure shows as Failed on the lifecycle page for an SA retry — Held and Failed are distinct states.
  5. Completion: the person's certificates answer public verify as an unknown code; audit entries keep but name nobody; Access keeps only the pseudonym marked erased — the account cannot return through a later sign-in or a restore.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-48App session vs web session: two kinds, never displacing each otherP3

Cast

A learner + the mobile app + a web browser. Likely N/A without an app build — the legs below document what must hold; verify whichever side exists.

Steps

  1. Sign in on the web and in the app with the same account → both stay signed in — opening the app never signs the computer out, a live test included.
  2. A second app sign-in on another device → the older app session ends as opened elsewhere; the web session is untouched.
  3. Main-site sign-out → the web session ends; the app stays signed in on its own.
  4. Password change, account deletion, restriction, erasure, payment reversal or a lapsed standing → both kinds end.
  5. On the app, every staff route answers as for a User — an app session carries no staff authority whatever the WordPress role.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________

H · Degradation & honesty

How the platform behaves when its own parts hurt — and the rule under everything else in this doc: unavailable is not empty, unknown is not zero, platform failure is never learner failure. You cannot safely break a shared deployment to test these, so most legs are "catch it live or verify the honest path exists" — catch degradation during the maintenance window (TC-JRN-52), watch the health signals, and mark unstageable legs N/A with what you checked.

TC-JRN-49Readiness and the Operations hub: health reads as it isP1

Cast

Any tester (the endpoint) + staff (the hub).

Steps

  1. Open https://app.sprinklejelly.com/api/v1/readiness → 200 serving / 503 not — check it before a session and whenever something looks down.
  2. Staff: /admin → four regions: Needs attention, Signals, Background work, Waiting for recovery — each says when it was read and stands on its own.
  3. Signals read Healthy / Degraded / Down / Unknown — a record older than three measurements reads Unknown, never Healthy; the console's health light shares the state and reads Unknown when the hub cannot be read.
  4. Needs attention rows each count what their link shows and link to the owning page — account erasure, main-site changes, legal hold review, grading waits, failed rewards, certificate documents, submissions, content reports, topic requests, the Daily schedule — folding into one "Also clear" line when nothing waits.
  5. Owner alert conditions list on the hub: thirteen checked from what Labs keeps, five reading Cannot be checked yet with why (outside uptime, backup/restore, disk, video processing, WizBit silence) — and it says delivery is not set up.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-50Degraded services on learner surfaces: unavailable, never zeroP2

Cast

A learner during a genuine degradation (maintenance window, real outage) or verifying expectations. N/A-friendly.

Steps

  1. Inbox count unreadable → a hollow badge mark, never a missing badge and never "0".
  2. Daily streak unreadable → Unavailable, never 0; Home regions fail independently — a good region stays, a failed one keeps last-known data with freshness and retry.
  3. A dependency staff cannot be asked → surfaces say so in learner words ("can't be asked"/unavailable) — never an empty list or a false success.
  4. A grading outage leaves a test result Grading — after thirty seconds it says it is taking longer; after five minutes it calmly says grading is busy, answers are safe, you need not wait — never a provisional score.
  5. A submission refused by a full grading service waits for room — the try uncounted — and a platform failure changes no solve, reward, evidence or streak.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-51Where code runs: this device, the cloud, the runner's own origin — labelledP2

Cast

A learner in Code Lab and dev tools open.

Steps

  1. /code-lab → run a Python program → the run bar names the place with an icon: on this device (the browser's worker) or in the cloud — and each run names where it ran with that place's exact Python version.
  2. A run that cannot finish on the device offers Run in the cloud — an explicit choice, not a silent switch.
  3. Open a browser-preview language (a page/HTML) → dev tools: requests go to the runner's own origin, run.sprinklejelly.com — by design, and it is normal to see them; learner code there never receives the Labs session cookie.
  4. The environment view names real values (language/version, limits) — an unknown value says Unavailable rather than inventing a number; learner text calls the service "the cloud".

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-52Maintenance window: declared → learners told → Start blocked → ends on healthP2

Cast

🖥🖥 two browsersSuper Admindestructive — coordinate SA + a learner. A declared window shows on every learner page — announce it.

Steps

  1. SA: /admin/maintenance-windows → declare: start now (or minutes ahead), expected end within seven days, affected capability grading, and a learner-safe explanation up to 300 characters → recent check → recorded in the audit history. The page previews the learners' banner as it will look.
  2. Learner: every learner page shows the window at its top — from a day before a scheduled start, at once for one in progress — with what it affects, its times and the explanation. Staff pages carry no banner.
  3. Learner tries to Start a Mock/Company paper with coding questions whose window would fall inside its time → refused honestly — an existing test continues while saving stays available; Quick Notes turns read-only while the window is under way.
  4. Past the expected end the window reads Ending (waiting for the first health measurement after it) → if anything it affects measures unhealthy it reads Overrunning and learners are told it is taking longer than expected → the first measurement where everything affected is healthy ends it as the platform's own act.
  5. The banner clears within about a minute of ending; the hub's Maintenance signal reads Degraded while it is in progress or overrunning.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-53Broadcast: send → delivers where System is on → stop mid-flightP2

Cast

🖥🖥 two browsersSuper Admindestructive — coordinate SA + learner A (System notices on) + learner B (System off) + a staff account. Everyone eligible sees the send — announce it and keep the words QA-appropriate.

Steps

  1. SA: /admin/broadcasts → title ≤120, message ≤4,000 → the preview shows the row the bell and Inbox draw, plus the announcement whole → it states the audience as an upper-bound estimate and that delivery carries on after the page closes.
  2. Confirm Send — naming the audience, that delivered notices stay, and that it goes in the sender's name; at 5,000 estimated recipients or an unworkable estimate it asks once more. A double Send returns the same broadcast — never a second.
  3. The worker delivers in steps of 200: learner A's bell badge counts up and the Inbox gains the System notice, readable in full; learner B gets nothing; no staff account gets one.
  4. SA stops remaining delivery mid-flight with a reason → work already being settled finishes → the final status reads Stopped with settled counts (delivered + System-off skips) — items already delivered remain.
  5. /admin/broadcasts/history lists it newest-first: sender, time, title, state, estimate, delivered and System-off counts, and the stop's actor, time and reason.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-JRN-54Handoff and /unavailable: the failure pages tell the truthP2

Cast

A signed-out or interrupted learner.

Steps

  1. Open the app signed out → /handoff says Signing you in and goes to the main site once per tab.
  2. Make the sign-in unfinishable (close mid-trip, or return without a session) → the handoff says We could not finish signing you in, that it is not a membership problem, and offers Try again for the same page.
  3. Refusals land on /restricted and /unavailable: /unavailable shows a genuine platform failure — Wizly Learning is not available right now — with a safe retry and no invented account or content state.
  4. /restricted asks the session read and shows only the confirmed gate outcome — a person in good standing goes to Home; the address's own claims are never trusted.

Expected — at every step

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________

Wizly Learning Testing Handbook · 06 · End-to-End Journeys · generated from the product specification (docs/) and source of Sprinkle-Jelly-V1 · November 2026