first-fluke/oma-scholar
> Scholarly research companion using Knows sidecar spec (.knows.yaml). Generates, validates, reviews, queries, and compares structured research-paper sidecars, and fetches them from knows.academy. Use for academic literature search, survey synthesis, paper authoring assistance, and peer review with token-efficient claim/evidence/relation access.
npx skills add https://github.com/first-fluke/oh-my-agent --skill oma-scholar
Search, fetch, generate, validate, analyze, review, and compare scholarly paper sidecars using the Knows .knows.yaml spec for token-efficient research workflows.
.knows.yaml, knows.academy, OpenAlex, claims, evidence, relations, or paper sidecars..knows.yaml sidecars from your own paper drafts, LaTeX, or research notesknows.academy (2026 papers only; current counts via /api/proxy/jobs/stats)oma-searchoma-translatoroma-pdf.knows.yaml sidecar, review sidecar, lint report, search/fetch result, natural-language analysis, or structural comparisonpaper@1 profileoma scholar CLI subcommandsresources/sidecar-spec.md, API endpoints, OpenAlex setup, upstream cache, checklist, and execution protocol| Action | SSL primitive | Evidence |
|--------|---------------|----------|
| Select mode | SELECT | Generate/Validate/Review/Analyze/Compare/Remote |
| Read paper or sidecar | READ | Source files or YAML |
| Request remote data | REQUEST | Knows/OpenAlex APIs |
| Infer claims/evidence/relations | INFER | Sidecar generation/analysis |
| Write sidecar | WRITE | .knows.yaml outputs |
| Validate sidecar | VALIDATE | oma scholar lint |
| Report result | NOTIFY | Summary or lint report |
oma scholar search|resolve|get|lintoma scholar search "<query>"
oma scholar resolve "<title-or-doi>"
oma scholar get "<record-id-or-doi>"
oma scholar lint "<paper.knows.yaml>"
| Scope | Resource target |
|-------|-----------------|
| LOCAL_FS | Paper drafts, sidecar YAML, review sidecars |
| NETWORK | knows.academy and OpenAlex APIs |
| PROCESS | oma scholar CLI and lint |
| USER_DATA | User-provided paper content and research notes |
paper@1 profile (review sidecars use review@1): verified against production sidecars from knows.academy; see resources/sidecar-spec.mdanthropic SDK or external LLM CLI; this skill runs inside an agentdoi: TODO or guesstitle, authors, venue, year live at the top level (no metadata wrapper)statement_type, evidence_type, predicate, artifact_type (not type/claim)provenance.actor is one object, NOT a provenance.actors array{claim_strength: ..., extraction_fidelity: ...}, both from high|medium|lowcoverage.statements (4-value enum) + coverage.evidence (3-value enum)tool|person|org (never ai/llm/model); artifact role subject|supporting|cited; predicates in present tense10. Numbers unquoted: value: 22, never value: '22'
11. Relation density: average ≥1.5 relations per statement; every claim needs supported_by evidence (checklist rule — lint enforces only the average-ratio warning and a per-id warning for statements with zero relations)
12. ID format: descriptive kebab-case with prefix: stmt:privacy-budget-tradeoff, ev:cifar10-accuracy-table, art:paper
13. Validate before sharing: run oma scholar lint after Generate and Review; cross-record refs (record_id#local_id) in review sidecars are recognized and not flagged as dangling
14. Remote API has no auth: https://knows.academy/api/proxy/* is public; do not invent auth headers
15. Partial fetch param is section (singular): fixed enum statements|evidence|relations|artifacts|citation
16. Fallback API keys are optional: OPENALEX_API_KEY (metadata enrichment) and S2_API_KEY (Semantic Scholar dedicated rate limit) both improve throughput but the cascade degrades gracefully without them
17. Sidecar content stays English: schema fields, IDs, statement text follow upstream convention; user-facing responses follow oma-config.yaml language
18. Spec drift awareness: our local rules track v0.9.0 production behavior, which differs from the upstream knows.md natural-language description; refresh resources/upstream-spec-cache.md periodically
| Mode | Trigger | Output |
|------|---------|--------|
| Generate | "create sidecar from this paper / abstract / draft", "generate .knows.yaml" | {paper}.knows.yaml (host LLM emits, then oma scholar lint validates) |
| Validate | "lint this sidecar", "validate .knows.yaml" | Pass/fail report with file:line issues |
| Review | "peer review this paper as sidecar" | {paper}.review.knows.yaml |
| Analyze | "summarize this sidecar", "what claims does it make?" | Natural-language answer |
| Compare | "compare paper A and paper B structurally" | Diff table (claims/methods/evidence) |
| Remote | "find papers on X", "fetch sidecar :id", "get claims only for :id" | Search results / sidecar payload |
knows.academy currently indexes only 2026 papers (mostly arXiv). For
older or non-2026 papers (Transformer 2017, BERT 2018, classics, journals),
the skill automatically falls back to OpenAlex for metadata and abstract,
then to Semantic Scholar (AI TL;DR, citation + influential-citation
counts) when OpenAlex also has nothing. See resources/fallback-providers.md.
Use the oma scholar CLI subcommands:
# Hybrid search: knows first, OpenAlex fallback
oma scholar search "vision language action"
# Cross-source resolve: figures out which source has the right paper
oma scholar resolve "Attention Is All You Need"
# Get by id (knows record_id, OpenAlex W-id, DOI, arXiv:<id>, CorpusId:<n>)
oma scholar get "10.48550/arXiv.1706.03762"
When OpenAlex returns the answer (knows.academy lacks the paper), use the
returned abstract as input to Mode 1 Generate to produce a local sidecar.
Follow resources/execution-protocol.md step by step for the selected mode.
oma scholar search "diffusion super resolution"
oma scholar search --year-min 2024 "vision language action"
oma scholar resolve "Attention Is All You Need"
# returns top hit from each source + recommendation
# knows.academy full sidecar
oma scholar get "knows:generated/reconvla/1.0.0"
# Partial fetch (claims only, ~700 tokens, 93% reduction vs PDF)
oma scholar get --section statements "knows:generated/reconvla/1.0.0"
# By DOI or OpenAlex W-id (works regardless of knows.academy availability)
oma scholar get "10.48550/arXiv.1706.03762"
# Semantic Scholar: AI TL;DR + citation/influential-citation counts
oma scholar get "arXiv:1706.03762"
When knows.academy is unreachable, get knows:... automatically falls back
to OpenAlex by extracting the slug from the record_id. The result is marked
with fallback: "openalex" and contains metadata + abstract, useful for
running Mode 1 Generate locally.
# Strict mode for own Generate output (default)
oma scholar lint paper.knows.yaml
# Lenient mode for third-party / fetched sidecars
oma scholar lint --lenient remote.knows.yaml
# Treat warnings as failures (CI mode)
oma scholar lint --fail-on-warning paper.knows.yaml
About **47% of knows.academy-served sidecars contain at least one dangling
cross-reference** (typo in subject_ref/object_ref, measured across 15
production samples). Use --lenient when consuming third-party records so
these surface as warnings rather than blocking errors.
curl -s "https://knows.academy/api/proxy/search?q=..."
curl -s "https://knows.academy/api/proxy/sidecars/<encoded-id>"
curl -s "https://knows.academy/api/proxy/partial?record_id=<id>§ion=statements"
curl -s "https://knows.academy/api/proxy/jobs/stats" # platform health
Project-specific settings: config/scholar-config.yaml
| Issue | Solution |
|-------|----------|
| [ERROR] *.value: numeric value '22' is quoted | Remove quotes: value: '22' -> value: 22 |
| [ERROR] provenance.actor.type: 'ai' is not allowed | Change to tool, person, or org |
| [ERROR] *.type: use \statement_type\ instead of \type\ | Rename type -> statement_type (or evidence_type/predicate/artifact_type) |
| [ERROR] provenance.actors: v0.9 spec uses singular \actor\ | Replace actors: [{...}] array with actor: {...} object |
| [ERROR] *.object_ref: reference 'X' does not match any defined id | Fix the subject_ref/object_ref to point to a real id, OR use --lenient if consuming third-party data (cross-record record_id#local_id refs are recognized and never flagged) |
| [WARN] relations: avg relations/statement is N.NN (target ≥ 1.5) | Add more supported_by/depends_on relations |
| [WARN] statements: only N statements; most papers warrant ≥ 8 | Expected when generating from abstract only; full-paper Generate should hit 15+ |
| [WARN] *.predicate: past-tense '...' is suspicious | Switch to present tense (evaluated_on -> evaluates_on) |
| Remote API returns empty results | Try broader query; check /api/proxy/jobs/stats; CLI auto-falls-back to OpenAlex |
| knows.academy search failed: fetch failed (stderr) | Platform timeout; fallback to OpenAlex is automatic; retry later for sidecars |
| OpenAlex 403/429 | Set OPENALEX_API_KEY (see resources/setup-openalex.md) |
| semanticscholar error: HTTP 429 (stderr) | Anonymous pool throttled; CLI retries once then skips the source. Set S2_API_KEY (free form at semanticscholar.org/product/api) for a dedicated limit |
| YAML won't parse | Check indentation; numbers/booleans must be unquoted; strings with : need quotes |
resources/execution-protocol.mdresources/sidecar-spec.mdresources/api-endpoints.mdresources/setup-openalex.mdresources/upstream-spec-cache.mdresources/checklist.mdoma scholar search|resolve|get|lint (implementation under cli/commands/scholar/)../_shared/core/context-loading.md../_shared/core/quality-principles.md../../rules/i18n-guide.mdTake first-fluke/oma-scholar from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.