Files
Shanghua Gao f790bd5aa6 Fix Round 15: Ensembl species-default, Reactome/KEGG/NCBI non-human silent failures, FAERS rate-limit masking, PubMed/translate-id docs
Role-play testing across new personas (forensic genetics, pain-management
pharmacogenomics, livestock breeding genomics) surfaced several places where
a tool returns a plausible-looking wrong answer instead of a clear error,
which is worse than crashing outright because it looks like real data.

- ensembl_tool.py: EnsemblRESTTool auto-defaulted species=homo_sapiens into
  query params even when routing a stable-ID lookup (/lookup/id/{gene_id}),
  which doesn't need or want a species filter since stable IDs are already
  species-specific. This silently broke every non-human Ensembl gene lookup
  chained from a symbol resolver (confirmed with bovine DGAT1) with a
  misleading "ID not found" error. Now only forwards species when the
  caller explicitly supplied it.

- reactome_tool.py: Reactome's /data/mapping/ endpoints return HTTP 404
  NOT_FOUND as their genuine "nothing found for this identifier" signal,
  which the tool treated as a hard error instead of an empty result --
  breaking pathway/reaction lookups for non-human protein orthologs that
  simply have no directly curated Reactome entries.

- kegg_ext_tool.py: KEGG_get_gene_pathways silently returned an empty
  pathway list, indistinguishable from a real negative, when gene_id was
  passed as "org:SYMBOL" (e.g. "bta:DGAT1") rather than KEGG's numeric ID
  form. Now resolves the symbol the same way the no-colon path already did.

- ncbi_datasets_tool.py: NCBIDatasets_get_gene_by_symbol returned a silent
  empty success for taxon tokens NCBI itself flags as ambiguous (e.g.
  "cattle" resolves above species level), with no way to tell that apart
  from a genuine zero-match. Now surfaces NCBI's own warning message.

- faers_analytics_tool.py: FAERS_calculate_disproportionality's internal
  count fetcher swallowed all exceptions -- including HTTP 429 rate limits
  -- and returned 0, so a rate-limited window produced "Insufficient data:
  a=0, b=0, c=0, d=0" for well-known drug/event pairs instead of surfacing
  the real upstream failure.

- fda_drug_adverse_event_tools.json: documented that
  FAERS_count_additive_adverse_reactions combines multiple medicinalproducts
  with OR (union), not AND (co-occurrence) -- intentional aggregation
  behavior, but easily misread as combination-risk counting since a sibling
  tool uses AND semantics for the same-shaped input.

- pubmed_tools.json: documented that PubMed's esearch ANDs every keyword by
  default, so a realistic multi-concept query silently returns 0 results
  even when relevant literature exists (confirmed: an 11-word query returned
  0 on PubMed but multiple relevant hits on EuropePMC for the same string).

- translate-id.md: the skill's own worked example used the wrong tool name
  casing and parameter name, so following its instructions literally failed
  immediately.

Checked all 9 other open round PRs (#478-486) for overlap before fixing;
skipped one duplicate (DrugBank interaction-list bloat, already covered by
round 13's PR #485). Every fix reproduced live against the real upstream
API, and re-verified after the change with no regressions (targeted
pytest: 103 passed; shipped test_examples for every touched tool still
pass).
2026-08-10 00:13:14 -04:00
..
2026-08-03 20:57:29 -04:00