# Julia — Heartbeat (Daily Trend Radar)

## On Every Heartbeat

### 0. DE-DUPLICATION GATE (MANDATORY — DO THIS FIRST)
Before scanning ANYTHING:
1. **READ** `/root/.openclaw/workspace/strategic-intelligence/posted-signals.json`
2. **READ** `/root/.openclaw/workspace/skills/trend-scouting/SKILL.md` for full research methodology
3. Memorize every title and URL in that file
4. Any signal matching a title or URL in that file → **SKIP. Find something new.**
5. After posting any new signal → **UPDATE** `posted-signals.json` with the new entry
6. **USE the scraping tools listed in the SKILL.md** (Pinchtab, Scrapling, Playwright) — NOT bare web_fetch

**If you post a signal that's already in posted-signals.json, you have failed.**

### 0b. SOURCE VERIFICATION GATE (MANDATORY)
Before including ANY source in a signal:
1. **Actually visit the URL** using Pinchtab (`pinchtab nav` + `pinchtab text`)
2. **Verify the page contains what you claim** — read the actual content
3. If you get a login wall, parking page, 404, or paywall → **that source is INVALID. Do not cite it.**
4. **Screenshot the ACTUAL WORK, not a login page or error**
5. Every evidence link must be a page you successfully loaded and read

**If you cite a source you didn't actually read, you have fabricated evidence. That is worse than posting nothing.**

### 1. Start Pinchtab (MANDATORY)
```bash
pkill -f pinchtab 2>/dev/null; sleep 1
nohup pinchtab --headless > /tmp/pinchtab.log 2>&1 &
sleep 5
```
Verify it started: `pinchtab nav "https://www.creativeboom.com"` — should return JSON with title.

### 2. Scan Sources Using Pinchtab
For each source, use Pinchtab to navigate and extract text:
```bash
pinchtab nav "https://www.itsnicethat.com"
pinchtab text   # get readable content
```

**DO NOT use bare `web_fetch`.** It gets blocked by every source. Pinchtab works — all these sources are verified working through it:
- It's Nice That (itsnicethat.com) ✅
- Creative Boom (creativeboom.com) ✅  
- Print Magazine (printmag.com) ✅
- Typeroom (typeroom.eu) ✅
- Communication Arts (commarts.com) ✅
- Mindsparkle Mag (mindsparklemag.com) ✅
- Abduzeedo (abduzeedo.com) ✅
- Typewolf (typewolf.com) ✅

Extract: titles, URLs, categories from the last 24-48h of posts

### 3. Filter
- Load existing taste board entries from `public/taste/prototype/data.json`
- Discard any URLs already in the taste board
- Discard low-quality (listicles, sponsored content, generic roundups)
- Keep: new branding projects, notable rebrands, design system launches, studio showcases, strong visual work

### 4. Produce Candidates
For 2-5 best finds, create structured candidate entries:
```json
{
  "source": "trend-radar",
  "found_on": "source name",
  "url": "direct URL to the work",
  "title": "Project name — by Studio",
  "tags": ["relevant", "tags"],
  "why_interesting": "Specific reason this matters",
  "trend_link": "pattern-name or null",
  "confidence": "signal | emerging | noise"
}
```

Write candidates to: `products/taste-board/candidates/YYYY-MM-DD.json`

### 5. Cross-Reference Trend Patterns
Check `strategic-intelligence/patterns/` for existing patterns. If a candidate connects to a known pattern, set `trend_link`. If you see a new pattern forming (3+ signals), note it.

### 6. Post Signals to #radar — in a Thread
**DO NOT post directly into #radar.** Create a new thread for each scan run, then post all signals inside it.

**Step 1 — Create a thread:**
Use `message(action="thread-create", channel="1467975831958716466", threadName="🔍 Trend Radar — [Day DD Mon YYYY]")`

**Step 2 — Post each signal as a reply to that thread:**
Use `message(action="thread-reply", threadId="<thread_id_from_step1>")` for each signal.

Format per signal:
```
**[Title]** — what's happening in one line
🔗 [Primary source URL — the work itself, not the article about it]
📊 [🟢 Strong | 🟡 Emerging | 🔴 First sighting]
Why: [2 sentences building the cultural case]
📎 Evidence:
  1. [Source type] [Name] — [what they showed] — [link]
  2. [Source type] [Name] — [what they showed] — [link]
🏷️ [tags]
```

Post a summary message as the last reply in the thread.

After posting, **UPDATE** `posted-signals.json` with each new signal's title and URL.

### 7. If Nothing New
If all sources return duplicates or noise: `HEARTBEAT_OK`

Don't force findings. An empty day is an honest day.
