[v0.1/P1] Do not silently drop out-of-range Grid RowDelta rows #304
Labels
No labels
priority/P0
priority/P1
priority/P2
release/v0.1.0
status/blocked
status/planned
type/bug
type/design
type/test-gap
type/tracker
No milestone
No project
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set
Reference
natsukium/felis#304
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Problem
felis-client-coresilently drops aGridMsg::RowDeltawhenrow >= MAX_SHADOW_ROWSinShadowScreen::write_row.This avoids an allocation, but a valid protobuf frame with an out-of-range row can leave the client shadow diverged from the daemon without a protocol error, resync request, or user-visible indication. The same path currently combines resize-race tolerance with corruption handling.
Proposed resolution
Separate expected resize races from invalid wire data. For an out-of-range row, either:
Keep the legitimate resize overshoot behavior for rows within the documented race bound, but do not silently discard rows beyond the protocol's admitted limits.
Acceptance criteria
RowDelta.rowis specified indocs/reference/ipc.mdand the row-codec/renderer documentation as appropriate.Sources
crates/felis-client-core/src/shadow.rs(write_row)crates/felis-protocol/src/messages.rs(grid limits)docs/reference/ipc.md(semantic limits and corruption behavior)Direction agreed 2026-09-21 after three
soldesign-review rounds (final verdict PASS). Full plan and batch order: see the comment on #12.ShadowErrorand closes only that attachment; reconnect/rehydrate recovers.Resize-race tolerance is kept only for row indices/widths within
MAX_GRID_ROWS/MAX_GRID_COLS. Unresolved cluster/hyperlink handles in adecoded row are corruption; degraded rendering is removed. Id 0, over-cap
ids and over-length text are rejected before allocation.