newsjack 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/.mcp.json +9 -0
  2. package/.newsjack-npm +1 -0
  3. package/COMMIT +1 -0
  4. package/LICENSE +21 -0
  5. package/README.md +133 -0
  6. package/VERSION +1 -0
  7. package/bin/newsjack +74 -0
  8. package/package.json +37 -0
  9. package/skills/.gitkeep +0 -0
  10. package/skills/ETHICS.md +265 -0
  11. package/skills/WHY-NOT-SPAM.md +257 -0
  12. package/skills/angle-generator/SKILL.md +224 -0
  13. package/skills/angle-generator/examples.md +517 -0
  14. package/skills/angle-generator/rubric.md +219 -0
  15. package/skills/coverage-tracker/SKILL.md +124 -0
  16. package/skills/coverage-tracker-setup/SKILL.md +84 -0
  17. package/skills/crisis-holding/SKILL.md +336 -0
  18. package/skills/crisis-holding/examples.md +302 -0
  19. package/skills/crisis-holding/rubric.md +218 -0
  20. package/skills/fact-check/SKILL.md +212 -0
  21. package/skills/fact-check/examples.md +195 -0
  22. package/skills/fact-check/rubric.md +228 -0
  23. package/skills/journalist-fit-check/SKILL.md +199 -0
  24. package/skills/journalist-fit-check/examples.md +271 -0
  25. package/skills/journalist-fit-check/rubric.md +251 -0
  26. package/skills/meanest-editor/SKILL.md +112 -0
  27. package/skills/meanest-editor/examples.md +331 -0
  28. package/skills/meanest-editor/rubric.md +275 -0
  29. package/skills/media-list-manager/SKILL.md +204 -0
  30. package/skills/media-list-manager/examples.md +88 -0
  31. package/skills/media-list-manager/rubric.md +67 -0
  32. package/skills/news-search/SKILL.md +56 -0
  33. package/skills/newsjack-detector/SKILL.md +286 -0
  34. package/skills/newsjack-detector/examples.md +118 -0
  35. package/skills/newsjack-detector/references/engine-cli.md +29 -0
  36. package/skills/newsjack-detector/references/harness-routing.md +38 -0
  37. package/skills/newsjack-detector/references/rss-feeds.json +106 -0
  38. package/skills/newsjack-detector/rubric.md +160 -0
  39. package/skills/newsjack-monitor-setup/SKILL.md +202 -0
  40. package/skills/newsjack-monitor-setup/examples.md +106 -0
  41. package/skills/newsjack-triage/SKILL.md +98 -0
  42. package/skills/newsworthiness-check/SKILL.md +179 -0
  43. package/skills/newsworthiness-check/examples.md +232 -0
  44. package/skills/newsworthiness-check/rubric.md +218 -0
  45. package/skills/pr-strategist/SKILL.md +304 -0
  46. package/skills/reactive-comment/SKILL.md +297 -0
  47. package/skills/reactive-comment/examples.md +284 -0
  48. package/skills/reactive-comment/rubric.md +280 -0
  49. package/skills/relevance-coarse-filter/SKILL.md +61 -0
  50. package/skills/story-origin-check/SKILL.md +160 -0
  51. package/skills/voice-extractor/SKILL.md +330 -0
  52. package/skills/voice-extractor/examples.md +227 -0
  53. package/skills/voice-extractor/rubric.md +251 -0
  54. package/skills-manifest.json +254 -0
