Skip to content

Release: ndf v10.17.0 - #887

Merged
takemi-ohama merged 35 commits into
mainfrom
develop
Sep 23, 2026
Merged

takemi-ohama merged 35 commits into
mainfrom
develop

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

目的

正式版 ndf v10.17.0main(正式版チャネル)へ載せる。マイルストーン 26「17 トークン消費の削減」のまとまり 1(#829 #830)である。

何が届くか

Claude Code にだけ効く。Codex / Kiro / agy の hook は変わらない。

課題 変えたこと
#829 前景の Bash の while / until ループ本体の sleep と 5 秒を超える sleep、変わらないファイルの同じ範囲を 3 回続けて読む Read を PreToolUse hook が止め、代わりの待ち方(run_in_background: true / Monitor)を示す。規約は development-workflow/references/waiting.md
#830 文脈が 200,000 を超えた conductor が工程 Skill か持ち場の supervisor を起動すると 1 度止め、新しい会話で打つ 1 行を示す。同じ起動をもう一度行えば通る

判定ごとに NDF_SLEEP_GUARD=0 / NDF_READ_REPEAT_GUARD=0 / NDF_CONTEXT_GUARD=0 で止められる。

あわせてまとまり外の #836(Serena の設定を追跡から外す。配布物に差分なし)も入る。

まとまり

設計 #843 / 実装 #844 / 開発版 10.17.0-dev.1 #881 / 版上げ #886

10.16.1 → 10.17.0-dev.1 → 10.17.0(MINOR: PreToolUse hook と待ち方の規約の後方互換のある追加。引数・Skill・スクリプトの削除や改名なし)

検証

  • 全体テスト 5153 passed(uv run --with pytest pytest scripts/tests plugins/ndf -q
  • 検査 11 種すべて exit=0(claude plugin validate . を含む)
  • CI(Release: ndf v10.17.0 #886)すべて pass
  • 開発版 10.17.0-dev.1 で、隔離した CLAUDE_CONFIG_DIR / CODEX_HOME と Kiro の導入スクリプトの 3 経路の取得と hook の動作を実測済み(Release: ndf v10.17.0-dev.1 #881 のコメント)

マージの後に ndf--v10.17.0 のタグを打ち、正式版チャネルからの取得をリリース後テストで確かめる。

🤖 Generated with Claude Code

https://claude.ai/code/session_016FbePpugNBKWFzJDmz4mgA

takemi-ohama and others added 30 commits September 22, 2026 22:42
`.serena/serena_config.yml` は利用者ごとに書き換わる設定で、認証の秘密
(`auth_secret`)を持つ。追跡したままだと、手元の変更が `git add -u` や
`commit -a` でコミットへ入りうる。

- 無視の設定へ 1 行足し、追跡から外す(`git rm --cached`)
- 手元のファイルは消えない。既存の利用者は取り込んだ後も同じ内容を使い続ける
- 履歴に秘密は入っていない(コミット済みの版に `auth_secret` の行は無い)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Serena の設定: 利用者ごとに書き換わる設定が追跡されていて、認証の秘密が誤ってコミットへ入りうる → 無視して追跡から外す
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0188ycp9tV288qHTswhMxQ7K
設計: 待つ間の問い合わせを hook で止め、conductor の会話を工程の切れ目で切る(#829 #830
- 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
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
- 背景実行は 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
- (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
- 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
要求・設計・決定の記録・実装計画の 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 and others added 5 commits September 23, 2026 13:51
待ちの問い合わせと長い conductor の工程の起動を hook で止める(#829 #830
#829 #830(待つ間の問い合わせと長い conductor の工程の起動を hook で止める)を develop の
チャネルへ載せる開発版。版数を持つ 15 箇所、更新案内の本文と手元で確かめるコマンド、
CHANGELOG.md の ndf 10.17.0 の節、docs/ndf-version-decisions.md の v10.17.0 の判断を更新する。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LdEztjNvLXF6EasAvTjAfk
開発版 10.17.0-dev.1 の接尾辞を外し、正式版 10.17.0 として `main` へ配る。
更新案内の本文を正式版の記述へ直した。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016FbePpugNBKWFzJDmz4mgA
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