• 日本語
  • アーキテクチャ

    // ARCHITECTURE

    3 つの実行レイヤー、1 つのバグに 1 つだけ。

    Layer 1 のブラウザ内 WebAssembly、Layer 2 のコンテナ、そのどちらでも届かないもののための Layer 3。どのレイヤーで動くかはレシピが宣言します——あなたが選ぶ必要はありません。下表で 3 層を一望してから、深掘りに進めます。

    L1 / WASM

    ブラウザの中で、瞬時に。

    L2 / DOCKER

    Docker / microVM で、忠実度を。

    L3 / THIRD WAY

    L1・L2 が届かないもののための枠。

    起動時間
    ms 〜 数秒。初回はランタイム DL(Pyodide ≈ 10 MB)で 1〜10 秒、2 回目以降はブラウザキャッシュで 1 秒未満。
    秒〜分。訪問者の Docker か Codespaces で動かすカタログ配信。
    未定。レシピがひとつも無いため、性格づけすべきランタイムが存在しない。
    向くバグ
    アルゴリズム、データ処理、DB クエリ、ライブラリ内部のロジックバグ。
    プロジェクト全体の再現、syscall 依存、ツールチェーン固有、マルチプロセス。
    データレース、メモリ順序、長時間 replay、特定の interleave に依存する分散バグ。
    届かないこと
    メモリ ~4 GB 上限、本物の fork/exec、データレース、コンパイラ自体のビルド。
    ページ内では実行不可、Docker か Codespaces が必要、ハイゼンバグ自体の再現性確保。
    読み手が普通のマシンで実行して確かめられないもの。この基準がこの層を空のままにしている。
    対応ランタイム
    Pyodide / Ruby.wasm / php-wasm / wasm32-wasip1 / sqlite-wasm。
    ピン留め Dockerfile + ghcr.io/aletheia-works/vivarium-<slug> + Codespaces バッジ。
    まだ無い。決定論的シミュレーション、microVM スナップショット、WASI Preview 3+ が候補。
    L1 / WASM

    // 01 · LAYER 1

    WebAssembly、ページの中で。

    ユーザーのブラウザタブの中で再現が直接実行される層です。アカウントもインストールも不要、ページを開けばすぐ動きます。Phase 0〜2 で複数の Python / Ruby / PHP / Rust レシピを揃え(例: cpython#137205やpandas#56679)、現在は最も「ブラウザだけで完結する」surface です。

    向くバグ

    • アルゴリズムバグ(ソート、パース、テキスト処理)。
    • データ処理のリグレッション(pandas / polars / numpy のシェイプバグなど)。
    • データベースの動作バグ(SQLite のクエリ異常、JSON パスのエッジケース)。
    • ファイルシステム・ネットワーク・プロセスモデルに触れない、ライブラリ内部のロジックバグ。

    起動時間

    • 初回(キャッシュなし): 1〜10 秒。ランタイムのダウンロード(Pyodide ≈ 10 MB 圧縮)とインスタンス化が支配的。
    • 2 回目以降: ブラウザのキャッシュが効いて 1 秒未満で起動。
    • 再現スクリプトの実行自体: ミリ秒〜数秒。

    届かないこと

    • メモリ。 ブラウザタブはピーク 1 GB 超で性能が劣化、4 GB が実質上限。本番規模のデータは Layer 2 へ。
    • システムコール。 本物の fork/exec、本物のソケットは使えない。WASI シムが一般的なケースをカバー。
    • 並行性バグ。 デフォルトはシングルスレッド。データレースやハイゼンバグは Layer 3 へ。
    • コンパイラ自体のビルド。 Rust のバグはブラウザ内で再現できますが、Rust コンパイラ自体のビルドは Layer 2。

    対応ランタイムと実例

    L2 / DOCKER

    // 02 · LAYER 2

    Docker / microVM、訪問者のマシン上で。

    本物のファイルシステム、本物のプロセス、本物のネットワークが必要なバグのための層です。Vivarium 側で再現を実行するのではなく、訪問者自身の Docker(または Codespaces)で動かすカタログ型の配信モデルを採用しています。

    向くバグ

    • プロジェクト全体の再現——実際のパッケージインデックスへの依存解決を要するバグ。
    • システムコール依存のバグ——本物の fork、ソケット、ファイルロック、シグナル。
    • ツールチェーン固有のバグ——特定の GCC、glibc、カーネル ABI の癖。
    • プロセス間の相互作用が原因のマルチプロセスバグ。

    使い方

    各レシピページにはピン留めされた Dockerfile と、コピペ可能な docker run … コマンド、そして ghcr.io/aletheia-works/vivarium-<slug> に公開されたビルド済みイメージへのリンクが揃っています。CI で取得した verdict スナップショットがページ上に表示され、訪問者自身の docker run がライブ再現になります。Codespaces 対応のレシピには「Open in Codespaces」バッジも提供されます。

    届かないこと

    • ページ内では実行されない。 訪問者がローカルか Codespaces で実行します。
    • Docker(または Codespaces アカウント)が必要。 どちらもない場合は、レシピと verdict スナップショットの閲覧のみ可能。
    • 並行性そのものをデバッグするバグ。 Layer 2 は本物のスレッドで動きますが、ハイゼンバグの再現性確保は Layer 3 の領分。
    L3 / THIRD WAY

    // 03 · LAYER 3

    L1・L2 が届かないもののための枠。

    数回再実行しても再現する保証がないハイゼンバグのための層です。区分としては宣言されていますが、現在レシピはひとつもありません。

    向くバグ

    • データレース、メモリ順序バグ、単純な再実行では再現しない use-after-free。
    • 長時間 replay シナリオ:何時間ものキャプチャ実行を数分で巻き戻す。
    • 特定のメッセージインターリーブに依存する分散システムバグ。
    • 事後フォレンジック分析——録音済みトレースを後ろに戻る形のデバッグ。

    なぜ空なのか

    最初の試みは rr の record-replay でしたが、撤去しました。rr は Linux/x86_64 専用で、PMU の露出と CPUID faulting を要求します。Windows や macOS の読み手はレシピを検証すらできず、実行できる環境がここまで限られると、正しい再現と壊れた再現を安く見分ける手段もありません。

    空である理由

    • 参入基準。 レシピは読み手自身が再現できなければならない。誰も独立に確認できない verdict は証拠ではない。
    • カーネル依存の技術。 CRIU や Firecracker スナップショットも同じ Linux 依存を引き継ぐため、同じ基準を通す必要がある。

    候補

    • 決定論的シミュレーション(Antithesis 系)と WASI Preview 3+ が有望。ホストのカーネル機能に依存しないため。
    • どれかが着地するまで、ギャラリーに L3 のエントリは出ません。

    どのレイヤーで動くかは、レシピ側があらかじめ宣言しています。あなたが選ぶ必要はなく、レシピを開けば自動的にそのレイヤーで動作します。

    // 次のページ

    実例を見る →

    3 つのレイヤーがそれぞれどんなバグを再現しているか、再現一覧で実物を確認できます。

    VIVARIUM は ALETHEIA-WORKS の一部 · GitHub でソースを見る →