2026-08-09

週次オープンソース:nixvm が POSIX を埋め、kataan は失敗 12 件に、catcard にウォレットが育つ

ここしばらくで一番静かな週で、約 300 コミット。細部に向き合う週 でもあった。システムコールをエミュレートするサンドボックスは、 Linux をプログラムが期待するとおりに振る舞わせることに費やした。 閉じたパイプが poll でどのビットを返すか、というところまでだ。 JavaScript エンジンは test262 の最後の一握りの失敗と、その裏にある 性能の崖を追った。作って一週間の Coldcard ファームウェアは、 スキャフォールドから、画面・キーパッド・設定ストアを備えた Bitcoin ライブラリになった。

nixvm:Linux の隅々

nixvm は、ゲスト カーネルなしで本物の Alpine ユーザランドを動かす。ゲストの システムコールは gVisor 流に、Rust で書いた「カーネル」へ トラップされる。今週の 31 コミットはほぼすべて忠実さの話で、 間違っているときにだけツールが気づく種類の振る舞いだ:

  • シグナル。 読み手のいないパイプやソケットへの書き込みで SIGPIPE、rt_sigtimedwait(これで sigwait/sigtimedwait が動く)、sigqueue の配送、動く signalfd(読めるようにならない スタブだった)、ppoll/pselect6/epoll_pwait のシグナル マスク、そしてシグナルによる終了を WIFEXITED ではなく WIFSIGNALED として報告すること。
  • 時間。 本物の nanosleep、clock_gettime・getrusage・ times の間で一致するタスクごとの CPU 計上、SIGALRM を届ける alarm/setitimer。
  • プロセス。 kill の POSIX プロセスグループ指定、 wait4/waitid の pid フィルタと子の rusage、そして実際の タスクを返す /proc/self/{exe,cwd,root,comm,cmdline,stat,status,fd}。 CPU 数は、sysfs 経由でホストの値を漏らすのをやめ、nixvm 自身の コア数を返すようになった。
  • ファイルと IPC。 O_APPEND、chmod と utimensat(どちらも 何もしていなかった)、FD_CLOEXEC、SEEK_DATA/SEEK_HOLE、 EPOLLONESHOT、空のノンブロッキングパイプの読み込みが EAGAIN を返すこと、そして syslog の /dev/log 向けの AF_UNIX データグラムソケット。

kataan:既知の失敗 12 件

kataan(30 コミット) は 99.93% から test262 の 99.98%:51,890 中 51,878、既知の失敗 12 件 へ進んだ。ロードマップには、最後の三件の失敗がそれぞれ なぜ「こちらの問題ではない」のかも記録された。修正は深いところまで 及んだ:プログラムテキストを WTF-8 で持つようにして孤立 サロゲートがパースを生き延びるようにし(+9)、@@replace は WTF-8 を正規の形で連結する。source-phase import も入った。 Intl にはカレンダーごとの紀元と月名が入り、formatRange は intl の範囲サポートを通るようになり、intl 0.6.1 の minimumGroupingDigits も取り込んだ(+6)。

週のもう半分は性能だった。文字列と配列の操作の多くに、呼び出し ごとに隠れた O(n) があった。slice、substring、indexOf、at、 push、delete のどれにもあり、組み込みイテレータは一歩ごとに バッファをコピーし、文字列へのプロパティアクセスのたびに文字列を 実体化していた。修正は、ロープで連結する concat とテンプレート リテラル、ASCII 高速パス付きの O(1) 添字読み出し、そしてその場での ロープ平坦化。どれも片付くたびにロードマップに記録された。

catcard:スキャフォールドから Bitcoin スタックへ

先週日曜に始まった、Coldcard ハードウェア向けのクリーンルーム Rust ファームウェア catcard は、最初の丸一週間(17 コミット)を、ウォレットに欠かせない部品に 費やした。どれもホストでテストできる独立したクレートだ:

  • 鍵とエンコーディング: BIP-39 のニーモニックとシード導出、 secp256k1 上の BIP-32 HD 導出、Base58Check、Bech32 と Bech32m。
  • アドレス: P2PKH、P2SH-P2WPKH、P2WPKH、P2TR。
  • 署名: 決定的 ECDSA と BIP-340 Schnorr、トランザクションの パース、BIP-143 の sighash。
  • ハードウェア: SPI マスタ、8×8 フォント付きの SSD1306 ディスプレイドライバ、キーをエコーするセルフテスト付きの デバウンスしたキーパッド走査、SPI-NOR フラッシュドライバ、 そしてその上の、認証付きで電源断に耐える設定ストア。

