01 · Learner — Practice

Courses & video courses, Challenges, Tracks, Daily Challenges, Debug Detective, Code Lab, Typing Quest, My Solutions, Tools  ·  Requires: learner account (tester-learner-1..5)  ·  Related: doc 03 for platform-wide rules (themes, sessions, toasts, offline), doc 06 for cross-feature journeys

Shared facts for this whole document

Courses — written subjects & video courses

Courses teaches through Subject → Chapter → Lesson — one hierarchy for both written and video formats, kept on two separate catalogue pages with separate learning records and rewards. Written lessons complete explicitly; video lessons complete at 95% verified watched coverage; quizzes are unproctored practice. A written subject pays 250 XP once plus an achievement (never a certificate); a video subject pays an achievement plus a certificate when its switch is on (never XP).

RoutePageNotes
/coursesCourses catalogueWritten subjects only — search, filters, Continue strip, 20 cards + Load more
/video-coursesVideo courses catalogueVideo subjects only; same layout; may be empty on this seed — empty ≠ broken
/courses/:subjectSubjectFacts row, outline by chapter, standing card, prerequisites, change brief
/courses/:subject/changesWhat changedEvery published change since publication, by month, 20 at a time
/lessons/:lessonLesson (reading)One player for every lesson kind; outline beside the shell nav from 1280 px
/lessons/:lesson/videoVideo lesson viewProtected streaming, captions, transcript, watched-coverage strip
/lessons/:lesson/quizQuiz viewWorks on phones/tablets too — the one practice surface that does
/lessons/:lesson/projectProject lesson viewBrief + opens/starts the Course Workspace (workspace itself is doc 02)
/lessons/:lesson/referencePractice lesson viewPoints at a challenge, track or Debug case; learner sees "Practice"
/courses/:subject/completionSubject completeCertificate state first, then what it earned, then where next
/course-previews/:previewIdDraft previewSigned-in, scoped, expiring, revocable, read-only staff share links

What must work: enrolment once per subject (video only — written subjects just lead to lessons); the one Continue target rule everywhere (last opened unfinished lesson → first unfinished in order → first unfinished); sequential navigation locks where authored; prerequisites with named status; completion once and forever — later edits never un-complete or re-pay; XP offered only while it would actually pay.

Seed content to use

Written subjects on this deployment: Data Structures in Python (20 lessons), Python Fundamentals (16), SQL Basics (13) — 13 chapters, 49 lessons total; each chapter has reading lessons, a quiz and a "Practice:" lesson. If no video subject is published, video-course cases marked "if seeded" can be N/A — the empty catalogue must still be honest, never fake content.

Courses — catalogues (/courses, /video-courses)

TC-CRS-001Catalogue shows real subject cards with learner standingP1

Preconditions

Signed in as a learner who has not started "Python Fundamentals".

Steps

  1. Open /courses.
  2. Read the three subject cards.
  3. Open /video-courses.

Expected

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-002Search, filters, chips and counts on the catalogueP2

Steps

  1. On /courses, type "SQL" in search.
  2. Open the Filters control (popover on a computer; bottom sheet on a touch device) and apply a difficulty and a topic.
  3. Remove one filter via its chip; press Clear filters.
  4. Apply a progress filter (e.g. "Learning").
  5. Switch between Courses and Video courses tabs and back.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-003Continue strip returns to the right lesson and positionP1

Preconditions

Learner is part-way through "Python Fundamentals" — has opened but not finished a middle lesson.

Steps

  1. Open /courses and find the Continue strip above the cards.
  2. Press it.

Expected

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

Courses — subject page (/courses/:subject)

TC-CRS-004Subject page explains itself before any enrolmentP1

Steps

  1. Open /courses/data-structures-in-python (or any seeded subject) as a learner who has not started it.
  2. Read the header, sections and outline without pressing anything.

Expected

Also try

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-005Start course / Continue / sequential locks and prerequisitesP1

Steps

  1. On a subject not started, press Start course (a written subject) twice quickly.
  2. Finish a lesson, return to the subject page, press Continue.
  3. In a sequential subject, paste the address of a later locked lesson directly into the address bar.
  4. If any subject has prerequisites: try to start it before finishing them.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-006Completed subject stays completed — "Course completed" and "New since you completed it"P2

Preconditions

A learner who has completed a written subject (use an account that finished one, or complete "SQL Basics" — its chapters are short).

Steps

  1. Reopen the completed subject's page.
  2. Open a lesson inside it that was published before your completion.
  3. If staff have added a lesson since your completion, find it in the outline.

Expected

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

Courses — the lesson player (/lessons/:lesson)

TC-CRS-007Reading lesson: layout, outline, bar, steps and completionP1

Steps

  1. Open a reading lesson in "Python Fundamentals".
  2. Read it; scroll to the foot.
  3. Press Complete and continue.
  4. On the subject's last unfinished required lesson, check the action reads Complete lesson.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-008Completion that fails to save is said, and never double-recordsP2

Steps

  1. Complete a lesson, then double-press the action on the next one.
  2. With dev tools throttling or a blocked request, press Complete and continue so the save fails.
  3. Retry.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-009Outline search, On this page, and reading position memoryP3

Steps

  1. In the outline, use "Find a lesson" — search a word in another lesson's title, then a nonsense word.
  2. Scroll a long reading lesson halfway, leave, reopen it.
  3. On a ≥1280 px screen with a lesson that has ≥2 headings, use the On this page tab.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-010Content sections: text, callouts, tables, images, code to readP2

Steps

  1. Walk a reading lesson that has headings, text, a callout, an image, a display-code block and a table.
  2. Narrow the window under a wide table's width.
  3. Check a callout in both themes.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-011Executable examples: edit, run, stop, input, preview — nothing graded or keptP1

Steps

  1. Find a lesson with a runnable example (a code block marked as an example with Edit / Run).
  2. Press Edit, change the code, press Run.
  3. For a program that reads input, type into the input box before Run.
  4. Press Stop mid-run; press Run again; leave the page and come back.
  5. For an HTML/CSS/JS example, Run it and click a link inside the preview that points off-page.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-012The right card: WizBit tab, Contents, Code — and the Coming soon cardP3

Steps

  1. On a computer ≥1280 px, open a lesson that has a runnable example and "code beside" on.
  2. Open the right card's tabs: WizBit, Contents, Code.
  3. Press "Open beside" on an example.
  4. Look for "Ask WizBit about this lesson".

Expected

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

Courses — video lessons (/lessons/:lesson/video) — if seeded

Coverage rules to test against

A video completes at 95% verified watched coverage: the union of stretches actually played. Seeking past a range leaves it unwatched; re-watching counts once; paused, buffering, hidden-tab and disconnected time counts nothing. Reports go out every 30 s while playing and at once on pause, at the end, and on leaving/hiding.

TC-CRS-013Video playback, seek, resume and the watched stripP1

Steps

  1. Open a video lesson; play 30 seconds, seek past a minute, play 10 more.
  2. Leave the page; reopen it.
  3. Look under the video for the watched strip.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-01495% verified coverage completes — pauses and hidden tabs count nothingP1

Steps

  1. Watch a video honestly to ~96% coverage (checking the strip).
  2. Note whether completion lands; reload the page.
  3. On another video: pause it on a hidden tab for 5 minutes, then check the strip.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-015Captions, transcript, transcript search — and Mark as completeP2

Steps

  1. Turn captions on; open the transcript beside the video.
  2. Search a word within the transcript (in-lesson).
  3. On an unwatched video lesson, use the foot's Mark as complete.

Expected

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

Courses — quiz lessons (/lessons/:lesson/quiz)

Quiz facts

Unproctored practice — no XP, no skill evidence, works on phones and tablets. Question kinds: one answer, several answers (all-or-nothing), true/false, a number (exact unless an authored tolerance). Marks are whole numbers 1–10. Completion defaults to submission unless the author set a pass mark 1–100% judged on marks, not the rounded percentage. Optional timer 5–120 min submits on expiry. The full review shows once, right after submission, and is gone on revisit. Retakes are unlimited but ≥10 seconds apart.

TC-CRS-016Quiz: Before you start, answering, submit, score and the one-time reviewP1

Steps

  1. Open a quiz lesson (each seeded chapter has one) → read "Before you start".
  2. Press Start the quiz; answer all questions; press Submit.
  3. Read the review carefully, then leave and reopen the quiz view.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-017Quiz marking edges: multi-select all-or-nothing, numerical tolerance, 10-second retake gapP2

Steps

  1. Find a several-answers question: select a strict subset of the correct options, submit.
  2. Immediately (under 10 s) press Take it again and submit a second take.
  3. If a quiz has a numerical question with tolerance, try a value inside and outside it.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-018Quiz on a phone — the one touch-friendly practice surfaceP2

Steps

  1. At a ~390 px viewport (or a real phone), open a quiz lesson.
  2. Start, answer, submit.

Expected

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

Courses — project & practice (reference) lessons

TC-CRS-019Project lesson opens a Course Workspace and completes on the checklist + your confirmationP1

Preconditions

A subject containing a "Practice:"/project lesson (seeded subjects include practice lessons; find a Project kind lesson — the outline marks the kind).

Steps

  1. Open the project lesson → its project view (/lessons/:lesson/project).
  2. Open/start the Course Workspace from it.
  3. In the workspace, check every task in the checklist; return to the lesson and press Mark complete; confirm it is your own assessment.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-020Practice (integration reference) lesson completes from the real itemP1

Steps

  1. Open a "Practice:" lesson in a seeded subject → its practice view (/lessons/:lesson/reference).
  2. Note the item it points to and your standing; open it where it lives and solve it (or pick one already solved).
  3. Return to the lesson's practice view.

Expected

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

Courses — completion, changes & preview links

TC-CRS-021Written subject completion pays 250 XP once, shows the completion page and the completion panelP1

Steps

  1. Complete every required lesson of a written subject ("SQL Basics" is shortest).
  2. On the final completion, watch the panel and open /courses/:subject/completion.
  3. Check your XP history (header level or /xp-history) and Achievements.
  4. Complete nothing new; reload the completion page.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-022Video subject completion: achievement + certificate state, never XP — if seededP2

Steps

  1. If a video subject is published: complete all its required lessons.
  2. Open its completion page; check XP history and Certificates.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-023Change brief and the changes page — published edits reach enrolled learners honestlyP2

Preconditions

Coordinate with a staff tester: they publish a small visible change to a subject you're enrolled in.

Steps

  1. After the staff publish, open the subject page.
  2. Read the change brief; press Got it.
  3. Open /courses/:subject/changes.
  4. Have staff save a draft edit (unpublished) — confirm nothing announces it.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-024Draft preview links are signed-in, scoped, read-only and honest when deadP2

Preconditions

Coordinate with a staff tester for a /course-previews/:previewId link.

Steps

  1. Open the preview link signed in as the intended learner.
  2. Sign out / open it in a browser signed in as a different learner (if scoped) or after staff revoke it.
  3. Try to edit anything on it.

Expected

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

Courses — pipelines

TC-CRS-025Pipeline — written subject: discover → start → lessons + quiz → completion → 250 XPP1

Steps

  1. From /courses, open "SQL Basics" (13 lessons — fastest to finish).
  2. Start course; work each lesson in order: read → Complete and continue; take each chapter's quiz (submit any take).
  3. Open a "Practice:" lesson and complete the item it points to, then return to record the lesson.
  4. Finish the last lesson.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-026Pipeline — a course change mid-learning never loses earned progressP2

Preconditions

Staff tester available; learner part-way through a written subject.

Steps

  1. Learner completes two lessons.
  2. Staff add a new required lesson at the start, reorder two chapters, and publish.
  3. Learner reopens the subject.
  4. Staff then make the new lesson optional and publish again.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CRS-027Pipeline — archived subject keeps enrolled learners readingP2

Preconditions

Staff tester; learner enrolled-but-unfinished in a subject staff will archive.

Steps

  1. Staff archive the subject.
  2. Learner opens /courses, then opens the subject directly, then a lesson.
  3. Learner completes a lesson and checks the subject can still be finished if all requirements are met.

Expected

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

Challenges — the standalone catalogue

Challenges are independently authored coding problems, each open in every language the grading service runs. Standing runs Not started → Tried → Solved: a valid non-platform-failure submission makes Tried; an all-pass Submit (visible and hidden cases) makes Solved. The first acceptance atomically records the solve, the retained source in My Solutions, the difficulty XP, and one skill contribution. Re-solves pay nothing; a first acceptance in another language adds a Solutions entry and that language's evidence but no second XP.

RoutePageNotes
/challengesCatalogueSearch + difficulty/topic/status filters in the URL, remembered on this device; "Pick up where you left off"; Random Challenge
/challenges/:challengeIdChallenge workbenchTest editor: Challenge / Hints / Editorial / Tries tabs + language file tabs (≤4 + More languages)

What must work: run free (visible examples or custom input), submit all-or-nothing, hidden cases opaque, hints free and laddered, editorial locked until first acceptance, drafts per language on this device, accepted code never overwritten by later failure, staff practise without XP/solve-rate/Solutions.

Seed content

