コンテンツにスキップ

互換性

1.0.0 から、rulec の版の番号は Semantic Versioning に従います。このページは、rulec が読み書きするものそれぞれについて、「互換」が何を指すかを書きます。1.x のリリースが守るべきことを、ここで確かめられるようにするためです。

短く言えば、1.0 で rulec check を通る規則は、どの 1.x でも通り、意味も変わりません。生成コードの呼び方も答えも変わりません。

どの 1.x でも変えないもの

  1. .rule の言語。 1.0 が受け付ける書き方は、書き方も意味もそのまま残ります。ステートマシン(machine・held・never・once・scenario と、状態のほかに持ち越す値の書き方:二行目からの carry・initial <入力> <値>・always)、列挙の値どうしの前提のつながり(prerequisites と、その下の start・requires・nothing・ordered by)、いくつもの並びと、それをたどる何本もの count・sum・max・min・fold(たどる順は読むものから決まる)、-> で名前を付けた fold の答え、呼び出し側のオブジェクトから読むもの(並びのフィールドの合計・最大・最小を読む from sum・from max・from min と、並びをそのまま取る elements … from)、乱数で引く入力と答えの確率の主張(random・chances と、重みで選ぶ take_weighted・draw)、ファイルを合わせる書き方(開いた値の open … combine、寄与のファイルの contribution・to・after・into・extend、開いた表・節・列挙・塊、固定の signature: と meaning:)も含みます。meaning: ができる前に sha256: で固定した apply の見出しは、そのまま読みます。新しい書き方が増えることはあります。
  2. 名前に使える語。 予約語、つまり E009 が名前として受け付けない 65 語(src/kw.rs にある一覧)は 1.0 で固定し、テストがその一覧を見張ります。後の版で言語に語が増えることはありますが、この一覧には足しません。新しい語は、名前が来ない位置でだけ読むか、規則が宣言した同じ綴りの名前に譲ります。1.0 で使えた名前は、その後も使えます。ファイルを合わせる書き方の語もそうして足しました。open・combine・product・contribution・to・into・extend は行の中の位置で読むので、入力に open や to という名前を付けられます。
  3. 生成コードの答え。 検査を通る規則なら、どの言語の生成コードも、同じ入力にはどの 1.x でも同じ出力を返します。参照評価器も同じです。後の 1.x で過去の記録を再生しても、前と同じ答えになります。
  4. 生成コードの呼び方。 モジュール・関数・型・フィールド・エラーの名前、やりとりする整数の意味(§10.2)、呼び出しが書く記録、_traced・_record・_from・_chances の関数など、rulec api が説明するものすべてです。新しい関数が隣に増えることはあります。
  5. コマンドライン。 コマンド、フラグ、その値、終了コード(0 は注記だけ、1 は指摘あり、2 は引数の誤りか読めないファイル)。コマンドやフラグが増えることはあります。
  6. 診断コード。 コードの意味は変えません。使わなくなったコードは、廃止したと書いて台帳に残し、その番号を別のものに使い回しません。新しいコードが増えることはあります。新しい警告が増えても、検査を通っていた規則は通ったままです(規則に書いた鍵を言う W901 はこうして足したもので、ritsu のどの言語でも同じ意味です)。1.0 の前に、意味を変えた番号が二つあります。規則が二つ以上の並びをたどり、一つの並びを二回たどれるようになったときです(§15.219)。E031 は、並びを二回たどる必要があることを言っていましたが、一つの項目が二つの並びの要素を読むことを言うようになりました。E020 は、elements が二本あることを言っていましたが、たどるものの無い並びを言うようになりました。E044 は 1.0 の前に、言うことが狭くなりました。準用する規則を準用することも、並びをたどる規則や自分の列挙を出す規則を準用することもできるようになったときです(§15.230)。E044 は、準用が輪になっていること、元の規則が読めないこと、元の規則が check を通らないことを言い、ほかの三つで止めていた規則は通るようになりました。E033 と E040 は、寄与が足した値と寄与の固定についても、取り込んだ値と準用の固定と同じことを言います(§15.228、§15.230)。
  7. 機械が読む形式。 --format json の出力すべて、ベクタ、fixtures、replay のマニフェスト、adapter/1 と extract/1 のやりとり、証明書、MCP のツールとその引数とリソース、GitHub Action の入力、リリースのアーカイブとパッケージの名前(Homebrew の i2y/tap/ritsu、.deb と .rpm)は、1.0 で持っているフィールドを、同じ意味のまま持ち続けます。1.x でフィールドが増えることはあり、文書が並べている値の集合に値が増えることもあります(新しい診断コード、diff の domain の新しい what など)。新しい書き方が、それを書いたところでだけ、フィールドに新しい形を持ち込むこともあります。入力を足し合わせる constraint は、証明書でも preconditions でも、left か right が名前のリストになるただ一つの場所です。meaning: で固定した apply は、applies のその項目の sha256 が空になり、meaning が隣に付くただ一つの場所です。読む側は、知らないキーを読み飛ばし、知らない値も知らないキーと同じように扱ってください。 v を持つ形式では、v がその形の版です。check は 2、証明書は 1 で、v の無い出力は 1 です。証明書を再検査するプログラムは、自分の知らない v を受け付けません。tools/recheck.py と proofs/ の Lean のプログラムはそうしています。

