Generate this week's NeuroTech intelligence briefing
This file is the complete operational specification for the NewsHound skill. It describes what the agent does, how it reasons, what tools it has, and what constraints it operates under. A developer should be able to read this file alone and understand the agent's complete behavior.
For agent identity and values, see
../../SOUL.md. For runtime configuration, seeconfig.yamlandprompts.yaml.
Produce a weekly intelligence briefing on the implantable BCI ecosystem by fetching from 20+ sources, scoring items with domain-aware LLM judgment, clustering into themes, and synthesizing an executive brief — then critically reviewing its own output.
The briefing replaces manual scanning of dozens of journals, preprint servers, press outlets, and regulatory feeds. A senior researcher should be able to read the output in 5 minutes and know what mattered this week.
discoveries.yaml for
human review and promotion to the watchlist.vocabulary.yaml. The PubMed query and
regex pre-filter are constructed dynamically from this vocabulary. Term
counts self-stabilize as domain vocabulary is finite. A configurable
max_terms_per_category limit prevents unbounded growth.Status: Goals 10–13 are now handled by the
meta_reflectReAct agent (Phase 9). The LLM reasons about whether and when to pursue these goals based on the pipeline's output. Seenodes/meta_reflect.pyanddocs/ADR-001-agent-specification.md.
The skill has access to the following tools, implemented as Python modules:
| Tool | Module | Description |
|---|---|---|
| PubMed fetch | tools/pubmed.py | NCBI E-utilities API for biomedical literature |
| RSS fetch | tools/rss.py | Registry-driven RSS/Atom parser for journals, preprints, press, regulatory |
| Tavily search | tools/tavily.py | Wideband web search with auto-generated queries from watchlist + curated sources |
| Regex scorer | tools/scoring.py | Domain-specific pattern matching for fast pre-filtering |
| Dedup history | tools/dedup.py | Hash-based history to skip confirmed low-value repeats |
| LLM | tools/llm.py | Multi-model LLM factory (GPT-4o-mini, GPT-4o, Gemini, Claude) with usage tracking |
| Config loader | tools/config.py | Reads config.yaml, prompts.yaml, watchlist, curated sources |
| Vocabulary | tools/vocabulary.py | Domain vocabulary store; builds PubMed queries dynamically from vocabulary.yaml |
| Source registry | tools/sources.py | JSON-persisted source stats (yield, last hit, health) |
| HTML report | tools/html_report.py | Polished HTML intelligence briefing generator |
| Dashboard | tools/html_dashboard.py | Operational dashboard (source health, config, run metrics) |
| Meta-tools | tools/meta_tools.py | Tool registry for the ReAct meta-agent (vocab gaps, source health, coverage, company discovery) |
| MLflow logger | tools/mlflow_tracker.py | Experiment tracking (params, metrics, artifacts per run) |
fetch_pubmed → fetch_rss → fetch_tavily → save_registry
→ prefilter (regex + dedup)
→ [conditional: skip LLM if nothing in-scope]
→ score_items (LLM × N items)
→ summarize_themes (cluster + significance)
→ write_brief (executive briefing)
→ review (Reflection Pattern + dedup update)
→ meta_reflect (ReAct agent — vocabulary, sources, companies, coverage)
→ outputs (HTML, dashboard, markdown, JSON, MLflow)
Implemented as a LangGraph StateGraph with a conditional edge after
pre-filtering: if nothing passes regex, the LLM pipeline is skipped entirely
(no API cost on quiet weeks).
The meta_reflect node is a genuine ReAct agent: a multi-turn
Thought → Action → Observation loop where the LLM reasons about the
pipeline's output and decides which self-improvement tools to invoke.
It may call zero tools (quiet week) or several (vocabulary gaps, cold
sources, new companies). Max 5 iterations per run.
Items are scored 1–10 by the LLM using criteria defined in prompts.yaml:
| Score | Meaning | Examples |
|---|---|---|
| 9–10 | Priority alert | First-in-human implant, FDA IDE/PMA/De Novo, pivotal trial |
| 7–8 | High signal | ECoG/sEEG study, single-unit data, closed-loop BCI |
| 5–6 | Moderate | Materials/biocompatibility, animal BCI, neural decoding |
| 3–4 | Low | Tangentially related neuroscience |
| 1–2 | Out of scope | Scalp EEG wearables, oncology, marketing |
Categories: implantable_bci · ecog_seeg · stimulation · materials ·
regulatory · funding · animal_study · methods · out_of_scope
These are inherited from SOUL.md and enforced in prompts and code:
After each run, the review node evaluates:
The reviewer can adjust scores, flag missed signals, and call out vaporware. Quality score (1–10) is logged to MLflow for tracking over time.
All runtime parameters live in two YAML files (no code edits needed):
config.yaml — Sources, models, company watchlist, curated industry
sources, Tavily queries, MLflow settings. This is the single source of truth
for what the agent monitors and how.
prompts.yaml — All LLM prompts as templates with {variable}
placeholders. Edit here to iterate on analysis quality. Prompt text is logged
to MLflow for A/B tracking.
vocabulary.yaml — Domain vocabulary organized into primary terms
(domain-defining) and qualifier terms (relevance-filtering). The PubMed query
is constructed dynamically at runtime. Terms are extracted from representative
papers; provenance is tracked. A max_terms_per_category setting (default: 0 =
no limit) provides a configurable ceiling, though term counts naturally
self-stabilize as domain vocabulary is finite.
Tracked companies get automatic Tavily queries and RSS feeds (if Substack URL
provided). New companies can be added manually or promoted from
discoveries.yaml (auto-generated after each run).
Websites without RSS (e.g., Neurofounders, IEEE Spectrum) are searched via
Tavily site: queries.
# Full pipeline
python3 skills/neuro_hound/run.py --days 7
# Phase 1 only (regex scoring, no LLM cost)
python3 skills/neuro_hound/run.py --days 7 --phase1-only
# With specific models
python3 skills/neuro_hound/run.py --days 7 --model gpt-4o --reviewer gpt-4o
# From Telegram (via OpenClaw)
/neuro_hound --days 7
| File | Description |
|---|---|
YYYY-MM-DD.html | Polished HTML intelligence briefing |
dashboard.html | Operational dashboard (source health, config, metrics) |
YYYY-MM-DD.md | Markdown report with executive brief |
YYYY-MM-DD.alerts.json | Priority items (score 9–10) |
YYYY-MM-DD.full.json | Full results + usage metrics |
discoveries.yaml | Candidate companies for watchlist promotion |
meta_actions.yaml | ReAct meta-agent trace (thought/action/observation per step) |
| Variable | Required | Description |
|---|---|---|
OPENAI_API_KEY | Yes | For GPT models |
TAVILY_API_KEY | Optional | For Tavily wideband search |
GOOGLE_API_KEY | Optional | For Gemini models |
ANTHROPIC_API_KEY | Optional | For Claude models |
| Level | Description | Status |
|---|---|---|
| Procedural pipeline | Fixed workflow, LLM calls at certain steps | Base layer |
| Workflow with agency | LLM decides within nodes (conditional paths, tool selection) | Partial (conditional edge) |
| Agentic meta-layer | ReAct agent reasons about coverage, decides when to discover/prune/update | Current |
| Self-modifying | Agent reads SOUL.md/SKILL.md, reasons about goals, updates config | Future |
See docs/ADR-001-agent-specification.md for the full architecture rationale.