テストの前提: 監視の上限を環境変数で延ばしたシェルでは既定値を前提にするテストが落ち、収束ループの初期化が中断する → テストの実行中は監視の環境変数を共通の前提で外す(#678) - #797
Conversation
無進捗の許容と打ち切りの上限を環境変数で延ばしたシェルから全体のテストを起動すると、 表の既定値を前提にするテストが既定値ではなくその値を読み、変更の中身と関係なく落ちて いた。収束ループの初期化は着手前のテストの通過を条件にするため、そこで止まる。 リポジトリ直下の共通の前提へ、接頭辞 MONITOR_ を持つ環境変数を外す仕組みを足す。収集より 前に外し(pytest_configure)、実行が終わった時点で元の値へ戻す(pytest_unconfigure)。 テストの本体を読み込む時点で上限を決めてしまう実装があるため、セッションの前提では 間に合わない。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MGCedPTy818Zw7VYdmE4GB
1 変数ずつ外す 20 箇所と、接頭辞でまとめて外す 7 箇所を削除する。接頭辞を持つ名前は 上限の種類が増えるたびに増えるため、名前を並べる形では足し忘れが同じ形で再発する。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MGCedPTy818Zw7VYdmE4GB
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | agy | REQUEST_CHANGES
共通の前提による監視環境変数の切り離しおよび散在していた除去の集約は適切ですが、受け入れ条件 6 を検証するテストで pytest_unconfigure が呼び出されておらず検証漏れとなっているため、テストの修正を提案します。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | kiro | REQUEST_CHANGES
除去を根の conftest.py の pytest_configure へ一本化し、各テストの monkeypatch.delenv と _clean_env を消した結果、実行の起点がテストのディレクトリのとき(rootdir が根まで遡らず根 conftest が読まれないとき)に MONITOR_* の切り離しが効かず、test_limits.py(16 failed)と test_monitor_stall_default.py(3 failed)が env 設定時に落ちる。PR 本文の実測は根からの全体実行だけを見ており、サブディレクトリ起点は範囲に入っていない。散った除去を根へ寄せる方針は良いが、起点に依らず効く形(例: 各束の tests/conftest.py から共通除去を委譲呼び出しする)に補うことを提案する。詳細は各インライン参照。
テストの基準のディレクトリ(rootdir)は、起点から上へ設定ファイルを探して最初に 見つかったところで止まる。リポジトリの根に設定ファイルが 1 つも無いため、テストの束の ディレクトリを起点にすると基準がそこで止まり、根の共通の前提が読み込まれなかった。 上限を延ばしたシェルから束を起点に起動すると、監視の上限を前提にするテストが落ちる。 根に設定ファイルを 1 つ置き、基準をリポジトリの根へ固定する。設定値は足さない。 外した値を戻す検査は、控えを手で操作せずに外す側と戻す側を実際に呼ぶ形へ直した。 起点に依らず切り離しが効くことを、束のディレクトリからの起動で確かめる検査を足した。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MGCedPTy818Zw7VYdmE4GB
/ndf:fix サマリ(round 1)対応件数: critical=0 / major=3 / minor=0(合計 3 件) 直し方3 件のうち 2 件は同じ原因でした。テストの基準のディレクトリ(rootdir)は起点から上へ設定ファイルを探して最初に見つかったところで止まるため、リポジトリの根に設定ファイルが 1 つも無いと、束のディレクトリを起点にした実行で基準がそこで止まり、根の共通の前提が読み込まれません。 根に設定ファイル(
残る 1 件は、外した値を戻す検査が控えを手で操作していた点です。外す側と戻す側を実際に呼ぶ形へ直し、戻した後に控えが空になっていることまで確かめます。起点に依らず切り離しが効くことを確かめる検査も足しました。 対応した指摘
検証足した検査が実際に落ちることも確かめました。戻す側の本体を |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | kiro | COMMENT
除去の共通化・pytest.ini による rootdir 固定・散った除去の削除(AC5)は実測で確認でき、環境変数を設定したシェルでも影響範囲の束は全て通った。設計・正確性の修正指摘はなし。テストの実証性に minor を 1 件だけインラインで残す。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | APPROVE
修正が必要な指摘はありません。指定の全体テストは 4609 件すべて通過しました。
実行中に監視の上限を指す環境変数が残らないことと、子プロセスへ引き継がれないことを 確かめる 2 つは、周りのシェルがその環境変数を持たないときに、外す仕組みを壊しても 素通りしていた。継続的統合と多くの手元の環境がこれに当たる。 確かめる前に自分で 1 つ差し込む形へ直した。根の設定は別名で読み込み、控えを汚さない。 外す側を呼んだ後に戻す側も呼び、元の状態へ戻す。 外す側の本体を一時的に何もしない形へ置き換えると、この 2 つが落ちることを確かめた。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MGCedPTy818Zw7VYdmE4GB
/ndf:fix サマリ(最終スイープ)対応件数: critical=0 / major=0 / minor=1(合計 1 件) 詳細
周りのシェルが監視の上限を指す環境変数を持たないと、外す仕組みを壊しても 2 つが素通りしていた。根の設定を別名で読み込むヘルパを使い、環境変数を 1 つ設定してから外す側を呼び、消えていること・子プロセスへ引き継がれないことを確かめる形にした。控えは汚さず、 恒真でなくなったことは、外す側の本体を一時的に何もしない形へ置き換えて確かめた(2 つとも落ちる)。置き換えは元へ戻した。 検証
2 つのシェルで件数が一致する。本文の検証結果と受け入れ条件の表も、この実測へ揃えた。 継続的統合: 失敗したジョブは 0 件( |
Summary
無進捗の許容と打ち切りの上限は、接頭辞
MONITOR_を持つ環境変数で延ばせる。運用でこれを延ばしたシェルから全体のテストを起動すると、表の既定値を前提にするテストが既定値ではなく
その値を読み、変更の中身と関係なく落ちていた。収束ループ(
cross-refactoring)の初期化は着手前のテストの通過を条件にするため、上限を延ばしたシェルでは初期化がそこで止まる。
テストの実行中だけ、接頭辞を持つ環境変数を外す。 置き場所はリポジトリ直下の共通の前提
(
conftest.py)とし、git の全体設定・実行の要約の置き場所と同じ形で扱う。収集より前に外す(
pytest_configure)。テストの本体を読み込む時点で上限を決めてしまう実装があり、セッションの前提では間に合わない。実行が終わった時点で元の値へ戻す(
pytest_unconfigure)。テストごとに散っていた同じ除去を、この共通の前提へ寄せた。
接頭辞を持つ名前は、上限の種類が増えるたびに増える。名前を並べずに接頭辞だけで一致させて
おくと、種類を足したときに除去を足し忘れても同じ切り離しが効く。
起点のディレクトリに関わらず、共通の前提が効くようにした。 テストの基準のディレクトリ
(rootdir)は、起点から上へ設定ファイルを探して最初に見つかったところで止まる。リポジトリの
直下には設定ファイルが 1 つも無かったため、テストの束のディレクトリを起点にすると基準が
そこで止まり、共通の前提が読み込まれていなかった。直下に設定ファイル(
pytest.ini)を1 つ置き、節の宣言だけを書いて設定値は足していない。各束へ同じ除去を配る形を採らないのは、
束が増えるたびに置き忘れるためである。
関連する issue: Fixes #678
受け入れ条件:
issues/issue-678-requirements.mdTest plan
この変更の検証は、環境変数を設定したシェルと、していないシェルで結果が同じになることである。
同じコマンドを 2 回実行して突き合わせた。実行は 2026-09-22 03:37〜03:52 UTC、対象は
8057d86e。uv run --with pytest pytest scripts/tests plugins/ndf -q→exit=0(4609 passed in 178.77s)env MONITOR_TIMEOUT=1800 MONITOR_STALL_AGY=1800 MONITOR_STALL_CODEX=1800 MONITOR_STALL=1800 uv run --with pytest pytest scripts/tests plugins/ndf -q→exit=0(4609 passed in 177.98s)env MONITOR_TIMEOUT_AGY=1800 MONITOR_STALL_AGY=1800 uv run --with pytest pytest scripts/tests plugins/ndf -q→exit=0(4609 passed in 176.90s。着手前に落ちていた組み合わせ)env MONITOR_TIMEOUT=1800 MONITOR_STALL_AGY=1800 uv run --project plugins/playwright-kit/skills/playwright-kit-ops --with pytest pytest . -q→exit=0(4793 passed。継続的統合と同じ起動)python3 scripts/check-skill-frontmatter.py→exit=0python3 plugins/ndf/scripts/instructions-check.py --root .→exit=0claude plugin validate .→exit=0python3 scripts/check-doc-staleness.py→exit=0python3 scripts/check-markdown-links.py --root .→exit=0bash scripts/build-runtime-plugins.sh→exit=0(生成物に差分なし)起点のディレクトリを変えた実行も確かめた。 テストの束のディレクトリを作業ディレクトリに
して起動する形である。
cd plugins/ndf/skills/cross-review/tests && env MONITOR_STALL_AGY=1800 MONITOR_TIMEOUT=1800 uv run --with pytest pytest test_monitor_stall_default.py -q→exit=0(9 passed)cd plugins/ndf/scripts/tests && env MONITOR_TIMEOUT=1800 MONITOR_STALL_AGY=1800 uv run --with pytest pytest test_limits.py -q→exit=0(63 passed)着手前(
origin/develop)の同じ 2 回は次のとおりだった。増えた 6 件は、共通の前提を確かめるために足したテストである。
受け入れ条件の判定:
test_no_monitor_variable_survives_into_a_testとtest_the_child_process_does_not_inherit_a_monitor_variable。どちらも確かめる前に接頭辞を持つ環境変数を 1 つ差し込む。外す側の本体を何もしない形へ置き換えると落ちることを確かめた)test_a_test_can_still_set_its_own_monitor_variable)test_the_values_are_put_back_after_the_run。外す側と戻す側を直接呼び、戻した後に控えが空になることまで確かめる)未検証の項目: なし
既存の失敗: なし
範囲外と判断したもの: 上限の解決順と表の既定値。どちらもこの変更では触っていない
残リスク: 接頭辞を持たない名前で上限を指す環境変数が将来足された場合、この切り離しは
当たらない。現時点で上限を指す環境変数はすべて接頭辞を持つ
(
grep -rn "MONITOR_" plugins/ndf/scripts/lib/limits.pyと監視の本体で確認した)。あわせて、
plugins/playwright-kit/skills/playwright-kit-opsは自身のpyproject.tomlにpytest の節を持つため、そのディレクトリを起点にした実行では基準がそこで止まり、この
切り離しは効かない。その束に上限を読むテストは無い
(
grep -rn "MONITOR_" plugins/playwright-kitが 0 件)。影響範囲
変えたのはテストの前提だけで、配布物には及ばない。
bash scripts/build-runtime-plugins.shは終了コード 0 で終わり、生成物に差分は出なかった。
版を上げる必要があるか
要らない。配布物が変わらないため、利用者へ届く内容に差が出ない。
文書の検査
markdown-writingのセルフチェック 6 種を、受け入れ条件(issues/issue-678-requirements.md)とこの本文に対して実行した。
🤖 Generated with Claude Code
https://claude.ai/code/session_01MGCedPTy818Zw7VYdmE4GB