Repository navigation
[tests][planner] issue458 の昇格失敗の試験が読み取り専用の権限に頼り、root(Docker の uid 0)で落ちる #676
Copy link
Copy link
Closed
Description
背景
#667 の mutants を Docker で流したとき(L-47、2026-10-14)、変異なしの baseline が次の 1 本で止まりました。
planner::auto_recovery::tests::issue458::tests::issue458_finish_terminal_observation_and_transaction_matrix
- 結果:
promotion: unexpected promotion(src/planner/auto_recovery/issue458_tests.rs:509) - 同じイメージで、その 1 本だけを uid 0 と uid 1000 で流すと、uid 0 では FAILED、uid 1000 では ok でした(
workspace/tmp/1007/wave1/results/L-47/diag-root.txt)。
L-47 以降の Docker の run は、非特権ユーザーを作って回避しています。#673 は、signal・削除を変異させる試験を隔離環境(Docker)で流すことを求めているので、root の container で baseline が落ちると、毎回その手間がかかります。また「baseline が落ちた」という誤った判断の元にもなります。
関連:#667、#673
問題
- P1:
promotionの mode は、workspace のapp.txtを読み取り専用(set_readonly(true))にして、昇格の書き込みを失敗させています。root は DAC を無視するので、書き込みは成功して昇格が起き、試験が落ちます。製品の欠陥ではなく、試験が権限に頼っていることの問題です。 - P2:root で黙って skip すると、その mode(昇格が失敗したら control を残す)の確認がなくなります。これは検証を緩めることになるので、とりません。
- P3:同じく権限に依存する試験がほかにもあり、扱いがそろっていません。
src/tools/path_guard.rs:989〜:993:権限が効かないと黙って return する。tests/missing_read_paths.rs:225〜:236:「run under an unprivileged account」と言って落ちる。src/planner/recovery_contract_binding.rs:275:試験で読み取り専用にしている。root で落ちるかは未確認。
根拠(develop 739c441c)
src/planner/auto_recovery/issue458_tests.rs:395:試験の本体。src/planner/auto_recovery/issue458_tests.rs:432〜:436:promotionの mode でapp.txtを読み取り専用にする。src/planner/auto_recovery/issue458_tests.rs:509:昇格が失敗したことを確かめる。- 昇格の経路:
src/planner/auto_recovery.rs:1778→src/planner/recovery_snapshot.rs:229(promote_treatment)→:331(sync_source_tree)→:351(std::fs::copy)。 - 故障注入の前例:
src/tools/os_sandbox/landlock.rs:696のtest_hooks(#[cfg(test)]のAtomicBoolで、失敗を強制する)。
対処の方向
promotionの mode の失敗を、権限に頼らない形にする。案:src/planner/recovery_snapshot.rsに#[cfg(test)]の故障注入の hook を置き、sync_source_treeの copy を失敗させる(landlock のtest_hooksと同じ形)。読み取り専用の設定は、uid 1000 で今の経路を確かめるために残してもよい。- hook は試験の build だけに入れ、製品の挙動は変えない。並列の試験に漏れないよう、同じ試験の中で必ず元に戻す(
Dropで戻す guard など)。 - P3 の 3 本の扱いを分類する。どうしても権限が要る試験は、
tests/missing_read_paths.rsと同じく、理由を出して落ちる形にそろえる。黙った return(path_guard.rs:990)は、理由を出す形に直すか、権限に頼らない形にする。 docs/dev/parallel-dev-harness.mdの mutants・Docker の規則に、uid 1000 で流すことを書く([tests][mutants] 変異試験が防御を外したまま kill(-1) などを実行し、利用者の全プロセスを止める #673 の規則と合わせる)。
受け入れ条件
-
issue458_finish_terminal_observation_and_transaction_matrixが uid 0 と uid 1000 の両方の Docker で pass し、promotionの mode が実際に昇格の失敗の経路を通る(treatment_promotion_failed:の event が出る) - 二点測定:hook による失敗を外すと、uid 0 で
promotionの mode が落ちる - 製品の build に hook が入らない(
#[cfg(test)])。製品の挙動・event・schema は変わらない - P3 の 3 本を分類した。黙って成功扱いになる試験を残していない(残すならその理由を書いた)
- 検証・受入・証跡のゲートを緩めていない。成長上限の baseline を上げていない
対象ファイル
src/planner/auto_recovery/issue458_tests.rssrc/planner/recovery_snapshot.rssrc/tools/path_guard.rstests/missing_read_paths.rssrc/planner/recovery_contract_binding.rsdocs/dev/parallel-dev-harness.md
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
Merge pull request #681 from Kewton/feature/issue-676-tests-planner-i…
Kewton commentedon Oct 15, 2026
PR #681 で merge しました(develop
cde19baea311b50d83fa19174db576be38f7a1f7)。develop の CI・acceptance・Next.js domain oracles はすべて success です。promotionの mode は、#[cfg(test)]の故障注入の hook(thread-local、workspace のパスで絞る、Drop で戻る)によって昇格の失敗の経路を通ります。promotion: unexpected promotionで落ちました。HEAD では pass しました。path_guardの黙った return は、理由を出して落ちる assert にしました。missing_read_pathsは理由の文が必ず出るようにしました。この 2 本は uid 0 では理由を出して落ちます(対処の方向 3 どおり)。recovery_contract_bindingは readonly のビットだけを見ているので、uid 0 でも pass します(変更なし)。