ブラウザで試す
このページで動いているのは ritsu そのものです。wasm32 に載せているだけで、プロジェクト全体にかける ritsu check(ファイルごとにその言語の検査をかけ、ある言語が確かめたことを隣の言語が読む)も、各言語の生成とページも、コマンドと同じものが走ります。どこにも送っていません。 編集したファイルは、ブラウザの中だけにあります。
ここでのプロジェクトは数個のファイルで、一つのタブに一つのファイルが入っています。ファイルが変わるたびに、ページはファイルを全部モジュールに渡し、モジュールは、同じファイルを置いたディレクトリで走らせるのと同じようにコマンドを走らせます。プロジェクトには ritsu check . を走らせ、開いているファイルには、その言語の生成かページを出します。リストには、全部の言語がそろう小さな通販と、rulec と dandori の例と、自分のファイル一つから始めるための空のプロジェクトがあります。このページの答えが、同じファイルを置いたディレクトリで ritsu のバイナリが出す出力と書くファイルに一字も違わないことは、テストで確かめています(crates/ritsu/tests/playground.rs)。
試してみること
最初に開くのは、受注が契約に値を一つ足したばかりの小さな通販です。proto/shop/v1/order.proto に ORDER_STATUS_RETURNED = 5; が増えました。請求の規則はこの列挙を取り込み、requirements/billing.req の要件は規則の表を名指し、地図は規則を受注に対する請求の腐敗防止層として名指しています。一つのファイルの一行に、三つの言語がそれぞれ答えます。英語の名前のプロジェクトですが、出力は日本語です。
- 指摘を読む。 見出しには、それを言ったツールが入っています。rulec は「列挙 order_status が ../../proto/shop/v1/order.proto の OrderStatus と一致していません」と言い、規則に無い値を示します。yuen は「rulec から rulec "billing/rules/billing_need.rule" table decide の情報を得られません」と言います。規則が rulec の検査を通らないので、yuen がその表のハッシュを取れなくなったからです。sakai は「billing/rules/billing_need.rule が rulec の検査を通らないか、読めません」と言います。
billing/rules/billing_need.rule:5のような指摘の場所をクリックすると、その行に移ります。 - 契約の側で直す。
.protoからその行を消すと、どのファイルも検査を通ります。 - 規則の側で直す。 「編集を取り消す」を押してから、
billing/rules/billing_need.ruleの列挙の最後に| returnedを足します。rulec は「取り込んだ列挙 order_status の値に、行もdefaultもありません」と言います。cancelledの行の下に| returned | skip |を足すと rulec は通りますが、今度は yuen が、表が「2026-10-04 に accounts がこのリンクを確かめたあとで変わりました」と言い、増えた行を見せます。検査を通った規則が、そのまま誰かの確かめた規則になるわけではありません。 - ワークフローと規則の境目を壊す。
ordering/rules/urgency.ruleの出力carrierを、outputsと、表と例の見出しでcourierに変えます。rulec は通ります。dandori は規則の出力を同じプロセスの中で rulec から読むので、ordering/ship_order.flowでその出力を読む二つの行に「urgency.outputsにフィールドcarrierはありません(urgent・courier)」と言います。 - 生成する。
ordering/ship_order.flowを開いて「生成」を押すと、Temporal が動かすもの(TypeScript の八つのファイル)が出ます。横のリストで Step Functions を選ぶと、何も書きません。このフローはワークフローに送られるイベントを待ち、on cancelで後始末をしますが、Step Functions ではどちらもできません。倉庫を呼ぶための接続も、タスクに書いていません。生成する言語は、どれもここで生成できます。規則は 12 の言語のコード、カレンダーは 5 つの言語のコード、帳簿は SQL とクライアント、地図は Context Mapper の CML、要件は ReqIF か W3C PROV です。 - 人が読むページを開く。 コードが実現すべきものを理解し、確かめる人のためのページです。規則、カレンダー、帳簿、フローのどれでも開けます。ウィンドウ全体を使うページなので、別のタブで開きます。それぞれがプルリクエスト向けに書く Markdown は、リンクの下にあります。
リストの「小さな通販(日本語)」は、同じプロジェクトの名前を日本語にしたもので、同じ手順をそのまま試せます。
rulec と dandori の例
リストの「rulec(規則一つ)」には、rulec のサイトのブラウザで試すページにあった五つの規則があります。「dandori(フローと、フローが読むファイル)」には、dandori のサイトのブラウザで試すページにあったフローが全部あり、どれも、フローが読むもの(規則、呼ぶ API の記述、子のフロー、日付のファイル、帳簿)と一つのプロジェクトになっています。読むものは、フローが名指すパスに置いてあります。どちらも前のページと同じファイル(rulec のコーパスと dandori の例)から作っていて、そのファイルと同じであることはテストで確かめています。このページには日本語の版が、英語のページには英語の版が出ます。
- 表に足りない行を見つける。 「一行足りない表」は、rulec のサイトのトップページにある表から、最後の行を抜いたものです。rulec は「不完全です」とは言わず、すり抜ける入力を「当てはまらない例: あて先 = 遠隔地, 重量 = 2001g」と名指して、その穴を塞ぐ行の形も示します。「そろった表」には、その行があります。そこで
<=2kgを<=6kgに変えると、rulec は行の重なりを指摘し、両方の行に当てはまる入力を示します。 - ほかの形の規則を読む。 「表をつなぐ」では、ある表が決めた値を次の表が読みます。「大きい規則」では、同じ入力から出た二本の筋が下でまた合流し、人が読むページもその形に並びます。「並びを歩く」は、件数が呼び出しのたびに変わる明細を受ける規則で、人が読むページの入力に「行を足す」のボタンが付きます。
- 下書きのエラーを一つずつ直す。 「ホテルの予約の最初の下書き(エラーあり)」は、規則二つと Stripe の API を呼ぶフローで、検査するとエラーが四つ見つかります。最後のエラーは、PaymentIntent が
processingのまま、またはrequires_payment_methodに戻ったまま、ワークフローが終わることがあると言い、そうなる例を添えています。91 行目のfail CardDeclined "The card was declined"の後ろにleaving piを足すと、ワークフローは PaymentIntent をそのまま引き渡すことになり、エラーは三つになります。 - フローが呼ぶ規則を書き換える。 フローの規則はプロジェクトのファイルで、それぞれのタブに入っています。dandori のページでは見せるだけでしたが、ここでは書き換えられ、フローの検査は書き換えたとおりの規則を読みます。規則の「人が読むページ」は、
rulec docが描くページで、ケースを打って試せます。 - 版ごとのプラットフォームに向けて生成する。 「ホテルの予約・Temporal 版」を選ぶと、フローが開きます。「生成」を押すと、横のリストでは Temporal が選ばれています。Step Functions を選ぶと、何も書きません。この版は、Stripe の Webhook をワークフローに送られるイベントとして待ち、
on cancelで与信を取り消しますが、Step Functions ではどちらもできません。Stripe を呼ぶための EventBridge の接続も、規則を呼ぶための Lambda 関数も書いていません。Step Functions 向けに書いたのは「ホテルの予約・AWS 版」です。
ファイル一つから始める
自分の規則やフローを一つだけ試すなら、リストの「空のプロジェクト」を選んでください。まだファイルが一つもないので、「ファイルを足す」を押し、言語の拡張子で終わるパス(fee.rule、order.flow、days.cal、stock.book など)を付けて、開いたタブにファイルの中身を貼り付けてください。フローが呼ぶ規則のように、そのファイルが読むファイルは、名指しているパスに、もう一つのファイルとして足してください。
作ったものを共有する
「リンクをコピー」を押すと、いまのプロジェクトへのリンクがアドレスバーに入ります。ブラウザが許せば、クリップボードにも入ります。リンクには、プロジェクト、開いているファイル、check・生成・人が読むページのどれを見ているか、生成先と、変えたファイル・足したファイル・消したファイルの全部が詰めてあります。どこにも保存しないので、リンクを開いた人のブラウザに、同じファイルが同じタブで並びます。「編集を取り消す」を押すと、開いたときのプロジェクトに戻ります。dandori のサイトのブラウザで試すページが出していたリンク(#flow=examples/hotel/temporal/hotel.ja.flow&view=build など)も、ここで同じフローを開きます。
ここにないもの
- geas。 geas は、主張が名指すコードを走らせて主張を確かめます。ページの中ではプロセスを起こせないので、
.geasのファイルは、読んで構文を確かめたあと、プログラムを起こせないと言って止まります。 - 実行。
dandori run、chobo run、シナリオ、rulec verifyとreplayには、プロセスやサーバー、記録のファイルが要ります。それはコマンドで使います。 - ネットワーク。
source fetchとoutdatedは、e-Gov、eCFR、出典が名指す URL に問い合わせます。 - 地図の Rust のワークスペース。 sakai は、地図の
code rust "…"のクレートを Cargo に尋ねます。ページの中では Cargo を走らせられません。 - プロジェクトへの書き込み。
rulec fmtとyuen reviewは、渡したファイルを書き換えます。ここでは、ファイルは編集したときにだけ変わります。
このページが読み込む playground/ritsu.wasm は ritsu のコード(MIT OR Apache-2.0)から作ったもので、ritsu のバイナリと同じく、他者のものを含みます。Unicode CLDR の区分の名前(Unicode-3.0)、WHATWG の Encoding Standard から作った表(BSD-3-Clause)、crates.io のクレート 8 個と、explain の例のための法令のコピーです。それぞれの出どころと、ライセンスの文または利用の条件は THIRD_PARTY_NOTICES にあります。リストの dandori の例には、Stripe の OpenAPI の文書と、Amazon SNS・SQS の Smithy のモデルから、例が呼ぶところだけを残したコピーが入っていて、ライセンスはそれぞれの元のものです(crates/dandori/THIRD_PARTY_NOTICES.md)。