A delegation that never started answers the model

What went wrong

delegate_to_agent is exempt from the per-tool timeout, because a delegation legitimately runs for minutes. Its own bounds are meant to end it: the create fails within the request timeout, and a dispatched sub-thread is read for at most ten minutes (WaitForDelegationResult).

There was one path with no bound at all. When the lifecycle stream is wired (every production chat), the call resolves on exactly two events for its call id: Dispatched and Failed. The launch (ChatClientAgentFactory.ExecuteDelegationAsync) emits one of them once it has tried to create the sub-thread. But three refusals return BEFORE that, as a plain text chunk, and then complete:

The tool ignored the launch's completion on purpose (a successful launch also completes at once, and the sub-thread's summary arrives later through the lifecycle path). So for a refused launch nothing was left that could settle the call. It waited until the round cap.

The incident

Measured on the control instance, response cell Hosting/Triage/_Thread/bug-systemorph-meshweaver-5910/e693ac26 (2026-09-30):

So the call was never waiting on a sub-agent. It was waiting on an event that could not come. The round's work up to that point was lost with it.

The fix

The launch emits its start event before it completes, on the same thread, and the lifecycle stream delivers synchronously. Therefore a launch that completes with no start event seen for this call started nothing. DelegationTool now settles the call at that moment with what the launch said, as a failed tool result (DelegationTool.NotStartedResult):

Error: delegation to Feedback Agent was not started — Agent 'Feedback Agent' not found.
delegate_to_agent takes an agent ID, not a display name; the agents this thread can delegate to are: …

The "not found" refusal now lists the ids the thread can delegate to, so the model can correct the call in the same round.

This adds no timer and changes no bound. The round cap stays the outer authority for a round; what changed is that this tool no longer has a path on which only the round cap can end it.

Tests

DelegationNotStartedTest:

What this does not cover

The same log line (No model call was in flight) has a second cause that this change leaves alone. One later recurrence was read, response cell Hosting/Triage/_Thread/bug-systemorph-meshweaver-plugins-2819/1a003c7b (2026-10-05):

Nothing hung there. The round was out of time and the cap cut a healthy delegation, which is the cap doing its job. Whether a round should stop starting a delegation it has no time left to wait for is an open design question.

What this does not establish