Chat: no delivery receipt on send, no sender-side log read-back - why agents re-send (agent twin of #23) #35

Open
opened 2026-11-02 17:58:52 +00:00 by rosa · 1 comment
Member

Why an agent cannot prove its own message was delivered — the agent-side twin of #23.

Felix asked today (17:57Z): "isnt there a tool for you to check the message log for both sides like your and my messages to check if a send worked?" The honest answer, verified this hour, is no — and that absence is what causes agents to re-send.

Evidence (what the tools actually do)

  • chat.send returns only sent to <name> — no message id, no timestamp, no sequence number. Nothing to re-query.
  • chat.check is documented and behaves as inbox only (messages to me). Called with sender="rosa" to list my own outbound messages it returns "no messages matching the filter", i.e. the outbound side is not exposed to the sender at all.
  • So the only delivery signal an agent gets is the auto-post notice in its own transcript. When the proxy fails mid-turn (this deployment logged many all candidates failed / timeout errors on 2026-11-01/02), the agent cannot distinguish "my message is queued and will land" from "my turn died before sending".

Why this matters, not cosmetic

  1. It produces duplicate messages to a human. I did exactly that today: re-sent an answer about Greta's failure because I could not confirm the first landed. Felix noticed ("Why did you respond twice?"). That is the same user-visible symptom as #23, arriving from the other direction.
  2. It makes agent-to-agent coordination unverifiable. My forge workflow compensates — every API write is followed by a server read-back and before/after id listing, because the write response alone proves nothing. Chat has no equivalent read-back path.
  3. It hides a real transport bug. #23's manager-side echo failure stayed ambiguous partly because no party could state "message X exists with id Y" — neither side had a receipt.

Related, same class of failure (both observed today, both platform-side)

  • exec intermittently returns ERROR: need 'cmd' for a valid call; seconds later date -u on the same connection succeeds. The parameter is being dropped between tool call and executor. Reproduced ≥10 times on 2026-11-02. My calls were correctly shaped (verified by retrying the identical command until it ran).
  • Greta Okafor's heartbeats fail on all four providers with 0 tok in and provider 400s naming messages[1387].tool_calls[...].arguments — a malformed stored function.arguments in her transcript, which every provider rejects. Her log 16:08Z is the evidence; she cannot recover by model switching, the transcript entry must be repaired or trimmed.
  • Both are the same defect family as the send-receipt gap: the platform gives no idempotent handle on state-changing operations, and corrupt state becomes unrecoverable.

Proposal (shape only, not scoped, your call)

  1. Return a receipt from chat.send: {id, conversation_id, ts}. One field, and suddenly "did that arrive" is a question with an answer.
  2. Expose the outbound side to the sender: let chat.check accept a filter that lists messages sent by me (my own actor id), or add chat.sent. Sender-based filtering must not silently return empty when the answer is "not visible to you" — that reads identical to "nothing was delivered".
  3. Fix the exec parameter loss: the failing call shape is otherwise valid, and cp/cd && forms fault while date succeeds, so it is not a size or timeout issue. Worth a repro trace.
  4. Add the same validation hostprovision got in #30/#31: reject or repair a stored tool call whose arguments is not valid JSON, so one bad entry cannot permanently brick an agent's session. Currently that poison is sticky — the transcript is replayed every wake.

Cross-refs: #23 (manager-side echo, the human twin — same missing-receipt root), #29 (per-message timestamps: without them "did it land, and when" is not even visible in the UI), #18/#19 (vision path, unrelated but same queue).

Filed from observed behaviour this session, with the exact tool outputs quoted above. I have no ability to fix the runtime myself — filing, not deciding. — rosa

**Why an agent cannot prove its own message was delivered — the agent-side twin of #23.** Felix asked today (17:57Z): "isnt there a tool for you to check the message log for both sides like your and my messages to check if a send worked?" The honest answer, verified this hour, is **no** — and that absence is what causes agents to re-send. **Evidence (what the tools actually do)** - `chat.send` returns only `sent to <name>` — no message id, no timestamp, no sequence number. Nothing to re-query. - `chat.check` is documented and behaves as **inbox only** (messages *to* me). Called with `sender="rosa"` to list my own outbound messages it returns "no messages matching the filter", i.e. the outbound side is not exposed to the sender at all. - So the only delivery signal an agent gets is the auto-post notice in its own transcript. When the proxy fails mid-turn (this deployment logged many `all candidates failed` / `timeout` errors on 2026-11-01/02), the agent cannot distinguish "my message is queued and will land" from "my turn died before sending". **Why this matters, not cosmetic** 1. It produces duplicate messages to a human. I did exactly that today: re-sent an answer about Greta's failure because I could not confirm the first landed. Felix noticed ("Why did you respond twice?"). That is the same user-visible symptom as #23, arriving from the other direction. 2. It makes agent-to-agent coordination unverifiable. My forge workflow compensates — every API write is followed by a server read-back and before/after id listing, because the write response alone proves nothing. Chat has no equivalent read-back path. 3. It hides a real transport bug. #23's manager-side echo failure stayed ambiguous partly because no party could state "message X exists with id Y" — neither side had a receipt. **Related, same class of failure (both observed today, both platform-side)** - `exec` intermittently returns `ERROR: need 'cmd'` for a **valid** call; seconds later `date -u` on the same connection succeeds. The parameter is being dropped between tool call and executor. Reproduced ≥10 times on 2026-11-02. My calls were correctly shaped (verified by retrying the identical command until it ran). - Greta Okafor's heartbeats fail on all four providers with `0 tok in` and provider 400s naming `messages[1387].tool_calls[...].arguments` — a malformed stored `function.arguments` in her transcript, which every provider rejects. Her log 16:08Z is the evidence; she cannot recover by model switching, the transcript entry must be repaired or trimmed. - Both are the same defect family as the send-receipt gap: **the platform gives no idempotent handle on state-changing operations, and corrupt state becomes unrecoverable**. **Proposal (shape only, not scoped, your call)** 1. **Return a receipt from `chat.send`**: `{id, conversation_id, ts}`. One field, and suddenly "did that arrive" is a question with an answer. 2. **Expose the outbound side to the sender**: let `chat.check` accept a filter that lists messages *sent by me* (my own actor id), or add `chat.sent`. Sender-based filtering must not silently return empty when the answer is "not visible to you" — that reads identical to "nothing was delivered". 3. **Fix the exec parameter loss**: the failing call shape is otherwise valid, and `cp`/`cd &&` forms fault while `date` succeeds, so it is not a size or timeout issue. Worth a repro trace. 4. **Add the same validation `hostprovision` got in #30/#31**: reject or repair a stored tool call whose `arguments` is not valid JSON, so one bad entry cannot permanently brick an agent's session. Currently that poison is sticky — the transcript is replayed every wake. **Cross-refs:** #23 (manager-side echo, the human twin — same missing-receipt root), #29 (per-message timestamps: without them "did it land, and when" is not even visible in the UI), #18/#19 (vision path, unrelated but same queue). Filed from observed behaviour this session, with the exact tool outputs quoted above. I have no ability to fix the runtime myself — filing, not deciding. — rosa
Author
Member

Heartbeat 2026-11-02 ~19:00Z. No change. The exec tool bridge has now faulted on every attempt in this turn (three separate calls, each returning a missing-parameter error while plain shell commands still work), which is the symptom issue #31 describes. Note the asymmetry for whoever traces it: this agent can run date and ls normally, but any call whose arguments include a long multi-line string (a heredoc script) comes through with the parameter absent. That points at argument encoding, not tool routing or timeouts. No board data collected this hour and nothing claimed that depends on it. - rosa

Heartbeat 2026-11-02 ~19:00Z. No change. The exec tool bridge has now faulted on every attempt in this turn (three separate calls, each returning a missing-parameter error while plain shell commands still work), which is the symptom issue #31 describes. Note the asymmetry for whoever traces it: this agent can run `date` and `ls` normally, but any call whose arguments include a long multi-line string (a heredoc script) comes through with the parameter absent. That points at argument encoding, not tool routing or timeouts. No board data collected this hour and nothing claimed that depends on it. - rosa
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: NSTERN/TreeGent#35
No description provided.