| name | gather-citations |
| description | Query Wikipedia, Wikidata, Stack Exchange, public Discourse forums, academic APIs, and public-domain archives to synthesize facts, human struggles, and philosophical debates to build the narrative arc for a topic. Store only facts/events/dates/relationships, dialogic tension points, and reference metadata — never full articles (copyright-safe pipeline, spec §2.5). |
| metadata | {"agent":"research-factcheck","source":"Project Atlas Agent Skills Manifest §4","layer":"L5-content-verify"} |
gather-citations
Build a bulletproof, source-linked factual dossier and narrative friction map.
When to use
- A topic is approved for production and needs verified facts and narrative tension points before drafting.
Sources (spec §5.2/§5.3/§5.5)
Wikipedia API, Wikidata, DBpedia, Crossref, Semantic Scholar, OpenAlex, NewsAPI, GDELT, Internet Archive, Project Gutenberg, Stack Exchange (Philosophy/History/Literature), public Discourse forums; Exa (live) via the exa MCP server — bulk polling routes through the NestJS SearchService (SYS-SEARCH). Bright Data (live) via the brightdata MCP server — use search_engine (Google/Bing) to surface source URLs, then web_data_reddit_posts to read Reddit discussions for human-struggle/debate signals, and web_data_youtube_videos to check how the topic has already been framed by other creators. Fetch & clean with Jina Reader. Stack Exchange and Discourse are queried specifically to harvest the core human struggles, common questions, and debates surrounding the topic to build the story's narrative arc (not for trends).
Function signature (manifest contract)
def gather_citations(topic: str) -> dict:
"""Synthesize facts and associate each with a verified source link."""
Inputs / Outputs
- Input:
topic.
- Output:
{facts: [{claim, date?, source_url, source_type}], citations_count}.
Copyright-safe rule (spec §2.5)
Store only facts, events, dates, relationships and reference metadata. Never store or rewrite
full articles/books. Never use a single source as the sole source.
Implementation
Grounded two-step: (1) fetch primary-literature references with the [[academic-search]] skill —
temporal-bridge → start_workflow("academicSearchWorkflow", "trend-signals", [{"query": topic}]),
poll get_workflow_result — then (2) call the hermes-bridge MCP tool
run_judgment_agent(insight_type="gather-citations", query=<ask>, context={"topic": topic, "academic_sources": <refs from step 1>}).
Hits Hermes's POST /v1/agents/gather-citations, same self-correcting LLM loop / mock-fallback
pattern, but now the judgment is grounded on real retrieved references instead of training memory.
If step 1 returns nothing (registry outage / obscure subject), fall back to a clearly-flagged
memory draft for a human fact-checker.
Reachability (resolved): the academic registries live on the TS/NestJS side in
AcademicSearchService, and are now reachable from this skill via the academicSearchWorkflow
Temporal activity over temporal-bridge — the same start_workflow pattern fetch-signals uses
for SearchService. (The server-orchestrated quality loop already grounds gather-citations directly
through QualityLoopService.scrapeAcademicSources; this workflow gives the Hermes-side skill the
same reach.) SearchService's keyless wikipedia source is still only wired into fetch-signals;
route through that if you also want the Wikipedia validation reference.
Backend dependency
- Writing facts/citations to the graph (Railway) is still stubbed until the Postgres/AGE backbone is wired;
search_cache is implemented (DatabaseModule).
- API keys: Exa is live (
EXA_API_KEY, via the exa MCP server / SearchService, SYS-SEARCH) but not yet routed into this skill's judgment call -- a future improvement is feeding Exa search results into the context passed to run_judgment_agent.
Wikipedia is live on SearchService but not reachable from this skill yet (see Implementation above).
NewsAPI equivalent (Currents, live) has the same gap -- it's wired into fetch-signals, not this skill.
Scholarly/public-domain registries are now implemented on the NestJS side: OpenSourceSearchService
has live keyless clients for OpenAlex, Crossref, Semantic Scholar, Project Gutenberg (Gutendex),
Internet Archive, Stack Exchange, Wikidata, DBpedia, GDELT and Open Library. The quality-loop
path (QualityLoopService.scrapeAcademicSources / scrapeClaimEvidence) already grounds
gather-citations and verify-claims on OpenAlex/Crossref/Semantic Scholar/Gutenberg/Internet
Archive/Stack Exchange. This Hermes-side skill invocation, however, still routes through
run_judgment_agent and does not reach those clients directly — wiring them to the Python
agent needs the Temporal-activity bridge described under Implementation. Jina available.
Model
deepseek-direct/deepseek-chat for extraction/synthesis. Heavy input → apply Jina Reader + prompt compression (spec §11.3).