40 published challenges — e.g. "Balanced Brackets" (easy), "Longest Common Subsequence" (medium), "Edit Distance" (hard), "Critical Roads" (extreme). Default limits: 5 s processor / 10 s wall / 128 MiB, scaled per language (Java ×2 time+memory, JavaScript ×2 time, Python ×3 time).

Challenges — the catalogue (/challenges)

TC-CHL-001Catalogue cards, search, filters, standing and solve rateP1

Steps

  1. Open /challenges.
  2. Search "brackets"; apply a difficulty filter and your status "Not started"; read a card.
  3. Copy the URL with filters into a new tab.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-002"Pick up where you left off" and Random ChallengeP2

Steps

  1. Submit a wrong-answer try on any challenge; return to the catalogue.
  2. Press the pick-up strip.
  3. Apply a difficulty filter; press Random Challenge twice.
  4. Set filters so everything matching is solved, then press Random Challenge.

Expected

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

Challenges — the workbench (/challenges/:challengeId)

TC-CHL-003Statement, examples, limits and comparison policy before you submitP1

Steps

  1. Open "Balanced Brackets".
  2. Read the Challenge tab fully before coding.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-004Language tabs, per-language drafts and seeding precedenceP1

Steps

  1. Open a challenge; look at the file tabs over the editor.
  2. In Python, type code; switch to Java; type different code; switch back.
  3. Reload the page in each language.
  4. On a challenge you already solved in Python, open it in Java.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-005Run is free experimentation — examples, custom input, empty refusalsP1

Steps

  1. On a challenge, Run the starter against the visible examples.
  2. Switch to your own input; Run with it empty; Run with real input.
  3. Clear the editor to spaces and press Run and Submit.
  4. Press Ctrl+Enter from inside the editor.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-006Submit grades every case — verdicts, per-case rows, hidden opacityP1

Steps

  1. Write a deliberately wrong solution; Submit (Ctrl+Shift+Enter).
  2. Read the verdict and every test-case row.
  3. Write a correct solution and Submit → Accepted.
  4. While another submission is grading, reload the page.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-007After acceptance: editorial unlock, Next challenge, My Solutions handoff, honest re-solveP1

Steps

  1. Accept a challenge (use a different account or an unsolved challenge).
  2. In the accepted result, press Read the editorial, Next challenge and Open it in My Solutions.
  3. Reopen the solved challenge; submit a wrong answer; then check standing, Solutions and XP.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-008Hints ladder: free, ordered, no penaltyP1

Steps

  1. On a challenge with hints, open the Hints tab; reveal hints one by one to the end.
  2. Close and reopen the page; re-read revealed hints.
  3. Solve the challenge and check your XP.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-009Tries history: own submissions only, honest ageingP2

Steps

  1. Make several submissions on a challenge; open the Tries tab.
  2. Open one try's source; look for another learner's submission via a guessed identifier (dev tools).

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-010Pace limit and busy grading are platform states, never your failureP2

Steps

  1. Fire Runs/Submits quickly until the per-minute pace refuses (10/min shared across practice).
  2. Read the refusal; wait it out.
  3. If the grading service is busy, watch a submission that waits.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-011Content lifecycle: unpublished/archived/deleted challenges stay honestP2

Preconditions

Staff tester: unpublish, then archive or delete a challenge the learner has tried/solved. Republish it after.

Steps

  1. Learner opens the challenge's address while it is unpublished, then archived.
  2. Check the learner's Solutions entry, standing and XP.
  3. Staff republish; learner solves nothing new — check no second reward exists.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-012Staff on a challenge: free practice, no XP, no solve-rate, no Solutions entryP2

Preconditions

Sign in as staff / tester-staff-1 (Admin) in a second browser or after your learner session.

Steps

  1. Open a challenge; read the staff note.
  2. Submit a correct solve; check the solve rate, the staff member's XP and My Solutions.

Expected

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

Challenges — pipelines

TC-CHL-013Pipeline — first solve pays once across every surfaceP1

Steps

  1. Pick an unsolved easy challenge; fail once (Tried); then solve it.
  2. Check: catalogue standing, XP history, My Solutions, the header level, skills.
  3. Solve the "same" challenge again in a second language.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CHL-014Pipeline — independent ownership: same exercise in Challenge, Track and Daily pays separatelyP1

Preconditions

Find the same-named (or equivalent) exercise as a standalone challenge and inside a track; note today's Daily if it matches too.

Steps

  1. Solve the standalone challenge.
  2. Solve the same-worded track challenge.
  3. Check XP history, Solutions and each area's standing.

Expected

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

Tracks — ordered single-language practice

A track is ordered practice in one language, owning its own challenge collection — never a link to standalone Challenges. Standing: Not started → In progress → Completed. Its challenges use the shared workbench but with exactly one language tab. Order is guidance, not a lock. Completing all currently published entries earns the track achievement (no XP — each challenge already pays its own first-solve XP).

RoutePageNotes
/tracksTracksCard grid; your tracks first: in progress → not started → completed
/tracks/:trackIdTrackStepper path of its challenges + standing card + About this track
/tracks/:trackId/challenges/:challengeIdTrack challengeSame workbench as a challenge but one fixed language tab

What must work: Start once, Continue to the first unsolved, fixed language, own first-solve XP per challenge, completion once and durable through content changes, "See your track solutions" onward.

Seed content

"Arrays and Strings" and "Recursion and DP" — 17 track challenges total.

Tracks — the list and the track page

TC-TRK-001Tracks grid: cards, ordering and standingP1

Steps

  1. Open /tracks.
  2. Start one track, return to the grid; finish a track on another account, return.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TRK-002Track page: stepper path, standing card, Start/ContinueP1

Steps

  1. Open "Arrays and Strings".
  2. Press Start track twice.
  3. Solve one challenge out of order; return and press Continue.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TRK-003Track challenge: one language tab, track place shown, own recordsP1

Steps

  1. Open a track challenge.
  2. Look for a language selector; try to change language.
  3. Check the strip under the title and the workbench tabs.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TRK-004First solve in a track challenge pays its own XP and files under TracksP1

Steps

  1. Accept a track challenge.
  2. Check XP history and My Solutions → Tracks.
  3. Re-solve the same track challenge.

Expected

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

Tracks — pipelines

TC-TRK-005Pipeline — completing a track: achievement, no XP, completion survives new contentP1

Steps

  1. Solve every published challenge in a track.
  2. Read the finishing submission's result; return to the track page.
  3. Ask a staff tester to publish a new challenge into the completed track; reopen the track.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TRK-006Pipeline — track lifecycle edges: unpublish, archived entry, empty trackP2

Preconditions

Staff tester to unpublish/republish a track and to archive one challenge a learner is mid-way through.

