何が起きたか
devbasex/devbase#199 の /ndf:cross-refactoring(ndf 10.14.0、ホスト claude)のリファクタリングの提案ラウンド(round 2)で、codex が提案 1 件を作ったのに、監視は NO_RESULT を返した。
- 監視の出力:
[codex] ❌ codex NO_RESULT (165s) — process exited but result.json missing: .../rf199/work/.cross_refactoring/codex-propose-rf199-r2-result.json
- codex の最終メッセージ(err.log の末尾): 「提案 1 件を JSON(
.../rf199/codex/codex-propose-rf199-r2-result.json)に保存しました。…指定提出先は作業ディレクトリ外のため未保存です。『外を触らない』という指示と競合するため、提出ファイルだけ例外にできるか確認待ちです」
- 同じ実行のテスト整備ラウンド(round 1)では、codex は結果を提出先へ書けていた
codex は読み取り用ディレクトリ(rf199/codex)で動き、提出先は書き込み用の rf199/work/.cross_refactoring/ にある。プロンプトの「作業ディレクトリの外を触らない」と、提出先の指定が衝突している。オーケストレーターが手で mv して取り込んだ。
期待
提出先への書き込みを、プロンプト上で明示的に例外として許すか、提出先を担当の作業ディレクトリの中に置いてオーケストレーターが回収する。
どこで見つけたか
plugins/ndf/skills/cross-refactoring/prompts/propose.md:11 の
「作業ディレクトリ: $RF_WORKDIR(ここから外は読まない・書かない)」と :90 の「作業ディレクトリの外を触らない」。
提出先を例外にする記述は無い
- 提出先は
plugins/ndf/skills/cross-refactoring/scripts/launch-cli.sh が決める。propose / plan は
STEM=$TMP_DIR/$RUNTIME-$PHASE-rf$ID・WORKDIR=$ROOT/$RUNTIME(:56-57)で、結果ファイルが読み取り用の作業ディレクトリの外に置かれる。
add-tests / implement / fix は WORKDIR=$WORK で、同じ衝突は起きない
- cross-review のレビュー担当は、一時ディレクトリを
<worktree>/.cross_review/ に置く(cross-review/docs/04-contracts.md:405)ため、同じ衝突は無い
直し方
2 段に分ける。
| 段 |
中身 |
| 短期の手当て |
プロンプトへ「提出先の結果ファイルだけは書いてよい」を 1 行足す |
| 本来の形 |
提出先を担当の作業ディレクトリの中に置き、オーケストレーター(起動層)が回収する。plugins/ndf/skills/external-ai/scripts/external-ai.py run の --output-file と三段の回収(結果ファイル → stdout → stderr)の契約に揃える |
短期の手当てだけを入れると、提出先と回収の契約を起動層へ移すときに文言が再び変わる。
修正レイヤー
結果ファイルの置き場所と回収の契約(plugins/ndf/scripts/lib/launch-cli.sh / monitor.py、external-ai.py run)。
関連
由来
devbasex/devbase#197 の振り返り。
何が起きたか
devbasex/devbase#199 の
/ndf:cross-refactoring(ndf 10.14.0、ホスト claude)のリファクタリングの提案ラウンド(round 2)で、codex が提案 1 件を作ったのに、監視はNO_RESULTを返した。[codex] ❌ codex NO_RESULT (165s) — process exited but result.json missing: .../rf199/work/.cross_refactoring/codex-propose-rf199-r2-result.json.../rf199/codex/codex-propose-rf199-r2-result.json)に保存しました。…指定提出先は作業ディレクトリ外のため未保存です。『外を触らない』という指示と競合するため、提出ファイルだけ例外にできるか確認待ちです」codex は読み取り用ディレクトリ(
rf199/codex)で動き、提出先は書き込み用のrf199/work/.cross_refactoring/にある。プロンプトの「作業ディレクトリの外を触らない」と、提出先の指定が衝突している。オーケストレーターが手でmvして取り込んだ。期待
提出先への書き込みを、プロンプト上で明示的に例外として許すか、提出先を担当の作業ディレクトリの中に置いてオーケストレーターが回収する。
どこで見つけたか
plugins/ndf/skills/cross-refactoring/prompts/propose.md:11の「作業ディレクトリ:
$RF_WORKDIR(ここから外は読まない・書かない)」と:90の「作業ディレクトリの外を触らない」。提出先を例外にする記述は無い
plugins/ndf/skills/cross-refactoring/scripts/launch-cli.shが決める。propose/planはSTEM=$TMP_DIR/$RUNTIME-$PHASE-rf$ID・WORKDIR=$ROOT/$RUNTIME(:56-57)で、結果ファイルが読み取り用の作業ディレクトリの外に置かれる。add-tests/implement/fixはWORKDIR=$WORKで、同じ衝突は起きない<worktree>/.cross_review/に置く(cross-review/docs/04-contracts.md:405)ため、同じ衝突は無い直し方
2 段に分ける。
plugins/ndf/skills/external-ai/scripts/external-ai.py runの--output-fileと三段の回収(結果ファイル → stdout → stderr)の契約に揃える短期の手当てだけを入れると、提出先と回収の契約を起動層へ移すときに文言が再び変わる。
修正レイヤー
結果ファイルの置き場所と回収の契約(
plugins/ndf/scripts/lib/launch-cli.sh/monitor.py、external-ai.py run)。関連
external-ai.py runにした。--output-fileと三段の回収を持つ由来
devbasex/devbase#197 の振り返り。