Install
$ agentstack add skill-taewooopark-scholar-lab-radar-scholar-lab-radar ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo 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.
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_memberids fromdata/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.
- Author: TaewoooPark
- Source: TaewoooPark/scholar-lab-radar
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.