protocol: post-freeze observability and descriptor completeness (effective minor, field-level since, bit tables) #351
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#351
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
Split from #347. The pre-release review of the frozen surfaces found these three gaps; each is an additive change (a new field, a new custom option, or a descriptor-carried table), so under the versioning contract it lands as a post-release minor and does not need to precede the v0.1.0 freeze. #347 keeps the items that are cheaper before the freeze than after it (the
_UNSPECIFIEDmode test, the--timeout 0definition, and the reference wording).1. The negotiated effective minor is unobservable
ConnWelcomeechoes nothing, andOpsStatusReplydeliberately carries no version (#343). The effective minor,min(client, daemon), is computed on both ends and published nowhere: not inWelcome, not infelis daemon status, not in any machine output. Once the ledger grows, "my old CLI can't use arm X" is debuggable only through the send gate's refusal string, and minor adoption has no observation surface.Proposal: one informational field on
ConnWelcome(effective_minor, or an echo ofclient_minor). Display and diagnostics only; the preface stays the sole version authority.2. Field-level minor metadata covers only six messages
crates/felis-protocol/src/minor.rsdeclares field requirements in hand-written tables (CONN_FIELDS,SESSION_FIELDS,OPS_FIELDS,PUSH_FIELDS,SESSION_INFO_FIELDS,SPAWN_ARGS_FIELDS), andgated_by_arm!coversInput/Image/Notify/Region/Searchon the assumption that no post-baseline field or enum value rides inside one. A field added later toSearchQuery,ImageNew,RegionRequest,NotifyEvent,InputResize, and so on has no place to declare its minor:requires()does not rise,the_ledger_covers_every_executable_additionstill passes, and protobuf's unknown-field tolerance makes an older peer ignore the field silently instead of the send gate refusing it.Proposal: a
(felis.v1.since)field option in the schema (or an extension of theArmRoutingpattern), with the ledger test enumerating every field from the descriptor and requiring a minor and a ledger row for each post-baseline one. TheGatedFieldtables become derived.3. Bitmap layouts are not in the descriptor
felis.protosays bitflags carry "raw bits; see messages.rs" forInputMouseEvent.mods,InputKeyEvent.mods, and the type note near the top. TheKeyModslayout is indocs/reference/ipc.md; the mouseInputModstriple is being added to theMousebullet in a doc PR. What remains is the cross-language concern: a non-Rust peer reading only the descriptor cannot encode or decode these, while ipc.md "Application messages" promises the descriptor needs no other manifest.GridClipboardSet.selectionstates its bits inline, so the pattern exists.Proposal: carry the bit tables as a field option read from the descriptor (the
(felis.v1.arm)shape), or at minimum make the proto comments normative and name the standard each set follows.GridKittyKbdFlags.flagsdeserves the same treatment.Low-priority shape notes
Recorded so they are not re-found; none is worth a change on its own.
SearchMatch.line_index/ColSpan.line_indexaresint64,RegionRow.rowissint32,RowEntry.rowisuint32.ResolvedId.ambiguousis a bareuint32arm whileOpsInfoReply.ambiguousis anOpsInfoAmbiguous { matches }message;SpawnRefusedandSessionAttachFailedplacedetaildifferently.Acceptance criteria
the_ledger_covers_every_executable_additionenumerates fields from the descriptor.docs/reference/ipc.md"Application messages" is true: the descriptor alone suffices for a non-Rust peer.natsukium referenced this issue2026-09-22 21:18:49 +09:00
Triage 2026-09-25: item 1 is partly addressed.
felis doctornow prints the negotiated wire version fromconn.effective_minor(crates/felis-cli/src/cli_doctor.rs), butConnWelcomestill carries no such field andfelis daemon statusstill reports only the daemon's ceiling, so the wire-level observability gap stands. Items 2 and 3 are unchanged: the field-level since tables incrates/felis-protocol/src/minor.rsare all empty (mechanism dormant), and bitmap layouts are still comment-only, not in the descriptor.