Replies: 2 comments
|
Yes — and I'd separate "the loop is stuck" from "the loop is busy but shows nothing", because those have different owners and one of them is bounded by design while the other is not. The good news is that one artifact names the class, and it survives the freeze: the tail of the durable session log. Everything below is read from What the harness actually bounds (and what it doesn't)The model call is bounded — by silence, not by wall clock. Both shipped providers arm an idle watchdog per chunk, That gives you a free discriminator: a session that stays frozen for tens of minutes without an error is almost certainly not the model call. It would already have failed loudly. A tool call is bounded only if that tool opted in. const timeoutMs = ctx.tools.get(exec.name, exec.agent)?.timeoutMs
if (timeoutMs === undefined) return next() // no budget declared → no deadlineSo there are two independent ways for a tool call to have no upper bound: it never declared a budget, or it declared one and ignores How common is the first case? Of the 39 source files calling for f in $(grep -rl "defineTool(" --include=*.ts packages/*/*/src/); do
grep -q timeoutMs "$f" || echo "$f"; doneThe complement is not exotic. It includes Two of the three places a long-horizon run spends its time therefore have no bound at all: delegating to a subagent, and calling a third-party MCP tool. For "long task, many rounds, then frozen", delegation is the one I would look at first, because it is the only one where the work is another agent in the same process:
The "autonomously planned task list" halfThat part is capped, and the cap is worth knowing: rounds default to 256 (
What to collect, and what each answer rules outThe log lives at
Two cheap side observations sharpen it further: is the process CPU actually idle, and are tokens still being billed? "Spending while rendering nothing" (a loop that keeps taking steps) and "neither spending nor stepping" (one outstanding await) are different classes, and only the first is about loop construction. Plugin-mountable surface (scanned, so it doesn't have to be re-scanned)A stall itself is not plugin-mountable: a plugin cannot write a durable session event (
The gap this thread exposes is narrower and real: a deployment-level default deadline for the tools that declare none. The seam already exists and is public — |
|
A follow-up to the diagnosis above, because the first row of that table —
Its whole scope is the set of tools that post identified as unbounded. Mounted on the same public npm install @argszero/cordis-plugin-tool-deadline-guard- insert:
- id: tool-deadline-guard
name: '@argszero/cordis-plugin-tool-deadline-guard'
# config:
# defaultTimeoutMs: 600000 # budget for a tool that declares none (10 minutes)
# perTool: { subagent: 900000 } # or per tool
# exempt: [ workflow ] # never bound
# onExpiry: cooperative # or `replace`; see belowAn expiry becomes a model-visible, retryable tool result — The code is deliberately not the core policy's What it does not doWorth stating as plainly as the earlier post stated the bound, because the interesting half of this gap is not solvable from any plugin:
Evidence
|
Uh oh!
There was an error while loading. Please reload this page.
如题。
All reactions