Steps

  1. Staff unpublish a track the learner started; learner opens /tracks and the track's address.
  2. Staff republish it; learner resumes.
  3. Staff archive the learner's "current" entry; learner presses Continue.

Expected

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

Daily Challenges — one problem per product date

One staff-selected challenge per product date (09:00 → 09:00 IST), the same for every learner. A first accepted solve pays difficulty XP plus any authored bonus (0–200, default 40) — catch-up on a past date pays the same in full. Daily owns the platform's daily streak: consecutive eligible dates solved on their dates. The Daily can be switched off in settings; a voided date is neutral for everyone.

RoutePageNotes
/daily-challengesTodayToday's challenge, countdown, streak panel, month calendar
/daily-challenges/pastPast DailiesLoad older history; every solvable past date
/daily-challenges/:productDateOne DailyThe challenge for that date; catch-up solving still pays in full

What must work: the on-time rule is the platform's receipt time during the product date (not device clock, not grading finish); pending grading is named, not a fake break; catch-up pays full but never repairs a streak; the switch and calendar states are honest.

Seed content

30 Dailies — one per day, IST today−14 → today+15. The 21:00 IST evening reminder goes only to eligible learners who submitted to any Daily in the last 14 days, have it on, and haven't disabled the preference.

Daily — today's page (/daily-challenges)

TC-DLY-001Today page: the challenge, the countdown and your stateP1

Steps

  1. Open /daily-challenges before 09:00 IST and after (visit twice across the boundary if timing allows).
  2. Read the challenge card and the countdown.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-002Solve today's Daily on time → full award + streak dayP1

Steps

  1. Open today's Daily; solve it within its product date (before 09:00 IST tomorrow).
  2. Check XP history, the streak panel, the calendar cell and My Solutions.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-003On-time is receipt time: submission just before 09:00 still counts for its dateP1

Steps

  1. At ~08:58–08:59 IST (or as close as feasible), submit a solution to today's Daily.
  2. Let grading finish after 09:00 if it does.
  3. Check the streak and the calendar cell.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-004Grading pending / platform failure keeps code and never fakes a break or a solveP2

Steps

  1. Submit; throttle the connection or catch a platform failure while grading.
  2. Close the tab mid-grading; reopen.
  3. If the content changed mid-grading (staff edit), watch the outcome.

Expected

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

Daily — past list, calendar & streak

TC-DLY-005Past Dailies list and catch-up pays in fullP1

Steps

  1. Open /daily-challenges/past; scroll and load older history.
  2. Open a past date you haven't solved; solve it.
  3. Check XP history, its Solutions entry, the calendar cell and your streak.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-006Calendar: nine date states, never colour aloneP1

Steps

  1. Read the month calendar on /daily-challenges; hover/focus cells of each kind.
  2. Navigate to an earlier month.
  3. Compare with Home's seven-day strip.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-007Streak panel: current, At risk today, longest, milestones, lapseP1

Steps

  1. Build a short streak over consecutive days (or use an account that has one).
  2. Read the streak panel while today is unsolved, then after solving.
  3. Miss a day; read the lapse acknowledgement.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-008The Daily switch: off cancels honestly, on starts fresh, practice stays openP1

Steps

  1. With a live streak, turn the Daily off on the streak panel (and check the same switch at /profile/settings/dailies).
  2. Solve today's Daily while it is off; read the streak panel and Home.
  3. Turn it back on; solve on time; check the streak.

Expected

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

Daily — solving, rewards & lifecycle

TC-DLY-009Reward facts: bonus shown, difficulty locked at acceptance, repeat pays nothingP1

Steps

  1. Read today's pay line before solving ("n XP + n XP bonus for a first solve").
  2. Solve it; re-solve it; change language and solve again.
  3. Where a Daily's XP can't be read, check the wording.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-010Hints, editorial and My Solutions on a DailyP2

Steps

  1. Reveal hints on a Daily; solve it; open its editorial where authored.
  2. Open its My Solutions entry and compare where an editorial exists.
  3. Check that hidden test cases, reference solutions and unrevealed hints stay hidden.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-011Neutral and voided dates: no streak harm, honest statesP2

Preconditions

Find a neutral date (a date with no Daily scheduled — likely outside the seeded window or an unscheduled gap); a voided date exists only if a Super Admin voids one.

Steps

  1. Read the calendar on a neutral date between two solved days.
  2. Open a voided date's Daily if one exists; Run and read hints.
  3. Check the streak.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-012Evening reminder: opens the actual date's challengeP2

Preconditions

Learner eligible (submitted to a Daily in the last 14 days), Daily on, reminder preference enabled; today unsolved by 21:00 IST.

Steps

  1. At/after 21:00 IST, check the inbox/bell for the reminder.
  2. Open it the next day.

Expected

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

Daily — pipelines

TC-DLY-013Pipeline — two dates across the 09:00 boundaryP1

Steps

  1. Day 1 (before 09:00 IST): solve today's Daily.
  2. Keep the page open past 09:00; watch the boundary.
  3. Solve the new date's Daily.
  4. Check the streak, calendar and XP history.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DLY-014Pipeline — lapse then rebuild: no shortcuts, no fake historyP2

Steps

  1. On an account with a live streak, let an eligible date pass unsolved.
  2. Solve the next date on time; then solve the missed date as catch-up.
  3. Read the streak panel, longest streak and calendar.

Expected

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

Debug Detective — repair the broken program

Each case ships broken code; acceptance means your repaired program passes every test case — no bug-location quiz, no partial score. Standing: Not started → Tried → Fixed. Two modes: Practice only (free, untimed) and Timed then practice (explicit windows — default 30 minutes, 3 per case — that never pause). Cases are offered only in the languages the author wrote broken code for. First fix pays the difficulty XP once either mode; only a qualifying timed acceptance contributes skill evidence.

RoutePageNotes
/debug-detectiveCase boardSearch + filters (status, mode, difficulty, language, bug type, topic), Load more
/debug-detective/:caseAddressCase workbenchReadable address; test editor + Debug additions (changed-lines bar, compare, restore)

What must work: broken-code seeding, changed-lines marking that never reveals where the bug is, free Run with one "This is the bug" cue, Validate Fix all-or-nothing, debrief unlock on first fix, one timed window at a time, honest deadline checkpointing, allowance restored on platform invalidation.

Seed content

12 cases — 4 easy ("Attendance Total and Best Day", "Grade Bands", "Leap Year Check", "Word Count"), 6 medium, 2 hard ("Spiral Order of a Grid", "Batch Rosters"). Bug types include off-by-one, boundary, state, logic, resource, typo.

Debug — the case board (/debug-detective)

TC-DBG-001Board: case-file cards, filters, fix rates kept apartP1

Steps

  1. Open /debug-detective; read a card.
  2. Filter by bug type, language, your status and mode.
  3. Read both Fix rates on a timed case.

Expected

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

Debug — the case workbench

TC-DBG-002Case page: brief, seeding precedence, per-language workP1

Steps

  1. Open a case ("Leap Year Check").
  2. Read the brief; check the language tabs offered.
  3. Edit in one language, switch to another, come back.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DBG-003Changed lines, "This is the bug", compare — and nothing marks the bugP1

Steps

  1. In a case, edit a few lines — watch the editor's head and gutter.
  2. Run so the examples fail (first failing run of the visit).
  3. Press Compare with the broken code; then Back to your code.
  4. Try Reset to the broken code and Restore last submitted.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DBG-004Run free, Validate Fix all-or-nothing, verdict honestyP1

Steps

  1. Run the broken code against the visible cases; Run with your own input.
  2. Press Validate Fix (Ctrl+Shift+Enter) with an incomplete fix; read the rows.
  3. Complete the fix and Validate → accepted.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DBG-005First fix: standing Fixed, XP once, debrief unlock, Solutions entry with modeP1

Steps

  1. Validate a full fix on an unfixed case.
  2. Open the Debrief tab; check XP history and My Solutions → Debug Detective.
  3. Fail a later validation; check Fixed stays.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DBG-006Recent submissions: outcomes, history window, honest ageingP2

Steps

  1. Make several validations; open the Tries tab.
  2. Open one's source; look for an aged-out entry.

Expected

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

Debug — timed windows

Timed-window facts

Explicit start, one language, fixed minutes (default 30, configurable 5–120) and allowance (default 3, configurable 1–10) per case — the allowance spans all languages. One active timed window across all of Debug Detective; it may coexist with one live Mock/Company test (neither pauses). The checkpoint saves on Run, Save/Ctrl+S, Validate Fix and after 30 s of idle typing; a save within 5 s of the end is still taken. Closing the page doesn't discard the window.

TC-DBG-007Starting a timed window: disclosure, one language, one window at a timeP1

Steps

  1. On a timed case, choose a language and press Start timed window.
  2. While it runs, try starting a window on another case.
  3. Check the board's disclosed allowance.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DBG-008Deadline checkpointing: what reaches the deadline and what doesn'tP1

Steps

  1. In a window, type a partial fix without saving; check the tab's save mark.
  2. Press Save and Ctrl+S; type more and idle 30 s; press Run.
  3. Close the tab mid-window; reopen the case.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DBG-009Window endings: accept / finish now / timeout — and platform invalidation restores the windowP1

Steps

  1. Window A: validate a full fix inside it.
  2. Window B (new window or another case): press Finish now and confirm.
  3. Window C: let time run out with unsent local edits past the last checkpoint.
  4. If a staff tester can: have a case's grading-relevant content changed (or unpublished) mid-window.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DBG-010After the windows: unlimited practice, a live test's restrictions apply, both populations countedP2

Steps

  1. Use all timed windows on a case.
  2. Keep practising; read the board and case for both Fix rates.
  3. While a live Mock/Company test is in progress (stage one if possible), open a timed window.

Expected

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

Debug — pipelines

TC-DBG-011Pipeline — practice fix → XP + debrief + Solutions entry; then timed fix adds evidence onlyP1

Steps

  1. Open an unfixed case in practice; run, read the cue once, fix, Validate.
  2. Read the debrief; open its Solutions entry (mode "In practice").
  3. If the case is Timed then practice: start a timed window on the same case and fix it again.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-DBG-012Pipeline — timed window end-to-end: start → checkpoint → timeout grading → allowance honestyP1

Steps

  1. Start a timed window; edit and let a checkpoint save (Run or 30 s idle); make further unsent edits.
  2. Let the window expire (or coordinate a short-window case with staff); reopen the case.
  3. Check: windows left, last-window outcome, Fix rates.

Expected

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

Code Lab — the ungraded playground

One scratch buffer per language — free, ungraded, unrecorded. A run is an interactive terminal (cloud or your own device) or a browser preview for HTML/CSS/JS; SQL runs in-browser on SQLite. No XP, no history, no solve rate, no skill evidence. Limits: 60 s per run, 256 MB (Java 384 MB), half a processor, 1 MB output, 2 minutes waiting for input; 10 starts/minute; 3 concurrent programs across Code Lab + Workspace; a program stops within 15 s of the session ending.

RoutePageNotes
/code-labCode LabEditor beside output (terminal or preview); prepared input fold above; supplied page + environment folds under

What must work: Auto detection vs manual choice, per-language device drafts, honest run states (Ready/Queued/Running/Complete/Failed/Unavailable), Stop, Reset, download, format, environment view, queue position, every refusal named.

Code Lab — languages, drafts and the scratch

TC-CLB-001Language picker: Auto first, real registry, coming-soon entries honestP1

Steps

  1. Open /code-lab; open the language picker.
  2. Look for TypeScript, Kotlin, Swift, Scala, React.
  3. Pick Auto, paste obvious Python code, watch detection.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CLB-002One scratch per language: drafts on this device, starters, saved-locally honestyP1

Steps

  1. Pick Python; edit its starter; switch to JavaScript; switch back.
  2. Reload the page; sign out on the main site and sign back in; check the scratch.
  3. Watch the page's foot after edits.
  4. Block localStorage (dev tools) and reload.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CLB-003The run bar names where it runs: "This device · Python 3.14.2" vs "Cloud · Python 3.14.10"P1

Steps

  1. Pick Python; read the run bar's language label before running.
  2. Run; read where the run was placed.
  3. Open the environment fold under the editor.

Expected

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

Code Lab — runs, input, output and limits

TC-CLB-004Interactive terminal: output streams, typing input, prepared input, idle and time limitsP1

Steps

  1. Write a program that prints, then asks for input (e.g. Python input()); Run it and type into the terminal.
  2. Open the prepared-input fold and pre-fill lines; Run again.
  3. Write a program that prints nothing; Run it.
  4. Write an infinite loop; Run and wait past 60 s.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CLB-005Browser preview: isolated frame, console, supplied page, links never followedP1

Steps

  1. Pick HTML (or CSS / browser JavaScript); Run.
  2. Cause a console error in the preview script.
  3. Put a link in the page pointing anywhere and click it.
  4. Download the source; check what it contains.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CLB-006SQL in the browser: SQLite on your device, fresh database each runP1

Steps

  1. Pick SQL (in the browser); write CREATE TABLE + INSERT + SELECT; Run.
  2. Run again — check the second run doesn't see the first's tables.
  3. Write a long-running query; Stop it.
  4. Check where its version is shown.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CLB-007Stop, Reset, queued runs and cancelled runsP1

