R3 slice (b): the rest of hull #3. The morning brief now reads the temporal axis the R3b seen-log records but the ranking ignored. Two DERIVED signals, computed at brief time from already-persisted fields (publishedAt/capturedAt -> ageDays, surfacedCount), never stored: - first-mover: recent (ageDays <= --first-mover-days, default 2) AND never surfaced on a prior day -> ranked up, badge "first ute". Future-dated (ageDays<0) excluded. - saturation: surfaced on >= --saturation-at (default 3) prior days -> ranked down, badge "mettet (Nx)". Self-surfacing (our seen-log), not market coverage. - warming (1..at-1) keeps the R3b "sett Nx" badge but only at >=2 (contract intact); neutral carries no badge. SB1 derived (no schema bump: SCHEMA_VERSION 4 / BRIEF_SCHEMA_VERSION 1 untouched). SB2 the R3a relevance composite stays the PRIMARY sort key; the temporal rank is a new cmp key after pillar-overlap, before effectiveDate -> re-orders only WITHIN a (composite, overlap) tier. temporalSignal is pure (saturationAt clamped >=1). Prior-day surfacings exclude today (via lastSurfacedAt), so a same-day re-render is byte-identical (caught by the R3c run-daily SC7 regression; fixes a latent R3b prior-day imprecision too). brief CLI gains --first-mover-days / --saturation-at; schedule untouched (nightly uses defaults). Wiring: trend-spotter.md (prose), trend-scoring-modes.md (one-line consumer note), README (## Temporal overlay), gate Section 16m (+6 unconditional -> ASSERT floor 111->117), TRENDS_TESTS_FLOOR 192->216. Counts 29/19/27 unchanged. Zero new files. Gate: Passed 132 / Failed 0; trends 216/216; hook suite 139/139 untouched. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011vmzxpsFpc8q19LaogAWLD
6.3 KiB
Trend Scoring Modes Reference
Single source of truth for how a discovered trend/topic candidate is scored.
There are two modes — they share the same 1–10 per-dimension scale and the same
composite formula, but they weight the dimensions differently because a feed post and
a long-form chronicle reward different things. Surfaces (the trend-spotter agent, any
research-engine pass) select a mode and apply the matching rubric — they do not
restate the weights inline. Cite this file; do not duplicate it.
This file defines methodology (the weights), not user preference. The source list
a pass polls is separate and user-overridable — see
config/trends-sources.template.md → ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/trends/sources.md.
How to read this file
- Score each dimension 1–10 (see the bands in the per-mode tables).
- Composite = the weighted sum of the five dimension scores. Each mode's weights sum to 100 %, so the composite stays on the same 0–10 scale across modes.
- The ordering of the weights is the signal; the exact percentages are a deliberate,
documented choice, not a measured coefficient. (Timing grounding — why a feed post
weights recency and a chronicle does not — traces to
references/algorithm-signals-reference.md; this file does not restate algorithm magnitudes.)
Mode selection
| Mode | Use for | Driver |
|---|---|---|
| kortform | feed posts (/linkedin:post, :quick, :react, :carousel, :video) |
timing + audience pull — a good post published early beats a perfect post published late |
| long-form | chronicles / newsletters / series editions (/linkedin:newsletter) |
depth + angle — a chronicle has a longer shelf life; whether there is enough material for a full piece matters more than a 24-hour window |
If no mode is declared, default to kortform (the feed is the higher-cadence surface).
A caller may pass the mode explicitly (e.g. the long-form orchestrator requesting
long-form); a future slice may read a per-user default from the profile.
Mode: kortform (LinkedIn feed post)
Tuned for the feed: timing and audience pull carry real weight because the first-mover window is short.
| Dimension | Weight | 1–2 (Low) | 3–5 (Medium) | 6–8 (High) | 9–10 (Exceptional) |
|---|---|---|---|---|---|
| Pillar Fit | 30 % | Outside all 5 pillars | Tangential to one pillar | Direct hit on one pillar | Intersects 2+ pillars |
| Audience Relevance | 25 % | Wrong audience entirely | Some audience overlap | Core audience cares | Audience actively asking about this |
| Timing | 20 % | >7 days old, saturated | 3–7 days, moderate coverage | 24–72h, early coverage | <24h, you would be among first |
| Angle Potential | 15 % | Only obvious take available | One good angle possible | 2–3 strong angles | Contrarian or unique angle clear |
| Authority Match | 10 % | No credibility on topic | Some related experience | Direct experience | Published authority on this |
Composite = (Pillar × 0.30) + (Audience × 0.25) + (Timing × 0.20) + (Angle × 0.15) + (Authority × 0.10)
Mode: long-form (chronicle / newsletter / series)
Reweighted for a longer piece: depth potential enters at 25 %, and timing drops to 10 % — a chronicle is not a 24-hour reaction, so recency matters less than whether the topic has enough substance and a differentiated angle to carry a full edition.
| Dimension | Weight | 1–2 (Low) | 3–5 (Medium) | 6–8 (High) | 9–10 (Exceptional) |
|---|---|---|---|---|---|
| Pillar / thesis fit | 30 % | Outside the active theses | Tangential to one thesis | Fits one thesis / series arc | Advances 2+ theses or a live series arc |
| Depth potential | 25 % | A single post at most | Enough for one solid post | Enough for a full chronicle | Enough for a multi-part series |
| Angle / differentiation | 20 % | Commodity take only | One non-obvious angle | 2–3 differentiated angles | Original thesis the field lacks |
| Authority / experience | 15 % | No credibility on topic | Some related experience | Direct lived experience | Published authority on this |
| Currency | 10 % | Stale / already resolved | Relevant this quarter | Relevant now, durable | Relevant now AND will compound |
Composite = (Pillar × 0.30) + (Depth × 0.25) + (Angle × 0.20) + (Authority × 0.15) + (Currency × 0.10)
Why the two modes differ (the one delta)
The two rubrics are the same five-dimension instrument with one deliberate swap:
- kortform: Timing 20 %, no depth dimension — the feed rewards being early.
- long-form: Timing → Currency at 10 %, Depth potential added at 25 % — a chronicle rewards substance and a durable angle over speed.
Pillar fit (30 %) and authority (kortform 10 % / long-form 15 %) anchor both: an off-pillar or low-credibility topic scores low in either mode, because topic relevance and credibility are non-negotiable regardless of format.
Composite → action
The same priority bands apply to both modes (the composite is on the same 0–10 scale):
| Composite | Priority | kortform action | long-form action |
|---|---|---|---|
| 8.0–10 | Immediate | Draft within 24h | Promote to the edition backlog now |
| 6.0–7.9 | High | Publish within 48–72h | Strong edition candidate — schedule it |
| 4.0–5.9 | Medium | Add to this week's calendar | Hold as a backlog candidate, revisit |
| 2.0–3.9 | Low | Note, skip for now | Park unless the angle sharpens |
| 0–1.9 | Skip | Off positioning | Off positioning |
Consumers
agents/trend-spotter.md— reads the requested mode and applies the matching rubric instead of inlining a matrix (wired in research-engine slice 2b).- Any future research-engine pass that scores candidates before writing them to the trend
store (
scripts/trends/).
Note (RE-R3d): the morning brief applies a brief-time temporal overlay (first-mover / saturation, derived from the publish/capture dates + the seen-log) as a within-composite-tier ranking refinement. It is a separate layer from this file — it does not change the capture-time dimension weights, bands, or composite formula above.