Skip to content

Assistant ​

Who this is for: Any signed-in user (actions filtered by role)
What you'll achieve: Make rota and config changes in plain language, with approval before anything runs

Included on new schools

New organisations get the assistant on by default, with a daily usage allowance. A tenant admin can turn it off in Admin. Your platform operator can still disable ai_assistant for the organisation.

How it works ​

  1. Open the Assistant button at the bottom right of the portal. On a desktop or tablet, the chat sits on the right so you can still use Timetable. Recent lists your earlier chats on this account so you can reopen one. New chat starts a fresh thread (use that after we change how chat behaves). Only you can see your chats.
  2. Describe what you want, for example "Alison is off sick today", "list uncovered lessons today", "auto-fill lesson cover today", or "resolve clashes on today's draft". The header shows which timetable day "this day" uses (the tab you have open). You can ask for several changes in one message ("replace Kaylie then record Paul off sick"). Chat lists the steps, asks if anything is unclear, then puts them on one approval card.
  3. For absences, the assistant uses the school calendar. If you already said sick, training, leave, or appointment, it does not ask for extra notes. If you say someone is ill without a name, chat offers name buttons instead of guessing. If you ask for cover without naming supply or a duty, it asks which you mean. It accepts dates as 2026-08-12, UK styles like 12/08/2026, weekday names (Friday, next Monday), or words like today and tomorrow. Saying "off sick on Monday" records that Monday, not today. For part of a day, say the times (off from 13:00 until 15:00) or morning/afternoon; chat passes startTime / endTime or startCoverage / endCoverage to match the Absences page. Ask "who is off this week" to list recorded absences. Chat hides cancelled ones unless you ask to include them. Ask "what is unfilled this week" for every weekday gap, not only today. Deactivated staff are included when you ask if someone is still on the rota.
  4. Review the approval card. It lists affected people, dates, and warnings.
  5. Choose Apply to write the change, or Do not apply to discard.
  6. After changes that affect the board, the assistant recomputes draft proposals. Publish is a separate step unless you explicitly asked to go live.

If chat is unsure, it asks a question with short reply buttons. It does not guess a person, duty, or school, and it does not stop on a raw error. If a tool call fails (bad dates, missing fields, unknown person), the assistant retries once with corrected guidance, then asks what to do next. Chat also retries a brief OpenAI blip, times out after 90 seconds, and offers Try again if the reply does not arrive.

Never auto-applies

The assistant never mutates data without your approval. Impersonation sessions cannot approve changes.

What roles can do ​

RoleTypical chat actions
Owner / AdminFull config, absences, cover policy, publish. Rota document email timing (on/off, daily or weekly, school-timezone send time) is set under Notifications, not chat
Duty leadAbsences, supply cover bookings, day assignments, prepare/recompute/publish
OfficeAbsences, supply cover bookings, and leave
Staff / ViewerRead schedules, request a rota change (staff), board explain, documentation search

See the RBAC matrix for the full permission model.

Enablement ​

LayerWhoControl
OperatorPlatformai_assistant feature flag per tenant (on by default for new schools)
AdminSchoolAdmin → Cover rules → AI assistant toggle
PlatformDeploymentUsage limits and global kill switch

New schools start with a limited daily token allowance. If daily usage limits are exceeded, the assistant pauses until the next day with a clear message.

Cover policy and depth features ​

When enabled, chat can:

  • Read or set calendar subscribe (get_ics_calendar_subscribe, set_ics_calendar_subscribe): whether staff can add a live personal calendar feed of published duties. When on, that data leaves SchoolRota. The same toggle lives under Settings → School → Calendar subscribe.
  • Read or set cover policy: teaching clash publish, weekly block clash publish, and class-cover gap publish (warn or block, set independently)
  • List lessons needing cover on a date when a timetabled teacher is absent
  • Assign class cover (cover_lesson), list ranked candidates, mark a lesson cover not required, or auto-fill open lessons (auto_fill_lesson_cover)
  • Adjust slot requirements (for example lunch headcount, or require a skill such as first aider). Ask for every day to apply the same rules across matching sessions for the week
  • Split a duty session (split_duty_session) into two consecutive halves on the same duty area so different people can cover each half. Say lunch playground, and optionally the cut time or every matching day. People already pinned stay on the first half. The same action lives on Setup after you choose Yes to more than one person on a duty. Rebuild does not cut lunch posts into halves unless you split them here. For children's lunch sittings (KS1 then KS2), add two times on the dining hall or playground instead of a staff lunch break. See Initial setup.
  • Change a duty session time (update_duty_session_times) or remove one time window (remove_duty_session) on Setup → Day structure after a rota upload. Ask for every matching day to update or remove the same window across the week. This does not delete the duty area name.
  • List duplicate duties (list_schedule_duplicates) and remove an extra (remove_schedule_duplicate) from the weekly template and every day rota when the same post appears twice (for example two KS1 Playtime rows)
  • Remove a duty area (delete_duty_area) and its weekly times and day-board posts. The same action lives on Setup → Day structure next to each duty area name.
  • Add a staff skill (add_staff_skill), then tick it on people (update_person or create_person with skillCodes) so only those people are proposed for a post
  • Change cover preference (set_cover_preference): Often, Sometimes, Only if needed, or Never. Say "change Kevin to only if needed", or "change Kevin's availability" and pick from the four buttons. Chat saves it on the school you have open. Already-built rotas keep the old names until you rebuild, so chat asks whether to rebuild this week's boards (recompute_day). The same save-and-update-rotas choice lives on Staff → Edit.
  • Record absences with optional partial-day times (startTime / endTime as HH:MM, or am / pm presets on the first and last day of a range), list absences (list_absences), supply cover bookings, working patterns, and commitments
  • Log missed scheduled work (list_eligible_to_mark_missed, list_missed_work, list_missed_suggestions, summarise_missed_work, log_missed_work, update_missed_work, undo_missed_work, confirm_missed_work, dismiss_missed_suggestion): weekly blocks or duty posts that did not happen. Pass commitmentKind (for example intervention) to filter. summarise_missed_work returns counts by reason and kind, awaiting confirmation, and session delivery (planned, missed, ran) by weekly-block name. This is staff time, not pupil attendance. List and summarise default to this operating week. Confirm or dismiss auto-suggestions after overlapping cover. This is not an unfilled post and not a missed lunch break. The same actions live on Missed work, Today, and My schedule. Staff without chat access tap Did not happen on the duty or weekly block in My schedule.
  • List weekly blocks (list_weekly_blocks): which PPA, intervention, phonics, or other recurring blocks run, optionally by person, weekday, or kind. Staff without school-wide access only see their own. The same list lives on Staff → Weekly blocks and Timetable activity filters.
  • List current staff lunch break windows (list_lunch_breaks), including the allocated or pinned break on the open timetable day (or "this day", not always calendar today), unused leftover windows, and who has no weekly window. Then apply or clear one (apply_lunch_breaks). Chat matches spoken names (Paul Hills still finds Paul Hill). Pass windowMode fixed for the same time for everyone, or flexible for a longer sitting where each assigned person gets a short break. A sitting longer than an hour is treated as flexible if you do not say. Pass names or a grade (the TAs). This is their own break, not pupil lunch or a lunch duty. Ask for the times. Only assigned staff get a lunch slot on the timetable. Different groups need one apply each. After you apply, chat rebuilds the open day so the tiles match. Empty leftover windows stay until you delete them on Staff lunches. The same action lives on Setup → Staff lunches and Staff → Weekly blocks. To place someone on duty during their break, confirm first (allowLunchBreakClash)
  • Read lunch windows (get_lunch_policy) or create a flexible sitting (set_lunch_policy). set_lunch_policy does not assign people. Use apply_lunch_breaks with windowMode flexible to assign staff. Apply and remove already rebuild the open day. Rebuild tries several legal lunch-cover and break layouts and keeps the one that covers posts and assigned breaks best. Often who are free take a later lunch post before Sometimes. If that still leaves a post short, get_board (lunchAllocations with source missed) and the person's schedule note that they had no break.
  • Add, change, or take off one person's lunch on a single day (override_day_lunch_break): say "take off Paul Hill's lunch" (that day, default today), or "give Alex a lunch today from 12:00 to 12:30". Taking it off removes the card. Do not reuse the same times; that would leave a locked manual lunch. Chat warns if a new window overlaps their duties, lessons, or weekly blocks. Approval is the manual override. The same actions live on Timetable → By person (Add commitment → Lunch break this day, Change, or Remove on a lunch block). A later rebuild keeps a manual window, and keeps a removed lunch off.
  • Update a supply booking status (set_supply_booking_status): booked, confirmed, didn't show, or cancelled. No-shows leave the cover pool and the board rebuilds those duties
  • Request a rota change (request_rota_change) from your own duty, list those requests, and (for duty leads) approve or reject them. Approval rebuilds cover with the same engine as Rebuild day and republishes if the day is already live. Admins can set manual or auto-approve (get_rota_change_request_policy, set_rota_change_request_policy). Duty leads are emailed when a request arrives.
  • Assign, add someone onto a session, lunch post, or other area (add_on_duty; say "add Sam to lunch duty today"). The first person on a lead-required post is the lead, and Unfilled clears once the minimum is met. The add is a locked one-day override. Approval is the confirm. The same action lives on Timetable → By person (Add commitment → Duty session this day). Also replace, swap two people already on duty (swap_on_duty), move between duties, prepare, recompute, and publish (publish honours clash block policy). Prepare and publish also live on the Today and Timetable toolbars.
  • Edit a live day (begin_day_edit): copy the published board into a draft without rebuilding from the template
  • Copy last week (copy_week): copy the previous operating week's people and posts onto another week (Monday to Monday), including one-off swaps. Does not run the cover engine. Days land as drafts. Name this week or next week. The same action lives in the Week menu on Today and Timetable
  • Review the week (review_week): live vs draft days, unfilled posts, and only-if-needed cover
  • Resolve clashes on a proposed day (resolve_clashes_for_day): replace staff with teaching/weekly-block clashes using clearer eligible cover
  • List clash-aware candidates for a slot with hard vs soft reasons

