fix(developer): byte-bound the shell truncation preview - #10992
Merged
Conversation
The 50-line truncation preview had no byte bound, so output dominated by a single giant line (\r progress bars, minified or base64 content) passed through the byte-limit check into an effectively unbounded preview. Keep the preview's tail within 10KB; the truncation notice already points to the saved full output.
jbg
approved these changes
Aug 6, 2026
lifeizhou-ap
added a commit
that referenced
this pull request
Aug 6, 2026
* main: (32 commits) fix: keep turn-context in place for OpenAI Responses-stack models so prompt caching works (#10993) fix(developer): byte-bound the shell truncation preview (#10992) fix(openrouter): stop silently ignoring thinking effort off (#10991) fix: dispatch edited queued messages (#10933) fix: contain recipe template paths (#10930) fix: make shell approval titles faithful (#10986) fix: block MCP app form submissions (#10985) fix: migrate desktop routing to React Router 8.3.0 (#10971) fix: sanitize Bedrock tool errors (#10934) fix implicit OAuth during model discovery (#10929) fix: update React Router to 7.18.2 (#10967) test: early-exit code-exec smoke tests once tool invocation is observed (#10954) fix: keep ACP session naming out of live conversations (#10963) Bind MCP apps to trusted ownership metadata (#10747) tests: add recursion_limit attribute to remaining ACP test files (#10559) Sanitize Unicode tags in MCP resources (#10746) fix(oauth): preserve RFC 9207 iss from MCP OAuth callback (#10678) feat(installer): detect Termux and select musl portable build (#10568) feat: add Celeris provider (#10714) fix: shell ACP providers on desktop (#10907) ...
lifeizhou-ap
added a commit
that referenced
this pull request
Aug 6, 2026
* main: (101 commits) fix: keep turn-context in place for OpenAI Responses-stack models so prompt caching works (#10993) fix(developer): byte-bound the shell truncation preview (#10992) fix(openrouter): stop silently ignoring thinking effort off (#10991) fix: dispatch edited queued messages (#10933) fix: contain recipe template paths (#10930) fix: make shell approval titles faithful (#10986) fix: block MCP app form submissions (#10985) fix: migrate desktop routing to React Router 8.3.0 (#10971) fix: sanitize Bedrock tool errors (#10934) fix implicit OAuth during model discovery (#10929) fix: update React Router to 7.18.2 (#10967) test: early-exit code-exec smoke tests once tool invocation is observed (#10954) fix: keep ACP session naming out of live conversations (#10963) Bind MCP apps to trusted ownership metadata (#10747) tests: add recursion_limit attribute to remaining ACP test files (#10559) Sanitize Unicode tags in MCP resources (#10746) fix(oauth): preserve RFC 9207 iss from MCP OAuth callback (#10678) feat(installer): detect Termux and select musl portable build (#10568) feat: add Celeris provider (#10714) fix: shell ACP providers on desktop (#10907) ...
michaelneale
added a commit
that referenced
this pull request
Aug 9, 2026
* origin/main: (47 commits) chore(deps): bump pypa/gh-action-pypi-publish from 1.14.1 to 1.14.2 (#11037) chore(deps): bump actions/setup-java from 5.6.0 to 5.7.0 (#11036) chore(deps): bump Jimver/cuda-toolkit from 0.2.35 to 0.2.36 (#11035) chore(deps-dev): bump js-yaml from 4.3.0 to 4.3.1 in /documentation (#11052) chore(deps-dev): bump @types/yauzl from 2.10.3 to 3.4.0 in /ui (#10975) chore(deps-dev): bump electron from 41.0.0 to 41.10.3 in /ui (#10969) chore(deps): bump brace-expansion from 1.1.16 to 1.1.18 in /documentation (#10947) chore(deps-dev): bump postcss from 8.5.8 to 8.5.23 in /ui (#10946) chore(deps): bump aiohttp from 3.14.1 to 3.14.3 in /scripts/provider-error-proxy (#10945) chore(deps): bump fast-uri from 3.1.4 to 3.1.5 in /documentation (#10944) fix: reject invalid subrecipe content (#10994) chore(deps): bump azure/login from 3.0.0 to 3.0.1 (#11033) chore(deps): bump pnpm/action-setup from 6.0.9 to 6.0.10 (#11034) Cache-safe request assembly: append-only turn context and declared cache semantics (#11022) Unrolled agent loop (#9574) fix: keep turn-context in place for OpenAI Responses-stack models so prompt caching works (#10993) fix(developer): byte-bound the shell truncation preview (#10992) fix(openrouter): stop silently ignoring thinking effort off (#10991) fix: dispatch edited queued messages (#10933) fix: contain recipe template paths (#10930) ...
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The shell tool's truncation preview (last 50 lines) had no byte bound, so output dominated by a single giant line (
\rprogress bars, minified or base64 content) passed through at full size and got replayed with every later request in the session.Cap the preview tail at 10KB, snapped to a UTF-8 char boundary; the existing truncation notice already points at the saved full output.
Although rare, this does actually happen, for example:
\rprogress bars in Terminal-Benchtrain-fasttexttrials: single lines over 100KB passed through as the "preview".db-wal-recoverytrial, just under the 200K-char backstop ceiling.The line is then replayed with every later request: in a controlled A/B (Kimi K3), one 150KB line plus four follow-up turns cost 118K extra input tokens versus this fix.
Testing
Unit tests: a 200KB single-line output now yields a byte-bounded preview with the full output preserved in the saved file, and boundary snapping is verified on multibyte content.
cargo fmt,cargo clippy -p goose --all-targets -- -D warnings, and the shell test module (28 tests) are green.Manual verification:
python3 -c "print('A'*150000)"in a goose CLI session lands as a 10KB preview instead of 150KB in context, and the model retrieved the full output from the saved file when asked about it.