protocol, daemon, client, docs: step the scrollback viewport on the daemon #184
No reviewers
Labels
No labels
Area/ci
Area/cli
Area/client
Area/client-core
Area/daemon
Area/deps
Area/docs
Area/grid
Area/manual
Area/nix
Area/protocol
Area/pty
Area/render
Area/shaping
Area/skills
Area/transport
Area/vt
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Performance
Kind/Security
Kind/Testing
perf-regression-accepted
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Blocked
Status
Need More Info
Status
Upstream
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
felis-terminal/felis!184
Loading…
Reference in a new issue
No description provided.
Delete branch "client/viewport-step"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #164.
Problem
Every relative scroll (line, half page, wheel, Home) was an absolute
Viewportoffset computed from the shadow, which only moves when the daemon'sViewportStatelands. A step sent before that reply named a stale offset: End then LineUp could replace the queued End in its coalescing slot (the view never reached live) or undo it, and two quick LineUps landed one row up. The same staleness let typing right after a LineUp skip the snap to live, and passed a bare End to the program after an unacknowledged LineUp.Change
Input::ViewportStep { rows: sint32 }(minor 2, unreleased, so no bump). The daemon rebases the subscriber's viewport and clampsviewport + rows, as it already resolvesJumpPrompt. A minor-1 daemon is never sent it: the window falls back to today's absolute path.ViewportStepis ordered and seals theViewportslot;Key,KeyBytesandPastenow seal it too, so a request queued after a keystroke cannot take the snap-to-live slot ahead of it (that hole also existed on main).ViewportStep; End goes throughsnap_to_live. A per-connectionViewportIntent(does the latest request target live?) gatessnap_to_liveand the bare-End passthrough; it can only be stale toward "browsing", costing one redundantViewport(0). Steps are skipped on the alternate screen, where the daemon pins the view live. Search-hit navigation always sends its anchored request instead of skipping when the shadow already shows the hit.ViewportStepis outside the format (JsonError::Outside), like the fence pair, since a new variant inside v1 is a format break.Review
Design: three pi/sol rounds (search navigation against a stale shadow, felis-json v1, keystroke seals), then PASS. Implementation: sol PASS; its non-blocking notes were the
ViewportStatereply wording (fixed) and that the client behavior is tested through the client-core helpers (step_request,ViewportIntent) and the queue rather than throughApp, which has no test constructor.Verification
just checkgreen on the rebased branch (an earlier run hit the known undiagnosed flakeserve::session_task::tests::a_mirrors_report_is_stored_but_the_owner_still_answers, unrelated). Not driven in a real window.