[v0.1/P1] Reset the first public protocol minor to 0 #313

Closed
opened 2026-09-21 12:22:46 +09:00 by natsukium · 1 comment
Owner

Parent: #12. Related: #30, #50, #147, #164, #303–#312.

Decision

The first public wire contract will be protocol 1.0, not protocol 1.10.

Keep the schema package and protocol major unchanged:

  • protobuf package: felis.v1;
  • PROTOCOL_MAJOR = 1;
  • PROTOCOL_MINOR = 0 at the first public tag.

Fold the complete schema present at the tagged revision into the minor-0 base. The development-only minor 1–10 history has no released peer and will not become a permanent compatibility obligation.

This supersedes only the minor-number decision recorded on #147. It does not revive #30's proposal to rename the package to felis.v2 or bump the protocol major to 2.

Why

The repository states that pre-release snapshots carry no compatibility promise, and no public tag exists. Keeping minors 1–10 would nevertheless preserve sender gates, downgrade branches, ledger rows, and tests for peers that were never released. Every future implementation, including non-Rust peers, would inherit that artificial compatibility surface.

A clean minor-0 baseline makes the first post-release additive change the first real minor transition. That is the point where #164's mixed-minor conversation matrix gains an actual older peer to protect.

Resetting the minor after release would itself violate the frozen negotiation contract. The reset therefore belongs in the last wire change before the first tag.

Scope

  • Set PROTOCOL_MINOR and the schema-declared minor to 0.
  • Collapse MINOR_LEDGER and the reference minor ledger to one row: the complete protocol-major-1 base schema.
  • Mark every arm, field, closed-enum value, connection mode, and row-codec version present at the tag as available since minor 0.
  • Remove development-only MINOR_* constants, downgrade branches, local MinorTooOld checks, and tests whose only consumer is a pre-release minor 1–10 peer.
  • Retain the generic effective-minor send-authorization machinery needed by future additive minors; it should simply authorize the entire first-release schema at minor 0.
  • Update preface vectors, daemon-status/version examples, generated contract metadata, docs, skills/felis, and CHANGELOG.md to say wire 1.0.
  • Keep first-release handling until the first release baseline is committed; #115 owns making that transition safe.
  • Do not renumber protobuf fields merely to make the first schema dense. Number changes belong only where another pre-release wire issue already requires them.

Land this after every other v0.1 wire-shape issue, so the reset describes the exact schema that will be tagged.

Acceptance criteria

  • The first release reports protocol 1.0 in the preface, felis daemon status, felis version/doctor diagnostics, docs, and changelog.
  • felis.proto, generated code, PROTOCOL_MINOR, MINOR_LEDGER, arm metadata, closed-enum metadata, and row-codec metadata agree that every first-release shape belongs to minor 0.
  • No production branch remains solely to accommodate development minors 1–10.
  • The effective-minor writer still rejects a synthetic future-minor arm/field/value in tests, proving the mechanism remains ready for minor 1.
  • Preface and row-codec golden vectors pass with protocol 1.0.
  • just proto, just schema, just check, and the proto compatibility gate pass on the final schema.
  • The doc grep sweep finds no claim that 1.1–1.10 are released compatibility levels.
  • #164 is rewritten to start with the first post-release minor rather than exercise deleted development history.

Principle check

  1. Add only what earns its place — Pass. It removes compatibility behavior with no released consumer while retaining the versioning machinery a real future old peer needs.
  2. Render everything, fast — Pass. No rendering behavior changes.
  3. The daemon owns state, the client owns pixels — Pass. The process boundary and ownership model are unchanged.
  4. Explicit over heuristic — Pass. The negotiated version continues to determine send authorization explicitly.
