02 · NxtWave · 2025

AI Assistant

An assistant embedded in the product that holds two things at once: everything a user has asked before, and exactly what is on their screen right now. Built so someone who is stuck can ask in four words and get moving again.

Role
Associate Product Manager
Focus
screen context, memory layer, personalisation

The problem

The expensive part of a question is asking it

Someone is forty minutes into a piece of technical material at eleven at night. Line three of the example does not make sense. That is the whole problem, and it is smaller than it sounds: they do not need the topic re-explained, they need one line explained, right now, in the words the material just used.

What a product can usually offer instead is a queue. File the question, wait for someone, come back tomorrow. Or open a chat window and start from nothing: paste the code, name the page, explain what you already tried, describe what you expected to happen. By the time a confused person has finished writing that setup, they have spent more effort framing the question than the answer is worth. So most of them never ask. They skip the line, tell themselves it will make sense later, and carry the gap into the next thing they read, where it compounds.

This is the part that gets misdiagnosed. The failure is not answer quality. Models were already good enough to explain a base case clearly. The failure is the cost of asking, and a generic assistant bolted onto the side of a product makes that cost as high as it can possibly be, because it starts every single conversation from zero. It knows nothing about the product, nothing about the screen, nothing about the fact that this same person was stuck on the same idea two days ago. Every unit of context it cannot supply, the user has to type.

So the brief was never to add a chatbot. It was to delete the setup. The assistant should already know which page is open, which block the user is reading, and what they asked on Tuesday. When the question finally arrives, it should be able to answer something as short as why does this work.

A question has a half-life. Answer it late enough and it is no longer a question, it is a gap.

The product

What it actually looked like

AI Assistant · in-product view

  1. The user is on Python, Recursion, Part 3, reading a recursive factorial function.
  2. They select line 3, return 1, and ask about it from inside the page.
  3. User: why does this return 1 and not 0?
  4. Before answering, the assistant resolves two things it already holds: the screen, which is Recursion Part 3, the function fact, line 3, and its memory of this user, who asked about base cases on Tuesday and has recursion marked as a weak area.
  5. Assistant: that line is the base case, and it is the value the whole chain multiplies into. Return 0 and every multiplication above it collapses to 0. Return 1 and the product is left untouched. It adds that the user hit the same idea in the sum example on Tuesday, where the base case returned 0.
  6. The assistant offers one reference back into the material: base cases and identity values, from Recursion Part 2.
  7. It then generates one practice question: write product of a list recursively, and decide what the empty list should return. It will not write the answer.
  8. It closes with a check on what it just explained: in a recursive sum, the base case should return 0, 1, or the first element. The user answers 0, correctly, and the user model is updated to record recursion base cases as shaky but improving.
Illustrative reconstruction of the resolution loop. Not a screenshot, and no real user data.

Illustrative reconstruction, built for this page. Not a screenshot, and no real user data: the material, the question and the model note are all invented.

What I decided

Six calls that shaped the thing

  1. 01

    Screen context is resolved before the question is read

    The assistant knows the area, the page, the section, the block in view and anything the user has selected, and it knows all of it before a single word is typed. Reasoning: most of a question is already on the screen. Asking a confused person to describe their own confusion is the most expensive step in the whole interaction, and it is the one step a product can delete outright rather than optimise.

  2. 02

    Show the context, do not just use it

    Two chips sit above the composer: what the assistant can see, and what it remembers about this user. Reasoning: an assistant that silently knows things about you is unsettling, and someone who cannot see the assumption has no way to correct it. Making the context visible turned a privacy question into a trust affordance, and it bought us a free feedback channel, because when a chip is wrong, people say so immediately.

  3. 03

    One answer, one reference, one question. Never a wall.

    The response is capped by design: the explanation, a single pointer back into the material, a single practice attempt. Reasoning: someone who is already confused has no capacity left for triage. Six options is not generosity, it is work handed back to the person least able to do it. Holding things back was harder to defend internally than adding them, because a longer answer looks more impressive in a demo and performs worse in the moment of use.

  4. 04

    The assistant asks the last question

    Every resolved question closes with a check on the thing that was just explained. Reasoning: reading a good explanation feels almost exactly like understanding it and mostly is not. The moment someone has to produce the idea themselves is the moment it holds, and the assistant is the only thing in the room that knows precisely what was just explained, so it is the only thing that can ask the right question. One question, always skippable.

  5. 05

    Depth comes from the user model, not from the question

    The same question from two people returns two different answers, because the strong and weak area model decides how much scaffolding to build. Solid topic: one line, then stop. Shaky topic: explanation, reference, practice, check. New topic: start from the idea rather than the syntax, in smaller steps, and no check yet. Reasoning: over-explaining to someone who already understands reads as condescension and they quietly stop asking, and under-explaining to someone new leaves them exactly where they started.

  6. 06

    Say when it does not know

    Where the assistant is not confident, or the question falls outside the material it can ground an answer against, it says so and routes to a human instead of composing something plausible. Reasoning: a confidently wrong answer is worse than no answer at all, because the user has no way to catch it and will build the next three steps on top of it. One bad explanation costs more trust than ten good ones earn.

How it works

The loop, from screen to user model and back