小さなコミットの一つがやり方をよく表している:「RAM に秘密を 残さない」パニックハンドラだ。どれかを実機で動かす前に、 ハードウェア検証計画も書かれた。

decryptd:v5 カーネル ABI

分散計算プロジェクトの GPU ワーカー decryptd は、九つの リリース(0.1.31 → 0.1.39)を出した。v4 カーネル ABI に対応した あと、それを v5 で置き換え、古いものはすべて落とした。ワーカーは マニフェストを読む代わりにコンパイル済みの cubin に自身のことを 問い合わせ、作業空間をジョブ blob からではなくプラットフォームから 受け取り、起動サイズを出力バッファに収まるように決める。 プラットフォームの軸順の規約に合わせる修正も続いた。 総当たりの探索範囲(ボックス)は 2^128 を超えうるので、その大きさは もう計算しない、というコミットもある。

graphitesql:SQLite の関数ライブラリ

Pure-Rust の SQLite graphitesql (14 コミット)は、実際のデータベースが使う拡張関数を埋めた: median/percentile/percentile_cont/percentile_disc、 base64()、任意精度の decimal 関数群、X REGEXP Y を支える regexp()、sha1() と sha3()、そして ieee754 関数群。 sin/cos/tan には大きな引数向けの Payne–Hanek の範囲縮小が 入った。複数制約の ON CONFLICT は sqlite 本家と同じ検査順で 解決するようになり、C API には 64 ビットの bind/result 版と zeroblob のヘルパが加わった。

OxideAV:エンコーダが仕上がる

  • oxideav-mpeg4video は MPEG-4 Part 2 のエンコーダを一気に作った:ビットライタ、 順方向 DCT と量子化器、VLC エミッタ、I-VOP エンコーダ、そして 動き推定付きの P-VOP。ブラックボックスの照合では、参照デコーダが その I+P ストリームをビット単位で再現する。DCT カーネルも プラットフォーム間でバイト決定的になった。
  • oxideav-opus は CELT のピッチ前置フィルタ(デコーダの後置フィルタの逆)を入れ、 README はこれでエンコーダの一連の作業が完了したとしている。 その前に SILK 層のレート制御、VBR、ステレオの Hybrid 符号化が 入った。
  • oxideav-pixfmt は変換行列が閉じた:61 形式の全体で、順序付きの 3,660 組の変換が すべて解決する。
  • oxideav-mkv は Matroska の TrackOperation を適用する。ブロックを仮想トラックに 結合し、ステレオ 3D のプレーンを合成し(RFC 9559 §18.8)、仮想 トラック上でシークもできる。

今週その他

  • z3rs はコーパスを さらに片付けた:周期性による三角関数の引数縮小、π の認識、 任意の丸めモード下での FP 定数畳み込み、そして非線形の閉じた 全称否定で潜在的に誤って unsat を返していた件の修正。
  • fullrust は、 libc なしのツールチェーンオーバーレイを Rust 1.90 から 1.95 まで 一週間ですべて移植し、GitHub Action のセルフテストも入れた。
  • oxideav-bitstream には、バイト一致のライタ付きの完全な H.266 VPS の走査と、VP9 キーフレームのヘッダライタが入った。
  • oxideav-embroidery は PHB、VIP、プレーンテキストの .col、Singer XXX のヘッダへと 対応を広げた。

来週

nixvm は実際のワークロードが見つけるたびにセマンティクスの穴を 塞ぎ続け、kataan の残りの失敗はもう短いリストだ。catcard の検証 計画は次に実機を指している。OxideAV はコーデックを一つずつ、 バイト一致のエンコードと適合性へ進め続ける。