Mock Tests, Company Tests, the test room, strictness and recorded events, results, practice papers, Workspace Projects and Course Workspaces · Requires: learner account, computer viewport ≥1024px for the test room · Related docs 01 (practice restrictions while a test is live), 03 (sessions, toasts, XP, achievements), 06 (the complete live-test journey)
Read before you start — tests are spent
Each learner gets ONE recorded test per paper. A started test cannot be discarded, retaken or reset; submitting or timing out spends it for that account forever (only invalidation or a staff relief grant restores one). With 4 Mock papers, 6 Company papers and 5 learner accounts, agree a plan before anyone presses Accept the conditions and start. Catalogue, paper and briefing cases (TC-ASM) spend nothing — only Start does.
One live test at a time by default. While any test is in progress, starting any other Mock or Company paper is refused — plan so a tester never strands themselves needing a second start, and end every test you start (submit it, or let it run out) before moving on.
Write your answers down. For every test you take, note each question number and what you answered — the owner checks marking against your result.
Seed papers (use these; do not invent your own)
Key facts
Mock: Python Foundations (Python, easy, Featured · 3 sections · 20 q · 45 min · Standard · pass 50%)
Standard papers: leaving is recorded, never ends the test. Pass mark on every Mock: 50%. Programs run on examples freely unless the paper limits it.
Mock: Data Structures Essentials (Data Structures, medium, Featured · 3 sections · 20 q · 50 min · Standard)
Mock: SQL Queries (SQL, medium · 3 sections · 21 q · 40 min · Standard · no coding)
Company: Northvale Systems — Graduate Engineer Trainee (3 sections · 12 q · 50 min · Standard · runs limited to 10); Associate Software Engineer (2 sections · 10 q · 75 min · Strict, limit 3)
Every company paper is Pattern and takes its sections one at a time — a section closed behind you cannot be re-entered. Company Tests have no pass mark and pay no XP.
Company: Corvane Software — Data Analyst Trainee (2 sections · 12 q · 35 min · Standard · no coding); Backend Developer (2 sections · 8 q · 45 min · Standard · one program)
Company: Tamarind Grove Technologies — Systems Engineer (4 sections · 16 q · 70 min · Strict, limit 3 · full screen required · runs limited to 15)
Workspace templates: Python: expense diary · Flask API: task board · React: habit tracker · Data analysis: canteen orders · SQL: college fest · JavaScript: marks report
Each has 3 checklist tasks. Blank types: Python, Data analysis, Web page, React, JavaScript, SQL, and more languages; Build your own stacks a front end (HTML or React), a back end (Flask) and SQLite.
1 · Assessments — Catalogue & Entry
Everything up to — but not including — pressing Accept the conditions and start: the two catalogues, a paper's own page or briefing, the systems check, the conditions, and the results lists. These cases spend nothing and may be repeated freely on any account.
Route
Page
What it shows
/mock-tests
Mock Tests
Every published Mock paper as a card, featured first; search, one Filters control (category · difficulty), Load more; a way back to a test in progress
/papers/:paper
A Mock paper's page
About the paper, its sections, How it works, Before you start (systems check + conditions + Start)
Every test, newest first; the type addresses open it already filtered
/tests-dashboard
Assessments dashboard
Score trends, strengths, company readiness, what to do next, recent results
The pipeline
Browse the catalogue → open the paper's page (Mock) or briefing (Company) → the systems check runs by itself on arrival → read the conditions → Accept the conditions and start makes the one recorded test on a frozen copy of the paper → answer → submit → the result grades in the background → review or open practice. Opening any page before Start creates no test, no timer and no charge.
1.1 Mock Tests — the catalogue
TC-ASM-001Mock catalogue — cards, facts and plain-word strictnessP1
Preconditions
Signed in as any learner on a computer.
Steps
Open Mock Tests under Assessments in the navigation.
Read the lead line and every paper card, top to bottom.
Expected
Heading Mock Tests; lead: "Timed tests on one subject or several, to see where you stand. Each is taken once, on a computer. 4 published." and a Your mock tests link to your results.
Each card: its category in the eyebrow (Featured on Python Foundations and Data Structures Essentials), title, difficulty, a line on what it covers.
Facts two to a row: Questions ("17 questions in 3 sections" on Programming Fundamentals), Time ("45 minutes"), Marks, and Strictness in plain words — Programming Fundamentals reads "Strict · leaving the test is recorded and can end it"; the others "Standard · leaving the test is recorded".
At each card's foot: your standing (Not taken yet on an untaken paper) and one next action (Start).
Featured papers come first, then the most recently updated; nothing shows a zero count or an empty fact.
Also try
Open the page fresh from a bookmark/direct link — the catalogue loads directly.
Kestrelworks' card on Company Tests shows the third strictness line: "Off · nothing about how you take the test is recorded".
TC-ASM-002Search, filters, chips — filters remembered, search never keptP1
Steps
On Mock Tests, type "SQL" in Search mock tests ("Search by title or what it covers"). Clear it.
Open Filters, choose difficulty medium, then a category; read the applied chips.
Choose a category+difficulty pair that matches nothing. Clear with the control offered.
Choose difficulty medium again, navigate to another page, then return to Mock Tests from the navigation. Check the address bar.
Expected
Search narrows the cards to matches as you type; clearing restores.
Each chosen filter shows as a removable chip under the bar (e.g. "medium", "SQL"); removing a chip un-narrows the list.
Nothing matching: Nothing matches with a way to clear the filters — never an empty grid presented as the full catalogue.
Category and difficulty stay applied after you leave and return — they are kept in the address and remembered on this device until sign-out. The search text is not kept: it is gone when you come back.
Also try
Reload the page with filters in the address — they reapply from the URL.
Open the same address in a second browser — the device-kept filters follow it.
TC-ASM-003Card foot — one standing, one next actionP1
Preconditions
One account per standing: an account mid-test (In progress), one with a test past its time not yet ended (Overdue), one with a test being marked (Grading), and finished tests (score + Passed/Not passed). Stage them gradually as your plan's tests run.
Steps
As each state exists, open Mock Tests and read the card's foot.
Compare the action offered at each state.
Expected
Untaken: "Not taken yet" + Start. In progress: In progress + Resume. Past time unended: Overdue. Being marked: Grading (no score shown). Final: "Your score" + percentage + Passed/Not passed + View result and Practice.
Exactly one primary action per card — never Start beside Resume.
The standing is the latest test on the paper; an earlier replaced result is not what the card shows.
Also try
On a phone/tablet (or a narrow device profile in dev tools): the card still reads its standing but Start reads "Taken on a computer" and Resume "In progress: carry on on a computer".
TC-ASM-005Blocked next actions read as reasons, not dead buttonsP2
Preconditions
A paper whose availability is closed or not yet open, or an archived paper, if the seed includes one; otherwise note N/A. A second account with a live test for the at-limit line.
Steps
Read the foot of a paper you cannot start: not yet open, closed, archived, taken, or while another test is in progress.
Expected
Not yet open: "Opens {date, time IST}". Closed: "Closed". Archived: "Archived". Taken: View result (+ Practice where it opens).
At the live-test limit: "Another test is in progress. Resume it" — a link to the live test, not a Start button.
Each is a clear reason, never a disabled Start with no explanation and never an apparently usable Start.
TC-ASM-006Paper page — details, sections, How it worksP1
Steps
Open Programming Fundamentals from the catalogue. Read the whole page top to bottom.
Do the same on Python Foundations and compare the "How it works" parts.
Expected
Mock Tests as the way back; the title; Mock Test kind; category and difficulty; the facts: questions, time, marks, whether wrong answers lose marks, the pass mark and the strictness.
About the paper with the description — Programming Fundamentals says "Three sections, 17 questions, 45 minutes… Strict: leaving the test's tab is recorded, and the fifth time ends the test." — and when it was last updated.
Sections: Logic and numbers, Objects and functions, Programs — each numbered with its questions, marks, a suggested time and its briefing.
How it works, in parts on time, marking, moving through the paper and what is recorded: the clock does not pause; answers are saved as you give them; "You pass with 50% of the marks."; one line for each of the paper's navigation rules.
"What is recorded" differs honestly by paper: Standard papers say "You are told each time. Recorded events never end the test."; Programming Fundamentals says "You are told each time. At 5 recorded, the test submits itself with the answers saved by then."
Beside it, Before you start: "Each test is taken once. It is taken on a computer, not a phone or tablet." and when it can be started.
Nothing starts a test or a timer by opening the page.
TC-ASM-007Navigation features are disclosed before StartP2
Steps
On each Mock paper's page, find the lines in How it works describing how you move through the paper.
Compare with what you see inside the test later (doc §2).
Expected
One line for each of the paper's six features, stated as it applies — e.g. on the seed papers (all features on): "The time left is shown throughout.", "A grid of numbered questions shows where you are and what you have answered.", "You can mark a question to come back to. Marking is not answering.", "You can move on without answering.", "You can go back to questions you have already seen.", "You can move between sections."
Where a feature is off on a paper (staff-made variants), its line says so plainly — e.g. "The time left is not shown, but the time limit still applies.", "You answer each question before moving on to the next.", "A question closes once you move away from it."
Nothing here is discovered only inside the test: every restriction is disclosed before Start.
TC-ASM-008Availability, extra time and the archived paperP2
Steps
Read the Before you start list on an open paper: "It can be started at any time." (or "It can be started until {when}. A test started before then runs its full time." / "It opens {when}." where a window is set).
If a learner has agreed extra time (a staff accommodation), open a paper as them.
If staff archived a paper you can open, read its page.
Expected
The availability line matches the paper's window; no invented deadline where none is set.
Extra time shows as an info line, e.g. "1 hour 30 minutes, including agreed extra time: twice the usual 45 minutes."
An archived paper's page still opens and says "This paper is archived, so it cannot be started." in place of when it can be; a relief grant holder also reads "Your relief grant on it can no longer be used."
A never-published or unknown paper address gives the same plain not-found as anything missing — it does not say whether it exists.
TC-ASM-009Systems check runs by itself on arrival — and starts nothingP1
Steps
Open an untaken paper's page on a computer and watch Systems check under Before you start — do not press anything until it finishes.
Open Show the checks. Press Check again.
Expected
"This checks this computer and the test's services. Nothing starts here." then "Checking this computer…" then a one-line result: "This computer is ready · N checks passed" on a healthy computer.
Show the checks lists each item as Passed, Warning or Could not check: Connection; Saving answers and reading them back; This computer's clock; This browser; Keeping answers on this computer; Screen and pointer; Running code on a paper with programs (Python Foundations, Programming Fundamentals, company papers with coding); Full screen on Tamarind Grove's paper.
The list opens by itself when anything did not pass.
No camera, microphone, screen sharing or file access is requested at any point — that is by design, not a missing step.
No test, timer or charge is created: the paper still offers Start afterwards, and your results list gains no row.
TC-ASM-010Warnings need an explicit tick; Could not check blocks StartP1
Steps
Make the browser window narrow (under about 1,024 px wide) and press Check again.
Read the summary and the conditions area; try to start without ticking.
Widen again and re-check until all pass.
If any item ever shows Could not check (e.g. connection down), try Start.
Expected
Screen and pointer shows Warning: "The window is small, or there is no mouse or trackpad. The test is easiest on a full-size window with a keyboard and pointer."
Summary: "This computer can take the test · 1 warning to accept". The conditions show the warning in a "The systems check warned about" note ending "You can still take the test if you accept this."
A tick box appears: "I accept these conditions and the warning above" — the Start button waits for the tick. With all checks passed there is no box: one press, "Accept the conditions and start".
Could not check is not a warning: "The test can start once every item can be checked." and Start stays unavailable — you cannot tick your way past it.
A clock warning reads "This computer's clock is out by more than half a minute. The test keeps its own time, so the time left shown is still right." — it does not invent a failed check.
Also try
Disconnect and Check again: Connection and Saving answers show Could not check with their own words.
TC-ASM-013Conditions say what is true before it costs you your one testP1
Steps
On a fresh account, open Python Foundations, wait for the check to pass, and read the conditions beside Start — do not start yet.
Compare with a Strict paper (Programming Fundamentals) and the Off paper (Kestrelworks).
Expected
"Read these conditions before starting, then start the test when you are ready." followed by the true list, e.g.: "Each test is taken once; its result is the one that counts." · "The clock starts when you accept and does not pause. Time is up at {deadline, ~45 min from now}." · "Your answers are saved as you give them, and submitting is final." · "You can leave and come back until the time is up; the clock keeps running." · "Only one test can be in progress at a time, whatever the device." · "If you sign in on another device while a test is in progress, it keeps running and you continue there." · "You can't hand the test to anyone else."
On Standard: "Leaving the test page is recorded; recorded events do not end the test." On Strict: "…and at {N} recorded events the test submits itself." On Off: nothing about recording appears at all.
One action: Accept the conditions and start — the wording makes clear what pressing it does.
TC-ASM-014Start refusals — every closed path says why in its own wordsP2
Preconditions
Stage as many as your plan allows: an account with a live test; an unpublished/archived paper (staff-made); a phone or narrow device; a stale systems check (>10 min).
Steps
Try to reach Start on each refused path: another test in progress; a paper that is not published; on a touch device; with a run-out check.
Expected
Live test elsewhere: "Another test is in progress. Resume it" — a link to the live test, never a second Start.
Not published/archived: the page explains that state plainly; an archived paper adds "Your relief grant on it can no longer be used." where a grant exists.
Touch device: "Tests are taken on a computer. Open this test on one to check it and start." — no systems check, no Start.
Stale check: "This check has run out." — Start waits; re-checking restores it.
In every refusal there is no fake Start, no silent failure and no test created: your history gains no row.
Also try
Where a declared maintenance window covers a coding paper's grading, the page names it and Start does not offer — "Grading for the programs in this paper pauses {when}."
TC-ASM-015Start is idempotent — presses, reloads and two tabs all make ONE testP1
Preconditions
An account willing to spend its one test on a paper (use SQL Queries — cheapest, 40 min). You will keep this test running for the room cases, so pick the plan's designated test account.
Steps
Press Accept the conditions and start once. Before it completes, press it again / hit Enter again.
In a second account on its paper page, open the page in two tabs and press Start in both nearly together.
Check Test results for that account.
Expected
One press lands you in the test room at the paper's first question; the clock is running from that moment.
A second press mid-start changes nothing — one test is created or resumed, never duplicated.
Two tabs both land in the same test. History lists exactly one in-progress row.
Start records the time the deadline is counted from — "Time is up at {deadline}" matches duration from the press, not from page-open.
TC-ASM-016A started test is frozen — later paper edits never reach itP2
Preconditions
Staff cooperation: they hold a draft edit (title/section/question/marks change) on a paper a tester is mid-test on. If you cannot coordinate this, mark N/A.
Steps
Start the paper's test. Ask staff to publish an edit to the paper while the test runs.
Continue the test; finish it; read the result.
Expected
The running test keeps its original questions, sections, marks and settings to the end — nothing mid-test changes shape.
The result grades against the frozen copy and is still reviewable against what the learner actually saw.
The paper's catalogue card meanwhile shows the updated facts for anyone yet to start.
Open Northvale Systems. Read the page fully: roles, papers, readiness, recent tests.
Open Corvane Software and compare.
Expected
Way back to Company Tests; name, description, the roles its papers are for.
Paper cards show role, year and Pattern; untaken papers list first, then your taken ones. Card facts include questions, sections, minutes, strictness.
"Your readiness" is per role — untested reads as not enough evidence, never zero.
Two honest disclaimers appear in words like: "The company does not run or endorse this test, and your result is never shared with it." and "Never a prediction of being hired."
A "None yet" style line where you have no tests at that company — not an empty list.
TC-ASM-019Company briefing — its own words, then the same check and conditionsP1
Steps
Open Northvale's Associate Software Engineer (Strict, limit 3) briefing at /papers/:paper/briefing. Read top to bottom.
Compare with Kestrelworks' Software Developer Intern (strictness Off).
Expected
Way back to the company page (Company Tests in the navigation is lit, not Mock Tests); title; Company Test kind; the company, role, year and Pattern label; the paper's own briefing text.
Facts include questions, sections, minutes — and honestly no pass mark and no rewards.
"How it works" for a company paper says its sections are taken one at a time — a section closes behind you and cannot be re-entered.
The strictness lines match the paper: the Associate paper says at 3 recorded the test submits itself; Kestrelworks says nothing is recorded about how you take the test.
Then the same systems check, conditions and single Start as a Mock paper — including the run limits disclosure where a paper has one ("Runs in this section are limited: 10."/"15.").
An account with a mix: one finished Mock, one finished Company test, one in progress if available.
Steps
Open Test results (/test-results). Read the heading line and each row.
Switch the type control: Both / Mock Tests / Company Tests. Open the "Where it stands" filter and try each state.
Expected
Title "Test results" with a count sentence in the lead and "Every Mock and Company Test of yours, newest first."; a ghost link to Assessments dashboard.
Each row: title; kind word (Mock Test / Company Test); "Started {date, time IST}"; where it ended adds a plain line — "Time ran out", "Ended at its limit of recorded events", "Replaced by a newer test" (muted), an invalidation reason.
Trailing: a finished test shows "X of Y marks", the percentage and Passed/Not passed (Mock only — Company rows never show a pass state); a non-final row shows its state word instead (In progress · Overdue · Grading), never a score.
Type switching and the standing filter (All / In progress / Being marked / Finished) both work and are remembered in the address; no matches reads "None of your tests matches these filters" with a clear.
An in-progress row opens the room; every other row opens its result. On touch, in-progress rows show "Carry on on a computer" and don't open.
TC-ASM-022Type-filtered history addresses open the same list pre-filteredP2
Steps
Open /mock-tests/history and /company-tests/history directly.
Open them from each catalogue's "Your mock tests"/"Your company tests" link.
Expected
Each address opens Test results already switched to that type: "Every Mock Test of yours, newest first." / "Every Company Test of yours, newest first." — the segmented control shows the choice and can be changed.
With nothing there: "No mock tests yet" / "No company tests yet" with links to both catalogues — never a bare zero.
/tests/:test runs in a focus layout — no app navigation, no companion, nothing else of the product. These cases spend a test's running time but not its one shot: you can leave, resume and re-enter freely within the clock. Pick a paper per account and keep it running while you work these cases.
Route
Page
What it shows
/tests/:test
The test room
Top strip (Leave · paper · sections · recorded events · time), the question, answer controls, the question navigator, run/output for coding, the submit and leave dialogs
/tests/:test/result
The result (§4)
Opens during grading and after; covered in §4
The pipeline
Start lands you at the first question → answer in any order the paper allows (grid, Next/Previous, section switch) → answers save as you give them → Submit test (or time runs out, or a Strict ceiling ends it) → the result page takes over. Leaving by Leave, reload, lost connection or a new sign-in elsewhere never abandons the test.
Accounts to stage for this section
Keep one Standard Mock test running (SQL Queries or Python Foundations) for the general room cases; one Strict test (Programming Fundamentals, or Northvale Associate) for §3's proctoring cases; one Off test (Kestrelworks) for the contrast case. A second live test can't start while one runs — stage them sequentially, or across different accounts in parallel.
2.1 Room chrome & the navigator
TC-TST-001Focus frame — no shell, the whole strip, nothing extraP1
Preconditions
A running Standard Mock test (e.g. SQL Queries).
Steps
Look at the whole page at ≥1024px: top strip, question, navigator.
Look for anything that is not the test: site navigation, header, footer, companion, inbox, any help panel.
Expected
No normal shell: no product navigation, no footer, no inbox/bell, no companion — the test is the whole page.
Top strip: Leave; the paper's name; each section as a tab with its answered count ("3/7"); Recorded events for Standard/Strict; the remaining time.
Where a paper hides the countdown, the timer area says so honestly rather than faking a clock — the deadline still applies.
No "Ask for help", AI-help or credit-style control exists anywhere in the room (generated assistance is off platform-wide).
TC-TST-002Navigator ≥1024px — grid, legend, status without colourP1
Steps
In the running test, open the navigator and read it fully.
Answer a question, mark one for review, close a section on a company test (later), then re-read the grid.
Expected
The grid shows every question in the section with a state that is not colour alone: answered carries a mark, marked-for-review a flag, closed a lock, the current question is outlined.
A legend or labels make the marks plain; a count line reads "N of M answered" for the section and the whole paper.
Submit test sits in the navigator; the Single-key shortcuts switch sits there too, on by default.
The whole-paper line reads e.g. "Whole paper 4 of 17 answered · 1 marked".
Read the first question of each section on SQL Queries or Python Foundations.
Open "About this section" on a section's first question.
Expected
Each question heads "{section} · {kind} · {marks}" and "Question N of M".
A kind hint matches the control: "Choose one answer." / "Choose every answer that applies." / "Enter a number."
Where the paper deducts for a wrong answer, the question says so: "A wrong answer loses 0.25 marks." (Programming Fundamentals, Northvale's aptitude/reasoning) — and where it doesn't, nothing implies a penalty.
The section's first question offers "About this section" with the section's briefing; later questions don't repeat it.
Foot controls: Previous · Mark for review · Next (or "Next section"/"Review and submit" at the ends) plus the shortcut key line where shortcuts are on.
TC-TST-009Every question kind appears where its section has itP2
Steps
Walk a full paper and note the kinds it contains — single-choice, multi-select, true/false, numerical, code (company coding sections, Mock "Programs" sections).
Check the kind word in each heading matches the control offered.
Expected
The kind in the heading names the control: a "single choice" question offers one-of options; "multi-select" offers toggles; a coding question offers the editor (§2.5).
No question renders broken, empty or with options from another question.
Marks shown per question match the section totals on the paper page.
TC-TST-010The save-state ladder — every state is literalP1
Steps
Watch the answer state through a normal save.
Dev tools → network offline; answer a question and read the state; press Retry.
Come back online and watch it.
Expected
Healthy save: "Saving…" → "Saved". A question never answered reads "Not answered yet".
Offline: the answer is kept on the device and reads Saved locally with a real Retry; on reconnect it sends itself and flips to "Saved" — no re-answering needed.
A refused send (service down, not just offline) reads Not saved with Retry — the answer stays on screen and is never lost silently.
Whatever the state, the words are the real state — never "Saved" for something still only on the device.
TC-TST-013Two tabs of the same test — the stale one is told, not allowed to lieP1
Steps
Open the running test in a second tab. In tab 2 answer a question and move forward; leave tab 1 sitting on an older question.
In tab 1 type an answer and try to move.
Expected
The stale tab announces itself: "This test had moved on in another tab or window. This page now shows where it is and the answers it holds." — then it shows the current question with its real saved state.
A device-only answer the newer tab refuses is discarded so it cannot be sent later — it does not pop back.
An older delivery never overwrites a newer answer: the newest answer the test holds is what survives.
Also try
Submit in one tab — the other tab sees the test ended and moves to the result, never offers a second submit.
TC-TST-016Single-key shortcuts — A–H/1–8, N, P, M, and where they go quietP1
Steps
With the shortcut switch on: press B on a choice question; N to advance; P to go back; M on a markable question.
On the last question press N. Dismiss.
Hold Ctrl/Alt/Meta and press N; type in a number field then press N while focused; open the submit dialog and press keys.
Turn Single-key shortcuts off in the navigator and press the same keys.
Expected
Letters/digits choose options (A–H or 1–8 by option count); N moves forward — on the final question it opens the Submit view; P moves back; M toggles mark-for-review where the paper allows it.
Keys are inert while a modifier is held, while typing in a field or the code editor, and while a dialog is open.
With the switch off the keys do nothing; the switch's choice is kept on this device until sign-out.
A shortcut can never bypass a disabled feature — M does nothing where marking is off for the paper.
TC-TST-020Shuffle changes order, never meaning or answersP2
Steps
Answer a shuffled-order question; reload; check the order and your answer. Compare with the same question on a second account.
Expected
Where the paper shuffles questions/options, each learner's order can differ — but the question text, options' meaning and your saved answers follow the content, not the position.
A paper with a coding section — Python Foundations' "Programs", Northvale Graduate Engineer Trainee's "Coding", or Programming Fundamentals' "Programs".
Steps
Reach a coding question; read its pane fully.
Switch its language tab; type in each.
Expected
The question pane shows the description, each example with its input and expected output, and a line like "Graded on these examples and N hidden test cases after the test."
Language tabs are offered where the question allows several; a line says only the language shown is saved and graded.
The editor loads only when a coding question is drawn — it does not pre-load on other questions.
Hidden test cases show nothing: no inputs, no expected output, no hint of content — the number alone.
TC-TST-023Run the examples — allowance counts real runs only, failures are freeP1
Steps
On a coding question press Run the examples; read the results beside the output.
On a limited paper (Northvale Trainee: 10; Tamarind: 15) run until near the limit; make a run fail (empty code / a pace refusal) and watch the count.
On an unlimited paper note its line.
Expected
Results appear per example beside the output — pass/fail each, against visible cases only.
A limited section shows "N runs left in this section." — a started run spends one; at zero it says "No runs left in this section. Your code is still saved and graded."
An unlimited one says "Runs in this section are unlimited." — practice is always unlimited.
A refused start spends nothing: empty code is named ("the code is empty" in meaning) and a run-pace refusal says how long to wait — the count doesn't drop.
Running reveals nothing hidden: output is only for the visible examples.
TC-TST-024Company section locking — one at a time, closed behind youP1
Preconditions
A company test in progress (every seed company paper is section-locked) — e.g. Corvane Data Analyst Trainee.
Steps
Answer in section one, then advance via Next section. Read the prompt; confirm.
Try to return: section tab, grid cell, Previous, keys.
Advance repeatedly across the paper.
Expected
The advance prompt warns plainly — "{section} closes, and you can't come back to it." plus the count unanswered — with a way to stay ("Stay in {section}") and to move.
After advancing, the closed section's tab shows a lock and its questions are unreachable by every route; attempts say which section is active.
Only the active section and the adjacent advance are ever reachable — you cannot skip ahead two sections.
Repeated advances count once each — the paper's structure (sections, questions, order) never collapses into one list.
TC-TST-025During a live test the rest of the product closes politelyP2
Preconditions
A running test. A second tab on the same account.
Steps
While the test runs, open other learner pages in the second tab: a Challenge's hints/editorial, Code Lab, Quick Notes, My Solutions' compare.
Note what each says; end the test and re-check one.
Expected
Spoiler-adjacent things close while a test is live — hints, editorials, compare, Quick Notes, outside-help and problem-reporting controls say why and when they return, never opening quietly.
Ordinary practice still opens where it doesn't spoil — but anything that would feed the live test is held.
On a recorded test (Standard/Strict) leaving the room for these pages is itself recorded — the restriction and the recording are consistent.
Nothing in the room offers generated help, companion messages or problem reporting while the test runs.
Strictness is per paper, disclosed before Start, and bounded: Off records nothing; Standard records leaving but can never end the test; Strict records and its counted-event ceiling ends the test honestly. Nothing is ever filmed, listened to, screenshotted or key-logged — the product records kinds of events, never content.
Programming Fundamentals · Northvale Associate · Tamarind Grove
Strict
Ceiling 5 (PF) / 3 (Northvale, Tamarind); Tamarind also requires full screen
The pipeline
Leave/return (or another configured signal) → the event is recorded for staff → on Standard/Strict a note tells you what was recorded and whether it counted → duplicates inside two seconds count once → on Strict, reaching the ceiling submits the test with answers saved so far → the result records the ending reason. Refresh, connection loss, sign-in moves and accessibility use are noted, never counted.
3.1 The three levels
TC-TST-026Off — truly nothing recordedP1
Preconditions
A running Kestrelworks Software Developer Intern test.
Steps
Hide the tab, switch away, return; reload; use the clipboard.
Watch the strip and look for any recorded-event surface; finish and read the result.
Expected
No recorded-events indicator in the strip at all — the paper told you before Start that nothing is recorded, and it isn't.
No notes, no counts, no "Recorded:" line; leaving and returning is invisible to the room.
The result's ending reason is your own (submitted / time ran out) — never a recording reason.
TC-TST-027Standard — leaving is recorded, told each time, never ends the testP1
Preconditions
A running Standard test (e.g. SQL Queries).
Steps
Switch to another tab for a few seconds, return.
Read the note; acknowledge it; check the strip.
Do it twice more; try leaving via Leave and via closing the tab.
Expected
On return a note names what happened — "Recorded: The test page was hidden or left." plus "N recorded so far. This never ends the test." — and stays until you dismiss it (OK).
The strip's Recorded events count rises one per leaving; leaving via Leave and via closing both count once each.
Nothing about the test changes: same question, answers, clock — recording is all that happened.
Past any number of leavings the test continues — there is no hidden ceiling on Standard.
TC-TST-028Strict — the ceiling ends the test honestly, and only the ceilingP1
Preconditions
A running Northvale Associate test (ceiling 3) — the cheapest Strict spend. This spends the account's test; plan it as that account's test.
Steps
Leave/return three counted times (spread beyond two seconds each); read each note and the strip count.
At the third, watch the test end; open the result.
Expected
The strip reads "Recorded events: N of 3" — the ceiling is visible throughout, not a surprise.
Each note says what counted and the consequence: "N of 3 recorded. At 3, the test submits itself."
At the ceiling the test submits itself with the answers saved by then — the result records the ending as its own reason ("It reached its limit of recorded events…" in meaning), never a fake "submitted".
Below the ceiling the test never ends itself for events; only counted events move it.
TC-TST-030Noted, never counted — refresh, connection, sign-in move, accessibilityP1
Preconditions
A running Strict test (or Standard — the count behaviour is what matters).
Steps
Note the event count; reload the page.
Drop the connection briefly and restore.
If you can: sign in on another browser (TC-TST-015).
Zoom the browser, navigate by keyboard/screen-reader, toggle reduced motion.
Expected
Refresh is noted for staff and the count does not move — the note, if shown, says a refresh is "noted, never counted" in meaning.
Connection loss, slow network, save retries and platform notices are not recorded events — no count, no note.
A sign-in elsewhere is recorded for staff but never counted.
Keyboard navigation, zoom, captions, assistive technology and reduced motion are not events — the ceiling is for leaving, not for how you use your computer.
TC-TST-031Clipboard & restricted-shortcut events — recorded where enabled, never blockedP2
Preconditions
A running Strict test on a paper with these recordings enabled (check the paper page's "What is recorded" lines; mark N/A if none of your tests has them).
Steps
Copy or paste within the test; right-click.
Press a restricted shortcut (F5, print, dev-tools).
Expected
Where enabled, each is recorded as its kind — "Copy, paste or the right-click menu was used." / "A restricted shortcut was pressed." in meaning — and counted/noted as the paper configures.
Nothing is blocked: the paste lands, the menu opens — recording is observation of the kind, never interception and never clipboard content.
Where the paper doesn't enable them, doing the same records nothing.
TC-TST-033Tamarind Grove — full screen is asked, explained, and exits are recordedP1
Preconditions
A fresh account starting Tamarind Grove Systems Engineer (fullscreen required, Strict ceiling 3). Plan this as the account's spend on that paper.
Steps
Start the test; read the full-screen gate; press Go to full screen.
Press Esc to leave full screen; read what happens; re-enter.
Refuse/deny if the browser offers a choice.
Expected
A gate explains the requirement before the room opens — it cannot be dismissed without choosing, and it is the same requirement the briefing disclosed.
Leaving full screen prompts a return and records "Full screen was left." — on this Strict paper it counts toward the 3.
A refusal prompts again and is told honestly — never silently recorded and never an undocumented failure. Where the browser can't do it, the message says to use a current Chrome/Edge/Firefox.
The systems check's Full screen item predicted all of this before Start.
A test ends exactly four ways — you submit, time runs out, a Strict counted-event ceiling ends it, or account-security action ends your access. Everything after lives on /tests/:test/result: first an honest grading state, then the result itself — pass-mark and rewards for Mock; accuracy, marks-by-cut and company readiness for Company, never a pass mark.
Route
Page
What it shows
/tests/:test/result
Result
"Grading" until final; then score, breakdown, review, rewards — or the honest invalidated/archived state
/test-results (+ type addresses)
History
Every test incl. Overdue, Being marked, Invalidated, Replaced-by-newer
The pipeline
Submit / time-up / ceiling / access-ended → the room hands to the result page → "Submitted at {time}… Your result is being prepared" (grading is live, you can leave) → final: score, sections, question review, rewards — then the card shows Practice/View result and the row sits in history.
4.1 Endings & the clock
TC-RSL-001Submit dialog — full accounting before the point of no returnP1
Steps
In a running test, answer some, mark some, leave some; press Submit test and read the dialog without confirming.
Use its links; then Keep going.
Expected
"Submit {title}?" with "You have {time} left. Once you submit, your answers can't be changed."
Tallies: answered, not answered, marked — plus per-section "N of M answered · K marked".
Two honest shortcuts: "Go to question N, the first one not answered" and "Go to question N, marked for review" — each lands exactly where it says.
"Keep going" returns to the room unchanged; only the confirm submits.
TC-RSL-004Time runs out — answers saved so far are submitted, typing at zero is carriedP1
Preconditions
A test near its deadline (a company paper's last minutes, or leave a started Mock until the end).
Steps
Be typing an answer as the clock reaches zero; watch.
Open the result.
Expected
A "Time is up" state you cannot dismiss: "Submitting the answers saved by now…" then the result.
Outstanding typing at zero is carried into the submission where it can be; after the deadline nothing new counts.
Time used never exceeds the deadline; the ending reason reads as time-ending ("Time ran out, so the answers saved by then were submitted." in the history row).
Answers already saved are all in — nothing held back by the abrupt ending.
TC-RSL-007Offline at the end — time-up submission retries and tells you the truthP2
Steps
With a test near its deadline, cut the network and let the clock hit zero offline; read the state; restore.
Expected
An honest state: "The connection dropped as time ran out. Your saved answers are safe and are submitted for you; the result follows." with a way to the result.
The submission keeps retrying and lands when the connection returns — the result then says whether ending and grading completed; it never shows a fake failure or a fake score.
TC-RSL-008Unanswered kinds are honest — Not reached · Skipped · Not answeredP1
Preconditions
Submit a test leaving: a question never opened (Not reached), one opened then left (Skipped), and one on screen at the end / left blank (Not answered).
Steps
Arrange the three kinds, submit, open the review.
Expected
The review names the three differently — a never-opened question is Not reached; an opened-and-left is Skipped; one on screen at the end is Not answered.
The answers tile counts them ("Not answered: N skipped · N not reached · N left blank. Unanswered questions lose nothing.").
No kind pretends to be a wrong answer or a zero mark it wasn't.
TC-RSL-009Grading — named, live, and never an invented scoreP1
Steps
Submit a test and land on the result page before grading finishes; watch it.
Leave the page and come back through history while still grading.
Expected
"Submitted" (or "Time's up. Submitted.") with "Submitted at {time IST}. Your answers are saved. Your result is being prepared" — on a company test adding that your readiness updates with it.
A Grading status where the score will go; a line like "This page shows the result as soon as it is ready. You can leave; grading carries on." — and it does update live (or via Check now).
Nothing invented: no provisional score, percent, pass, rewards or readiness while grading.
The history row reads Being marked/Grading with no score — consistent everywhere.
TC-RSL-010Slow grading says so — never times out into a fake failureP2
Preconditions
A grading service delay/outage (coordinate with staff, or note N/A if grading is always fast on the deployment).
Steps
Watch a result that is still grading after ~30 seconds and ~5 minutes.
Expected
Long grading escalates its honesty: a "taking longer than usual" line, then a "grading is busy; your answers are safe" line — still pending, never flipped to a failed-looking result.
When grading completes the real result appears; the row was never wrong in the meantime.
TC-RSL-011Mock result — score, pass line, time used, ending, earned lineP1
Preconditions
A finished Mock test — one passed, one failed if your plan allows.
Steps
Open the result; read the lead fully.
Check the numbers against your recorded answers.
Expected
"Your score" as X of Y marks; the percentage to one decimal rounded down; Passed or Not passed beside "The pass mark is 50%."
Time used "X of 45 minutes" — never more than the paper's time; the ending reason in words.
An "Earned" line only where something was earned — e.g. "+200 XP · First Mock Test completed" on a first finish, "+300 XP · First Mock Test passed" on a first pass; recognitions (90%+, perfect score, perfect section) named.
Practice links appear where practice is open: "Practise the N you missed" / "Practise all".
TC-RSL-013Question review — your answer, right answer, explanation, hidden stays hiddenP1
Steps
Open several reviewed questions across kinds: a choice you got right, one wrong, a coding question.
Look for any hidden-test-case material.
Expected
Each row: the question's first line, its outcome status, "X of Y marks".
Inside: Your answer beside Right answer for choice/numerical ("Your answer: N · Right answer: M"); Your code plus "N of M test cases passed" for coding; Explanation and "A reference solution in {language}" where the paper shows them.
Your own answers/code appear wherever the question is shown — that is always.
Hidden case content never appears — only "N of M test cases passed"; no inputs, expected outputs or diffs against hidden material.
TC-RSL-014Review withheld and aged-out — both say why, neither fakes itP2
Preconditions
A paper whose review settings hide questions/answers (staff-made variant if needed), and a result older than its retention — mark N/A where not staged.
Steps
Open both results.
Expected
Withheld review: "This paper does not show its questions after the test. Your score and its breakdown above are complete." — score/sections still complete.
Aged out: a line like "Your answers are kept for 90 days, or while this is among your 20 most recent tests of its kind…" with the summary intact and no dead review action.
TC-RSL-015Marking maths — partial credit, negative marks, floor at zeroP1
Preconditions
Your written answer record for a finished test incl.: a multi-select with some right some wrong; a wrong single-choice on a −0.25 paper; a coding question passing some cases.
Steps
Compare each question's awarded marks with what the rules promise.
Check the total and the percentage.
Expected
Multi-select partial credit: (correct − incorrect)/correct × marks; wrong-only loses the penalty once where the paper applies one, else zero.
Programming Fundamentals' wrong single-choice loses 0.25 exactly as disclosed; where a paper has no negative marking, wrong is just 0.
Coding marks are proportional to passed cases; non-compiling code earns 0 with no negative penalty.
The total is rounded once and floored at zero — negative marking can bite inside a section but the test total never goes below 0; percentages display one decimal rounded down.
TC-RSL-018Company result — accuracy, cuts, readiness; never pass/fail, never XPP1
Preconditions
A finished company test (e.g. Corvane Data Analyst Trainee).
Steps
Open the result; read every region.
Look for anything Mock-shaped: a pass mark, XP, achievements.
Expected
Eyebrow "Company Test · {company} · Pattern"; the score and the accuracy ring "N right of M answered" (all-unanswered reads "Nothing was answered, so there is no accuracy.").
Marks by difficulty and marks by question kind — a cut may be negative ("−0.5 of 4 marks") where the paper deducts; the cuts add to the score.
A company-readiness ring: a band, or "Not enough evidence yet" with what it needs.
The honest line: "Company Tests have no pass mark and earn nothing: your score, accuracy and readiness are the result." — no Passed/Not passed, no XP anywhere.
TC-RSL-019Company readiness — the gate, the bands, the updating stateP1
Preconditions
An account finishing tests at a two-paper company (Northvale or Corvane — the only seeds that can pass the ≥2-finalized gate).
Steps
Finish one company test; read readiness. Finish the company's other paper; read again.
On a one-paper company (Kestrelworks/Tamarind), finish and read readiness.
Expected
Before the gate (≥2 finalized tests on that company and at least half its published papers covered): "Not enough evidence yet: finish N more papers to see it" — never a fake band or a 0%.
Past the gate a band: below 50 "Not ready" · 50 to under 75 "Developing" · 75–100 "Well prepared" — the figure to one decimal, rounded down.
While the newest test grades the readiness says it is updating — never a stale number presented as current.
Kestrelworks/Tamarind can never reach the gate with one published paper — they stay "Not enough evidence" honestly.
TC-RSL-020Someone else's test is not found — privacy in the addressP1
Steps
Copy a finished test's address; open it signed in as a different learner account.
Try a random /tests/… and /tests/…/result.
Expected
Another learner's test/result opens the same not-found as a made-up address — "Result not found"/"It is not one of your tests." in meaning — never a partial render of their data.
Nothing leaks through title, counts or error wording.
Relief grants are granted in the staff console (doc 05); invalidation is a staff action too. Coordinate in the team channel: agree the account, the paper and the timing, then walk the learner side here.
TC-RSL-021Relief grant — the conditions say it replaces, and it really replacesP1
Preconditions
Staff grant a relief to an account with a finished result on a published paper.
Steps
Open the paper's page; read the next action and the conditions.
Start and finish the relief test; check history for both rows.
Expected
The next action reads "Use your relief grant"; the conditions add "This test replaces your earlier result once it is final, and it is the only one your relief grant gives." with the button "Accept the conditions and use your relief grant".
Only one unused grant exists at a time per paper — a second grant can't stack.
When the new result finalizes, the older row reads "Replaced by a newer test" (muted) and its result page says it is archived and stays in history; the new result is what counts — for score, readiness and practice alike.
TC-RSL-023Invalidation — the result stays, says why, and stops countingP1
Preconditions
Staff invalidate a finished result (agree which — it is the learner-facing side of a staff action).
Steps
Open the invalidated result; read it fully.
Open history; check the paper's card; check XP/Skills/readiness changed as the notice said.
Expected
The result page keeps the entry: "This test has no result" plus the neutral reason — one of: "Something on our side went wrong while it was taken or marked, so its result cannot be relied on." · "A question in it was faulty in a way that cannot be put right, so it cannot be marked fairly." · "Your account needed securing while it was in progress, so its work cannot be relied on." · "It was decided that its result cannot stand." — never blame, never silence.
"It no longer counts towards anything, and it stays in your history." — history keeps the row marked invalidated.
Skills and company-readiness contributions are removed; Mock rewards reverse exactly (a notification says whether XP counts or is taken back); a reversed first-completion/first-pass reward can be earned once on a later valid test.
Practice on that paper closes until a valid replacement finalizes; the card offers a fresh start where the paper allows.
Repeated processing changes nothing — reversal is exactly once.
Once your newest test on a paper is final — and while the paper is still offered — /papers/:paper/practice opens unrecorded practice: no clock, no events, nothing kept when you leave. It uses the paper's current published questions, not your frozen test copy.
Route
Page
Opens when
/papers/:paper/practice
Practice
Newest test on the paper final + paper still offered + on a computer; closed otherwise with its reason
The pipeline
Result final → card gains Practice → the whole paper lists in one page → answer a question, Check it → per-question outcome + marks → "So far" score grows → Start again clears it all → leaving discards everything.
TC-RSL-025Practice page — unrecorded, one page, your real paperP1
Preconditions
An account with a finished result on a still-offered paper.
Steps
Open Practice from the card or the result. Read the lead; scroll the page.
Look for anything test-shaped: a clock, an events count, a Save that persists.
Expected
The honest line up top: "Unrecorded practice: no clock and nothing recorded. Your result stays as it is, and nothing here is kept once you leave the page."
Every section and question on one page — the current published questions, numbered as the paper numbers them.
No countdown, no recorded events, no navigator, no submit — and no way to affect your result, history, Skills or rewards.
On a coding question in practice, Run the examples repeatedly — past any test-time allowance.
Write a partial solution and press Check; read the outcome.
Expected
"Runs are unlimited in practice." — no allowance countdown ever appears.
Check "runs your code on these examples and N hidden test cases" and reports "N of M test cases passed" — practice Check is the one place hidden cases grade live.
Hidden material still shows nothing: no inputs, expected output or your output against hidden cases — the count alone.
TC-RSL-030Practice closed states — live, grading, archived, never-taken, touchP1
Steps
Before any test on a paper: no Practice action; type the address directly.
While a test on it is live or grading: try the address.
On an archived/closed paper you finished: look for Practice.
On a phone/tablet: look for Practice and open the address.
Expected
Never taken: no Practice anywhere and the address lands on the paper page / a closed state — never a practice room.
Live or grading: practice is closed until the newest test is final — the page says so, no half-open room.
Archived/closed paper: no Practice action and "Practice is not open" in meaning at the address — even though your result exists.
Touch: no Practice on cards; the address reads "Practice runs like the test, on a computer" / "Open this page on a computer to practise: no clock, and nothing recorded."
My Projects (/projects) is the learner's own collection — up to 10 projects, each ≤25 MiB and ≤100 files, built from blanks, stacks, templates or a ZIP import, and worked in a full IDE with run, debug, preview, checklist and history. Course Workspaces are a separate collection in §7. Every case here is free — nothing in Workspace is spendable like a test.
Route
Page
What it shows
/projects
My Projects
Project cards newest-edited first, storage/files meters, New project (Blank · Build your own · Template), Import a ZIP, template strip, search + language filter
/projects/:projectId
The IDE
Project bar, icon rail, explorer/search/run-debug/settings, editor tabs, output (Terminal · Results · Problems · Debugger), right panel (Preview · Checklist · Brief), status bar
The pipeline
New project (blank / stack / template / ZIP) → the IDE opens → files in the explorer, code in the editor → Run on device or cloud → preview for web → save as you go, conflicts and history where edits collide → tick the checklist → Mark complete → the card shows Complete and storage counts until you Delete.
Limits worth staging once
10 projects · 25 MiB and 100 files per project · ≤12 tasks · a text file ≤2 MiB · a binary ≤10 MiB · paths ≤240 chars, letters/digits/`-`/`_`/`.`/`/` only. Have one account hold ~9 projects so the at-limit cases are one create away.
6.1 My Projects — the list
TC-WKS-001Project list — cards, meters, ordering, actionsP1
Preconditions
An account with 2+ projects of different languages and states.
Steps
Open Workspace → My Projects. Read the strips and every card.
Open a card's actions.
Expected
Lead names the collection; a strip reads "N of 10 projects"; a line like "Across every project you have held: N programs finished well, and N tasks completed." plus "Each holds up to 100 files and 25 MiB. Course Workspaces are counted apart."
Cards most-recently-edited first; each shows the runtime line, name, "Edited {when} · {N of M tasks}", the state (In progress / Ready to complete / Complete), storage "X of 25 MiB, in N of 100 files".
TC-WKS-003At the limit — create/import refuse honestly, delete frees the slotP1
Preconditions
An account holding 10 projects.
Steps
Try New project and Import a ZIP; read what they say.
Delete one project (through its confirm); try again.
Expected
At 10 the controls are unavailable with the reason: "You have 10 projects, the most you can keep. Delete one to make room for a new one." — never a silent dead button.
Delete's confirm names the project: "Its files are deleted for good and cannot be brought back. Its place among your 10 projects is freed." with Download it first offered.
After deleting, creation works again and the count drops to "9 of 10 projects".
TC-WKS-004New project — Blank types with starter files and an honest name fieldP1
Steps
Open New project → Blank. Read the type groups; pick several and watch the starter-file list change.
Type a name past 120 chars; an illegal name; a good one. Create.
Expected
Types grouped honestly — e.g. Python (incl. Data analysis), Web (Web page, React), Databases (SQL), more languages (JavaScript…) — each with a line on what it is and the starter files it lands with.
"The language stays {runtime} for the life of the project." — runtime is a birth decision, no switching later.
The name field counts "0 / 120", refuses illegal characters as typed with the path rules named — never silently rewrites them.
Create project needs name + type; the new project opens in the IDE with its starter files present.
TC-WKS-005Build your own — stack decides the runtime, SQLite only with a back endP2
Steps
Open Build your own. Read the three choices; combine them.
Try SQLite alone — no back end. Then Flask + SQLite. Create each if slots allow.
Expected
Three honest choices: a front end (HTML or React), a back end (Flask), a database (SQLite) — each named for what it adds.
SQLite only offers with Flask — choosing it alone says why (a database needs something to run it).
The resulting runtime and starter files follow the stack; the IDE's run story matches (React+Flask lands as its own project type, not a mislabelled blank).
TC-WKS-006Templates — preview before commitment, a copy that stays yoursP1
Steps
On the template strip open "Use this template" for React: habit tracker and SQL: college fest. Read each dialog; create one.
Compare the project against the template after staff edit the template later (or trust the independence line and spot-check).
Expected
Before creating, the dialog shows it all: description, language, the files with sizes, the 3-task checklist with instructions, and the storage it needs — nothing lands sight-unseen.
A line like "The project is yours: a copy that later changes to the template never touch." — and it means it.
No name typed → takes the template's name; the project opens with template files and its checklist.
Later template edits do not reach your copy (verify against a re-seeded template if available).
TC-WKS-007Import a ZIP — previewed, all-or-none, refused whole with the reasonP1
Steps
Import a ZIP a small valid archive: read the included/excluded preview before confirming.
Try a ZIP over a limit (>25 MiB total, >100 files, or paths outside the rules) and a non-ZIP file.
Expected
The page reads the ZIP locally first and shows what comes in and what is left out with why — before anything is created.
Import is all-or-none: a refused archive makes no project, no partial files, no placeholder.
Refusals name their reason (size, file count, paths, "not a ZIP") — never a silent drop; a dropped-on ordinary ZIP is just a stored file unless you choose Import.
TC-WKS-009IDE anatomy — every region named and doing its jobP1
Steps
Open a Python project. Identify each region top to bottom, left to right.
Toggle the right panel and the stack details; open each icon-rail tab.
Expected
Project bar: back to My Projects, the language mark, the project name, "Personal project" + its state, the stack chips where relevant, where-it-runs, the storage meter, Run (or Stop while running), Debug for Python, Save, Download, and the right-panel toggle.
Icon rail: Explorer, Search, Run and Debug, Project settings — each opens its side panel.
Editor: file tabs across the top, an optional second editor, the file itself.
Output: tabs for Terminal (or Results for SQL), Problems, Output — plus Debugger on Python projects.
Right panel: Preview (or Page) and Checklist — no generated-help or agent tab anywhere (GENERATED_ASSISTANCE is off).
Status bar: save state, problems count ("No problems"/"N problems"), "Start file: {path}", runtime, storage, and task state.
TC-WKS-011Explorer — every row action, drag-to-move, second editorP1
Steps
Open a folder's row menu and a file's row menu — read every action.
Drag a file onto a folder; use Move to….
Open to the side a second file beside the first.
Expected
Folder row: New file here · New folder here · Upload files here · Rename or move · Delete. File row: Rename or move · Download · History · (Reset data on a .db) · Delete.
Each asks what it must — Delete confirms, Rename validates the path rules — and lands exactly there.
Dragging onto a folder (or Move to…) relocates the file; a collision names itself rather than overwriting.
Open to the side puts the file in a second editor — both stay live and save independently.
TC-WKS-012Dividers & narrow windows — layout remembers, never trapsP3
Steps
Drag each divider; reload — is it kept?
Narrow below 1024px: the IDE becomes tabs (Code / Output / Preview); run something while narrow; widen again.
Expected
Divider positions are kept on this device.
Under 1024px a personal project still edits and runs via its tabs — a running program keeps running across the switch; widening restores the three-pane layout.
Nothing overlaps, clips or needs horizontal scrolling at 1024 / 1280 / 1440.
TC-WKS-013Path rules — refused as typed, never silently rewrittenP1
Steps
Try to create/rename files named: my file.py (space), ../x.py, /abs.py, a\b.py, a name over 120 chars, a path over 240, and FILE.py beside file.py.
Make legal nested paths with hyphens, underscores and dots.
Expected
Each illegal name is refused at the field with the rule in words: "Letters, digits, hyphens, underscores and dots, with / between folders." — nothing is created and your typed text isn't quietly edited.
Case-collision (FILE.py vs file.py) is refused — the file system treats them as one.
TC-WKS-014Save ladder — typing, local copy, checkpoint, every state literalP1
Steps
Type into a file and watch the status bar through the save cycle.
Take the network offline, type more, read the state; restore.
Force a save failure (service refusal); read and retry.
Expected
The ladder in order: typing → "Not saved yet"/"Saved locally" → an automatic checkpoint (idle ~a minute, or on Ctrl+S/Run) → "Saved · just now".
Offline work is kept in the browser honestly labelled "Saved locally" and sends on return.
A refusal reads "Not saved: {files}." with Tap to retry — the work is never dropped.
Where the browser can't hold a copy the state says so: "Not saved yet, and this browser cannot keep a copy" — the honest worst case, not a silent loss.
TC-WKS-015Reload mid-edit — your unsent work comes back with youP1
Steps
Type changes, do not save, reload the page immediately; check the file.
Type, close the tab, reopen the project.
Expected
The browser-kept copy restores your edits — the file shows what you typed, marked as its real save state, and a pending send completes on the next open.
Nothing is presented as saved that wasn't — the status bar still says "Saved locally"/retry, not "Saved".
TC-WKS-016Two tabs of one project — the stale one is told, and you choose who winsP1
Steps
Open the project in two tabs; edit different lines in both; let them collide.
Read the dialog; try each choice on separate collisions.
Expected
The behind tab is named honestly: "Open in another tab" with Edit here to take over.
On a real conflict: "{path} changed somewhere else" + "Your version is still here. Choose what to keep." with both versions shown and four honest choices: Keep mine · Take the stored version · Save mine as a new file · Download my version.
Each choice does exactly what it says — nothing is merged or lost silently.
TC-WKS-018File History & Restore — checkpoints are real and reversibleP2
Steps
Edit and checkpoint a file a few times; open its History; Use this version on an older checkpoint.
On the project, open the restore path; read the confirm; restore.
Expected
History lists real checkpoints; "Use this version" puts that content into the editor — it becomes the working copy, not a forced save.
"Restore project" asks first and names the checkpoint it returns to; the restore itself lands as a new checkpoint — it is recoverable, not destructive.
With no earlier checkpoints the history says so honestly; a failed read says so too — never an empty list implying no history exists.
TC-WKS-020The start file — chosen, then main/index, then the only one of its kindP1
Steps
In a multi-file Python project, set a start file from a file's menu; check the status bar and run bar.
Rename that file; delete it; run again.
Expected
"Start file: {path}" shows the choice; the run bar says "Starts from {path} (your choice)".
Priority is honoured: your chosen file → else main/Main (Java) / index (web) → else the only file of its kind at root → else it can't run and says why.
Renaming follows the choice; deleting the chosen file falls back to the next rule and says so — never a dead Run.
An empty project can't run: Run is unavailable or refuses with the reason.
TC-WKS-021Cloud runs — offered only when needed, named where they ranP1
Preconditions
A project needing cloud (Flask / numpy / pandas — e.g. the taskBoard template; or a Data-analysis template project).
Steps
Run it; watch where it says it runs.
In the same project try a pure-Python file — does it still run on device?
Expected
The run bar names the cloud honestly — "Cloud · Python 3.14.10"/"Ran in the cloud and finished." — device is preferred wherever possible and the choice is never hidden.
Files it can't run on device (needing cloud packages/features) say "It can run in the cloud instead." in meaning — offered, not forced.
Cloud limits are real: ≤100 files, ≤10 MiB each, ≤25 MiB total — an over-limit project says so rather than failing mysteriously.
TC-WKS-022SQL projects run in the browser — Results tab, named errors, not meteredP1
Steps
In a SQL project (collegeFest template or a blank SQL) write a query and run.
Write a syntax error; run.
Open the .db file's row — find Reset data; check storage accounting.
Expected
Queries run in-browser SQLite; tables/rows show in the Results tab.
An error names itself with its line — a SQLite message surfaced honestly, not a generic failure.
Databases .db/.sqlite/.sqlite3 hand back up to 5 MB; Reset data exists on the file; project storage for My Projects doesn't meter the browser-side database.
TC-WKS-023React preview — pinned versions, MemoryRouter only, named refusalsP1
Steps
In a React project (habitTracker template) edit App.jsx and watch the preview.
Import a package outside the pinned set (lodash); import BrowserRouter/HashRouter and read the error.
Use react, react-dom, react/jsx-runtime, react-router-dom — the allowed set.
Expected
The preview refreshes from your edit — a fresh isolated frame each time, not a leaked old state.
An outside package is refused by name at its line: "…is a package this preview does not provide" in meaning — pinned versions only: react/react-dom/react-jsx-runtime 19.3.0, react-router-dom 7.18.4.
BrowserRouter/HashRouter errors honestly — the preview is MemoryRouter only; the message says why.
Console output appears under the preview; a missing import file names "The page names files the project does not hold:" with the paths.
Find Update as I type; type and count the ~700ms wait; toggle it off, reload — is it kept per project+browser?
Put an external link in the page and click it.
If a preview can stall, watch past 10 seconds.
Expected
Update-as-you-type defaults on with its ~700ms debounce; your choice persists per project per browser.
An external link is never followed inside the preview: "That link goes to …, which this preview does not follow, so it stays on this page." in meaning — isolation kept.
A preview silent past ~10 seconds says the connection is down — never a frozen frame pretending to work.
Start programs until the allowance (3 concurrent across Code Lab + projects) is reached; start one more.
Navigate away mid-run and return inside ~2 minutes; then past it.
Expected
At the limit a new run is refused and Running programs lists what's running with Stop each — a program waiting on input() still holds a slot.
Leaving the page keeps the program ~2 minutes; returning reattaches and replays missed output (bounded ~500 messages/256 KB) — no lost run, no duplicated output.
Past the window the program has stopped honestly — it isn't still "running" on the server somewhere.
TC-WKS-029Mark complete — you judge, nothing grades, first time earns onceP1
Steps
On a no-task project try to complete — read the block.
On a fully-ticked project press Mark complete; read the confirm; confirm.
Do it on the account's first ever completion; then complete another project.
Expected
No tasks: "A project needs at least one task, every one ticked, before you can mark it complete."
The confirm is honest about the honour system: "You are judging for yourself that the work is finished. Nothing checks it and nobody grades it." and "Unticking a task, or adding one, later returns it to In progress."
Done: "You marked this project complete on {date}." and the card flips to Complete.
First ever: "Project complete. You earned First project completed." — once only; the second completion says just "Project complete."
TC-WKS-030Reopen & Untick every task — state follows honestly, files untouchedP2
Steps
On a Complete project untick one task — watch the state; complete it again.
Use Untick every task; read the confirm; confirm.
Expected
Unticking (or adding) returns it to In progress honestly — the state isn't sticky.
Completing again shows "Project complete." with no second achievement.
Untick-every asks first: "Every task goes back to unticked{, and the project returns to In progress}. Your files are not touched." — and the files really aren't.
Course Workspaces (/course-workspaces) are the projects a course's project lessons asked the learner to build — a separate collection with its own shared 250 MiB, each workspace ≤20 MiB and ≤40 files, never counted against My Projects' 10. A workspace is created once per lesson and completion flows back into the lesson.
Route
Page
What it shows
/course-workspaces
Course Workspaces
One card per workspace: course · lesson, state, tasks, size; shared storage meter; Download · Open the lesson · Delete
/projects/:projectId
The workspace IDE
Same editor core as §6 plus the lesson's Brief and Checklist, "Back to {lesson}" — and no generated help anywhere
The pipeline
A project lesson in a course → "Start the project" → the workspace is created once → work, run, tick the checklist → Mark complete → the lesson completes (and the subject/course, XP and certificate that flow from it) → deleting or re-opening the workspace never takes the lesson's completion back; starting again makes a fresh copy.
Staging
You need a course with a project lesson — the seed subjects ("Data Structures in Python", "Python Fundamentals", "SQL Basics") include "Practice:" lessons; find one that builds a project, or ask staff where the seeded project lesson lives.
TC-WKS-032Course Workspaces list — its own meter, its own cardsP1
Preconditions
An account with at least one Course Workspace (created from a lesson) and some personal projects.
Steps
Open Course Workspaces. Read the lead strip and the cards.
Compare against My Projects.
Expected
Lead: "The projects your course lessons asked you to build, each in a workspace of its own. They do not count against your own projects."
A shared meter: "{X} of 250 MiB used" + "Shared by all of them. Each holds up to 40 files and 20 MiB."
Each card: runtime, name, "{subject} · {lesson}" (or "Its course could not be read just now" honestly), "Edited {when} · {tasks} · {size}", its state, Download, Open the lesson, Delete….
Empty: "No Course Workspaces yet" + "A course's project lesson makes one when you start it. Find one in a subject's outline." — never a zero-meter pretending empty.
The collections never mix: workspaces don't appear in My Projects and don't eat its 10 slots.
TC-WKS-034The workspace IDE — three columns, Brief, Back to lesson, no agentP1
Steps
Open the workspace; read its layout and right panel.
Open the Brief tab and the way back to the lesson.
Look for any generated help, agent or credits surface.
Expected
Three columns: explorer / editor / output; the right panel offers Preview (or Page), Checklist and Brief — and "Back to {lesson}" in the header.
Brief shows the lesson's brief as the course wrote it, with the way back to the lesson.
Where the lesson was unpublished after the workspace existed, the Brief says it can't be read and why — honestly, not a stale copy.
No generated help, no agent tab, no credit costs — same absence as §6, verified here too (GENERATED_ASSISTANCE=false).
Runs, files, saves and limits behave exactly as §6 — the workspace is the same tool, not a lesser one; its own limits apply (20 MiB · 40 files) within the shared 250 MiB.
TC-WKS-035Completing the checklist completes the lesson — once, permanentlyP1
Steps
Tick every task in a Course Workspace; press Mark complete; read the confirm and confirm.
Open the lesson, the subject, and check XP/certificate surfaces it should feed.
Untick a task afterwards and re-check the lesson.
Expected
The confirm adds the course truth: the lesson records this completion once and keeps it even then — completing is honour-system, same as §6.
The lesson completes; where that finishes the subject/course, its completion, XP and certificate follow ("You completed {course}." / "See your completion" when a course finishes).
Unticking afterwards does not un-complete the lesson — completion is recorded once and stands; the workspace's own state still moves honestly to In progress.
TC-WKS-036Delete & Start again — files die, completion lives, fresh means freshP1
Steps
Delete a Course Workspace (read the confirm); check storage freed and the lesson still complete.
From the lesson press Start again; compare the new workspace.
Expected
Delete confirms honestly: "Its files are deleted for good and cannot be brought back. A lesson it completed stays complete; starting the project again makes a fresh workspace from its starting files." — Download offered first.
Storage frees from the course meter (not the personal count — it never used that).
The lesson shows "Lesson complete" with Start again; starting makes a fresh workspace from the lesson's starting files — a new copy, never a recovery of the deleted one.
8 · Cross-cutting checks — apply everywhere in this doc
The platform's universal rules (index §8) bind every page here. These cases sweep them across the test room, results and Workspace once, so they don't repeat inside every case above.
TC-ALL-001Generated assistance is OFF — verify its absence, don't test its presenceP1
Steps
Sweep every surface in this doc for any AI/agent surface: test room, results, practice, both project IDEs, run/debug panels, right panels, palettes, Quick Notes-adjacent spots.
Expected
Nothing exists: no help panel, no "Ask"/"Explain"/"Analyse" paid action, no Credits cost, no generated help — /credits is an unknown address.
Finding one is a P1 bug — absence is the spec (GENERATED_ASSISTANCE=false).
Across this doc's surfaces, listen for wrong words: "attempt/retake" for test, "proctoring" for strictness, "hidden case" naming content, "Labs" in interface text, "saved on this device" vs "Saved locally".
Expected
Tests are "taken once"; strictness is Off/Standard/Strict in plain words; events are "Recorded events" and the ceiling is the "limit of recorded events"; save states are the literal ladder; unanswered is Not reached/Skipped/Not answered; the product names itself Wizly Learning.
TC-ALL-006Keyboard, screen reader, no colour-only statesP1
Steps
Drive: a test room by keyboard alone; a result page's review with a screen reader; the IDE's palettes and dialogs by keyboard.
Check every state (answered/marked/closed/current; save states; outcomes) survives without colour.
Expected
Everything reachable by keyboard in sane order; dialogs trap and release focus correctly; focus lands on headings on navigation.
No meaning carried by colour alone — marks, labels and words carry it too (the navigator's states, Passed/Not passed, outcomes all have non-colour signals).
Reduced motion and zoom (to ~200%) keep everything usable.
Spot-check the catalogue, a paper page, the test room (≥1024 only), a result, My Projects, the IDE at each width; flip themes and modes on two screens.
Expected
Nothing overlaps, clips or lies about capability at any width — the test room honestly requires ≥1024, practice and IDE degrade as spec'd.
Both themes and both modes keep every state legible — no white-on-white status, no theme-only meaning.