Time-outs and time zones
In DataMind Oda, slow work is bounded: a step that can stall runs under a time limit, and a step that passes its limit comes back as a timeout in place of its own result. A time zone value gets a check of its own as it arrives, before anything keeps it. This page is the reference for both: where the limits sit, what a timeout reports, how a limit's value is checked and which time zone names are accepted.
The two layers of a time limit
- A limit belongs to its step. Nothing bounds a whole task: limits apply step by step, and a step that declares no limit of its own runs untimed.
- The tool's budget. A tool that can stall carries a budget for its call. Web search and page reading carry 30 seconds each by default, and a shell step's own limits apply to commands (Shell commands).
- The backstop behind the tool. The page reader keeps a second limit of its own behind the tool: a resource backstop, not the budget the call is judged by (Web search and page reading).
- The first reason wins. A call judged by a tool budget reports the tool-call timeout; a call that reaches the page reader with no budget above it reports the reader's own limit. When more than one reason ends the same wait, the first to arrive is the one reported; a later reason does not replace it.
What a timeout reports
A limit that fires ends the wait and returns a timeout in place of the step's own result. The report carries a short code naming the kind of timeout, and, where the kind has one, the limit that fired:
| Code | What fired |
|---|
TOOL_TIMEOUT | A tool call's own budget; the text reads timed out after <n>ms. |
BASH_TIMEOUT | A shell step's own time limit; the reason reads BASH_TIMEOUT after <n>ms. |
WEB_FETCH_TIMEOUT | The page reader's own backstop, on a call that ran with no tool budget above it; the text reads web fetch timed out. |
LLM_STREAM_IDLE_TIMEOUT | A streaming reply that went quiet past the stream idle wait set for the route (Provider route settings reference). |
- The report is the step's result. Oda reads it and chooses what to do next, for example a retry or a different approach; the timeout itself does not end the task. What a cut-off step looks like while you follow a task is on Repeated steps and tool timeouts.
What a limit does, and does not do
- It ends the wait, not the work. A timeout is a notification: the step stops only when it responds to the request, by ending its own process, socket or task. A step that ignores the request can keep things waiting, so a timeout can arrive late.
- It is not a deadline for the task. Limits apply step by step, and only to the steps that carry one; there is no overall time budget for a task.
- The stream watch arms only while a step waits. For a streaming reply, the wait ends when the reply goes quiet past the stream idle wait set for the route. The watch runs only while a step waits for the next piece, so a reply that keeps sending is not cut off, however long it runs.
- File work runs untimed. Reading, writing and editing local files take no time limit, on purpose: a deadline would kill work the operating system will still finish once it starts.
How a limit's value is checked
- Left out means the default. A limit that is not set falls back to the step's own default.
- Too high is capped. A value above the limit's maximum is capped at the maximum, and no wait is longer than 2,147,483,647 ms, the largest delay that can be scheduled.
- Not usable is refused. A value that is not a positive, finite number is refused before any work starts, and the message says the value
must be a positive finite number.
- Zero never switches a limit off. There is no zero setting that disables a timeout: zero and negative values are refused like any other unusable value.
- Where a limit can be set. Limits that have a setting of their own live where each one belongs: the command limit in Shell settings (Shell settings), the stream idle wait on a route (Provider route settings reference), and a server's tool call limit in MCP servers (MCP servers).
Before a time zone is stored
- The check happens at the boundary. A time zone value is checked as it arrives, before anything keeps it: Oda accepts
UTC or an IANA name in Area/Location form and answers the platform-canonical spelling of it, so an alias is never what gets stored.
- Refused spellings. Blank and space-padded values are refused, as are abbreviations such as
CST or GMT+8, single-segment names such as Asia, a lower-case utc, and names the platform does not support.
- Refusal codes. Where a chat's message carried the value, the refusal reads
session/invalid-time-zone; a subagent continuation's refusal reads subagent/invalid-time-zone.
- The known-name set varies. Which names are known follows the platform data of the process doing the check, so two computers can disagree about an alias or an unusual name.
- You rarely type a zone. A zone arrives with the message that carries it; Prompts, queue and steering covers that side, and how Oda then reads time while it works is on Time and terminal context.
- Where the zone comes from. The zone that travels with a message is read from the browser at the moment you send it. It is used for that message's own time handling and is not saved as a setting, so it is sampled fresh each time you send.
Questions, answered
Do reading and editing files have a time limit?
No. Reading, writing and editing files run without a time limit, on purpose: a deadline would kill work the operating system will still finish once it starts. Only steps that carry a limit get one, and file steps carry none.
Why can a timeout arrive late?
A timeout is a notification, not an enforced stop: it asks the step to stop, and the result arrives once the step responds, by ending its own process, socket or task. A step that ignores the ask can keep the wait going, so the timeout can come later than the limit.
What does the number in a timeout message mean?
It is the limit that ended the wait, written in milliseconds. The message pairs the kind of timeout with that number: a shell step's reason reads BASH_TIMEOUT after <n>ms, and a tool call's text reads timed out after <n>ms.
What happens if a limit's value cannot be used?
It is refused before any work starts, and the message says the value must be a positive finite number. A value that is too high is treated differently: it is capped at the limit's maximum. Left out, a limit falls back to the step's own default.
Can I change the time limits?
Yes, for the limits that have a setting of their own: the command limit in Shell settings, the stream idle wait on a provider route, and a server's tool call limit in MCP servers. A limit that comes with a step and has no setting is not changed in the app.
What does session/invalid-time-zone mean?
A time zone that arrived with a message was not UTC or a valid IANA name in Area/Location form, so it was refused before anything kept it. Write the zone as UTC or as an Area/Location name such as Europe/Berlin; a subagent continuation's refusal reads subagent/invalid-time-zone instead.
Is a lower-case utc accepted?
No. The short name is UTC, in capitals; a lower-case utc is refused, like any other spelling that is neither UTC nor a standard Area/Location name.