jobs_wait outcomes: wait_slice_expired, operator_stopped, omitted
What each jobs_wait answer means on Sume's hosted MCP and what your agent should do next: call again, stop waiting on stopped ids, or read omitted results.

A jobs_wait answer on the Sume hosted MCP tells you one of three things. outcome: "wait_slice_expired" means the slice ended and the jobs are still running, so call it again with the same job_ids. outcome: "operator_stopped" means Sume operations stopped at least one id; those jobs are terminal with no output, their holds are refunded, and operator_stopped.pending_job_ids lists the ids still running. results_omitted.job_ids names completed jobs whose results did not fit in the answer; read them with one batch jobs_result. All three are described in Jobs and results, read 2026-10-06.
Why a slice ends before the job does
On remote MCP the default timeout_seconds is 50 and the cap is 55. The REST API accepts larger values and clamps them. A wait that returns at the slice boundary has not failed; the transcription is still running and still billing normally. Starting a new paid job instead is the mistake the docs warn about.
| Answer | Meaning | Next call |
|---|---|---|
wait_slice_expired | Time slice ended, jobs still running | jobs_wait with the same ids |
operator_stopped | At least one id stopped by operations; holds refunded | Stop waiting on the stopped ids; wait on pending_job_ids |
results_omitted.job_ids | Results too large for one answer | One batch jobs_result for those ids |
| Unknown or foreign id | The whole call fails | Fix the id list |
A handler for the answer
If your agent wraps the tool in code, branch on the answer instead of letting a model improvise. The sample below ran against three hand-written answers.
def next_action(answer):
outcome = answer.get("outcome")
omitted = (answer.get("results_omitted") or {}).get("job_ids", [])
if outcome == "wait_slice_expired":
return "wait again with the same job_ids"
if outcome == "operator_stopped":
stopped = answer.get("operator_stopped") or {}
return f"stopped ids are final; keep waiting on {stopped.get('pending_job_ids', [])}"
if omitted:
return f"read {omitted} with one batch jobs_result"
return "done"
print(next_action({"outcome": "wait_slice_expired"}))
print(next_action({"outcome": "operator_stopped", "operator_stopped": {"pending_job_ids": ["j2"]}}))
print(next_action({"results_omitted": {"job_ids": ["j3"]}}))Do not ask again about a stopped id
The docs state that waiting again on stopped ids cannot change the answer. Remove them from the list, record them as stopped, and carry on with the rest. Check the ledger with a usage lookup if you need to confirm that nothing was debited.
Sources
Related posts
More in Integrations
- Latenode webhook trigger: fast mode or default for Sume callbacks?
Use Latenode's default 200 reply, not a Webhook Response node, for Sume run callbacks; fast mode hides scenario errors. Branch on outcome, dedupe on request_id.
- Manus Custom MCP Servers: add Sume under Settings > Integrations
In Manus, open Settings > Integrations > Custom MCP Servers > Add Server and enter Sume's HTTPS endpoint and credentials. Manus verifies by fetching tools.
- Is mcp.dev.sume.com a staging URL I can use? No, use mcp.sume.com
mcp.dev.sume.com is for Sume's own development environments. Customer configs should use https://mcp.sume.com/mcp, and OAuth tokens are bound to that resource.
- Meta Muse Zapier connector: how do I limit what an agent can spend?
Zapier's Muse connector brokers app access over Zapier MCP. Spend limits live in each tool you expose. Here is how Sume's scopes, caps and idempotency keys fit.
Written by Sume