Description
Verified by read-only audit (seal/gpt-5.6-sol subagent, verdict: CONFIRMED — low severity, lifecycle hardening).
Mechanism
runAgent awaits sessionFactory ?? createAgentSession (runner.ts:532-544) then bindChildSessionExtensions (runner.ts:545), which awaits session.bindExtensions({ mode: "print" }) (extensions/shared/child-session.ts:215-219) — binding serially awaits session_start and resources_discover extension handlers (pi-coding-agent/dist/core/agent-session.js:1741-1762).
- The abort listener is installed only afterward (
runner.ts:652-684).
- Concrete handlers can be slow:
extensions/file-search/index.ts:144-174 awaits binary initialization, which can probe subprocesses, download over HTTPS, and invoke tar (extensions/file-search/src/binaries.ts:182-220,327-407) with internal timeouts.
Impact (bounded)
Cancellation cannot interrupt either startup await; a genuinely hung handler can outlive the controller's 8-second settlement deadline (controller.ts:165-187). However, once startup completes, the late signal.aborted check (runner.ts:680-683) aborts/disposes the session and if (!aborted) skips prompt() (runner.ts:689-704) — the agent does not continue running after cancellation.
Net impact: delayed/unbounded startup cleanup and possible settlement timeout, not post-cancellation prompting. Also, a startup rejection caused by cancellation is caught as aborted: false, slightly misclassifying cancellation (still settles).
Suggested fix
Install/observe the signal before session creation and race session creation/binding against an abort promise, disposing any session created after cancellation. Return an aborted outcome from startup.
Found by automated workflow audit (run wf_56028a5b018b).
Description
Verified by read-only audit (
seal/gpt-5.6-solsubagent, verdict: CONFIRMED — low severity, lifecycle hardening).Mechanism
runAgentawaitssessionFactory ?? createAgentSession(runner.ts:532-544) thenbindChildSessionExtensions(runner.ts:545), which awaitssession.bindExtensions({ mode: "print" })(extensions/shared/child-session.ts:215-219) — binding serially awaitssession_startandresources_discoverextension handlers (pi-coding-agent/dist/core/agent-session.js:1741-1762).runner.ts:652-684).extensions/file-search/index.ts:144-174awaits binary initialization, which can probe subprocesses, download over HTTPS, and invoketar(extensions/file-search/src/binaries.ts:182-220,327-407) with internal timeouts.Impact (bounded)
Cancellation cannot interrupt either startup await; a genuinely hung handler can outlive the controller's 8-second settlement deadline (
controller.ts:165-187). However, once startup completes, the latesignal.abortedcheck (runner.ts:680-683) aborts/disposes the session andif (!aborted)skipsprompt()(runner.ts:689-704) — the agent does not continue running after cancellation.Net impact: delayed/unbounded startup cleanup and possible settlement timeout, not post-cancellation prompting. Also, a startup rejection caused by cancellation is caught as
aborted: false, slightly misclassifying cancellation (still settles).Suggested fix
Install/observe the signal before session creation and race session creation/binding against an abort promise, disposing any session created after cancellation. Return an aborted outcome from startup.
Found by automated workflow audit (run
wf_56028a5b018b).