cx-u27nc si-prpills: quiet pull request dock above composer

TE
11d ago
+578-34

Leo said: “Austin and Lawrence don't like just having more shit at the bottom. They don't even really like these full-scale pull requests on the bottom all that much.”

The default composer dock is one N PRs line that opens Session Info → Changes. Its adjacent disclosure uses the shared UI Popover and retains the existing PR links, hover cards and × dismissal. It opens instantly, uses the shared close fade, closes on Escape/outside pointer, and returns focus to its trigger. Dismissal hides a shortcut; it never removes a Changes row or changes the count.

The count uses the same visibleChanges selector, repository, transcript references and header status as Changes, including ended PRs and verified mentions. The dock reads a producer-maintained PR activity revision in O(1). OrderedRows compares cached semantic PR fingerprints before and after a row update; only changed PR findings or structural changes advance the revision. This applies to activity/thought rows as well as replies. The scan visits only changed rows, never historical rows per token. Ordinary reply and thought chunks leave the revision and parsed list unchanged. The cache has no timers or observers. The composer count and Changes share visibleChanges with the same inputs: transcriptPullRequests(rows, { folder: repository, replies: true }) and headerStatus(live). The count includes ended and dismissed PRs, while only the disclosed individual bars carry ×. Per rail-opus's approved integration contract, #25208 retains this export and call shape and narrows membership inside it, so both surfaces follow together. #25207 can land independently; no stacking or dependency wait is needed. This PR does not edit ChangesSection or ChatInspector.

The gallery retains no composer dock, one horizontal row of pills, and legacy full bars. If Session Info is unavailable, full bars remain the fallback.

Design references: Claude desktop session-running-with-side-panels and panel-changes-pr-card from manaflow-ai/cmux-design-references. Captures use public-safe fixtures in the real Chromium pane.

Legacy full barsDefault compact count
LegacyCompact
No composer dockCollapsed one-line bars
NoneCollapsed
Retained PR actionsRetained hover card
ActionsHover

Validation at c6fccae5034f0b9c769e4ed0488a990ff883099c (final commit adds pane popup layout tokens; browser and prepush rerun after that change):

  • Regression commit 08f4972ff80: browser Escape assertion failed (disclosure stayed open); the 200-thought-token spy failed with 201 parser calls instead of 1. Both pass on this head.
  • bun test test/pr-dock-stale-state.test.tsx — 6 passed. With 2,000 historical rows, 200 reply chunks and 200 thought chunks each cause zero additional dock parses. A new verified reply PR mention updates the count; repository changes invalidate too.
  • CMUX_BROWSER_TESTS=1 bun test test/agent-pane-pr-dock.test.ts — 2 passed. Covers default compact, real Session Info → Changes reveal, Escape/outside-pointer dismissal and focus return, retained hover cards and × actions.
  • bun test test/transcript-pull-requests.test.ts — 14 passed, including zero historical-row reads on streaming updates and correct activity edit/delete/replace invalidation.
  • bun test test/transcript-newest-last.test.ts — 7 passed. bun test test/pr-hover-card.test.tsx — 4 passed.
  • Typecheck (2,685 files), formatting, source guards and prepush-gate.py pass.
  • bun run check / scripts/web-lint.sh: stop on four existing warnings in untouched DynamicWorkflow.gallery.tsx and chat-environment-scroll-stability.test.tsx.

Risk: the count includes ended/dismissed changes, so dismissing the last shortcut leaves the count available to open Changes. The adjacent popover restores the PR bars on demand. It reuses shared popover lifecycle and cleanup; no new timers, observers or animation loops. No inspector layout or classification edits in this PR.

Overlap: pr-overlap --base feat-cmux-next reports #25208 in transcriptPullRequests.ts and its test. Reported to rail-opus: this PR adds revision/fingerprint helpers and regression tests; classification stays with si-changes. No ChangesSection.tsx or ChatInspector.tsx edits. #25207 lands first; #25208 owns narrowing both surfaces together afterward.

Docs: https://github.com/teamleaderleo/leo-workspace/pull/1066.

Agent session: huge-blue
Harness: Codex