CASE 01 — AGENT ARCHITECTURE
The product constraint is the hard part: the model must guide a student to the answer and never simply supply it. Everything in the architecture exists to make that constraint survive contact with a real session.
Fig. 1 — One turn, three phases
A student who is handed the answer has not learned anything. So the tutor runs Socratically: it asks, narrows, offers a smaller step, and checks understanding — and the one thing it must not do is solve the problem out loud.
That is harder than it sounds, because every instinct a helpful model has pulls the other way. Most of the engineering below exists to hold that line under pressure from a frustrated student.
Phase one streams text to the student as it is produced, accumulating any tool calls alongside it. Phase two executes those tools. Phase three feeds the results back so the model can keep writing.
Splitting it this way is what lets text reach the student immediately rather than after the whole turn resolves — which matters more here than in most chat products, because the pause after a student asks for help is exactly when they give up.
The tutor doesn't have one way to explain something. It has an analogy tool, a worked example, a visual representation, a metacognitive prompt, a problem generator, an error analyser, a study-guide builder. An orchestrator decides which to apply from the learning context rather than making the model pick from a flat menu.
The research this came from is specific: multi-modal teaching, combining strategies rather than repeating one, measurably outperforms single-strategy instruction. The orchestrator is that finding expressed as code.
Six agents share the pipeline — the main tutor, a remediation agent, a diagnostic, a Canvas student surface and others — and each gets a filtered tool set through a registry rather than the full list. An agent that cannot render a picker should not be able to call one.
One sharper case: a backstop turn withholds all of the option-prompt tools, not just the one that misfired. Withholding only the picker let the model re-fire the same picker through the question tool instead. Verified live, which is the only way that kind of thing gets found.
Some tools return nothing the model needs — they render a button or a clip beside the chat and that is the whole job. When every tool in a turn is one of those, phase three is pure waste, so a set of them skips it.
Two Canvas tools had never been added to that set, and the lesson-opener prompt mandates one of them whenever a transcript is present. So every opener fired a tool, missed the set, and paid a full continuation of roughly 19,000 tokens that produced zero characters — with the composer still locked.
Removed from the most-run path in the product. One sibling tool is deliberately left out of the set, with a comment explaining why: a different provider emits it as a standalone call with no text, so there the continuation is the only way to get a response at all.