v0.4.0
Added
-
⚠ New migration
0002_snapshot_state— runmigratewhen upgrading.
StoredSnapshotgains astatecolumn mirroring the harness'sSnapshotState
(complete/interrupted, defaulting tocomplete, so existing rows keep
today's behaviour).A
completesnapshot sits at a boundary where every tool call has a matching
return, so resuming from it is always safe. Aninterruptedone is a rescue
point captured mid-tool-cycle — pending calls may be re-executed or closed out
with synthesized returns — solatest_snapshot()now skips interrupted rows
unless asked for them. The state has to be stored rather than inferred:
by the time a resume is attempted, the run that produced the row is gone.When several snapshots exist, the state filter applies after ordering, so
the newestcompleterow wins even when newerinterruptedrows sit above it
— the same walk-back-from-newest the harness reference stores do.
Changed
[harness]now requirespydantic-ai-harness>=0.12,<0.13(was>=0.7,<0.8).
The ceiling had gone five minors stale, which on a 0.x library is where breakage
accumulates — and it did. It also gated
pydantic_ai_harness.skills,
which does not exist below 0.11 and is the prerequisite for adopting agent skills.- ⚠
DefaultStepStore.latest_snapshot()gained aninclude_interrupted
keyword, matching the harness'sStepStoreprotocol. Harness's own
continue_run()passes it, so before this the resume path raised
TypeError: latest_snapshot() got an unexpected keyword argument. Any custom
StepStoreimplementation must add the same parameter. - Raise the drf-chain ceilings:
[drf-mcp]→djangorestframework-mcp-server>=0.17,<0.18
(was>=0.15,<0.16) and[spec-tools]→djangorestframework-pydantic-ai>=0.9,<0.10
(was>=0.8,<0.9). The MCP ceiling had gone stale a wave earlier — drf-mcp
0.16.0 (MCP Apps) was already excluded — so two upstream releases were
unreachable from here rather than one. No adaptation was needed, which the
three relevant upstream changes explain:- MCP Apps (drf-mcp 0.16.0) adds
ui://resources and_meta.uilinks on
tool definitions. The bridge readsname/description/inputSchema/
outputSchema/annotationsofftools/listand ignores_meta, so the
addition is inert here. The resource-encoding fix in the same release (non-JSON
resource bodies no longer come back as quoted JSON string literals) touches
the resource surface, which this bridge does not use — it calls tools only. - The shared
UrlKwarg/QueryParam(drf-mcp 0.17.0, PAI 0.9.0) are
re-exported fromdjangorestframework-servicesrather than defined locally,
behind permanently preserved import paths. Neither is imported here. PAI's
switch fromValueErrortoImproperlyConfiguredfor a bad channel
declaration is likewise unreachable:SpecCapabilityis constructed with a
spec mapping and no channel registrations. InputRequiredenforcement (drf-services 0.28) makes a missing
marked-required input raiseServiceValidationErrorat dispatch. Over the
MCP bridge that already arrives as anisErrorresult with
type == "validation_error", whichcall_toolmaps toModelRetry— so a
spec adopting the marker gets a model-correctable failure through this path
with no change here.
- MCP Apps (drf-mcp 0.16.0) adds