aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/superpowers/specs/2026-07-31-web-search-design.md16
1 files changed, 16 insertions, 0 deletions
diff --git a/docs/superpowers/specs/2026-07-31-web-search-design.md b/docs/superpowers/specs/2026-07-31-web-search-design.md
index 7e14b2d..46ebc91 100644
--- a/docs/superpowers/specs/2026-07-31-web-search-design.md
+++ b/docs/superpowers/specs/2026-07-31-web-search-design.md
@@ -235,6 +235,22 @@ at the end, outside the suite.
- **Citation formatting in replies** — depends on 9B instruction-following;
the search block already shows sources
+## Implementation note: the cap shipped as 1, not 2
+
+The table above chose a cap of two searches per turn. It shipped as one.
+
+The first tool call of a turn arrives as a well-formed `tool_calls` delta,
+exactly as designed. A *second* call, issued after the model has seen the
+first set of results, comes back as literal
+`<tool_call><function=web_search>` text inside `reasoning_content`, with
+`finish_reason: stop`, no `tool_calls`, and empty `content`. There is no
+structured call for the loop to act on, so the turn ends with a blank reply.
+
+Reproduced 3/3 with Qwen3.5-9B through the router. A retry with the tool
+withdrawn was tried and rejected: it recovered an answer only some of the
+time and could surface the raw XML to the user, which is worse than the
+blank it replaces. The cap is 1 until the template parses follow-up calls.
+
## Notes
`reasoning-budget = 1024` in the active `Qwen3.5-9B` preset is tight for tool