ホーム / 全スキル / コンテンツ制作 / last-30-days-research
コンテンツ制作 · mvanhorn/last30days-skill

last-30-days-research

過去30日間に特定のトピックについて人々が実際に何を語っているかを調査します。Reddit、X、YouTube、TikTok、Hacker News、Polymarket、GitHub、Webから投稿とエンゲージメントを取得します。ソースの不具合や欠落を診断するdoctorヘルスチェック機能も含まれています。

L5 厳格管理 · 隔離環境と厳格な監査V2 人間監査済認証情報/セッションコマンド実行外部書き込みネットワーク通信ファイル書き込みDual-pass Audit
Author mvanhornGitHub mvanhorn/last30days-skill ↗Stars 62074License MIT(仓库根 LICENSE:'MIT License / Copyright (c) 2026 Matt Van Horn';SKILL.md frontmatter `license: MIT`;GitHub API spdx_id=MIT)Commit ac0ed3b7f6
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

本skillは「長大なプロンプト契約 + マルチソースPythonエンジン」の組み合わせです。2,394行のSKILL.mdがモデルの計画立案、エンジン呼び出し、出力合成の方法を規定し、実際のデータ取得と集約はscripts/last30days.pyおよび98個のlibモジュール(Pythonコード計約6.2万行)が担います。

skills/last30days/SKILL.md
You are inside the `/last30days` SKILL. This is a specific research tool with a 1400+ line instruction contract (the rest of this file) that defines EXACTLY how to produce the research output. It is not a generic "last 30 days of X" research prompt. Do NOT treat `/last30days` as a search keyword you can improvise against.
実測規模:SKILL.md 2,394行、skills/last30daysディレクトリ配下に134ファイル、scripts/lib配下に98モジュール、scripts配下のPythonコード合計約62,681行(wc -lによる統計)。「純粋なプロンプト完結型skill」とは根本的に規模が異なり、機能の密度はコードに、運用の規律はドキュメントに凝縮されています。

モデルは「プランナー」として動作することを求められます。固有名詞などのエンティティ系トピックでは必ずモデル自身が--plan(解決済みのhandle/subreddit/hashtagを含むJSONクエリプラン)を自前で生成して渡す必要があり、エンジンの内蔵プランナーはヘッドレス/cron実行パス専用に限定されています。

skills/last30days/SKILL.md
**LAW 7 - YOU ARE THE PLANNER. `--plan` IS MANDATORY ON NAMED-ENTITY TOPICS.** If you are the reasoning model hosting this skill (Claude Code, Codex, Hermes, Gemini, or any agent runtime that invoked `/last30days`), YOU generate the JSON query plan. You do not need an API key, "LLM provider" credentials, or an external planning service - you ARE the LLM.
この規則は実際のインシデントから導入されました。SKILL.mdには2026-04-19の違反記録があり、モデルが計画なしにエンジンを直接呼び出し、stderrの「No --plan and no LLM provider configured. Using deterministic fallback…」を「APIキーがないため実行できない」と誤認しました。実際にはモデル側の計画ステップ欠落が原因であったため、ドキュメントに「YOU ARE THE PROVIDER」という明示的な反論規定が追記されました。

エンジンの呼び出し形式は厳格にテンプレート化されています。常に${SKILL_DIR}を用いて現在ロードされているSKILL.mdが存在するディレクトリ配下のscripts/last30days.pyを参照し、--emit=compactで可読性の高い出力を生成し、--save-dirで保存先を一元管理します。

skills/last30days/SKILL.md
SKILL_DIR="<absolute path of the directory containing the SKILL.md you just Read>"
SKILL_DIR置換メカニズムの設計意図はドキュメントに明記されています:「エンジンを実行するBash呼び出し内のSKILL_DIR置換は、モデルが直前に読み込んだSKILL.mdのディレクトリをそのまま使用し、リゾルバリクエストの探索や優先順位の走査は行わない」。これにより、複数コピー(マーケットプレイスのキャッシュ、~/.codex、npxインストールなど)が存在する場合の曖昧さを排除しています。また、Claude Codeのマーケットプレイスディレクトリが最新版より遅延する既知の古いコピー問題に対処するSTEP 0も用意されています。

