HandbookAcademics05

Timetable & scheduling.

The timetable is the hardest spreadsheet a school keeps. One teacher cannot be in two rooms at once; one room cannot hold two classes; a lab needs the right equipment; the science teacher is away on Wednesday mornings; the whole of Form 4 must sit the same elective at the same time. Get one cell wrong and a hundred students walk to an empty room. YESS treats this as what it is — a constraint-satisfaction problem — and gives you a solver that places a whole school of sections in seconds, an editor that catches a clash the moment you create it, and a run log that can explain why any lesson did or did not land. This handbook walks the whole machine, from the first period grid to the substitution you confirm before assembly.

  • 11timetable screens
  • 13solver weights
  • 4scheduling scopes
  • ≈20 minto read

Prologue

Why a timetable is the hardest spreadsheet you keep#

Every other module in YESS hangs off the timetable. Attendance is taken against a period; the logbook is filed after a period; a substitution covers a period; a live class is scheduled into a period. So the timetable has to be right, and it has to be right for a whole school at once — not one class in isolation, but every section, every teacher, and every room, all consistent with each other.

Doing this by hand is the job nobody wants. A single teacher taught across three classes, a shared chemistry lab, a parallel elective band, a half-term where Form 5 sit mocks — a person with a spreadsheet can hold maybe one of those in their head at a time. YESS holds all of them at once. You describe the rules; the solver finds an arrangement that breaks none of the hard ones and bends as few of the soft ones as it can.

Describe the constraints once. Let the machine do the placing.

Chapter one

Laying out the period grid#

Before anything can be scheduled, the school has to declare the shape of its week. That happens at /dashboard/timetable/config. Here you set the cycle — daily, weekly, fortnightly or a custom cycle of up to fourteen days — the working days, the start and end of the teaching day, the default period duration (30 to 120 minutes), how many periods fall in a day, and where the breaks sit (each break is a name, the period it follows, and a length). Multi-campus schools configure this per campus — slots resolve in class → campus → school order, so a campus can run its own bell schedule without forking the whole school.

Once the shape is set, click Generate Slots and YESS builds the slot grid for you — every slot typed as a period, break or lunch, ordered, for every working day. You can still add, edit, or delete an individual slot by hand afterwards. The same screen holds the school's constraint ceilings (max consecutive periods per teacher, max periods per day per class, an over-capacity tolerance for rooms) and a solver-weight tuning panel — thirteen weighted factors, from protecting the lunch window and avoiding the same subject twice in a day to putting a practical after the theory, each of which you can dial up or reset to the engine default. Those weights are the knobs that make the generated timetable feel like yours rather than merely legal.

The config screen: cycle, working days, day hours, breaks, the constraint ceilings, and the thirteen solver weights — the coordinate system every other timetable screen plots onto.

Chapter two

The rules that shape the solver#

A timetable is only as good as the rules it respects. YESS gathers every rule in one place — /dashboard/timetable/constraints — across six tabs: Pairs, Subject caps, Teacher rules, Groups, Soft and Locked. Some are hard constraints the solver will never break; others are soft preferences it tries to honour and reports when it can't.

Six tabs of rule

  1. 1

    Pairs

    Non-parallel subject rules: a set of subject-and-section combinations that must never collide in the same slot — Mathematics and Physics may not fall together for a section. The solver treats these as hard.

  2. 2

    Subject caps

    Per-subject requirements: periods per week (and a minimum), the max per day, max consecutive days, a preferred room type and time band, and whether the periods must run consecutively — the targets the solver tries to hit for every subject.

  3. 3

    Teacher rules

    Per-teacher constraints — max hours per week and month, max periods per day, max consecutive periods, preferred days, a lunch window, and avoid-first / avoid-last-period flags. The ceilings the solver places every teacher within.

  4. 4

    Groups

    Parallel and joined course groups — kind 'split' (a cohort divided into half-classes pinned to the same slot but in different rooms with different teachers, the mechanism behind banded electives) or 'joined' (two sections taught together in one slot, sharing one room and teacher).

  5. 5

    Soft

    Eleven soft-constraint types — avoid a staff member's off-day or off-period, cap a teacher's consecutive periods, keep a subject off certain periods, put a practical after the theory, protect a class's lunch window, leave room-migration time, hit a subject's weekly frequency, keep its periods in a contiguous block, avoid double-booking a room — plus a 'custom' rule you script yourself. Each carries a weight from 1 to 10.

  6. 6

    Locked

    A cell you pin by hand — this section, this subject, optionally this teacher and room, in this slot, immovably, with a required reason. The solver treats it as hard and places everything else around it. The escape hatch for assembly, a library period, the one thing that must not move.

