Skip to content

Update: statusline にサブエージェントのコンテキスト使用量を並べる - #806

Merged
takemi-ohama merged 5 commits into
developfrom
feat/statusline-subagent-context
Sep 22, 2026
Merged

takemi-ohama merged 5 commits into
developfrom
feat/statusline-subagent-context

Conversation

@takemi-ohama

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

Copy link
Copy Markdown
Contributor

Summary

statusline に、実行中のサブエージェントのコンテキスト使用量を並べる。statusLine の JSON はメインセッションの値しか持たないため、サブエージェントの記録(<transcript_path から .jsonl を除いたもの>/subagents/agent-<id>.jsonl)の最後の usage から読む。

/work/ai-plugins [Opus5 553k │ 修正:G 245k · 取り込み 149k]
  • 使用量の多い順に 3 本まで並べ、残りは +2 のように本数だけを出す(80 桁の端末に収めるため)
  • ラベルは meta.jsondescription から空白を除いた先頭 4 文字。種類名はほとんどが general-purpose で見分けに使えない
  • 候補は直近 60 分に更新された記録に限り、実行中かどうかは記録の末尾で決める。tool_use を含まない assistant で終わり、end_turn が付くか 30 秒書き足されなければ終わったとみなす。更新の時刻では決めない(子を待つ supervisor は何分も書き足さない)
  • メイン・サブエージェントとも 500k を超えたら使用量を赤で表示する(Haiku 4.5 は 150k。メインは入力の context_window_size が 200K 以下かで判定)
  • メインの表示から上限と使用率を外し、モデル名を詰める(Opus 5 (1M context)Opus5)。現行モデルの上限は Haiku 4.5 を除き 1M
  • コンテナ名・ホスト名の表示を外す。区別は端末やエディタのウィンドウタイトルに任せる
  • NDF 標準の statusLine に refreshInterval: 5 を持たせる。メインが待機中は再描画のイベントが起きず、サブエージェントの表示が止まるため。既存の設定には ensure / set が足し、利用者が書いた値と独自の statusline には触らない

関連する issue: なし(会話での依頼)

Test plan

  • uv run --with pytest pytest scripts/tests plugins/ndf -q → exit=0(4862 passed)
  • python3 scripts/check-skill-frontmatter.py → exit=0
  • python3 scripts/check-doc-staleness.py → exit=0
  • python3 scripts/check-markdown-links.py --root . → exit=0
  • refreshInterval のテスト 4 件を追加(新規設定・既存の NDF 標準への追加・利用者の値の保持・独自 statusline に触らない)。うち 2 件は実装前に落ちることを確認
  • 擬似の記録で表示を確認: 実行中 5 本で上位 3 本と +2end_turn の記録と 40 秒止まった text の記録が外れる、Haiku 160k と 620k が赤、説明の無い記録は ID の先頭、{}transcript_path 無しで崩れない
  • 実セッションで確認: バックグラウンドのサブエージェント 2〜4 本が並ぶこと、子を待つ supervisor が表示されること(手元の試用版で目視)。1 回の描画は 0.02〜0.03 秒

未検証の項目: macOS(BSD の stat -f %m への切り替え)は実機で動かしていない
既存の失敗: なし
範囲外と判断したもの: playwright-kit の pytest(変更に関係しない)

影響範囲

