This release is mostly about making async workflows sturdier. Runs that used to fail or lose results from transient hiccups — a briefly locked status file, a stalled child, a paused supervisor hand-off — now recover and finish. You can also peek into a running or completed async child on demand, and platform noise on macOS sandboxes and Windows is gone. Nine external contributors have fixes in this release.
Highlights
- Async workflows survive transient trouble: a locked status file no longer fails a completed child or aborts its siblings, paused supervisor hand-offs reconcile cleanly, and stalled children now wake the idle parent.
- Inspect any async child on demand — its task, recent transcript, and final output — without spending a model turn, and that output stays available after the result is delivered.
- Cleaner on every platform: no more setuid
/bin/pswarnings under macOS/FreeBSD sandboxes like nono, and no more console windows flashing on Windows during a busy run. - Better model support: children can inherit the parent's session model (good for gateways and proxies), and Hugging Face-style
owner/namemodel ids resolve correctly.
Need to know
If you previously disabled the builtin gpt-pro agent with agentOverrides.gpt-pro.disabled, remove that override — gpt-pro is now an optional Surf package integration, not a builtin.
Full changelog
Highlights
- Async workflows are much harder to break mid-flight: a transient status-file lock, a stalled child, or a paused supervisor hand-off no longer fails or loses an otherwise healthy run.
- Hosts can now inspect a running or completed async child on demand — task, recent transcript, and final output — without spending a model turn, and that output stays available after delivery.
- macOS and FreeBSD sandboxes stop warning about setuid
/bin/ps, and Windows stops flashing console windows during busy runs. - Gateway and proxy models work better: children can inherit the parent's session model, and Hugging Face-style
owner/namemodel ids resolve correctly.
Added
- Add
/subagents-inspect-rpc, a host-facing bridge command that answers on-demand async child inspection requests with a correlated, boundedPI_SUBAGENT_INSPECT_JSON:widget payload (task, transcript window, final output), so RPC hosts can inspect children without a model turn while the live status feed stays small. Thanks to @yanqianglu for #1254.
Changed
- Guide oracle plan and design advice through a short same-session consultation when a material tradeoff remains, while keeping the parent as final decision-maker (#1245).
- Improve bundled role and parent prompts for source-first discovery in noisy codebases (#1247).
- Make Surf's
gpt-proagent an optional package integration instead of a pi-subagents builtin. If you disabled the old builtin workaround, removeagentOverrides.gpt-pro.disabledbefore using Surf's package agent. Thanks to @binhex for #1256.
Fixed
- Stop spawning setuid
/bin/psfor process start identity on macOS and FreeBSD. Sandboxes such as nono no longer reportforbidden-exec-sugidfrom session leases, retention locks, external-job claims, or mission state. Those platforms stay fail-closed without pid-reuse detection. Thanks to @jdumas for #1273. - Stop a transient lock on
status.json(seen on Windows) from failing an already-completed workflow child and aborting its still-running siblings. Status updates after launch now degrade to asubagent.workflow.status_write_failedevent instead of failing the run, and a throwingonTracehost callback can no longer reject a child promise. Follow-up to #1143. Thanks to @MarcusNeufeldt for #1272. - Keep a still-paused workflow result when reconcile republishes updated child output during paused delivery, so a same-state revision is not overwritten or deleted as the old payload.
- Persist async terminal
status.jsonbefore publishing the result file, so observers cannot see a completed result while the run still looksrunning. - Stop Windows opening a console window for each helper process (Git,
gh, PowerShell,npm root -g) spawned during a run, which made a busy run disruptive to work alongside. Thanks to @MarcusNeufeldt for #1274. - Keep completed inspect RPC output available from the durable completion replay after result delivery consumes its one-shot payload, including per-child inline result tails (#1254).
- After a workflow child detaches for supervisor coordination, clear attention once the reply is delivered, keep
subagent_waitblocked until the child exits, and reconcile the paused workflow when that child completes — even after the paused payload was already delivered. A timed-out workflow can also resume from its persisted child session when the workflow dir has no recovery descriptor. Thanks to @skystar567 for #1263. - Wake the idle parent when an async workflow child needs attention, and persist that control event on the enclosing workflow. Status already showed the stall; the parent notice did not. Thanks to @Yibo-Zhang for #1266.
- Resolve Hugging Face-style
owner/namemodel ids against the registry instead of treating every slash asprovider/id. Fully qualifiedhuggingface/owner/namestill wins, and a first path segment that matches a registered provider still meansprovider/id. Thanks to @mr-brobot for #1264. - Keep public structured single-child calls synchronous when
asyncByDefault:falseandasyncis omitted. Thanks to @Nofuture123 for #1257. - Trust the running parent session model when no model is configured, so gateway and proxy parent models can launch children outside the host registry. Thanks to @Nofuture123 for #1258.
- Isolate colliding inherited workflow child output defaults while preserving explicit output collision checks. Thanks to @Reverier-Xu for #1253.
- Show a scheduled run's completion and name the schedule that produced it, so scheduled work no longer finishes silently in a session that cannot attribute it. Thanks to @albertgwo for #1246.
- Show resume-first guidance for failed async runs only when a matching recovery descriptor exists, so missing recovery data no longer points users to a resume command that cannot work. Thanks to @graadient for #1241.
- Keep bundled agent discovery stable across hot package updates, so long-running sessions do not parse newer bundled agent files with older loaded code. Thanks to @graadient for #1242.
- Resolve relative extension paths against the defining agent file, so portable agent definitions load child extensions from the declared location. Thanks to @tayiorbeii for #1249.