Repository navigation
Description
同じ根本原因を持つ課題(子 issue)を、現れている場所ではなく根本原因の場所で直すための親 issue である(backlog-refinement の判定「ルートコーズ」)。再現手順と観測は各子 issue にある。
修正レイヤー
プラグインの実体(どのランタイムの、どの版の scripts/ と skills/)を選ぶ規則。 規則が 2 系統に分かれ、それぞれが別の実体を選ぶ。
| 系統 | 場所 | 選び方 |
|---|---|---|
| Skill から呼ぶスクリプト | plugins/ndf/skills/development-workflow/references/scripts-lookup.md と、その写し 4 か所(cross-refactoring/SKILL.md・cross-review/docs/01-state-and-review.md・fix/SKILL.md・statusline/SKILL.md) |
開発中のリポジトリを先に見る候補を持つのは scripts-lookup.md だけで、写しは ${CLAUDE_PLUGIN_ROOT} → この Skill のディレクトリ → .kiro の順。参照ファイルの中では ${CLAUDE_PLUGIN_ROOT} が置き換わらず、Bash の実行環境にも無いため、別ランタイムの控えへ落ちる |
| hook | plugins/ndf/skills/development-workflow/SKILL.md の frontmatter(9 行)と plugins/ndf/hooks/claude.json |
frontmatter は ${CLAUDE_PLUGIN_ROOT} だけ、hooks/claude.json は 9・49・63・77・147 行(hook.py。49 行は #1492 の goal-skill)と 91・98・105 行(シェルの hook)が ${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}、22・36・117・154・167 行(relay.py。167 行は #1389 の limit)と 125 行(training-optout.py、#1597 で追加)と 133 行(context-policy.py)と 180 行(usage-subagent.py、#1953 で追加)が ${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-}} と順序が逆である。PLUGIN_ROOT で開発中の版へ向ける経路はあるが、文書に無い |
開発中のリポジトリでは、記録のスクリプトが開発中の版から、hook が配布済みの版から動く。利用者の環境でも、Claude Code で scripts-lookup.md を実行すると Codex の古い版の scripts/ を選ぶ。
この issue が持つ範囲
Skill から呼ぶスクリプトの系統は #847 が持つ。 #847(マイルストーン「20 置き場所と起点の解決」)が scripts-lookup.md を正本にして解決を 1 本のコマンドにまとめ、写しを消す。#847 と子 #590 #534 は閉じている。着手の条件(#847 の後)は満たされている。
この issue に残るのは hook の系統である。
- frontmatter と
hooks/claude.jsonの選び方の食い違い(relay.pyの 5 行とtraining-optout.py・context-policy.py・usage-subagent.pyの各 1 行の順序の逆転を含む) - 開発中のリポジトリで hook と Skill が同じ版を選ぶことを確かめる検査
- 開発中の版へ向ける手段と、向けられない間の回避
PR #844(#829 / #830 の実装。マージ済み)で hook が増え、この規則の対象が増えた。#1142 の決定 20(スプリント 2b の移行ステップ D5)で、hook を 1 本の Python のエントリポイント(scripts/hook.py)へまとめ、hook のコマンドを SessionStart が用意した環境の bin/python へ向けた(D5(f04abfad)で置き換えた。issues/issue-1142-design-libraries.md)。relay.py の行は python3 のまま残る。
子 issue はすべて閉じた。残るのは hook の系統の 3 点(上の箇条)で、2026-10-13 の develop(3f933a70e、ndf 10.17.74)でも順序の逆転は残り、#1953 で足した usage-subagent.py の行も同じ逆の順序で入った。
PLUGIN_ROOT と CLAUDE_PLUGIN_ROOT に別の実体を与えると、hook.py 系は PLUGIN_ROOT、relay 系は CLAUDE_PLUGIN_ROOT を選ぶ(2026-10-11 に展開して確認)。
修正方針
- 移動(
move_responsibility): hook と Skill 側の選び方の食い違いを、基盤: スクリプトの置き場所($SCRIPTS / SKILL_DIR)の解決を 1 本のコマンドにする #847 の解決の規則へ寄せ、開発中の版へ向ける手段と回避を同じ場所に書く
子 issue
| 子 issue | 現象レイヤー | 観測 | 状態 |
|---|---|---|---|
| #459 | 工程名を記録する hook | 開発中の版で記録した工程名が、配布済みの版の hook に無く捨てられる | 閉じた(2026-10-01、not planned) |
| #590 | Claude Code での $SCRIPTS の決め方 |
${CLAUDE_PLUGIN_ROOT} が置き換わらず、Codex の古い控えを採る |
閉じた(#847) |
| #658 | hook の反映 | 開発中に直した hook が配布まで効かず、直している間も同じ実害を踏む | 閉じた |
| #534 | cross-refactoring のスケルトン | 開発中のリポジトリで回しても、スケルトンが配布済みの版を指す | 閉じた(#847) |
完了条件
- Skill から呼ぶスクリプトの位置を決める処理が 1 か所にあり、写しが残らない(基盤: スクリプトの置き場所($SCRIPTS / SKILL_DIR)の解決を 1 本のコマンドにする #847)
- hook の frontmatter と
hooks/claude.jsonが同じ規則で実体を選ぶ - 開発中のリポジトリでは hook と Skill 側の両方が開発中の版を、利用者の環境では両方が自分のランタイムの版を選ぶことを、検査が確かめる
- 開発中の版へ向ける手段と、向けられない間の回避が、規則と同じ場所に書かれている
- 各子 issue の再現手順を実行し、現象が出ないことを確かめる(子 issue はその時点の棚卸が「閉じてよい」で閉じる)
関連
- 基盤: スクリプトの置き場所($SCRIPTS / SKILL_DIR)の解決を 1 本のコマンドにする #847 — スクリプトの置き場所の解決を 1 本のコマンドにする(Skill 側の系統)
- 待ちの問い合わせと長い conductor の工程の起動を hook で止める(#829 #830) #844 — 待つ間の繰り返し問い合わせ(sleep ループ・出力ファイルの読み直し)をやめ、完了通知か Monitor で待つ #829 / conductor の会話を工程の切れ目で切ることを hook で強制する #830 の実装。hook を足す
- Slack 通知を回答・承認待ちのときだけ送り、セッションと issue / PR の URL を載せる #821 — Slack 通知。
hooks/claude.jsonの Stop 行を共有する
Activity