[v0.1/P1] Remove minor-reset fallbacks and duplicate status identity #333
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#333
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
#313 reset the first public protocol to minor 0, and #330 owns physical schema cleanup such as pre-baseline
reservednumbers andConnWelcome.build_id. Several semantic fallbacks and duplicate authorities remain outside #330's scope, however. Freezing them would preserve compatibility with development minors that no public peer can run.Current cases:
SessionInfo.sequenceremains optional and the Rust domain retains an absent/zero fallback for a daemon predating the sequence field. Every public 1.0 daemon can be required to provide a positive sequence.ErrorKind::ProtocolMismatchremains as a frozen machine token for consumers that do not yet exist, although negotiated refusal/error vocabulary now expresses the actual failures.OpsStatusReplyrepeats build and protocol identity already established by the mandatory connection handshake, so a client can observe two authorities on one connection.ConnectionModerefusal recovers the raw integer by bypassing the normal validated codec. #312 correctly requires typed deterministic handling, but it does not require two wire interpretations.This is distinct from #115: that issue installs and advances the release baseline. This issue removes semantic development-minor residue before #115 records it.
Proposed resolution
Do not retain behavior merely because an unreleased minor once needed it. Any retained fallback needs a current semantic use stated in the owning explanation document.
Acceptance criteria
CHANGELOG.md, andskills/felisare updated as required.Evidence
crates/felis-protocol/proto/felis.protocrates/felis-protocol/src/convert/conn.rscrates/felis-protocol/src/messages/ops.rscrates/felis-client-core/src/connector.rscrates/felis-cli/src/cli_output.rsdocs/reference/ipc.mddocs/explanation/architecture/ipc.mdRelated: #17, #115, #144, #145, #312, #313, #330.
[v0.1/P1] Remove pre-release compatibility residue before the first wire baselineto [v0.1/P1] Remove minor-reset fallbacks and duplicate status identityDecision: do items 1, 2, 3; item 4 is retained with a recorded reason (reviewed)
SessionInfo.sequencebecomes required (uint64, 0 = malformed). The daemon always sends it; theroster.rszero fallback and theconvertNonepath go.ErrorKind::ProtocolMismatchis removed, as a coordinated cascade, not a one-line deletion. No producer exists incrates/, andfelis.eldoes not branch on it. The token is mirrored incli.md,felis-cli-v1.schema.json, and the goldenerror_kinds.txt, and the source comment calls it frozen inv1; that freeze is against a consumer that does not exist yet, so removing it now is the same pre-release break the proto batch makes, not avbump. Source, regenerated schema, golden,cli.md,CHANGELOG.md,skills/felisif it lists the vocabulary. Re-add under the additive policy when a public operation can produce it.OpsStatusReplydropsversion,protocol_major,protocol_minor; the CLI JSON shape is unchanged. Build identity comes fromWelcome.identity, the major from the accepted preface, and the daemon's own minor fromDaemonPreface::Accept, which the connector currently collapses intoeffective_minorand discards (an older client on a newer daemon would misreport it, so the effective minor is not a substitute). The connector keeps the accepted major and the daemon's minor onConnection, andfelis daemon statusfills the same keys from there. This PR also fixes theprotocol.minor: 10example incli.md.serve.rsunreadable_mode) is retained and recorded as a diagnostic for non-conforming peers. A conforming client refuses a mode above the effective minor beforeHello(check_mode_minor), so the path never sees ordinary skew; it is the daemon's documented half of the ledger rule (ipc.md:Refused { UnknownMode }rather than a silent close, settled in #312) and is already pinned byserve/tests.rs(a_hello_naming_an_unknown_mode_is_refused_by_name,an_unreadable_hello_that_is_not_a_future_mode_closes_unanswered). Only the explanation record changes.Lands last in the proto batch (after #327), own
base:line.