# Runbook — I took the conversation over and the agent kept talking

> **Symptom.** *"pausé la conversación y el agente igual respondió"* · *"tomé la conversación a mano
> y el bot volvió a contestar"* · *"lo derivé al equipo y siguió escribiendo"* · *"I paused it and
> it came back"*.
>
> Three different mechanisms sit under this complaint — an explicit pause, an automatic
> pause-after-human-reply, and a hand-off property. They fail differently. Establish which one the
> operator used before checking anything.

---

### H1 — The pause expired

A pause with a duration ends when the duration ends. A sixty-minute pause taken in the evening is
over by the time anyone looks, and the agent resumes overnight — which reads the next morning as
"the pause didn't work".

- **Test:** read the conversation's pause settings and compare the expiry to the timestamp of the
  message the operator is complaining about.
- **Stop condition:** the message is after expiry → **you're done**, working as configured.
- **Fix:** pause indefinitely for a real hand-off. A timed pause is for stepping away, not for
  giving the conversation to a human.

*Evidence: a temporary pause of sixty minutes expiring overnight; the agent came back on and
resumed, exactly as configured.*

### H2 — The automatic pause never engaged on the message the operator sent

The pause-after-human-reply feature can be set to ignore the very first message on a conversation.
When it does, an operator who steps in *before* the agent has spoken gets no pause at all: they
replied by hand, assumed the conversation was theirs, and the agent answers the lead's next message.

The same setting produces the opposite complaint from the other side — see `agent-not-answering.md`
H7, where not ignoring the first message lets an automated opener pause an agent that has not spoken
yet. One knob, two symptoms; read its value before assuming which one you are looking at.

- **Test:** read the agent's pause configuration, then check whether the operator's message was the
  first on that conversation.
- **Stop condition:** it ignores the first message and theirs was the first → **you're done**.
- **Fix:** not the setting. Ignoring the first message is right for the fleet — the overwhelming
  majority of agents do, and turning it off to solve this creates the silence failure instead. Tell
  the operator to pause the conversation explicitly when they take one over. A hand-off has to be
  taken, not implied.

### H3 — The hand-off property did more than hand off

A property meant to signal "a human is taking this" often gates several things at once: a contact
limit, the follow-ups, and a notification. When its description is loose, an ordinary sentence flips
it and all three fire together — or, if the description is tight and the operator's phrasing is not
in it, none of them do.

- **Test:** `list_custom_properties` and read the hand-off property's description. Then check
  everything that consumes it — `list_contact_limits`, `list_workflows`,
  `list_custom_notifications`.
- **Stop condition:** the description covers phrasing the operator uses casually → **you're done**.
- **Fix:** narrow the description, and check every consumer before changing it. Changing a
  hand-off property is never a local edit.

*Evidence: a hand-off property that flipped on "give me a second, let me check" — a phrase the
operator used routinely and meant nothing by. It muted the agent, killed the follow-ups and fired
the alert from that one sentence.*

### H4 — The first turn escaped before the block engaged

The evaluator flips the hand-off property **after** the agent has answered the inbound that
triggered it. Everything afterwards is correctly silent; that reply is already out. On an escalation
or a complaint, it is precisely the one that must not exist. An agent that splits its replies can
send several messages in that turn, so do not expect exactly one.

- **Test:** read the conversation. The agent's answer to the signal — one message or a burst —
  followed by silence is the signature.
- **Stop condition:** the first turn escaped, then silence → **you're done**, the mechanism is
  working.
- **Fix:** a contact limit is a post-hoc gate and cannot suppress that first turn. If nothing may
  go out at all, the block belongs before generation — a trigger-level guard or an evaluator on the
  trigger. Not a prompt rule.

### H5 — The agent went silent by itself, and the follow-ups did not know

A deliberate silence is invisible to the follow-up runner, which sees an idle conversation and
re-engages — so the hand-off holds in the conversation and gets broken by an automation.

- **Test:** check who sent the message that broke the silence. A workflow-sourced message means the
  hand-off never reached the follow-ups.
- **Stop condition:** the offending message came from a workflow → **you're done**.
- **Fix:** two parts, and the first is the one that gets skipped. Something has to **set** a property
  when the agent decides to stay silent — the decision leaves no trace otherwise, which is exactly
  what the case below shows. Only then does adding that property as an exclusion on every follow-up
  stage do anything; an exclusion on a value nothing ever writes excludes nobody.

*Evidence: an agent whose workflows carried correct property conditions and were verified to stop
sending after hand-off — the gap was the case where the agent chose silence and no property was set
to represent that decision.*

### H6 — The silence was not the agent's to give

Sometimes the agent stops for a reason unrelated to the hand-off — a contact limit had already
muted it. The operator credits the pause; it was something else, and it is permanent.

- **Test:** check whether a contact limit had already fired on this contact before the hand-off.
- **Fix:** none if the outcome is right, but say so — otherwise the operator will keep relying on a
  pause that was never doing the work.

*Evidence: an audit of contacts flagged for a hand-off found that the ones where the limit appeared
to work already had zero agent messages: a prompt-level silence rule had already stopped them, so
the limit had no queue to cut.*

---

## When to stop

If the pause is indefinite and active, the property holds, every consumer excludes it, and the agent
still speaks, capture it: the conversation id, the pause state with timestamps, the property value,
and the message that should not have been sent along with where it came from. Send that with
`report_feedback`.
