Skip to content

fix(tui): keep leftover same-name collect under the stall budget - #1108

Merged
TheGreatAxios merged 2 commits into
mainfrom
cl-8059-0328-concurrent-same-name-shell_collect-can-lose-stall-bound
Sep 16, 2026
Merged

TheGreatAxios merged 2 commits into
mainfrom
cl-8059-0328-concurrent-same-name-shell_collect-can-lose-stall-bound

Conversation

@TheGreatAxios

Copy link
Copy Markdown
Collaborator

Summary

  • Two concurrent shell_collect calls share one callIdByName slot; when the mapping-owning sibling resolves first and clears it, the leftover earlier collect lost its name and pinned the turn with no wall-clock bound.
  • Track the tool name per call id (callNameById) in register/unregister and consult it in isStallBoundedInFlightTool, so the leftover still aborts at the stall budget.

Verification

  • New regression tests: concurrent collects with the mapping owner done first still abort at the stall budget (stall-watchdog.test.ts), per-id tracking across owner-done-first (turn-state.test.ts), plus a negative for ordinary leftover tools.
  • bun test src/tui/stall-watchdog.test.ts src/tui/turn-state.test.ts: 69 pass, 0 fail.
  • bun run typecheck, bun run lint, bun run check:dead-exports, bun run build: all green.
  • bun run check (includes full suite via projects-dir guard): exit 0, 7758 pass, 0 fail.

Fixes CL-8059

Two concurrent shell_collect calls share one callIdByName slot, so when
the mapping-owning sibling resolves first and clears it, the leftover
earlier collect loses its name and pins the turn with no wall-clock
bound. Track the tool name per call id (callNameById) in register/
unregister and consult it in isStallBoundedInFlightTool, so the leftover
still aborts at the stall budget.

Fixes CL-8059
@linear-code

linear-code Bot commented Sep 16, 2026

Copy link
Copy Markdown

CL-8059

@TheGreatAxios TheGreatAxios left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review

Approve with follow-through.

Dual maps are the right architecture: callIdByName owns name-only collapse; callNameById owns per-id stall names. Do not replace the collapse map.

Make ShouldAbortForStallArgs.callNameById required (no ?? {}). The leftover hole reopens if a caller copies the old fixture shape. Update docs that still describe concurrent same-name collect losing the stall bound.

Will patch on the branch.

The leftover collect after a mapping-owning sibling resolves is only
visible on the per-id map. An optional field with an empty fallback
would treat that leftover as unbounded.
@TheGreatAxios
TheGreatAxios merged commit 4fcdf09 into main Sep 16, 2026
13 checks passed
@TheGreatAxios
TheGreatAxios deleted the cl-8059-0328-concurrent-same-name-shell_collect-can-lose-stall-bound branch September 16, 2026 23:00
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.

1 participant