何を見つけたか
PATH に読めないディレクトリ があると、参加者の CLI が入っていないときに cross-review の init が終了コード 0 ではなく、トレースバックを出して終了コード 1 で落ちる。#478 が直した「CLI が 1 者欠けても使える者だけで始まる」が、この PATH では成り立たない。
再現(ndf 10.16.0、2026-09-22T15:2xZ):
cd plugins/ndf/scripts
python3 -c " import sys; sys.path.insert(0,'.'); from lib import auth; print(auth._run_probe(('ndf-no-such-cli-xyz','--version')))"
# => PermissionError: [Errno 13] Permission denied: 'ndf-no-such-cli-xyz'
この環境の PATH は 13 番目に /root/.local/bin を持ち、実行している利用者(ubuntu)からは読めない(ls: cannot open file '/root/.local/bin': Permission denied)。subprocess.run は PATH を順に探し、見つからないまま読めないディレクトリに当たると FileNotFoundError ではなく PermissionError を上げる。
どこで見つけたか
plugins/ndf/scripts/lib/auth.py の _run_probe(56 行)。except FileNotFoundError: と except subprocess.TimeoutExpired: だけを捕まえ、docstring の「例外は上げない」が成り立たない
見つけた場面: ndf 10.16.0 のリリース後テストの AC45(kiro-cli を PATH から隠して PR 検証用: ndf 10.16.0 のリリース後テスト(マージしない) #812 で init)。PATH から /root の項目を外すと終了コード 0 で通り、席は codex agy の 2 席になった
同じ関数を通るため cross-refactoring の init も落ちる見込み(コードから読んだだけで実行はしていない)
なぜこの変更の範囲外なのか
#478 / #727 の受け入れ条件は「CLI が無い環境で init が終了コード 0 で終わる」で、テストと PATH が素直な環境では満たした。読めないディレクトリを PATH に持つ環境は要求・設計の時点で想定しておらず、リリース後テストで初めて踏んだ。リリース後テストで見つかった不具合は配布した版で直さず、別のまとまり(10.16.1)で直す。
直さないと何が起きるか
PATH に読めない項目を持つ環境(コンテナで root の設定を継いだ場合など)では、参加者の CLI が 1 つでも入っていないと cross-review / cross-refactoring が始まらない。#478 の直す前と同じ症状に戻る。直し方の候補は except OSError で捕まえて「コマンドを実行できません(<理由>)」として外すこと。
由来
issue #478 のリリース後テスト(PR #810 / 検証用 PR #812 、ndf 10.16.0)
進行
モード: standard / 作業ツリー: .worktrees/fix/issue-811-813-release-verification-fixes / 計画: issues/issue-811-813-implementation-plan.md
閉じる理由(2026-09-22)
振り返り: #832 (comment)
何を見つけたか
PATH に読めないディレクトリがあると、参加者の CLI が入っていないときに
cross-reviewのinitが終了コード 0 ではなく、トレースバックを出して終了コード 1 で落ちる。#478 が直した「CLI が 1 者欠けても使える者だけで始まる」が、この PATH では成り立たない。再現(ndf 10.16.0、2026-09-22T15:2xZ):
この環境の PATH は 13 番目に
/root/.local/binを持ち、実行している利用者(ubuntu)からは読めない(ls: cannot open file '/root/.local/bin': Permission denied)。subprocess.runは PATH を順に探し、見つからないまま読めないディレクトリに当たるとFileNotFoundErrorではなくPermissionErrorを上げる。どこで見つけたか
plugins/ndf/scripts/lib/auth.pyの_run_probe(56 行)。except FileNotFoundError:とexcept subprocess.TimeoutExpired:だけを捕まえ、docstring の「例外は上げない」が成り立たないkiro-cliを PATH から隠して PR 検証用: ndf 10.16.0 のリリース後テスト(マージしない) #812 でinit)。PATH から/rootの項目を外すと終了コード 0 で通り、席はcodex agyの 2 席になったcross-refactoringのinitも落ちる見込み(コードから読んだだけで実行はしていない)なぜこの変更の範囲外なのか
#478 / #727 の受け入れ条件は「CLI が無い環境で
initが終了コード 0 で終わる」で、テストと PATH が素直な環境では満たした。読めないディレクトリを PATH に持つ環境は要求・設計の時点で想定しておらず、リリース後テストで初めて踏んだ。リリース後テストで見つかった不具合は配布した版で直さず、別のまとまり(10.16.1)で直す。直さないと何が起きるか
PATH に読めない項目を持つ環境(コンテナで root の設定を継いだ場合など)では、参加者の CLI が 1 つでも入っていないと
cross-review/cross-refactoringが始まらない。#478 の直す前と同じ症状に戻る。直し方の候補はexcept OSErrorで捕まえて「コマンドを実行できません(<理由>)」として外すこと。由来
issue #478 のリリース後テスト(PR #810 / 検証用 PR #812、ndf 10.16.0)
進行
モード: standard / 作業ツリー:
.worktrees/fix/issue-811-813-release-verification-fixes/ 計画:issues/issue-811-813-implementation-plan.md閉じる理由(2026-09-22)
コマンドを実行できません(<理由>)として返すようにした(except OSError)mainへ、タグndf--v10.16.1)/root/.local/binを含むPATHでkiro-cliだけを隠し、検証用 PR 検証用: 10.16.1 のリリース後テスト AC12(マージしない) #833 でstate.py init→start-roundを実行。init exit=0 / start-round exit=0 /REVIEWERS='codex agy'/ 外した者kiro(コマンドを実行できません(Permission denied))。同じ手順を 10.16.0 の導入先へ向けるとPermissionError/ exit=1 で、版を見分けられる。記録: Release: ndf v10.16.1 #831 (comment)振り返り: #832 (comment)