Chapter three

Running the solver#

The auto-scheduler lives at /dashboard/timetable/scheduler — a three-step wizard: Select, Configure, Result. First you choose the scope. This is where YESS goes beyond a class-by-class tool: you can solve one class, a whole campus, a whole programme, or the whole school in a single run, then tick which sections to include.

In Configure, you set each subject's requirement — how many periods a week, the maximum per day, whether they should be consecutive or spread — alongside the ceilings for consecutive lessons per teacher and periods per day per class. The screen shows you, before you run, how many soft constraints are active and how many slots are locked (with a link straight back to the constraints hub) and runs a pre-flight readiness check that lists any blockers or warnings before you waste a solve.

Click Run Scheduler and the engine runs — entirely in your browser. Under the hood it opens an audit row, runs a multi-restart placement solver (it tries many arrangements — up to twenty restarts for a small scope — and keeps the best-scoring one), then runs an explainability pass that diagnoses anything it could not place. The Result step shows you the week grid with every placed period, a badge count of unscheduled items and conflicts, the conflict details, and a plain-language advisory for every unplaced lesson. When you are happy, click Apply Schedule — YESS clears the old periods for those sections and writes the new ones in one operation.

The Result step: the week placed, the handful it couldn't land, and the reason for each — read it over coffee, then Apply.

Chapter four

Reading and editing the week#

The grid itself lives at /dashboard/timetable/view, and it reads four ways: by class, by teacher, by room, or as a school overview — weekly or day by day. The same surface is also where you edit by hand: click an empty cell to place a period, choosing subject, teacher and room; the moment you do, YESS checks for a double-booked teacher, room, or section and flags the clash before it sticks.

Turn on the Free slots overlay to see, at a glance, where a teacher or room is genuinely free — invaluable when you are slotting in a make-up lesson. Lock a cell to protect it from accidental edits. Every manual change is recorded to an edit history, so a timetable that drifts over a term can always be traced back. When the week is settled, export it to CSV or print the grid for the staffroom wall.

Chapter five

When a teacher is away#

A teacher calls in sick at 07:40. Their periods need cover before the first bell. At /dashboard/timetable/substitutions you open New Substitution, pick the absent teacher, choose the period that needs covering, and pick a substitute from a list filtered to staff who are genuinely free in that slot on that day — each shown with an "available" badge. The substitution is born pending; you Confirm it, then Mark complete once the lesson is covered, or Cancel if plans change. (Creating the substitution is itself the record of the absence — there is no separate absence toggle.)

When several teachers are out at once, work the whole queue from one screen: the /dashboard/timetable/clash-report shows every pending substitution in the next seven days, grouped by date. Pick covers row by row, or hit Auto-assign first available and let it walk the table — it assigns the first free substitute to each pending row and confirms it. Multi-campus schools can narrow the report to a single campus while school-wide cover stays visible.

Chapter six

Teacher availability#

A teacher who runs the Wednesday-morning staff briefing, or who is part-time and only in on Tuesdays and Thursdays, should never be placed against their off-periods. Record those windows at /dashboard/timetable/availability. Mark a teacher unavailable for a slot and the solver skips that combination during placement; it never has to be unpicked later.

Availability is set per term and can be replaced in bulk — useful at the start of a year when contracts and duty rosters change together. It is one of the inputs the solver weighs alongside the constraints hub, so the more honest your availability data, the fewer manual fixes the generated timetable needs.

Chapter seven

When the normal week bends#

Not every week is a normal week. Ramadan shortens the day; exam week replaces lessons with sittings; a summer intensive runs through the break. Variants, at /dashboard/timetable/variants, let you define an alternative schedule for a date range — name it, give it a code and a kind (Ramadan, summer intensive, winter short-day, exam week, revision week, orientation week, seasonal or custom), optionally scope it to particular classes or sections, and optionally override the slot grid for that period. A variant whose dates include today and that is marked active shows a "Live now" badge; the rest sit as drafts until you need them.

Holiday classes, at /dashboard/timetable/holiday-classes, are the sibling for teaching that happens during a break — exam prep, continuation, resit prep, academic recovery. Each window carries dates, an optional fee (with installment and parent-consent toggles), and a mandatory flag. Publish a window and it becomes visible to students and parents; if it carries a fee, enrolment can trigger an invoice automatically. Each window has its own roster you manage from its detail page.