The same replace, swap, and day-or-week remove also lives on Timetable → By person: each duty has Replace (a searchable picker), Swap (exchange with someone already on another post), and Remove, and the person menu can take them off the day or the week. Add commitment on the card can also place them on a duty session or set a one-day lunch after you confirm a manual override. In chat, say add them to that session or give them a lunch this day. Chat uses add_on_duty and override_day_lunch_break. Do not use a weekly block for those one-day overrides.

When you ask to replace someone on duty (take them off and put cover on), name who comes off first, then who goes on: “replace Michaela with Paul”. The cover person does not need to already be on a post. If chat mixes the two names, it checks who is already on duty and shows a clear Yes, replace… button instead of starting a new task. That is one change even if you said remove and replace in the same sentence. If you have not named a day or week, chat uses today. Name another day, this week, next week, or all their duties if you want a different range. On a weekend, "this week" is unclear, so chat asks which range you mean. It does not reuse a week from an earlier request. If you already said all week, entire week, or all their duties, and named the person (and the duty if you have one), chat looks those posts up and puts every matching day on one approval card. A follow-up tap such as This week, both, or a surname applies to the request you just made. Split halves of the same duty are treated as one post; both means every matching session. It does not guess assignment IDs. Duty and staff names can be close, not exact. Initials work as well (replace PH with MS). If two areas or two people could match (for example two Pauls, two people with initials PH, or KS2 playtime vs KS2 lunch playground), it asks who or which one. If you name someone who is already on that post, chat says so instead of adding them again. If the post would still meet its minimum after they come off (for example minimum 1 and two people assigned), chat asks whether to leave the remaining staff with no extra cover, assign cover to keep the same number, or name someone. If taking them off would drop below the minimum, it asks assign cover, leave the post short, or name someone, unless you already said replace. When cover is assigned, it auto-picks in grade ask order (Teaching Assistants before teachers or leadership) from Often/Sometimes staff. If no one in that pool is free, it offers last-resort confirmation, leave the post short, or name someone yourself. Someone already marked last-resort on the board can still be removed; last-resort only limits who may fill the vacated post unless you confirm.

