polars-dovmed — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited polars-dovmed (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Search PubMed Central Open Access and bioRxiv parquet corpora with polars-dovmed.
Use the bundled helper, skills/polars-dovmed/scripts/query_literature.py, for hosted API or local parquet-backed searches. The helper auto-loads ~/.config/polars-dovmed/.env.
Current hosted API defaults:
tasks/polars-dovmed-runs/<slug>/ by default, not under skills/polars-dovmed/./api/jobs targeting scan_literature_advanced(mode="discovery")./api/search_literature endpoint for smoke tests or normal skill work. It is opt-in only with --allow-flat-query and may hang behind the edge proxy.--corpus both. Run --corpus biorxiv and --corpus pmc as separate calls, then merge results.--sync --year-bands clean_split --year-band-workers 4.--skip-details-rerank. The FTS index searches title, abstract, and full text, but PMC details lookups still read parquet and can dominate wall time. Fetch details only for selected PMCID values after discovery.--crossref-metadata or the crossref-lookup skill. Do not use generic web search for DOI repair except as a final publisher-page check for unresolved/ambiguous records.Database not found, stop and report that the deployment is not exposing the indexed OpenPMC bands. Do not fall back to a monolithic unbanded OpenPMC scan.--poll-timeout and, when available, wrap searches in timeout. Do not rerun OpenPMC with longer waits after one bounded clean-band failure.Public access note:
omics-skills does not provide a hosted API key or the PMC/bioRxiv parquet corpora.dovmed download, dovmed build-parquet, and dovmed scan.polars-dovmed is not configured and use another literature fallback.POLARS_DOVMED_API_KEY is configured or provided.dovmed scan when hosted access is unavailable and local parquet paths exist.tasks/polars-dovmed-runs/<date-topic>/.prompt.txt, query.json, submitted payloads, raw responses, timing files, and any curated summary.disqualifying_terms for acronym collisions and wrong systems.host alone.--queries-file ... --mode discovery --corpus biorxiv.--queries-file ... --mode discovery --corpus pmc --sync --year-bands clean_split --year-band-workers 4 --skip-details-rerank, unless the prompt has a year constraint that maps to fewer bands.--extract-matches none --add-group-counts primary.--poll-timeout 75 for bioRxiv and --poll-timeout 120 for OpenPMC clean bands.--details-rerank-limit modest, usually 8-12, and use it automatically only for bioRxiv or non-year-band searches. For OpenPMC, fetch details by PMCID after inspecting top hits.query.json and rerun.--crossref-metadata or /crossref-lookup for missing DOI/year/journal. Use DOI landing pages or journal pages only when Crossref and corpus metadata disagree or remain ambiguous.time -p or timeout ....elapsed_ms when present.Minimal reachability check:
curl -sS --max-time 20 https://api.newlineages.com/Expected: service metadata from the root endpoint. This only proves the service is reachable, not that a corpus scan is healthy.
Structured smoke check:
RUN=tasks/polars-dovmed-runs/smoke-$(date +%Y%m%d)
mkdir -p "$RUN"
cp skills/polars-dovmed/fixtures/smoke_prompt.txt "$RUN/prompt.txt"
cp skills/polars-dovmed/fixtures/smoke_query.json "$RUN/query.json"
timeout 90s uv run --no-project python skills/polars-dovmed/scripts/query_literature.py \
--queries-file "$RUN/query.json" \
--corpus biorxiv \
--mode discovery \
--max-results 3 \
--skip-details-rerank \
--poll-timeout 75 \
--save-payload "$RUN/payload_smoke.json" \
--save-response "$RUN/results_smoke.json" \
> "$RUN/summary_smoke.json" 2> "$RUN/time_smoke.txt"If timeout is unavailable, still pass --poll-timeout and record that no outer wall-clock guard was available. Avoid /usr/bin/time; use shell time -p unless you have confirmed the path exists.
Known client pitfall: Cloudflare can reject Python urllib's default user agent with HTTP 403 and error code 1010. The helper sends a normal user agent. If raw urllib is unavoidable, send both X-API-Key and User-Agent.
Use compact concept groups:
{
"anchor_entity": [
["primary_name"],
["alias_1"],
["alias_2"]
],
"relation_or_property": [
["primary_name", "relation_term"],
["alias_1", "specific_relation_alias"]
],
"disqualifying_terms": [
["term_to_exclude"]
]
}Group logic (enforced consistently on both the FTS fast path and the parquet scan): terms inside one inner group are AND'd (all must co-occur); inner groups within a concept are OR'd; concepts are OR'd, with ranking favoring items that match more groups. A multi-word term is matched as an exact phrase. So list synonyms/aliases as separate single-term groups (each ["alias"] on its own line) — never pack them into one group, which would require them all to co-occur. Use a multi-term group only to require co-occurrence (e.g. ["entity", "relation"]).
For recent taxa or sparse terms, begin with anchor-only JSON:
{"anchor_entity": [["Mirusviricota"], ["mirusvirus"], ["mirusviruses"]]}Fast first pass for emerging taxa:
RUN=tasks/polars-dovmed-runs/mirusviricota-hosts-$(date +%Y%m%d)
mkdir -p "$RUN"
printf '%s\n' "papers describing hosts of Mirusviricota" > "$RUN/prompt.txt"
# Write and inspect "$RUN/query.json" before running the search.
timeout 90s uv run --no-project python skills/polars-dovmed/scripts/query_literature.py \
--queries-file "$RUN/query.json" \
--corpus biorxiv \
--mode discovery \
--extract-matches none \
--add-group-counts primary \
--max-results 25 \
--details-rerank-limit 12 \
--poll-timeout 75 \
--save-payload "$RUN/payload_biorxiv.json" \
--save-response "$RUN/results_biorxiv.json" \
> "$RUN/summary_biorxiv.json" 2> "$RUN/time_biorxiv.txt"OpenPMC pass with parallel clean year bands:
timeout 120s uv run --no-project python skills/polars-dovmed/scripts/query_literature.py \
--queries-file "$RUN/query.json" \
--corpus pmc \
--mode discovery \
--sync \
--year-bands clean_split \
--year-band-workers 4 \
--extract-matches none \
--add-group-counts primary \
--max-results 25 \
--skip-details-rerank \
--poll-timeout 120 \
--save-payload "$RUN/payload_pmc.json" \
--save-response "$RUN/results_pmc.json" \
> "$RUN/summary_pmc.json" 2> "$RUN/time_pmc.txt"For citation metadata enrichment after a shortlist, prefer bounded Crossref fallback over web search:
uv run --no-project python skills/polars-dovmed/scripts/query_literature.py \
--details PMC6362216 PMC10132079 \
--corpus pmc \
--crossref-metadata \
--crossref-limit 10 \
--save-payload "$RUN/payload_details.json" \
--save-response "$RUN/results_details.json"If the prompt gives a year constraint, map it before searching:
<=2009 -> pre_20102010-2020 -> 2010_20202021-2023 -> 2021_2023>=2024 -> 2024_plusFor a range crossing bands, pass an explicit comma list to --year-bands, for example --year-bands 2021_2023,2024_plus. Use a single --year-band only when the whole requested range is inside one band.
Fetch details directly when you already know identifiers:
uv run --no-project python skills/polars-dovmed/scripts/query_literature.py \
--details PMC6912108 PMC8490762 \
--corpus pmc \
--save-payload "$RUN/payload_details.json" \
--save-response "$RUN/results_details.json"For bioRxiv details, pass DOI values with --corpus biorxiv.
Use local mode when hosted access is unavailable or explicitly unwanted.
uv run --no-project python skills/polars-dovmed/scripts/query_literature.py \
--execution-mode local \
--corpus pmc \
--local-parquet-pattern "$DOVMED_PMC_PARQUET" \
--queries-file "$RUN/query.json" \
--save-payload "$RUN/payload_local.json" \
--save-response "$RUN/results_local.json"Local corpus aliases:
--corpus pmc: set DOVMED_PMC_PARQUET or pass --local-parquet-pattern.--corpus biorxiv: set DOVMED_BIORXIV_PARQUET or pass --local-parquet-pattern.--corpus both: only with one compatible explicit parquet pattern; otherwise run separate scans.Ranking priority:
| Task | Action | |
|---|---|---|
| Run directory | tasks/polars-dovmed-runs/<date-topic>/ | |
| Preferred query | Authored query.json, inspected before search | |
| Preferred hosted path | helper scan_literature_advanced(mode="discovery"); async except FTS-backed OpenPMC clean bands | |
| Emerging taxon first pass | --corpus biorxiv, anchor-only query, bounded timeout | |
| OpenPMC pass | separate --corpus pmc --sync --year-bands clean_split --year-band-workers 4 --skip-details-rerank call | |
| Year-constrained OpenPMC | map requested years to one or more clean bands before searching | |
| Avoid by default | flat /api/search_literature, --corpus both, unbanded broad OpenPMC | |
| Details endpoint | `--details ... --corpus pmc | biorxiv` |
| Missing DOI/year | --crossref-metadata or skills/crossref-lookup/scripts/lookup --title ... | |
| Local fallback | --execution-mode local --local-parquet-pattern ... | |
| Quick verification | uv run --no-project python skills/polars-dovmed/scripts/smoke_test.py --run-dir tasks/polars-dovmed-runs/smoke-test | |
| Timing | shell time -p, helper elapsed_ms, and timeout status |
query.json.prompt.txt, query.json, payload JSON, raw response JSON, timing files, and optional curated summary.skills/polars-dovmed/.--corpus both, and broad unbanded OpenPMC avoided unless explicitly justified.--sync and --skip-details-rerank; year-constrained searches use only matching bands.tasks/polars-dovmed-runs/mirusviricota-hosts-YYYYMMDD/query.json with:{"anchor_entity": [["Mirusviricota"], ["mirusvirus"], ["mirusviruses"]], "disqualifying_terms": [["MIRU-VNTR"], ["mycobacterium"]]}results_biorxiv.json and any companion details response.RUN=tasks/polars-dovmed-runs/klosneuvirinae-hosts
uv run --no-project python skills/polars-dovmed/scripts/query_literature.py \
--execution-mode local \
--corpus pmc \
--local-parquet-pattern "$DOVMED_PMC_PARQUET" \
--queries-file "$RUN/query.json" \
--save-payload "$RUN/payload_local.json" \
--save-response "$RUN/results_local.json"Issue: Flat /api/search_literature times out Solution: Do not use it for smoke tests. Use the root endpoint plus structured helper smoke.
Issue: --corpus both returns 502 Solution: Run separate --corpus biorxiv and --corpus pmc calls and merge results manually.
Issue: OpenPMC --year-bands clean_split returns Database not found Solution: Stop and report that the hosted deployment is not exposing the indexed OpenPMC bands. Do not retry as an unbanded full-corpus OpenPMC scan.
Issue: OpenPMC clean-band search times out Solution: Report the measured timeout and keep the bioRxiv result. Do not retry the same OpenPMC query with a longer unbanded scan; narrow by user-specified year band or refine the anchor query.
Issue: A query about "topic of X" retrieves generic topic papers Solution: Replace the first-pass query with exact entity aliases only. Use topic terms during manual triage or a focused second pass after confirming anchor hits.
Issue: DOI, year, or journal metadata is missing Solution: Fetch details by PMCID/DOI first. If still incomplete, use --crossref-metadata or the crossref-lookup skill. Avoid generic web search unless both corpus metadata and Crossref are unresolved or conflicting.
Issue: /usr/bin/time is missing Solution: Use shell time -p or record start/end timestamps; do not assume /usr/bin/time exists.
Issue: Artifacts were written under skills/polars-dovmed/runs/ Solution: Move future run artifacts to tasks/polars-dovmed-runs/ and do not commit generated run outputs.
Issue: Hosted API key is missing and local parquet files are missing Solution: State that polars-dovmed is not configured. Use another literature-search skill or ask the user to provide hosted access or local corpora.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.