← 一覧に戻る

hook棚卸しとダッシュボード再設計レビュー (j-20260503-005)

2026年5月3日 23:31 更新
MD から自動変換されたページです。内容について質問があれば右下の ? ボタンからどうぞ。

このドキュメントは、現在 ~/.claude/scripts/~/secretary-state/ に置かれている hook・運用スクリプトを全件棚卸しし、その上にダッシュボード再設計案A/B/C1+C2を重ねて、Codex(GPT-5.4)に妥当性レビューを依頼した結果をまとめたものです。実装は一切していません。

現状の構造を一行で

~/.claude/hooks/ ディレクトリは存在しない。すべての hook は ~/.claude/settings.jsonhooks セクションから ~/.claude/scripts/ 配下のスクリプトを呼び出す形に統一されている。秘書セッション固有の運用スクリプトは ~/secretary-state/ に分けて置かれている。

Phase 1: 棚卸し結果

A. settings.json に配線されている hook (現役)

script hook event 目的(一言) 判定
instructions-log.sh InstructionsLoaded CLAUDE.md/MEMORY.md の読込タイミングをTSVで記録 維持
convert-plan.sh PostToolUse(Write|Edit) ~/plans/*.md を plan-viewer の HTML に自動変換し index.html に追記 維持
plan-write-marker.py PostToolUse(Write|Edit) plan ファイルのバリデーション(Pythonツール) 維持
record-outbound.sh PostToolUse(telegram reply|edit_message) 送信した本文を Second-Brain に記録 維持
inject-datetime.sh PreToolUse(全) Bash 実行時に現在時刻を context に注入 維持
rm-rf-guard.sh PreToolUse(Bash) rm -rf 危険パスを exit 2 でブロック 維持
notify-secretary-blocked.sh PreToolUse(AskUserQuestion) AskUserQuestion 検知で秘書に転送通知 維持
(inline prompt) PreToolUse(Write plan-viewer/.html) テンプレ Read 確認の質問プロンプト 維持
compact-init.sh / compact-counter.sh SessionStart / PreCompact compact 回数の初期化と加算 維持
load-persona.sh SessionStart ペルソナ読込 (kurisu モードなど) 維持
session-bootstrap-hook.sh SessionStart session-bootstrap エージェント使用を促す注入 維持
claude-stop.sh Stop TTS 通知(disabled)+secretaryに完了通知+Obsidian同期 整理候補(後述)
auto-approve-claude-dir.sh PermissionRequest(Edit|Write) .claude/ 配下を realpath 検証で自動承認 維持
notify-secretary-permission.sh PermissionRequest(全) permission dialog で秘書に通知 維持
promo-video-compact-hook.sh PreCompact プロモ動画スキル開発時のコンテキスト保持 維持(プロジェクト限定)
inject-datetime-prompt.sh UserPromptSubmit 現在時刻をプロンプトに注入 維持
plugin-dev-prompt-hook.sh UserPromptSubmit /plugin-dev: コマンドリマインダー 維持
session-reminder.sh UserPromptSubmit 20ターンごとに Obsidian 書き出しリマインド 維持
notify-secretary.sh Notification(idle_prompt) idle で秘書を起こす 維持
notify-secretary-failure.sh PostToolUseFailure 失敗を秘書に通知 維持
notify-secretary-session-end.sh SessionEnd registry更新+秘書通知 維持
rate-limit-recovery.sh StopFailure rate-limit 自動復帰スケジューラ 維持

B. settings.json には未配線だが存在する hook 系スクリプト (orphan/手動配線)

script 想定役割 状態
secretary-reply-length-guard.sh reply text 200字超を block する PreToolUse hook (j-20260503-003 で新設) 未配線 ← 再設計案Bの土台
intent-hook.sh Telegram メッセージを intents テーブルに記録する UserPromptSubmit hook telegram plugin 内で動く想定で配線
close-intent.sh reply で intent を closed に遷移 (PostToolUse) telegram plugin 内
check-pending-intents.sh Bash 完了後に pending intent をリマインド (PostToolUse) telegram plugin 内
bootstrap-pending-intents.sh SessionStart で pending intents を提示 telegram plugin 内
telegram-ack-hook.sh UserPromptSubmit で配信を ack telegram plugin 内
dual-deliver-observe.sh spool ポーリング観察 (j-20260427-006 Phase 1) 観察ジョブ
patch-telegram-plugin-v2.sh / patch-telegram-dual-deliver.sh telegram plugin への適用パッチ ワンショット
compile-wiki.sh raw→wiki 直接書き込み (Karpathy式KB) launchctl compile-wiki で動く
generic-convert-md.sh WATCH_DIR を walk して plan-viewer HTML に配置 launchctl WatchPaths
dream-* 一式 dreaming アーキテクチャ (compile/promote/quarterly-reset/to-plan-viewer) launchctl 配信
intents-timer.sh / intents-timer-watchdog.sh 60秒/5分の launchctl 監視 launchctl 配信
daily-report.sh デイリーレポート Telegram 配信 launchctl 配信
claude-daily-summary.sh recall ベースの日次サマリ(cron用) 起動経路要確認
claude-daily-summary.sh.bak 同上の旧版バックアップ 廃止候補
warmup-voice-cache.sh TTS キャッシュ温め TTS disabled で意義喪失 → 廃止候補
backup-auth.sh / restore-auth.sh OAuth backup/restore 維持
import-inbody.sh / parse-training.sh / training-report.sh 健康データ系 維持(無関係)
check-h1-basename-consistency.sh Second-Brain の h1/basename 整合性検出 維持
sync-codex-to-obsidian.sh / sync-recall-to-obsidian.sh ai-second-brain repo への symlink 維持
test-* (5本) hook の単体テスト群 維持(test)

C. ~/secretary-state/ の運用スクリプト

script 役割 判定
dispatch-job.sh 記録→確認→送信→更新を不可分で実行する dispatch 本体 維持
report-done-v2.sh / report-propose-v2.sh / report-question-v2.sh 3行+URL+ボタン テンプレ (j-20260503-003) 維持(現役)
report-done.sh / report-propose.sh / report-question.sh 旧 4見出しテンプレ (角括弧見出し+多段箇条書き) 廃止候補
complete-job.sh DONE 遷移+refresh-dashboard 維持(C1案で拡張)
refresh-dashboard.sh Telegram pin message のジョブ一覧更新 廃止候補(plan-viewer/mini-apps-uiに統合)
dispatch-queue-poller.sh / approve.sh / reject.sh 承認キューの poll/approve/reject 維持
cleanup-jobs.sh DONE/FAILED を 30日後に削除 (cron) 維持
reminder-checker.sh reminders.json 監視 (launchctl) 維持
scheduled-reminder.sh / standup.sh 朝/昼/夕の定時 Telegram (cron) 維持
restart-tmux.sh tmux サーバー再起動(ワンショット運用) 維持
setup-telegram-commands.sh Bot のコマンド補完登録 維持
telegram-lib.sh source 用ライブラリ 維持
migrations/2026-05-03_dashboard_revamp.sql jobs に read_at + plan_viewer_url 追加済 適用済

D. DBスキーマの現状(再設計に効くもの)

E. 統合・廃止候補のまとめ

廃止可能なもの:

統合検討:

claude-stop.sh の整理候補:

Phase 2: ダッシュボード再設計案 A/B/C1+C2 を棚卸しの上に重ねる

案A: 既読同期 (items.read_at + SSE)

狙い: 複数端末(MacBook + iPhone)で同じ既読状態を共有する。localStorage は端末ローカルなので Mac で開いた既読が iPhone に反映されない問題を解消する。

棚卸しとの接続: jobs テーブルには既に read_at カラム追加済(5/3 migration)。job 単位の既読は対応済み。

追加で必要なもの:

論点: 「項目」の粒度。job 全体だけで足りるなら items テーブルは不要で、jobs.read_at を使い回せる。もしジョブ詳細ページで「この箇条書きは読んだ」までやるなら items が要る。前者で開始するのが KISS。

案B: 報告形式の強制力 (v3 + PreToolUse hook)

狙い: 「気をつける」依存を排除し、長文 reply を仕組みで禁止する。詳細はダッシュボードに集約させる。

棚卸しとの接続:

追加で必要なもの:

論点: PreToolUse は MCP tool 単位でしか matcher を設定できない。秘書が report-done-v2.sh を Bash 経由で呼ぶときは guard を素通りするのか/text パラメタが渡されないので素通りするのか、を確認。素通りで良いはず。

案C1: complete-job.sh で DONE 移行前に強制クエリ

狙い: 「完了」を DB に書く瞬間に、関連未完了ジョブ・派生タスク・pending intents を SQL で強制クエリし、確認ステップを挟む(スキップ不可)。

棚卸しとの接続:

追加で必要なもの:

論点:

案C2: next_action 空配列を CHECK 制約で禁止

狙い: DB レベルで「next_action 空のまま DONE」を構造的に禁止する。コード側の確認に頼らず、SQL の制約で fail-closed にする。

棚卸しとの接続:

追加で必要なもの:

論点: 既存ジョブ(過去の DONE)で next_action が NULL or 空のものがある場合、migration が UPDATE で躓く。先に既存データのクリーンアップが要る。

案C3 (健人却下) の確認

「launchctl 朝push」案は健人が却下済み。今回の実装範囲には含めない。

Phase 3: Codex レビュー結果

(Codex 公式 plugin /codex:adversarial-review にこの md を添えて投げる予定。 このセクションは Codex 応答が返ってきたら引用形式で追記する。)


Codex (GPT-5.4 / adversarial mode) からの返答全文

1. hook棚卸し結果(Phase 1)の妥当性

対象: Phase 1-B/C/E、Phase 4-1(L55-L58, L68-L72, L90-L105, L201-L203)

2. 再設計案A(既読同期)の妥当性

対象: 案A(L108-L121)

3. 再設計案B(報告形式の強制力)の妥当性

対象: 案B、残論点(L123-L142, L209-L213)

4. 再設計案C1(complete-job.shで強制クエリ)の妥当性

対象: 案C1、残論点(L143-L163, L213)

5. 再設計案C2(next_action 空配列を CHECK制約で禁止)の妥当性

対象: 案C2(L165-L180)

6. 「気をつける」依存排除が機能しているか

対象: 案B全体、残論点(L125-L142, L211-L212)

7. 抜け道・反復暴走・データ整合性リスク

対象: Phase 1-A/B、案A/B/C1/C2(L18-L21, L33-L36, L53, L117-L119, L129-L142, L156-L163)

8. 推奨実装順序

対象: Phase 4(L197-L207)

Codex 指摘を踏まえた要点(健人向けの一行まとめ)

これらを踏まえて Phase 4 を書き直すのが次の作業になる(健人の判断後)。


Phase 4: 推奨実装順序 (Codexレビュー反映後に確定)

健人の指示「断捨離と合わせてならあり」を尊重し、断捨離→骨格→肉付け の順で並べる。

  1. 断捨離(壊さない順): bak ファイル・warmup-voice-cache.sh・旧 report-*.sh の削除確認(呼び出し元 grep で 0 件確認後)、claude-stop.sh の TTS dead code を削除
  2. DB制約強化(C2): 既存ジョブのクリーンアップ migration → next_action 空配列禁止 CHECK 追加
  3. complete-job.sh 拡張(C1): 関連未完了クエリ + ack フラグ強制 + verification_checks 記録
  4. secretary-reply-length-guard 配線(B): settings.json に PreToolUse を追加、閾値 100字、誘導文言整備
  5. 既読同期(A): items テーブル追加 or jobs.read_at 流用判断 → mini-apps-api SSE エンドポイント → mini-apps-ui の localStorage 撤去

各ステップは独立にロールバック可能な migration/コミット粒度に切る。

残論点

補足 (cron / launchctl 配信)

これらは hook ではないが、再設計の影響範囲(特に refresh-dashboard 廃止時の依存先)を見るために併記した。

📝 質問モード — テキストを選択してね
✓ 質問を送信しました