Windows タスクスケジューラ × Claude Code で自分専用新聞を作った話
はじめに
📝 前回記事との関係: 前回 Claude Code で個人 PDCA 自動化基盤を作った話 では、自分専用新聞を生成するスキルの "中身"(4 軸の長期目標管理 / 引用ソースを機械的に縛る決定論化 / 疲弊時に表現を緩める圧力緩和モード)を扱った。本記事はその続編で、生成された新聞を「いつ・どう運ぶか」(Windows Task Scheduler / Tier ホワイトリスト / Hook による違反検出)にフォーカスする。前提は前回記事に切り出してあるので、初見の方も読めるよう用語は本記事内で再導入している。
- なぜこれを書くか: SNS のアルゴリズムが流し込む「広告 + 興味喚起情報の中毒的混合物」から脱出し、Claude Code + Windows Task Scheduler で「Tier A/B 一次情報のみ」の自分専用新聞を毎朝 04:00 に自動生成する仕組みを 1 ヶ月運用してみた。設計判断と途中で踏んだ失敗をまとめて共有したい
-
読者にどんな価値があるか: ① Tier A/B/C ホワイトリスト設計(一次情報の階層化と Tier C 構造排除)/ ② Windows Task Scheduler 登録の PowerShell スクリプト(
WakeToRun: true込みでスリープ復帰運用)/ ③ Claude Code 側の SKILL 構造(手順書 + steps/ + templates/ の 3 階層・Tier ホワイトリストは別スキルのreferences/で分離管理)の 3 点が揃う。30 分で最小版から立ち上げ、週末で完全版に拡張できる構成
筆者プロフィール
- 保有資格: CKA / CKAD / CKS / KCNA(K8s 4 冠)+ GCP 4 冠(ACE/PCA/PCD/CSE)+ CSM
- 業務経験: 業歴 約 7 年
📝 個人テーマの伏字方針: 本記事では自分専用新聞で追っている 4 つの関心テーマはプライバシー配慮で 軸 A〜D の記号に抽象化して扱う。読者は自分の 4 軸(家族 / 副業 / 読書 / 運動 / 趣味 など、好きに置き換え可)に当てはめて読んでほしい。
結論先出し: SNS から「自分専用新聞」への移行
Before / After
| 項目 | Before(SNS 巡回中心) | After(自分専用新聞) |
|---|---|---|
| 朝の情報摂取手段 | X / Reddit / ニュースアプリ |
output/information/YYYY-MM-DD/index.md 1 ファイル |
| 1 日の SNS 滞在時間 | 約 60 分 | 約 30 分(半減) |
| 「次の一手に繋がった率」 | 体感 30% 程度 | 体感 70% 程度(一次情報のみなので翌日アクションに直結) |
| 起床直後の脳リソース配分 | 「読む」中心 | 「考える」中心(情報は事前に整理済み) |
| 配信時刻 | リアルタイム(中毒性 KPI 最大化) | 毎朝 04:00(起床前に到着) |
効いた 3 つの効果
- 情報の質が上がった — Tier A(公式 docs・政府機関・査読論文)と Tier B(大手金融・技術メディア)のみホワイトリスト化。Tier C 以下のクリックベイトを「除外する」のではなく「載せる場所を持たない」構造で排除した
- 「読む」より「考える」に脳のリソースを振れる — 起床直後 60〜90 分は最高集中時間。この時間帯に「情報を選ぶ」コストを払うと、集中力を「考える」に振り切れない。04:00 配信なら起床(仮に 04:30)には index.md が完成済みで、「考える」から始められる
-
再現性のあるルーティン化 — Task Scheduler が毎朝 04:00 に必ず動く。
WakeToRun: trueで PC スリープ中でも起動し、人間の意志力を消費しない
先に知っておきたい 3 つの注意
-
--dangerously-skip-permissionsの取り扱い — 自動実行のため Claude Code の permission prompt をスキップする運用にしているが、これは「自分のローカル環境で・自分が責任を持つ範囲」だけにとどめる。共有マシン・本番サーバーでは使わない - Tier 表は四半期に 1 回しか動かさない — 月次で動かすと「面白そうなサイト」がじわじわ Tier B に紛れ込む。半年に 1 回でも実用上は十分
- 失敗を仕組みで止める設計を最初から組み込む — Tier C 混入のような事故は人間の注意力では防げない。セルフチェックリスト(出力前の自己採点)+ Hook(自動検出による強制)の二段ガードで機械的に弾く構造を初日から作る(後述)
全体像 — 4 つの構成要素を 1 枚で
数字で見る現状(2026-05-07 時点・実体カウント)
-
スキル: 11 件(本記事で主に登場するのは
daily-briefingとclaude-code-research(Tier ホワイトリストを保持)の 2 件) - Hooks: 12 件(PreToolUse / SessionStart / PreCompact / PostCompact / SubagentStop / PostToolUseFailure / UserPromptSubmit / StopFailure / PostToolUse:Edit|Write|MultiEdit)
- Agents: 3 件(Read-only 監査専用・Write/Edit ツールを持たせない設計)
-
daily-briefing/SKILL.md: 152 行(460 行から steps/ + templates/ 分離で約 1/3 に圧縮) -
claude-code-research/references/trusted-domains.md: 25 行(Tier A/B ホワイトリストの実体)
⚠ Tier ホワイトリストの実体は
daily-briefing配下ではなくclaude-code-research配下に置いている。「ドメイン信頼性の判定」はリサーチ側の責務として分離してあり、daily-briefing はそれを参照する側、という役割分担。
設計判断 1: Tier A/B/C ホワイトリスト
階層化(一般化サンプル・実体は約 45 行で運用)
Tier A — 一次情報(最優先・引用は無条件 OK)
公式 docs:
- docs.<vendor>.com / <vendor>.com の公式 docs サブパス
例: docs.anthropic.com / docs.python.org / developer.apple.com
- github.com/<official-org>/*(公式リポジトリのみ・個人 fork は除外)
政府機関・国際機関:
- *.go.jp / *.gov / *.gov.uk
- oecd.org / who.int / imf.org / worldbank.org 等
査読論文・学術:
- pubmed.ncbi.nlm.nih.gov / arxiv.org / nature.com / cochranelibrary.com
Tier B — 二次情報(大手メディアの整理記事・引用は出典確認後)
大手金融メディア:
- bloomberg.com / reuters.com / wsj.com / ft.com
- 日経系
大手技術メディア:
- github.blog / stackoverflow.blog
- news.ycombinator.com(一次情報を引用する HN 投稿のみ)
Tier C 以下 — ホワイトリスト外(構造的に排除)
- インフルエンサー個人サイト・まとめサイト
- "○○の最強ガイド / ランキング / 必見 N 選" 系の SEO 量産記事
- 広告色の強い情報系サブドメイン
- 自動生成ニュースアグリゲータ
- "Tier B っぽい外観" の偽メディア(真の出典を辿れない記事)
設計の 3 つのコツ
- Tier C を「除外リスト」ではなく「ホワイトリスト外」で扱う — 除外リスト方式は無限に増える。ホワイトリスト方式なら有限管理できる
- Tier B は「自分の専門領域 + 隣接 1 領域」に絞る — 全領域を Tier B 化すると Tier A の意味が薄れる。読者が自分専用新聞で追う関心 4 軸をどう設定するかで Tier B の輪郭は変わる
- Tier 表の更新頻度は四半期に 1 回 — 月次で動かすと「面白そうなサイト」がじわじわ Tier B に紛れ込む。半年に 1 回でも実用上は十分
実装上のポイント
- ホワイトリストは Markdown 1 ファイルで管理(コミット履歴で変遷を追える)
- スキル側のルールは「Tier A/B 以外の URL は引用しない」を SKILL.md にチェックリスト化
- 違反検出は SubagentStop hook(Claude のサブ処理が終了した瞬間に走るフック)で grep ベースの自動チェック(後述の「遠回り 1」で再登場)
設計判断 2: Claude Code 側の構造(daily-briefing スキル)
SKILL.md / steps/ / templates/ / references/ の役割分担
⚠ 以下のディレクトリ構成は筆者環境のサンプル。Step 名は個人テーマに依存するため、ここでは役割を一般化した命名に置き換えて記載している。
.claude/skills/daily-briefing/
├── SKILL.md # 不変の手順・チェックリスト(295 行・骨子のみ)
├── steps/ # 各 Step の詳細(変更頻度低・必要な時だけ読み込み)
│ ├── step_priority_action.md # 軸 A の優先判定
│ ├── step_personal_events.md # 個人イベントの確認
│ ├── step_weekly_check.md # 週次レビュー
│ ├── step_monthly_adjust.md # 月次調整
│ ├── step_daily_progress.md # 日次進捗
│ └── ...
├── templates/ # 出力テンプレート(index.md フォーマット 等)
├── timed/ # 曜日 / 月初など条件付きで発火する Step
└── run_daily_briefing.ps1 # Task Scheduler から呼ばれる本体
Step の役割(実運用の責務分担を一般化)
| Step | 役割 |
|---|---|
| 1 | 当日のキャッシュ確認・前日 index.md の達成判定(再実行回避 + 連続記録の自動加算) |
| 2 | Tier A/B 一次情報の収集(軸別・並列 fetch・Tier C はホワイトリスト外で構造排除) |
| 3 | 軸ごとの本文生成(軸 A = 4 軸の中で最も判断のブレが許されないものは、セルフチェックリスト通過後のみ採用) |
| 4 |
index.md(自分専用新聞のトップ)生成 — templates/ のフォーマットから差し込み |
| 5 | 当日の振り返り枠の追記(連続記録ファイルを更新・継続日数の自動加算) |
| 6 | 翌朝の最優先タスク候補の出力(前日達成判定 → 翌日への伏線として 1 行) |
スキル分離の効果
- SKILL.md を短く保つことで Claude が一度に読み込む情報量(コンテキスト窓)への負荷を下げる(460 行 → 152 行に圧縮)
- steps/ は必要な時だけ読み込む方式にすることで、Claude が必要な部分だけ参照
- templates/ を独立化することで生成フォーマットの変更が他の Step に波及しない
設計判断 3: Windows Task Scheduler 設定
XML を直接書く方法もあるが、PowerShell の New-ScheduledTask* cmdlet で書いた方が設定の意図が読み取りやすいので、こちらを紹介する。
⚠ 以下のスクリプトはあくまでサンプル。タスク名・スクリプトパス・トリガー時刻・タイムアウト値などは自環境に合わせて要修正。そのまま実行する前に、必ず内容を読んで意図を理解した上で調整してほしい。
登録スクリプト(サンプル・環境に合わせて要修正)
# 注: このスクリプトはサンプル。パス・タスク名は自環境に合わせて書き換えること。
# 管理者権限で 1 回だけ実行する
$TaskName = "MyHome-DailyBriefing" # ← 任意のタスク名に変更
$ScriptPath = "C:\path\to\run_daily_briefing.ps1" # ← 実パスに置き換え
$TriggerTime = "04:00" # ← 任意の時刻に変更可
# 既存タスクを上書きする
if (Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue) {
Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
}
$Action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$ScriptPath`""
$Trigger = New-ScheduledTaskTrigger -Daily -At $TriggerTime
$Settings = New-ScheduledTaskSettingsSet `
-ExecutionTimeLimit (New-TimeSpan -Minutes 30) `
-StartWhenAvailable `
-WakeToRun
Register-ScheduledTask `
-TaskName $TaskName `
-Action $Action `
-Trigger $Trigger `
-Settings $Settings `
-RunLevel "Highest" `
-Force
設定項目の意味
-
-WakeToRun: PC スリープ中でも起動・処理後に再スリープ。これがないと夜は起きない -
-StartWhenAvailable: 04:00 に PC が起動していなければ、起動後に遅延実行 -
-ExecutionTimeLimit 30 分: ハングしても 30 分で打ち切り(暴走防止) -
-RunLevel "Highest": 管理者権限で実行(WakeToRunには必要)
Claude Code 起動側(サンプル・環境に合わせて要修正)
# 注: このスクリプトもサンプル。ProjectRoot は実パスに、モデル指定や引数は用途に合わせて書き換える。
$ProjectRoot = "C:\path\to\project" # ← 実パスに置き換え
$LogFile = "$ProjectRoot\.claude\logs\scheduler.log"
# UTF-8 でログ出力
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
function Write-Log {
param([string]$Message)
$ts = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path $LogFile -Value "[$ts] $Message" -Encoding UTF8
}
Write-Log "daily-briefing start"
try {
Set-Location $ProjectRoot
$env:CLAUDE_NONINTERACTIVE = "1"
claude --dangerously-skip-permissions --model claude-opus-4-7 -p "/daily-briefing" 2>&1 |
ForEach-Object { $_ | Out-File -FilePath $LogFile -Encoding UTF8 -Append }
Write-Log "daily-briefing complete"
} catch {
Write-Log "ERROR: $_"
}
設定のコツ
- ログを日付別ファイルに分ける: 後日 Tier 違反等を grep しやすい。本実装では別途 7 日 rotate を入れている
-
CLAUDE_NONINTERACTIVE=1: Claude Code 側の起動モードを非対話に明示 -
--dangerously-skip-permissions: permission prompt をスキップしないと自動実行で固まる。この運用は自分のローカル環境限定。共有マシン・本番サーバーでは使わない -
--model claude-opus-4-7: 朝の判定処理(軸 A)を、判断のブレが少ない強モデルに固定
⚠ ログのローテーション(7 日保持)や Set-Location でのプロジェクトルート移動は、本記事のスコープ外なので省略している。実装全体は
setup_scheduler.ps1+run_daily_briefing.ps1の 2 本で構成。
配信時刻 04:00 の根拠 — ここを軽く扱うと、設計の半分が台無しになる
「配信時刻なんて適当で良くない?」と読み飛ばしたくなるところだが、実はここがこの仕組みの "心臓部"。Tier ホワイトリストもセルフチェックリストも、配信時刻を間違えると効果が大きく落ちる。なので少しだけ寄り道させてほしい。
なぜ「起床前」じゃないとダメなのか
- 朝の脳科学では、起床直後の 60〜90 分が、一日で一番頭が冴えている時間帯とされている(Walker 2017 等)
- この貴重な時間を「どの記事を読もうかな」と選ぶことに使ってしまうと、「考える」側に集中力を回せなくなる。情報を選ぶコストは、自分が思っているより重い
- 04:00 配信にしておけば、起きた瞬間にはもう
index.mdが出来上がっている。コーヒーを淹れて開けば、いきなり「考える」から始められる
SNS との対比 — 同じ「朝の情報摂取」でも設計思想が真逆
- SNS のアルゴリズムが追っているのは「滞在時間」。だから質より中毒性を優先する設計になっている
- 自分専用新聞が追うのは「朝イチの 30 分でどれだけ深く考えられたか」。質を最大化する設計
- 言い換えれば「情報を消費する側」から「情報を構造化する側」に、立ち位置を変えるということ
🔁 前回記事の「圧力緩和モード」との両輪: 前回紹介した「疲弊兆候時に文章表現を緩めるフラグ」が 内容を緩めて朝の心理負荷を下げる仕組みだとすると、04:00 配信は タイミングを支配して朝の集中力を守る仕組み。両者は朝の脳リソースを守るための両輪として動いている。
💡 一見ちっぽけな「配信時刻」が、朝の集中力を 1.5 倍にするか半減させるかの分かれ目になる。Tier ホワイトリストや Hook と同じくらい、ここは丁寧に決めてほしい。
詳細: 安川康介『科学的根拠に基づく最高の勉強法』KADOKAWA, 2024(朝型 + 分散学習論)/ Walker, M. Why We Sleep (2017)
遠回りした話 — 「Claude を信じすぎた」3 つの事故
ここからは失敗談。「自分専用新聞」を作る過程で、私は何度か遠回りした。共通点は、全部「Claude が自分でうまく判断してくれるだろう」と思い込んでいたこと。具体的には Tier C 混入 / ドキュメント連鎖修正漏れ / Grep のサイレント失敗 の 3 件。それぞれ別の場面で起きた事故だが、辿り着いた答えは全部同じだった —— 「お願い」じゃなくて「仕組み」で止める。
遠回り 1: Tier C 混入事故 → ホワイトリスト Hook 化
最初の頃、私は楽観的だった。「SKILL.md に "Tier A/B 以外は引用しない" って書いてあるんだから、Claude もちゃんと守ってくれるでしょ」と。結論から言うと、これが全然守られなかった。
- 何が起きたか: 軸 A の判定レポートに、Tier C のクリックベイトサイト("○○ ETF が爆上げ確実" 系)の URL が引用された。Claude が「公式 docs っぽく見える」と思い込んでしまった Tier C サイトを、Tier B 扱いしてしまう事故が何度も再発した
- どう対処したか: ① セルフチェックリストに「引用 URL が Tier A/B ホワイトリストに含まれるか」という項目を追加 / ② SubagentStop hook で grep 検出(ホワイトリスト外のドメインを自動的に拾い上げて FAIL を出す)/ ③ Tier 表を更新するのは四半期に 1 回だけ、と SKILL.md にハッキリ書いた(月次でいじると「面白そうなサイト」がじわじわ Tier B に紛れ込んでくるため)
遠回り 2: ドキュメント連鎖修正漏れ → 「ここを直したら、ここも直す」対応表 + Hook
セルフチェックリストに項目を 1 つ追加しただけのつもりだったのに、実はそれに連動して直すべき関連ファイル(プロジェクト全体のルールを書いた CLAUDE.md、複数のスキル定義ファイル、設計ドキュメント等)が 他にも 7 つあって、全部更新漏れになっていた。3 日後に見直して、初めて気づいた。
- 何が起きたか: 「ここを直したら、ここも直す」というルールが、自分の頭の中にしかなかった。Claude も新しいセッションを開くたびに前回の作業を忘れてしまうので、結局「自分が覚えておく」ことに頼っていた設計だった
- どう対処したか: ① 「ここを直したら、ここも直す」の対応表を CLAUDE.md(プロジェクト全体の共通ルール置き場)に書いた — 表にして固定すれば、Claude が必ず参照できる / ② ファイルを編集するたびに、編集したファイル名と日時を自動でログに残す Hook を入れた — 後から「先週何を直したっけ?」が即座に分かる / ③ 新しいセッションを始めた瞬間に「先週これ編集してたよ、関連ファイルも直した?」と Claude 側から教えてくれる Hook を入れた
教訓: 新しいセッションは、前のセッションの記憶を引き継がない。だから「次に開いた瞬間に思い出せる仕組み」を、ログとセッション開始時の表示で先回りして作っておく。
遠回り 3: 検索のゼロ件を信じて誤判定 → タスクの完了は実ファイルを直接開いて確認
タスクの完了状況を「未完了マーク([ ])の横断検索で数える」やり方で確認していたある日、検索結果がゼロ件になった。私は深く考えず「月次タスクが全部未実施なんだ」と判定し、もう完了していたタスクを 2 件、Claude に「前倒し」としてやり直させてしまった。実際は、検索クエリのファイルパス指定をミスっていただけだった。
- 何が起きたか: 検索結果の「ゼロ件」には、「本当に該当が無い」と「クエリの書き方をミスっただけ」の 2 つの意味が混ざっている。後者の可能性を確かめずに、ゼロ件 = 未実施だと早合点した
- どう対処したか: ① タスクの完了状況は、検索ではなく「実ファイルを直接開いて目で確認する」ルールに切り替えた / ② 検索でゼロ件が出たら、別パターンで検索し直すか、実ファイルを開いて確認するまで判定を保留する ことにした
教訓: 検索の「ゼロ件」は、本当に該当が無いのか、クエリミスなのか見分けがつかない。完了判定のような重要な意思決定の根拠には使わない。
共通する設計原則 — 「お願い」と「強制」を分けて使う
3 つのケースに共通していたのは、「お願い」と「強制」の強度差を意識していなかったことだった。
- CLAUDE.md は "お願い" — Claude が読み飛ばす可能性がある
- Hook は "強制" — Claude が無視できない・必ず発火する
- セルフチェックリストは "自己採点" — Claude 自身が出力前にチェックする中間層
「大事な判定は、人間の意志力でも Claude の自主判断でもなく、機械で強制する」 — この原則を 3 ケース全部に適用してから、自分専用新聞の品質はようやく安定した。
まとめ — 読者の次の一手(前回からの続き ④⑤⑥)
前回記事の結論で ① 自分の長期目標を A4 1 枚化 / ② 階層構造を備えた最初のスキル実装 / ③ 自動チェック用の Hook 構築 を提案した。今回はその続編として、配信インフラ側の ④⑤⑥ を提示する。①②③ と並べて 6 ステップの一本道として扱ってもらえると、シリーズ全体の見通しが立てやすいはず。
- 今日できる小さな 1 歩(① の続き): Tier A/B ホワイトリストを A4 1 枚で書いてみる(自分の専門領域 + 隣接 1 領域に絞る・5 分)
- 週末にやる中サイズの 1 歩(② の続き): Windows Task Scheduler で毎朝 04:00 起動を仕込む(本記事の登録スクリプトのサンプルを土台に、自環境のパス・タスク名・時刻に合わせて調整)
-
1 ヶ月後を見据えた長期の 1 歩(③ の続き): Tier 違反をセルフチェックリスト + Hook で自動検出する(SubagentStop hook で
grepベースの最小実装からでよい)
Discussion