Chapter eight

Every solve, on the record#

A solver you cannot interrogate is a black box, and a black box has no place in a school's most load-bearing schedule. So every generation run is logged at /dashboard/timetable/runs. Each run carries a status — running, succeeded, partial, failed or aborted — and records its scope (class, section, campus, programme or school), when it started, how long it took, how many candidate arrangements it evaluated, how many conflicts it hit, how many items it could not place, the rejection codes that explain the failures (broken out by code), and which soft constraints it had to relax to find a legal answer.

One row per solve: status, scope, duration, candidates evaluated, conflicts, unscheduled items, rejection-code chips, and the soft rules it relaxed. The run row is its own audit trail.

This is the screen you open when a timetable comes out worse than you expected. "Last solve evaluated 47,000 candidates in 1.2 seconds, left two periods unplaced, and relaxed the staff-avoid rule twelve times" is a sentence you can act on — usually by loosening one constraint or freeing one teacher's availability, then running again. The run row is its own audit trail.

What makes this elite

  1. 1

    School-wide, not class-by- class

    Most school timetablers solve one class at a time and leave teacher and room consistency to the human. YESS solves a whole campus, programme, or school in one run — every section consistent with every other.

  2. 2

    Every placement is explainable

    The run log records candidates evaluated, conflicts, unplaced items, rejection codes, and relaxed soft rules. When a lesson won't land, the solver tells you why — you are never guessing at a black box.

  3. 3

    Hard and soft, in one model

    Non-parallel pairs, teacher rules, subject caps, locked slots and parallel/joined groups are absolute; eleven soft-constraint types and thirteen weighted solver factors shape the rest. The solver finds the best-scoring legal timetable, not merely a legal one.

  4. 4

    Clashes caught at creation

    Hand-edit the grid and a double-booked teacher, room or section is flagged the instant you make it — not discovered on Monday morning by a hundred students at the wrong door.

  5. 5

    The calendar that bends

    Variants reshape the week for Ramadan or exam season; holiday classes add billable break-time teaching. The timetable handles the exceptions, not just the steady state.

  6. 6

    Cover before the bell

    Mark a teacher absent and every affected period becomes a pending substitution; the seven-day clash report auto-assigns the first available cover across the whole school from one screen.

Where this connects

Tutorial

Do it step by step#

Build a conflict-free timetable for a whole campus, on the real screens — from the empty grid to the first morning's cover.

  1. 1

    Shape the week

    Open /dashboard/timetable/config and set the cycle, working days, day hours, periods per day and breaks. Click Generate slots to build the grid, then tune the soft-scoring weights so the solver cares about the things your school cares about.

    Configure per campus if bell schedules differ — slots resolve class → campus → school, so a campus can run its own day without forking the school.

  2. 2

    Write the rules

    At /dashboard/timetable/constraints work the six tabs — Pairs (non-parallel rules), Subject caps, Teacher rules, Groups (parallel/joined), Soft and Locked — then switch on the soft preferences you want. Record off-periods at /dashboard/timetable/availability.
  3. 3

    Run the solver

    Open /dashboard/timetable/scheduler, pick a scope — one class, a campus, a programme or the whole school — tick the sections, set each subject's periods-per-week, and click Run Scheduler.

    The Configure step shows how many soft constraints are active and how many slots are locked, and runs a pre-flight readiness check, before you solve — so there are no surprises in the result.

  4. 4

    Review and apply

    Read the Result grid — placed periods, conflicts, and anything unscheduled with the reason it could not land. Happy? Click Apply Schedule and YESS clears the old periods and writes the new ones in one pass.
  5. 5

    Fine-tune by hand

    Open /dashboard/timetable/view, switch between class, teacher, room and school views, and hand-place or move any period. Clashes are flagged as you make them; lock the cells you never want touched and print or export the week.
  6. 6

    Cover the absences

    Each morning, mark absent teachers at /dashboard/timetable/substitutions and clear the queue at /dashboard/timetable/clash-report — pick a free substitute per row, or auto-assign the next seven days in one click.
  7. 7

    Read the run log when something's off

    If a solve disappoints, open /dashboard/timetable/runs. It tells you candidates evaluated, conflicts, unplaced items, rejection codes and which soft rules were relaxed — usually one loosened constraint and a re-run fixes it.

A whole school, placed in seconds, every cell explainable — and the morning's cover sorted before the bell.