Skip to content

feat(installer): OS ごとの前提条件スクリプトと Ubuntu arm64 実機の修正を入れる(ADR-08、DEMO-21、CI のワークフローは保留) - #44

Merged
Yusuke-KOMIYAMA merged 11 commits into
developfrom
feat/per-os-installers-split
Nov 10, 2026
Merged

Yusuke-KOMIYAMA merged 11 commits into
developfrom
feat/per-os-installers-split

Conversation

@Yusuke-KOMIYAMA

Copy link
Copy Markdown
Contributor

概要

OS ごとの前提条件スクリプト(installer/install-ubuntu.sh・install-macos.sh・install-windows.ps1・prereq-lib.sh、ADR-08)と、Ubuntu 24.04 arm64 の実機で見つけた Linux 固有の不具合の修正を入れます。記録は DEMO-21 です。

CI のワークフロー(installer-prereq-lint.yml・installer-full.yml)と、それだけが使う .github/scripts/Test-PowerShellSyntax.ps1 は含みません。push するトークンに workflow スコープが無いためで、ローカルのブランチ feat/per-os-installers に残し、所有者が後で push します。SPEC-02・ADR-08・DEMO-21 にはワークフローが保留中であることを書きました。

DEMO-21: Linux での結果

Lima の Ubuntu 24.04 arm64 VM(8 CPU・40 GiB、uid 2001 の一般利用者、リポジトリは VM 自身のディスク)で検証しました。非公開の統合リポジトリはホストの読み取り専用ミラーから insteadOf で取得し、VM にトークンは置いていません。

  • GRDM_WITH_ACCEPT=1 ./installer/install-ubuntu.sh --yes --profile core が終了 0 で完了しました。scan は Trivy・Semgrep・gitleaks・ZAP のすべてが ok で、report まで通りました。
  • grdm-dev health は終了 0 でした。
  • grdm-dev accept --seed --only core は 12 件中 12 件合格(終了 0)です。証跡は docs/demo/runs/acc-20261110T060511Z-80ee06/ にあり、秘密はマスク済みです。
  • grdm-dev db upgrade を Linux かつ uid 1000 以外で初めて実行しました。終了 0、12 秒で 9.6 → 18 に移り、3 データベース・1 ロールの 531 個の対象を照合して一致しました。
  • PR feat(installer): OS 横断の事前確認と Linux のボリューム所有者処理を追加 #36 の所有者処理と reset も uid 2001 で働きました。

Linux の修正(5 件)

  1. QEMU の異常終了: Ubuntu の qemu-user-static 8.2.2 が、modular-file-renderer のビルド中に QEMU internal SIGSEGV で落ちました。そこで、ダイジェストで固定した tonistiigi/binfmt:qemu-v10.2.3-68 から QEMU を登録し、既存の 8.2.2 は置き換えるようにしました。doctor はこのビルドをビルド前に終了 13 で拒みます。
  2. ember の待ち時間: QEMU では ember の初回ビルドに 44 分かかり、1800 秒の待ちで終了 40 になりました。Linux arm64 でプロファイルに amd64 のサービスがあるときは、up の既定の待ちを 5400 秒にしました。
  3. Playwright: ドライバーが動くには libatomic1 が要ります。GRDM_WITH_ACCEPT=1 のときに apt で入れ、Linux 向けの accept の案内に install-deps を加えました。
  4. scan の終了 51: 二つの原因を直しました。
    • ZAP は uid 1000 で書くため、uid 2001 の報告ディレクトリに書けませんでした。対象ごとの作業ディレクトリ(0700 の runtime/ の中で 0777)を使うようにしました。
    • インラインの PowerShell のせいで Semgrep のエンジンが落ちていたので、PowerShell を補助スクリプトへ移しました。補助スクリプトはワークフローと一緒に保留中です。
  5. 資格情報の露出: Lima のテンプレートはホームを読み取り専用で mount するため、~/.config/gh が VM から見えていました(読んではいません)。install-ubuntu.sh は、共有フォルダに資格情報ファイルがあると終了 10 で止まるようにしました。環境ガイドにも Lima の手順を加えました。

検証

  • PYTHONPATH=installer python3 -m unittest discover -s installer/tests が終了 0 でした(Python 3.15 と /usr/bin/python3 3.9 の両方)。
  • 次はいずれも終了 0 でした。
    • python3 -m unittest discover -s tools/tests
    • python3 tools/docs_check.py
    • python3 tools/manifest_check.py
    • .venv/bin/semgrep scan --config p/default --error --metrics=off .
  • gitleaks(origin/develop..HEAD の 8 コミット)は no leaks でした。

未実施

  • Ubuntu amd64 と WSL2 の実機での実行はしていません。
  • QEMU の登録は再起動をまたいでは残りません。その場合は doctor が知らせ、スクリプトを再実行すれば戻ります。

関連: ADR-08、SPEC-02 0.25、SPEC-04 0.9、DEMO-21 0.4

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ

Yusuke-KOMIYAMA and others added 8 commits November 10, 2026 18:11
…る(ADR-08)

背景: install.sh は Python・git・Docker・スキャナーを前提にしており、Windows の入口が無かった。監査の指摘をファイルで確かめた: install.sh は Python の案内のみ、.gitattributes なし、CRLF の案内は BSD sed 依存、install.sh・Compose・macOS・Windows・arm を動かすワークフローなし。追加の発見として、trivy か gitleaks が無いと install は scan で終了 51 になる(install.py の OPTIONAL_STEPS は段が存在しない場合だけを許す)ので、前提条件に含めた。

判断: install-ubuntu.sh・install-macos.sh・install-windows.ps1 はホストの準備だけを行い、必ず install.sh で終わる。判断の道筋は一つのまま。sudo はこれらに限り同意の後で認める(SPEC-02 §1・§2.3)。代替案(案内の改善のみ、grdm-dev への組み込み、全 OS 共通の一本化)は ADR-08 §3 に記録。ADR は Proposed で、承認は所有者が行う。終了コードは messages.tsv の 2・10・11 を使い回し、増やさない。

信頼: Docker の apt 署名鍵は指紋 9DC858229FC7DD38854AE2D88D81803C0EBFCD88 で検証(配布鍵から SHA-1 を計算して確認)。trivy 0.75.0 と gitleaks 8.21.2 は公式 checksums の SHA-256 に固定し、amd64 の実ファイルで一致を確認。Homebrew と Docker Desktop は入れない。トークンは扱わない。

証拠: 単体試験 389 件 OK(skipped 10、新規 26 件はスタブの PATH 下で --dry-run か --help のみ)。docs_check 合格。manifest_check --policy-only 合格。install-macos.sh --dry-run をこの Mac で実行。git add --renormalize で既存ファイルの変化なし。ワークフローは ruby の YAML で解析のみ。

未検証: shellcheck と pwsh はこのホストに無く未実行で、PowerShell の構文は CI の Parser.ParseFile が初回の確認となる。Ubuntu と Windows の実行、および hosted runner で証明できない範囲は ADR-08 §5 に記載。install-windows.ps1 の既定 -Branch は develop のため、マージ後に有効。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
…ight の libatomic 不足を直す

背景: Lima の Ubuntu 24.04 arm64 VM(grdm-ubuntu2404、8 CPU・40 GiB、uid 2001 の一般利用者、リポジトリは VM 自身のディスク、統合リポジトリはホストの読み取り専用ミラーから insteadOf で取得、トークンは VM に置かない)で install-ubuntu.sh --yes --profile core を実行し、dry run では分からない失敗を三つ記録した(DEMO-21)。

失敗 1: apt の qemu-user-static 1:8.2.2+ds-0ubuntu1.18 が modular-file-renderer のビルドで libgvc6 の post-install 中に「QEMU internal SIGSEGV」で落ち、開始 45 分後に終了 30。切り分け(buster の amd64 コンテナで libgvc6 を入れる、各 1 分)では Ubuntu の 8.2.2 だけが落ち、tonistiigi/binfmt の 8.1.5・9.2.2・10.2.3 は通った。版の範囲ではなく Ubuntu のビルドの問題なので、拒むのはそのビルドだけにした。
修正: install-ubuntu.sh は qemu-user-static を入れず、ダイジェストで固定した tonistiigi/binfmt:qemu-v10.2.3-68 から登録し、登録済みの Ubuntu 8.2.2 は --uninstall の後に --install で置き換える。doctor は登録済みインタープリターの --version(Ubuntu の x86_64-binfmt-P は名前を見て拒むので実体を解決して読む)を照合し、該当すればビルド前に終了 13 で置き換えのコマンドを示す。コンテナから F フラグで登録したものはホストにファイルが無いため「不明」として通す。
代替案: qemu-user-static を残して版で判定する案は、8.1.5 が通った実測と合わないので退けた。登録を永続化する systemd ユニットの追加は範囲外とし、再起動後は doctor と再実行で戻す。

