Orin

One meeting in; four briefings out, each built for what that role has to act on.

Context
Push to Prod Hackathon, team project for SPSU, a five-hour build
My part
Backend: schema, the processing and query routes, and the model calls behind the agents. Also the demo meetings and the pitch deck
Stack
Next.js, Supabase, Claude, Groq Whisper, Clerk, Zod
Year
2026
Orin role-specific briefings

The problem

The Singapore Polytechnic Students’ Union runs many overlapping events on volunteer committees. Every meeting produces one stream of notes, and everyone reads the same document, even though each role needs something different from it.

The Secretary needs what was said but never recorded and who owns what. The organising committee needs this week’s next actions and what is blocked. The chairs need the blockers they personally have to push. EXCO, across all the events, needs to know who is overloaded and what has to be escalated. A better summary doesn’t fix that. The same meeting has to be read four different ways.

How it works

A secretary uploads a recording, records live, or pastes notes or a PDF. A server route carries it through the pipeline and writes the result to Supabase, and the event page shows it as a task table sorted by urgency and blockers, four briefing tabs, a risk banner and a minutes draft.

  • TranscriptionGroq’s Whisper large-v3-turbo turns the audio into text.
  • Meeting agentClaude reads the transcript and returns tasks and decisions as JSON: assignee, task, deadline, urgency from 1 to 5, status, a blocker flag and notes. Zod validates it before anything downstream sees it.
  • Five agents in parallelOn that structured state, the Secretary, OC, CC/VCC and EXCO briefing agents and a risk-and-minutes agent run at once with Promise.all.
  • StorageThe transcript, all four briefings, the risks and the minutes draft are saved on the meeting row; each task becomes a row of its own that people can update inline.
  • Query agentAnyone can ask “What is still blocking the orientation camp?” and get an answer from the stored tasks, minutes and transcripts, told to say so plainly when the answer isn’t there.

Four readers, four inputs

The briefings differ because the agents are given different material, not only different instructions. What an agent can’t see, it can’t pad its briefing with.

  • Secretary

    What its agent is given The full transcript, every task and every decisionWhat it is asked for Documentation gaps, missing owners, what must be minuted, decisions needing written confirmation

  • OC

    What its agent is given The full transcript, every task and decisionWhat it is asked for Next actions this week with owner and deadline, what is blocked, changed plans, dependencies

  • CC / VCC

    What its agent is given The transcript, but only blockers and urgency 4 and 5 tasksWhat it is asked for What needs their personal action or escalation, and what is slipping

  • EXCO

    What its agent is given Structured tasks and decisions only, no transcriptWhat it is asked for Organisation-level risk, overloaded people, escalation signals

BriefingWhat its agent is givenWhat it is asked for
SecretaryThe full transcript, every task and every decisionDocumentation gaps, missing owners, what must be minuted, decisions needing written confirmation
OCThe full transcript, every task and decisionNext actions this week with owner and deadline, what is blocked, changed plans, dependencies
CC / VCCThe transcript, but only blockers and urgency 4 and 5 tasksWhat needs their personal action or escalation, and what is slipping
EXCOStructured tasks and decisions only, no transcriptOrganisation-level risk, overloaded people, escalation signals

An EXCO briefing

EXCO briefing for Graduation Day 2026: strategic decisions, key risks and concerns, escalation signals and action required from EXCO
No transcript went in, so it reads the meeting as a governance problem: no owners or deadlines on anything delegated, and two blockers nobody holds.

The meetings we tested on

I wrote the demo meetings to carry the cases the agents had to get right: a campsite that blocks transport, a vendor’s lead time turning it urgent, and one chair holding critical tasks in two events at once.

CAMPSITE BOOKING: Marcus confirmed he called Ulu Pandan CC
yesterday but got no response. [...] This is the single biggest
blocker right now. Transport, activities, and logistics all
depend on the site being confirmed. Reza cannot book the buses
until we have the site.

RISK: Marcus flagged he is also handling the Freshmen Social
Night venue booking at the same time.
data/demo/notes-orientation-camp.txt (excerpt)

The same notes produce a campsite task at urgency 5 flagged as a blocker for the OC, an intervention point for the chair, and for EXCO a person with urgent work in two events. That last one is also checked without a model: a rule flags anyone holding urgency 4 or 5 tasks across two or more events.

Decisions

  • Route by what each agent sees, not only what it’s told

    Four prompts over the same input drift into four versions of one summary. Cutting the transcript from EXCO and everything below urgency 4 from the chairs makes their briefings structurally different, and keeps operational detail out of places it doesn’t belong.

  • Extract once, then fan out

    Every later agent works from the same validated task list, so an owner or a deadline can’t be read one way in the OC briefing and another way in the minutes. Only extraction runs alone; the five output agents run in parallel.

  • Validate before anything touches the database

    Model output is parsed with Zod: urgency must be an integer from 1 to 5, status one of four values, risks one of four types at one of two severities. A malformed reply fails the request instead of writing bad tasks the committee would then trust.

  • Minutes in the union’s own format

    SPSU secretaries work from a set template of numbered agendas, attendance and task delegation. A separate agent fills that template and marks anything it can’t infer as [TBC], so the draft is something to correct, not rewrite.

  • Keys stay on the server

    All model and transcription calls run in route handlers, and each route refuses to start when its key is missing. The browser only ever sends audio or text and receives results.

Results

  • 4

    Briefings from one meeting, each from its own agent with its own inputs

  • 5

    Agents running in parallel after extraction: four briefings and one for risks and minutes

  • 3

    Demo SPSU events seeded with blockers, urgent tasks and one person overloaded across two of them

A five-hour hackathon build, deployed on Vercel. Nobody measured whether the briefings saved a committee time, and there are no automated tests. The speed figures in the repository’s README were never measured either, so they’re left out here.

Limits

  • Row-level security is on, but the policies only require a signed-in user. The planned per-organisation scoping by Clerk org id was never written, and the processing route writes with a service-role key.
  • Extraction is trusted once it parses: there is no check that a task or owner actually appears in the transcript.
  • The minutes and briefings are free text, so only the tasks and risks are validated.
  • No tests, and the extraction, briefing and query prompts were tuned on our own demo meetings, not real SPSU recordings.