Education

Placement and class groups for a language school

Students take a placement test, are assigned to a level group with a schedule, and move up when they pass an end-of-term assessment. Teachers record attendance and the school sees which groups are under-filled before the term starts.

Automatically generated draft

Written by machine against our own engineering playbook. The company is invented; the decisions are the ones we would make on a real build. A reviewed blueprint goes further — nine sections, agreed line by line, and it is what the build is tested against.

Section 01 · What has to work

Students take a placement test to land in a level group, then move up only when teachers record a passing end-of-term assessment.

Section 03 · Screens

Every screen, and what it is for.

  • ›Test Intake — prospective students take the placement test, answering questions sequentially. Instant: answer validation and next-question render.
  • ›Student Dashboard — enrolled students view their assigned group schedule and current level. Instant: schedule render.
  • ›Teacher Portal — instructors record attendance and end-of-term assessment scores per group. Instant: attendance toggle persistence.
  • ›Director Overview — school administrators inspect upcoming group capacity before term start. Instant: capacity deficit filter.
  • ›Group Management — admins create schedules, assign teachers, and adjust student rosters. Instant: student drag-and-drop reassignment.

Anything not on this list is not in version one. That is what keeps a fixed price fixed.

Section 04 · The data model

What it stores, and who can read a row.

User

id uuid, role enum(student, teacher, admin), email text, created_at timestamptz

Access · Users read their own row; admins read all rows.

LevelGroup

id uuid, name text, capacity int, start_date date, end_date date, status enum(draft, open, active, completed)

Access · Students read enrolled groups; teachers read assigned groups; admins read all.

Assessment

id uuid, student_id uuid, group_id uuid, type enum(placement, end_of_term), score numeric(5,2), passed boolean, recorded_at timestamptz

Access · Students read own assessments; teachers and admins read group assessments.

Attendance

id uuid, group_id uuid, student_id uuid, date date, present boolean, marked_at timestamptz

Access · Students read own records; teachers and admins read group attendance.

Those access rules belong in the database, not in the screens. Someone who edits the address bar still cannot read a row that is not theirs — and the test that proves it blocks delivery if it fails.

Section 05 · States

draft → open → active → completed | cancelled

Most scope arguments three weeks into a build are really arguments about a state nobody named at the start.

Section 06 · Where this breaks

What bites products like this one.

Teacher marks attendance offline during unstable classroom Wi-Fi, causing lost records before sync.

Client-side local storage queue with optimistic UI updates and background retry upon reconnection.

Two teachers submit end-of-term assessments simultaneously, leading to race conditions on student level progression.

Database row-level locking during score submission and idempotent transaction handling.

Section 08 · Deliberately left out

What version one does not do.

  • ×Automated email notifications for test results and schedule changes — manual checks suffice for v1, saving 3 days of messaging integration.
  • ×Waitlist auto-enrollment when groups drop below capacity — manual admin assignment is acceptable for initial cohorts.

This is the section that protects the date, and the only place in the document where somebody says no. It is also why clients trust the rest of it.

Still open

What we would ask before quoting.

  • How are placement test questions authored and scored, and does this require an automated grading engine for v1?
  • What specific grade threshold defines passing an end-of-term assessment?

Your product, not this one

Get this written for what you are actually building.

Describe it in a sentence and the generator returns the same sections for your own product. Free, no email, nothing saved to a list.

Next step

Find out if your idea fits in 10 working days.

Tell us what you want to build. We reply the same day with a straight yes, no, or here is what we would cut.

NDA available on request