AgentStack
SKILL verified MIT Self-run

Scholar Lab Radar

skill-taewooopark-scholar-lab-radar-scholar-lab-radar · by TaewoooPark

>-

No reviews yet
0 installs
10 views
0.0% view→install

Install

$ agentstack add skill-taewooopark-scholar-lab-radar-scholar-lab-radar

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Scholar Lab Radar? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

scholar-lab-radar

Turns one lab (a PI, or a school/department) into a temporal knowledge graph of its output and a grounded evolution report. Sibling to scholar-megasearch: free structured scholarly APIs (OpenAlex-first) + LLM only on the semantic layer. The data layer is deterministic Python (reproducible); the LLM names research themes/methods and writes the narrative — always grounded in the graph's counts, never invented.

Default install locations:

  • Claude Code: ~/.claude/skills/scholar-lab-radar, venv not required (scripts are stdlib).
  • Codex: ~/.agents/skills/scholar-lab-radar.

Use the skill directory from the loaded skill path for bundled scripts (/scripts). The full ontology schema is in references/ontology.md; the data sources and exact OpenAlex queries are in references/sources.md.

Modes

  • professor (default, cleanest) — corpus = the confirmed PI's authored works.
  • lab — PI + inferred members' works (co-author expansion).
  • department — an institution + topic scoping (broad; noisier).
  • compare — two labs side by side (e.g. an applicant comparing advisors).
  • applicant — a lab + the user's interests → alignment + who to contact.

All modes reuse the same pipeline (resolve → collect → graph → tag → infer → analyze → synthesize).

Mode recipes

  • lab — run professor mode first, then take the likely_member ids from data/roster.csv

and re-collect with the PI and members in one corpus, then rebuild: collect.py --author --author --author … -o ./labs/-lab.

  • compare — profile two labs into separate dirs, then

compare.py ./labs/ ./labs/ -o ./labs/-vs-.md (productivity, shared vs distinctive topics, each lab's focus shift, overlapping collaborators).

  • applicant — profile the lab, then match the user's stated interests against the lab's

Themes/Topics (metrics.json) and recommend which member to contact — the recent first-author or advised_by/theme owner of the matching thread.

  • department — collect by institution + topic instead of author

(/works?filter=authorships.institutions.id:,topics.id:,from/to_publication_date); broader and noisier, so scope tightly and caveat heavily.

Workflow

1. Resolve the lab — the make-or-break step

Author disambiguation decides whether the report is about the right person, so confirm the OpenAlex id with the user before collecting. Prefer ORCID.

python3 /scripts/resolve.py institution "" --mailto 
python3 /scripts/resolve.py author "" --institution  --mailto 
python3 /scripts/resolve.py author "" --orcid 0000-... --mailto 

Present the candidates (name, ORCID, institution, works/cites, recent titles) and ask the user to pick the id — merge several ids if OpenAlex split the person. Also confirm the year range (default: last 5 years) and mode.

2. Collect the corpus

python3 /scripts/collect.py --author  [--author ] \
  --from  --to  -o ./labs/ --mailto 

Fetches every work in range via cursor paging, reconstructs abstracts, dedupes by DOI → OpenAlex id → normalized title, and writes labs//works.jsonl + meta.json. Use --institution to scope to works produced while at that institution; --max N to cap a very prolific PI.

3. Build the knowledge graph (ontology)

python3 /scripts/build_graph.py ./labs/

Emits graph/entities.jsonl + graph/relations.jsonl — typed, time-stamped: Paper / Researcher / Topic / Venue / Institution / Funder nodes, and authored_by · has_topic · published_in · funded_by · cites(internal) · collaborates_with(PI ego) edges. Member roster (role, active span, first-author count) is computed here. No LLM.

4. Compute metrics + structured report

python3 /scripts/analyze.py ./labs/

Writes metrics.json, data/{topics_by_year.csv, roster.csv}, index.md (dashboard), and report.md (structured draft): papers/citations per year, topic×year matrix, focus-shift detection (early vs late primary-topic share, with counts), roster, rising members, collaboration growth, top venues, notable papers. Every number is grounded — the narrative must cite these counts.

5. Semantic layer — tag Themes / Methods / Datasets (LLM, fan-out)

Fan out over works.jsonl (megasearch-style) and, from each paper's title+abstract, extract lab-specific Themes (finer threads on top of OpenAlex Topics), Methods, and Datasets, plus a one-line summary. Canonicalize across the whole corpus before writing — reuse one slug per concept so "CNN" and "convolutional neural network" collapse to the same Method, and cluster near-duplicate themes. Write one record per paper to labs//tags.jsonl:

{"id":"W123","themes":[{"slug":"contrastive-ssl","label":"Contrastive self-supervised learning"}],
 "methods":[{"slug":"transformer","label":"Transformer","aliases":["self-attention"]}],
 "datasets":[{"slug":"imagenet","label":"ImageNet"}],"summary":"one-line takeaway"}

Then merge it into the ontology and emit the per-paper cards + JSON-LD, and re-run analyze so themes fold into the metrics/report:

python3 /scripts/tag_ingest.py   ./labs/   # +Theme/Method/Dataset, papers/*.md
python3 /scripts/infer.py        ./labs/   # structural advised_by + method diffusion
python3 /scripts/export_jsonld.py ./labs/   # graph/ontology.jsonld
python3 /scripts/analyze.py       ./labs/   # theme×year + theme focus-shift

infer.py adds the structural inferred edges (advised_by from recurring member-first / PI-last co-authorship + shared institution; diffused_to from Method×Theme co-occurrence). Theme lineage (evolved_from) is LLM-judged — append it to graph/relations.jsonl with confidence: llm (see references/ontology.md).

6. Synthesize the report

Rewrite report.md into the final narrative grounded in metrics.json + the graph: exec summary, year-by-year flow, 기조 변화 (cite the emerging/declining counts), Theme lineage + which members carried each thread, method/dataset evolution, member dynamics (rising first-authors, departures), notable papers, collaboration evolution, and an honest Caveats section (disambiguation confidence, coverage gaps, small-N). Never assert a trend without the count behind it.

7. (optional) Visualize the graph

python3 /scripts/viz.py ./labs/   # -> labs//graph.html

Self-contained interactive graph.html (vis-network, opens in any browser): nodes colored by type, sized by degree, with node-type filters and an edge-label toggle. Click any node for a detail panel (attributes, DOI/links, summary, connections). A year slider + ▶ play grows the graph year by year — drag it (or press play) and nodes/edges appear as their relations come into being, so you watch the lab assemble over time. External one-off co-authors are hidden by default (--include-external to show); --max-nodes N caps the most-connected nodes to avoid a hairball.

Outputs

Everything lands under ./labs// in the working directory:

labs//
├── works.jsonl              normalized corpus (one work per line)
├── meta.json               run params + counts
├── graph/{entities,relations}.jsonl   the temporal knowledge graph (ontology)
├── data/{topics_by_year,roster}.csv   spreadsheet-ready matrices
├── papers/-.md  per-paper tagged metadata (semantic layer)
├── index.md                structured dashboard
├── report.md               synthesized lab report
└── graph.html              interactive node-link viewer (open in a browser)

Honesty

Report what was actually collected and the disambiguation choice. likely_member / collaborator / advised_by are inferred — label them so. Do not invent trends: small per-year samples are noisy and the counts are shown so a reader can judge. See memory feedback_honest_writing.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.