Commit History
3 days ago
-
merge: fix/chembl-slow-window β drugs_for_targets' ChEMBL mechanism lookups share one 150 s window (Annie: A, 2026-11-05) and are retried round-robin instead of 30 s each; unanswered lookups get ONE chembl source_unavailable entry, OT rows always stand; every call's deadline capped by the endpoint budget (240 s holds exactly), 30 s per call unchanged; cause: ChEMBL slow just after 00/06/12/18 UTC from HF, query 1.3 KB < 1 s; 8 cassette tests, suite 327, scan green; not pushed Running
avoigt11214522ccd -
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
-
merge: fix/graphql-core-3.3.1 β graphql-core 3.3.0 -> 3.3.1 (CVE-2026-119286, unbounded memory on aborted validate(), fixed 3.3.1); floor graphql-core>=3.3.1,<3.4 in security floors; lock diff graphql-core alone; via rcsb-api + tooluniverse, not reachable (GraphQL client only; TU validate_query has no caller, no RCSB tool allow-listed); suite 319 passed, scan green incl. the 39 pillow acceptances; not pushed (knowledge smoke week runs to 2026-11-05 21:47 UTC)
avoigt1121d8d8c57 -
fix(deps): graphql-core 3.3.0 -> 3.3.1 (CVE-2026-119286)β
avoigt1121 +1: Claude Opus 5.5pip-audit flags graphql-core 3.3.0 (CVE-2026-119286, GHSA-mpqx-q82w-9x46), fixed in 3.3.1: validate() reused one module-level ValidationAbortedError, so every validation aborted at max_errors kept its document and frames alive, an unbounded-memory DoS for a GraphQL server. Found 2026-11-03 during the pillow-acceptance extension; it made the pre-push scan red. Pulled in by rcsb-api and tooluniverse. Not reachable here: the Space is a GraphQL client only. tooluniverse's graphql_tool.validate_query, its one call to graphql.validate, has no caller; the allow-listed Open Targets tools POST fixed queries with variables and leave validation to the server; and rcsbapi validates only queries it builds itself, under RCSB tools that are not on the allow-list. Adds graphql-core>=3.3.1,<3.4 to the security-floors block (the brotli pattern) and recompiles with the header command plus --no-upgrade (--custom-compile-command keeps the header as documented). The lock diff is graphql-core alone. Suite β¦e6c023e -
merge: fix/pillow-accept-1218 β the 39 pillow 12.3.0 acceptances extended 2026-11-20 -> 2026-12-18 (the project lead, 2026-11-03), date only, no id added; addendum + host-table test follow the date; exposure nil, unchanged; gradio 6.31.0 still requires pillow<13 (gradio main allows <14 since 2026-11-02, unreleased); pip-audit: no pillow finding, but RED on unrelated graphql-core 3.3.0 CVE-2026-119286 (fix 3.3.1), already on dev, left for its own decision; not pushed
avoigt1121b677359 -
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
-
merge: docs/phase3-s3-job-created β plan s3 DONE (Job 6ae3c084β¦ in the org namespace; triggered run 6/6, record fetched), s4 OPEN from 2026-11-05; docs only, not pushed
avoigt11219462c78 -
docs(plans): Phase 3 s3 done β the smoke Job exists and its first run came back 6/6β
avoigt1121 +1: Claude Opus 5.5Slice: phase3-review-hardening/s3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>7f95498 -
merge: fix/pillow-batch-8 β pillow 12.3.0 PYSEC-2026-4332 (JPEG draft/thumbnail; not reachable: no PIL import, no image or file input) accepted until 2026-11-20 under the project lead's 2026-10-28 decision; 39 accepted, addendum 38 -> 39; scan clean; 319 passed
avoigt112108ba8fa -
security: accept pillow 12.3.0 batch 8 (PYSEC-2026-4332)β
avoigt1121 +1: Claude Opus 5.5One more pillow 12.3.0 advisory, found by the pre-push pip-audit on 2026-10-29 when it blocked the dev push of 39d4cd3 (Phase 3 smoke harness): - PYSEC-2026-4332 (CVE-2026-112403, GHSA-8g5g-8vmr-9782): a heap write in the JPEG decoder's draft()/thumbnail() path; fixed only in 13.0.0, which gradio does not allow (pillow<13). Not reachable here: no application code imports PIL, calls draft() or thumbnail(), or takes an image or file input. Accepted by id until 2026-11-20 as batch 8 under the project lead's 2026-10-28 decision (each Space repo at its next push after its own reachability check); 39 accepted, the addendum's count 38 -> 39. Security scan clean. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>943ab70 -
merge: feat/phase3-review-hardening-s3 β Plan 4 Phase 3 s3: scripts/smoke_job.py (HF Scheduled Job, cpu-basic, org namespace anne-voigt-co so lit-agent's one-job count holds; every 3 h, self-ending after 7 days; no secret; records printed to the Job logs via smoke_live --print-record and read back by fetch) + tests/test_smoke_job.py; addendum sentence on scheduled runs (C8); plan D1-D4 DECIDED 2026-10-29 (the project lead). 319 passed; not pushed
avoigt112139d4cd3 -
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 -
merge: feat/phase3-review-hardening-s1 β Plan 4 Phase 3 s1: scripts/smoke_live.py (six probes over all six sources, in-process with the cache off or --target space; every failure classed, counts-only records, --report verdict >= 95% and no unstructured failure; no model call) + tests/test_smoke_live.py (probes replayed on their cassettes) + make smoke/smoke-report + docs/plans/PLAN-phase3-review-hardening.md (D1-D4 open). One hand run 2026-10-29: in-process 6/6, Space path 6/6; $0 model credit; not pushed
avoigt112125f80cb -
docs(plans): Phase 3 review and hardening β plan, D1-D4 openβ
avoigt1121 +1: Claude Opus 5.5Smoke week, cost and latency report. D1 where scheduled runs execute, D2 cadence, D3 cost cap and D4 where results go are the project lead's; s1 (harness) done, s2 (report) drafted outside this repo, s3/s4 blocked on the decisions. Slice: phase3-review-hardening/s1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>cbcabf5 -
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
-
merge: confirm UniProt, ClinicalTrials.gov and DGIdb licences in sources.yaml
avoigt11218150d74 -
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 -
merge: fix/pillow-batch-7 β pillow 12.3.0 PYSEC-2026-4327 accepted until 2026-11-20 (the project lead, 2026-10-27; not reachable: no PIL import), 38 accepted, addendum count 37 -> 38; scan clean; 267 passed
avoigt112157f149c -
security: accept pillow 12.3.0 batch 7 (PYSEC-2026-4327)β
avoigt1121 +1: Claude Opus 5.5One more pillow 12.3.0 advisory, found by the pre-push pip-audit on 2026-10-27 when it blocked the dev push of the UI OAuth fix (f8902cf): - PYSEC-2026-4327 (CVE-2026-112394): the P;2L/P;4L raw decoder reads up to three heap bytes past the buffer; fixed only in 13.0.0, which gradio does not allow (pillow<13). Not reachable here: no application code imports PIL or decodes an image a caller supplies. Accepted by id until 2026-11-20 as batch 7 (the project lead, 2026-10-27, in this session; already accepted that day in the other six Space repos); 38 accepted. Security scan clean; 267 passed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>2d3c377 -
merge: fix/ui-oauth-profile β UI run handlers get gr.OAuthProfile again (explicit __signature__ from ENDPOINTS + positional profile; special_args stopped at *args, so every signed-in UI run was denied since the Spaces went live 2026-10-21); tests/test_ui_oauth_injection.py drives demo.fns through special_args, 10/21 fail on the old wrapper; 267 passed
avoigt1121f8902cf -
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
13 days ago
-
merge: fix/cve-2026-10-26 β brotli 1.2.0 -> 1.2.1 (PYSEC-2026-4322 / GHSA-9v8h-qqgm-4m35; new security-floors block, one-package floor, lock diff brotli alone); pillow 12.3.0 batch 6 (CVE-2026-114501, CVE-2026-112398; not reachable: no PILLOW_ALIGNMENT, no Arrow export, no olefile) accepted until 2026-11-20 (the project lead, 2026-10-26), 37 accepted, addendum count updated; 246 passed; scan clean
avoigt1121ec7ef9c -
security: accept pillow 12.3.0 batch 6 (CVE-2026-114501, CVE-2026-112398)β
avoigt1121 +1: Claude Opus 5.5Two pillow 12.3.0 advisories published by 2026-10-26, fixed only in 13.0.0, which gradio does not allow (pillow<13): - CVE-2026-114501: Arrow export returns uninitialised heap memory when PILLOW_ALIGNMENT > 1. No PILLOW_ALIGNMENT here (code, README, HF Space variables) and no image is exported to Arrow. - CVE-2026-112398: FlashPix decoder heap overflow via Image.open on an OLE2 file; needs the optional olefile, which is not in the lock. Accepted by id until 2026-11-20 as batch 6 (the project lead, 2026-10-26, after a per-repo reachability check; ACCEPTED-FINDINGS.md has this repo's exposure statement); 37 accepted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>1ed7f10 -
fix(deps): brotli 1.2.0 -> 1.2.1 (PYSEC-2026-4322 / CVE-2026-111497)β
avoigt1121 +1: Claude Opus 5.5The pre-push pip-audit on 2026-10-26 flags brotli 1.2.0 (PYSEC-2026-4322, GHSA-9v8h-qqgm-4m35): an out-of-bounds write in Google's C decoder, fixed in 1.2.1. via gradio. Adds a security-floors block with brotli>=1.2.1,<1.3, the floor DecoupleRpy_Agent (5160e17), pdac-genomics-agent (6cf48c9), the orchestrator and pdac-spatial-agent already carry. Recompile with the header command (uv keeps existing pins): the lock diff is brotli alone. Suite green (hermetic). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>b7aac07 -
merge: docs/notes-drift-1026 β Phase 1 s5 marked on orchestrator prod 46f8006; docs only
avoigt1121332c397 -
docs(plan): s5 is on orchestrator prod (46f8006, 2026-10-23)β
avoigt1121 +1: Claude Opus 5.5Status cell brought in line with git on 2026-10-26. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>1eefa35
17 days ago
-
merge: docs/addendum-file-now β record the 2026-10-22 decision: file the security-review addendum now; the project lead files it (docs only, not pushed)
avoigt11215458b0c -
docs: the security-review addendum is to be filed now (decided 2026-10-22, the project lead)β
avoigt1121 +1: Claude Opus 5.5Recorded at the source: the plan's s4 row, its D2 note and s4 bullet, and ADR-0001's consequence line. The project lead files it; nothing is sent from a session. Slice: phase1-knowledge-specialist-s4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>aa10ca2 -
merge: fix/pillow-cve-2026-10-22-batch5 β accept 1 more pillow 12.3.0 advisory (GHSA-78g4-xqwv-q3g8, JPEG 2000 via bundled libopenjp2; not reachable here) until 2026-11-20, by id (the project lead, 2026-10-22); the addendum says 35 and test_host_table counts every accepted id type; security files only; pillow clean, 35 accepted
avoigt1121c34c267 -
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 -
merge: fix/pillow-cve-2026-10-22-batch4 β accept 10 more pillow 12.3.0 advisories (CVE-2026-96636..-96644, CVE-2026-96778; none reachable here) until 2026-11-20, by id (the project lead, 2026-10-22); the security-review addendum's count 24 -> 34; security files only; scan clean, 34 accepted
avoigt1121f58958b -
security: accept 10 more pillow 12.3.0 advisories until 2026-11-20 (batch 4)β
avoigt1121 +1: Claude Opus 5.5CVE-2026-96636 to -96644 and CVE-2026-96778, published 2026-10-22 after batch 3 and fixed only in pillow 13.0.0 (gradio 6.30 still requires pillow<13); they blocked the subtype dev push. None is reachable here: five need a crafted image from a caller decoded in a way no code does (multi-frame seek, SPIDER, BMP RLE, PNG EXIF parse), four need a Pillow call no application code makes (PDF append, JPEG save with ICC profile plus comment, bitmap-font text, TarIO), one is Windows-only. Accepted by id by the project lead (2026-10-22), same expiry and format as batches 1-3. Security files only; 34 pillow ids accepted; acceptance tests pass. The security-review addendum's pillow count goes 24 -> 34 (tests/test_host_table.py pins it to accepted-vulns.txt). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>8016795 -
merge: docs/phase1-knowledge-specialist-s5-status β plan: s5 on orchestrator dev 62e1e23, C1 next; the institution-name scrub recorded
avoigt11215eea567 -
docs(plans): s5 on orchestrator dev 62e1e23 (C10-C12 met; C1 is the project lead's); the name scrubβ
avoigt1121 +1: Claude Opus 5.5Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>a145232 -
merge: docs/no-institution-name-in-public-repo β the public Space repo names no institution or centre (project lead, 2026-10-22, after the client's Tech Transfer rule); comments/docs only; guard test; 246 passed
avoigt1121d267318 -
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
-
merge: docs/phase1-knowledge-specialist-s3-s5-s6-status β plan table: s3 ON PROD f1bf43d (public, gate verified), s6 done, s5 merged on orchestrator dev bc9bacc but its dev push is blocked by KNO-006
avoigt112106e2ac6 -
docs(plans): s3 on prod f1bf43d, s6 done, s5 merged on orchestrator dev (dev push blocked by KNO-006)β
avoigt1121 +1: Claude Opus 5.5Slice: phase1-knowledge-specialist-s3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>92fb816 -
merge: fix/phase1-knowledge-specialist-s3-surface-check β the live surface check lists gradio's own /_ endpoints (hf_oauth's /_check_login_status) rather than failing on them; dev Space ca9fcc8 passed gate, surface and five lookups
avoigt1121f1bf43d -
fix(scripts): check_live_surface lists gradio's /_ endpoints instead of comparing themβ
avoigt1121 +1: Claude Opus 5.5hf_oauth makes gradio add /_check_login_status to view_api(); it is gradio's, not part of the frozen descriptor, so the first live run on the dev Space failed on it alone. Slice: phase1-knowledge-specialist-s3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>b598cb3 -
merge: fix/pillow-cve-2026-10-21-batch3 β accept CVE-2026-112393/-112396 (pillow 12.3.0 TIFF encoding) until 2026-11-20 (project lead, 2026-10-21); addendum says 24; 245 passed
avoigt1121ca9fcc8 -
security: accept 2 more pillow 12.3.0 advisories until 2026-11-20 (batch 3)β
avoigt1121 +1: Claude Opus 5.5CVE-2026-112393 and CVE-2026-112396, both in TIFF encoding to an in-memory buffer, reached PyPI's feed after batch 2 and blocked s3's first dev-Space push. This Space encodes no image. The project lead accepted them the same day; the addendum now states 24 (its test reads the count from accepted-vulns.txt). Slice: phase1-knowledge-specialist-s3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>cc8a03e -
merge: feat/phase1-knowledge-specialist-s3 β both Spaces' initial commits merged (ours, never force-pushed over) so dev and main fast-forward onto hf-dev and origin; scripts/check_live_surface.py checks C9 against the live Space (gate fails closed, view_api == descriptor, one lookup per endpoint); 245 passed
avoigt11215f838ea -
feat(scripts): check_live_surface.py β C9 against the live Spaceβ
avoigt1121 +1: Claude Opus 5.5Gate fails closed (no identity header, an unresolvable token), view_api() equals the descriptor, the caller's own identity is served, and --lookups runs one real lookup per endpoint. No payload is printed; --anonymous checks a public Space with no token at all. Slice: phase1-knowledge-specialist-s3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>6e55d2d -
merge: the prod Space's initial commit (8a4edea), keeping this repo's tree β never force-push over itβ
avoigt1121 +1: Claude Opus 5.5Slice: phase1-knowledge-specialist-s3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>57ade3d -
merge: the dev Space's initial commit (a0b30e9), keeping this repo's tree β never force-push over itβ
avoigt1121 +1: Claude Opus 5.5Slice: phase1-knowledge-specialist-s3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>ebbb80d -
initial commit
Verified signature8a4edea -
initial commit
Verified signaturea0b30e9 -
merge: fix/pillow-cve-2026-10-21-batch2 β accept 14 more pillow 12.3.0 advisories until 2026-11-20 (project lead, 2026-10-21); addendum now says 22 and its test reads the count from accepted-vulns.txt; 245 passed; scan clean
avoigt11210c36a30 -
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