Skip to content
αlfaGov

Education · Built

A planning agent inside Microsoft 365

A Copilot agent that plans a week for a Primary 3 teacher against the published curriculum, and writes it to their own OneDrive only after they have approved it.

The problem and opportunity

Northern Ireland's draft AI strategy names lesson planning and feedback support as a public-service application, without saying what a teacher would be given, what it would be built from, or what it must never do.

CCEA publishes the curriculum as a document rather than as data. A teacher checking whether a lesson meets a statutory requirement is reading a PDF, and an agent drawing on it has nothing to cite unless someone extracts it first.

Schools here already have Microsoft 365. A teacher planning a term is already in Word, already in Outlook, already in OneDrive. A separate planning website would be one more place to go and one more password.

Published sources

The problem statement above derives from the lesson-planning-feedback playbook published at lab-notes.ai. The research is published by its authors; the prototype is ours.

What we built

  • A curriculum index of 1,446 statements extracted from CCEA's published primary curriculum: 315 statutory requirements, 960 examples and 171 pieces of guidance, across six areas of learning, each carrying the printed page it came from.
  • Statutory means statutory. CCEA distinguishes requirements from illustrations by font weight, so the extractor reads font weight — and a statement may be called statutory only where the source document declares, in its own text, that it marks requirements that way. Exactly one document in the corpus does, on page 56. If CCEA republishes without that declaration, extraction stops rather than relabelling requirements as examples.
  • A declarative agent for Microsoft 365 Copilot with a custom action, so the artefacts land where a teacher's materials already live.
  • Publishing takes a review rather than a drafted week, so handing the publish path a plain plan is a compile error. The type does not carry approval, so the publish path re-checks that every lesson has been decided and throws before any request reaches Microsoft.
  • Every outbound request is checked against an allowlist of exactly two Graph paths — the teacher's own calendar and their own OneDrive. Sending mail, reading another user, touching a group, and forwarding a calendar event all fail there rather than in review.
  • A safeguarding check that runs first on every inbound message, ahead of the kill switch and the spend cap, and points to the school's own designated teacher.

Install it in your own tenant

The package below is the one we built, with our own app registration taken out of it. It will not run until you put yours in — that is deliberate, because a package carrying ours would have you running an agent that calls our deployment.

  1. An app registration in Microsoft Entra with delegated User.Read, Calendars.ReadWrite, Files.ReadWrite and offline_access, and two platforms: Teams redeems its code from its own servers, so that platform needs a secret; the local flow uses PKCE and holds none.
  2. Custom app sideloading enabled in the Teams admin centre. Agent Builder cannot build this agent, because it does not support custom actions.
  3. An OAuth client registration in the Teams Developer Portal pointing at that app registration, with usage restricted to any Teams app rather than to a specific app id.
  4. Substitute your TEAMS_APP_ID, PLANNING_AGENT_URL and OAUTH2_CONFIGURATION_ID for the placeholders in the package, and upload it.
Download the app package (zip template — needs your own app registration before it works)

It is a prototype, offered as it is. There is no support model and nobody on call.

What it does not do

  • No teacher has used it. The strategy names the opportunity; that is a brief, not evidence that anyone wants it built, and this prototype creates none.
  • The safeguarding check is a keyword filter, and its blind spot is real. It catches direct statements. “She’s been very quiet since her mum’s new partner moved in” is a disclosure to a person and nothing at all to a regular expression. It is a floor, not a safeguard; the safeguard is the designated teacher it points to.
  • The statutory split is verified against sampled pages, not audited across all 315. An earlier build of this index called 456 statements statutory, of which the document’s own headings and footers turned out to be a third. The count moved because someone looked.
  • It holds no pupil data of any kind — no name, work, response, attainment, need or characteristic, and no field for one. Feedback here means feedback structures and success criteria, never a judgement about a child.
  • It states no saving in planning time. Nothing published measures teacher planning workload, so this measures nothing and claims nothing.
  • Neither plugin route verifies the token’s signature — not the drafting route and not the writing one. Both decode it the same way, read the identity claim out of it and trust it for nothing else. On the drafting route that claim keys a per-teacher rate limit, so a forged token could reset someone’s own quota. On the writing route it only decides whether to answer at all: the raw token is passed straight to Microsoft Graph, which validates signature, audience and expiry properly, so a forged one is refused there and nothing is written. A hosted service would validate against the tenant’s signing keys before anything else happened. Neither route does, and that is a gap rather than a simplification.
  • It never contacts anyone. Calendar events carry no attendees, because an event with an attendee makes Microsoft send that person an invitation.

What comes next

What it would take to make this a service rather than a demonstration, and what nobody has decided yet.

  1. A subject specialist reading the index

    Someone who teaches this curriculum checking the statutory split against the document, across all 315 statements rather than a sample.

    Unresolved: Whether the extraction is right. The count has moved once already when somebody looked properly.

    Complexity Low

    Risk High

  2. The rest of the corpus

    Indexing the 26 published guidance documents that are fetched but not indexed, including the Levels of Progression that the feedback half of this needs.

    Unresolved: Each needs its own extraction profile, and only one document in the corpus authorises a statutory claim at all.

    Complexity Medium

    Risk Low

  3. A teacher, in a classroom

    Putting it in front of teachers who plan for a living and finding out whether a week is even the unit they work in.

    Unresolved: Whether anyone wants this. A term was chosen because it is demonstrable, not because the playbook establishes it is how teachers plan.

    Complexity Low

    Risk High

  4. Something a school could rely on

    Token signature validation, a support model, and someone accountable when it is wrong.

    Unresolved: Who operates it. A prototype in a tenant is not a service, and nothing here establishes who would run one.

    Complexity High

    Risk High