配布先 変わるか
Claude Code 変わる(statusline の表示と、settings の statusLine.refreshInterval
Codex 変わらない
Kiro CLI 変わらない(statusline Skill は配られるが、スクリプトは Claude Code の statusLine 専用)
agy 変わらない

版を上げる必要があるか

要らない(まとまり単位でマージ後に /ndf:release で上げる)

🤖 Generated with Claude Code

takemi-ohama and others added 3 commits September 22, 2026 13:42
- 実行中のサブエージェントの使用量を `│` の後に使用量の多い順で 3 本まで並べ、残りは本数だけを出す
- 終わったサブエージェントは記録の末尾から判定して外す
- ラベルは description の先頭を端末の 8 桁で切る(全角は 2 桁)
- メインの表示から上限と使用率を外し、モデル名を詰める(Opus5 61k)
- コンテナ名・ホスト名の表示を外す

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- NDF 標準の statusLine に refreshInterval: 5 を持たせる。既存の設定には ensure / set が足し、利用者の値は変えない
- メイン・サブエージェントとも 500k を超えた使用量を赤で表示する(Haiku は 150k)
- サブエージェントのラベルを説明の先頭 4 文字にし、空白を挟んで使用量を続ける

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
更新の時刻(直近 2 分)で実行中を決めていたため、子や長いコマンドを待って記録を書き足さない
supervisor が外れていた。候補を直近 60 分に広げ、実行中かどうかは記録の末尾で決める。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@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 | COMMENT

statusline-switch.sh 側(refreshInterval)は新規/既存/保持/独自の 4 分岐がテストで押さえられており、手元で 10 件 pass を確認した。一方で statusline.sh に追加した描画ロジック(サブエージェント記録の状態判定 run/idle/done・上位 3 本の並べ替え・+N の省略・500k/150k の赤表示)は自動テストが無く、擬似記録での目視のみになっている。AGENTS.md が求める「入力と出力の形を 1 度そのまま通す」検証を自動化するため、tail -n 50 | jq -rs ... の状態判定と並べ替え・省略部分を、標準入力 JSON と擬似 subagents/agent-*.jsonl を渡してスクリプト実行し標準出力を突き合わせる pytest を追加することを推奨する。詳細はインラインに記載。

Comment thread plugins/ndf/skills/statusline/tests/test_statusline_switch.py

@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/statusline.sh Outdated
Comment thread plugins/ndf/scripts/statusline.sh
Comment thread plugins/ndf/scripts/statusline.sh Outdated
- サブエージェントの記録を find -print0 と NUL 区切りで読み、空白を含むパスでも表示する
- メインの赤表示の閾値を context_window.context_window_size が 200K 以下なら 150k にする
- statusline.sh の表示を擬似の記録で確かめる test_statusline_render.py を追加する

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ

対応件数: critical=0 / major=1 / minor=2 (合計 3 件)
deferred: 0 件 / rejected: 1 件
commit: 93ce550
CI: PENDING(push 直後。失敗中のジョブは無し)

詳細

  • 修正 [major] statusline.sh:39 空白を含むパスで割れる → find -print0 と NUL 区切りの読み取りへ(回帰テスト付き)
  • 修正 [minor] statusline.sh:26 メインが Haiku でも 500k 判定 → 入力の context_window.context_window_size が 200K 以下なら 150k。SKILL.md も合わせた
  • 修正 [minor] 表示ロジックのテスト不足 → plugins/ndf/skills/statusline/tests/test_statusline_render.py を追加(8 件。修正前のコードでは 2 件が落ちることを確認)
  • rejected [major] statusline.sh:36 -mmin -60 を外す → 全記録を毎描画で読む負荷と、止められた担当が永久に残る問題のため枠は維持。PR 本文に「候補は直近 60 分に更新された記録に限る」を追記

検証: uv run --with pytest pytest plugins/ndf/skills/statusline -q 18 passed (exit 0) / check-skill-frontmatter.py exit 0 / bash -n exit 0

@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 | APPROVE

サブエージェントの使用量表示・refreshInterval 追加・80 桁制約への収め方いずれも実装とテスト(18 件 pass、境界値・空白パス・空/非 JSON 入力を網羅)が一致しており、stat の macOS 差分と kill 済み担当の残留は PR/SKILL.md で既知として明示されている。レガシー移行判定(statusline-switch.sh ②)も新スクリプトのマーカー ① で全カバーされ回帰なし。修正を要する指摘は無し。

@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/statusline.sh Outdated
ラベル化の jq で空白に加えて \p{Cc}(U+0000-001F / U+007F-009F)を除く。
説明に ESC を含む場合のテストを足す。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ(cross-review 最終スイープ)

resolved: 2 件 / fixed: 1 件(minor / セキュリティ)
commit: 76fa06e
残りの未解決スレッド: 0 件

詳細

  • plugins/ndf/scripts/statusline.sh:40 -mmin -60(major): ラウンド 1 で理由を返信済みの判断保留。PR 本文に 60 分の枠を明記済みのため Resolve
  • plugins/ndf/scripts/statusline.sh:68 説明の制御文字(minor / セキュリティ): ラベル化で \p{Cc} と空白を除去。ESC を含む説明のテストを追加(修正前は失敗、修正後 19 passed)

@takemi-ohama
takemi-ohama merged commit 3e9b920 into develop Sep 22, 2026
15 checks passed
@takemi-ohama
takemi-ohama deleted the feat/statusline-subagent-context branch September 22, 2026 14:42
takemi-ohama added a commit that referenced this pull request Sep 22, 2026
Docs: 10.16.0 の変更履歴と更新案内に statusline の変更(#806)を足す
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