Steps

  1. Start a run; press Stop before it finishes.
  2. Start a run that queues; cancel while queued.
  3. Edit the scratch; press Reset; confirm; then Reset and cancel.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CLB-008Shared limits and refusals — each one named, never your code's faultP1

Steps

  1. Start programs until you hold 3 concurrent (across Code Lab/Workspace).
  2. Try to start another; open "See your running programs".
  3. Start 10 programs within a minute; try an 11th.
  4. Disconnect the network and Run.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CLB-009Standard-execution alternative is honest about not being builtP2

Steps

  1. Catch a run where the interactive terminal never started (throttle/network or observe a genuine startup failure).
  2. Look for the standard-execution choice.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-CLB-010Download, Format, Expand, environment view — and no generated-help controlsP2

Steps

  1. Press Download; check the file.
  2. Press Format (Ctrl+Shift+F) where offered; undo it.
  3. Expand the editor and restore.
  4. Open the environment fold; read it.
  5. Select code and look for any Analyse/Explain actions.

Expected

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

Code Lab — pipelines

TC-CLB-011Pipeline — write → run → stop → draft persists → nothing graded or recordedP1

Steps

  1. Pick Python; write and run a program; stop one run; switch languages twice and back.
  2. Close the browser entirely; reopen Code Lab.
  3. Check XP history, My Solutions, Skills and your submission histories.

Expected

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

Typing Quest — typing practice in English and in code

Typing Quest trains typing on the learner's device — no keystroke goes over the network; each finished round sends one summary. Speed is WPM for English, CPM for code. The Typing Daily (own streak, own calendar, same 09:00 IST day) pays 20 XP once per date — everything else pays nothing, so practice can't be farmed. Computers only: a touch device gets the notice where the round would be. Thirteen achievements including WPM 40/60/80/100 at ≥95% accuracy on a 60-second English test, code 200/300/400 CPM on a whole snippet, Touch typist, From memory, and typing streaks at 100/200/365 days.

RoutePageNotes
/typing-questTyping Quest (hub)Test / Level check / Custom text + Typing Daily card, streak, recent bests; the round runs in place
/typing-quest/dailyTyping DailyToday's round, streak panel, calendar, switch
/typing-quest/learnLearn to typeOrdered keyboard lessons with finger zones; a lesson opens as a page state
/typing-quest/drillsDrillsSymbol and Bracket Blitz · My weak spots · Boilerplate Speedrun
/typing-quest/resultsTyping resultsFilters, bests, speed over time, key heatmap, slowest pairs, recent rounds

What must work: the round (Editor/Plain mode, ghost and bots, keyboard at the foot), honest save states and fair-result checks, the daily's streak/switch/calendar, lessons passing at target accuracy, drills from your own figures, honest empties everywhere.

Seed content & the fair-result checks

123 published texts: English simple/complex/placement/common-words; code in C, C++, Java, JavaScript, Python; templates; 7 lessons. A round is kept unverified when implausible — over 250 WPM, too short for its characters, machine-even key delays, contradictory figures, or longer than the server saw (+5 s leeway). Unverified rounds stay in your history but earn nothing. Paste and drop are refused. Pace: 30 round starts/minute; a finish window of 2 hours.

Typing — the hub and the tests (/typing-quest)

TC-TYP-001Start panel: kinds, lengths, modes — choices kept on the deviceP1

Steps

  1. Open /typing-quest; read the start panel.
  2. Pick English → Simple paragraphs → 60 seconds; pick Code → Python → whole snippet → Editor mode.
  3. Reload the page.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-002A round: first key starts the clock, mistakes marked, backspace, paste refusedP1

Steps

  1. Start an English 30-second test; type with some deliberate mistakes and corrections.
  2. Try to paste into the text; try drag-and-drop.
  3. Let the time run out; on another round type to the last character early.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-003Editor mode vs Plain mode behave differently — and bests are kept per modeP1

Steps

  1. Code test in Editor mode: type an opening bracket and a quote; press Enter on an indented line.
  2. Same in Plain mode: type brackets and use Tab at a line start.
  3. Check personal bests after rounds in both modes.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-004Ghost cursor and benchmark bots race honestlyP2

Steps

  1. Set a best on a test choice; pick Race → My best on the same choice.
  2. Pick a bot at 40/60/80 WPM (200/300/400 CPM on code) and race it.
  3. On a choice with no best, look at the Race options.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-005On-screen keyboard at the foot: press feedback, hints, hide options, finger zones in lessonsP3

Steps

  1. On a ≥768 px screen, type a round watching the keyboard.
  2. Toggle Hide keyboard and Hide key hints (Show again).
  3. Type a wrong key; open a lesson and look at the finger zones.
  4. Enable reduced motion (setting or OS) and type.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-006The round's result: figures, chart, missed words, actions, honest save statesP1

Steps

  1. Finish a test; read the whole result before it saves and after.
  2. Throttle the network so the save fails; press Retry.
  3. Check the figures: accuracy never rounds up.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-007Personal bests and celebrations: announced once, only after save, never on revisitP2

Steps

  1. Finish your first verified round on a test choice; read the result.
  2. Beat that best; reload the page.
  3. Check the confetti behaviour.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-008Level check and Custom text: their own kinds, their own rulesP2

Steps

  1. On the hub, choose Level check; type a passage.
  2. Choose Custom text; paste 20–3,000 characters with curly quotes and accents; type it.
  3. Check Results filters for both.

Expected

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

Typing — the Typing Daily (/typing-quest/daily)

TC-TYP-009Today's round: one English slot or your code language, 90% accuracy completesP1

Steps

  1. Open /typing-quest/daily; read today's offer.
  2. Type today's round; finish under 90% accuracy; type it again at ≥90%.
  3. Check the date's state and XP history.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-010Typing streak panel, calendar and switch — its own streak, not the Daily'sP1

Steps

  1. Complete today's Typing Daily on two consecutive days (or read an account that has).
  2. Read the streak panel and the month calendar.
  3. Turn the switch off and on (at /typing-quest/daily and /profile/settings/dailies).

Expected

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

Typing — Learn to type and Drills

TC-TYP-011Lessons: ordered steps, target accuracy, progress kept, Touch typistP1

Steps

  1. Open /typing-quest/learn; read the lesson list.
  2. Open a lesson; type a step under its target accuracy, then at or over it.
  3. Finish every step of a lesson; watch the completion.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-012Symbol and Bracket Blitz: language symbols, 30 s, slowest keys namedP2

