Commit History
3 days ago
-
fix(drugs): one ChEMBL window for the mechanism lookups, retried round-robin
avoigt1121 +1: Claude Opus 5.5The 2026-10-29 -> 11-05 smoke week failed at 91.8 % on one probe: right after 00, 06, 12 and 18 UTC ChEMBL did not answer drugs_kras's three mechanism lookups within 30 s (26 of 57 runs). Each lookup waited its own 30 s, so a failing run took ~90 s and reported three identical errors; the Open Targets rows were already returned. The request is not heavy (/mechanism.json, 1.3 KB, < 1 s by hand): ChEMBL is slow then, from HF's network. - drugs.py: the mechanism lookups share one window (MECHANISM_WINDOW_SECONDS, capped by what is left of the endpoint budget). A source_unavailable lookup is retried round-robin with the other pending drugs; a quick failure pauses 5 s first; a drift is not retried. Whatever is unanswered when the window closes gets ONE chembl source_unavailable entry ("... not looked up for N of M drugs (k attempts in a W s window)") and looked_up: false. - _common.py: Collector.attempt returns the error instead of recording it; every call's deadline is now cappe…01b3ee5
5 days ago
-
security: extend the pillow 12.3.0 acceptances to 2026-12-18
avoigt1121 +1: Claude Opus 5.5The project lead decided 2026-11-03 ("Yes, extend", to "Extend the pillow acceptances to Fri 18 Dec?"): the 39 pillow 12.3.0 advisories accepted by id under fleet decision A (batches 1-8) now expire 2026-12-18, not 2026-11-20. Declined: forcing pillow 13 past gradio's pin, and freezing pushes (which would also block fixes like the 2026-11-01 joserfc bump). Only the expiry moves. security/accepted-vulns.txt changes the date on its 39 entries and nothing else (no id added or removed); tests/test_accepted_vulns.py raises its cap to 2026-12-18; security/ACCEPTED-FINDINGS.md gains one dated entry, earlier entries unchanged. The security addendum (docs/security/addendum-knowledge-specialist.md) states the expiry, and tests/test_host_table.py pins that statement: both now say 2026-12-18. Exposure re-check, 2026-11-03, on dev 9462c78 (44 commits since 2026-10-21): nil, unchanged. Inputs are identifiers only; no application code imports PIL, calls an image reader or reads a workbook (openpyxl…abc4da6
10 days ago
-
feat(smoke): the scheduled smoke Job, and the plan's decisions
avoigt1121 +1: Claude Opus 5.5scripts/smoke_job.py creates, lists, fetches and deletes the Phase 3 smoke Job as decided 2026-10-29 (D1-D4): an HF Scheduled Job on cpu-basic in the project lead's organisation namespace (her user namespace holds lit-agent's Monday job, whose recreate script aborts on a second scheduled Job), every 3 hours, ending itself after 7 days (SMOKE_END_EPOCH), with no secret: each run clones the dev Space at a pinned sha, runs smoke_live.py in-process and prints its counts-only record behind RECORD_MARKER (new --print-record), and fetch reads the records back from the Job logs into .smoke/hf-job.jsonl. tests/test_smoke_job.py pins the spec (no secret, cpu-basic, org namespace, one Job at a time, the end guard, the pinned sha) and the log parsing. The addendum gets one sentence on the scheduled runs (plan C8); the plan records D1-D4. Slice: phase3-review-hardening/s3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>814e741 -
feat(smoke): a smoke harness against the live sources, and the week's report
avoigt1121 +1: Claude Opus 5.5scripts/smoke_live.py asks six fixed probes, reaching all six sources an endpoint uses (HGNC, Open Targets, ChEMBL, UniProt, ClinicalTrials.gov, Reactome). It runs in-process with the response cache off, so each call reaches its source, or with --target space through a deployed Space's machine endpoints. It grades every failure into a named class (the three source-error reasons, payload_error, unexpected_status, contract, too_few_rows, entity_missing, space_unreachable, unstructured), appends a counts-only record (no row content) to .smoke/results.jsonl, and --report gives the week's verdict: >= 95% of probes pass and no unstructured failure. It makes no model call: build_tooluniverse refuses to start with a provider key set. Each probe is a recorded Phase 0 scenario, so tests/test_smoke_live.py replays all six against their cassettes with sockets blocked. It also pins the grading classes, the cache bypass, the record's lack of row content and the 95% line. make smoke / make smoke-rep…84f7513
11 days ago
-
docs(sources): confirm UniProt, ClinicalTrials.gov and DGIdb licences
avoigt1121 +1: Claude Opus 5.5All three pages are script-rendered; read in a browser on 2026-10-27. - UniProt: uniprot.org/help/license applies CC BY 4.0. Stamped string unchanged. - ClinicalTrials.gov: the Terms and Conditions page names no open licence; it asks redistributors to attribute, keep current, show the processing date and state changes, and notes copyright outside the U.S. Stamped string unchanged; licence_checked says "Public" means free of charge. - DGIdb: no data licence of its own (code is MIT); each interaction keeps its source's licence, several non-commercial. licence becomes "Per source: ...", licence_url moves to /browse/sources (/about is a 404). The no-endpoint guard now covers "Per source" as well as "Unconfirmed". No DGIdb endpoint is added or proposed. Host table regenerated with scripts/render_host_table.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>8f6c965 -
fix(ui): every run button denied signed-in users — give the run handler a positional profile
avoigt1121 +1: Claude Opus 5.5gradio injects gr.OAuthProfile only into a POSITIONAL parameter annotated with it (gradio.helpers.special_args stops at *args) and calls handlers positionally, so the keyword-only `profile` in `_ui_call`'s `handler(*args, profile=None)` was never filled. Both Spaces have run ACCESS_CONTROL=enforce since they were created (2026-10-21), so every signed-in user, the admin included, got "Please sign in" on all five tabs. The machine endpoints (the orchestrator's x-orchestrator-token path) were never affected. Same defect as pdac-spatial-agent, fixed there in 45f3cec. The handler now carries an explicit __signature__ (the endpoint's parameters from ENDPOINTS, then `profile: gr.OAuthProfile | None = None`) and an __annotations__ entry for profile, since special_args reads type hints via typing.get_type_hints. Arguments bind through that signature, so direct calls with profile= still work. tests/test_ui_oauth_injection.py drives every wired UI dependency in demo.fns through special_args, no…2a2dd35
17 days ago
-
security: accept 1 more pillow 12.3.0 advisory until 2026-11-20 (batch 5)
avoigt1121 +1: Claude Opus 5.5GHSA-78g4-xqwv-q3g8 (high, no CVE id yet), published 2026-10-22 17:01 UTC after batch 4 and fixed only in pillow 13.0.0 (gradio 6.30 still requires pillow<13): a heap-buffer-overflow write in the libopenjp2 2.5.4 bundled in pillow wheels, reached by opening and loading a crafted JPEG 2000 file. No application code here opens JPEG 2000 or decodes a caller-supplied image. Accepted by id by the project lead (2026-10-22), same expiry and format as batches 1-4. Security files only; 35 pillow ids accepted; acceptance tests pass. The security-review addendum says 35, and tests/test_host_table.py now counts every accepted id (CVE, GHSA, PYSEC), not only CVE ids, so a GHSA-only advisory is counted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>bd00037 -
docs: name no institution in the public repo (the client's Tech Transfer rule)
avoigt1121 +1: Claude Opus 5.5Both Spaces are public. The client's sponsoring lab ruled 2026-10-21 that its technology-transfer office looks before anything public carries the institution's or the centre's name, and the contract needs written consent for either. Ten mentions in docs, docstrings and comments now say "the client" or "this agent's endpoints"; the title, card, README and UI never named either. tests/test_no_institution_name.py fails if a tracked file names them again. The paste-ready addendum in the business folder is unchanged. Comments and docs only: no behaviour change. 246 passed; host table current. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>081f1c7
18 days ago
-
security: accept 14 more pillow 12.3.0 advisories until 2026-11-20 (batch 2)
avoigt1121 +1: Claude Opus 5.5Published 2026-10-21 after batch 1 (D5-A), all fixed only in pillow 13.0.0. Same exposure: identifiers only, no image input. The addendum now states 22, and tests/test_host_table.py reads the count from security/accepted-vulns.txt instead of pinning it, so the next change cannot leave the addendum stale. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>e436d30 -
docs(security): the knowledge specialist's security-review addendum (s4)
avoigt1121 +1: Claude Opus 5.5docs/security/addendum-knowledge-specialist.md, in the review's own language: the eighth component, the hosts it calls (a table generated from config/sources.yaml by scripts/render_host_table.py), identifiers-only egress, the honest no-egress-filter sentence, and the controls. tests/test_host_table.py fails if the table is stale or any number the addendum states (tools, rates, timeouts, caps, TTLs, the pinned version, the accepted findings) stops matching the code, or if a person is named. A paste-ready version for the OHSU form lives beside the review in the business folder; filing it is the project lead's. Slice: phase1-knowledge-specialist/s4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>a8943e8 -
security: D5-A — accept the 8 pillow 12.3.0 CVEs here until 2026-11-20
avoigt1121 +1: Claude Opus 5.5The project lead decided D5-A (2026-10-20): a justified acceptance in this repo only. This Space takes identifiers only and opens no caller-supplied image; the fix needs a fleet-wide gradio move (gradio 6.28.0 requires pillow<13). security/accepted-vulns.txt feeds pip-audit --ignore-vuln; the scan fails on an expired entry, and tests/test_accepted_vulns.py fails once the lock moves pillow off 12.3.0, so the acceptance cannot outlive its reason. Scan green. Slice: phase1-knowledge-specialist/s2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>17acd0c -
feat: the five knowledge endpoints, gradio_ui and frozen descriptor (s2)
avoigt1121 +1: Claude Opus 5.5- src/endpoints/: drugs_for_targets, trials_for_genes, annotate_genes, pathways_for_genes, targets_for_disease on the s1 core. Inputs validated before any call; every row and nested block (ChEMBL mechanisms, UniProt protein, HGNC mapping, disease resolution) stamped; deterministic "According to <source> (queried <date>)" narratives; unresolved inputs and structured source errors instead of guesses. - Loaded tool set narrowed 12 -> 8 once real responses were seen (HGNC gives Ensembl + UniProt ids; one batched UniProt search; Reactome's mapping is already lowest-level). The other 4 stay approved, unloaded. - 8 pinned output schemas, written from the recorded responses. - scripts/record_fixtures.py: the only live step. 11 cassettes recorded 2026-10-20 through ToolUniverse 1.5.6 (123 calls): the Phase 0 lookups Q1-Q9 plus the C1 SORD2P case and two edge cases. All Phase 0 expectations replay. - gradio_ui.py: machine gate first in every handler (x-orchestrator-token), ty…3ed6b66
19 days ago
-
feat: governed ToolUniverse core for the knowledge specialist (s1)
avoigt1121 +1: Claude Opus 5.5The repo from the pdac-spatial-agent template, plus the core every endpoint will sit on (ADR-0001, accepted 2026-10-20): - config/tools_allowlist.yaml: the memo's 28 tools by exact 1.5.6 name; the 12 the five endpoints use are the only ones loaded. - config/sources.yaml: 8 sources with hosts, licences checked 2026-10-20 (Reactome is CC0, not CC BY 4.0; DGIdb unconfirmed, so no DGIdb endpoint), TTLs, rate limits, timeouts, coverage notes. - src/tu_client.py, the only importer of tooluniverse: loads with keep_default_tools=False and load_workspace=False, refuses startup on any model-provider key, a version other than 1.5.6, an extra or forbidden tool, or ToolUniverse's own cache being on. load_workspace=False matters: with any workspace present, 1.5.6 seeds a profile that loads all 2,691 tools and reads workspace and ~/.tooluniverse .env files (found by these tests). - provenance (10 fields per row), pinned output schemas (drift = no rows), SQLite cache that keeps retr…377417d