Skip to content

fix(developer): byte-bound the shell truncation preview - #10992

Merged
jbg merged 1 commit into
mainfrom
fix/shell-preview-byte-bound
Aug 6, 2026
Merged

fix(developer): byte-bound the shell truncation preview#10992
jbg merged 1 commit into
mainfrom
fix/shell-preview-byte-bound

Conversation

@filipkujawa

@filipkujawa filipkujawa commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

The shell tool's truncation preview (last 50 lines) had no byte bound, so output dominated by a single giant line (\r progress 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:

  • fastText \r progress bars in Terminal-Bench train-fasttext trials: single lines over 100KB passed through as the "preview".
  • Real sessions: a 72KB line from grepping minified prismjs, a 78KB line from fetched HTML.
  • Worst observed: a 174KB line in a db-wal-recovery trial, 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.

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
jbg added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit 3b3719d Aug 6, 2026
25 checks passed
@jbg
jbg deleted the fix/shell-preview-byte-bound branch August 6, 2026 02:25
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)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants