feat(linkedin-studio): research-engine config layer — sources + scoring modes + MCP profile (§5 slice 2a) [skip-docs]

Declaration/config groundwork that slice 2b's trend-spotter upgrade reads.
Standalone (no agent wiring yet — that's 2b), mirroring slice 1's pattern;
[skip-docs] for the same reason slice 1 was — user-facing docs land when 2b
wires the engine live.

- references/trend-scoring-modes.md: methodology SSOT for two rubrics —
  kortform (feed post, timing 20%) + long-form (chronicle, depth 25% / timing 10%,
  per tema-research-motor-spec §4.2). Both sum to 100%. trend-spotter renders from
  this in 2b instead of inlining a matrix (S12-consistent).
- config/trends-sources.template.md: shipped generic source-list defaults →
  user override at ${LINKEDIN_STUDIO_DATA}/trends/sources.md (data-dir, survives
  reinstall; same template->data-dir pattern as user-profile).
- user-profile.template.md: new "Research Tooling" section — declared research MCPs
  (Tavily/Gemini/Perplexity/Other) + WebSearch/WebFetch floor. 2b routes MCP-first.
- setup.md Step 3f + onboarding.md Phase 2: ask "which research MCPs?" -> profile.
  Store only what the user declares; no hard-coded MCP names.
- test-runner.sh: EXPECT_REFS 26->27; generalized the M0 +1 delta-guard into a
  named-post-M0-additions guard (POSTM0_REFS) so a legit later ref doc passes while
  the anti-masking intent holds. Gate green 84/0/0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RBMKqPSVbvSZHtQ4heM1UY
This commit is contained in:
Kjell Tore Guttormsen 2026-06-22 13:36:28 +02:00
commit b89868e3b1
6 changed files with 225 additions and 11 deletions

View file

@ -0,0 +1,76 @@
# Trend Sources (template)
The **source list** a research-engine pass polls for trend/topic candidates. This file
ships **generic, niche-agnostic defaults** (source *categories*, not one person's beat).
Override it with your own list — the niche specifics (your vendors, your regulators, your
country's outlets) belong in the override, never here.
## How the override works
Copy this template into your per-user data dir and edit the copy:
```bash
mkdir -p "${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/trends"
cp config/trends-sources.template.md \
"${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/trends/sources.md"
```
A pass reads `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/trends/sources.md`
if it exists, and falls back to these shipped defaults otherwise. The override lives in the
data dir (next to the trend store `trends/trends.json`), so it **survives plugin
upgrades and reinstalls**. `LINKEDIN_STUDIO_DATA` overrides the root.
Format below is read by a person and an agent both: a markdown list, one source per line,
grouped by tier. Keep `Name — URL — note` so a poll can cite the URL.
---
## Tier 1 — Primary / breaking (poll daily, react within 2448h)
*First-party announcements and authoritative decisions in your field.*
- [Major vendor blog] — [url] — releases & announcements
- [Major vendor blog] — [url] — releases & announcements
- [Regulator / governing body] — [url] — decisions & guidance
## Tier 2 — Analysis & research (poll 23×/week, post within a week)
*Where a development gets interpreted, not just reported.*
- [Respected analysis publication] — [url]
- [Analyst house report stream] — [url] — adoption / market reports
- [Research index] — [url] — preprints / papers in your area
## Tier 3 — Community signals (poll weekly, post if a pattern emerges)
*Where practitioners surface what actually matters before the press does.*
- [Practitioner forum / aggregator] — [url]
- [Topic-specific community] — [url]
- [Platform-native trending] — [url]
## Tier 4 — Niche & seasonal (poll monthly, plan ahead)
*Slower-moving sources with predictable cadence.*
- [Key conference series] — [url] — announcement / agenda cycles
- [Earnings / report calendar] — [url] — scheduled releases
- Seasonal themes: [Q1 …] · [Q2 …] · [Q3 …] · [Q4 …]
---
## Your niche additions
Add the sources specific to your field below — these are the ones the generic defaults
above cannot know. (Example shape for a Norwegian public-sector / AI niche: national
digitalisation agency, data-protection authority, the relevant ministries, the local
tech press — replace with yours.)
- [Your source] — [url] — [why it matters to your audience]
- [Your source] — [url] — [why it matters to your audience]
---
*Tip: the [8 universal angles](../references/content-angles.md) and the scoring rubric
in [trend-scoring-modes.md](../references/trend-scoring-modes.md) decide what to DO with a
candidate once a poll surfaces it. This file only decides WHERE to look.*

View file

@ -116,6 +116,27 @@ cp config/user-profile.template.md config/user-profile.local.md
---
### Research Tooling
**Which research MCPs do you have available?** The trend / research engine routes to a
declared MCP **first** and falls back to the always-available floor when none is declared.
Check what you actually have connected — leave the rest unchecked. (Names are examples;
add whatever you have under "Other" — nothing here is hard-coded downstream.)
- [ ] Tavily (`tavily_search` / `tavily_research`)
- [ ] Gemini deep research (`gemini_deep_research`)
- [ ] Perplexity
- [ ] Other: [name the MCP + what it's good for]
**Always-available floor (no MCP needed):** WebSearch + WebFetch. These are used when no
research MCP is declared above. (Note: WebSearch is US-biased — a research MCP gives
better coverage for non-US / regional sources.)
**Preferred order (optional):** [e.g. "Tavily for niche/regional, Gemini for deep dives,
WebSearch as fallback" — or leave blank to let the engine pick]
---
### Asset Utilization Preferences
**When creating content, Claude should:**