Four pieces do the work: screen context awareness, the user memory layer, the personalisation loop that models strong and weak areas, and the resolution flow that runs from question to answer to reference to check. The order matters more than any individual piece, because the whole point is that the slow, expensive context is already resolved by the time someone decides to ask.

  1. Step 1

    Screen context resolved

    Area, page, section, the block in view and anything selected. Captured continuously, so it is already sitting there when the user decides to ask.

  2. Step 2

    The question is read against that context

    Why does this return 1 resolves to a specific line of a specific example, not to a general question about recursion. Four words is enough input.

  3. Step 3

    Retrieval scoped to the product's own material

    The answer is grounded in the material this user has actually seen, in the vocabulary that material used, rather than in every possible way of explaining the idea.

  4. Step 4

    User memory read

    What they have asked before, what was explained, what they got right afterwards, and the strong and weak areas built up out of all of it.

  5. Step 5

    Response shaped, then capped

    Depth, scaffolding and tone come from the model. The cap comes from the design: one explanation, one reference, one practice question, one check.

  6. Step 6

    Result written back

    The check outcome and the shape of the interaction update the user model, so the next answer starts from a better estimate. This loop is the difference between an assistant and a search box.

The write-back is the piece that is easy to skip and impossible to fake. Without it every session starts from the same blank estimate of the person, and the assistant is a search box with a nicer voice. With it, the model is what decides how much the next answer gives: confidence per topic, the evidence behind it, and a rule for what each band changes about the response.

User model · strong and weak areas

Topic confidence

  • Loops and iteration

    Solid

    twelve tasks clean, no questions in three weeks

  • Functions and scope

    Solid

    one question, resolved, check passed

  • Recursion, base cases

    Shaky

    four questions, last two checks passed, rising

  • Time complexity

    Shaky

    three questions, the last one left unresolved

  • Dictionaries

    New

    not started

What each band changes

  • Solid

    One line, no scaffold. Answer what was asked and stop. Over-explaining to someone who already understands reads as condescension, and they stop asking.

  • Shaky

    Explanation, one reference back into the material, one practice attempt, then a check. This is the only band that gets the full loop.

  • New

    Start from the idea rather than the syntax, in smaller steps. No check yet: testing someone on their first contact with a concept mostly tells them they are bad at it.

Confidence decays. Recent evidence outweighs old evidence, and a user can tell the assistant it has them wrong.

Illustrative. The topics, levels and evidence lines here are invented for this page.

What was hard

The parts that were genuine tradeoffs

Screen context is a scope problem long before it is a technical one. Knowing what is on the screen has to be written down as a list of things the assistant may read and a list it may never touch, and that list is a product decision, not an engineering detail. We drew it tightly: the product's own content surfaces only, nothing wandering into whatever a user had typed somewhere else. The visible context chip started life as a way of making that boundary legible, and ended up being the thing people notice first.

Memory makes mistakes sticky. A model that has decided someone is weak at recursion will over-explain recursion for weeks, and over-explanation is the fastest way to make a person stop asking questions. So confidence had to decay, recent evidence had to outweigh old evidence, and the user needed a way to say I have got this and be believed. A memory layer with no forgetting policy is not personalisation, it is an accumulating prejudice.

Latency stopped being a technical metric and became an emotional one. Every retrieval hop is another second a stuck user spends stuck, and stuck users close tabs. So the loop got split: answer first, out of context that was already resolved, then load the reference and generate the practice question behind it. They are reading by the time the slower parts land.

The hardest single call was deciding not to solve the exercise. Faced with a coding task the assistant can trivially produce working code, and every instinct in a product team pushes towards it, because it demos beautifully and it is precisely what users ask for. It also removes the only part of the exercise that was doing any work. We drew the line at explaining the idea and never writing the answer, which meant accepting that some people would find the assistant less useful than they wanted it to be, and saying so out loud in the interface rather than pretending the limitation was a capability gap.

And quizzing a frustrated person is genuinely risky. A check-back question at the wrong moment does not read as help, it reads as being tested by the one thing that was supposed to help. So it is one question, it is always skippable, and where the signals suggest someone is annoyed rather than curious, the assistant does not ask it at all.

Outcome

What changed, stated honestly

The numbers on this one are internal, so what follows is qualitative. Nothing below is a performance claim: it is a description of the shape of the thing that shipped.

It shipped as an assistant across the product: always available, holding screen context and user memory at the same time, resolving questions in place instead of somewhere else. The behaviour change worth naming is that a question stopped being an event that took someone out of what they were doing. It became something handled in place, in the same minute, after which they kept going.

The second-order effect mattered more than I expected. Once the strong and weak area model existed and was being written to on every interaction, it stopped being the assistant's private state and became a platform input: it is what lets other systems notice a user is stuck before the user reports it. The assistant turned out to be the cheapest way to build a longitudinal picture of how someone actually works, because it is the one surface people talk to honestly.

  • In the flow

    Where a question gets resolved

    not in a queue

  • Across sessions

    What the memory layer carries

    same person, next day

  • Per user

    How deep any answer goes

    shaped by the model

What I would do differently

Control before capability

I would have given users control over their own memory on day one instead of treating it as a follow-up. We built the model first and the ability to see it, correct it and clear it second, which is the wrong order for anything that claims to know you: the control is what makes the knowing acceptable, so it belongs in the first version rather than the next one. I would also have shipped the check-back question as an opt-in before making it the default, purely to learn where it lands well and where it irritates, rather than inferring that from complaints after the fact.