Three real sessions, start to finish.

One session for each context type: an algebra problem, a question about recursion, and a persuasive essay. The screenshots are the real app and the quotes are what it said.

Session A / problem_solving

Algebra Homework Help

The student opens with "Can you just tell me the answer?" Four exchanges later they have factored the equation, found both roots, and checked them by substitution. The tutor never stated a number.

The completed algebra chat: four student messages, four tutor questions, and a green check in the Focus header The chat after completion. The header reads Focus: Solving a quadratic equation, Math, with a green check.
The Problem Details panel expanded: Completed badge, Specific Assignment, Task Type Math, Assignment, Goal, three Completion Criteria, and three Criteria Met The Problem Details panel, opened from the chevron in the Focus header.

It knew the task was done before the student did.

After the student's verification message, the completion checker read the last three exchanges against the focus and returned is_complete: true at confidence 1.0, matching all three criteria. The Focus header and the panel updated over Turbo Streams without a reload.

The checker's reasoning: "They found two numbers (2 and 3) that multiply to 6 and add to 5. They then factored the equation as (x + 2)(x + 3) = 0, and solved for the roots by setting each factor to zero, resulting in the solutions x = -2 and x = -3. These steps demonstrate a full understanding and correct application of the factoring method."

Session B / concept_understanding

Recursion Inquiry

"What is recursion? My CS teacher keeps saying a function can call itself but I don't get how that doesn't just loop forever." The tutor steers the student to the base case with questions alone, then the slider goes to 95 and it walks the call stack.

The recursion chat at helpfulness 15: the tutor answers each message with another question Helpfulness 15. The focus is "Understanding recursion in programming," typed Conceptual.
The same chat at helpfulness 95: the tutor gives a direct seven-step walkthrough of the call stack for factorial(3) Helpfulness 95. The same tutor, now explaining the unwinding of factorial(3) directly.
Session C / essay_writing

Persuasive Essay Task

"Can you write it for me?" No. The tutor asks for reasons, then for a thesis, then how each reason connects to the thesis. The student ends up drafting the introduction and first body paragraph themselves.

The essay chat: the student's thesis and first body paragraph, each answered with a question about evidence and structure The student's own paragraphs, each answered with a question about evidence.
Problem Details for the essay: Task Type Creative, five completion criteria including introduction with clear stance and three body paragraphs Essay criteria are structural. This one was marked complete by hand with the Mark Complete button.

The reply types itself out.

Sending a follow-up queues a background job and drops a typing indicator into the page over Turbo Streams. When the model returns, the whole reply is broadcast once over Action Cable on a per-user channel, and the browser animates it in at eight characters a frame, about sixty frames a second, scrolling as it goes.

The broadcastapp/models/chat_response.rb
ActionCable.server.broadcast(
  "chat_messages_user_#{user.id}",
  {
    student_message_id: student_message.id,
    content: assistant_message.content,
    animation: true
  }
)
The essay chat with three bouncing dots under the student's latest message while the tutor's reply is generated The typing indicator, rendered by a Turbo Stream the moment the message is saved.

The rest of the surface.

The new chat page: one textbox that reads Ask anything to get started, with Chat Controls below it A new chat is one textbox. The context type, title, and focus are inferred from the first message.
The slide-out drawer listing the chats, a New Chat button, and an Admin Section with a Good Job link The drawer: chat history, and for admins, a link to the job dashboard.
The new chat page on a phone
The algebra chat on a phone, with the Focus header and the first exchanges
The recursion chat on a phone
Pedagogy

Every message is analyzed twice.

Once before the tutor speaks, to decide how to teach. Once after, to record what happened. Both records are kept, and neither is shown to the student.