1.x で変わりうるもの

  • 文面。 診断の見出し・注記・ヒント、--help、テキストの報告、rulec doc が書くもの、この文書です。読むのはコードと JSON のキーにして、文を読まないでください(§11 原則 5)。
  • 生成コードの本文。 並べ方、コメント、ローカル変数の名前、そして書いた rulec の版が入るヘッダです。rulec を上げたら rulec gen をもう一度走らせ、変わったものをコミットしてください。それまでは rulec gen --check が落ちます。CI では一つのリリースを決めて入れます(uses: i2y/ritsu@v1.0.0)。@v1 のように動くタグは用意しません。こちらが何も変えていないのに、生成物が古くなってしまうからです。
  • 落ちるべきだったのに通っていた規則。 このページや何を証明するかのページが捕まえると言っているものを、前の版が見逃していたと 1.x で分かったとき(見逃した漏れや重なり、何も宣言しないまま読み飛ばした行など)、その直しでその規則は落ちるようになります。互換のために、通ってはいけなかった規則を緑のままにはしません。こうした変更は、どんな規則に効くかを添えてリリースノートに書きます。
  • 参照評価器と食い違っていた答え。 ある言語の生成コードが参照評価器と違う答えを返していたら、直して揃えます。これもリリースノートに書きます。
  • 入口が通していた入力。 参照評価器が受け付けない契約の外の入力(型の違う値、渡されていない入力、constraint が除く組み合わせなど)に、ある言語の生成コードが答えていたら、直してほかの言語と同じく拒むようにします。答えていた呼び出しが、それからは落ちることがあります。入口の言う文は文面です。この変更もリリースノートに書きます。
  • 入口が拒んでいた契約の中の入力。 ある言語の生成コードか参照評価器が、契約が許す入力(小数点や指数で書いた整数の値の数、1000.0 や 1e3)を拒んでいたら、直して受け付けるようにします。落ちていた呼び出しが、それからは答えられることがあります。この変更もリリースノートに書きます。
  • 検査にかかる時間。 ただし、既定の予算の中で終わっていた規則は、その後も終わります。

約束の外にあるもの

  • Rust のライブラリ(src/lib.rs)。モジュールが公開されているのは、テスト・ritsu(コマンドとブラウザで試すページ)・rulec mcp から使うためで、外に向けたインタフェースではありません。ツールと一緒に変わります。使うのは、コマンドライン、rulec mcp、生成コードにしてください。
  • ritsu のブラウザで試すページと、サイト。
  • experiments/ の下のすべて。