[v0.1/P1] Make IPC arm routing metadata machine-readable #303
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#303
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
The routing contract is represented twice: as
// arm:comments incrates/felis-protocol/proto/felis.protoand as hand-maintainedArmMetatables incrates/felis-protocol/src/messages/*.The comments are useful for repository checks, but they are not part of the protobuf descriptor consumed by non-Rust implementations. A client generated from
felis.protocannot discover direction, correlation class, allowed modes/phases, or minor availability from the machine-readable schema. It must duplicate the contract from the Rust tables or documentation.This weakens the stated cross-language reuse surface and makes schema/routing drift possible when a new oneof arm is added.
Proposed resolution
Before the first public wire freeze, make routing metadata part of the schema authority:
Do not require external implementations to parse comments.
Acceptance criteria
Sources
crates/felis-protocol/proto/felis.protocrates/felis-protocol/src/messages/arm.rscrates/felis-protocol/src/messages/*docs/reference/ipc.md(arm table and versioning)Direction agreed 2026-09-21 after three
soldesign-review rounds (final verdict PASS). Full plan and batch order: see the comment on #12.overview already rejects a committed contract manifest and says the answer
for a schema-only consumer is the
FileDescriptorSetthe schema compiles to;a routing-only JSON would reopen that. Each oneof arm carries a
(felis.v1.arm)field option with direction, correlation, modes, phases andsince; the
// arm:comments are deleted. prost ignores options, so thegenerated Rust is unchanged;
the_schema_declares_the_same_arm_tableparsesthe option text instead of the comment (same grammar). A non-Rust peer reads
the options from the descriptor (
buf build/ protoc reflection). Adding anarm without an option, or with a disagreeing one, still fails the build; the
compat gate's
buf breakingdoes not see options, so the Rust test remainsthe mechanical check and the docs say so.
ipc.md"The arm table" andworkspace.md"Cross-language wire contract" are updated.