ontology-term-resolution
Verdict safe, but 8 findings (7 medium, 1 low), mainly data exfiltration, unauthorized tool use. Most recent scan 2026-10-21.
Second scanner: NVIDIA SkillSpector
Independent static run, no language model, over the same files as the Cisco scan above. How the two scanners compare across the whole corpus: Two scanners, one corpus.
What this skill does
Resolves free-text scientific labels to ontology term IDs and validates existing CURIEs against the EBI Ontology Lookup Service (OLS4). Also looks up prefixes in Bioregistry, resolves compact identifiers via Identifiers.org, maps lab shorthand with ZOOMA, and builds Ontobee term pages. Use whenever an ontology identifier must be produced or checked - annotating tissue, cell type, disease, phenotype, assay, chemical, organism, sex, or developmental stage fields; preparing metadata for GEO, ENA, BioSamples, CELLxGENE, HCA, or ISA-Tab submission; auditing a metadata table of term IDs; checking…
- Package
- 12 files, 108 KB
- SKILL.md
- 1846 words, 12+ sections
- Code
- Python (7)
- Allowed tools
ReadWriteEditBash- License
- MIT
- Compatibility
- Requires Python 3.11+. Scripts use only the standard library - no third-party packages. Needs network access to https://www.ebi.ac.uk/ols4, https://bioregistry.io, https://resolver.api.identifiers.org, and https://www.ebi.ac.uk/spot/zooma (all public, no API key).
SKILL.md covers: Ontology Term Resolution · When to use · The rule · Which service · Resolve text to terms · one string, constrained to the ontology that should define it · a column of tissue names; anything not an exact hit is reported, not guessed · accept fuzzy fallbacks, then review the partial hits by hand · Validate existing IDs · id + label columns; catches IDs that exist but are labelled as something else · a tissue column must hold UBERON anatomical entities and nothing else · Check a prefix or compact identifier
Findings
MEDIUM Code makes network requests Unauthorized Tool Usestatic
Skill code makes network requests. While not controlled by allowed-tools, network access should be documented and justified in the skill description.
SKILL.md
MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic
Pattern detected: urllib.request.Request(
scripts/id_client.py:68
request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT, "Accept": "application/json"})MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic
Pattern detected: urllib.request.urlopen(
scripts/id_client.py:72
with urllib.request.urlopen(request, timeout=TIMEOUT) as response:MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic
Pattern detected: urllib.request.Request(
scripts/ols_client.py:79
request = urllib.request.Request(MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic
Pattern detected: urllib.request.urlopen(
scripts/ols_client.py:86
with urllib.request.urlopen(request, timeout=TIMEOUT) as response:MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic
Pattern detected: urllib.request.Request(
scripts/zooma_client.py:78
request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT, "Accept": "application/json"})MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic
Pattern detected: urllib.request.urlopen(
scripts/zooma_client.py:83
with urllib.request.urlopen(request, timeout=TIMEOUT) as response:LOW Code uses search/grep patterns but Grep tool not in allowed-tools Unauthorized Tool Usestatic
Skill restricts tools to ['Read', 'Write', 'Edit', 'Bash'] but code uses regex search patterns
SKILL.md
What is in the package
| File | Kind | Size |
|---|---|---|
SKILL.md | doc | 14 KB |
references/companion-apis.md | doc | 9.4 KB |
references/curation-rules.md | doc | 5.9 KB |
references/ols4-api.md | doc | 7.5 KB |
references/ontology-registry.md | doc | 6.1 KB |
scripts/id_client.py | script | 12 KB |
scripts/lookup_prefix.py | script | 6.3 KB |
scripts/map_terms.py | script | 7.3 KB |
scripts/ols_client.py | script | 15 KB |
scripts/resolve_terms.py | script | 8.3 KB |
scripts/validate_terms.py | script | 11 KB |
scripts/zooma_client.py | script | 5.2 KB |
External hosts referenced
www.ebi.ac.uk github.com resolver.api.identifiers.org bioregistry.io purl.obolibrary.org ontobee.org www.orpha.net identifiers.org arxiv.org api.cellosaurus.org docs.identifiers.org doi.org export.arxiv.org
Hostnames that appear in the skill's files. Referencing a host is not a finding; compare against the findings above and the skill's stated purpose.
Package contents recorded 2026-10-22 at commit 593377bb0487. The scan above ran against the version current at scan time; the two can differ if the skill has since been updated.
What we checked
- Static analyzer. Pattern rules over SKILL.md and bundled files: known-bad commands, exfiltration URLs, secrets, obfuscation.
- Bytecode analyzer.
- Pipeline analyzer.
- Correlation analyzer.
- Behavioral analyzer. Checks what the skill asks the agent to do against what its description claims it does.
- Trigger analyzer. Looks for instructions that fire on conditions the user did not ask for.
What we did not check
- Runtime behaviour. The skill was not executed; findings come from reading its files.
- Anything fetched at install or run time, including remote scripts, package dependencies, and URLs the skill tells the agent to open.
- Content the analyzers cannot read: images, binaries, and some non-English text.
- Known scanner bypass classes. See the methodology and limitations page.
Sources
- Repository: https://github.com/K-Dense-AI/scientific-agent-skills
- Raw scan result: skills-ontology-term-resolution-scan.json
- Badge for your README:
 - Request a re-scan