Skip to content

fix(web): decide the composer strip from the controls it will draw - #438

Open
rynfar wants to merge 1 commit into
pylonfrom
fix/composer-strip-visibility-inputs
Open

fix(web): decide the composer strip from the controls it will draw#438
rynfar wants to merge 1 commit into
pylonfrom
fix/composer-strip-visibility-inputs

Conversation

@rynfar

@rynfar rynfar commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator

Closes #435. Substantially addresses #437.

The composer context strip decided its own visibility from isGitRepo, while
BranchToolbar decided its Git controls from isGitRepo && !rollbackActive.
During a rollback the two disagreed: the strip stayed open because there was a
repository, and then drew nothing, leaving a visible empty bar with the shell's
clip-path extension around it.

The predicate's input was named for the repository when what it needs is what
the strip will actually draw, so it is now showsGitControls, and ChatView
derives that once and passes the same value to both the predicate and
BranchToolbar. The two can no longer disagree.

While here, the mount-versus-visible pair moved out of the view into
resolveComposerContextStripVisibility in ChatView.logic.ts. That pair is the
part that has now been wrong twice — once hiding a live capacity reading (#432),
once showing an empty bar — and it was only reachable by rendering a chat. It is
now a pure function with tests covering the rollback case, the capacity case,
and the measuring strip that must stay mounted while hidden.

Not claiming #437 is closed: ChatView still assembles the inputs, so cutting a
field there would restore a bug with tests green. What is left is literal field
assignment rather than a decision, and covering it properly needs a ChatView
render harness, which does not exist yet.

No UI change to show: this fixes a state that renders nothing either way — an
empty bar becomes no bar. Verified by test rather than by screenshot, including
a mutation check (forcing the Git input true fails 3 tests).

Written by Claude Opus 5 in Claude Code.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M labels Sep 9, 2026
@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ The exact PR base did not have a successful artifact. Baseline uses the latest successful main measurement shown below.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.8 KiB 13.8 KiB −12 B (−0.1%) 15.1 KiB
Codex Thread snapshot wire 7.1 KiB 7.1 KiB −1 B (−0.0%) 7.3 KiB
Codex Live turn WebSocket wire 6.7 KiB 6.7 KiB −11 B (−0.2%) 7.8 KiB
Codex Live turn WebSocket decoded 57.4 KiB 57.4 KiB 0 B (0.0%) 66.4 KiB
Codex Live turn messages 10 10 0 (0.0%) 21
Claude Total thread wire 13.8 KiB 13.8 KiB −4 B (−0.0%) 15.1 KiB
Claude Thread snapshot wire 7.1 KiB 7.1 KiB −8 B (−0.1%) 7.3 KiB
Claude Live turn WebSocket wire 6.7 KiB 6.7 KiB +4 B (+0.1%) 7.8 KiB
Claude Live turn WebSocket decoded 58.2 KiB 58.2 KiB 0 B (0.0%) 66.4 KiB
Claude Live turn messages 9 9 0 (0.0%) 21

Baseline: f669dcd · PR result: 9cf70fd · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 111.2 KiB
  • Claude decoded thread snapshot: 111.9 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

web: rollback on a Git project can render an empty composer context strip

1 participant