The brief that started it

"Critically analyse a contemporary issue… use appropriate sources… as discussed in the seminar, follow the usual format. Groups should organise themselves."

Six things are missing from that sentence and none of them are marked as missing. How long is it? What do you hand in? What are the marks actually for? Does "discuss" mean weigh both sides, or argue one?

Some students fill those gaps without noticing there was a gap. Research calls it the hidden curriculum. A tester put it sharper: "the people who 'seem to know' mostly don't know either — they asked each other. It travels through group chats." The barrier isn't the brief. It's who you happen to know.

Common Ground turns a brief into the specific questions worth asking, for a whole class, so nobody has to explain why they're asking.

The most original thing here is a guardrail you can watch

Language models tighten. Ask one what "done" looks like for a 3,000-word essay and it often answers "exactly 3,000 words" — and a student reading that now believes a target is a hard limit the brief never set.

So every line the model produces is checked back against the source brief. Any constraint the model invented is stripped — and the app shows you what it removed: struck through, beside what it became, naming the exact word your brief never used. When the model added nothing, it says so explicitly. A guardrail you only hear from when it fires is indistinguishable from one that's switched off.

The model is never allowed to rewrite. It extracts and asks. It never restates the brief and never writes any part of the assignment.

What it does

  • Read a brief — paste it, get what "finished" looks like, what you hand in, and the questions worth asking, each quoting the exact words that triggered it. Every question comes out as a sendable email.
  • Close the loop — record an answer and the question disappears from the draft email of everyone sharing the link. One person asks, the group has the answer, and the thirtieth person sends nothing.
  • Split the work — roles from a private form instead of whoever talks first, ending in a working agreement with no name attached to any individual constraint.
  • The arithmetic nobody writes down"3,000 words across four sections" becomes "about 750 each."
  • Nine independent display controls — text size, line and letter spacing separately, six tints, four typefaces including Atkinson Hyperlegible, contrast, motion, theme, width. Persisted, applied before first paint, copyable as a link so a setup moves between devices with no account.

Eighteen checks that need no model at all

Under the AI layer sits a second one: eighteen deterministic pure-function checks, no model call, no API key, each quoting the exact span that triggered it. The app works with zero API key configured. The checks carry the baseline; the model improves on it.

Role-splitting contains no model call by design. If a group disputes the split, "the AI decided" isn't an answer anyone should accept — so it's deterministic, and every allocation quotes the stated preference that produced it.

101 tests

npx vitest run — 101 tests across 6 files, ~350ms, no network or key needed to run the suite.

Honest limits

It never infers anything about a person — no account, no profile, no score, and a test fails the build if any output contains clinical language. It never writes your assignment. It is not a substitute for a formal accommodation.

Built With

Share this project:

Updates