Parent: #12. Related: #30, #50, #147, #164, #303–#312. ## Decision The first public wire contract will be **protocol 1.0**, not protocol 1.10. Keep the schema package and protocol major unchanged: - protobuf package: `felis.v1`; - `PROTOCOL_MAJOR = 1`; - `PROTOCOL_MINOR = 0` at the first public tag. Fold the complete schema present at the tagged revision into the minor-0 base. The development-only minor 1–10 history has no released peer and will not become a permanent compatibility obligation. This supersedes only the minor-number decision recorded on #147. It does not revive #30's proposal to rename the package to `felis.v2` or bump the protocol major to 2. ## Why The repository states that pre-release snapshots carry no compatibility promise, and no public tag exists. Keeping minors 1–10 would nevertheless preserve sender gates, downgrade branches, ledger rows, and tests for peers that were never released. Every future implementation, including non-Rust peers, would inherit that artificial compatibility surface. A clean minor-0 baseline makes the first post-release additive change the first real minor transition. That is the point where #164's mixed-minor conversation matrix gains an actual older peer to protect. Resetting the minor after release would itself violate the frozen negotiation contract. The reset therefore belongs in the last wire change before the first tag. ## Scope - Set `PROTOCOL_MINOR` and the schema-declared minor to `0`. - Collapse `MINOR_LEDGER` and the reference minor ledger to one row: the complete protocol-major-1 base schema. - Mark every arm, field, closed-enum value, connection mode, and row-codec version present at the tag as available since minor 0. - Remove development-only `MINOR_*` constants, downgrade branches, local `MinorTooOld` checks, and tests whose only consumer is a pre-release minor 1–10 peer. - Retain the generic effective-minor send-authorization machinery needed by future additive minors; it should simply authorize the entire first-release schema at minor 0. - Update preface vectors, daemon-status/version examples, generated contract metadata, docs, `skills/felis`, and `CHANGELOG.md` to say wire `1.0`. - Keep `first-release` handling until the first release baseline is committed; #115 owns making that transition safe. - Do not renumber protobuf fields merely to make the first schema dense. Number changes belong only where another pre-release wire issue already requires them. Land this after every other v0.1 wire-shape issue, so the reset describes the exact schema that will be tagged. ## Acceptance criteria - [ ] The first release reports protocol `1.0` in the preface, `felis daemon status`, `felis version`/doctor diagnostics, docs, and changelog. - [ ] `felis.proto`, generated code, `PROTOCOL_MINOR`, `MINOR_LEDGER`, arm metadata, closed-enum metadata, and row-codec metadata agree that every first-release shape belongs to minor 0. - [ ] No production branch remains solely to accommodate development minors 1–10. - [ ] The effective-minor writer still rejects a synthetic future-minor arm/field/value in tests, proving the mechanism remains ready for minor 1. - [ ] Preface and row-codec golden vectors pass with protocol 1.0. - [ ] `just proto`, `just schema`, `just check`, and the proto compatibility gate pass on the final schema. - [ ] The doc grep sweep finds no claim that 1.1–1.10 are released compatibility levels. - [ ] #164 is rewritten to start with the first post-release minor rather than exercise deleted development history. ## Principle check 1. **Add only what earns its place — Pass.** It removes compatibility behavior with no released consumer while retaining the versioning machinery a real future old peer needs. 2. **Render everything, fast — Pass.** No rendering behavior changes. 3. **The daemon owns state, the client owns pixels — Pass.** The process boundary and ownership model are unchanged. 4. **Explicit over heuristic — Pass.** The negotiated version continues to determine send authorization explicitly.
Author
Owner

Direction agreed 2026-09-21 after three sol design-review rounds (final verdict PASS). Full plan and batch order: see the comment on #12.

  • #313 — after everything above: PROTOCOL_MINOR = 0, one ledger row,
    delete the ten MINOR_* constants, the seven .since() calls, the
    Downgrade branches in daemon/connector/bridge/version, and the tests that
    exist only for minors 1–10; fix the two preface golden vectors that embed
    0x0A; keep Requires/GatedField/MinorGated/arm_requires/
    FrameWriter::authorize/check_arm_minor as the live frame for the first
    post-release addition, proven by a synthetic future-minor test; docs 1.10
    → 1.0; rewrite #164. Out of scope (owned by #115): BREAKING.md lines,
    tools/proto/compat.py, proto-baseline/, release.yml, PROTOCOL_MAJOR.
    Row-codec goldens are unaffected.
Direction agreed 2026-09-21 after three `sol` design-review rounds (final verdict PASS). Full plan and batch order: see the comment on #12. - **#313** — after everything above: `PROTOCOL_MINOR = 0`, one ledger row, delete the ten `MINOR_*` constants, the seven `.since()` calls, the `Downgrade` branches in daemon/connector/bridge/version, and the tests that exist only for minors 1–10; fix the two preface golden vectors that embed `0x0A`; keep `Requires`/`GatedField`/`MinorGated`/`arm_requires`/ `FrameWriter::authorize`/`check_arm_minor` as the live frame for the first post-release addition, proven by a synthetic future-minor test; docs `1.10` → `1.0`; rewrite #164. Out of scope (owned by #115): `BREAKING.md` lines, `tools/proto/compat.py`, `proto-baseline/`, `release.yml`, `PROTOCOL_MAJOR`. Row-codec goldens are unaffected.
Commenting is not possible because the repository is archived.
No description provided.