Free forever, no credit card.Get Started for Free →
← All posts
November 4, 2026 · 6 min read

The Customer Is Still Typing. Why Did Your Scheduled Agent Close the Ticket?

A customer replies to a support ticket at 9:12 in the morning. They add a detail that changes the whole case: the fix did not work, or the problem moved to a second device, or they found the error message they could not find yesterday. At 9:30, your scheduled agent closes the ticket as resolved. Nobody told the agent to ignore the customer. The agent simply never saw the reply. It closed the ticket based on the picture it had when the run started, and that picture was already out of date. A c

A customer replies to a support ticket at 9:12 in the morning. They add a detail that changes the whole case: the fix did not work, or the problem moved to a second device, or they found the error message they could not find yesterday. At 9:30, your scheduled agent closes the ticket as resolved.

Nobody told the agent to ignore the customer. The agent simply never saw the reply. It closed the ticket based on the picture it had when the run started, and that picture was already out of date.

A closure is a decision about the whole thread

Closing a ticket looks like a small administrative step. In practice it is a claim: this problem is over, nothing more is needed, and nobody has to look at it again. When that claim is wrong, the cost is not one awkward message. The customer has to start over, open a new ticket or chase the closed one, and repeat the part they already explained. The team loses the thread that held the history together. And the next scheduled run, working from the same stale picture, can close the follow-up ticket the same way.

The pattern is easy to miss because each individual closure looks reasonable. The ticket had been quiet for a day. The last agent reply asked a question and got no answer, or so the record showed. The run followed its rule: no activity for 48 hours, close it. The rule was fine. The activity record was incomplete.

Where the reply disappears

The first place a reply gets lost is the snapshot. A scheduled run often builds its work list once, at the start of the run, then works through it. A reply that arrives mid-run lands after the list was built. The run closes the ticket because, on its list, the ticket is still waiting for a customer reply. The reply exists in the helpdesk. It just never reached the list the agent was working from.

The second place is the channel split. Customers do not always reply inside the ticket. They reply to the notification email, send a chat message, or leave a note in another system. A closure agent that reads only the ticket thread sees silence, even while the customer is actively talking elsewhere. Silence in one system is not silence from the customer.

The third place is the status tangle. A ticket can sit in a state that looks finished without being finished. A customer replies that the fix is still broken on a second device, and the system leaves the ticket in a solved-pending state nobody watches. The closure run reads the status label instead of the latest message, and the label says the case is done. The latest message says the opposite, but the run never reads it.

The fourth place is the multi-agent split. One agent triages new tickets, another drafts replies, and a third closes stale ones. The closing agent does not share state with the reply agent, so a reply received but not yet filed is invisible to the closer. Each agent is doing its own job correctly. Together they close a ticket the customer is still working on.

All four failures share one root cause. The closure run trusts a partial picture of the conversation instead of checking the current state of the thread before it acts. It wakes up, reads what it was given, and decides. It never asks whether anything changed since that picture was taken.

The check that has to happen before every closure

The fix is a habit, not a new tool. Before any ticket is closed, the agent should recheck the thread it is about to close, in the system that owns the conversation, at close time. Not at list-building time, not at the start of the day, but in the moments before the closure is recorded. If there is an unread reply, a reply in another channel, or a message that arrived after the work list was built, the closure stops, and the reason is recorded so an operator can tell the difference between a ticket that was deliberately closed and one that was held open because the customer was still talking.

That recheck only works if the conversation state is shared, not trapped inside one tool. The reply, the status, and the history have to be one record that every part of the setup reads: the helpdesk, the chat tool, the email thread, and the closing agent. When each tool keeps its own copy, the copies drift apart, and the drift is exactly where premature closures come from.

This is where a shared memory layer changes the problem. Vilix AI is cloud-hosted, so there is no infrastructure to set up or maintain. A scheduled agent connects over MCP and reads the same memory every run. It stores full conversation history, not just extracted facts, so the actual thread is there to check, including the customer's latest message and what the team already promised. Because the same memory follows the agent across tools and devices, a reply that arrived by email is visible to the agent that closes tickets, and a decision made in one run is visible to the next. The plan is free forever, with a 7-day Pro trial that needs no credit card, and everything can be exported or deleted at any time.

With that record in place, the closing run changes its first step. Instead of starting from a frozen list, it starts by asking: what is the current state of this thread? Has the customer replied since the last check? Is anything still open? Only when the answer is no does it close. The closure becomes a decision about the whole conversation, not a guess from a snapshot.

What to change this week

Start with the closure rule itself. Change it from "close tickets with no activity for 48 hours" to "close tickets with no activity for 48 hours, verified against the live thread at close time." That one word, verified, is the whole fix. A rule that checks the live thread cannot close a ticket the customer just replied to.

Next, merge the channels into one record. Every reply, wherever it arrives, should land in the same conversation record the closing agent reads. If a reply can arrive somewhere the closer never looks, the closer will eventually close a live conversation. Record every closure and every hold, so a ticket held open yesterday because the customer replied is not closed today by a run that forgot yesterday's hold.

Your customer is still typing. The ticket should stay open until they are done. A scheduled agent that remembers the whole conversation, across every run and every channel, does not have to guess whether the conversation is over. It can check, and checking is the difference between a ticket that closes because the problem is solved and a ticket that closes because the agent never saw the reply.

Give your scheduled agents one memory they all read: Vilix AI.

Get Started for Free

Persistent memory across ChatGPT, Claude, and the AI tools you already use in Vilix AI.

Get Started for Free

Free forever, no credit card.

Keep reading
Does Base44 Remember Between Sessions? Two Different Memories, Two Different Answers

Does Base44 Remember Between Sessions? Two Different Memories, Two Different Answers Short answer: yes, in two separate places, and neither one is the memory most people mean when they ask the question. The AI chat that builds your app keeps its conversation, its plans, and the instructions you wrote for that app. The AI agents you build inside your app have their own memory, on by default, that carries preferences and facts across conversations with your app's users. Both are real. Both stop a

Does v0 Remember Between Sessions? Chat Context, Knowledge, and Where It Stops

Does v0 Remember Between Sessions? Chat Context, Knowledge, and Where It Stops Short answer: inside one chat, yes. Across chats, projects, and the rest of your tools, mostly no, unless you wrote the context down yourself in the places v0 calls Knowledge and custom instructions. That distinction matters because v0 feels continuous while you work in it. You return to a chat, the conversation is still there, the generated app is still there, and iteration picks up where it left off. It is easy to

Does Bolt Remember Between Sessions? Chat Threads, Knowledge, and Short-Term Memory, Explained

Does Bolt Remember Between Sessions? Chat Threads, Knowledge, and Short-Term Memory, Explained Short answer: the project remembers, because the project never goes away. Your code, your chat thread, your version history, and your backups are all still there when you come back tomorrow, so picking the work back up feels continuous. But Bolt does not build a learned memory of you or your decisions the way a memory product does. What carries between sessions is the work itself, plus whatever contex