出力は散文ではなく厳格な契約として扱われます。11項目の「LAW」により、先頭行のバッジ、タイトル、ダッシュ記号の扱い、段落構成、エンジンフッターの完全透過、生エビデンスブロックの出力禁止、コミュニティコメントの引用義務などが定められており、違反は観測可能な不具合として扱われます(ドキュメント内では0/8のリグレッション事例で実証)。

skills/last30days/SKILL.md
**BADGE (MANDATORY, FIRST LINE OF OUTPUT):** The Python engine now emits the badge as the first line of its `--emit=compact` stdout. Your correct behavior is to PASS THROUGH the script's output verbatim.
LAWの具体例:LAW 1はSources:ブロックの出力を禁止(WebSearchツールの標準契約を明示的に上書き)、LAW 3はem/enダッシュを禁止、LAW 4は##小見出しを禁止(COMPARISONクエリを除く)、LAW 5はエンジンフッターの完全一致出力を義務付け、LAW 6は<!-- EVIDENCE FOR SYNTHESIS -->内の生クラスタ出力を禁止、LAW 9は発信者明記のコミュニティコメント最低2件の完全一致引用を義務付け、LAW 11はトレンド探索に3コマンドプロトコルを義務付け。ドキュメントには違反日時と現象がエンジニアリング記録として検証可能に記載されています。

トレンド・トピック探索クエリは「モデルが判定者」となる3コマンドプロトコル(nominate-only → judgments → finalize、オプションでangles)を採用しており、話題の選定や視点の付与をモデルに委ね、エンジンは集約とレンダリングのみを担当します。

skills/last30days/SKILL.md
"${LAST30DAYS_PYTHON}" "${SKILL_DIR}/scripts/last30days.py" --discover --nominate-only --save-dir="${LAST30DAYS_MEMORY_DIR}"
3つのステップはそれぞれ、--discover --nominate-only、--discover --judgments "$JUDGMENTS_FILE"、--discover --finalize --angles "$ANGLES_FILE" --emit=compactです。また、2回失敗した場合は単発の--discoverへフォールバックするよう規定されています(ドキュメントには「never leave the user with no output」と明記)。

調査パイプラインを迂回するオフラインの高速パスが用意されています。ライブラリ検索、ライブラリフィード、トピックキューの3コマンドはローカルのSQLiteや保存済みブリーフを直接参照し、ネットワーク接続、モデル呼び出し、初期セットアップを一切行いません。

skills/last30days/SKILL.md
This is deterministic offline FTS over the existing saved-brief scanner plus per-run SQLite store sightings; it does not call a model or the network.
3つの高速パスは、library search(過去の調査ログに対するFTS全文検索)、library feed(ローカルのindex.htmlおよびfeed.xmlの生成・出力)、queue list|cover(トピックキューの管理)です。保存先ディレクトリはデフォルトで$HOME/Documents/Last30Days(LAST30DAYS_MEMORY_DIRで変更可能)であり、ブリーフは別途~/.local/share/last30days/briefsに保存されます。

セキュリティ設計として「機密情報にアクセスする可能性」を明示的に事前提示します。初回調査の前には必ず`--preflight`を実行し、設定の読み込み、予定されているブラウザCookieモードや書き込みパスの宣言、利用可能なコマンドやエンドポイント上書きの一覧表示を行いますが、この段階ではCookieの読み取り、ファイル書き込み、実際の調査処理は一切実行されません。

skills/last30days/SKILL.md
**2. Permission preflight.** Run `"${LAST30DAYS_PYTHON:-python3}" "${SKILL_DIR}/scripts/last30days.py" --preflight` using the directory of the `SKILL.md` you loaded, then summarize the human-readable result before setup: config source, project config trust/ignore state, planned browser-cookie mode, planned writes, optional commands, and active/ignored endpoint overrides. This is safe: it does not read browser-cookie values, does not write setup/config/report files, and does not run research.
コード上ではpermission_preflight.build()(docstring: 'Build a stable, secret-free permission preflight object.')に対応しており、完全オフラインが保証されるsafe=True(doctor/--diagnose/--preflight用)と通常の実行パスが明確に分離されています。

APIキーとブラウザCookieは完全に独立した認証チャネルとして扱われ、いずれもデフォルトで無効化されています。APIキーは環境変数 → グローバル.env(~/.config/last30days/.env) → プロジェクト.env(LAST30DAYS_TRUST_PROJECT_CONFIG=1が必要) → macOS Keychain → 1Passwordの順で解決され、ブラウザCookieの読み取りはデフォルトで無効です(FROM_BROWSER未設定時は読み取りを行いません)。

skills/last30days/scripts/lib/env.py
Default (FROM_BROWSER unset): no browser-cookie reads. The Chromium family (Chrome, Brave, Edge, Vivaldi, Opera, Arc, Chromium) is available only when explicitly selected because reading their cookies on macOS requires the browser's Safe Storage Keychain key, which triggers a system password prompt that cannot be reliably suppressed.
この設計の理由は明確です。ChromiumのCookie読み取りにはブラウザのSafe Storage用Keychainキーが必要であり、抑制不能なシステムパスワード入力ダイアログが表示されるため、ユーザーの明示的な許可が必要です(FROM_BROWSER=auto設定時にダイアログを許容したとみなされます)。setup_wizardの仕様でも「browser_cookie_scan_attempted: bool (True only after explicit consent)」と明記されています。

認証情報の書き込みも制限されたチャネルを経由します。`setup --store-key <NAME>`はstdinから1行読み取り、パーミッション0o600でグローバル.envに書き込み、stdoutにはNAME=****と1行のJSONのみを返却し、シークレット値がstdout/stderrに出力されることは決してありません。

skills/last30days/scripts/last30days.py
Reads exactly one line from stdin (bounded to ``STORE_KEY_MAX_BYTES``), strips whitespace, and writes it to the global ``.env`` as a 0o600 secret through ``setup_wizard.write_api_key``. An existing line for the same name is replaced, so a rejected credential can be rotated by running the command again. The value never reaches stdout or stderr: stdout carries ``NAME=****`` plus a JSON line ``{"persisted": bool, "key": NAME}``.
env.KEYCHAIN_KEYSのホワイトリストに含まれる名前のみを受け付け、それ以外は終了コード2で終了します。また、コード内のコメントでは、公式ホスト環境(LAST30DAYS_HOST=grok-bot)において古い認証キー名をエラー文内に明記してはならないとされており、ホストに応じた情報開示の制御が行われています。

2コア機能

01約30種類のソースにわたる直近30日間の評判・センチメント調査:Reddit(コメント含む)、X、YouTube(字幕含む)、TikTok、Instagram、Threads、LinkedIn、Hacker News、Polymarket、Digg、Bluesky、TruthSocial、小紅書(Xiaohongshu)、GitHub、StockTwits、Trustpilot、Amazon、arXiv、Techmeme、DripStack、Web検索など
02複数バックエンドの自動選定とフォールバック予測(collect-then-pick方式:利用可能な代替手段が未認証の優先設定によってブロックされないよう、全候補を事前検証してから選択)
03投票数/いいね数/取引量に応じたエビデンスのクラスタリングと合成(エンジンがランキング済みクラスタを抽出し、モデルが太字リード文とコミュニティコメントの完全引用を含むテキストを作成)
04トレンド・発見モード:モデルによる話題の推薦、スパムやコンテンツ価値の判定、ポッドキャスト/X向け記事の視点作成、およびセクションごとのトピック別ブリーフへの最終成形
05ローカル調査ライブラリ(過去のブリーフに対するFTS全文検索 / index.htmlおよびfeed.xmlの生成 / トピックキューの管理)、完全オフライン動作でトークン・API枠の消費なし
06doctorヘルスチェックと修復処方(各ソースの4状態監査:WORKING / TURNED ON - UNVERIFIED / NOT WORKING / COULD BE ON、さらにCLI健全性監査および事後診断を含む)
07ビジュアルレポート出力:共有可能なHTMLブリーフ(XSS対策レンダリング済み)およびht-ml.appへの任意公開(明示的なオプトイン制、デフォルト公開)
08構造化データ出力:スクリプトやパイプライン処理向けの--emit=json(エージェント向けフラット契約 / 内部生ダンプ)
09厳格な出力規律契約(11項目のLAW + 先頭行バッジ + セルフチェックリスト)により、モデルの自由出力を監査可能な形式に統制

3外部依存関係

KindDependency / Endpoint
clipython3 ≥ 3.12(引擎自身;SKILL.md 用 ${LAST30DAYS_PYTHON:-python3} 调用)
cliyt-dlp(YouTube 搜索与字幕;首次 setup 会尝试安装)、digg-pp-cli(Digg)、arXiv 与 Techmeme 的 Printing Press CLI
cliagentcookie(Linux 上的外部 cookie sidecar,仅当 PATH 存在该命令且未设 AGENTCOOKIE=off 时启用)
climacOS `security`(Keychain 取密钥)与 openssl(Chromium cookie 解密)、`pass`(1Password/密码库取密钥)
apiScrapeCreators(TikTok/Instagram/Threads/Pinterest/LinkedIn/YouTube 评论等;frontmatter 的 primaryEnv)
apiLLM/搜索类可选密钥(推理与规划回退用):OpenAI、xAI、Google/Gemini、OpenRouter、Perplexity、Brave、Exa、Serper、Parallel、Apify、GitHub token、X API bearer、XQUIK、BrightData
network免密钥公开端点(默认路径即可用):Reddit 公开 JSON/RSS、HN Algolia、Polymarket Gamma API、GitHub API、Arctic Shift、Bluesky、StockTwits、TruthSocial、Digg、r.jina.ai
networkHTML 简报托管发布(显式 --publish 才发;文档提醒页面默认公开可被索引)
package第三方 vendored 组件:scripts/lib/vendor/ 下的 X 搜索客户端(.skillignore 注明 'still installed')

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
隔離環境で実行、都度明示的な認可
管理者向け
厳格な認可、全量監査、コンプライアンス確認
判定根拠(ファイルパスと抜粋)
  • 本地凭据 / 浏览器配置: ユーザーのログインCookie/セッション/キーチェーンへのアクセス: プロセス環境変数および~/.config/last30days/.env(LAST30DAYS_CONFIG_DIRで変更可能、空設定時は設定なしモード):あり
  • scripts/: ローカルスクリプトまたはシステムコマンドの実行: python3 scripts/last30days.py <サブコマンド>(実行ごとに呼び出し、--preflight / --welcome / setup等を含む)
  • 外部 API: 外部プラットフォームへの投稿、リソース作成、またはデータ変更の書き込み: なし
  • 本地工作目录: ファイルの読み書きおよび成果物の出力: 調査結果の保存:--save-dir(デフォルトは$HOME/Documents/Last30Days)配下のMarkdownレポートおよび{slug}-raw.md
