trump-truth-monitor
Use when monitoring or interpreting Donald Trump's Truth Social posts for market-moving events — tariff announcements, sanctions, deals with countries (China / Mexico / Canada / EU / Japan / Korea / Taiwan), specific company / CEO mentions, Fed pressure, energy / oil commentary,
Install
npx skills add https://github.com/kansoku-trade/kansoku/tree/main/.claude/skills/trump-truth-monitor
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install kansoku-trade-kansoku@llmmart
git clone https://github.com/kansoku-trade/kansoku.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole kansoku-trade/kansoku collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Trump Truth Monitor
Pulls Donald Trump's Truth Social feed via the trumpstruth.org RSS mirror, classifies posts into market-relevant topic buckets, and hands the candidate list off for LLM-level market-impact grading.
When to use
- User asks what Trump has posted recently
- Pre-market gap on policy-sensitive sectors (semis, China ADRs, autos, energy, banks, defense) — check whether a Trump post is the trigger
- Building the "Catalyst (now)" lens of
stock-deep-divefor a name with policy exposure (TSM, NVDA, AAPL, F, GM, XOM, BAC, RTX, LMT) market-session-trackerpre-market protocol — add a Trump-feed pass
If the user wants tweet history beyond ~5 days, this skill is insufficient — the RSS mirror only exposes the latest ~100 posts. Route to Factba.se / Roll Call (paid) or note the limitation explicitly.
Data source
trumpstruth.org/feed — a public third-party mirror of @realDonaldTrump on Truth Social. RSS 2.0 XML with these fields per item:
| Field | Meaning |
|---|---|
<pubDate> |
RFC 2822, original Truth Social post timestamp |
<link> |
trumpstruth.org/statuses/ |
<truth:originalUrl> |
truthsocial.com/@realDonaldTrump/ — the primary source |
<description> |
Full post body with HTML (links + ellipsis spans) |
The mirror typically lags the original by ≤2 minutes. Single feed pull returns ~100 most recent posts, covering ~5 days at Trump's typical cadence.
CLI
Read mode — fetch.py
# Default: last 24h, keyword-filtered, markdown
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py
# Wider window
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --hours 72
# All posts in feed regardless of keyword
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --hours 72 --all
# Single topic
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --topic tariff_trade
# JSON output (for chaining)
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --json
Topic buckets defined in script: tariff_trade, semi_tech, energy, fed_macro, crypto, geopolitical.
Archive mode — archive.py
# Append new posts to journal/trump-feed/YYYY-MM-DD.md (idempotent)
python3 .claude/skills/trump-truth-monitor/scripts/archive.py
# Custom output dir
python3 .claude/skills/trump-truth-monitor/scripts/archive.py --out /path/to/dir
# Silent unless something new was added
python3 .claude/skills/trump-truth-monitor/scripts/archive.py --quiet
The archive de-dupes by mirror status_id — re-running on the same feed is a no-op. Designed to be scheduled (see launchd/README.md). Once archived, posts persist locally even if trumpstruth.org goes down.
Workflow
- Decide window. Default 24h. Use 48–72h when investigating a multi-day move. Use
--allwhen context-grazing. - Decide scope. If user asks generally → no
--topic. If user names a domain (关税 / 半导体 / 油 / 加密) → pass--topic. - Pull feed. Run
fetch.pywith chosen flags. Always include--hours— never default to "all of feed" silently. - Second-pass grading. Script output is candidates, not signals. For each post:
- Read the full text before assigning impact. Headlines and keyword tags lie.
- Assign a market-impact tier:
high/med/low/noise - high = concrete action with $ figure, %, date, named country/company (e.g. "25% tariff on Mexican imports effective June 1", "Section 232 on chips")
- med = directional signal without specifics (e.g. "We'll be tough on China", "must invest in America")
- low = brand alignment with sector (e.g. "American Energy DOMINANCE", "Crypto Capital of the World" — already-priced policy stance)
- noise = keyword matched but body is endorsement / personal / off-topic (e.g. "support the Military" in a Senate endorsement)
- Anchor on original URL. When quoting, always cite
truth:originalUrl(the truthsocial.com link), not the mirror. - Render output. For multi-post stretches, group by tier — high first, then med, then a one-line low/noise tally.
Output template
# Trump's Truth — {WINDOW}
## High-impact (potential market mover)
- [{utc_time}] {one-line summary} — `tier: high` · {topic tags}
> "{verbatim short quote ≤2 sentences}"
- Original: {truthsocial.com URL}
- Possible market read: {sector / ticker level expectation, anchored}
## Medium-impact (directional, no specifics)
- [{utc_time}] {one-line summary}
- Original: {URL}
## Noise (matched keyword, low signal)
- {N} posts ({topic distribution}) — endorsements / personal — not enumerated
⚠ Trump may delete or contradict within hours. Position decisions should require independent confirmation (sector ETF tape, peer reaction, official release).
Anti-patterns
| Mistake | Reality |
|---|---|
| Treating script output as "market signal" | Script is a keyword filter. LLM must read each post and tier. |
| Quoting a mirror URL as the source | Always link truth:originalUrl (truthsocial.com). Mirror is a convenience. |
| Reporting Senate endorsements as "policy news" | Politics-only posts with military / energy keywords are noise — filter at tier=noise. |
| "Trump said X about Y" with no link | Always include the truthsocial.com link. User must be able to verify. |
| Pretending tweets are durable | Trump posts can be deleted or retracted within hours. If consulted >12h after, note staleness. |
Integration
market-session-trackerpre-market protocol: insert a Trump-feed--hours 14pull as step 0 (covers post-prev-close to pre-market). Ifhigh-tier post exists touching watchlist sectors, escalate to the explanation slot for any gap.stock-deep-divelens 4 (Catalysts): when the symbol has policy exposure (semis / China ADR / auto / energy / defense / bank), run a Trump-feed--hours 168and surfacehigh-tier hits.gdeltcan confirm market has already picked the post up (i.e. major outlets are reporting it). Trump feed = original; GDELT = market-validated.
Limitations
- Mirror dependency: trumpstruth.org is third-party. If it goes down, the live
fetch.pyfails — but the archived posts underjournal/trump-feed/remain readable. - 5-day depth via mirror: a single feed pull only exposes the last ~100 posts. Anything older than ~5 days that wasn't archived in time is lost. Schedule
archive.py(seelaunchd/) to grow a permanent local record. - No X feed: Trump's X (Twitter) account is separate. This skill does not cover X posts. If user asks about X specifically, note the gap.
- Truth posts are not press releases. Treat as primary-but-volatile speech: original URL is authoritative for what was said, but the policy implementation may diverge (or never happen).
Local archive — searching past posts
Once archive.py has been running, journal/trump-feed/YYYY-MM-DD.md accumulates a complete record. To investigate a past day or query historically:
# All tariff-related posts ever archived
grep -l "tariff" journal/trump-feed/*.md
# Specific company mention
grep -B2 -A8 -i "nvidia\|tsmc" journal/trump-feed/*.md
# Posts on a specific date
cat journal/trump-feed/2026-05-26.md
The archive is plain markdown — grep-friendly, git-trackable.
Related skills
gdelt— market-validated news coverage of a Trump poststock-deep-dive— caller for catalyst-lens enrichmentmarket-session-tracker— caller for pre-market protocolsec-edgar— confirm whether a tweet translates into an actual filing (rare but does happen for trade-policy items affecting specific companies)
Files (kansoku)
-
scripts
-
archive.py 3.7 KB
#!/usr/bin/env python3 """Append-only local archive of @realDonaldTrump Truth Social posts. Pulls the trumpstruth.org RSS feed and writes each post to a dated markdown file under journal/trump-feed/YYYY-MM-DD.md (date keyed off post pubDate UTC). Idempotent: each post is keyed by its mirror status_id, so re-running on the same feed only appends posts that haven't been archived yet. Designed to be run on a 5–15 minute schedule via launchd / cron. Survives if trumpstruth.org goes down later by keeping a local copy of everything seen. Usage: python3 archive.py # default journal/trump-feed/ python3 archive.py --out /path # custom output dir python3 archive.py --quiet # exit silently when 0 new """ import argparse import os import re import sys from pathlib import Path # Reuse fetch.py — same dir sys.path.insert(0, str(Path(__file__).resolve().parent)) from fetch import fetch_feed, parse_items # type: ignore REPO_ROOT = Path(__file__).resolve().parents[4] # .../trade DEFAULT_OUT = REPO_ROOT / "journal" / "trump-feed" MIRROR_ID_RE = re.compile(r"/statuses/(\d+)") def mirror_id(url: str | None) -> str | None: if not url: return None m = MIRROR_ID_RE.search(url) return m.group(1) if m else None def existing_ids_in(path: Path) -> set[str]: if not path.exists(): return set() return set(MIRROR_ID_RE.findall(path.read_text(encoding="utf-8"))) def render_post(it: dict, mid: str) -> str: ts = it["time_dt"].strftime("%Y-%m-%d %H:%M:%S UTC") if it["time_dt"] else "?" topics = ", ".join(it["topics"]) or "—" kws = ", ".join(it["keywords"]) or "—" body = it["text"] or "_(empty post body — likely image/video repost)_" return ( f"## {ts} · status {mid}\n" f"- topics: {topics}\n" f"- keywords: `{kws}`\n" f"- original: {it['original_url']}\n" f"- mirror: {it['mirror_url']}\n\n" f"{body}\n\n---\n\n" ) def archive(items: list[dict], out_dir: Path) -> tuple[int, int]: out_dir.mkdir(parents=True, exist_ok=True) new_count = 0 dupe_count = 0 by_date: dict[str, list[tuple[dict, str]]] = {} for it in items: mid = mirror_id(it.get("mirror_url")) if not mid or not it["time_dt"]: continue date_str = it["time_dt"].strftime("%Y-%m-%d") by_date.setdefault(date_str, []).append((it, mid)) for date_str, day_items in by_date.items(): path = out_dir / f"{date_str}.md" existing = existing_ids_in(path) day_items.sort(key=lambda x: x[0]["time_dt"]) chunks_to_add = [] for it, mid in day_items: if mid in existing: dupe_count += 1 continue chunks_to_add.append(render_post(it, mid)) new_count += 1 if not chunks_to_add: continue if not path.exists(): header = f"# Trump's Truth — {date_str} archive\n\n" path.write_text(header, encoding="utf-8") with path.open("a", encoding="utf-8") as f: for c in chunks_to_add: f.write(c) return new_count, dupe_count def main(): ap = argparse.ArgumentParser() ap.add_argument("--out", type=Path, default=DEFAULT_OUT) ap.add_argument("--quiet", action="store_true") args = ap.parse_args() try: raw = fetch_feed() except Exception as e: print(f"ERROR fetching feed: {e}", file=sys.stderr) sys.exit(1) items = parse_items(raw) new_count, dupe_count = archive(items, args.out) if not args.quiet or new_count: print(f"archived: +{new_count} new, {dupe_count} dupes skipped (out: {args.out})") if __name__ == "__main__": main() -
fetch.py 6.8 KB
#!/usr/bin/env python3 """Fetch Donald Trump's Truth Social posts via the trumpstruth.org RSS mirror. Returns up to ~100 most recent posts from a single feed pull (rolling ~5 days at typical posting cadence). Classifies posts by topic keyword and emits markdown or JSON. Stdlib only — no network deps beyond urllib. Usage: python3 fetch.py # last 24h, market-relevant only, markdown python3 fetch.py --hours 48 # last 48h python3 fetch.py --all # all 100 items regardless of keyword python3 fetch.py --json # JSON output for further LLM consumption python3 fetch.py --topic tariff # restrict to a single topic bucket """ import argparse import html import json import re import sys import urllib.request import xml.etree.ElementTree as ET from datetime import datetime, timedelta, timezone from email.utils import parsedate_to_datetime FEED_URL = "https://trumpstruth.org/feed" UA = "Mozilla/5.0 (trade-journal trump-monitor)" TOPICS = { "tariff_trade": [ "tariff", "tariffs", "trade", "trades", "tradedeal", "export", "exports", "sanction", "sanctions", "fentanyl", "china", "chinese", "mexico", "canada", "canadian", "japan", "japanese", "korea", "korean", "taiwan", "taiwanese", "vietnam", "india", "indian", "brazil", "european union", "imf", "wto", "rare earth", "embargo", "embargoes", ], "semi_tech": [ "semiconductor", "semiconductors", "chip", "chips", "fab", "fabs", "foundry", "nvidia", "intel", "tsmc", "amd", "samsung", "asml", "qualcomm", "apple", "tesla", "amazon", "google", "meta", "microsoft", "musk", "huawei", "smic", ], "energy": [ "oil", "gas", "opec", "saudi", "drill", "drilling", "lng", "pipeline", "energy", "gasoline", "exxon", "chevron", "shale", "coal", ], "fed_macro": [ "fed", "powell", "rate", "rates", "interest", "recession", "inflation", "treasury", "bond", "bonds", "dollar", "yield", "yields", "bank", "banks", "fdic", "federal reserve", ], "crypto": [ "crypto", "bitcoin", "btc", "ethereum", "stablecoin", "blockchain", "digital asset", ], "geopolitical": [ "iran", "russia", "russian", "ukraine", "ukrainian", "nato", "israel", "israeli", "hamas", "hezbollah", "war", "missile", "missiles", "military", "venezuela", "north korea", "syria", "afghanistan", "navy", "marines", "putin", "zelensky", "netanyahu", "kim jong", ], } NS = {"truth": "https://truthsocial.com/ns"} def fetch_feed(url: str = FEED_URL) -> bytes: req = urllib.request.Request(url, headers={"User-Agent": UA}) with urllib.request.urlopen(req, timeout=30) as resp: return resp.read() def clean_text(raw: str) -> str: text = html.unescape(re.sub(r"<[^>]+>", " ", raw or "")) return re.sub(r"\s+", " ", text).strip() _KEYWORD_RE_CACHE: dict[str, re.Pattern] = {} def _kw_pattern(kw: str) -> re.Pattern: if kw not in _KEYWORD_RE_CACHE: if " " in kw: pat = re.escape(kw) else: pat = r"\b" + re.escape(kw) + r"\b" _KEYWORD_RE_CACHE[kw] = re.compile(pat, re.IGNORECASE) return _KEYWORD_RE_CACHE[kw] def classify(text: str) -> list[tuple[str, str]]: """Return list of (topic, matched_keyword) — keeps audit trail for debugging.""" hits = [] for topic, kws in TOPICS.items(): for k in kws: if _kw_pattern(k).search(text): hits.append((topic, k)) break return hits def parse_items(xml_bytes: bytes) -> list[dict]: root = ET.fromstring(xml_bytes) out = [] for it in root.findall(".//item"): pub_raw = it.findtext("pubDate") or "" try: pub_dt = parsedate_to_datetime(pub_raw).astimezone(timezone.utc) except Exception: pub_dt = None desc = it.findtext("description") or "" title = it.findtext("title") or "" text = clean_text(desc) or clean_text(title) orig = it.find("truth:originalUrl", NS) hits = classify(text) out.append({ "id": it.findtext("guid") or it.findtext("link"), "time_utc": pub_dt.isoformat() if pub_dt else None, "time_dt": pub_dt, "mirror_url": it.findtext("link"), "original_url": orig.text if orig is not None else None, "text": text, "topics": sorted({t for t, _ in hits}), "keywords": sorted({k for _, k in hits}), }) return out def filter_items(items, hours: int | None, topic: str | None, want_all: bool): cutoff = None if hours is not None: cutoff = datetime.now(timezone.utc) - timedelta(hours=hours) out = [] for it in items: if cutoff and it["time_dt"] and it["time_dt"] < cutoff: continue if topic and topic not in it["topics"]: continue if not want_all and not it["topics"]: continue out.append(it) return out def render_markdown(items, hours: int | None) -> str: lines = [] win = f"last {hours}h" if hours is not None else "all available" lines.append(f"# Trump's Truth — market-relevant feed ({win})") lines.append(f"Source: trumpstruth.org/feed · pulled {datetime.now(timezone.utc).isoformat()}") lines.append(f"Posts matched: {len(items)}\n") if not items: lines.append("_No matching posts in window._") return "\n".join(lines) for it in items: ts = it["time_dt"].strftime("%Y-%m-%d %H:%M UTC") if it["time_dt"] else "?" topics = ", ".join(it["topics"]) or "—" kws = ", ".join(it["keywords"]) or "—" body = it["text"] if len(body) > 800: body = body[:800] + "…" lines.append(f"## {ts} · {topics}") lines.append(f"- Matched keywords: `{kws}`") lines.append(f"- Mirror: {it['mirror_url']}") lines.append(f"- Original: {it['original_url']}") lines.append(f"\n> {body}\n") return "\n".join(lines) def main(): ap = argparse.ArgumentParser() ap.add_argument("--hours", type=int, default=24) ap.add_argument("--all", action="store_true", help="ignore keyword filter") ap.add_argument("--topic", choices=list(TOPICS.keys()), default=None) ap.add_argument("--json", action="store_true") args = ap.parse_args() try: raw = fetch_feed() except Exception as e: print(f"ERROR fetching feed: {e}", file=sys.stderr) sys.exit(1) items = parse_items(raw) items = filter_items(items, args.hours, args.topic, args.all) if args.json: out = [{k: v for k, v in it.items() if k != "time_dt"} for it in items] print(json.dumps(out, ensure_ascii=False, indent=2)) else: print(render_markdown(items, args.hours)) if __name__ == "__main__": main()
-
-
SKILL.md 8.9 KB
--- name: trump-truth-monitor description: Use when monitoring or interpreting Donald Trump's Truth Social posts for market-moving events — tariff announcements, sanctions, deals with countries (China / Mexico / Canada / EU / Japan / Korea / Taiwan), specific company / CEO mentions, Fed pressure, energy / oil commentary, crypto policy, or geopolitical escalation. Triggers on "trump 发了什么", "check trump", "trump 关税", "盘前 trump 推", "trump truth social", "trump tweet impact", "trump 对 X 说了什么", or whenever a pre-market gap / intraday spike on policy-sensitive names (semis, China ADRs, autos, energy, banks, defense) needs to be explained. --- # Trump Truth Monitor Pulls Donald Trump's Truth Social feed via the trumpstruth.org RSS mirror, classifies posts into market-relevant topic buckets, and hands the candidate list off for LLM-level market-impact grading. ## When to use - User asks what Trump has posted recently - Pre-market gap on policy-sensitive sectors (semis, China ADRs, autos, energy, banks, defense) — check whether a Trump post is the trigger - Building the "Catalyst (now)" lens of `stock-deep-dive` for a name with policy exposure (TSM, NVDA, AAPL, F, GM, XOM, BAC, RTX, LMT) - `market-session-tracker` pre-market protocol — add a Trump-feed pass If the user wants tweet **history beyond ~5 days**, this skill is insufficient — the RSS mirror only exposes the latest ~100 posts. Route to Factba.se / Roll Call (paid) or note the limitation explicitly. ## Data source **trumpstruth.org/feed** — a public third-party mirror of @realDonaldTrump on Truth Social. RSS 2.0 XML with these fields per item: | Field | Meaning | | --------------------- | -------------------------------------------------------------------- | | `<pubDate>` | RFC 2822, original Truth Social post timestamp | | `<link>` | trumpstruth.org/statuses/{mirror_id} | | `<truth:originalUrl>` | truthsocial.com/@realDonaldTrump/{truth_id} — **the primary source** | | `<description>` | Full post body with HTML (links + ellipsis spans) | The mirror typically lags the original by ≤2 minutes. Single feed pull returns ~100 most recent posts, covering ~5 days at Trump's typical cadence. ## CLI ### Read mode — `fetch.py` ```bash # Default: last 24h, keyword-filtered, markdown python3 .claude/skills/trump-truth-monitor/scripts/fetch.py # Wider window python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --hours 72 # All posts in feed regardless of keyword python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --hours 72 --all # Single topic python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --topic tariff_trade # JSON output (for chaining) python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --json ``` Topic buckets defined in script: `tariff_trade`, `semi_tech`, `energy`, `fed_macro`, `crypto`, `geopolitical`. ### Archive mode — `archive.py` ```bash # Append new posts to journal/trump-feed/YYYY-MM-DD.md (idempotent) python3 .claude/skills/trump-truth-monitor/scripts/archive.py # Custom output dir python3 .claude/skills/trump-truth-monitor/scripts/archive.py --out /path/to/dir # Silent unless something new was added python3 .claude/skills/trump-truth-monitor/scripts/archive.py --quiet ``` The archive de-dupes by mirror status_id — re-running on the same feed is a no-op. Designed to be scheduled (see `launchd/README.md`). Once archived, posts persist locally even if trumpstruth.org goes down. ## Workflow 1. **Decide window**. Default 24h. Use 48–72h when investigating a multi-day move. Use `--all` when context-grazing. 2. **Decide scope**. If user asks generally → no `--topic`. If user names a domain (关税 / 半导体 / 油 / 加密) → pass `--topic`. 3. **Pull feed**. Run `fetch.py` with chosen flags. **Always include `--hours`** — never default to "all of feed" silently. 4. **Second-pass grading**. Script output is _candidates_, not signals. For each post: - **Read the full text** before assigning impact. Headlines and keyword tags lie. - Assign a **market-impact tier**: `high` / `med` / `low` / `noise` - **high** = concrete action with $ figure, %, date, named country/company (e.g. "25% tariff on Mexican imports effective June 1", "Section 232 on chips") - **med** = directional signal without specifics (e.g. "We'll be tough on China", "must invest in America") - **low** = brand alignment with sector (e.g. "American Energy DOMINANCE", "Crypto Capital of the World" — already-priced policy stance) - **noise** = keyword matched but body is endorsement / personal / off-topic (e.g. "support the Military" in a Senate endorsement) 5. **Anchor on original URL**. When quoting, always cite `truth:originalUrl` (the truthsocial.com link), not the mirror. 6. **Render output**. For multi-post stretches, group by tier — high first, then med, then a one-line low/noise tally. ## Output template ``` # Trump's Truth — {WINDOW} ## High-impact (potential market mover) - [{utc_time}] {one-line summary} — `tier: high` · {topic tags} > "{verbatim short quote ≤2 sentences}" - Original: {truthsocial.com URL} - Possible market read: {sector / ticker level expectation, anchored} ## Medium-impact (directional, no specifics) - [{utc_time}] {one-line summary} - Original: {URL} ## Noise (matched keyword, low signal) - {N} posts ({topic distribution}) — endorsements / personal — not enumerated ⚠ Trump may delete or contradict within hours. Position decisions should require independent confirmation (sector ETF tape, peer reaction, official release). ``` ## Anti-patterns | Mistake | Reality | | ---------------------------------------------- | ---------------------------------------------------------------------------------------------- | | Treating script output as "market signal" | Script is a keyword filter. LLM must read each post and tier. | | Quoting a mirror URL as the source | Always link `truth:originalUrl` (truthsocial.com). Mirror is a convenience. | | Reporting Senate endorsements as "policy news" | Politics-only posts with `military` / `energy` keywords are noise — filter at tier=noise. | | "Trump said X about Y" with no link | Always include the truthsocial.com link. User must be able to verify. | | Pretending tweets are durable | Trump posts can be deleted or retracted within hours. If consulted >12h after, note staleness. | ## Integration - **`market-session-tracker`** pre-market protocol: insert a Trump-feed `--hours 14` pull as step 0 (covers post-prev-close to pre-market). If `high`-tier post exists touching watchlist sectors, escalate to the explanation slot for any gap. - **`stock-deep-dive`** lens 4 (Catalysts): when the symbol has policy exposure (semis / China ADR / auto / energy / defense / bank), run a Trump-feed `--hours 168` and surface `high`-tier hits. - **`gdelt`** can confirm market has already picked the post up (i.e. major outlets are reporting it). Trump feed = original; GDELT = market-validated. ## Limitations - **Mirror dependency**: trumpstruth.org is third-party. If it goes down, the live `fetch.py` fails — but the archived posts under `journal/trump-feed/` remain readable. - **5-day depth via mirror**: a single feed pull only exposes the last ~100 posts. Anything older than ~5 days that wasn't archived in time is lost. Schedule `archive.py` (see `launchd/`) to grow a permanent local record. - **No X feed**: Trump's X (Twitter) account is separate. This skill does **not** cover X posts. If user asks about X specifically, note the gap. - **Truth posts are not press releases**. Treat as primary-but-volatile speech: original URL is authoritative for what was said, but the policy implementation may diverge (or never happen). ## Local archive — searching past posts Once `archive.py` has been running, `journal/trump-feed/YYYY-MM-DD.md` accumulates a complete record. To investigate a past day or query historically: ```bash # All tariff-related posts ever archived grep -l "tariff" journal/trump-feed/*.md # Specific company mention grep -B2 -A8 -i "nvidia\|tsmc" journal/trump-feed/*.md # Posts on a specific date cat journal/trump-feed/2026-05-26.md ``` The archive is plain markdown — grep-friendly, git-trackable. ## Related skills - `gdelt` — market-validated news coverage of a Trump post - `stock-deep-dive` — caller for catalyst-lens enrichment - `market-session-tracker` — caller for pre-market protocol - `sec-edgar` — confirm whether a tweet translates into an actual filing (rare but does happen for trade-policy items affecting specific companies)
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.