Swap two people on duty ​

When you ask to swap two named people who are already on duty, chat exchanges their posts (swap_on_duty). Say “swap Paul on KS1 playground with Jane on KS2 playground”. That is not replace: both stay on duty, just on each other's area. The same Swap button lives on Timetable → By person.

When you ask to move someone onto a duty that already has staff, chat asks who they should replace. If several people or duties match a name (for example two playground slots), it asks which one. Vacated posts are filled Often first, then Sometimes, then grade cover light, so the slot stays at its minimum. Last-resort staff (for example a head teacher) are not used as fill-in cover unless you confirm. Chat also refuses to put someone on duty at two schools at the same time unless you confirm; that post then shows as At risk. Sequential duties at different schools on the same day are fine. Chat also refuses to put someone on a post during their staff lunch break unless you confirm they will miss that break.

Period presets and hosted CSV pull status are available when Phase 2 tools are enabled for your deployment. Native MIS connectors are coming soon.

Admins can fully control weekly template names in chat: list who is pinned (list_slots with no date), pin someone so they stay every week (assign_template_person), replace them (replace_template_person), remove them (remove_template_person), or clear every weekly name (clear_all_template_people). Say names and days, for example “Pin Karen Parker on Friday Dinner Hall every week” or “Replace Katie-Anne with Marion on Friday Dinner Hall on the weekly rota”. Chat does not need IDs. Duty times stay. The same list, assign dropdown, Replace picker (same modal as Timetable), Remove, and Clear all pinned names live on Setup → Weekly template. If a pinned person is off sick on a built day, rebuild takes them off that post and fills cover. Already-built days stay until you rebuild. To change only one published or draft day, use replace or add on that day instead.

Admins can also start again with a blank weekly timetable (reset_weekly_timetable): that clears duty times and weekly assignments for the current school. Staff, duty area names, imported lessons, and published days stay. The same action lives on Setup → Day structure. Rebuild the week afterwards if the school is already live.

Trusts: staff and schools ​

On a trust, chat can do the same school-level jobs as the Staff and Admin → Schools pages:

  • Attach someone to a school (attach_person_to_school): they work at that school as well as their current ones, which is the same as Share them in the portal. Say "add Alex Rivera to Riverside Secondary".
  • Move someone between schools (move_person_to_school): they join the destination and come off the school they came from, matching Move them here. Say "move Alex Rivera from Riverside Primary to Riverside Secondary". Chat needs to know which school they leave, so name it when someone works at several. Their cover preference, duty eligibility, supply pool tick, and home school follow them; grades belong to one school, so set the grade afterwards.
  • Remove someone from a school (remove_person_from_school): they come off that school only and keep their other schools and their staff record. Their home school is protected, so move them instead of removing them there.
  • Add a school (create_school): the same as Admin → Schools → Add school, including the short code for the web address. School type is primary, nursery, or secondary. Only the organisation owner can do this.
  • Set school type (set_school_profile): the same as choosing school type in Setup or Admin → School (or Change school type in the sidebar once the full menu is open). Default named periods follow the type unless you have customised them. The live rota is not rewritten.
  • Rename a school (rename_school): changes the display name in the sidebar and setup headers. The short code in the web address does not change.

Every one of these asks for approval first, and the approval card for a move spells out that they stop appearing on the old school's directory and new builds. Already-built days there still show them until you rebuild. Ask "who works at this school" or use find_people first if you are not sure of a name.

Out of chat ​

SSO/SCIM secrets, billing, GDPR erase, restarting a school's setup from scratch, invite emails, calendar OAuth credentials, and the weekly missed-work email schedule stay in Admin, Setup, or Notifications. Chat points you to those pages and the docs.

The first duty roster from a pack of personal timetables (loose files or one zip, or one school-wide file) is uploaded on Setup → Last week's rota after the staff list, not in chat. See Initial setup and AI import.

What happens next ​

SchoolRota documentation. Every slot covered, every day.