plugins/research/skills/refresh-research/SKILL.md
Use when user invokes /refresh-research to re-fetch refreshable research sources, detect meaningful changes, and update synthesis files. Supports specific files, categories, staleness thresholds, backfill of source_type, and audit-only dry runs.
npx skillsauth add harnessprotocol/harness-kit refresh-researchInstall 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.
Re-fetch live research sources (repos, docs), detect meaningful changes since initial capture, and update synthesis files. Raw sources are versioned (never overwritten), syntheses are surgically updated, and INDEX.md is rebuilt.
Core principles:
repo and docs source types. Blogs, papers, videos, and internal docs are static — skip them.User types /refresh-research followed by:
| Invocation | Behavior |
|------------|----------|
| (empty) | Interactive — show stale entries, let user pick which to refresh |
| research/agent-memory/cognee-architecture.md | Refresh a specific synthesis file |
| agent-memory | All refreshable entries in that category |
| --all | All refreshable entries across all categories |
| --stale 14 | Entries not checked in 14+ days (default threshold: 30) |
| --backfill | One-time: add source_type to entries missing it |
| --audit | Dry-run: staleness report, no modifications |
Flags can be combined: /refresh-research agent-memory --stale 7
Three optional fields extend the existing synthesis frontmatter:
---
tags: [github, memory, open-source]
date: 2026-02-12 # original research date (unchanged meaning)
source: https://docs.cognee.ai/
source_type: docs # NEW — repo | docs | blog | paper | internal | video
last_checked: 2026-03-16 # NEW — when last verified against source
refresh_status: changed # NEW — changed | unchanged | dead-link | archived
---
source_type gates refresh eligibility — only repo and docs are refreshablelast_checked is the staleness clock (separate from date which means "first captured")refresh_status is informational only (doesn't gate behavior)When source_type is missing, auto-detect from the source URL:
github.com/{owner}/{repo} → repo
contains "docs." or "/docs" or "/api" → docs
contains ".io" or ".dev" or ".ai" → docs (if not a blog path)
contains "blog" or "medium" or "substack" → blog
contains "arxiv" or ".pdf" → paper
starts with "internal" or empty → internal
contains "youtube" or "youtu.be" → video
else → blog (safe default, not refreshable)
Borderline cases: flag for user confirmation during --backfill.
You MUST follow this order. No skipping steps.
Based on invocation mode:
source_type, auto-detect from URL.research/{category}/*.md files.--all: Scan all research/**/*.md files (excluding INDEX.md, README.md, etc.).--stale N: Scan all, then filter to entries where last_checked is missing or older than N days (default 30).--backfill: Jump to Backfill Mode (see below).--audit: Jump to Audit Mode (see below).Filter to refreshable types: Only proceed with entries where source_type is repo or docs (auto-detect if missing).
Display staleness table:
Refreshable entries:
| # | File | Source Type | Last Checked | Days Stale | Status |
|---|------|-------------|-------------|------------|--------|
| 1 | research/agent-memory/cognee-architecture.md | docs | (never) | 33+ | — |
| 2 | research/tools/ntfy.md | docs | 2026-03-11 | 5 | unchanged |
...
N entries eligible for refresh. Proceed with all / pick numbers / cancel?
Confirm with user before proceeding. Never auto-refresh without confirmation.
For each confirmed entry:
For repo source type:
{owner}/{repo} from the source URLgh api repos/{owner}/{repo} --jq '.pushed_at'
pushed_at with last_checkedunchanged, update last_checked, skipgh api repos/{owner}/{repo}/git/trees/HEAD?recursive=1 --jq '[.tree[] | select(.type=="blob") | .path]'/research Step 1)gh api repos/{owner}/{repo}/contents/{path} --jq '.content' | tr -d '\n' | base64 -dgh api repos/{owner}/{repo}/releases?per_page=5 for recent releasesFor docs source type:
resolve-library-id with the library/tool namequery-docs for key topicsrefresh_status: dead-link, update last_checked, report to user, skipError handling:
dead-link, preserve synthesis, reportarchived, note in Update Loggh api rate_limit, report quota, offer to continue or stopFor each fetched entry:
Load existing raw source from resources/ (find the most recent file matching the topic)
Structural diff — compare:
Classify the change:
unchanged, update last_checked only, skip Steps 3-6Report diff summary to user:
## cognee-architecture.md
Source: https://docs.cognee.ai/
Change level: MINOR
- Version bump: 0.5.0 → 0.6.2
- New section: "Streaming Pipeline"
- Updated: "Storage Architecture" (minor wording changes)
Proceed with update? [y/n/skip]
Wait for user confirmation before modifying any files.
Write fetched content to resources/ with today's date:
resources/[topic]-[type]-YYYY-MM-DD.mdresources/cognee-docs-2026-03-16.mdresources/ntfy-readme-2026-03-16.mdRules:
[topic] slug as the original raw source file<!-- Refresh fetch: YYYY-MM-DD, previous: resources/[old-filename] -->Verify file exists before continuing: ls resources/[filename]
Based on change classification:
Minor changes:
Major changes:
Always add an Update Log entry (before the References section):
### Update Log
- **2026-03-16:** Refreshed from source. Version 0.5.0 → 0.6.2. Added Streaming Pipeline section. Updated storage architecture details. ([raw source](resources/cognee-docs-2026-03-16.md))
If an ### Update Log section already exists, append to it.
Update frontmatter:
last_checked: 2026-03-16 # update to today
refresh_status: changed # set to changed
Leave date unchanged — it records when the topic was first researched, not when it was last refreshed.
Keep source and tags unchanged unless the refresh reveals new relevant tags.
Add the new raw source file to the ## References → ### Raw Sources list:
- `resources/cognee-docs-2026-03-16.md` — Refresh fetch: updated docs content, 2026-03-16
Do NOT remove existing raw source entries — they form the version history.
Only for major changes:
research/INDEX.md and research/**/*.md for references to the updated entryCross-reference alert:
- research/agent-memory/tool-comparison.md references Cognee v0.5.0
→ Cognee is now v0.6.2, comparison may need updating
Skip this step entirely for minor changes.
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/rebuild-research-index.py"
Run from the project root. Expected output: Rebuilt INDEX.md: N entries
If the script fails, manually update the row in research/INDEX.md for the refreshed entry.
Do NOT skip this step. It is the final required action.
--backfill)One-time migration: add source_type to entries missing it.
research/**/*.md filessource_type in frontmatter:
a. Read the source field
b. Auto-classify using the Source Type Classification Logic above
c. Display classification for user review:
Backfill classifications:
| File | Source URL | Detected Type | Confidence |
|------|-----------|---------------|------------|
| cognee-architecture.md | https://docs.cognee.ai/ | docs | high |
| rowboat.md | https://github.com/rowboatlabs/rowboat | repo | high |
| agent-memory-landscape-analysis.md | (none) | internal | high |
| ai-routing-quick-reference.md | (none) | internal | high |
...
d. Flag borderline cases (confidence: low) for user confirmation
e. After user confirms, write source_type into each file's frontmatterpython3 "${CLAUDE_PLUGIN_ROOT}/scripts/rebuild-research-index.py"Backfill does NOT refresh content — it only adds the source_type field.
--audit)Dry-run staleness report. No files are modified.
research/**/*.md filessource_type (auto-detect if missing)last_checked (or date if last_checked is missing)# Research Freshness Audit — 2026-03-16
## Summary
- Total synthesis files: 136
- Refreshable (repo/docs): 59
- Non-refreshable (blog/paper/internal/video): 77
- Missing source_type field: 42 (run --backfill to fix)
## Staleness Breakdown
- Never checked: 59
- Checked < 7 days ago: 0
- Checked 7-30 days ago: 0
- Checked 30+ days ago: 0
## Refreshable Entries by Staleness
| File | Source Type | Source | Last Checked | Days Stale |
|------|------------|--------|-------------|------------|
| cognee-architecture.md | docs | docs.cognee.ai | (never) | 33+ |
| ntfy.md | docs | ntfy.sh | (never) | 5 |
...
## Dead Links
(none detected — run refresh to verify)
| Scenario | Action |
|----------|--------|
| 404 / dead link | Mark dead-link, preserve synthesis, report to user |
| Repo archived | Mark archived, note in Update Log, preserve synthesis |
| GitHub rate limit | gh api rate_limit, report quota, offer to continue or stop |
| No changes detected | Mark unchanged, update last_checked, report "up to date" |
| Context7 no coverage | Fall back to WebFetch |
| Missing source_type | Auto-detect from URL, warn about --backfill |
| WebFetch fails | Report error, skip entry, continue with next |
| Frontmatter parse error | Report file, skip entry, continue with next |
| No source URL in frontmatter | Skip entry (can't refresh without a source), report |
source_type (auto-detect if missing)resources/resources/[topic]-[type]-YYYY-MM-DD.md| Mistake | Fix |
|---------|-----|
| Overwrote existing raw source file | Always create a NEW file with today's date |
| Refreshed a blog post or paper | Only repo and docs are refreshable |
| Skipped user confirmation | Always show diff summary and wait for confirmation |
| Replaced synthesis instead of updating | Preserve analysis; update facts only |
| Deleted old raw source | Never delete — raw sources are the version history |
| Skipped Step 7 (INDEX rebuild) | Always rebuild INDEX.md after any synthesis update |
| Auto-modified cross-referenced files | Only FLAG related files — never auto-modify |
| Used WebFetch for GitHub repos | Use gh api for repos — WebFetch is for docs fallback |
| Refreshed without checking pushed_at | Fast-path skip if no pushes since last_checked |
| Skipped --backfill warning | If files are missing source_type, suggest --backfill |
| Changed source URL during refresh | Never change the source URL — it's the canonical reference |
| Forgot Update Log entry | Every refresh that changes content MUST have an Update Log entry |
refresh_status set to changed but no actual content updates madetools
Harness Kit documentation — installation, plugin catalog, creating plugins, cross-harness setup, architecture, and FAQ. Use when working with or configuring harness-kit plugins, understanding the plugin/skill system, installing slash commands, setting up AI coding tool configuration, answering questions about the plugin marketplace, writing SKILL.md files, using harness.yaml, or integrating with Copilot, Cursor, or Codex. Do NOT use for general Claude Code questions unrelated to harness-kit.
development
Use when user invokes /stats or asks about Claude Code usage, token consumption, session history, model distribution, or activity patterns. Generates an interactive HTML dashboard with charts and tables, auto-opens in browser. Also triggers on "how much have I used Claude", "show my usage", "token usage", "session stats", "usage report", "usage dashboard". Do NOT use for API billing or cost estimation — token counts are not costs.
development
Use when user invokes /review to review code changes. Also triggers on "review my code", "check this PR", "look at my changes". Accepts a PR number (e.g. /review 123), a path filter (e.g. /review src/auth/), or no argument (reviews current branch vs base). Produces structured per-file review with severity labels, cross-file analysis, and an overall verdict. Do NOT use for explaining what code does — use /explain instead.
testing
Use when user invokes /research command with any source — URL, GitHub repo, YouTube video, podcast, Reddit post, academic paper, documentation page, product site, local file, or empty. Processes and indexes research materials with raw source preservation and topic-level synthesis coalescing. Do NOT use for quick factual questions — use /explain instead.