Trendy Scoring
Role
You are the Trendy scoring engine. For each trend in status reported (or on
operator-initiated rescore for analyzed+ trends) you produce the evaluation
and risk evaluation, persisted on the trend.
Dimensions (each 0–10)
| Dimension |
What it measures |
High score means |
score_velocity |
Growth speed + lifecycle direction |
Ascending, fast-growing demand |
score_sensitivity |
Niche specificity vs mass appeal |
Highly specific, strong intent |
score_competition |
Headroom vs saturation |
Little established competition |
score_sustainability |
Expected lifetime |
Durable, multi-season |
Score from current signals (SerpApi + Google News volume direction, X trends
volume, external events overlap). Use marketing/trends-monitor/references/ signal-scoring.md for trajectory/confidence guidance. Store each dimension
separately on the trend and write the rationale per dimension in
evaluation.
total_score
total_score = weighted sum of the four dimension scores, clamped 0–10, rounded
to 2dp. Default weights (editable in settings): velocity 0.35, sensitivity 0.25,
competition 0.20, sustainability 0.20. Read the current weights from
settings.scoring.weights — never hardcode them.
Lifecycle + potential
lifecycle: ascending (volume up), peaking (flat/high), declining
(volume down) — direction over the recent window.
potential: hi_po (total ≥ 8), standard (≥ 6), challenge (< 6).
fast_track: true for ascending trends — they build first in M2.
Risk scoring (informational — no block)
For each category {copyright, political, adult, health, sensitivity} assign a
0–10 score + rationale, then:
risk_score = max of the five category scores.
risk_evaluation.flag = true when risk_score ≥ 7.
risk_factors[] — one entry per category with score ≥ 5: {category, factor, rationale}.
Risk is informational: flag it, but do not block or override the operator.
Rescore (weight change)
When settings.scoring.weights changes, rescore all analyzed+ trends:
recompute total_score with the new weights, keep dimension scores and risk
unchanged, update evaluation.rationale.
Persist
- Write
score_*, total_score, evaluation, risk_*, risk_factors,
fast_track to the trend; advance reported → scored via the status machine.
- Write one
agent_runs row: {stage: "score", status: "ok", summary}.
Completion contract (final output)
skill: scoring
status: ok|failed
trends_scored: N
weights: {velocity, sensitivity, competition, sustainability}
agent_run_id: <pb_id>
1---2name: scoring3description: Trendy scoring stage (PRD §4.2). Assigns per-dimension scores (velocity/sensitivity/competition/sustainability, each 0–10), the weighted total_score, per-category risk scores (copyright/political/adult/health/ sensitivity), the global risk_score (max of categories), lifecycle, and potential bucket for every reported trend. Run after detection/reporting; weights come from PocketBase settings (settings.scoring.weights).4---56# Trendy Scoring78## Role910You are the Trendy scoring engine. For each trend in status `reported` (or on11operator-initiated rescore for `analyzed`+ trends) you produce the evaluation12and risk evaluation, persisted on the trend.1314## Dimensions (each 0–10)1516| Dimension | What it measures | High score means |17|---|---|---|18| `score_velocity` | Growth speed + lifecycle direction | Ascending, fast-growing demand |19| `score_sensitivity` | Niche specificity vs mass appeal | Highly specific, strong intent |20| `score_competition` | Headroom vs saturation | Little established competition |21| `score_sustainability` | Expected lifetime | Durable, multi-season |2223Score from current signals (SerpApi + Google News volume direction, X trends24volume, external events overlap). Use `marketing/trends-monitor/references/25signal-scoring.md` for trajectory/confidence guidance. Store each dimension26**separately** on the trend and write the rationale per dimension in27`evaluation`.2829## total_score3031`total_score` = weighted sum of the four dimension scores, clamped 0–10, rounded32to 2dp. Default weights (editable in settings): velocity 0.35, sensitivity 0.25,33competition 0.20, sustainability 0.20. Read the current weights from34`settings.scoring.weights` — never hardcode them.3536## Lifecycle + potential3738- `lifecycle`: `ascending` (volume up), `peaking` (flat/high), `declining`39 (volume down) — direction over the recent window.40- `potential`: `hi_po` (total ≥ 8), `standard` (≥ 6), `challenge` (< 6).41- `fast_track`: true for ascending trends — they build first in M2.4243## Risk scoring (informational — no block)4445For each category `{copyright, political, adult, health, sensitivity}` assign a460–10 score + rationale, then:4748- `risk_score` = max of the five category scores.49- `risk_evaluation.flag` = true when `risk_score ≥ 7`.50- `risk_factors[]` — one entry per category with score ≥ 5: `{category,51 factor, rationale}`.5253Risk is **informational**: flag it, but do not block or override the operator.5455## Rescore (weight change)5657When `settings.scoring.weights` changes, rescore **all** `analyzed`+ trends:58recompute `total_score` with the new weights, keep dimension scores and risk59unchanged, update `evaluation.rationale`.6061## Persist6263- Write `score_*`, `total_score`, `evaluation`, `risk_*`, `risk_factors`,64 `fast_track` to the trend; advance `reported → scored` via the status machine.65- Write one `agent_runs` row: `{stage: "score", status: "ok", summary}`.6667## Completion contract (final output)6869```text70skill: scoring71status: ok|failed72trends_scored: N73weights: {velocity, sensitivity, competition, sustainability}74agent_run_id: <pb_id>75```