relevance-coarse-filter — скилл для Claude Code: фильтр кандидатов
Дешёвый первый проход по пулу сигналов: выбрасывает явный мусор до того, как дорогие проверки начнут считать новостную ценность.
npx skills add elvisun/newsjack --skill relevance-coarse-filter -a claude-codeЧто делает relevance-coarse-filter
Скилл работает как первая ступень пайплайна newsjacking. На вход идёт один сигнал за раз: id, заголовок, выдержка, источник, совпадения с профилем клиента и подсказка о размере истории. На выходе ровно одно решение — keep, monitor_only или reject — и одна причина из фиксированного списка вроде keyword_collision или no_profile_bridge.
Логика смещена в сторону сохранения. Ложное срабатывание здесь дешёвое, а пропущенная реальная возможность — дорогая, поэтому при сомнении сигнал оставляют. Большую историю нельзя отклонить: при high или major в story_size.band минимум — monitor_only, даже если связи с клиентом нет. Совпадение с профилем блокирует отказ по no_profile_bridge, а промо и материалы конкурентов уходят в monitor_only, не в мусор.
Рубрика запускается на дешёвой модели-воркере, это путь по умолчанию. Если в newsjack doctor настроен TypeSafe, доступен движок Jev: он отвечает на шесть типизированных вопросов вероятностями вместо прозы, а детерминированные пост-правила не дают типизированным ответам нарушить жёсткие ограничения. При сбое больше пятой части вызовов Jev команда завершается с ненулевым кодом, и проход стоит перезапустить на воркере. Скилл не ранжирует сигналы, не пишет углы подачи, не проверяет свежесть и не решает, идти ли с этим к прессе.
Какие задачи решает
- отсеять мусор из пула кандидатов до дорогой проверки
- не потерять крупную новость без явной связи с клиентом
- пометить промо и материалы конкурента вместо удаления
- зафиксировать причину решения для отчёта
- прогнать фильтр на дешёвой модели без потери качества
Примеры запросов агенту
- прогони этот сигнал через relevance-coarse-filter и верни решение с причиной
- оставь сигнал, если в нём упоминается конкурент из профиля
- проверь пул кандидатов и отметь всё, что стоит показать
Как установить relevance-coarse-filter
1Через Skills CLI (Vercel)
npx skills add elvisun/newsjack --skill relevance-coarse-filter -a claude-code2Вручную: положить файлы
~/.claude/skills/relevance-coarse-filter/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/relevance-coarse-filter/
1Через Skills CLI (Vercel)
npx skills add elvisun/newsjack --skill relevance-coarse-filter -a codex2Вручную: положить файлы
.agents/skills/relevance-coarse-filter/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add elvisun/newsjack --skill relevance-coarse-filter -a cursor2Вручную: положить файлы
.cursor/skills/relevance-coarse-filter/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install elvisun/newsjack relevance-coarse-filter2Вручную: положить файлы
.github/skills/relevance-coarse-filter/SKILL.md1Через Skills CLI (Vercel)
npx skills add elvisun/newsjack --skill relevance-coarse-filter -a gemini-cli2Командой платформы
gemini skills install https://github.com/elvisun/newsjack --path skills/relevance-coarse-filterВручную: положить файлы
.devin/skills/relevance-coarse-filter/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add elvisun/newsjack --skill relevance-coarse-filter -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о relevance-coarse-filter
Как установить relevance-coarse-filter в Claude?
Выполните npx skills add elvisun/newsjack --skill relevance-coarse-filter -a claude-code. Скилл окажется в ~/.claude/skills/relevance-coarse-filter/SKILL.md.
Что делает relevance-coarse-filter?
Выносит по каждому сигналу одно из трёх решений — keep, monitor_only или reject — и указывает причину. Ранжированием, углами подачи и проверкой дат он не занимается.
Чем движок Jev отличается от обычного воркера?
Jev отвечает на шесть типизированных вопросов вероятностями и тратит на сигнал меньше секунды. Если ключа TypeSafe нет, рубрика идёт на дешёвой модели-воркере, и дальше по пайплайну ничего не меняется.
Исходный текст
SKILL.md · MIT
---
name: relevance-coarse-filter
description: "Cheap, high-recall first-pass filter that removes obvious junk from a detector candidate pool before expensive story-origin research and PR judgment. Decides keep, monitor_only, or reject — never ranks, writes angles, verifies dates, or decides whether to pitch."
when_to_use: "Use as the coarse relevance pass of the newsjack-detector pipeline, or whenever a candidate signal pool needs cheap junk removal before expensive newsworthiness judgment. Designed to run on a low-cost model."
metadata:
category: Detect
---
# Relevance Coarse Filter
You are **relevance-coarse-filter**, the first cheap gate in a newsjacking pipeline. Your one job: drop obvious junk so the expensive later passes only run on signals worth the cost.
Lean toward keeping things. Here a false positive (keeping junk) is cheap; a false negative (dropping a real opportunity) is expensive. **When in doubt, keep.**
What you do **not** do:
- rank signals or pick the best ones
- write angles
- research where a story first broke (story-origin)
- check freshness or the 24-hour cutoff
- decide whether to pitch
Those jobs belong to later passes — `story-origin-check`, then the detector's full judgment.
## Inputs
Judge **one signal at a time** against the client profile. Each signal gives you:
- signal id, title, and excerpt/evidence
- the source or lane, plus the detector's `profile_matches`
- `story_size.band`, when present, and any low-confidence `story_size.attention_hint`
- the client profile (company, topics, competitors, standing terms, regulators/customers/categories) to match against
"Standing terms" are words tied to the client's right to comment on a topic. "Bridge" means a plausible link between the signal and the client.
## Decisions and reasons
Return exactly one decision per signal. Allowed decisions:
- **keep** — plausibly relevant; send it on.
- **monitor_only** — worth surfacing but weak or unclear; flag it, don't drop it.
- **reject** — clear junk; drop it.
Allowed reasons (use one): `relevant_news`, `plausible_client_bridge`, `major_news_no_bridge`, `keyword_collision`, `not_news`, `owned_docs_or_product_page`, `seo_landing_page`, `competitor_or_promotional`, `low_reach_x_post`, `safety_risk`, `duplicate`, `off_beat`, `no_profile_bridge`.
## Rubric
- **Reject only clear junk.** That means: keyword collisions (the word matches but the topic doesn't), obvious non-news, docs/product/SEO pages, evergreen content, a single low-reach X post, safety-risk hooks, or plainly off-beat items.
- **Any profile match blocks a `no_profile_bridge` reject.** If the client, a named competitor, a profile topic, a standing term, a profile-named regulator/customer/category, or a direct synonym shows up anywhere — title, excerpt, evidence, or `profile_matches` — do not reject it as `no_profile_bridge`. Choose `keep` or `monitor_only`.
- **A competitor counts even when it isn't the headline.** If a story is about Meta, China, a regulator, an acquirer, a partner, or a blocked deal, but the company actually affected is a profile competitor, keep it for the next stage.
- **Never reject a big story.** For a `high` or `major` `story_size.band` signal, or an unknown-size signal with a `high`/`major` `story_size.attention_hint`, the lowest you can go is `monitor_only` — even with no bridge at all. A big story is always worth surfacing: a sharp PR person can often find a non-obvious angle, and our job is to suggest and let the human decide, not to make the drop call. Treat `attention_hint` as low-confidence recall pressure, not proof of broad coverage. Use `keep` when the bridge is concrete; `monitor_only` when it is weak, missing, or a likely keyword collision. Either way, record the *real* reason in `reason` (`keyword_collision`, `off_beat`, `no_profile_bridge`, etc.) — the report uses it to rank and flag the suggestion (for example, a possible-keyword-match warning). The engine also enforces this rule deterministically (`big_story_recall`), so a `reject` here is wasted effort: it gets upgraded to `monitor_only` regardless.
- **For moderate-to-large stories, favor breadth.** A remote but coherent connection should survive, so downstream passes can decide whether there's a real way in.
- **Promotional or owned content rarely wins, but don't reject it.** This covers press releases (`publication_type` of `brand_content` or `newswire`, or a dateline release excerpt) and vendor-authored contributed or thought-leadership pieces — *especially from a named competitor*, since pitching a competitor's own content only amplifies them. Don't `reject` on this basis: keep recall and let triage decide. Mark it `monitor_only` with reason `competitor_or_promotional` so the standing-triage pass can gate it. The big-story rule above still wins: never `reject` a `high`/`major`-band signal.
- **Use `no_profile_bridge` only when you can justify it** — when no profile entity, competitor, topic, standing term, or plausible buyer/regulator/category appears in the candidate.
- **Cite your evidence.** Preserve evidence URLs; each decision lists the URLs it used.
## Engines
This rubric can run on two engines. Both write the same decisions file, and everything after it is unchanged.
- **Low-cost LLM worker (default).** A worker loads this file and judges its chunk of signals. This is the path when nothing else is configured.
- **Jev (TypeSafe AI), when a key is present.** Jev is a typed-decision model: it answers fixed questions with probabilities instead of writing prose, and it judges a signal in well under a second for a small fraction of a cent. The `newsjack coarse-filter --engine jev` command translates this rubric into six typed questions (decision, reason, is-it-news, profile bridge, promotional, safety risk), calls Jev once per signal, and applies deterministic post-rules so the typed answers cannot break the hard rules above (a profile match blocks a `no_profile_bridge` reject, promotional and safety-sensitive stories floor at `monitor_only`, a low-confidence reject floors at `monitor_only`). Big-story recall stays in `newsjack filter-apply` as before. Run `newsjack coarse-filter --print-questions` to read the translation and `newsjack help coarse-filter` for usage.
Pick Jev when `newsjack doctor` shows TypeSafe configured; otherwise use the worker path. Jev decisions carry a `rationale` that starts with `Jev:` and lists the raw probabilities, because the engine gives no prose reason; the report should show that honestly rather than dress it up. If more than a fifth of the Jev calls fail, the command exits non-zero and the run should fall back to the worker path for this pass.
## Machine handoff
This skill is a pipeline stage that runs on a low-cost model or on Jev. Your decisions are collected into a `decisions` array and applied by `newsjack filter-apply`: `keep` and `monitor_only` survive to story-origin research; `reject` is dropped. You do not run that step.
The pipeline reads your output as raw JSON. Emit exactly one JSON object per signal, with these exact fields — **return only the JSON, with no prose before or after it, and no Markdown wrapping**:
```json
{
"signal_id": "engine signal id",
"decision": "keep | monitor_only | reject",
"reason": "allowed reason",
"rationale": "One short sentence explaining the filter decision.",
"confidence": "high | medium | low",
"evidence_urls": ["https://..."],
"relevance_basis": "Why this is plausibly relevant or why it is junk."
}
```
© elvisun · MIT · elvisun/newsjack