監査ノート: リスク評価:オレンジ。強力な機能を持ちますが機密リソースにアクセスするため、使用前に各項目を確認してください。理由:単なるプロンプトではなく、6万行を超えるPythonシステムであり、マシン上でサブプロセス(yt-dlp / digg / openssl / security / pass / agentcookie / box-chrome)を実行し、ホームディレクトリへの読み書き(~/Documents/Last30Days、~/.local/share/last30days、およびパーミッション0o600でキーを保存する~/.config/last30days/.env)を行い、オプションでブラウザ内のログインCookie(Chromium系からXのauth_token + ct0を取得)の復号やmacOS Keychainおよび1Passwordからの認証情報取得を実施します。さらに約30の外部サイト(有料スクレイピングサービスを含む)へリクエストを送信し、HTMLブリーフをサードパーティホスティングへ公開する機能(デフォルト公開)も持ちます。「認証情報の復号 + 多数の外部送信 + ホームディレクトリへの書き込み」が同時に存在し、Python 3.12+およびCLIツールの自動インストール機能を含むことからイエローではなくオレンジと判定されます。一方で、機密パスはデフォルトですべて無効化されており(Cookieは初期状態で読み取らず、公開には--publishが必要、プロジェクト設定はデフォルト不信頼)、独立した--preflight権限契約とdoctor監査を備え、Cookie値をログに出力しない配慮がなされているためレッドには該当しません。運用の推奨事項:まず--preflightを実行して予定される書き込みパスとCookieモードを確認すること。Xを利用しない場合はFROM_BROWSERを有効化しないこと。APIキーはリポジトリにコミットせず、~/.config/last30days/.env(0600)またはKeychainに保存してください。

5二重目の独立検証

  • [ok] skill 路径(任务书标『待定位』) — 实际相对路径 skills/last30days(仓库 skills/ 下仅此一个子目录)。frontmatter name 为 'last30days',与任务书展示名 'Last 30 Days Research'/slug 'last-30-days-research' 不同名——本报告 skill.name 保留 frontmatter 真值 'last30days',文件名按任务书 slug 输出。
  • [ok] 『1400+ 行指令契约』的量级声明 — SKILL.md 实测 2394 行(含契约与实现细节),『1400+』是保守表述,未夸大;OUTPUT CONTRACT 段落确实前置在文件开头附近(v3.0.8 起从第 ~1094 行前移),与文档自述一致。
  • [ok] 『模型是规划者(--plan)』是否被代码支持 — SKILL.md 规定命名实体主题必须带 --plan;引擎侧确实消费 --plan(文档另说明缺省时用内部 planner 或确定性回退,仅 headless/cron 路径)。文档同时记录了把引擎 stderr 的 'provider' 一词误读为『需要凭证』的真实事故,属可复核的工程记录。
  • [discrepancy] 浏览器 cookie 读取的默认状态(第一遍若笼统写『会读浏览器 cookie』则夸大) — 第二遍核对 env.py:'Default (FROM_BROWSER unset): no browser-cookie reads.',FROM_BROWSER=off 亦返回空;Linux 侧 agentcookie 还需 PATH 存在该二进制且未设 AGENTCOOKIE=off,MacBook 之外的 box-chrome CDP 路径需人工登录。结论修正为『能力存在、默认关闭、需显式同意』,已在 security 与 capabilities 中如实表述(不作默认行为)。
  • [ok] 密钥来源分层与项目配置信任策略 — env.py 明确 CONFIG_FILE = Path.home()/'.config'/'last30days'/'.env'(可用 LAST30DAYS_CONFIG_DIR 覆盖),项目 .env 需 LAST30DAYS_TRUST_PROJECT_CONFIG;Keychain 仅 Darwin + security 在 PATH,LAST30DAYS_SKIP_KEYCHAIN 可关;另有 pass(1) 通道与 LAST30DAYS_KEYCHAIN_ALIASES 别名支持。
  • [ok] 权限预检的『安全』承诺是否属实 — permission_preflight.build() docstring 为 'Build a stable, secret-free permission preflight object.';pipeline.py 中 browser_cookies 的 reads_values 在 safe 模式下恒为 False;代码注释要求 safe=True(doctor/--diagnose/--preflight)保持无网络。与 SKILL.md 的『does not read browser-cookie values, does not write … and does not run research』一致。
  • [ok] 发布到第三方托管是默认还是 opt-in — last30days.py 的 --publish 帮助文本写明 'Publish --emit=html output to ht-ml.app (explicit opt-in; public by default)';SKILL.md 在 library feed 段要求先向用户解释页面公开可被索引再执行。非默认行为。
  • [discrepancy] 外部依赖数量(避免把文档链接当成调用点) — 第一遍若按 https:// 出现频次直接列依赖会把文档链接(如 github.com、nodejs.org、ffmpeg.org、example.com)算进去。第二遍逐条回落到代码调用点:api.scrapecreators.com / api.github.com / hn.algolia.com / gamma-api.polymarket.com / arctic-shift.photon-reddit.com / api.x.ai / api.openai.com / generativelanguage.googleapis.com / openrouter.ai / api.perplexity.ai / api.stocktwits.com / bsky.social / truthsocial.com / di.gg / r.jina.ai / api.ht-ml.app 为真实请求端点;github.com、nodejs.org、ffmpeg.org、example.com 等仅出现在文档字符串或占位示例,未计入。

