--- name: last30days version: "3.0.0-alpha" description: "[V3 DEV] Research any topic from the last 30 days. Side-by-side test version of the v3 pipeline." argument-hint: "last30days-v3 codex vs claude code" allowed-tools: Bash, Read, Write, WebSearch homepage: https://github.com/mvanhorn/last30days-skill repository: https://github.com/mvanhorn/last30days-skill author: mvanhorn license: MIT user-invocable: true --- # last30days v3.0.0 Use `last30days` when the user wants recent, cross-source evidence from the last 30 days. The runtime is a single v3 pipeline: 1. plan the query 2. retrieve per `(subquery, source)` 3. normalize and dedupe 4. extract best snippets 5. fuse with weighted RRF 6. rerank with one relevance score 7. cluster evidence 8. render ranked clusters ## Setup: resolve the skill root ```bash for dir in \ "." \ "${CLAUDE_PLUGIN_ROOT:-}" \ "${GEMINI_EXTENSION_DIR:-}" \ "$HOME/.openclaw/workspace/skills/last30days" \ "$HOME/.openclaw/skills/last30days" \ "$HOME/.claude/skills/last30days" \ "$HOME/.agents/skills/last30days" \ "$HOME/.codex/skills/last30days"; do [ -n "$dir" ] && [ -f "$dir/scripts/last30days.py" ] && SKILL_ROOT="$dir" && break done if [ -z "${SKILL_ROOT:-}" ]; then echo "ERROR: Could not find scripts/last30days.py" >&2 exit 1 fi ``` ## Default command ```bash python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --emit=compact ``` ## Useful commands ```bash python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --emit=json python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --quick python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --deep python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --search=reddit,x,grounding python3 "${SKILL_ROOT}/scripts/last30days.py" $ARGUMENTS --store python3 "${SKILL_ROOT}/scripts/last30days.py" --diagnose ``` ## Runtime expectations - One reasoning provider is required: `GOOGLE_API_KEY` for Gemini, `OPENAI_API_KEY` for OpenAI, or `XAI_API_KEY` for xAI. - `BRAVE_API_KEY` enables Brave web search (recommended). `SERPER_API_KEY` is the web fallback. - `SCRAPECREATORS_API_KEY` enables Reddit, TikTok, and Instagram. - `XAI_API_KEY` enables xAI reasoning and X search. - `AUTH_TOKEN` plus `CT0` enables Bird-backed X search. - `yt-dlp` enables YouTube. - Planning and reranking fall back gracefully: Gemini -> OpenAI -> xAI -> deterministic/local. - Web retrieval stays within Brave/Serper dated results. Undated web hits are dropped. - For OpenClaw-specific watchlist, briefing, and history workflows, use `variants/open/SKILL.md`. ## Output model - `compact` and `md`: cluster-first markdown - `json`: full v3 report - `context`: short synthesis-oriented context Important report fields: - `provider_runtime` - `query_plan` - `ranked_candidates` - `clusters` - `items_by_source` - `errors_by_source` ## Usage guidance for agents - Prefer `--quick` for fast iteration. - Prefer default mode when the user wants a balanced answer. - Prefer `--deep` only when the user explicitly wants maximum recall or the topic is complex enough to justify extra latency. - Prefer `--emit=json` when downstream code or evaluation will consume the result. - Use `--search=` only when the user explicitly wants source restrictions. ## X handle resolution If the topic could have its own X/Twitter account (people, brands, products, companies), do a quick WebSearch for their handle: ``` WebSearch("{TOPIC} X twitter handle site:x.com") ``` If you find a verified handle, pass `--x-handle={handle}` (without @). This searches their posts directly, finding content they posted that doesn't mention their own name. Skip this for generic concepts ("best headphones 2026", "how to use Docker"). ## Synthesis guidance ### First: synthesize, don't summarize Extract key facts from the output first, then synthesize across sources. Lead with patterns that appear across multiple clusters. Present a unified narrative, not a source-by-source summary. ### Ground in actual research, not pre-existing knowledge Use exact product/tool names, specific quotes, and what sources actually say. If research mentions "ClawdBot" and "@clawdbot", that is a different product than "Claude Code" -- read what the research actually says. **Anti-pattern to avoid:** - BAD: User asks "best Claude Code skills" and you respond with generic advice: "Skills are powerful. Keep them under 500 lines." - GOOD: You respond with specifics from the research: "Most mentioned: /commit (5 mentions), remotion skill (4x), git-worktree (3x). The Remotion announcement got 16K likes on X per @thedorbrothers." ### Source weighting (highest to lowest signal) 1. **Cross-cluster corroboration** -- same evidence across multiple sources is the strongest signal. Lead with it. 2. **Reddit top comments** -- often the wittiest, most insightful take. Quote directly when upvotes are high. 3. **YouTube transcript highlights** -- pre-extracted key moments. Quote and attribute to channel name. 4. **X/Twitter @handles** -- real-time community signal. Quote with engagement context. 5. **Polymarket odds** -- real money on outcomes cuts through opinion. Include specific odds AND movement. 6. **TikTok/Instagram** -- viral/creator signal. Cite @creators with views/likes. 7. **Hacker News** -- technical community perspective. Cite as "per HN." 8. **Web (Brave/Serper)** -- cite only when social sources don't cover a fact. ### Polymarket interpretation When Polymarket returns relevant markets: 1. Prefer structural/long-term markets over near-term deadlines (championship odds > regular season, IPO > incremental update) 2. Call out the specific outcome's odds and movement, not just that a market exists 3. Weave odds into the narrative as supporting evidence, don't isolate them 4. When multiple relevant markets exist, highlight 3-5 ordered by importance Domain importance ranking: - **Sports:** Championship/tournament > conference title > regular season > weekly matchup - **Geopolitics:** Regime change/structural > near-term strike deadlines > sanctions - **Tech/Business:** IPO, major product launch > incremental updates - **Elections:** Presidency > primary > individual state ### Citation rules Cite the single strongest source per point in short format: "per @handle" or "per r/subreddit". Save engagement metrics for the stats section. Use the priority order from source weighting above. The tool's value is surfacing what PEOPLE are saying, not what journalists wrote. ### Comparison queries For "X vs Y" queries, structure output as: ``` ## Quick Verdict [1-2 sentences: which one the community prefers and why, with source counts] ## [Entity A] **Community Sentiment:** [Positive/Mixed/Negative] (N mentions across sources) **Strengths:** [with source attribution] **Weaknesses:** [with source attribution] ## [Entity B] [Same structure] ## Head-to-Head | Dimension | Entity A | Entity B | |-----------|----------|----------| | [Key dim] | [position] | [position] | ## Bottom Line Choose A if... Choose B if... (based on community data) ``` ### Recommendation queries When users ask "best X" or "top X", extract SPECIFIC NAMES: ``` Most mentioned: [Name] -- Nx mentions Sources: @handle1, r/subreddit, [YouTube channel] [Name] -- Nx mentions Sources: @handle2, r/subreddit2 Notable mentions: [others with 1-2 mentions] ``` ### Edge cases - **Empty results from a source:** State what is missing. ("No Reddit discussion found for this topic.") Do not fill the gap with training data. - **Sources contradict each other:** Present both sides with attribution. ("Reddit r/fitness is bullish on X, while @DrExpert on X warns about Y.") - **All results are low-engagement or off-topic:** Acknowledge uncertainty. ("Limited recent discussion found -- these findings should be treated as preliminary.") ### Follow-up conversations After research completes, treat yourself as an expert on this topic. Answer follow-ups from the research findings. Cite the specific threads, posts, and channels you found. Only run new research if the user asks about a DIFFERENT topic. ## Security and permissions **What this skill does:** - Sends search queries to ScrapeCreators API for Reddit, TikTok, Instagram search - Sends search queries via xAI API or Bird client for X search - Sends search queries to Algolia HN Search API (free, no auth) - Sends search queries to Polymarket Gamma API (free, no auth) - Runs yt-dlp locally for YouTube search and transcript extraction (no API key) - Sends search queries to Brave Search API or Serper for web search (optional) - Uses Gemini, OpenAI, or xAI for LLM planning and reranking - Stores findings in local SQLite database (--store mode only) **What this skill does NOT do:** - Does not post, like, or modify content on any platform - Does not access your personal accounts on any platform - Does not share API keys between providers - Does not log or cache API keys in output files