@@ -0,0 +1,219 @@
1
+ # Angle Generator Rubric
2
+
3
+ Use this rubric to evaluate an `angle-generator` output before it leaves the agent. Every criterion is scored 0-2.
4
+
5
+ - **0** - Missing, broken, or actively unsafe.
6
+ - **1** - Present but weak, generic, or partially unsupported.
7
+ - **2** - Solid, specific, and faithful to the skill.
8
+
9
+ Total possible: 20 points.
10
+
11
+ | Points | Verdict |
12
+ |--------|---------|
13
+ | 18-20 | **ship** |
14
+ | 14-17 | **revise** |
15
+ | 8-13 | **regenerate** |
16
+ | 0-7 | **refuse / ask for better input** |
17
+
18
+ ---
19
+
20
+ ## 1. Input Completeness And Now Anchor
21
+
22
+ **Source trace:** `Prompt scaffolding > Process`, `Hard rules`, `Decay reasoning`; `Rubric / checks / banned lists > Decay sanity check`.
23
+
24
+ The output must respect the input contract. `context.current_time` is required; the agent cannot infer "now" from model memory.
25
+
26
+ **Score 0:** Missing `current_time` is ignored, weak facts are padded into angles, or the output proceeds on generic input like "new UI" without asking questions.
27
+
28
+ **Score 1:** Anchors on `current_time` but still produces thin angles from thin facts.
29
+
30
+ **Score 2:** Refuses or narrows the output when facts are insufficient; uses `current_time` and supplied signals as the only basis for urgency.
31
+
32
+ Red flags:
33
+
34
+ - "Today" or "this week" with no supplied timestamp.
35
+ - Generic facts treated as news.
36
+ - Calendar or signal hooks force-fit to unrelated updates.
37
+
38
+ ---
39
+
40
+ ## 2. Fact Traceability / Hallucination Gate
41
+
42
+ **Source trace:** `Hard rules > You do not invent facts`; `Rubric / checks / banned lists > Hallucination gate`.
43
+
44
+ Every angle must identify which user-supplied facts it uses. Missing evidence belongs in `required_proof`, not in the headline or rationale.
45
+
46
+ **Score 0:** Invents statistics, named people, organizations, customer results, market claims, or regulatory details.
47
+
48
+ **Score 1:** Mostly grounded but includes unsupported context as if factual, or `facts_used` is vague.
49
+
50
+ **Score 2:** Every substantive claim traces to `update.facts`, provided links, company fields, or explicit signal payloads; missing evidence is cleanly flagged.
51
+
52
+ Red flags:
53
+
54
+ - `facts_used` is empty.
55
+ - A statistic appears that was not in the input.
56
+ - "Research shows" or "analysts say" with no provided source.
57
+
58
+ ---
59
+
60
+ ## 3. Structural Distinctness
61
+
62
+ **Source trace:** `Hard rules > You enforce structural distinctness`; `Rubric / checks / banned lists > Distinctness check`; `Sample I/O > Example 4`.
63
+
64
+ The set must contain different story shapes, not rephrasings for different inboxes.
65
+
66
+ **Score 0:** Multiple angles share the same headline frame, protagonist, story type, and journalist shape.
67
+
68
+ **Score 1:** Some distinction exists, but the set still contains filler variants or beat-swapped clones.
69
+
70
+ **Score 2:** Each kept angle has a distinct protagonist, beat, story type, proof path, or timing frame; duplicates are killed and logged.
71
+
72
+ Red flags:
73
+
74
+ - "Another angle" is the main differentiator.
75
+ - Same `story_type` plus same `beat_description`.
76
+ - More than 65% conceptual overlap between headline frames.
77
+
78
+ ---
79
+
80
+ ## 4. Journalist Shape
81
+
82
+ **Source trace:** `Journalist-shape rubric`; `Hard rules > You do not invent journalists`; `Pains addressed > Pitch volume + irrelevance`.
83
+
84
+ An angle is not real until a plausible beat can be named. The skill names the shape, not a specific journalist.
85
+
86
+ **Score 0:** Uses generic targets like "tech journalist" or names specific journalists without verification.
87
+
88
+ **Score 1:** Beat is present but broad; `evidence_they_care` is generic or could apply to any outlet.
89
+
90
+ **Score 2:** Beat, outlet archetype, timely reason, and `do_not_target` are specific enough to guide the next skill.
91
+
92
+ Red flags:
93
+
94
+ - "This would appeal to journalists who care about startups."
95
+ - No `do_not_target`.
96
+ - Named journalists appear in the output.
97
+
98
+ ---
99
+
100
+ ## 5. Why-Now And Decay
101
+
102
+ **Source trace:** `Decay reasoning`; `Hard rules > You tag every angle with decay`; `Rubric / checks / banned lists > Decay sanity check`.
103
+
104
+ The output must be honest about urgency.
105
+
106
+ **Score 0:** Claims breaking urgency without a supplied signal, or omits decay.
107
+
108
+ **Score 1:** Decay is present but generic; `why_now` is a vague trend or repeats the update date.
109
+
110
+ **Score 2:** `why_now` names the real time hook or says `EVERGREEN, NOT TIME-PRESSURED`; decay matches the source of urgency.
111
+
112
+ Red flags:
113
+
114
+ - `30min` or `4hr` with no `signal_from_newsjack_detector`.
115
+ - `evergreen` on a company update without an uncomfortable question.
116
+ - "In today's market" as the peg.
117
+
118
+ ---
119
+
120
+ ## 6. Anti-Slop Pass
121
+
122
+ **Source trace:** `Banned words and structures`; `Rubric / checks / banned lists > Anti-slop regex pass`; `Secondary signal - Reads like a bot wrote it`.
123
+
124
+ The output must reject AI-marketing language before the user sees it.
125
+
126
+ **Score 0:** Kept angles contain banned terms or press-release framing.
127
+
128
+ **Score 1:** Mostly clean but one field still leans on puffery or generic phrasing.
129
+
130
+ **Score 2:** Headline frames, `why_now`, `distinctness_check`, and `evidence_they_care` are concrete and free of banned structures.
131
+
132
+ Red flags:
133
+
134
+ - "innovative platform", "future of X", "game-changing", "excited to announce".
135
+ - "It's not just X, it's Y."
136
+ - Placeholder leftovers such as `[COMPANY]`.
137
+
138
+ ---
139
+
140
+ ## 7. Required Proof
141
+
142
+ **Source trace:** `What "an angle" means`; `Hard rules > You ask uncomfortable questions`; `Rubric / checks / banned lists > Per-angle proof requirement`.
143
+
144
+ The skill must show what evidence makes the angle pitchable.
145
+
146
+ **Score 0:** Proof is absent, generic, or asks for evidence after already making the claim.
147
+
148
+ **Score 1:** Proof exists but is not specific enough to guide the user.
149
+
150
+ **Score 2:** Each angle lists concrete proof; `data`, `customer-story`, `contrarian`, and `exec-spotlight` angles have at least one required proof item.
151
+
152
+ Red flags:
153
+
154
+ - "Need more data" with no description of what data.
155
+ - Contrarian angle with no stated conventional wisdom to challenge.
156
+ - Customer story with no customer proof requirement.
157
+
158
+ ---
159
+
160
+ ## 8. Refused Angles
161
+
162
+ **Source trace:** `Hard rules > You output the refused angles`; `Refusal patterns`; `Sample I/O`.
163
+
164
+ Refusal is part of the product. The user should see what died and why.
165
+
166
+ **Score 0:** No `refused_angles` field, or bad angles are kept instead of killed.
167
+
168
+ **Score 1:** Refused angles are listed but reasons are vague or outside the allowed values.
169
+
170
+ **Score 2:** Refused angles use allowed reasons and teach the user what not to pitch.
171
+
172
+ Allowed refusal reasons:
173
+
174
+ - `duplicate`
175
+ - `slop`
176
+ - `hallucinated_fact`
177
+ - `no_journalist_shape`
178
+ - `no_why_now_but_required`
179
+ - `off-beat`
180
+
181
+ ---
182
+
183
+ ## 9. Uncomfortable Questions And Next Skill
184
+
185
+ **Source trace:** `Hard rules > You ask uncomfortable questions`; `When to call other skills`; `Open questions / risks > brand risk of being too refusenik`.
186
+
187
+ The skill should be tough without stranding the user.
188
+
189
+ **Score 0:** No questions when proof gaps are obvious, or the output ends without a next move.
190
+
191
+ **Score 1:** Questions exist but are broad, soft, or disconnected from the angles.
192
+
193
+ **Score 2:** Questions expose the exact missing facts that determine whether the angles are real; `follow_up_suggestions` names the right next skill or `null`.
194
+
195
+ Red flags:
196
+
197
+ - "Can you provide more details?"
198
+ - Recommending `meanest-editor` before there is an angle or draft.
199
+ - Calling a media-list skill before journalist shapes exist.
200
+
201
+ ---
202
+
203
+ ## 10. Output Contract
204
+
205
+ **Source trace:** `Output schema`; `Prompt scaffolding > Output format`.
206
+
207
+ The final output must be machine-usable.
208
+
209
+ **Score 0:** Prose summary instead of JSON, missing top-level keys, or invalid JSON.
210
+
211
+ **Score 1:** JSON is valid but fields are missing, renamed, or filled with vague placeholders.
212
+
213
+ **Score 2:** Valid JSON with `angles`, `refused_angles`, `uncomfortable_questions`, and `follow_up_suggestions`; each angle includes all required fields.
214
+
215
+ Red flags:
216
+
217
+ - Preamble such as "Here are your angles."
218
+ - Markdown bullets instead of the schema.
219
+ - `anti_slop_pass` omitted or set without actual anti-slop compliance.
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: coverage-tracker
3
+ description: "Run a Google Alerts-style keyword coverage tracker. Uses news-search for recent keyword queries, lets the LLM dedupe and classify real features versus junk, stores decisions in SQLite, and alerts only on new real coverage."
4
+ when_to_use: "User wants to run coverage alerts, check new mentions, track press coverage, monitor brand/company keyword coverage, or execute a previously configured coverage tracker."
5
+ ---
6
+
7
+ # Coverage Tracker
8
+
9
+ Track whether configured keywords appeared in real coverage. Keep this simple: `news-search` collects dated article evidence, you dedupe and judge with the keyword's meaning snippet, and the CLI only stores config plus seen/alert state.
10
+
11
+ This is not `newsjack-detector`. Do not score newsjacking opportunities, generate angles, assess standing, or use monitor profiles.
12
+
13
+ ## Workflow
14
+
15
+ 1. **Find the tracker.**
16
+ - If the user gave a slug, run `newsjack coverage status <slug>`.
17
+ - If working in a source checkout, prefer `bin/newsjack`.
18
+ - If no slug is given, ask which tracker to run unless local context makes it obvious.
19
+ - Read the returned `config_path`.
20
+
21
+ 2. **Search each keyword.**
22
+ - Read the current date from the system (e.g. run `date`); do not recall it from memory. Compute `since_date` as that date minus `lookback_days` from the config, defaulting to `2`.
23
+ - For each keyword, call `news-search` with exactly:
24
+
25
+ ```text
26
+ "keyword" after:YYYY-MM-DD
27
+ ```
28
+
29
+ - If the keyword has aliases, search each alias the same way, but keep the original keyword entry attached.
30
+ - Keep dated, attributed article fields from `news-search`: `title`, `url`, `outlet`, `author`, `published_at`, and snippet/summary when available.
31
+
32
+ 3. **Dedupe and check stored decisions before using the LLM.**
33
+ - Dedupe exact canonical URLs first, then obvious same-article duplicates by title/outlet/date.
34
+ - Create a minimal candidate JSON file only because the CLI helper consumes a file. Put it in a temporary location, or in a timestamped run folder if your harness normally keeps run artifacts:
35
+
36
+ ```json
37
+ {
38
+ "items": [
39
+ {
40
+ "keyword": "profound",
41
+ "title": "Article title",
42
+ "url": "https://...",
43
+ "outlet": "Outlet",
44
+ "author": "Author or null",
45
+ "published_at": "2026-06-05T12:00:00Z",
46
+ "snippet": "Search snippet or summary"
47
+ }
48
+ ]
49
+ }
50
+ ```
51
+
52
+ - Run:
53
+
54
+ ```bash
55
+ newsjack coverage check <slug> --input candidates.json
56
+ ```
57
+
58
+ - Do not reclassify `known_items` unless the user explicitly asks for a fresh review. Use their `prior_decision` to count filtered/known results and suppress repeat alerts.
59
+ - Classify only `unknown_items`.
60
+
61
+ 4. **LLM classify unknown items.**
62
+ - Use the keyword's `means` field as the authority for entity matching.
63
+ - Reject generic-word usage and wrong entities, especially for ambiguous keywords like `profound`.
64
+ - Do not alert from title/snippet keyword presence alone. When the snippet leaves the verdict unclear, read the article before deciding.
65
+
66
+ Use these verdicts:
67
+
68
+ - `real_feature`: the article is substantially about the intended entity/product/person. Alert.
69
+ - `substantive_mention`: meaningful paragraph-level mention, but not a feature. Save, normally no alert.
70
+ - `passing_mention`: brief mention only. Save, no alert.
71
+ - `wrong_entity`: the keyword refers to something else. Save, no alert.
72
+ - `junk`: SEO, scraper, duplicate landing page, job post, docs/help page, or non-news. Save, no alert.
73
+ - `uncertain`: insufficient evidence. Save, no alert.
74
+
75
+ 5. **Record only newly classified unknown items.**
76
+ If there are no `unknown_items`, skip `coverage record` and report from the `coverage check` result.
77
+
78
+ If you classified new items, write the minimum `decisions.json` needed by the CLI:
79
+
80
+ ```json
81
+ {
82
+ "items": [
83
+ {
84
+ "keyword": "profound",
85
+ "title": "Article title",
86
+ "url": "https://...",
87
+ "outlet": "Outlet",
88
+ "author": "Author or null",
89
+ "published_at": "2026-06-05T12:00:00Z",
90
+ "verdict": "real_feature",
91
+ "confidence": "high",
92
+ "alert": true,
93
+ "rationale": "Why this is about the intended keyword."
94
+ }
95
+ ]
96
+ }
97
+ ```
98
+
99
+ Include every newly classified unknown item, not only alerts. Saving rejects lets future runs skip them through `coverage check`.
100
+
101
+ 6. **Persist decisions and suppress repeat alerts.**
102
+
103
+ ```bash
104
+ newsjack coverage record <slug> --input decisions.json
105
+ ```
106
+
107
+ Add `--run-dir RUN_DIR` only when you already created a run folder for harness provenance. Read the command's JSON stdout directly. Do not write `record.json` unless the user or harness explicitly wants artifacts. Only articles in `new_alerts` are newly alertable; previously alerted URLs must not be re-alerted.
108
+
109
+ 7. **Deliver the result to the user.**
110
+ SQLite is the durable record. Do not write a separate report file; compose a short, readable message straight to the user from `coverage check` and, when run, `coverage record`:
111
+ - If `new_alerts` is non-empty, lead with the new real coverage items.
112
+ - If there are no new alerts, say there is no new confirmed coverage.
113
+ - Include a short run summary: keywords searched, since date, candidate count, skipped-known count, newly judged count, new alert count.
114
+ - Include a quiet "Filtered" line with counts by verdict, including prior decisions from known items, not a dump of every junk item.
115
+ - Use clickable links.
116
+
117
+ This skill is meant to run unattended on a schedule, so the message must stand alone — the user should not have to open any file to understand the run.
118
+
119
+ ## Output Discipline
120
+
121
+ - Do not invent publication dates, outlets, or authors. If `news-search` cannot recover a date, classify cautiously.
122
+ - Do not use story-origin or freshness gates; this is not a newsjack opportunity scan.
123
+ - Do not call `angle-generator`, `journalist-fit-check`, or `meanest-editor`.
124
+ - Do not install native cron. Recurrence belongs to the agent harness.
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: coverage-tracker-setup
3
+ description: "Set up a lightweight Google Alerts-style coverage tracker for any number of keywords. Creates a tracker config with each keyword and what it actually means, then hands recurrence to the user's agent harness."
4
+ when_to_use: "User wants to create, configure, or update coverage alerts, brand/company mention tracking, Google Alert-style monitoring, or keyword coverage tracking. Use this instead of newsjack-monitor-setup when the job is to track coverage of the user's own keywords rather than find newsjacking opportunities."
5
+ ---
6
+
7
+ # Coverage Tracker Setup
8
+
9
+ Create a simple keyword tracker for `coverage-tracker`. This workflow is intentionally separate from newsjack monitor profiles: coverage tracking answers "did my keyword get real coverage?", not "can this client newsjack a broader story?"
10
+
11
+ ## Inputs
12
+
13
+ Ask only for missing facts:
14
+
15
+ - tracker name
16
+ - any number of keywords
17
+ - one short `means` snippet per keyword: what entity/product/person the keyword should refer to
18
+ - optional exclusions for ambiguous terms
19
+ - cadence preference for the agent harness: daily morning, twice daily, or hourly
20
+
21
+ Do not ask for standing, spokespeople, competitors, proof assets, RSS feeds, target beats, or PR angles. Those belong to newsjacking, not coverage tracking.
22
+
23
+ ## Setup Workflow
24
+
25
+ 1. Build a tiny tracker JSON:
26
+
27
+ ```json
28
+ {
29
+ "name": "Profound",
30
+ "lookback_days": 2,
31
+ "keywords": [
32
+ {
33
+ "keyword": "profound",
34
+ "means": "Profound, the AI search analytics company.",
35
+ "exclude_hints": ["generic adjective uses"]
36
+ }
37
+ ]
38
+ }
39
+ ```
40
+
41
+ `keywords` may contain any number of entries. Keep each `means` field concrete enough that a later LLM pass can reject wrong-entity and generic mentions.
42
+
43
+ 2. Save it with the CLI:
44
+
45
+ ```bash
46
+ newsjack coverage init <slug> --config tracker.json
47
+ ```
48
+
49
+ In a source checkout, prefer `bin/newsjack` from the repo root. Use `--force` only when the user explicitly wants to overwrite the existing tracker config.
50
+
51
+ 3. Set up recurrence in the agent harness, not native cron. If the runtime exposes a scheduling feature, schedule this prompt:
52
+
53
+ ```text
54
+ Use the coverage-tracker skill for <slug>.
55
+ ```
56
+
57
+ If no scheduling tool is available, tell the user exactly which prompt to schedule in Claude, Codex, Hermes, OpenClaw, or their chosen harness. Do not install system cron, launchd, systemd timers, or other native schedulers.
58
+
59
+ 4. Run once immediately if the user asked for a working setup, or if this is an end-to-end setup flow. Use `coverage-tracker` for the new slug and relay its first-run result to the user.
60
+
61
+ ## Updating Existing Trackers
62
+
63
+ Run:
64
+
65
+ ```bash
66
+ newsjack coverage status <slug>
67
+ ```
68
+
69
+ Read the `config_path`, edit the tracker JSON, then re-run:
70
+
71
+ ```bash
72
+ newsjack coverage init <slug> --config tracker.json --force
73
+ ```
74
+
75
+ Only change the keyword aperture or meaning snippet. Alert decisions are stored in SQLite by `coverage-tracker`; do not edit those by hand.
76
+
77
+ ## Output
78
+
79
+ When setup is complete, tell the user:
80
+
81
+ - tracker slug
82
+ - config path
83
+ - schedule prompt/cadence
84
+ - first-run result if you ran it