chore(main): release 8.46.1#1052
Conversation
|
🤖 Created releases: 🌻 |
There was a problem hiding this comment.
Pull request overview
Release PR for dwctl v8.46.1, aligning repository metadata (crate version, lockfiles, and changelog) with the bug-fix release generated by Release Please.
Changes:
- Bump
dwctlcrate version from8.46.0to8.46.1. - Update both workspace and crate
Cargo.lockentries for thedwctlpackage version. - Prepend the
8.46.1release notes toCHANGELOG.mdand update the Release Please manifest.
Reviewed changes
Copilot reviewed 3 out of 5 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
dwctl/Cargo.toml |
Bumps the dwctl crate version to 8.46.1. |
dwctl/Cargo.lock |
Updates the dwctl package entry to 8.46.1 in the crate lockfile. |
Cargo.lock |
Updates the dwctl package entry to 8.46.1 in the workspace lockfile. |
CHANGELOG.md |
Adds the 8.46.1 section describing the included bug fix. |
.release-please-manifest.json |
Updates Release Please manifest to 8.46.1. |
There was a problem hiding this comment.
Summary
This is a release PR (chore) that bumps the version from 8.46.0 to 8.46.1, incorporating bug fix #1049 which addresses an issue where client-side tool calls in the /v1/responses API were incorrectly being dispatched server-side, resulting in "Tool not found" errors.
The fix is well-designed and thoroughly tested. It correctly distinguishes between server-registered tools (which should be auto-dispatched) and client-side tools (which should be passed through as function_call output items per the OpenAI Responses contract). Approve - this is a solid bug fix with appropriate test coverage.
Research notes
The fix touches the multi-step orchestration flow for OpenAI Responses API. Key files modified:
dwctl/src/responses/transition.rs: Core transition functiondecide_next_actionnow takesresolved_tool_names: &HashSet<String>parameter and checks if all tool_calls are server-registered before dispatchingdwctl/src/responses/store.rs: Addedresolved_tool_names: HashSet<String>field toPendingResponseInputstructdwctl/src/responses/middleware.rs:warm_path_setuppopulatesresolved_tool_namesfrom the resolved tool set's keys- Test files: Updated fixtures and added two new unit tests for the client-side tool passthrough scenario
The root cause was that the SQL in tool_injection.rs only returns server-registered tools (joined via api_keys → user_groups → deployment_groups → deployment_tool_sources → tool_sources), but the transition function was unconditionally dispatching all tool_calls without checking this registry.
Suggested next steps
No blocking issues found. The PR author noted one unchecked item in their test plan:
[ ] Manual verification: hit
/ai/v1/responseswithservice_tier: flexand a client-sidetools: [{name: "read_pages"}]body; confirm response containsoutput: [{"type":"function_call", ...}]instead of erroring
Consider completing this manual verification before merging to ensure end-to-end behavior matches unit test expectations.
General findings
Positive observations
-
Correct fix strategy: The whole-batch passthrough approach is correct. As the comment explains, partial dispatch would leave the model expecting results for tool_calls the loop never ran — a state the model can't reason about.
-
Comprehensive test coverage: Two new unit tests cover the exact failure scenarios:
model_call_with_unregistered_tool_completes_for_client_dispatch: Single unregistered toolmodel_call_with_mixed_registered_and_unregistered_completes: Mixed batch confirms whole-batch passthrough
-
Clear documentation: Code comments explain the "why" clearly, particularly:
- Why all tool_calls pass through together (line 299-303 in transition.rs)
- How the OpenAI Responses contract expects client-side tools to be handled (line 289-298)
-
Minimal invasive change: The fix threads the
resolved_tool_namesthrough existing data structures without changing the overall architecture. This reduces regression risk.
Minor observations
-
Empty
resolved_tool_nameshandling: Whenresolve_tools_for_requestreturnsOk(None), an emptyResolvedToolSetis created (middleware.rs:609-615). This means ALL tool_calls will be treated as client-side tools, which is the correct fallback behavior. -
Test fixture updates: The test helper functions in
test/multi_step_executor.rsandtest/responses.rscorrectly initializeresolved_tool_names: std::collections::HashSet::new()for existing tests, maintaining backward compatibility. -
No migration required: This is a pure code fix - no database schema changes needed since the
resolved_tool_namesfield is already present inPendingResponseInput(an in-memory side-channel struct, not a database table).
No security, correctness, or performance concerns identified.
🤖 I have created a release beep boop
8.46.1 (2026-05-07)
Bug Fixes
This PR was generated with Release Please. See documentation.