base red: web lint hook fixture pins stand-in lint tools; bounded stream in the Chromium page fake
Fixes three base reds on feat-cmux-next. All the changes are test fixtures or test support.
1. cmux-next web lint / web lint (fast) and cmux-next guards / tooling-tests (the "web lint pre-push hook" step). #34237 (9b2b57fe425) made the installed cmux-next gate refuse a hook install with no lint-tools.lock, which is correct. The web lint test fixture never committed a lock, so 32 fixture pushes failed with "the installed hook is older than the checks this push needs ... (it has no lint-tools.lock)". The fixture now commits a lock that pins no-op stand-ins for ast-grep, SwiftFormat and SwiftLint, and points CMUX_LINT_TOOLS_DIR at them. The gate still runs, and nothing is downloaded. Before #34237, this fixture ran the gate's scanners and skipped the pinned tools. The stand-ins find nothing, so the result is the same. TuiBindingsTests reuses that setUp, so it gets the stand-ins too.
2. Main-thread concurrency. #34250 added an AsyncStream.makeStream() with the default unbounded buffer in CmuxNextPagesTestSupport/FakeChromiumHosting.swift:44. It now uses bufferingPolicy: .bufferingNewest(1). Nothing yields to that stream, so its behaviour is unchanged.
Verified: python3 tests/test_web_lint_prepush.py ran on the fleet with bun set up: 103 tests OK, down from 32 failures on base. scripts/cmux-next/check-concurrency.sh Packages/macOS/CmuxNext passes.
Agent session: agent session
🤖 Generated with Claude Code
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Fixes three base reds on feat-cmux-next with test-only changes.
- The web lint fixture now commits a
lint-tools.lockpinning no-op stand-ins for ast-grep, SwiftFormat, and SwiftLint so the installed gate accepts pushes without downloading anything. - The hanging-request stream in
FakeChromiumHostingnow usesbufferingPolicy: .bufferingNewest(1)to pass the main-thread concurrency check; nothing yields to it, so behavior is unchanged.