Skip to content

feat(deepwork): permissionMode 別バケットで集計#3

Merged
akihidem merged 1 commit into
mainfrom
feat/permission-mode-split
May 11, 2026
Merged

feat(deepwork): permissionMode 別バケットで集計#3
akihidem merged 1 commit into
mainfrom
feat/permission-mode-split

Conversation

@akihidem
Copy link
Copy Markdown
Owner

なぜ

「自分が判断していた時間」と「automode / bypass で AI に丸投げしていた時間」を区別して見たい、という要望から。今は両者が混ざって dailyDeepWorkCapMin に当たり、stop_for_today 推奨が早く出すぎる(実体感と乖離する)。

何を

ディープワーク累積を Claude Code の permissionMode 別に 3 バケット (manual / auto / bypass) に分配。watch のステータス行と MCP cogsync://state/deepwork リソースに内訳を出し、cap 判定は manual バケット単独で行う。

主な変更ファイル:

  • src/infer/work_state.tsDeepWorkAccumulator をバケット別 ms に拡張、todayBreakdown() 追加
  • src/observers/claude_code.tsnormalizePermissionMode()findActiveSession() から現行 permissionMode を返却
  • src/watch.ts — tick 毎にモード判定 → accum.feed(state, at, bucket)、status 行に dw=Nm(M:x/A:y/B:z) | mode=... を表示
  • src/coach/advise.ts — cap は deepWorkManualMin で判定し auto/bypass は除外
  • src/mcp/{resources,tools,server}.ts — payload に manual/auto/bypass を同梱
  • src/state/store.ts — schema=1 維持、byDate(合計 ms)+ byDateBuckets(バケット別 ms)の並走形式

設計判断

  • 永続化は schema=1 を維持byDate (number) を残したまま byDateBuckets (object) を並走させる。schema=2 に bump すると既に npm 公開済みの旧バージョンが state.json を読めなくなるので避けた。旧バージョンは byDate のみ読めば従来通り動く。
  • permissionMode の正規化: JSONL 上の値 bypassPermissionsbypassauto / acceptEdits / planauto、未設定 → manual。プラン系も「AI が回し切る系」として auto バケット側に寄せた。
  • cap 判定は manual のみ: auto/bypass は AI に意思決定を委譲している時間なので、人間の精度低下リスクとは結び付けにくい。total は引き続き表示するだけ。
  • 既存累計の扱い: マイグレーションは行わず、旧 byDate (number) は読み込み時に manual バケットに寄せる。新規累積から自然に M/A/B に分かれていく。

スコープ外

  • イベント単位での厳密分類(permission-mode transition record を timeline で正確に追う)。今回はセッション末尾の現行モードで tick 全体を分類する近似。
  • バケット別の閾値設定 (dailyAutoCapMin 等) の追加。要望が出てから。
  • README / CHANGELOG 更新。次の release 準備時にまとめる。

検証方法

  • npm run typecheck クリア
  • npm test — 16/16 pass(tests/deepwork-accumulator.test.ts を新規追加)
  • npx tsx src/index.ts watch --once で status 行に dw=Nm(M:x/A:y/B:z) | mode=... が出ることを確認
  • 旧 cogsync MCP サーバ (npm install 済み v1.0.0-alpha.0) からも cogsync://state/deepwork が問題なく返ることを確認(byDate のみで動作)

依存

なし。

🤖 Generated with Claude Code

ディープワーク累積を Claude Code の permissionMode(manual / auto / bypass)
別に分配する。「自分が判断していた時間」と「automode/bypass で AI に丸投げ
していた時間」を分けて見たい、というユーザー要望が出発点。

主な変更:
- DeepWorkAccumulator: バケット別 ms を date 毎に保持、feed(state, at, bucket)
- observers/claude_code: JSONL から現行 permissionMode を正規化して取得
- watch: tick 毎にモード判定して accum に渡す。status 行に内訳とモードを表示
- advise: cap 判定は manual バケットのみで行い、auto/bypass は除外
- MCP deepwork resource: payload に manual/auto/bypass 内訳を同梱

永続化は schema=1 を維持し、byDate(合計 ms)に並走させる形で
byDateBuckets(バケット別 ms)を追加。旧バージョンの cogsync は byDate のみ
読めば従来通り動くので、npm 公開済みクライアントを壊さない。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@akihidem akihidem merged commit 2499f99 into main May 11, 2026
2 checks passed
@akihidem akihidem deleted the feat/permission-mode-split branch May 11, 2026 14:56
akihidem added a commit that referenced this pull request May 11, 2026
permissionMode 別バケット集計 (#3) を含む alpha リリース。
旧 alpha.0 と state.json は互換(byDate を読めば従来通り動作)。

Co-authored-by: akihidem <akihidem@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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