Skip to content

待ちの問い合わせと長い conductor の工程の起動を hook で止める(#829 #830) - #844

Merged
takemi-ohama merged 18 commits into
developfrom
feature/issue-829-830-token-waits
Sep 23, 2026
Merged

takemi-ohama merged 18 commits into
developfrom
feature/issue-829-830-token-waits

Conversation

@takemi-ohama

@takemi-ohama takemi-ohama commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Summary

#829(待つ間のポーリングをやめる)と #830(conductor の会話を工程の切れ目で切る)の実装。設計は #843(マージ済み)。

  • plugins/ndf/scripts/token-guard.sh を新設し、Claude Code の PreToolUse(Bash|Read|Skill|Agent|Task)にだけ登録した。 拒否は permissionDecision: deny と代わりの手段を書いた理由で返し、判定が失敗したときは常に通す
    • sleep: 前景の Bash で、コマンドの位置の sleepwhile / until の本体にある(秒数が変数でも止める)か 5 秒を超えると止める。& で背景へ回した sleep・囲み(( ) / { } / ループ)・bash -c / eval は止めない。bash / sh / zsh / dash-ceval の中身は、コマンドの位置にあるときだけ再帰して見る(判定は scripts/lib/token_guard_sleep.py。字句による近似で、case の囲みなどは数えない)
    • 連続 Read: 同じ範囲・変わらないファイル(大きさ・更新時刻・inode)を 3 回続けて読むと止める
    • 文脈量: 文脈が 200,000 を超えた conductor が工程 Skill(scripts/lib/token-guard-stages.txt の 13 個)か持ち場の supervisor を起動すると 1 度止め、/ndf:development-workflow #<課題> を示す。同じ起動の 2 回目は 1 度だけ通す
  • 待ち方の規約 development-workflow/references/waiting.md を新設した。 agent-layers.md の supervisor / worker の規則と、前景の待ちのループを持つ 4 文書(cli-codex.md / cli-agy.md / qa-security-scan/03-report-template.md / release/references/completion-check.md)から指す
  • context-window.md の「実測ではない」を development-workflow: トークン消費の実測と削減(supervisor をスクリプトで駆動し、判断は最小構成の claude -p に任せる) #827 の実測に置き換え、「上限を超えたら hook が止める」「新しい会話で戻す」の節を足した。development-workflow/SKILL.md に引き継ぎの 1 行の規約を足した
  • README に hook と 4 ランタイムの扱いの表を足した

確定仕様は docs/specifications/ndf-token-waits-and-context-cut.md にある(要求・設計・決定・計画の 4 本は issues/old/milestone-26-token-waits/ へ退避した)。

Closes #829
Closes #830

設計の「未確認」の決着

項目 結果
サブエージェントの hook の入力 agent_id / agent_type が付く。transcript_path親の記録を指すため、区別は agent_id で行う(Claude Code 2.1.280、claude -p --settings で実測)
記録の書き込みの時点 PreToolUse の時点で、その呼び出しの assistant 行はまだ書かれていない。1 つ以上前の呼び出しの文脈量を読む
Codex / Kiro の起動の書き方 context-window.md に「それぞれの README が示す Skill の起動の書き方に読み替える」と書いた
通知の届き方(AC11) 下の Test plan
背景の Bash の上限 確かめていない。600 秒を超える待ちは bg-wait.sh#731)の扱いのまま

構造改善と実装レビュー

  • 構造改善は利用者の指示で打ち切った。 残したのは現状固定テスト 10 件(9f12b34115385c27)で、構造改善の項目は 0 件。理由と経緯は改修計画のコメントの「打ち切り」と cross-refactoring: 変更範囲が狭くても 1 項目ごとに --baseline-test の全体テストを回し、1 項目あたりの待ちが全体テストの時間になる #880
  • 実装レビュー(/ndf:cross-review、codex + kiro)は 3 回回して承認で収束した。 1・2 回目は sleep 判定の周辺の指摘が続いて振動検知で止まり、最終スイープで直した。3 回目(確認の 1 ラウンド)で両者が承認し、未解決の指摘は 0 件。直したのは、代入語の後ろの sleep・背景実行(リダイレクトや囲みの後ろの &bash -c / eval の外側の &)・引数を取るシェルのオプション(-O-euo pipefail)・ループ内の変数の秒数・コマンドの位置でない bash -c / eval、課題番号の抽出で版数と日付を番号と読まないこと(範囲 #829-830 は残す)

やらないこと

Test plan

  • uv run --with pytest pytest plugins/ndf/scripts/tests/test_token_guard.py -q → 132 passed(exit=0、2026-09-23 04:34 UTC)。AC5〜AC10・AC12〜AC17・AC22 の判定、AC1〜AC4・AC18〜AC23 の文書の検査
  • uv run --with pytest pytest scripts/tests plugins/ndf -q → 5153 passed、exit=0(2026-09-23 04:37 UTC、実装レビューの修正の後。変更前は 5016 passed)
  • python3 scripts/check-skill-frontmatter.py → exit=0
  • claude plugin validate . → exit=0(警告は policy / interface の未知フィールドだけ)
  • python3 plugins/ndf/scripts/instructions-check.py --root . → exit=0
  • bash scripts/build-runtime-plugins.sh → exit=0、git status --porcelain が空(生成物の同期は不要)
  • 実機(Claude Code 2.1.280、claude -p --settingstoken-guard.sh を登録):
    • 同じファイルを 3 回 Read → 3 回目が理由つきで止まった(2 回目は Claude Code 本体が「file unchanged」の注記を返して中身を省いた。本体は読み直しを止めないため、この hook が止める)
    • サブエージェントの中の while ! test -s /nonexistent; do sleep 1; done → 理由つきで止まった
    • NDF_CONTEXT_LIMIT=1000description: "実装: #829 #830" の Agent → 止まり、/ndf:development-workflow #829 #830 が示された
    • 本体の前景の sleep 30 && echo hi は、この hook より先に Claude Code 本体が止めた(本体の制限は本体の会話にだけ掛かり、サブエージェントには掛からない。前提 2)
  • AC11: サブエージェントが codex execrun_in_background で起動して応答を終えると、親には 1 度「終わった」と通知が届き、途中の文面が結果として渡った。 その後、完了通知(codex の終了の約 2 秒後)でサブエージェントが再開して報告を出し直し、親に 2 回目の通知が届いた。この結果を waiting.md に書いた(背景の処理を残したまま応答を終えない。親は 2 回目の通知を待つ)
  • AC20: 実装の途中で、作業ツリーから新しい会話(claude -p "/ndf:development-workflow #829 #830 …")を始め、context-window.md の「新しい会話で戻す」の手順 1〜4 だけを実行させた。モード standard・作業ツリー・計画ファイル・設計 PR 設計: 待つ間の問い合わせを hook で止め、conductor の会話を工程の切れ目で切る(#829 #830) #843(MERGED)・実装 PR が未作成であること・次の工程(構造改善)を戻した。見つかった不備(stage-check.sh の場所)を直した。起動した Skill は配布済みの 10.16.0 のため、配布後の版での確認は release-verification で行う(conductor の会話を工程の切れ目で切ることを hook で強制する #830 の本文に記録)
  • AC25 / AC26: 配布後に release-verification で確かめる

🤖 Generated with Claude Code

https://claude.ai/code/session_01LdEztjNvLXF6EasAvTjAfk

takemi-ohama and others added 3 commits September 23, 2026 02:08
- token-guard.sh(PreToolUse の Bash / Read / Skill / Agent)を新設し、Claude Code にだけ登録する
  - 前景の sleep の待ち(while / until の本体、または 5 秒を超える秒数)を止める
  - 変わらないファイルの同じ範囲を 3 回続けて読む Read を止める
  - 文脈が 200,000 を超えた conductor が工程へ入る起動を 1 度止め、新しい会話で打つ 1 行を示す
- 待ち方の規約 waiting.md を新設し、agent-layers.md と前景の待ちのループを持つ 4 文書から指す
- context-window.md の「実測ではない」を #827 の実測へ置き換え、hook と新しい会話で戻す手順の節を足す
- development-workflow/SKILL.md に、切れ目で conductor が引き継ぎの 1 行を出す規約を足す
- README に hook と 4 ランタイムの扱いの表を足す
- 実装計画 issues/issue-829-830-implementation-plan.md

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LdEztjNvLXF6EasAvTjAfk
AC20 の実機の確認で、プラグインの scripts/ にあると読めて探す手間が出た。
実体は development-workflow の scripts/ にある。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LdEztjNvLXF6EasAvTjAfk
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LdEztjNvLXF6EasAvTjAfk
再帰的に実行文字列を検査する対象として明示された shell のうち、bash と sh は
DENY_SLEEP で固定済みだが zsh と dash の -c 経路は未固定だった。上限超過の sleep と
ループ本体の sleep を含む zsh -c / dash -c 入力を DENY_SLEEP に足し、いずれも拒否
(deny)になる現状を固定する。対象コードは変更していない。

Item-Id: R1-001
Round: 1
Impl-Runtime: kiro
Impl-Model: default
@takemi-ohama

takemi-ohama commented Sep 23, 2026

Copy link
Copy Markdown
Contributor Author

改修計画 — devbasex/ai-plugins #844

/ndf:cross-refactoring が提案し、適用した改善項目の記録である。
理由と手順は提案の時点でしか残らないため、公開の直前に書き出している。

  • 対象範囲: plugins/ndf/scripts/token-guard.sh, plugins/ndf/scripts/lib/token_guard_sleep.py, plugins/ndf/scripts/lib/token-guard-stages.txt, plugins/ndf/scripts/tests/test_token_guard.py, plugins/ndf/skills/development-workflow/references/waiting.md, plugins/ndf/hooks/claude.json
  • 着手前のテスト: uv run --with pytest pytest scripts/tests plugins/ndf -q

ラウンド 1(実装 kiro)

R1-001 — plugins/ndf/scripts/lib/token_guard_sleep.py#main

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit codex 採用 1

なぜ: 実行文字列を再帰的に検査する対象として明示された shell のうち、bash と sh は固定されているが zsh と dash の -c 経路は固定されていない

手順: 1. zsh -c と dash -c の文字列に上限超過の sleep を入れた入力を作る
2. 公開 CLI へ各入力を渡す
3. どちらも拒否を表す終了コードになることを比較する

R1-002 — plugins/ndf/scripts/lib/token_guard_sleep.py#should_deny

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit kiro 採用 1

なぜ: OPENERS の for/select 分岐のうち固定されているのは for だけで、select のループの本体に入る経路(stack が forbody になる分岐)が一度も通っていない。DENY_SLEEP/ALLOW_SLEEP に for の例はあるが select が無い

手順: 1. 'select x in a b; do sleep 10; done' を DENY_SLEEP に相当する入力として bash() で送り、denied() が理由を返すこと(ループの本体の sleep が止まること)を確かめる
2. 'select x in a b; do sleep 3; done' を ALLOW_SLEEP に相当する入力として送り、denied() が None を返すこと(上限以下のループ内 sleep が通ること)を確かめる
3. 期待値は先に実行して得た現状の出力(1 と 2)をそのまま固定する。理由メッセージの完全一致は要求せず、denied() の返り値が非 None / None かだけを見る

R1-003 — plugins/ndf/scripts/token-guard.sh#guard_context

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit codex 採用 1

なぜ: usage が 1 件だけの記録は固定されているが、assistant の usage が複数あるときに最後の値で上限判定する経路は固定されていない

手順: 1. 上限超過の usage の後に上限以内の usage がある transcript を作り工程 Skill を起動する
2. 拒否されず通ることを比較する
3. usage の順序を逆にした別 session では拒否されることを比較する

R1-004 — plugins/ndf/scripts/token-guard.sh#guard_context

兆候・経路 手法・階層 重要度 提案元 状態 コミット
error integration codex 採用 1

なぜ: 記録ファイル不在と usage 不在の fail-open は固定されているが、末尾に壊れた JSON 行を含む transcript を読めない場合の fail-open は固定されていない

手順: 1. 上限超過の assistant usage と壊れた JSON 行を含む transcript を作る
2. 工程 Skill の payload を公開 hook へ渡す
3. 終了コード 0 かつ拒否出力なしで通る現状を比較する

R1-005 — plugins/ndf/scripts/token-guard.sh#guard_read

兆候・経路 手法・階層 重要度 提案元 状態 コミット
error integration codex 採用 1

なぜ: 書き込み不能とロック取得不能は固定されているが、既存の session 状態 JSON が壊れている場合の読み直し判定と状態の回復は固定されていない

手順: 1. 対象 session の read 状態ファイルへ不正な JSON を置く
2. 同じファイル範囲の Read payload を公開 hook へ順に渡す
3. 最初は通過して状態が有効な JSON に置き換わり、その後は現在の上限回で拒否されることを比較する

ラウンド 2(実装 codex)

R2-001 — plugins/ndf/scripts/token-guard.sh#guard_context

兆候・経路 手法・階層 重要度 提案元 状態 コミット
boundary unit codex / kiro 採用 1

なぜ: test_context_issue_placeholder は skill 側の args 空の経路を固定するが、agent 側で description に番号が 1 つも無いとき issues が空になり <課題番号> へ落ちる経路は固定されていない。実測で desc='設計: リファクタリング' は '/ndf:development-workflow <課題番号>' を案内する。

手順: 1. 上限超過の assistant usage の後ろに usage を持たない行を 200 行以上置いた transcript を作る
2. 工程 Skill の入力で hook を実行する
3. deny 応答を出さず通す現状を比較する
4. assistant usage を末尾 200 行内へ移した対照入力では deny 応答になることも比較する

R2-002 — plugins/ndf/scripts/token-guard.sh#guard_context

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit codex / kiro 採用 1

なぜ: agent 側の課題番号の抽出は description に # が付いた形(設計: #829)でしか固定されていない。# を付けない裸の番号を # 付きへ整える分岐(sed 's/^/#/')は固定されていない。実測で desc='設計: 829' は '/ndf:development-workflow #829' を案内する。

手順: 1. 上限を超える transcript を作る
2. Agent または Task の description を「検査: #829」「取り込み: #829」「仕上げ: #829」として各入力を実行する
3. 各入力が終了コード 0 の deny 応答になることを比較する

R2-003 — plugins/ndf/scripts/token-guard.sh#guard_read

兆候・経路 手法・階層 重要度 提案元 状態 コミット
boundary unit codex 採用 1

なぜ: 存在する空ファイルや更新・置換されたファイルは固定されている一方、存在しないファイルを file_stat が sentinel 値として扱い、同じ範囲への 3 回目の Read を拒否する経路は固定されていない

手順: 1. 存在しない file_path を持つ同一の Read 入力を作る
2. 同じ session で 3 回実行する
3. 1 回目と 2 回目は出力なしで通り、3 回目は終了コード 0 の deny 応答になる現状を比較する

R2-004 — plugins/ndf/scripts/token-guard.sh#guard_sleep

兆候・経路 手法・階層 重要度 提案元 状態 コミット
boundary unit kiro 採用 1

なぜ: DENY_SLEEP は 'sleep 1m'(分)だけを固定し、時間・日の単位(h / d)と小数の秒換算の経路は固定されていない。実測で 'sleep 0.1h'(360 秒)と 'sleep 1d' は拒否される(deny)。

手順: 1. bash('sleep 0.1h') と bash('sleep 1d') を run で通す
2. denied(...) が拒否理由を返すことを確かめる(reason が真値)
3. 理由に waiting.md が含まれることだけを部分一致で確かめ、文言全体には結合しない

R2-005 — plugins/ndf/scripts/token-guard.sh#guard_sleep

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit kiro 検証中 1

なぜ: ALLOW_SLEEP はヒアドキュメント本文の sleep を通す経路を固定するが、here-string(<<<)で strip_heredocs が本文と誤認しないよう中和する分岐は固定されていない。実測で 'grep x <<< "sleep 60"' は通る(rc=0)。

手順: 1. bash('grep x <<< "sleep 60"') を run で token-guard.sh へ通す
2. denied(...) が None(拒否されない)ことを確かめる
3. 同じ範囲を続けて呼ばない単発の Bash 判定なので session 状態には依存しない

見送った項目

ラウンド 対象 兆候・経路 理由
1 plugins/ndf/scripts/token-guard.sh#guard_sleep error 1 ラウンドの採用上限 5 件を超えた

打ち切り(2026-09-23)

構造改善の工程は、利用者の指示で打ち切った(2026-09-23 03:50 UTC ごろ)。 現状固定テストのラウンドを 2 回回した時点で 90 分を超え、構造改善の提案に入れなかったためである。

select ループ本体の上限超過と上限以下の sleep 判定を既存のパラメータ化テストへ追加する。

Item-Id: R1-002
Round: 1
Impl-Runtime: codex
Impl-Model: default
…text

assistant の usage が複数あるとき、最後の値で上限判定する経路を現状固定する。
上限超過の後に上限以内の usage が来ると通り、順序を逆にすると拒否されることを
比較する現状固定テストを追加。対象コードは変更しない。

Item-Id: R1-003
Round: 1
Impl-Runtime: kiro
Impl-Model: default
上限超過のusageに壊れたJSON行が続く場合、公開hookが拒否せず終了する現状を結合テストで固定する。

Item-Id: R1-004
Round: 1
Impl-Runtime: codex
Impl-Model: default
既存の session 読み直し状態 JSON が壊れている場合の、guard_read の
読み直し判定と状態の回復を現状固定する。壊れた状態では 0 から数え直し、
最初の Read が通って状態が有効な JSON(count=1)へ置き換わり、以後は
現在の上限回で拒否されることを固定する。

Item-Id: R1-005
Round: 1
Impl-Runtime: kiro
Impl-Model: default
上限超過 usage が末尾200行の外側と内側にある場合の現状挙動を比較する。

Item-Id: R2-001
Round: 2
Impl-Runtime: codex
Impl-Model: default
…text

guard_context の agent 分岐で、description の課題番号が # を付けない裸の番号でも
案内が sed 's/^/#/' で # 付きへ整えられる振る舞いを現状固定する。検査/取り込み/仕上げ
の 3 入力が終了コード 0 の deny になり、/ndf:development-workflow #829 を示すことを固定。

Item-Id: R2-002
Round: 2
Impl-Runtime: kiro
Impl-Model: default
存在しない同一ファイルへのReadが3回目に拒否される境界経路を固定する。

Item-Id: R2-003
Round: 2
Impl-Runtime: codex
Impl-Model: default
…d.sh#guard_sleep

DENY_SLEEP は 'sleep 1m'(分)だけを固定し、時間・日の単位(h / d)と小数の
秒換算の経路が固定されていなかった。既定の上限 5 秒に対し 'sleep 0.1h'(360 秒)と
'sleep 1d'(86400 秒)が拒否されることを、waiting.md への部分一致だけで固定する
現状固定テストを追加した。対象のコードは変更していない。

Item-Id: R2-004
Round: 2
Impl-Runtime: kiro
Impl-Model: default
here-string の内容をヒアドキュメント本文と誤認せず、拒否しない既存経路を固定する。

Item-Id: R2-005
Round: 2
Impl-Runtime: codex
Impl-Model: default

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | REQUEST_CHANGES

sleep 判定がシェル構文上の実行位置とバックグラウンド実行を正しく区別できるよう、解析と回帰テストを補ってください。

Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated
Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated
Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | kiro | REQUEST_CHANGES

guard_sleep はループ本体の待ちを止めるのが目的だが、待ち先が動的(sleep の秒数が変数・コマンド置換)の場合に素通りする。また guard_context の課題番号抽出が版数を課題番号と誤認して誤った案内文を出す。いずれも案内・防止という hook の中核機能の正確性に関わるため、抽出・判定の入力条件を狭める修正を推奨する。

Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated
Comment thread plugins/ndf/scripts/token-guard.sh Outdated
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | round 1 | commit 2dcef96

対応件数: critical=0 / major=2 / minor=3(合計 5 件)
決着: 5 件 / 見送り: 0 件 / 却下: 0 件
CI: SUCCESS

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | codex | REQUEST_CHANGES

sleep 判定器が実行されない引数とバックグラウンド実行を誤って拒否する 2 経路を修正してください。

Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated
Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | kiro | REQUEST_CHANGES

guard_sleep のラウンド 1 修正で 2 つの経路が意図と食い違う。(1) 背景実行の検出が sleep の直後 2 語目の & しか見ないため、リダイレクトを挟む背景 sleep(sleep 100 >/dev/null &)が誤って拒否される。docstring は『& で終わる sleep は見ない』と宣言しているので契約違反。(2) 引数付き shell オプションの読み飛ばしが単独形 -o/+o/-O/+O だけで、結合形(-euo pipefail / -eo pipefail)の o/O が次語を食う経路を見落とし、bash -euo pipefail -c 'sleep 100' が guard をすり抜ける。いずれも修正コミット 2dcef96 の変更範囲で、テストは未カバー。

Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated
Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated
- 背景実行は sleep の引数の後ろから次のコマンド境界までの `&` で判定する(`sleep 30 >/tmp/x &` を通す)。`2>&1` / `>&` / `&>` の `&` は背景と読まない
- bash / sh / zsh / dash -c と eval の中身を見るのはコマンドの位置の語だけにする(`echo bash -c ...` を止めない)。`timeout 590` / `nohup` / `env` などの前置きの後ろもコマンドの位置とする
- 末尾が o / O の結合形のオプション(`-euo pipefail`)の引数を読み飛ばして `-c` を探す
- waiting.md の説明を判定に合わせる

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LdEztjNvLXF6EasAvTjAfk
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | commit fba6e05

対応件数: critical=0 / major=0 / minor=0(合計 0 件)
決着: 4 件 / 見送り: 0 件 / 却下: 0 件
CI: NONE

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | REQUEST_CHANGES

複合コマンド全体をバックグラウンド実行する場合も、前景待ちとして誤拒否しないよう背景判定を補ってください。

Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | kiro | REQUEST_CHANGES

guard_context の課題番号抽出が、版数(ドット区切り)は取り除くようになった一方、ハイフン区切りの日付(2026-09-23)を課題番号と誤認して案内文に存在しない番号を並べる。前ラウンドで直した版数誤認と同一の失敗経路のため、日付の除去も同時に塞ぐことを推奨する。

Comment thread plugins/ndf/scripts/token-guard.sh Outdated
- (sleep 30) & / { sleep 30; } & / while ...; do sleep 1; done & / sleep 30 && echo x & を
  背景として通す。前景のまま待つ形は引き続き止める
- 課題番号の抽出で、ハイフン区切りの日付(2026-09-23)も版数と同じく取り除く
- waiting.md の止めないものの説明を判定に合わせる

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LdEztjNvLXF6EasAvTjAfk
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | round 1 | commit 9ec21b3

対応件数: critical=0 / major=2 / minor=0(合計 2 件)
決着: 2 件 / 見送り: 0 件 / 却下: 0 件
CI: PENDING

修正コミットは未 push のため check-runs が無い(HTTP 422)

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | codex | REQUEST_CHANGES

再帰実行の背景判定と複数課題番号の抽出を修正してください。

Comment thread plugins/ndf/scripts/lib/token_guard_sleep.py Outdated
Comment thread plugins/ndf/scripts/token-guard.sh Outdated

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | kiro | REQUEST_CHANGES

最新コミット 9ec21b3 の課題番号抽出で、日付を除くために追加した - が、ハイフンで繋いだ課題番号の範囲(#829-830)まで消す退行がある。sleep 判定の背景実行・再帰の位置・結合形オプションの前ラウンド修正には退行を確認できなかった(AC5/AC6 の実運用の待ちの形は正しく止め、背景化した複合コマンドは通す)。

Comment thread plugins/ndf/scripts/token-guard.sh Outdated
Comment thread plugins/ndf/scripts/token-guard.sh Outdated
- token_guard_sleep.py: bash -c / eval の中身を再帰検査する前に、既存の is_background で外側の & を判定する
- token-guard.sh: 日付(YYYY-MM-DD)だけを先に除き、版数は [0-9]+(\.[0-9]+)+ に戻す。#829-830 / 829-830 は #829 #830 として案内する
- test_token_guard.py: 背景の bash -c / eval と、版数・日付・範囲を含む description の抽出結果を固定する
- waiting.md: 止めないものに bash -c / eval の外側が背景になる形を加える

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LdEztjNvLXF6EasAvTjAfk
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | commit 01bb5d5

対応件数: critical=0 / major=0 / minor=0(合計 0 件)
決着: 4 件 / 見送り: 0 件 / 却下: 0 件
CI: NONE

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

直近修正の背景化判定と課題番号抽出を含め、追加の修正提案はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | kiro | APPROVE

commit 01bb5d5 を実測で検証した。前ラウンドまでの指摘(背景実行の判定・bash -c/eval の外側の背景化・結合形 shell オプション・課題番号抽出での版数/日付の除去と範囲 #829-830 の扱い)はいずれも修正済みで、132 件のテストが通り退行を確認できなかった。AC5/AC6(issues/issue-829-830-requirements.md)に反しかつ Claude Code のエージェントが実運用で書く形での誤判定は検出できなかった。APPROVE とする修正提案は無い。(実運用で書かれにくい構文の組み合わせ — while ...; do sleep 1 & wait; done の前景待ち・case 囲み内の上限超過 sleep・2026-09-231 のような不正日付での余分な #1 抽出 — は誤判定になり得るが、いずれも nit 判定でありガイドラインに従い指摘しない。)

@takemi-ohama
takemi-ohama marked this pull request as ready for review September 23, 2026 04:38
要求・設計・決定の記録・実装計画の 4 本を、現行の実装と一致する確定仕様
docs/specifications/ndf-token-waits-and-context-cut.md へ書き直した。元の 4 本は
issues/old/milestone-26-token-waits/ へ退避した。

- 設計の「未確認」の決着(サブエージェントは agent_id で見分ける・PreToolUse の時点で
  その呼び出しの assistant 行は未記録・通知が 2 回届くこと)を実装のとおりに書いた
- sleep の判定の背景の扱い(& で背景になる形・dash -c)など、実装レビューで決まった規則を反映した
- token-guard-stages.txt の「正」の参照先を確定仕様へ向け直した

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LdEztjNvLXF6EasAvTjAfk
@takemi-ohama
takemi-ohama merged commit 9419fd7 into develop Sep 23, 2026
16 checks passed
@takemi-ohama
takemi-ohama deleted the feature/issue-829-830-token-waits branch September 23, 2026 04:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant