Pulse — Multi-Source Recency Research

Multi-source recency research skill that takes the pulse of any topic across Reddit, Hacker News, the open web, and optionally X/Twitter within a configurable recent window (default 30 days).

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/pulse, including the files SKILL.md points to.
  2. Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit alirezarezvani/claude-skills/research/pulse/skills/pulse#main ~/.claude/skills/pulse

For one project only, change the path to .claude/skills/pulse. This skill also uses citation_tracker.py, topic_slug_generator.py — copying SKILL.md alone won't be enough. See the folder on GitHub.

Claude (web or desktop app)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Pulse — Multi-Source Recency Research

Show the full text276 lines
namedescriptionlicensemetadata
pulseMulti-source recency research skill that takes the pulse of any topic across Reddit, Hacker News, the open web, and optionally X/Twitter within a configurable recent window (default 30 days). Forcing intake clarifies topic specificity, angle (trend/sentiment/problems/opportunities/comparison), time window, and platform scope before searching. Returns a synthesized briefing with citations, engagement metrics, and cross-platform pattern analysis. Use when the user requests multi-source recency intelligence on a topic (e.g., 'pulse on [topic]', 'what's happening with [topic]', 'what are people saying about [topic]', 'current conversation about [topic]', 'take the pulse of [topic]', 'trending: [topic]', 'find me info on [topic]'), and for competitor research, trend discovery, tool comparisons, and audience sentiment analysis.MIT source_spec: "megaprompts/01-pulse-megaprompt.md build_pattern: "Path B (direct conversion) research_pack_convention: "Agent Integrity Rules block preserved verbatim per PR #657 audit version: 1.0.0

Pulse — Multi-Source Recency Research

Portability: Works in Claude Code CLI and Claude.ai. Phase 4 accepts a local X/Twitter search export before trying a live interface.

A recency-oriented research skill that synthesizes what people are saying about a topic across Reddit, Hacker News, the open web, and (optionally) X/Twitter — within a configurable time window. Output is a single coherent briefing with citations, engagement signals, and cross-platform pattern analysis. The skill captures the current conversation, not the canonical reference.

Invocation

Explicit trigger phrases:

  • "pulse on [topic]"
  • "what's happening with [topic]"
  • "what are people saying about [topic]"
  • "current conversation about [topic]"
  • "take the pulse of [topic]"
  • "trending: [topic]"
  • "find me info on [topic]"

Also covers: competitor research with recency flavor, trend discovery, tool comparisons, audience sentiment analysis.

Agent Integrity Rules (Research-Pack Convention)

The following rules apply throughout the run. They are inherited from the research-pack convention and locked down by PR #657's cross-skill consistency audit.

  • Execution discipline. Phases 1–3 run in parallel (Reddit + HN + Web are independent). Within each phase, sequential calls only. 1 q/sec rate limit per platform. Confirm response received before next call within the same phase.
  • Source discipline. Cite only sources returned by this session's tool calls. Training knowledge is labeled [Background — not from search] and excluded from primary findings count.
  • Three-count tracking. Queries sent / sources received (shown) / sources cited. Surfaced in the audit log inline in the synthesis section. Use scripts/citation_tracker.py for the deterministic count.
  • Retry policy. On failure → wait 3s → retry once → log. After 3 consecutive failures across all sources: stop, alert user, share what was collected. Never deliver an empty file.
  • Plan-tier detection. Reddit + HN are unauthenticated public JSON APIs (rate-limited per IP, not per plan). Surface rate-limit signals from response headers when available; degrade gracefully otherwise.

See references/research_pack_conventions.md for the canon and references/parallel_execution_discipline.md for the rate-limit rationale.

Phase 0: Grill-Me Intake (2–4 forcing questions, one at a time)

Dependency-ordered. Each question carries explicit "why I'm asking". Stop condition: max 4.

Q1 (root) — Topic Specificity

What's the topic? State it in 1–2 sentences — be specific. "AI" or "tech" will get you a vague survey; "self-hosted LLM deployment for small teams" or "Claude Code adoption among enterprise engineering orgs" will get you a useful answer.

Why I'm asking: Specificity dictates search quality. Vague topics produce vague briefings. If your topic is broad, I'd rather narrow it now than spend a search budget on noise.

Refuse mush. If the user says "AI", push back once: "What about AI — adoption, safety, capability, regulation, or comparison? Pick an angle." If the user still won't narrow after one push-back, deliver with the explicit "vague topic — survey level, not depth" caveat.

Q2 (depends on Q1) — Angle

What angle matters most? Pick one:

  1. Trend — what's accelerating or decelerating
  2. Sentiment — what people feel about it
  3. Problems — pain points and complaints
  4. Opportunities — gaps and unmet needs
  5. Comparison — how it stacks up against alternatives

Why I'm asking: The angle dictates which sources weight more (Reddit for sentiment, HN for technical critique, Web for trend coverage) and how I rank the synthesis.

Forcing choice. Recommended default: trend, unless the topic obviously calls for a different angle.

Q3 (always) — Time Window

Time window: 7 / 14 / 30 / 60 / 90 days? Default is 30.

Why I'm asking: 7 days catches breaking conversation; 90 days catches sustained narrative shift. Pick based on how recent the news matters.

Forcing choice with default.

Q4 (depends on Q1) — Platform Scope

Any platform to skip? By default I'll cover Reddit + Hacker News + open web, plus X/Twitter if browser automation is available. Skip any you don't care about.

Why I'm asking: Skipping a platform saves search budget. Reddit dominates sentiment; HN dominates technical critique; Web dominates breadth; X dominates breaking conversation. Skip what doesn't fit your angle.

Asked only if Q1 + Q2 suggest some platforms are clearly off-target (e.g., consumer sentiment topic → HN less useful). Otherwise default to "all platforms".

Stop condition: After Q4 (or earlier with dependency skips), commit and start Phase 1. Max 4 questions, never bundle.

Pre-flight

Before any phase fires:

  1. Compute the time window with scripts/time_window_calculator.py --window <Nd>. Get back the Unix timestamp for created_at_i> (HN) and the t= parameter (hour|day|week|month|year|all) for Reddit.
  2. Generate the output slug with scripts/topic_slug_generator.py --topic "<topic>" --date $(date +%Y-%m-%d). Detect if ${RESEARCH_DIR}/pulse/<slug>-<date>.md already exists; if yes, append -v2 suffix or warn user.
  3. Start the three-count audit log with scripts/citation_tracker.py --action start --session pulse-<date>-<slug>. This file at ~/.pulse_sessions/<session>.json persists across the run.

Phase 1: Reddit (parallel with HN + Web)

API: reddit.com/search.json (unauthenticated, public JSON).

Queries (sequential within Reddit, 1 q/sec):

  1. sort=top&t=<window>&q=<topic> — top posts in window
  2. sort=new&t=<window>&q=<topic> — new posts in window (catches breaking signal)
  3. For each of the top 3–5 posts by score: fetch the comments JSON (<post-url>.json?limit=top) for the top 10–20 comments.

Headers / rate limits. Reddit rate-limits by IP, not plan. Throttle to 1 q/sec. If response has X-Ratelimit-Remaining: 0 or returns 429, wait 3s, retry once. If still failing, fall back to subreddit-restricted search (r/<topic-subreddit>/search.json) or ?raw_json=1.

Record each query: citation_tracker.py --action record_sent --session NAME --query "...". Record received counts: citation_tracker.py --action record_received --session NAME --count N.

Phase 2: Hacker News (parallel with Reddit + Web)

API: Algolia HN search (hn.algolia.com/api/v1/).

Queries (sequential within HN, 1 q/sec):

  1. search?query=<topic>&numericFilters=created_at_i><timestamp>&tags=story — stories in window
  2. search?query=<topic>&numericFilters=created_at_i><timestamp>&tags=comment — comments in window (catches discussion signal)

Failure handling. If HN returns empty: broaden the query (remove uncommon nouns); if still empty, drop the timestamp filter as last resort and label results "outside window".

HN bias note. HN skews technical / builder. Surface this in synthesis: "HN's voice is implementation-oriented; consumer sentiment will be under-represented here."

Phase 3: Web Search (parallel with Reddit + HN)

Tools: Available web search + fetch (e.g., WebSearch + WebFetch).

Query strategy (sequential within Web, 1 q/sec):

  1. Trusted publishers — "<topic>" site:nytimes.com OR site:wsj.com OR site:wired.com OR site:theverge.com OR site:techcrunch.com after:<date>
  2. Recent reviews — "<topic>" review <year> or "<topic>" "honest review" after:<date>
  3. Honest-opinion sources — "<topic>" problems OR complaints OR "worth it" after:<date>

Fetch the top 3–5 URLs per query. Truncate at the body, skip cookie/nav markup.

Citation discipline. Every claim in the Web section must trace to a fetched URL. Do NOT cite from snippets alone; fetch first.

Phase 4: X/Twitter (sequential, optional)

Run last. Reasons:

  • Most likely to fail / require browser automation
  • X content overlaps significantly with Reddit/HN — so it adds delta, not primary signal

Interface (in priority order):

  1. User-provided JSON export. Import it before any live request:
    python3 scripts/citation_tracker.py \
      --action import_sources \
      --session NAME \
      --input /path/to/x-search.json \
      --platform x \
      --since 2026-07-01T00:00:00Z \
      --until 2026-08-01T00:00:00Z
    
    The importer accepts Xquik Tweet Search, X API v2, and generic JSON exports. It normalizes legacy and snake-case fields, joins X API includes.users, filters the requested window, and deduplicates by Tweet ID. It makes no network calls and requires no API key. The audit stores the filename and SHA-256 digest, not the user's absolute path.
  2. Grok if available in the harness.
  3. X API if authenticated.
  4. Browser automation if the harness supports it.
  5. Skip with note if none of the above are available.

Documented behavior:

If Phase 4 is skipped: include the section header ## X/Twitter with body Skipped — [reason: no browser automation / no Grok / no X API]. Do NOT pretend to have data.

Synthesis (Cross-Platform Patterns)

After Phases 1–4 complete (or Phase 4 skipped), produce the synthesis:

  1. Consensus signals — points where 3+ platforms agree (highest confidence). Tag each with cited source URLs.
  2. Controversy signals — points where platforms disagree. Note who says what.
  3. Pain points — recurring complaints across sources (esp. Reddit + Web).
  4. Excitement signals — recurring enthusiasm (esp. HN + X if available).
  5. Emerging trends — first-time mentions in newest posts but absent from older ones (compare sort=new vs sort=top).
  6. Gaps — what's notably absent that you'd expect to find.

For each pattern, cite the source URLs that support it. Use citation_tracker.py --action record_cited --session NAME --url "..." per citation.

See references/cross_platform_synthesis.md for detection heuristics.

Output

Save to file AND paste in chat:

File: ${RESEARCH_DIR}/pulse/<topic-slug>-<YYYY-MM-DD>.md (path from topic_slug_generator.py).

Format:

# [TOPIC] — Pulse (Last [N] Days)
*Generated: [DATE] | Angle: [Q2 choice]*

## TL;DR
[2-3 sentences max]

## Reddit
### Top Posts
- **[Title]** (r/sub) — [score, comments] — [summary] — [URL]
### What Reddit Is Saying
[Narrative paragraph]

## Hacker News
### Notable Stories
- **[Title]** — [points, comments] — [summary] — [URL]
### What HN Is Saying
[Narrative paragraph; note HN's technical/builder bias]

## Web
### Key Sources
- **[Title]** ([Publication]) — [takeaway] — [URL]
### What the Web Is Saying
[Narrative paragraph]

## X/Twitter (if available)
[Cleaned response, with handles/references preserved]
[Or: "Skipped — [reason]"]

## Cross-Platform Patterns
[Highest-confidence signals across sources]

## Key Takeaways
- [3-5 bullets]

## Content Angles (if applicable)
[2-3 specific angles supported by the data]

---
*Audit:* Queries sent: N (Reddit: a, HN: b, Web: c, X: d|skipped).
Sources received: M. Sources cited: K. Training knowledge: 0 ([Background] excluded from count).

Error Handling

Failure Behavior
Topic is too vague (Q1) Refuse to start. Re-ask Q1 once with examples. After 1 push-back, deliver with "vague topic" caveat.
Reddit blocks / rate-limits Try ?raw_json=1 or fall back to subreddit-restricted search. Honor 3s-retry.
HN returns empty Broaden query, drop timestamp filter as last resort, label results "outside window".
Web search returns nothing useful Note in output; don't fabricate sources.
Browser automation unavailable Import a supplied export. Otherwise skip Phase 4 with a note.
Local X export is invalid Stop Phase 4. Report the parse error. Do not guess missing records.
WebFetch times out Use what loaded, mark the source as "truncated".
3 consecutive failures across sources Stop. Return what was collected with explicit "stopped early" note. Do NOT deliver empty file.
All sources fail Return error with diagnostic info. Do NOT deliver empty file.

Tooling

Script Role
scripts/time_window_calculator.py Compute Unix timestamps + Reddit t= parameter from window string (30d, 7d, etc.). Deterministic from datetime.now().
scripts/citation_tracker.py Three-count audit log plus local X export normalization and deduplication.
scripts/topic_slug_generator.py Filesystem-safe slug + duplicate-date detection for output paths.

References

  • references/research_pack_conventions.md — Agent Integrity Rules canon (7+ sources: Google SRE, Reddit API docs, Algolia HN docs, exponential-backoff literature, citation discipline)
  • references/cross_platform_synthesis.md — consensus / controversy / pain detection across platforms (7+ sources)
  • references/parallel_execution_discipline.md — 1 q/sec rationale + plan-tier signals (7+ sources)

Anti-Patterns To Reject

  • Starting any search before the user commits to topic specificity (Q1)
  • Batching intake questions instead of one at a time
  • Hardcoded URLs that won't survive API changes (note format, explain may evolve)
  • Irrelevant person or brand references in the skill body
  • Tight coupling to one X/Twitter interface
  • Counting duplicate Tweet IDs or repeated citation URLs as separate sources
  • Missing fallback behavior on source failure
  • "Just use [specific tool]" without explaining what the tool does
  • Citing training knowledge in the cited count
  • Fabricating sources to fill out a section

Version: 1.0.0 Source spec: megaprompts/01-pulse-megaprompt.md (maintainer-local draft spec — gitignored, not present in the public repository) Build pattern: Path B (direct conversion). Re-grill with /cs:grill-with-docs if drift between spec and implementation surfaces.

1---
2name: pulse
3description: "Multi-source recency research skill that takes the pulse of any topic across Reddit, Hacker News, the open web, and optionally X/Twitter within a configurable recent window (default 30 days). Forcing intake clarifies topic specificity, angle (trend/sentiment/problems/opportunities/comparison), time window, and platform scope before searching. Returns a synthesized briefing with citations, engagement metrics, and cross-platform pattern analysis. Use when the user requests multi-source recency intelligence on a topic (e.g., 'pulse on [topic]', 'what's happening with [topic]', 'what are people saying about [topic]', 'current conversation about [topic]', 'take the pulse of [topic]', 'trending: [topic]', 'find me info on [topic]'), and for competitor research, trend discovery, tool comparisons, and audience sentiment analysis."
4license: MIT
5metadata:
6 source_spec: "megaprompts/01-pulse-megaprompt.md"
7 build_pattern: "Path B (direct conversion)"
8 research_pack_convention: "Agent Integrity Rules block preserved verbatim per PR #657 audit"
9 version: 1.0.0
10---
11 
12# Pulse — Multi-Source Recency Research
13 
14> **Portability:** Works in Claude Code CLI and Claude.ai. Phase 4 accepts a local X/Twitter search export before trying a live interface.
15 
16A recency-oriented research skill that synthesizes what people are saying about a topic across Reddit, Hacker News, the open web, and (optionally) X/Twitter — within a configurable time window. Output is a single coherent briefing with citations, engagement signals, and cross-platform pattern analysis. The skill captures the **current conversation**, not the canonical reference.
17 
18## Invocation
19 
20**Explicit trigger phrases:**
21- "pulse on [topic]"
22- "what's happening with [topic]"
23- "what are people saying about [topic]"
24- "current conversation about [topic]"
25- "take the pulse of [topic]"
26- "trending: [topic]"
27- "find me info on [topic]"
28 
29Also covers: competitor research with recency flavor, trend discovery, tool comparisons, audience sentiment analysis.
30 
31## Agent Integrity Rules (Research-Pack Convention)
32 
33The following rules apply throughout the run. They are inherited from the research-pack convention and locked down by PR #657's cross-skill consistency audit.
34 
35- **Execution discipline.** Phases 1–3 run in parallel (Reddit + HN + Web are independent). Within each phase, sequential calls only. **1 q/sec rate limit per platform.** Confirm response received before next call within the same phase.
36- **Source discipline.** Cite only sources returned by **this session's tool calls.** Training knowledge is labeled `[Background — not from search]` and excluded from primary findings count.
37- **Three-count tracking.** Queries sent / sources received (shown) / sources cited. Surfaced in the audit log inline in the synthesis section. Use `scripts/citation_tracker.py` for the deterministic count.
38- **Retry policy.** On failure → wait 3s → retry once → log. After **3 consecutive failures across all sources:** stop, alert user, share what was collected. Never deliver an empty file.
39- **Plan-tier detection.** Reddit + HN are unauthenticated public JSON APIs (rate-limited per IP, not per plan). Surface rate-limit signals from response headers when available; degrade gracefully otherwise.
40 
41See `references/research_pack_conventions.md` for the canon and `references/parallel_execution_discipline.md` for the rate-limit rationale.
42 
43## Phase 0: Grill-Me Intake (2–4 forcing questions, one at a time)
44 
45Dependency-ordered. Each question carries explicit "why I'm asking". Stop condition: max 4.
46 
47### Q1 (root) — Topic Specificity
48 
49> **What's the topic? State it in 1–2 sentences — be specific. "AI" or "tech" will get you a vague survey; "self-hosted LLM deployment for small teams" or "Claude Code adoption among enterprise engineering orgs" will get you a useful answer.**
50>
51> *Why I'm asking:* Specificity dictates search quality. Vague topics produce vague briefings. If your topic is broad, I'd rather narrow it now than spend a search budget on noise.
52 
53**Refuse mush.** If the user says "AI", push back once: "What about AI — adoption, safety, capability, regulation, or comparison? Pick an angle." If the user still won't narrow after one push-back, deliver with the explicit "vague topic — survey level, not depth" caveat.
54 
55### Q2 (depends on Q1) — Angle
56 
57> **What angle matters most? Pick one:**
58>
59> 1. **Trend** — what's accelerating or decelerating
60> 2. **Sentiment** — what people feel about it
61> 3. **Problems** — pain points and complaints
62> 4. **Opportunities** — gaps and unmet needs
63> 5. **Comparison** — how it stacks up against alternatives
64>
65> *Why I'm asking:* The angle dictates which sources weight more (Reddit for sentiment, HN for technical critique, Web for trend coverage) and how I rank the synthesis.
66 
67Forcing choice. **Recommended default:** trend, unless the topic obviously calls for a different angle.
68 
69### Q3 (always) — Time Window
70 
71> **Time window: 7 / 14 / 30 / 60 / 90 days? Default is 30.**
72>
73> *Why I'm asking:* 7 days catches breaking conversation; 90 days catches sustained narrative shift. Pick based on how recent the news matters.
74 
75Forcing choice with default.
76 
77### Q4 (depends on Q1) — Platform Scope
78 
79> **Any platform to skip? By default I'll cover Reddit + Hacker News + open web, plus X/Twitter if browser automation is available. Skip any you don't care about.**
80>
81> *Why I'm asking:* Skipping a platform saves search budget. Reddit dominates sentiment; HN dominates technical critique; Web dominates breadth; X dominates breaking conversation. Skip what doesn't fit your angle.
82 
83Asked only if Q1 + Q2 suggest some platforms are clearly off-target (e.g., consumer sentiment topic → HN less useful). Otherwise default to "all platforms".
84 
85**Stop condition:** After Q4 (or earlier with dependency skips), commit and start Phase 1. Max 4 questions, never bundle.
86 
87## Pre-flight
88 
89Before any phase fires:
90 
911. **Compute the time window** with `scripts/time_window_calculator.py --window <Nd>`. Get back the Unix timestamp for `created_at_i>` (HN) and the `t=` parameter (`hour|day|week|month|year|all`) for Reddit.
922. **Generate the output slug** with `scripts/topic_slug_generator.py --topic "<topic>" --date $(date +%Y-%m-%d)`. Detect if `${RESEARCH_DIR}/pulse/<slug>-<date>.md` already exists; if yes, append `-v2` suffix or warn user.
933. **Start the three-count audit log** with `scripts/citation_tracker.py --action start --session pulse-<date>-<slug>`. This file at `~/.pulse_sessions/<session>.json` persists across the run.
94 
95## Phase 1: Reddit (parallel with HN + Web)
96 
97**API:** `reddit.com/search.json` (unauthenticated, public JSON).
98 
99**Queries (sequential within Reddit, 1 q/sec):**
1001. `sort=top&t=<window>&q=<topic>` — top posts in window
1012. `sort=new&t=<window>&q=<topic>` — new posts in window (catches breaking signal)
1023. For each of the top 3–5 posts by score: fetch the comments JSON (`<post-url>.json?limit=top`) for the top 10–20 comments.
103 
104**Headers / rate limits.** Reddit rate-limits by IP, not plan. Throttle to 1 q/sec. If response has `X-Ratelimit-Remaining: 0` or returns 429, wait 3s, retry once. If still failing, fall back to subreddit-restricted search (`r/<topic-subreddit>/search.json`) or `?raw_json=1`.
105 
106**Record each query:** `citation_tracker.py --action record_sent --session NAME --query "..."`.
107**Record received counts:** `citation_tracker.py --action record_received --session NAME --count N`.
108 
109## Phase 2: Hacker News (parallel with Reddit + Web)
110 
111**API:** Algolia HN search (`hn.algolia.com/api/v1/`).
112 
113**Queries (sequential within HN, 1 q/sec):**
1141. `search?query=<topic>&numericFilters=created_at_i><timestamp>&tags=story` — stories in window
1152. `search?query=<topic>&numericFilters=created_at_i><timestamp>&tags=comment` — comments in window (catches discussion signal)
116 
117**Failure handling.** If HN returns empty: broaden the query (remove uncommon nouns); if still empty, drop the timestamp filter as last resort and label results "outside window".
118 
119**HN bias note.** HN skews technical / builder. Surface this in synthesis: "HN's voice is implementation-oriented; consumer sentiment will be under-represented here."
120 
121## Phase 3: Web Search (parallel with Reddit + HN)
122 
123**Tools:** Available web search + fetch (e.g., `WebSearch` + `WebFetch`).
124 
125**Query strategy (sequential within Web, 1 q/sec):**
1261. **Trusted publishers** — `"<topic>" site:nytimes.com OR site:wsj.com OR site:wired.com OR site:theverge.com OR site:techcrunch.com after:<date>`
1272. **Recent reviews** — `"<topic>" review <year>` or `"<topic>" "honest review" after:<date>`
1283. **Honest-opinion sources** — `"<topic>" problems OR complaints OR "worth it" after:<date>`
129 
130Fetch the top 3–5 URLs per query. Truncate at the body, skip cookie/nav markup.
131 
132**Citation discipline.** Every claim in the Web section must trace to a fetched URL. Do NOT cite from snippets alone; fetch first.
133 
134## Phase 4: X/Twitter (sequential, optional)
135 
136Run last. Reasons:
137- Most likely to fail / require browser automation
138- X content overlaps significantly with Reddit/HN — so it adds delta, not primary signal
139 
140**Interface (in priority order):**
1411. **User-provided JSON export.** Import it before any live request:
142 ```bash
143 python3 scripts/citation_tracker.py \
144 --action import_sources \
145 --session NAME \
146 --input /path/to/x-search.json \
147 --platform x \
148 --since 2026-07-01T00:00:00Z \
149 --until 2026-08-01T00:00:00Z
150 ```
151 The importer accepts Xquik Tweet Search, X API v2, and generic JSON exports.
152 It normalizes legacy and snake-case fields, joins X API `includes.users`,
153 filters the requested window, and deduplicates by Tweet ID. It makes no
154 network calls and requires no API key. The audit stores the filename and
155 SHA-256 digest, not the user's absolute path.
1562. **Grok** if available in the harness.
1573. **X API** if authenticated.
1584. **Browser automation** if the harness supports it.
1595. **Skip with note** if none of the above are available.
160 
161**Documented behavior:**
162> If Phase 4 is skipped: include the section header `## X/Twitter` with body `Skipped — [reason: no browser automation / no Grok / no X API]`. Do NOT pretend to have data.
163 
164## Synthesis (Cross-Platform Patterns)
165 
166After Phases 1–4 complete (or Phase 4 skipped), produce the synthesis:
167 
1681. **Consensus signals** — points where 3+ platforms agree (highest confidence). Tag each with cited source URLs.
1692. **Controversy signals** — points where platforms disagree. Note who says what.
1703. **Pain points** — recurring complaints across sources (esp. Reddit + Web).
1714. **Excitement signals** — recurring enthusiasm (esp. HN + X if available).
1725. **Emerging trends** — first-time mentions in newest posts but absent from older ones (compare `sort=new` vs `sort=top`).
1736. **Gaps** — what's notably absent that you'd expect to find.
174 
175For each pattern, **cite the source URLs** that support it. Use `citation_tracker.py --action record_cited --session NAME --url "..."` per citation.
176 
177See `references/cross_platform_synthesis.md` for detection heuristics.
178 
179## Output
180 
181Save to file AND paste in chat:
182 
183**File:** `${RESEARCH_DIR}/pulse/<topic-slug>-<YYYY-MM-DD>.md` (path from `topic_slug_generator.py`).
184 
185**Format:**
186 
187```markdown
188# [TOPIC] — Pulse (Last [N] Days)
189*Generated: [DATE] | Angle: [Q2 choice]*
190 
191## TL;DR
192[2-3 sentences max]
193 
194## Reddit
195### Top Posts
196- **[Title]** (r/sub) — [score, comments] — [summary] — [URL]
197### What Reddit Is Saying
198[Narrative paragraph]
199 
200## Hacker News
201### Notable Stories
202- **[Title]** — [points, comments] — [summary] — [URL]
203### What HN Is Saying
204[Narrative paragraph; note HN's technical/builder bias]
205 
206## Web
207### Key Sources
208- **[Title]** ([Publication]) — [takeaway] — [URL]
209### What the Web Is Saying
210[Narrative paragraph]
211 
212## X/Twitter (if available)
213[Cleaned response, with handles/references preserved]
214[Or: "Skipped — [reason]"]
215 
216## Cross-Platform Patterns
217[Highest-confidence signals across sources]
218 
219## Key Takeaways
220- [3-5 bullets]
221 
222## Content Angles (if applicable)
223[2-3 specific angles supported by the data]
224 
225---
226*Audit:* Queries sent: N (Reddit: a, HN: b, Web: c, X: d|skipped).
227Sources received: M. Sources cited: K. Training knowledge: 0 ([Background] excluded from count).
228```
229 
230## Error Handling
231 
232| Failure | Behavior |
233|---|---|
234| Topic is too vague (Q1) | Refuse to start. Re-ask Q1 once with examples. After 1 push-back, deliver with "vague topic" caveat. |
235| Reddit blocks / rate-limits | Try `?raw_json=1` or fall back to subreddit-restricted search. Honor 3s-retry. |
236| HN returns empty | Broaden query, drop timestamp filter as last resort, label results "outside window". |
237| Web search returns nothing useful | Note in output; don't fabricate sources. |
238| Browser automation unavailable | Import a supplied export. Otherwise skip Phase 4 with a note. |
239| Local X export is invalid | Stop Phase 4. Report the parse error. Do not guess missing records. |
240| WebFetch times out | Use what loaded, mark the source as "truncated". |
241| 3 consecutive failures across sources | Stop. Return what was collected with explicit "stopped early" note. Do NOT deliver empty file. |
242| All sources fail | Return error with diagnostic info. Do NOT deliver empty file. |
243 
244## Tooling
245 
246| Script | Role |
247|---|---|
248| `scripts/time_window_calculator.py` | Compute Unix timestamps + Reddit `t=` parameter from window string (`30d`, `7d`, etc.). Deterministic from `datetime.now()`. |
249| `scripts/citation_tracker.py` | Three-count audit log plus local X export normalization and deduplication. |
250| `scripts/topic_slug_generator.py` | Filesystem-safe slug + duplicate-date detection for output paths. |
251 
252## References
253 
254- `references/research_pack_conventions.md` — Agent Integrity Rules canon (7+ sources: Google SRE, Reddit API docs, Algolia HN docs, exponential-backoff literature, citation discipline)
255- `references/cross_platform_synthesis.md` — consensus / controversy / pain detection across platforms (7+ sources)
256- `references/parallel_execution_discipline.md` — 1 q/sec rationale + plan-tier signals (7+ sources)
257 
258## Anti-Patterns To Reject
259 
260- Starting any search before the user commits to topic specificity (Q1)
261- Batching intake questions instead of one at a time
262- Hardcoded URLs that won't survive API changes (note format, explain may evolve)
263- Irrelevant person or brand references in the skill body
264- Tight coupling to one X/Twitter interface
265- Counting duplicate Tweet IDs or repeated citation URLs as separate sources
266- Missing fallback behavior on source failure
267- "Just use [specific tool]" without explaining what the tool does
268- Citing training knowledge in the cited count
269- Fabricating sources to fill out a section
270 
271---
272 
273**Version:** 1.0.0
274**Source spec:** `megaprompts/01-pulse-megaprompt.md` (maintainer-local draft spec — gitignored, not present in the public repository)
275**Build pattern:** Path B (direct conversion). Re-grill with `/cs:grill-with-docs` if drift between spec and implementation surfaces.
276 

Discussion

Alternatives

Also in Competitor researchSee all 277 in Product →
Competitor Comparison & Alternatives PagesTell us your product and a rival you keep losing deals to, and get back a ready-to-publish page that shows why customers should pick you.Business & ops · MITAd angle minerMine the highest-converting ad angles from customer reviews, Reddit complaints, support tickets, and competitor ads. Extracts actual pain language, competitor weaknesses, and outcome phrases that real buyers use. Outputs a ranked angle bank with proof quotes and recommended ad formats per angle.Business & ops · MITX audience insightsRead your X (Twitter) audience and niche from real data. Pull a handle's recent tweets (yours or a competitor's) with likes, replies, and views, see which formats and hooks are working, read the repliers on a tweet (X gates likers, so repliers are the signal), and scan a niche query for top tweets. Powered by Apify, no login. Triggers on "analyze my tweets", "what is working on X", "read the replies", "competitor tweets", "who is engaging". Not for writing a tweet (use x-post-writer).Marketing · MITFacebook Audience InsightsRead a Facebook Page and its audience from real data. Pull any Page's public stats (yours or a competitor's): followers, likes, categories, intro, websites. And pull the commenters on a public Page post, since Facebook hides the reactor and liker roster and shows counts only, so commenters are the signal. Powered by Apify, no login. Triggers on "analyze my Page", "competitor Page stats", "who is commenting", "read the comments", "audience insights". Not for writing Page posts (use fb-post-writer).Marketing · MIT