Steps

  1. Open /typing-quest/drills; run Symbol and Bracket Blitz in Python, then JavaScript.
  2. Read the result.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-013My weak spots and Drill my mistakes — built from your own figures, never inventedP2

Steps

  1. Type a few tests first if the account is new (200 keystrokes needed).
  2. Open My weak spots in English and in a code language.
  3. On any round's result, press Drill my mistakes; then open the drills page fresh without a result.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-014Boilerplate Speedrun: Learn it then From memory — 95% match counts it doneP1

Steps

  1. On the drills page, pick a template in a language; Learn it (typed with it shown, Editor or Plain mode).
  2. Choose From memory: type it as best you can (paste/drop/undo refused — verify), press Done.
  3. Read the match, differences and time; try again for a better time.

Expected

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

Typing — Results (/typing-quest/results)

TC-TYP-015Dashboard filters and which rounds countP1

Steps

  1. Open /typing-quest/results; switch Rounds filters (All, an English level, a code language) and Period (7/30/90 days, All time).
  2. Finish a drill and a Level check; check the filters again.
  3. Find an unverified round in Recent rounds.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-016Bests, speed over time, key heatmap and honest empty statesP2

Steps

  1. On a fresh account (or a filter with no rounds), read the whole dashboard.
  2. After some rounds, read personal bests, speed over time, the heatmap by speed and by mistakes, slowest pairs and most-missed words.
  3. Check the All-time heatmap note.

Expected

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

Typing — pipelines

TC-TYP-017Pipeline — test → saved round → best → achievement thresholdsP1

Steps

  1. Finish a first verified round (any kind) → check the First round achievement.
  2. Type a 60-second English test at ≥95% accuracy over a WPM threshold you can reach.
  3. Type a whole code snippet at ≥95% over a CPM threshold.
  4. Check Achievements and the results' progress.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TYP-018Pipeline — Typing Daily across two days: 20 XP once per date + streakP1

Steps

  1. Finish today's Typing Daily on its date; check XP history and the streak.
  2. Finish a past date's round as catch-up (?date=… on the daily page); check XP and the streak.
  3. Retype today's round and send the finish again.

Expected

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

My Solutions — the read-only archive of accepted code

Every first accepted submission per learner × owned item × language files one entry automatically — Challenges, Tracks, Daily Challenges and Debug Detective. Read-only: no Run, Submit or editing here. Entries last for the account's life; source is kept 90 days or while among your most recent (80 challenges · 80 tracks · 30 dailies · 40 debug), whichever keeps more. Staff never file entries.

RoutePageNotes
/solutionsMy SolutionsFour kind cards with counts, how-far-through figures, retention explanation
/solutions/:typeOne kind's solutionsList beside the open entry where there's room
/solutions/entry/:entryIdSolution entryRead-only code under its file tab, language tabs for other accepted languages
/solutions/entry/:entryId/compareCompare solutionYour code beside the editorial — closes while a live test is in progress

What must work: exact-entry handoff after acceptance, per-language tabs, own highlighter (never the code editor), Wrap/Copy/line numbers, honest expiry vs fetch failure, editorials beside code where unlocked, milestone celebrations at 5/10/25/50/100/250.

Solutions — browse and open

TC-SOL-001Hub: four kind cards with real counts and reachP1

Steps

  1. Open /solutions.
  2. Read each kind's card and the collection's figures.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-SOL-002Entry view: file tab, language tabs, line numbers, Wrap, Copy — own highlighterP1

Steps

  1. Solve a challenge in two languages; open its Challenges entry.
  2. Switch the language tabs; use Wrap and Copy; check line numbers.
  3. Try to type in the code.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-SOL-003Origin facts: Debug mode, Daily date and on-time/catch-up, Tracks' track nameP1

Steps

  1. Open a Debug entry, a Daily entry and a Tracks entry.
  2. Read each one's occasion line.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-SOL-004Editorials beside your code — unlock rule, language match, live-test closingP1

Steps

  1. Open an entry whose challenge has an editorial; press Compare.
  2. Open an entry for a challenge with no editorial in your language.
  3. Start a live Mock/Company test, then try the compare view (coordinate or mark N/A).

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-SOL-005Code expiry vs fetch failure vs privacy — three different truthsP2

Steps

  1. Open an entry whose code has aged out (find one, or simulate by ageing on an account with old solves).
  2. Throttle the network so a source fetch fails on an entry that should have code.
  3. Try opening another learner's entry id directly.

Expected

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

Solutions — pipelines

TC-SOL-006Pipeline — acceptances across areas file separate entries; milestones celebrate onceP1

Steps

  1. Solve a standalone challenge, a track challenge, a Daily and a Debug case.
  2. Open each kind's page and each entry from its area's handoff.
  3. Cross a saved-solutions milestone (5/10/25/50/100/250) if near one.
  4. Re-solve one item in the same language; check the entry.

Expected

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

Tools — ten browser-only helpers

Ten small helpers that run entirely in the browser — nothing typed ever leaves the device: no backend, no history, no XP, no skill evidence, invisible to staff figures. Work saves locally under the signed-in account and clears at sign-out. The one thing a tool reports is that it's being used (minutes toward your own active time — the tool's name and the minute, nothing typed).

RouteToolRouteTool
/toolsCatalogue (all ten, grouped)/tools/cronCron Explainer
/tools/resumeRésumé Builder/tools/complexityComplexity Estimator
/tools/algorithmsAlgorithm Animator/tools/gitGit Sandbox (pretend repo)
/tools/regexRegex Tester/tools/schemaSchema Sketch
/tools/compareText Compare/tools/code-imageCode Image
/tools/sample-dataSample Data

What must work everywhere: "Saved locally" honesty; bounded inputs with the limit said where reached; keyboard-operable; mobile layouts; no network traffic for the work itself; honest estimates; a corrupt saved value starts afresh with a toast, never silently overwritten.

Tools — the catalogue and shared rules

TC-TOL-001Catalogue lists all ten tools and each opens at its own addressP1

Steps

  1. Open /tools.
  2. Open each of the ten tools.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-002Nothing leaves the browser; saved locally; clears at sign-outP1

Steps

  1. Open dev tools → Network; use several tools (type a résumé, a regex, a schema).
  2. Reload a tool mid-work; check "Saved locally".
  3. Sign out on the main site and back in; reopen the tools.
  4. Open the same tool in two tabs; edit in one, watch the other.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-003Bounded, mobile, accessible — the shared tool rulesP2

Steps

  1. Push a stated limit in any tool (e.g. 1,001 rows in Sample Data, 81 lines in Code Image).
  2. Walk one tool entirely by keyboard.
  3. Open tools at 390 px and 768 px.
  4. Enable reduced motion.

Expected

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

Tools — the ten tools

