docs: reference claims behavior the code does not implement (attach prefix validation, Kitty placement X/Y) #349
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#349
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?
Context
Pre-release review of the frozen surfaces (round 2). Two normative statements in
docs/reference/describe behavior the code does not have. Each needs a decision: fix the reference, or implement the claim before the freeze. A third and fourth case are mechanical wording errors and go in a separate doc commit.1.
SessionAttach.id_prefixvalidationdocs/reference/ipc.md(theAttachbullet under "Session (kind = 4)") says a target whoseid_prefix"is not 1-32 hex digits" is "refused at decode", and that an attach, "unlike theOpsverbs'id_prefix, cannot answer a malformed prefix withNoMatch".The implementation does the opposite:
crates/felis-protocol/src/convert/session.rspasses the prefix through unvalidated, andcrates/felis-daemon/src/serve.rs(take_attach_handle) resolves it withfelis_protocol::session_prefix::resolve_session_prefix, which returnsResolvedId::NoMatchfor an empty, overlong, or non-hex prefix (crates/felis-protocol/src/session_prefix.rs). So an attach with a malformed prefix is answeredAttachFailure::NoMatch, exactly like anOpsverb.Decision: either restore the decode-time refusal (fail closed, as the reference argues) or update the reference to the implemented
NoMatchbehavior. The implemented behavior is consistent with every other prefix field and withresolve_session_prefix's own comment, so updating the reference looks right; but the reference's rationale was deliberate, so this is a decision, not a typo.2. Kitty placement
X,Ydocs/reference/protocols/kitty-graphics.md"Placement parameters" lists "X,Y: Pixel offset within destination cell", and the support matrix marksa=pas supported. The dispatcher never reads them for a placement:upsert_placement(crates/felis-daemon/src/graphics.rs) readsc,r,z,C,q,p, and thex,y,w,hsource rectangle, andfelis_grid::images::Placement(crates/felis-grid/src/images.rs:644) has no destination-offset field.X/Yare read only fora=c(frame composition), where they name the source offset.So a producer that sends
a=pwithX=/Y=gets an image at the cell origin, silently. Decision: implement destination pixel offsets (a wire field plus renderer work, so an additive post-freeze change) or drop theX/Yline and state that destination pixel offsets are not applied. The honest pre-freeze state is the latter; the former can land later as an additive minor.Acceptance criteria
docs/.Triage (2026-09-22)
Adding a third claim of the same kind, from #347 finding C: OSC 1 sets only the daemon-side icon name (
felis-grid/src/sink.rs), which noGridMsgarm carries, so the client never applies it. The support matrix's check mark overstates what the sequence does. Same treatment as the other two: state what is implemented.Recommended resolution for the first two, so the PR need not reopen them: item 1 updates the reference to the implemented
NoMatchbehavior (consistent with every other prefix field and withresolve_session_prefix); item 2 drops theX/Yline and states that destination pixel offsets are not applied. Both are doc-only.