• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

vstorm-co / subagents-pydantic-ai / 30768152168
100%

Build:
DEFAULT BRANCH: main
Ran 02 Aug 2026 09:33PM UTC
Jobs 1
Files 16
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

02 Aug 2026 09:33PM UTC coverage: 100.0%. Remained the same
30768152168

push

github

web-flow
fix: a suspended subagent is no longer reported as completed (#67)

Three defects found integrating the library into a platform where every
agent is built with `output_type=[str, DeferredToolRequests]`, which made
the first one the default path rather than an edge case.

`_ALWAYS_PROPAGATE` guards the exception route, but an agent whose
`output_type` includes `DeferredToolRequests` never raises: pydantic-ai
ends its run normally with the parked calls as the output, exactly as it
does for a top-level run a caller is expected to resume. That reached
`serialize_output`, so the parent agent received `{"calls": [],
"approvals": [...]}` as the specialist's answer, summarised it and
carried on -- with `handle.status` saying `completed` and the approval
surfaced nowhere. It is the outcome the module docstring says the design
prevents, arriving by the output instead of the exception. A deferred
output is now the fifth entry in the error contract: `DEFERRED` on the
handle, the parked calls kept on `TaskHandle.deferred_requests`, and the
matching signal raised (`ApprovalRequired` when anything needs
approving, `CallDeferred` otherwise) so the parent suspends too. The
suspended run's chat trace is deliberately not saved -- continuing it
would resume from a point whose deferred results were never supplied.

`cancel_all` awaited each cancelled task with no bound, from inside the
`finally` of `SubAgentCapability.wrap_run`. A `CancelledError` can be
caught and a subagent's toolset is arbitrary consumer code, so one task
that swallowed the cancel held the parent run's teardown open forever
with nothing logged. The wait is now bounded by `cancel_grace_seconds`
(5 s by default); a task still alive after it is logged with its task id
and left to the event loop.

Streaming a delegation was possible but only by setting
`event_stream_handler` on each agent instance -- which a dynamically
created specialist does not have, since the library builds it, making
"stream subagents... (continued)

1565 of 1565 relevant lines covered (100.0%)

1.0 hits per line

Jobs
ID Job ID Ran Files Coverage
1 30768152168.1 02 Aug 2026 09:33PM UTC 16
100.0
GitHub Action Run
Source Files on build 30768152168
  • Tree
  • List 16
  • Changed 6
  • Source Changed 6
  • Coverage Changed 6
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #30768152168
  • 2eb2bd89 on github
  • Prev Build on main (#30717001218)
  • Next Build on main (#30768293561)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc