The AI started talking again. The human request stayed open.
A handoff nobody picked up used to silence the assistant forever. We now let the AI resume after staff silence without clearing the human request, because helping again is not the same as resolving it.
The AI started talking again. The human request stayed open. That distinction fixed a handoff failure we had created ourselves.
When a shopper asked for a person, we paused the assistant. That part worked as intended. The AI stepped aside and the conversation waited for staff.
The problem started when nobody came. Only a staff member could un-pause the thread. If the handoff sat untouched, the assistant stayed forbidden to speak indefinitely. The shopper could send another message. Nothing useful happened. Their later messages came back as an empty frame, because the AI was still paused and no person had taken over.
We had built a handoff that could turn into permanent silence.
Asking for a human had become a dead end
A handoff sounds simple when described as a state change. AI is speaking. The shopper asks for a person. AI stops. A person takes over. That sequence only works if the last step actually happens.
In a real support queue, somebody may be away. The request may arrive outside the moment anyone is watching. A notification can exist without a person immediately acting on it.
Our original behaviour treated "we have asked a person to take this" as if it guaranteed "a person will now take this." Once the thread was paused, we had no path for the assistant to help again unless staff explicitly returned control.
So the safest-looking rule — never speak once a shopper asks for a person — produced the least useful outcome when nobody arrived. The shopper had asked for more help and got less.
We let the assistant take one turn back
We changed the abandoned case. When the team has been quiet past the handoff silence threshold and the shopper writes again, the assistant takes that turn. The shopper no longer waits forever behind a pause nobody is servicing.
This is not the same as cancelling the handoff. That was the important part. We deliberately do not clear the Needs Human state when the assistant starts speaking again. We also do not resolve the open notification.
The merchant still owes that conversation a human reply. The assistant answering one more message does not make that obligation disappear. If we cleared the handoff as soon as the AI resumed, we would make the dashboard look better by erasing unfinished work.
The shopper asked for a person. Nobody came. The AI helping in the meantime does not rewrite that history.
"The AI may answer" and "a person is still needed" can both be true
That was the state we had not represented properly before. It is tempting to make handoff binary. Either the AI owns the conversation or a person does.
But the abandoned case is not binary. The AI may need permission to respond so the shopper is not left staring at silence. At the same time, the conversation still belongs in the merchant's queue because the original request for a person has not been fulfilled. Both facts need to survive.
So when the assistant resumes, the thread stays visible in the Needs Human queue and continues to count there until a person actually hands it back. We did not let a successful AI reply become evidence that the human task was finished. That would measure activity instead of resolution.
The silence clock had to measure the team, not the conversation
The timeout could not use the conversation's ordinary last-message timestamp. The shopper is the one sending messages while they wait. Every new shopper message would push that timestamp forward, which would make an abandoned conversation look active indefinitely.
So the handoff silence clock is its own field. It resets when staff replies. That makes it a clock for the thing we actually care about: how long the team has been silent. A shopper sending another message does not restart the staff clock.
That sounds like a small modelling choice, but using the wrong timestamp would defeat the entire fallback. The more a waiting shopper tried to get help, the further away the automatic resume could become. We wanted the opposite. A new message after sustained staff silence is exactly the moment when the assistant should be allowed to help again.
Old handed-off threads needed a cautious path too
Threads paused before this behaviour existed did not necessarily carry the new silence clock or the handoff tag expected by the updated flow. We did not treat those old rows as if we knew when their team silence began.
On first sight, they are adopted into the queue and the clock starts from there rather than immediately resuming the assistant based on a time we never recorded. The remaining old conversations can be swept into the same state through the Needs Human backfill.
The rule is the same one we keep finding elsewhere in the product: missing historical measurement is not permission to invent it.
Human handoff is not the moment the AI stops
A lot of the current conversation about AI customer service focuses on preserving access to a real person. That matters. But implementing the request is not finished when the assistant says it will step aside.
The uncomfortable case comes after that. What happens if the person does not arrive? Leaving the AI paused forever respects the handoff literally while failing the shopper practically. Letting the AI resume and silently clearing the human request does the opposite: it helps in the moment but pretends the requested handoff was completed.
We chose neither. The assistant can help again after staff silence. The human request remains open. The merchant still sees the work they owe. The shopper is no longer trapped behind an abandoned pause.
That is the handoff behaviour we wanted in the first place: asking for a person changes who is responsible for the conversation, but it does not require the product to become useless while that person is missing.