失敗 2: QEMU 10.2.3 で全 12 部品は組めたが、ember の初回ビルドが 1 コアで 44 分 15 秒かかり、up の 1800 秒で終了 40。他の 23 サービスは健康で、ember の完成後は health 終了 0。
修正: Linux arm64 でプロファイルに amd64 のサービス(manifest の build_platform、doctor と同じ数え方)があるとき、up の既定の待ちを 5400 秒(実測のおよそ 2 倍)にした。--timeout の明示は優先。macOS は Darwin なので 1800 秒のまま。

失敗 3: playwright install --with-deps chromium が終了 127。Playwright の Node.js ドライバーが libatomic.so.1 を読めない(クラウドイメージに無い)。
修正: GRDM_WITH_ACCEPT=1 のとき install-ubuntu.sh が libatomic1 を apt で入れ、Linux の accept の案内は前に sudo apt-get install -y libatomic1、後に playwright install-deps chromium を付ける。

PR #36 の所有者処理は uid 2001 で働いた(volume_owner_init と volume_access_check_1000・999 が完了)。

証拠: 単体試験 572 件 OK(skipped 10、新規はエミュレーター判定・置き換え計画・up の既定待ち・Linux の案内)。docs_check 合格、manifest_check 合格。SPEC-02 0.17、SPEC-04 0.9、環境ガイド 1.3 に反映。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
…)を直す

背景: 修正後の第 3 回(Ubuntu 24.04 arm64 VM、uid 2001、reset からのコールドスタート)で、install-ubuntu.sh は登録済みの Ubuntu QEMU 8.2.2 を置き換え、libatomic1 を入れ、build・up(ember の初回ビルドを含む)・health --network まで通ったが、scan が終了 51 で止まった(DEMO-21)。

失敗 4a: ZAP の三つの対象すべてで「no ZAP report (rc 0)」。ZAP は uid 1000 で書くが、runtime/reports はホストの uid 2001 の所有(775、グループ docker)で書けない。VM で touch を試して Permission denied を確認した。Mac の Docker Desktop の bind は所有者を問わず書けるため、これまで表に出なかった。
修正: 対象ごとに runtime/reports/zap_wrk_<svc>_<ts>/ を作って 0777 にし、そこを /zap/wrk に mount する。runtime/ は 0700 なので他のホスト利用者は入れない。報告はマスクした写しを reports/ に保存し、作業ディレクトリは finally で消す。代替案の --user <uid> は ZAP のホーム(/home/zap、uid 1000 所有)に書けず起動に失敗しうるので退けた。

失敗 4b: Semgrep 1.184.0 が .github/workflows/installer-prereq-lint.yml で「Internal matching error」を 4 件出した(curl-eval と gha-curl-pipe-shell の規則)。切り分けで PowerShell のジョブだけが原因と分かった。Semgrep は run: をシェルとして読むため、インラインの PowerShell でエンジンが失敗する。この branch で加えたファイルなので OS を問わず起きる。
修正: PowerShell の構文確認を .github/scripts/Test-PowerShellSyntax.ps1 に移し、run: は一行の呼び出しにした。VM で p/default と p/github-actions を当て、エラー 0 件を確認。

証拠: 単体試験すべて OK(skipped 10、新規は ZAP の作業ディレクトリのモードと削除、PowerShell の run: が一行であること)。docs_check 合格、manifest_check 合格。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
… になったことを記録する

背景: DEMO-21 0.1(修正 1〜3 のコミットに含めた)は第 1・2 回までだった。修正後の第 3 回(壊れた状態からのコールドスタート)と修正 4 後の第 4 回、受入試験 2 回を記録する。

記録: 第 3 回は install-ubuntu.sh が Ubuntu の QEMU 8.2.2 を置き換え、libatomic1 を入れ、up(5400 秒の待ちの中で ember の初回ビルド約 40 分)と health --network まで通り、scan で終了 51(失敗 4a・4b)。第 4 回(0c46a82)は GRDM_WITH_ACCEPT=1 ./installer/install-ubuntu.sh --yes --profile core が 204 秒で終了 0(scan は trivy 23 対象・semgrep・gitleaks・zap 3 対象すべて ok、門は report-only で合格、report まで)。直後の grdm-dev health も終了 0。受入試験は 2 回とも 12 件中 5 件合格(C1・C3 の両ケースと C2 の拒否)。残る失敗は DEMO-20 が develop で記録したものと同じで、未マージの fix/accept-c2-c6 で直しているもの。Linux に固有の失敗は無い。証跡 2 件(マスク済み)を docs/demo/runs/ に追加。

ADR-08 0.2: §5 の「Docker Engine の apt 導入」と「arm64 Ubuntu の amd64 エミュレーション」を DEMO-21 で実証済みに更新。amd64 と WSL2 は未実行のまま。SPEC-02 の版の行の所要時間を実測の 48 分に訂正(試験のコメントも同じ)。

証拠: 単体試験すべて OK(skipped 10)、docs_check 合格、manifest_check 合格。VM は grdm-ubuntu2404 として残す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
…止め、Lima の手順を案内する

背景: DEMO-21 の VM を作ったとき、Lima の Ubuntu テンプレートは、インスタンスの設定に独自の mounts: を書いてもテンプレート側の "~" を併合し、ホームを読み取り専用で mount した。最初の起動で /Users/komiyama が VM から見え、~/.config/gh/hosts.yml(GitHub のトークン)が読める状態だった。気づいて lima.yaml から外し再起動するまでの間で、トークンは読んでいない。

修正: install-ubuntu.sh は /proc/mounts の共有フォルダ(virtiofs・9p・fuse.sshfs・vboxsf・vmhgfs)の根に .config/gh/hosts.yml・.git-credentials・.netrc・.docker/config.json があれば、変更の前に終了 10 で止まり、Lima での外し方を示す。存在だけを調べ、中身は読まない。--dry-run では停止を報告して計画を続ける。終了コードは既存の 10(ホストの前提条件)で、新しい番号は増やさない。WSL2 の /mnt/c は根に資格情報を持たないので誤検出しない。
環境ガイド 1.4 に「Mac の Lima VM で Ubuntu のスクリプトを試す」を英和で加え、起動前に "~" の mount を消す手順、mount の確認コマンド、トークン無しで読み取り専用ミラーを insteadOf で使う方法を書いた。
代替案: doctor(Python)での検出は、install.sh だけを使う人にも効くが、資格情報を VM に置かない判断は前提条件スクリプトの責務(ADR-08)なのでここに置いた。

証拠: 単体試験すべて OK(skipped 10、新規は資格情報ありの共有フォルダで終了 10・変更なし、dry run での報告、資格情報なしの共有フォルダとローカルディスクでは止まらないこと)。docs_check 合格、manifest_check 合格。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
…nt による資格情報の露出を訂正する

背景: develop 50740b1(PR #40〜#43)へ rebase した後、VM grdm-ubuntu2404(uid 2001)で down・render・build・db upgrade・up・secrets rotate・health・accept を順に実行した。ホストの読み取り専用ミラーは git fetch で更新した。

記録:
- db upgrade(Linux かつ uid 1000 以外での初実行): 終了 0、12 秒。9.6 → 18(postgres:18.6、ダイジェスト固定)。cas・osf・postgres の 3 データベースと 1 ロールで 531 個の対象(表ごとの行数、シーケンス、拡張)を照合して一致。ダンプ 4546929 バイト。旧ディレクトリは postgres_data.pg9.6-20261110T055459Z として残る。前後の db status は upgrade-needed → current。
- up 終了 0(296 秒)、secrets rotate 終了 0(293 秒)、health 終了 0。
- grdm-dev accept --seed --only core: 12 件中 12 件合格、終了 0(acc-20261110T060511Z-80ee06、証跡はマスク済み)。
- その後 GRDM_WITH_ACCEPT=1 ./installer/install-ubuntu.sh --yes --profile core が 273 秒で終了 0(scan は 4 つのツールすべて ok、report まで)。health 終了 0。
- 訂正: 準備の記録は、ホームの mount が資格情報を「見せてしまうところだった」と書いていたが、実際には最初の起動から mount を外すまでの数分間、~/.config/gh/hosts.yml が VM から読めた。読んだものは無い。対策は 45b49be(install-ubuntu.sh の終了 10 と環境ガイドの Lima の手順)。
- rebase でコミット ID が変わったこと(48859d7 → 8538324、0c46a82 → 05ff502)を本文に記した。

Linux に固有の新しい失敗は無かったので、今回の修正はドキュメントだけ。

証拠: 単体試験すべて OK(skipped 10)、docs_check 合格、manifest_check 合格。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
…fault を通す

背景: 分割ブランチの検査で、semgrep scan --config p/default --error(CI と同じ .semgrepignore の下)が scan.py の os.chmod(wrk, 0o777) を insecure-file-permissions として 1 件報告し、終了 1 になった。この chmod は DEMO-21 第 3 回の修正 4a で加えたもの。

判断: 0777 は意図どおり。ZAP はコンテナの中で uid 1000 として書き、Linux のホスト利用者(第 3 回は uid 2001)の所有のディレクトリには書けない。作業ディレクトリは 0700 の runtime/ の中にあり、ほかのホスト利用者は入れず、報告一つだけを持ち、finally で消す。リポジトリの既存の慣行(compose.py・test_compose.py)に合わせ、理由つきの nosemgrep を付けた。代替案の --user <uid> は ZAP のホーム(uid 1000 の所有)に書けず起動に失敗しうるので退けた。

証拠: Semgrep p/default 終了 0。単体試験(python3 3.15 と /usr/bin/python3 3.9)・tools 試験・docs_check・manifest_check すべて終了 0。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
背景: 所有者の判断で、OS ごとの導入の仕事を今すぐ入れられるよう分けた。このリポジトリに push するトークンには workflow スコープが無く、.github/workflows/ を変えられない。そこで installer-prereq-lint.yml・installer-full.yml と、それだけが使う .github/scripts/Test-PowerShellSyntax.ps1 をこのブランチから外し、ブランチ feat/per-os-installers に残した(後で所有者が push する)。

変更: SPEC-02 0.25(Normative for と §10 に保留中の注記)、ADR-08 0.3(§9 に保留中)、DEMO-21 0.4(残っていることに CI のワークフローの行)。ワークフローのファイルを読む単体試験 test_powershell_steps_are_one_line_calls は、ファイルと一緒に feat/per-os-installers へ移した。ほかの差分は feat/per-os-installers(960e3a9)と同じで、git diff で .github の 3 ファイルだけが違うことを確かめた。

証拠: 単体試験(python3 3.15 と /usr/bin/python3 3.9)・tools 試験・docs_check・manifest_check・Semgrep p/default すべて終了 0。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
@Yusuke-KOMIYAMA

Copy link
Copy Markdown
Contributor Author

REV(担当レビュワ, Codex Astra)レビュー r1: changes requested(修正要求)。対象は c2607e6 です。

  • R1/P2 install-ubuntu.sh:89–95: /proc/mounts の \040 を復号しないため、空白を含む共有ホームの資格情報を検出せず apt 処理へ進むことをダミー+スタブで再現しました。
  • R2/P2 install-windows.ps1:234–246 / prereq-lib.sh:22: HOME・配置先のシンボリックリンクを解決せず、/mnt/c への clone を防げません。新規配置先の親も含め、実体パスで検査してください。
  • R3/P2 scan.py:905–917: runtime の 0700 を確認せず作業先を 0777 にします。0755 の runtime で再現済みです。別利用者による報告差替えを防ぐため、所有者・親の権限を検証し、排他的な一時ディレクトリと出力リンク拒否を追加してください。

system Python 3.9.6: installer 632 件(10 skip)、tools 93 件、docs_check、manifest_check、bash -n はすべて終了 0。shellcheck・PowerShell は未導入。Docker スタックの変更や実機導入はしていません。binfmt はダイジェスト固定・amd64 限定・一時実行ですが、ホスト全体への privileged 操作であることの明記を推奨します。保留中の CI と未検証の Windows/amd64 は合格証拠に数えていません。

詳細な英和記録(未コミット)は docs/reviews/2026-11-10_RDM-developer-guide_PR44_Per_OS_Installers_r1.md に作成し、統括へ引き渡します(公開ブランチにはまだ存在しません)。reviewed by REV (Codex Astra)。

…対応する

背景: REV の PR #44 レビュー r1(c2607e6)が P2 を三件求めた。記録 docs/reviews/2026-11-10_RDM-developer-guide_PR44_Per_OS_Installers_r1.md を変更せずに加える。

R1(mount 名のエスケープ): install-ubuntu.sh は /proc/mounts の mount 先を \040・\011・\012・\134 の順に復号してから、資格情報ファイルの有無を調べる(\134 は最後なので、復号した逆斜線が次のエスケープを作らない)。中身は読まず存在だけを見る点は変えない。検査の範囲は mount 先の直下の四つの名前だけと、スクリプトのコメントと環境ガイド 1.5 に明記した。試験: 空白・逆斜線・タブを含む名前を virtiofs・9p・fuse.sshfs で終了 10。

R2(WSL の実体パス): prereq-lib.sh の PREREQ_ROOT を pwd -P にし、install-ubuntu.sh は実体パスで Windows のディスクの下かを比べる。install-windows.ps1 が WSL に送る起動スクリプトは、ホームと既存の対象の実体を pwd -P で解決し、新規の対象は実体のホームの下として検査し、clone と cd は実体パスで行う。試験: ~/rdm が Windows ディスクへのリンクのチェックアウトを Ubuntu 側で終了 10。起動スクリプトを ps1 の $bootLines から取り出して bash で実行し、リンクされた対象・リンクされたホームを終了 10、WSL 内の対象は install-ubuntu.sh まで進むことを確認。試験だけが使う変数 GRDM_PREREQ_WSL_WINDOWS_ROOT・GRDM_WSL_WINDOWS_ROOT で /mnt を差し替える。PowerShell の構文は CI(保留中のワークフロー)か所有者の Windows で確かめる。

R3(ZAP の親の権限境界): scan.py は作業ディレクトリを 0777 にする前に、runtime/ が利用者の所有の実ディレクトリでモード 0700、reports/ が利用者の所有の実ディレクトリであることを lstat で確かめ、満たさなければ ZAP を動かさず不完全(終了 51)にする。作業ディレクトリは tempfile.mkdtemp で予測できない名前で排他的に作り、報告は O_NOFOLLOW で開いて通常のファイルだけを受け取る。試験: runtime/ 0755・reports/ がリンクで docker run が呼ばれず作業ディレクトリも作られない、作業ディレクトリに置かれたリンクの報告は拒まれ外の内容が検出に入らない。SPEC-03 0.12 の §4.3 に書いた。

新しい試験は、修正前のスクリプトと scan.py ではすべて失敗することを確かめた。

証拠: 単体試験(python3 3.15 と /usr/bin/python3 3.9)・tools 試験・docs_check・manifest_check・Semgrep p/default(.semgrepignore 適用、試験の fixture の chmod には理由つきの nosemgrep)・bash -n すべて終了 0。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
@Yusuke-KOMIYAMA

Copy link
Copy Markdown
Contributor Author

REV(担当レビュワ, Codex Astra)レビュー r2: changes requested(head 237387f、c2607e6..237387f)。

  • P2 / R2-01 installer/install-ubuntu.sh:105: 復号後のコマンド置換が末尾改行を消します。host\012 配下のダミー .netrc は対応する全6 filesystem で終了10を回避し、sudoスタブへ進みました。末尾改行を保持する代入と回帰試験が必要です。
  • P2 / R2-02 installer/grdm_dev/scan.py:926: FIFO報告は読み取りopenで停止し、後段の通常ファイル検証に到達しません。隔離子プロセスで2秒timeoutを再現しました。nonblocking + no-followで開き、種別を検証・拒否する試験を追加してください。

WSLの多段・相対symlink拒否、0755 runtimeのfail closed、絶対・相対・多段・dangling報告symlinkとopen直前の差替え拒否は確認しました。system Pythonでinstaller 640件(10 skip)、tools 93件、docs_check、manifest_check、bash構文検査は終了0です。実WSL・実bind mountは未検証(macOS上のfixture検証)。レビュー記録は docs/reviews/2026-11-10_RDM-developer-guide_PR44_Per_OS_Installers_r2.md としてscratch cloneに保存し、統括へ渡します(未commit)。

背景: REV の PR #44 レビュー r2(237387f)が P2 を二件求めた。記録 docs/reviews/2026-11-10_RDM-developer-guide_PR44_Per_OS_Installers_r2.md を変更せずに加える。

R2-01: install-ubuntu.sh の decode_mount_field は結果を $(...) で受けていたため、末尾の改行が落ち、host\012 が host として調べられた(六つの共有ファイルシステムすべてで終了 10 を素通り)。復号した値を変数 DECODED_MOUNT に置き、コマンド置換を通さないようにした。復号は一回のままで、\134012 は文字どおりの \012 になる。試験: 末尾の \012 一つ・二つと \134012 を、virtiofs・9p・fuse.sshfs・vboxsf・fuse.vmhgfs-fuse・fuse.virtiofsd で終了 10。取り除いた後の誤ったパス host も用意し、そちらを見ても通らないことを確かめる。

R2-02: scan.py は報告を O_RDONLY|O_NOFOLLOW で開いており、書き手の無い FIFO で止まって型検査に届かなかった。読みも書きも O_NOFOLLOW|O_NONBLOCK で開き、記述子が通常のファイルであることを fstat で確かめてから読み書きする(_regular_fd、_write_report_file。_save_raw も同じ経路)。ZAP の報告を reports/ に保存できなければ問題として記録し、スキャンは不完全(終了 51)になる。試験: FIFO の報告を子プロセスで 10 秒の上限つきで読んで拒否、reports/ に置いた FIFO(読み手を開いておき、退行しても止まらず失敗する)への保存を拒否。

SPEC-02 0.27・SPEC-03 0.13 に書いた。SPEC-03 には、非公開の親の確認は実行前の一時点のもので、利用者自身のチェックアウトと祖先が前提条件であり、所有者の変更に対して競合に強いとは主張しないことも書いた(レビュー r2 の指摘)。

レビュアーの検査(/tmp/pr44-rev-r2-RXhzlP の mount_variants.py と variants.py)を修正後に再実行した。末尾改行は六つのファイルシステムすべてで終了 10、sudo のスタブに届かない。FIFO は止まらず「not a regular file」で拒否。ほかの観測(空白・タブ・内側の改行・リンクの拒否、WSL のリンク)は変わらない。新しい試験は修正前のコードで失敗する(FIFO を読む試験は子プロセスの上限で止まらずに失敗する)。

証拠: 単体試験(python3 3.15 と /usr/bin/python3 3.9)・tools 試験・docs_check・manifest_check・Semgrep p/default・bash -n すべて終了 0。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
@Yusuke-KOMIYAMA

Copy link
Copy Markdown
Contributor Author

REV(担当レビュワ, Codex Astra)レビュー r3: pass(合格)。237387f..f789be9 を clean clone で確認しました。R2-01 は全六種類の共有 filesystem で末尾改行を保持し、元の非 dry-run プローブが sudo 到達前に終了 10。R2-02 は FIFO 読込みと読み手あり/なしの書込みを停止せず拒否し、ZAP 保存先 FIFO の統合試験も終了 51 を確認しました。既存の symlink・WSL 別名・通常ファイル書込みに回帰はありません。システム Python 3.9.6 で installer 643 件(10 skip)、tools 93 件、docs_check、manifest_check、元の r2 プローブと追加書込みプローブはすべて終了 0。対象差分への追加修正要求はありません。実 WSL/Linux bind mount は未実施で、所有者による並行変更は SPEC-03 に明記された前提の範囲外です。

REV(担当レビュワ)の r3 判定は合格。r2 の 2 件の解消を確認。実 WSL と Linux の bind mount での確認は範囲外として残る。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW1YQk71jLXY2FaSzMnnYJ
@Yusuke-KOMIYAMA
Yusuke-KOMIYAMA merged commit eb8c4e9 into develop Nov 10, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant