---
name: release-source-capture
description: Watch trusted GitHub release and RSS/Atom sources, dedupe them with a state file, and emit normalized JSON events for a Hermes/Codex content brief.
---

# Release Source Capture

Use this skill when a user wants a low-cost watcher for Codex, Hermes, OpenAI, or other trusted release sources, with the output routed into article briefs, course updates, or skill maintenance tasks.

Keep this step deterministic. The script does not call an LLM, draft copy, create issues, send Discord messages, or publish anything. It captures source events, writes a local state file for dedupe, and prints normalized JSON for the next agent step.

## Workflow

1. Create a trusted source registry JSON file.
2. Include only official or primary sources: GitHub releases, official RSS/Atom feeds, docs changelogs, and vendor blogs.
3. Install the skill and `cd` into the installed directory.
4. Run `node scripts/release-source-capture.mjs capture --registry ~/release-sources.json --state ~/.release-source-capture/state.json --dry-run`.
5. Inspect the normalized JSON events.
6. Remove `--dry-run` only after the registry is trusted.
7. Run once without `--dry-run` to seed the state file before alerting.
8. Run the script hourly from cron or a Hermes scheduled job.
9. Pass non-empty events into a second Hermes/Codex prompt that verifies primary sources and prepares a research brief for a possible 2000-word implementation article.
10. Require human approval before publishing or updating live course content.

## Registry shape

The script accepts either the original simple array shape or an expanded registry object with thresholds, report sections, and source metadata.

```bash
cat > ~/release-sources.json <<'JSON'
{
  "thresholds": { "minimumReportScore": 70, "tier2MinimumScore": 82 },
  "reportSections": [
    "package updates",
    "frontier model updates",
    "operator/harness updates",
    "content/course opportunities"
  ],
  "sources": [
    {
      "id": "hermes-agent-releases",
      "type": "github-releases",
      "url": "https://api.github.com/repos/NousResearch/hermes-agent/releases",
      "product": "Hermes Agent",
      "tier": 0,
      "category": "package updates",
      "importance": "high",
      "importanceScore": 96,
      "suggestedBlsActions": ["skill update", "course module", "operator integration"]
    },
    {
      "id": "openclaw-releases",
      "type": "github-releases",
      "url": "https://api.github.com/repos/openclaw-ai/openclaw/releases",
      "product": "OpenClaw",
      "tier": 0,
      "category": "operator/harness updates",
      "importance": "high",
      "importanceScore": 94,
      "suggestedBlsActions": ["operator integration", "install guide", "course module"]
    },
    {
      "id": "claude-code-releases",
      "type": "github-releases",
      "url": "https://api.github.com/repos/anthropics/claude-code/releases?per_page=10",
      "product": "Claude Code",
      "tier": 0,
      "category": "operator/harness updates",
      "importance": "high",
      "importanceScore": 90,
      "suggestedBlsActions": ["tool comparison", "course awareness", "workflow note"]
    },
    {
      "id": "qwen-releases",
      "type": "github-releases",
      "url": "https://api.github.com/repos/QwenLM/Qwen3/releases",
      "product": "Qwen / Qwen3",
      "tier": 1,
      "category": "frontier model updates",
      "importance": "high",
      "importanceScore": 84,
      "suggestedBlsActions": ["model comparison", "local model guide", "watchlist"]
    },
    {
      "id": "deepseek-releases",
      "type": "github-releases",
      "url": "https://api.github.com/repos/deepseek-ai/DeepSeek-V3/releases",
      "product": "DeepSeek",
      "tier": 1,
      "category": "frontier model updates",
      "importance": "high",
      "importanceScore": 84,
      "suggestedBlsActions": ["model comparison", "cost/performance note", "watchlist"]
    },
    {
      "id": "opencode-releases",
      "type": "github-releases",
      "url": "https://api.github.com/repos/sst/opencode/releases",
      "product": "OpenCode",
      "tier": 1,
      "category": "operator/harness updates",
      "importance": "high",
      "importanceScore": 83,
      "suggestedBlsActions": ["tool comparison", "operator integration", "watchlist"]
    }
  ]
}
JSON
```

## Behavior

- Supports source types `github-releases`, `rss`, and `web-page`.
- Uses simple RSS/Atom parsing; prefer official feeds with canonical links.
- Uses a normalized visible-text fingerprint for official changelog/news pages that do not expose a feed. Script/style/SVG blocks are removed before hashing to reduce false change events.
- Fetches sources in bounded batches (`--concurrency`, default 6) with Node's built-in `fetch`.
- Supports `--since-days` and `--limit-per-source` so weekly runs do not flood the brief with old releases.
- Requires Node 18+; Node 20+ is recommended for server installs.
- Converts each item into normalized JSON.
- Adds source metadata when provided: `category`, `tier`, `coverageGroup`, `official`, `importanceScore`, and `suggestedBlsActions`.
- Emits a `coverage` receipt with configured/succeeded/failed source counts and per-group coverage before synthesis.
- Filters events below `thresholds.minimumReportScore` when the registry object defines thresholds.
- Groups the output into `reportSections`, including a separate `content/course opportunities` backlog view for events with suggested BuildLeanSaaS actions.
- Computes a SHA-256 hash from the source id, URL, title, publication time, summary, and normalized page fingerprint when applicable.
- Uses a state file to dedupe events by source id and hash.
- Prints only new events.
- Writes state unless `--dry-run` is set.
- Fails closed on unsupported source types instead of guessing a parser.
- Returns exit code `2` when any source fails, even if other sources produced events. Treat partial failures as something to inspect.
- Does not publish, draft final copy, create CMS entries, or mutate remote systems.

## Normalized JSON

```json
{
  "sourceId": "hermes-agent-releases",
  "sourceType": "github-releases",
  "product": "Hermes Agent",
  "importance": "high",
  "title": "v0.9.4",
  "url": "https://github.com/NousResearch/hermes-agent/releases/tag/v0.9.4",
  "publishedAt": "2026-05-13T14:00:00.000Z",
  "summary": "Release body or feed summary excerpt",
  "hash": "sha256:..."
}
```

## Commands

Dry run from the installed skill directory:

```bash
cd "$HOME/.agents/skills/content/release-source-capture"
node scripts/release-source-capture.mjs capture \
  --registry ~/release-sources.json \
  --state ~/.release-source-capture/state.json \
  --dry-run
```

Before writing state, check that the URLs are canonical, the summaries are useful enough for triage, and repeated dry runs do not produce surprise duplicates.

Write state once to seed current items before alerting:

```bash
node scripts/release-source-capture.mjs capture \
  --registry ~/release-sources.json \
  --state ~/.release-source-capture/state.json
```

Cron:

```bash
mkdir -p ~/logs
```

```cron
7 * * * * cd $HOME/.codex/skills/content/release-source-capture && /usr/bin/env node scripts/release-source-capture.mjs capture --registry $HOME/release-sources.json --state $HOME/.release-source-capture/state.json >> $HOME/logs/release-source-capture.log 2>&1
```

## Writing brief handoff

When stdout contains new events, ask Hermes or Codex:

```text
Research these trusted release events and prepare a sourced research brief for a possible implementation article.
Start with primary sources: release notes, docs, changelog entries, commits, issues, and official announcements.
For each event, explain what changed, who needs to care, compatibility or migration risk, local verification steps, tutorial angle, and source links.
Do not draft final copy, update course content, or publish until a human approves the angle.
```

## Pitfalls

- Do not add noisy scraped social feeds to the registry in v1.
- Do not auto-publish from this skill.
- Do not call an LLM from the hourly detector.
- Do not trust generated summaries, RSS excerpts, or copied changelog blurbs without checking the canonical release page or docs.
- Do not treat every release as content. Low-impact events should be logged and ignored.
- Keep the state file backed up if the watcher is part of a production content workflow.
- Watch GitHub API rate limits if you monitor many repositories. Unauthenticated API requests are limited; reduce the source count or add token support before scaling.
