protocol: give input admission its own barrier instead of a roster query #358
No reviewers
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!358
Loading…
Reference in a new issue
No description provided.
Delete branch "protocol/issue-306-input-fence"
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 #306.
Implements the "Triage plan (2026-09-22)" comment on the issue.
What changed
Wire.
SessionMsggainsSessionInputFence input_fence = 8(to daemon, request opener,Window+Ops,Attached) andSessionInputAccepted input_accepted = 9(to client, request reply). Both messages are empty, both atsince 0, soPROTOCOL_MINORstays0and no ledger row is added. The field-100 correlation-slot comment now names the pair. Domain variants,Directed::ARMSrows with the two correlation classes, and theconvert/session.rsmapping move with it; the committed codegen is regenerated withjust proto.MinorGated for SessionMsgfolds the arms through its existingarm_requirescatch-all.Daemon.
route_framemapsInputFencetoSessionCmd::InputFence { sub, request }(theSessionarm now keeps theDeliveredso it can read the request id). The session actor answers throughpush_towith the newOutEvent::Session { msg, correlation }, encoded instreaming::body_forwithCheckedFrame::encode_correlated.Client-core / CLI / bridge.
Connection::input_fence()besidelist_sessions().cmd_send's barrier is the fence; timeout and error-kind mapping are unchanged. The bridge'sLink::send_inputswitches too, andLink::decodegainedDaemonMsg::Sessionso the reply is not dropped as a droppable frame. No roster fallback.felis-jsonv1. Both arms are refused at conversion with a newJsonError::Outside, because the format carries no correlation envelope. No schema or golden regeneration (just schemais a no-op, verified).Tests
felis-protocol: both arms insession_cases(), a correlation-class assertion over the corpus, and a correlated round trip throughencode_correlated.felis-grid: both arms refused as outside v1.sessions.sendwaits forInputAccepted, and the fake daemon asserts the frame after the input is the fence, not anOps::List.Verified
just fmt-check,just lint,just prose-check,just docs-links,just proto,just proto-compat(wire-compatible with the merge base),just schema(no-op). Host load was above 20, so the crate-scoped run was used in place ofjust check:cargo nextest run --all-features -p felis-protocol -p felis-grid -p felis-client-core -p felis-cli -p felis-daemon(2564 passed) plus-p felis-transport(156 passed).Deviations from the plan
rogue_daemonCLI test to see the fence after the input. That daemon only servessessions infoinevery_machine_failure_class_is_one_object_and_one_code, neversend, so it needed no change. The scripted daemon insidecli_sessions.rs's own unit tests is the one that answers the fence, and it was updated.WriteOutcome::Queueddirectly:write_ptydoes not return the outcome to the actor.cli.md'ssendbullet already worded the barrier as "the daemon's admission of the input" with no mention of a roster query, so it needed no edit; the grep sweep found no roster-barrier prose indocs/explanation/architecture/ipc.mdorskills/felis/SKILL.mdeither.