weekly-digest/SKILL.md
Research, score, and publish a weekly industry digest on any topic. Casts a wide net via web search (20+ candidates), verifies sources for AI-generated slop, scores each item on five parameters (Novelty, Relevance, Slopiness, Technical depth, Feasibility), selects the top items, and generates both markdown files and a Tufte-style HTML report. Use this skill whenever the user says "/weekly-digest", "run the weekly digest", "industry digest", "what's new in [topic]", "weekly roundup", "news digest on [topic]", "research what happened this week in [topic]", or any request to create a curated, scored summary of recent developments in a field. Also use when the user wants to monitor a topic area with quality filtering — the slopiness scoring is the key differentiator from a simple news search.
npx skillsauth add glebis/claude-skills weekly-digestInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A research-to-publication pipeline that produces a scored, source-verified industry digest. The workflow has seven phases: init, scoping, research, verification, scoring, output, and presentation.
Read ~/.claude/skills/weekly-digest/settings.json. Two possible states:
State A — file missing, or subjects is empty and file has no version field (fresh install): Run onboarding using the AskUserQuestion tool to collect all setup inputs in a single structured prompt:
AskUserQuestion({
questions: [
{
question: "What topic do you want to track weekly?",
header: "Topic",
options: [
{ label: "Agent orchestration", description: "Multi-agent frameworks, enterprise deployments, governance" },
{ label: "Design innovation", description: "Design tools, AI-design convergence, award-winning products" },
{ label: "Climate tech", description: "Clean energy, carbon capture, sustainability startups" },
{ label: "AI regulation", description: "EU AI Act, governance frameworks, copyright disputes" }
],
multiSelect: false
},
{
question: "Any geographic focus for sources?",
header: "Geography",
options: [
{ label: "Global (no filter)", description: "Include sources from all regions" },
{ label: "Europe, UK, Asia — not US", description: "Deprioritize American sources" },
{ label: "Europe only", description: "EU and UK sources preferred" },
{ label: "Asia-Pacific", description: "Japan, Korea, China, Singapore, India, Australia" }
],
multiSelect: false
},
{
question: "How many top items should the digest include?",
header: "Digest size",
options: [
{ label: "5 items (Recommended)", description: "Good balance of depth and brevity" },
{ label: "3 items", description: "Quick scan, only the best" },
{ label: "10 items", description: "Comprehensive coverage" }
],
multiSelect: false
},
{
question: "Where should output files go?",
header: "Output",
options: [
{ label: "output/ (Recommended)", description: "Relative to current working directory" },
{ label: "~/Digests/", description: "Home directory, shared across projects" }
],
multiSelect: false
}
]
})
Adapt the example options to match the user's context if you know it from memory/profile. The user can always pick "Other" to type a custom value for any question.
After receiving answers:
output_prefix (lowercase, hyphenated, no spaces — e.g., "Agent orchestration" → "agent-orch")geo_focus (null for "Global", string for others)top_n from the digest size answer (3, 5, or 10){ "version": 1, "top_n": 5, "target_candidates": 20, "lookback_days": 7,
"output_dir": "output", "language": "en",
"weights": { "novelty": 1, "relevance": 1, "slopiness": 1, "technical": 1, "feasibility": 1 },
"obsidian_vault": null, "subjects": [{ ... }] }
output_dir exists (create if needed) before proceeding./weekly-digest add [topic] to add more subjects."The same AskUserQuestion pattern should be used for /weekly-digest add — ask topic, geo focus, and confirm the generated slug.
State B — subjects exist, user ran /weekly-digest (no args): Run all subjects sequentially.
When subjects list is empty but version field exists (user cleared subjects intentionally): Don't auto-onboard. Respond: "No subjects configured. Add one with /weekly-digest add [topic]."
For the full settings schema, see settings.example.json in the skill directory.
Settings live at ~/.claude/skills/weekly-digest/settings.json.
{
"version": 1,
"top_n": 5,
"target_candidates": 20,
"lookback_days": 7,
"output_dir": "output",
"language": "en",
"weights": {
"novelty": 1,
"relevance": 1,
"slopiness": 1,
"technical": 1,
"feasibility": 1
},
"obsidian_vault": null,
"subjects": [
{
"topic": "agent orchestration",
"geo_focus": "European, UK, Asian — not American",
"output_prefix": "agent-orch"
}
]
}
All fields except subjects are optional — missing keys use defaults shown above. The output_prefix must be a lowercase hyphenated slug (no spaces).
/weekly-digest config — show current settings/weekly-digest add [topic] — interactively add a new default subject (ask for geo focus and output prefix)/weekly-digest remove [topic] — remove a subject from defaults/weekly-digest (no args) — run all default subjects sequentially, producing separate file sets for each/weekly-digest [topic] — run a single topic as a one-off (ignores defaults)| Key | Default | What it does |
|-----|---------|-------------|
| top_n | 5 | How many items appear in the digest |
| target_candidates | 20 | How many candidates to aim for in research |
| lookback_days | 7 | How far back to search (appended to queries as date range) |
| output_dir | "output" | Directory for generated files (relative to cwd) |
| language | "en" | Preferred source language; non-matching sources deprioritized |
| weights | all 1.0 | Per-parameter multipliers for the overall score formula |
| obsidian_vault | null | Path to Obsidian vault; when set, digest is copied to {vault}/Digests/YYYYMMDD-{prefix}.md |
Parse the user's request for:
Auto-detect today's date for file naming (YYYYMMDD format).
If the user gives a vague topic like "AI", push back and ask them to narrow it — broad topics produce generic results.
Run 4-6 parallel WebSearch queries designed to cover different angles of the topic. The goal is target_candidates unique items (default 20). Use lookback_days to scope recency — include month/year in queries for the configured window. Structure searches like this:
| Query pattern | What it catches |
|---------------|-----------------|
| [topic] breakthrough announcements [month] [year] | Major launches, product releases |
| [topic] startup funding [year] [geo] | Funding rounds, new entrants |
| [topic] open source release [year] | OSS frameworks, tools |
| [topic] research paper arxiv [year] | Academic contributions |
| [topic] enterprise production [year] [geo] | Real deployments, case studies |
| [topic] regulation governance [year] [geo] | Policy, compliance, standards |
If a geographic focus is specified, add geographic terms to queries and add a dedicated regional search. When language is set, prefer sources in that language.
Deduplicate across search results. Aim for diversity — reject a candidate pool that's all from the same source type (e.g., all market forecasts or all press releases). Check that at least 3 of these 6 categories are represented.
If fewer than 15 candidates are found: widen one query by removing the year/month filter and run it again. If still below 15, proceed with what exists and note the shortfall in the raw file header.
Select the top 8-10 candidates for verification using this pre-screening signal: pick items whose search snippets contain at least one of: a specific named person/organization, a specific date, a version number, or a dollar amount. Deprioritize items with exclusively superlative or vague language.
Use WebFetch on primary sources to check for slop indicators:
Red flags (high slopiness score):
Green flags (low slopiness score):
When a secondary source has slop indicators but the underlying story might be real, check the primary source (company blog, official press release, arXiv abstract). Score the best available source, not the worst.
If WebFetch fails (paywall, 403, timeout, empty content): note the failure in scoring notes, score slopiness conservatively at 5 (unknown quality), and move on. Record the failed URL in the failure log.
Rate each candidate 0-10 on five parameters:
| Parameter | What it measures | 0 means | 10 means | |-----------|-----------------|---------|----------| | Novelty | How new or unprecedented | Old news, incremental | World's first, paradigm shift | | Relevance | How relevant to the user | Unrelated vertical | Directly useful for their work | | Slopiness | How likely the source is slop | Solid primary source | Pure AI slop or SEO filler | | Technical | Technical depth | Zero technical content | Deep architecture, reference impl | | Feasibility | Real vs. speculative | Sci-fi, vaporware | Shipping in production |
Slopiness convention: 0 = verified, trustworthy source. 10 = pure slop. The formula inverts it so that low-slop items score higher.
Overall = (w₁·Novelty + w₂·Relevance + w₃·(10 - Slopiness) + w₄·Technical + w₅·Feasibility) / (w₁ + w₂ + w₃ + w₄ + w₅)
Weight mapping from settings.json keys to formula symbols:
w₁ = weights.noveltyw₂ = weights.relevancew₃ = weights.slopinessw₄ = weights.technicalw₅ = weights.feasibilityDefault: all 1.0, making this a simple average.
Relevance depends on who the user is. Check memory/profile for context. When no profile is available, use these anchors for a technical-practitioner audience:
Generate files in the configured output_dir (default: output/, relative to cwd). Create the directory if needed — if creation fails (permissions, invalid path), abort with a clear error before writing.
Slug rule for all runs: every run has a {prefix} slug. For settings-based subjects, use output_prefix from the subject config. For single-topic one-off runs, derive a slug from the topic using the same rule as Phase 0 step 3 (lowercase, hyphenated, no spaces — e.g., "quantum computing" → "quantum-computing").
File naming (always uses prefix):
YYYYMMDD-{prefix}-raw.mdYYYYMMDD-{prefix}-digest.mdYYYYMMDD-{prefix}-failures.md (only if failures exist)YYYYMMDD-{prefix}-report.html (from Phase 6)*-raw.md)All candidates (target: 20+) with:
*-digest.md)Top top_n items (default: 5) selected by overall score, each with:
Include a brief note at the top explaining the selection method and pointing to the raw file.
*-failures.md)Record in a separate file:
Only create this file if there are failures to log.
If a previous digest exists for the same subject, compare. To find the previous digest: list all files matching *-{prefix}-digest.md in output_dir, parse the YYYYMMDD date prefix. If a file from today already exists (same-day rerun), treat it as the previous version and rename it to YYYYMMDD-{prefix}-digest.prev.md before writing the new one. Otherwise select the most recent file older than today. Compare:
If obsidian_vault is set in settings.json, copy the digest file to {obsidian_vault}/Digests/YYYYMMDD-{prefix}.md after generation (using the same {prefix} slug as the output files). Create the Digests/ directory if needed.
Invoke the /tufte-report skill to generate a Tufte-style HTML report. The tufte-report skill must be installed at ~/.claude/skills/tufte-report/ — if it is not available, skip this phase and tell the user: "Install the tufte-report skill from github.com/glebis/claude-skills for HTML report generation."
The report should include:
top_n items as ranked cards with overall scoresSave the report as {output_dir}/YYYYMMDD-{prefix}-report.html and open it in the browser.
/weekly-digest agent orchestration
/weekly-digest climate tech, focus on European and Asian news
/weekly-digest config
/weekly-digest add quantum computing
/weekly-digest remove design innovation
/weekly-digest # runs all saved subjects
Before presenting results, verify:
target_candidates items in the raw file (or shortfall noted)top_n has slopiness > 6 — if one does, drop it and promote the next-ranked item. (Items at slopiness 5 from WebFetch failures are allowed through; only clearly sloppy sources at 7+ are blocked.)development
Create Tufte-inspired data reports and infographic dashboards as standalone HTML files. Uses EB Garamond for text, Monaspace Argon for numbers, Chart.js for interactive charts, and inline SVG sparklines. Produces publication-quality reports with 2-column narrative+data layouts, status dashboards, scroll animations, and responsive mobile support. Use this skill whenever the user wants to create a data report, activity dashboard, infographic, personal analytics page, health tracker visualization, or any document that combines narrative text with interactive charts and tables. Also triggers for "make a report like Tufte", "create an infographic", "build a dashboard", "visualize my data", or requests for beautiful data-driven documents.
documentation
Cut a software release and maintain a tiered compatibility policy. Use when the user wants to release, ship a version, bump the version, tag a release, write a changelog, or update COMPATIBILITY. Config-driven via release.config.json; bumps version files, runs a readiness gate, updates COMPATIBILITY.md tiers and deprecations, tags (→ release workflow), and reports closed issues. Teaches the underlying standards as it runs.
development
Sync and manage bilingual (EN/RU) library content for agency-docs. Use when adding, updating, or reviewing library articles. Handles translation, sync checks, and Russian stylistic review.
development
This skill should be used to watch a long-running background job (ffmpeg/media encode, qmd or other embedding/vector-DB run, batch agent/LLM pipeline, or a real-browser/agent-browser daemon) until it finishes or wedges, then deliver a verdict (done, needs-attention, or blocked) plus the exact next command, without burning dozens of manual poll commands. Triggers on "babysit this job", "watch this until it's done", "ping me when the encode/embed/batch finishes", "is this background process stuck", "monitor this ffmpeg/qmd run", or any request to wait on a long-running process and be told when it's complete or hung.