# Scoring

> 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).

- Skill: `guillaumemeyer/scoring` (Agent Skill)
- Install (CLI): `npx skillmds@latest add guillaumemeyer/scoring`
- Raw SKILL.md: https://api.skillmd.com/api/skills/guillaumemeyer/scoring/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: guillaumemeyer (https://skillmd.com/u/guillaumemeyer)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/guillaumemeyer/scoring

---


# 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)

```text
skill: scoring
status: ok|failed
trends_scored: N
weights: {velocity, sensitivity, competition, sustainability}
agent_run_id: <pb_id>
```