TC-TOL-004Résumé Builder: sections, templates, live preview, PDF with real textP1

Steps

  1. Open /tools/resume; Fill with an example (confirm).
  2. Edit entries, hide/rename/move sections; move and remove an entry (undo from the toast).
  3. Switch templates (Classic / Modern / Two-column), accent, text size, A4/Letter, margins.
  4. Read the advice; Save as PDF via the browser print; Download the file and Open a file back; Copy as text.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-005Algorithm Animator: step through sorts/searches/graphs with counts and predict modeP1

Steps

  1. Open /tools/algorithms; run Bubble sort on random values.
  2. Step forward and back; change speed; use Space / arrows / Home.
  3. Turn on predict; run and answer the swap questions.
  4. Run Binary search (it asks for the value to find) and BFS/DFS on the graph; try data over the bounds.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-006Regex Tester: live matches, groups, plain-words errors, replace, boundedP1

Steps

  1. Open /tools/regex; pattern \b\w+@\w+\.\w+\b on text with emails — watch matches highlight as you type.
  2. Toggle flags (g, i, m, s, u); read the part-by-part explanation; try a replacement.
  3. Type a broken pattern; load a common pattern; try a catastrophic pattern like (a+)+$ on a long non-matching string.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-007Text Compare: real diffs, whitespace honesty, folds and boundsP1

Steps

  1. Open /tools/compare; paste program output on one side, expected on the other, differing in a trailing space and a missing final newline.
  2. Toggle ignore-whitespace and ignore-case; switch side-by-side/one-column.
  3. Compare texts with a long unchanged run.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-008Cron Explainer: plain words, next ten runs in IST, builder, odd cases honestP1

Steps

  1. Open /tools/cron; read */15 9-17 * * 1-5 in words and its next runs.
  2. Try @daily, @hourly; try 0 0 30 2 * (30 Feb) and a non-five-field entry.
  3. Build a schedule by choosing fields.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-009Complexity Estimator: labelled estimate, marked lines, honest unknownsP1

Steps

  1. Open /tools/complexity; paste a nested-loop Python function; read the estimate and the marked lines.
  2. Try a recursive function; a function with a sort/in call; an empty box; prose with no function.
  3. Read the growth-rate table at a chosen size.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-010Git Sandbox: pretend repository, commit graph, exercises, conflicts, boundsP1

Steps

  1. Open /tools/git; run status, add, commit, branch, switch, merge, log — watch the commit graph.
  2. Create a conflict (same file on two branches) and resolve it; check git status mid-conflict.
  3. Pick a guided exercise; reach its goal; Start again.
  4. Push a bound (13th branch, 121st commit, 201-char message).

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-011Schema Sketch: tables, columns, relationships, SQL for three dialects, file round-tripP1

Steps

  1. Open /tools/schema; load an example (shop/college/blog).
  2. Add a table with columns (name, type, primary key, not null, unique); draw a relationship by choosing the column a column refers to; move tables.
  3. Switch SQL dialect (PostgreSQL / MySQL / SQLite); copy or download the SQL; Download the sketch file and Open it again; remove a column and undo from the toast.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-012Code Image: styled snippet to PNG — own colours, honest limitsP1

Steps

  1. Open /tools/code-image; paste a Python snippet; pick a language, colour set (Night/Ink/Paper/Sand), background (incl. clear), padding (16/32/64), text size, window frame, line numbers, title.
  2. Download the PNG; Copy the image.
  3. Paste over 80 lines.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-TOL-013Sample Data: made-up rows in JSON/CSV/SQL — bounded, reproducible, honestP1

Steps

  1. Open /tools/sample-data; load an example (students/orders/employees).
  2. Build fields (name, email, date in range, number in range, one of a list, UUID); generate 500 rows as CSV, then SQL inserts for each dialect.
  3. Note the seed; regenerate with the same seed; try 1,001 rows and a 21st field.

Expected

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

Tools — pipelines

TC-TOL-014Pipeline — résumé and schema files round-trip across a sign-outP1

Steps

  1. Build a résumé and a schema; Download each file.
  2. Sign out and back in (local work now cleared).
  3. Open each file back into its tool.

Expected

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

Cross-cutting checks — every page in this document

Run these sweeps once per area while you are in it. Any failure is a bug on that page.

TC-X-001Absence of Credits and generated-help UI across all practice surfacesP1

Steps

  1. Walk every page in this doc (challenge, track challenge, Daily, Debug case, Code Lab, Solutions, lessons, typing, tools).
  2. Search each page's text for "Credit", "Analyse", "Explain this error", "generated".

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-X-002Honesty invariants on every list, figure and saveP1

Steps

  1. Throttle the network (Slow 3G / offline) on each page type: catalogue, workbench, results, archive.
  2. Read every count, percentage and save label it shows.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-X-003Hidden material stays hidden everywhere — dev-tools checkP1

Steps

  1. On a challenge, Daily and Debug case, open dev tools → Network and inspect the API responses the page received.
  2. Submit a failing solution; inspect what hidden-case rows contain.
  3. Look for reference solutions, expected outputs, hidden datasets and unrevealed hints anywhere in page data.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-X-004Shared editor behaviour is identical across solving surfacesP2

Steps

  1. On a challenge, a track challenge, a Daily and a Debug case, check the same set: shortcuts, Reset at the head, editor foot, output area, dividers, text size/wrap.
  2. Drag the divider between code and output; reload.
  3. Paste a NUL character into code (e.g. via console) and Run.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-X-005Once means once — double-clicks and duplicate tabs never double anythingP1

Steps

  1. Double-click Submit, Validate Fix, Start timed window, Start track, Complete and continue.
  2. Open the same challenge in two tabs; submit in both.
  3. Replay a network request (dev tools) for a finish/submit call.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-X-006Not-found is privacy-safe and named per areaP2

Steps

  1. Open made-up addresses: /challenges/does-not-exist, /tracks/0, /daily-challenges/1900-01-01, /debug-detective/nothing-here, /solutions/entry/000, /courses/no-such-subject, /lessons/99999.
  2. Open a hidden/archived item's address.

Expected

Result: ☐ Pass  ☐ Fail  ☐ N/A   ·  Notes: ____________________
TC-X-007Vocabulary and surface honesty across this doc's pagesP3

Steps

  1. Read labels on a sample of pages: standings, buttons, notices.
  2. Check a phone-width pass on each catalogue and board.

Expected

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

Wizly Learning Testing Handbook · doc 01 of 7 · generated from the product specification (docs/) and source of Sprinkle-Jelly-V1 · November 2026 · test-case prefixes in this doc: CRS · CHL · TRK · DLY · DBG · CLB · TYP · SOL · TOL · X