## 何が起きたか 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`(**ここから外は読まない・書かない**)」と `:98` の「作業ディレクトリの外を触らない」。 提出先を例外にする記述は無い - 提出先は `plugins/ndf/skills/cross-refactoring/scripts/launch-cli.sh` が決める。`propose` / `plan` は `STEM=$TMP_DIR/$RUNTIME-$PHASE-rf$ID`・`WORKDIR=$ROOT/$RUNTIME`(`:57-58`)で、結果ファイルが読み取り用の作業ディレクトリの外に置かれる。 `add-tests` / `implement` / `fix` は `WORKDIR=$WORK` で、同じ衝突は起きない - cross-review のレビュー担当は、一時ディレクトリを `<worktree>/.cross_review/` に置く(`cross-review/docs/04-contracts.md:443`)ため、同じ衝突は無い ## 直し方 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`)。 ## 関連 - #852(closed) — 外部 CLI の起動を `external-ai.py run` にした。`--output-file` と三段の回収を持つ ## 由来 devbasex/devbase#197 の振り返り。
Activity