[v0.1/Proto Review] package felis.v1 と protocol 2.0 の命名ズレは 1.0 で確定すべき #138
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
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
natsukium/felis#138
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?
背景
crates/felis-protocol/proto/felis.protoのpackage felis.v1は schema-namespace major で、PROTOCOL_MAJOR = 1とは独立して進むとfelis.proto前文とdocs/explanation/architecture/ipc.md「Schema evolution」で定義されている。一方
docs/reference/ipc.md「The minor ledger」末尾の not on the table 節とcrates/felis-protocol/proto/BREAKING.mdでは、ResourceReportの repack /Imagefamily の repack が「pre-release なので major 1 のまま破壊」と説明され、#30「Reset the first public wire baseline to protocol 2.0」で最初の公開 baseline を2.0にリセットする計画がある。このとき package 名を
felis.v1のままPROTOCOL_MAJOR = 2に上げると:felis.v1のまま protocol 2 の bytes を喋る。非 Rust クライアント(将来のfelis-tui/felis.el/ third-party)がfelis.v1を import したまま protocol 2 と信じると混乱する。felis.v1とfelis.v2を両方持つ設計が前提だが、最初の public が既にv1パッケージで protocol 2 だと「felis.v2は protocol 3 から」という off-by-one が恒久化する。buf breakingの baseline はproto-baseline/に tag 単位で置かれるが、package 名が major とズレていると baseline 比較時にpackagerename を breaking として誤検出/見逃し得る。これは
prost生成物の import path (felis.v1::FrameKind) に現れる公開 API で、1.0 でタグを打った後に変えると全 downstream のimportを壊す。互換性を無視できる今しか直せない。問い
1.0 / protocol 2.0 baseline で package 名をどう凍結するか:
package felis.v2に bump —PROTOCOL_MAJOR = 2と package を揃える。explanation/architecture/ipc.mdの「package moves only when…」節は「最初の public は前例がないので例外的に揃えた」と追記し、以降は「nとvNは release 時のみ一致し、pre-release break では揃えない」に再定義。package felis.v1のまま据え置き — package は「この repo で最初に freeze した schema」の印としてv1に固定し、PROTOCOL_MAJORとは独立させる。reference/workspace.md「Versioning」に「package version ≠ protocol major after 1.0」と明記。felis(unversioned) に — major ごとにfelis.vNを生やすのではなく、felis.proto自体を major で分岐させる(felis2.proto)。ただしbufの推奨と逆行。現行 docs は案B寄りだが、
#30の「2.0 に reset」は案Aを示唆しており不整合。提案
#30の実行時に案A/B のいずれかを選ぶ。個人的には 案A が downstream の混乱が最も少ない(「felis.v2を import すれば protocol 2」と読める)。案B を選ぶならreference/ipc.md「Versioning」冒頭に「packagev1は protocol 2 でもv1のままである」ことを赤字で固定し、just protoの生成物パスとskills/felisの import 例を更新。crates/felis-protocol/src/generated/の再生成、buf breakingbaseline の再取得、reference/workspace.md「Versioning」節の表を 1.0 で凍結。CHANGELOG.md1.0 に「wire package = X / protocol = Y」を併記。felis-protocolcrate のpublish = falseを外す時のpackage↔crate versionの対応も同時に決める(reference/workspace.mdRevisit-if)。判定基準
felis-protocol/proto/felis.protoの package 行を見ただけで、どの protocol major を喋るかが一意に決まること(または「ズレる」なら docs がズレを明言していること)。just proto生成物とbuf breakingbaseline が同じ package で green であること。felis.v1/felis.v2のどちらを import すべきかreference/ipc.mdだけで判断できること。explanation/architecture/ipc.md「Schema evolution」に Revisit trigger(「package を bump するのは side-by-side decoder が必要な時のみ」)が選んだ案と整合していること。対象ファイル
crates/felis-protocol/proto/felis.proto(package 行)crates/felis-protocol/src/preface.rs(PROTOCOL_MAJOR定数とコメント)crates/felis-protocol/src/generated/(prost 生成物)docs/reference/ipc.md「Layering / Versioning」docs/reference/workspace.md「Versioning」docs/explanation/architecture/ipc.md「Schema evolution / Kind or arm?」justfile/scripts/proto//flake.nix(buf toolchain)Parent: #12 および #11 / #5, #30
#138 は maintainer 判断で v1 のまま維持 / PROTOCOL 1.0 のままリセット で確定しました。
package felis.v1は据え置き(案B)。PROTOCOL_MAJOR=1 / MINOR=9までの break は pre-release として許容し、最初の公開 baseline をprotocol 2.0に bump する案(#30)は見送り — baseline を 1.0 にリセットする方針で揃えます。BREAKING.mdのbase:行とfirst-releaseの扱いも、このリセットに合わせて整理します。この issue は Won't fix / 凍結決定として close します。関連する #30 / #5 / #52 の ledger 整備は、v1 / 1.0 を前提に更新します。