6結論

  • モデルの記憶による「最近のトレンド」ではなく、複数プラットフォームから実際のデータを取得しエンゲージメント順にソート:APIキー不要のソースは即時利用可能で、有料ソースは必要に応じて連携、バックエンド障害時も自動フォールバック。
  • 再現性と検証可能性の高い出力形式:11項目のLAW、必須の先頭バッジ、エンジンフッターの完全一致透過、発信元付きコミュニティコメント2件以上の直接引用義務により、安定したレポート構成と検証可能なエビデンスを担保。
  • 極めて堅牢な権限管理:独立した--preflight契約(Cookie読み取りなし、ファイル書き込みなし、調査未実行)、プロジェクト単位設定のデフォルト不信頼、Cookie読み取りのデフォルト無効、明示的な--publishによる公開制御。
  • 明確な診断と自己修復:doctor機能が各ソースの状態を4段階で監査し、具体的な対処法(不足しているキー、PATHにないCLI、期限切れCookieなど)を提示するため、データが取れない原因の推測が不要。
  • pip依存関係ゼロとローカル知識蓄積:標準ライブラリのみで実装され、オフライン検索/フィード/キューの3つの高速パスを備えているため、API利用枠を浪費することなく過去の調査結果を再利用可能。
  • 最適な用途: 直近30日間に特定トピックについてコミュニティで何が語られているかを迅速に把握したいコンテンツクリエイター、投資・市場調査担当者、ポッドキャストやニュースレターの配信者、プロダクト/グロース担当者に最適です。代表的な用途:`/last30days nvidia earnings reaction`、`/last30days AI video tools`、`/last30days trending`による企画選定。また、エージェントワークフローの一環として--emit=jsonを使用し後続スクリプトに渡す用途にも適しています。Claude Codeマーケットプレイスプラグインまたは`npx skills add mvanhorn/last30days-skill -g`で導入可能。pip依存関係なし(Python 3.12+が必須)。
    不向きな用途: 厳密な事実確認、単一の公的情報源、学術的に引用可能な文献調査が求められる用途(コミュニティの評判集約を目的としており、「人々が実際に何を言っているか」を収集するため不向き);ローカルスクリプトの実行、サブプロセスの起動、ホームディレクトリへの書き込みが禁止されている制約環境;XのログインセッションやAPIキーをローカルツールに委ねることを許容できないユーザー(キー不要ソースのみでも動作しますが、XやYouTubeの機能は制限されます);一切の設定を行わずに全ソースからの即時取得を期待する環境(TikTok/Instagram/LinkedIn/YouTubeのコメントにはScrapeCreators、YouTubeにはyt-dlpが必要であり、一部ソースには個別キーやオプトイン設定が必要)。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload last-30-days-research.tar.gz
    sha256: 41f1dd6604aec716…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit ac0ed3b7f6.