From 82d44cae17e5837d53059a69b2dd6e4a18670da9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 18 Aug 2026 18:57:38 +0900 Subject: [PATCH 1/4] fix(strix): bump strix-agent 1.0.4 -> 1.5.3, override its cryptography<49 pin Fixes #952. strix-agent==1.0.4 crashes after printing a complete vulnerability report (exit 2, or 124 on timeout) before the report artifact is durably written, tripping strix_quick_gate.sh's fail-closed check on a scan that actually succeeded. Upstream fixed this in 1.1.0 ("atomic CSV/MD writes to prevent corruption on crash") and 1.4.0 ("quit after scan instead of hosting local viewer") -- confirmed reproduced on 4 independent contextual-orchestrator PRs (#136, #137, #141, #144) in the issue. The blocker was strix-agent 1.4.0+ declaring cryptography<49,>=48.0.1, conflicting with this repo's cryptography==50.0.0 pin (CVE-2026-39892 fix, commit 7616fd80). Verified this is safe to override, not just force past a declared range and hope: strix-agent's own source never imports `cryptography` directly (grepped the installed 1.5.3 package -- zero imports); the transitive consumers are pyjwt and google-auth via hazmat.primitives.asymmetric/serialization for JWT signing, APIs that have been stable across the 48->50 range. Confirmed locally: strix-agent==1.5.3 imports cleanly next to cryptography==50.0.0, and a pyjwt RS256 sign/verify roundtrip against that cryptography version succeeds. requirements-strix-ci-overrides.txt documents the override and why; requirements-strix-ci-hashes.txt regenerated with the documented `uv pip compile --generate-hashes --python-version 3.13 --python-platform x86_64-manylinux_2_28 --override requirements-strix-ci-overrides.txt` command, which is also now recorded in CLAUDE.md. Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 6 +- requirements-strix-ci-hashes.txt | 172 ++++++++++++++++++++-------- requirements-strix-ci-overrides.txt | 15 +++ requirements-strix-ci.txt | 2 +- 4 files changed, 145 insertions(+), 50 deletions(-) create mode 100644 requirements-strix-ci-overrides.txt diff --git a/CLAUDE.md b/CLAUDE.md index 7127d3c1c..9dc6eba26 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -60,7 +60,9 @@ Details: `README.md` and `PR_GOVERNANCE_AUDIT.md`. configuration (GitHub Models provider, CodeGraph/DeepWiki/Context7/web-search MCP). All reviewer agents have `"edit": "deny"`: they are reviewers, never implementers. Keep it that way. - `requirements-{bandit,pip-audit,strix,opencode-review}-ci.txt` + `*-hashes.txt` — pinned CI - dependency sets (see below). + dependency sets (see below). `requirements-strix-ci-overrides.txt` documents one deliberate + `uv pip compile --override` (strix-agent's declared `cryptography<49` vs. this repo's + `cryptography==50.0.0` security pin; see #952) — re-verify it whenever strix-agent bumps again. - `fuzz/` + `.clusterfuzzlite/` — Atheris fuzz targets for the review-output normalizer and the ClusterFuzzLite discovery marker. - `docs/` — master context, Project protocol, `org-required-workflow-rollout.md`, @@ -96,7 +98,7 @@ e.g.: ```bash uv pip compile --generate-hashes --python-version 3.12 --python-platform x86_64-manylinux_2_28 requirements-bandit-ci.txt -o requirements-bandit-ci-hashes.txt uv pip compile --generate-hashes --python-version 3.12 --python-platform x86_64-manylinux_2_28 requirements-pip-audit-ci.txt -o requirements-pip-audit-ci-hashes.txt -uv pip compile --generate-hashes --python-version 3.13 --python-platform x86_64-manylinux_2_28 --output-file requirements-strix-ci-hashes.txt requirements-strix-ci.txt +uv pip compile --generate-hashes --python-version 3.13 --python-platform x86_64-manylinux_2_28 --override requirements-strix-ci-overrides.txt --output-file requirements-strix-ci-hashes.txt requirements-strix-ci.txt ./scripts/ci/compile_opencode_review_lock.sh ``` diff --git a/requirements-strix-ci-hashes.txt b/requirements-strix-ci-hashes.txt index c305e9c84..01f00ab9e 100644 --- a/requirements-strix-ci-hashes.txt +++ b/requirements-strix-ci-hashes.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile --generate-hashes --python-version 3.13 --python-platform x86_64-manylinux_2_28 --output-file requirements-strix-ci-hashes.txt requirements-strix-ci.txt +# uv pip compile --generate-hashes --python-version 3.13 --python-platform x86_64-manylinux_2_28 --override requirements-strix-ci-overrides.txt --output-file requirements-strix-ci-hashes.txt requirements-strix-ci.txt aiohappyeyeballs==2.7.1 \ --hash=sha256:065665c041c42a5938ed220bdcd7230f22527fbec085e1853d2402c8a3615d9d \ --hash=sha256:9243213661e29250eb41368e5daa826fc017156c3b8a11440826b2e3ed376472 @@ -393,7 +393,9 @@ charset-normalizer==3.4.7 \ --hash=sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6 \ --hash=sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79 \ --hash=sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464 - # via requests + # via + # reportlab + # requests click==8.4.1 \ --hash=sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2 \ --hash=sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96 @@ -450,10 +452,12 @@ cryptography==50.0.0 \ --hash=sha256:f89831ef99dd7dd169ab06d63a831adb9e20a87aac6d380266bbda5823349169 \ --hash=sha256:fd9192b7b70c573d7f214eb1ae35e00d359f6f5e4b27c7e21e30de1fc6204645 # via + # --override requirements-strix-ci-overrides.txt # -r requirements-strix-ci.txt # google-auth # pyjwt # pyopenssl + # strix-agent cvss==3.6 \ --hash=sha256:e342c6ad9c7eb69d2aebbbc2768a03cabd57eb947c806e145de5b936219833ea \ --hash=sha256:f21d18224efcd3c01b44ff1b37dec2e3208d29a6d0ce6c87a599c73c21ee1a99 @@ -1061,10 +1065,6 @@ jsonschema-specifications==2025.9.1 \ --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \ --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d # via jsonschema -linkify-it-py==2.1.0 \ - --hash=sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e \ - --hash=sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b - # via markdown-it-py litellm==1.94.1 \ --hash=sha256:001be1cde7950f2ae484e450ab2f8e93ab8791e5e8d4da560d21f2fb456b0b47 \ --hash=sha256:07c1771315d7d26e242ef90b9336bcbc49a52158ff72ee640b4f8160cc963147 \ @@ -1082,14 +1082,13 @@ litellm==1.94.1 \ --hash=sha256:e9b6d92e305d96bdadb8a5ccd343b1ac188de142fbd6c91f72c75416b8c25c48 \ --hash=sha256:e9effe4c1e9206740b4bb4c98142ea1f71bae57e49df007cd25ef24b0ce4563f \ --hash=sha256:ffa9a6cd9b6205d60b02ffc0b7f077a03693d835b06d2a34bfeaabb4f073c08a - # via openai-agents + # via + # openai-agents + # strix-agent markdown-it-py==4.2.0 \ --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \ --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a - # via - # mdit-py-plugins - # rich - # textual + # via rich markupsafe==3.0.3 \ --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \ --hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \ @@ -1185,10 +1184,6 @@ mcp==1.28.1 \ --hash=sha256:2726bca5e7193f61c5dde8b12500a6de2d9acf6d1a1c0be9e8c2e706437991df \ --hash=sha256:d51e36a5f5644faea4f85ea649bfffa6bc6c26770d42798ad6a3de3d2ba69683 # via openai-agents -mdit-py-plugins==0.6.1 \ - --hash=sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d \ - --hash=sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0 - # via textual mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba @@ -1343,15 +1338,16 @@ multidict==6.7.1 \ # via # aiohttp # yarl -openai==2.43.0 \ - --hash=sha256:65a670b54fadf2268c9e1330133373c963eb779ee969e5cbad419ec2c21dce97 \ - --hash=sha256:e74d238200a26868977002190fb6631613480a93dfe0c9c982e77021ed60a017 +openai==2.54.0 \ + --hash=sha256:89089789197ccdb87f173a03145ed1598d00795220c93e96cf712b1cbf5e5f2b \ + --hash=sha256:e3e6f8bc1ba30ddf381ace1a14340eed381cb984a1a59bd0f34b5be3b5d49cfa # via # litellm # openai-agents -openai-agents==0.14.6 \ - --hash=sha256:e9d16b835f73be4c5e3798694f90d7a62efcade931e59416bc7462c850e15705 \ - --hash=sha256:fdd3fb459892c8af5d0b522908b544e96f6217c7254ba55e966424493b43c1ed + # strix-agent +openai-agents==0.19.4 \ + --hash=sha256:12e0372fae9698fe6f78e05aaeb4ccdb229602f7ef99b8195a7d68dc82869f51 \ + --hash=sha256:fe21778ee1e8216c9cdb775fa86d11b08be68c0184e14023993088d3f812c0be # via strix-agent packaging==26.2 \ --hash=sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e \ @@ -1360,10 +1356,95 @@ packaging==26.2 \ # google-cloud-aiplatform # google-cloud-bigquery # huggingface-hub -platformdirs==4.10.0 \ - --hash=sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7 \ - --hash=sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a - # via textual +pillow==12.3.0 \ + --hash=sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756 \ + --hash=sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a \ + --hash=sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59 \ + --hash=sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45 \ + --hash=sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3 \ + --hash=sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df \ + --hash=sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139 \ + --hash=sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b \ + --hash=sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39 \ + --hash=sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e \ + --hash=sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8 \ + --hash=sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1 \ + --hash=sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8 \ + --hash=sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89 \ + --hash=sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5 \ + --hash=sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130 \ + --hash=sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd \ + --hash=sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d \ + --hash=sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b \ + --hash=sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed \ + --hash=sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace \ + --hash=sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb \ + --hash=sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931 \ + --hash=sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510 \ + --hash=sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6 \ + --hash=sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1 \ + --hash=sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce \ + --hash=sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385 \ + --hash=sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e \ + --hash=sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c \ + --hash=sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7 \ + --hash=sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace \ + --hash=sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c \ + --hash=sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f \ + --hash=sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64 \ + --hash=sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f \ + --hash=sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a \ + --hash=sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827 \ + --hash=sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17 \ + --hash=sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4 \ + --hash=sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a \ + --hash=sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701 \ + --hash=sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e \ + --hash=sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91 \ + --hash=sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66 \ + --hash=sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468 \ + --hash=sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217 \ + --hash=sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658 \ + --hash=sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418 \ + --hash=sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a \ + --hash=sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c \ + --hash=sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330 \ + --hash=sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402 \ + --hash=sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09 \ + --hash=sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930 \ + --hash=sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f \ + --hash=sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec \ + --hash=sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a \ + --hash=sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94 \ + --hash=sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468 \ + --hash=sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b \ + --hash=sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965 \ + --hash=sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8 \ + --hash=sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd \ + --hash=sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7 \ + --hash=sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c \ + --hash=sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777 \ + --hash=sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35 \ + --hash=sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9 \ + --hash=sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f \ + --hash=sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f \ + --hash=sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0 \ + --hash=sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c \ + --hash=sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71 \ + --hash=sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3 \ + --hash=sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838 \ + --hash=sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf \ + --hash=sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321 \ + --hash=sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26 \ + --hash=sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec \ + --hash=sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9 \ + --hash=sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65 \ + --hash=sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5 \ + --hash=sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e \ + --hash=sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d \ + --hash=sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198 \ + --hash=sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7 + # via reportlab propcache==0.5.2 \ --hash=sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427 \ --hash=sha256:04dc2390d9edbbaef7461f33322555976ffddf0b650a038649d026358714e6c5 \ @@ -1674,9 +1755,7 @@ pydantic-settings==2.14.2 \ pygments==2.20.0 \ --hash=sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f \ --hash=sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176 - # via - # rich - # textual + # via rich pyjwt==2.13.0 \ --hash=sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423 \ --hash=sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728 @@ -1685,6 +1764,10 @@ pyopenssl==26.4.0 \ --hash=sha256:28dfcce0162b9211413e26dfbfdf1d24317fbeba18fc93c12400a1856b2a0bc7 \ --hash=sha256:f0eb0cb2d581d3ad2b9c489468485e7f2ab6727d08401bcf9d824c3caddf3c1c # via google-auth +pypdf==6.16.1 \ + --hash=sha256:63fec31c4092ae50b6729beedcb469055b60d20c834bde1c402df241f371f644 \ + --hash=sha256:c4d1b43ddae921387321cf63936cd16a7743b91d2da92f165c149a195c972ba9 + # via strix-agent python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 @@ -1775,7 +1858,9 @@ pyyaml==6.0.3 \ --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 - # via huggingface-hub + # via + # huggingface-hub + # strix-agent referencing==0.37.0 \ --hash=sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231 \ --hash=sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8 @@ -1898,6 +1983,10 @@ regex==2026.7.19 \ --hash=sha256:fe31f28c94402043161876a258a9c6f757cb485905c7614ce8d6cd40e6b7bdc1 \ --hash=sha256:ffd8893ccc1c2fce6e0d6ca402d716fe1b29db70c7132609a05955e31b2aa8f2 # via tiktoken +reportlab==5.0.0 \ + --hash=sha256:9d5a3affa84919e1111ede580031266a570e93b1ce388219621347965ff1d93c \ + --hash=sha256:e4494a0c6623ae213bb856fba523171b2b54a7bf629fda02d5e525a7b899a784 + # via strix-agent requests==2.34.2 \ --hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \ --hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed @@ -1916,7 +2005,6 @@ rich==15.0.0 \ --hash=sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36 # via # strix-agent - # textual # typer rpds-py==2026.5.1 \ --hash=sha256:01d17b29c0c23d82b1f4751147ec49cf451f1fc2554eb9ef5f957e55d2656ead \ @@ -2076,18 +2164,18 @@ starlette==1.3.1 \ # via # mcp # sse-starlette -strix-agent==1.0.4 \ - --hash=sha256:6c9d1bd2e3bfca64b1c4c7c24f70c287ea50b1d616d7a391a1e9819b01b9cc60 \ - --hash=sha256:a52b67ec91c114b42409a710065676370bb39fd4894dc79dafa58f7f8efa1a23 +strix-agent==1.5.3 \ + --hash=sha256:1a6207b493162049e9d651306798533fd4ece4dc2d2956f722ad1966ddc66647 \ + --hash=sha256:675c6f357f1cbddd1786299f42c9fc03743f7b597ba6416e695848f1eb4be280 \ + --hash=sha256:a5babe4e6d42cb24a10d4508bcd3c477bd369ff7194c95a7c58de6d6e4c3be18 \ + --hash=sha256:ba0b6b13f13f41e45f3eb4dba515641d1bc71363ca6e758d0cd05c20ff56b6ea \ + --hash=sha256:da35ae6e9a6ae0bf5cc662012608cf0aa671479129ba94052a3f893bff74c43f \ + --hash=sha256:e89cc335b379f42b1a1b53ebbb414d6ffceccea202a2bcdfc2e9df83a55a5a7d # via -r requirements-strix-ci.txt tenacity==9.1.4 \ --hash=sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55 \ --hash=sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a # via google-genai -textual==8.2.7 \ - --hash=sha256:4caaa13a90bc4cf9c6c862c067ccd34fe84e9c161710a2a907a8026313b6bd73 \ - --hash=sha256:658f568ff81e30ed43890c3e07520390e5cf1b4763822006e060656b0a88f105 - # via strix-agent tiktoken==0.13.0 \ --hash=sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4 \ --hash=sha256:115c4f26ffa11caac8b54eea35c2ad38c612c20a48d35dd15d70a02ac6f51f58 \ @@ -2176,10 +2264,6 @@ typer==0.25.1 \ --hash=sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89 \ --hash=sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc # via huggingface-hub -types-requests==2.33.0.20260518 \ - --hash=sha256:626d697d1adaaff76e2044dc8c5c051d8f21abc157bdfe204a75558076fe0bf0 \ - --hash=sha256:df7bd3bfe0ca8402dfb841e7d9be714bb5578203283d66d7dc4ef69343449a5e - # via openai-agents typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 @@ -2193,7 +2277,6 @@ typing-extensions==4.15.0 \ # openai-agents # pydantic # pydantic-core - # textual # typing-inspection typing-inspection==0.4.2 \ --hash=sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 \ @@ -2202,17 +2285,12 @@ typing-inspection==0.4.2 \ # mcp # pydantic # pydantic-settings -uc-micro-py==2.0.0 \ - --hash=sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c \ - --hash=sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811 - # via linkify-it-py urllib3==2.7.0 \ --hash=sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c \ --hash=sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 # via # docker # requests - # types-requests uvicorn==0.49.0 \ --hash=sha256:ba3d14c3ee7e41c6c654c46c9eb489d33213cdd30aa1696eab1374337c13f68f \ --hash=sha256:ebf4271aa580d9de97f93192d4595176df6e91f9aae919ca73e4fc07df1e66a3 diff --git a/requirements-strix-ci-overrides.txt b/requirements-strix-ci-overrides.txt new file mode 100644 index 000000000..a38f75f1f --- /dev/null +++ b/requirements-strix-ci-overrides.txt @@ -0,0 +1,15 @@ +# uv pip compile --override for requirements-strix-ci.txt (see #952). +# +# strix-agent (every release from 1.4.0 through the current 1.5.3) declares +# cryptography<49,>=48.0.1, which conflicts with this repo's cryptography==50.0.0 +# pin (commit 7616fd80, CVE-2026-39892 fix). strix-agent's own code never imports +# `cryptography` directly (verified: no import in the installed package source); +# the real consumers pulling it in transitively are pyjwt and google-auth, both +# using only long-stable hazmat.primitives.asymmetric / serialization APIs for JWT +# signing. Verified locally: strix-agent==1.5.3 imports cleanly alongside +# cryptography==50.0.0, and a pyjwt RS256 sign/verify roundtrip against that +# cryptography version succeeds. strix-agent's <49 upper bound reads as an +# unreviewed "latest tested at release time" pin, not a real API incompatibility. +# +# Re-verify this override whenever strix-agent is bumped again. +cryptography==50.0.0 diff --git a/requirements-strix-ci.txt b/requirements-strix-ci.txt index 98e5c33e2..23d1c6568 100644 --- a/requirements-strix-ci.txt +++ b/requirements-strix-ci.txt @@ -1,4 +1,4 @@ -strix-agent==1.0.4 +strix-agent==1.5.3 aiohttp==3.14.3 google-cloud-aiplatform==1.133.0 protobuf<7.0.0 From 08526237e2adcf8ddacf903b9544b735fedbeff3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 19 Aug 2026 09:50:46 +0900 Subject: [PATCH 2/4] fix(security): let pip-audit skip resolution for overridden requirements pip-audit calls pip's own dependency resolver even for fully hash-pinned requirements files, so requirements-strix-ci.txt and requirements-strix-ci-hashes.txt both fail pip-audit with the same declared-metadata conflict this branch's requirements-strix-ci-overrides.txt already documents and works around for `uv pip compile` (strix-agent declares cryptography<49; this repo pins cryptography==50.0.0 for CVE-2026-39892). --require-hashes does not suppress this resolver-level check. Detect a matching requirements--ci-overrides.txt next to any discovered requirements*.txt/```-hashes.txt pair and pass --no-deps for that file: it skips dependency resolution and audits exactly the pinned versions listed, which is what an override file already means we trust. Generic (keyed off the override-file naming convention, not hardcoded to strix), so it applies automatically if another tool's lock ever needs the same override treatment. Full test suite still green (1195 passed, 16 subtests). Co-Authored-By: Claude Sonnet 5 --- .github/workflows/python-security.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-security.yml b/.github/workflows/python-security.yml index 9d2c2e965..1b95b470d 100644 --- a/.github/workflows/python-security.yml +++ b/.github/workflows/python-security.yml @@ -237,7 +237,21 @@ jobs: # Audit every discovered requirements file. while IFS= read -r req; do echo "::group::pip-audit -r ${req}" - pip-audit --strict --desc=on -r "${req}" || status=1 + # A matching requirements--ci-overrides.txt (a `uv pip compile --override` + # input, e.g. requirements-strix-ci-overrides.txt) means this file pins a version + # whose declared metadata range intentionally conflicts with another pin here + # (verified safe at override time, not a resolution mistake) -- pip's own dependency + # resolver, which pip-audit calls even for fully hash-pinned files, fails on that + # same declared-range conflict regardless of --require-hashes. --no-deps skips + # resolution and audits exactly the pinned versions listed, which is what we already + # trust for these files. + base="${req%.txt}" + base="${base%-hashes}" + if [ -f "${base}-overrides.txt" ]; then + pip-audit --strict --desc=on --no-deps -r "${req}" || status=1 + else + pip-audit --strict --desc=on -r "${req}" || status=1 + fi echo "::endgroup::" done < <(find . -type f -name 'requirements*.txt' -not -path './.git/*') From 0933d2190dfbce21d0c9109368316e6469ab0b58 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 19 Aug 2026 10:22:16 +0900 Subject: [PATCH 3/4] fix(security): --no-deps alone doesn't stop pip-audit's resolver conflict Follow-up to 0852623: confirmed in a real run that pip-audit's --no-deps does NOT suppress the strix-agent/cryptography declared-range conflict -- it only skips fetching undeclared transitive packages; pip's resolver still cross-checks compatibility among the packages that ARE explicitly listed together, so `pip-audit --no-deps -r requirements-strix-ci-hashes.txt` still hit the identical ResolutionImpossible error. --disable-pip bypasses pip's resolver entirely (audits the exact pins directly), which does work -- verified locally: `pip-audit --strict --desc=on --no-deps --disable-pip -r requirements-strix-ci-hashes.txt` succeeds. But --disable-pip requires every requirement to be an exact version, and requirements-strix-ci.txt (the raw, hand-maintained input, not itself a `pip install --require-hashes` target) intentionally leaves protobuf as `<7.0.0` rather than an exact pin. So: apply --disable-pip --no-deps only to the compiled *-hashes.txt file an override applies to (which is what's actually installed and does have every dependency, including protobuf's resolved version, pinned exactly); skip auditing its raw, non-hashed input counterpart entirely with a ::notice:: explaining why, rather than trying to force an audit mode it structurally can't satisfy for a file nothing ever installs as-is. Full test suite still green (1195 passed, 16 subtests). Verified locally against the real requirements-strix-ci*.txt files with the exact script logic before pushing. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/python-security.yml | 38 ++++++++++++++++++--------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/.github/workflows/python-security.yml b/.github/workflows/python-security.yml index 1b95b470d..ca57f9db5 100644 --- a/.github/workflows/python-security.yml +++ b/.github/workflows/python-security.yml @@ -236,23 +236,37 @@ jobs: # Audit every discovered requirements file. while IFS= read -r req; do - echo "::group::pip-audit -r ${req}" # A matching requirements--ci-overrides.txt (a `uv pip compile --override` - # input, e.g. requirements-strix-ci-overrides.txt) means this file pins a version - # whose declared metadata range intentionally conflicts with another pin here - # (verified safe at override time, not a resolution mistake) -- pip's own dependency - # resolver, which pip-audit calls even for fully hash-pinned files, fails on that - # same declared-range conflict regardless of --require-hashes. --no-deps skips - # resolution and audits exactly the pinned versions listed, which is what we already - # trust for these files. + # input, e.g. requirements-strix-ci-overrides.txt) means the *-hashes.txt this + # override applies to pins a version whose declared metadata range intentionally + # conflicts with another pin in the same file (verified safe at override time, not a + # resolution mistake). pip's own dependency resolver -- which pip-audit's default + # `-r` mode still calls even for fully hash-pinned files -- fails on that same + # declared-range conflict regardless of --require-hashes, and plain --no-deps does + # not suppress it (confirmed: --no-deps only skips fetching undeclared transitive + # packages, pip's resolver still cross-checks the packages that *are* listed + # together). --disable-pip bypasses pip's resolver entirely and audits the exact + # pins directly, but it requires every requirement to be an exact version (raises on + # any bare range) -- true for the compiled *-hashes.txt, not necessarily true for the + # hand-maintained raw input (e.g. requirements-strix-ci.txt intentionally leaves + # protobuf as a range). So: hashed output files with an override get + # --disable-pip --no-deps; their raw, non-hash input counterpart is skipped here + # (it is never itself a `pip install --require-hashes` target -- only its compiled + # *-hashes.txt is installed -- and that compiled file is the one audited with full + # transitive coverage). base="${req%.txt}" - base="${base%-hashes}" - if [ -f "${base}-overrides.txt" ]; then - pip-audit --strict --desc=on --no-deps -r "${req}" || status=1 + unhashed_base="${base%-hashes}" + if [ "$base" != "$unhashed_base" ] && [ -f "${unhashed_base}-overrides.txt" ]; then + echo "::group::pip-audit -r ${req} (--disable-pip --no-deps: overridden lock)" + pip-audit --strict --desc=on --no-deps --disable-pip -r "${req}" || status=1 + echo "::endgroup::" + elif [ "$base" = "$unhashed_base" ] && [ -f "${unhashed_base}-overrides.txt" ]; then + echo "::notice::Skipping pip-audit for ${req}: it is the raw input to an overridden lock (${unhashed_base}-hashes.txt), never itself a pip install --require-hashes target, and its compiled hashes file is audited separately with full resolution." else + echo "::group::pip-audit -r ${req}" pip-audit --strict --desc=on -r "${req}" || status=1 + echo "::endgroup::" fi - echo "::endgroup::" done < <(find . -type f -name 'requirements*.txt' -not -path './.git/*') # Audit the project itself when a PEP 621 / lock manifest exists. From ee4e0bb7b830f029e95ca248d4aa363ac79db6e2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 19 Aug 2026 11:00:11 +0900 Subject: [PATCH 4/4] fix(strix): add --no-deps to the real strix-agent pip install strix.yml's "Install Strix" step does a real `pip install --require-hashes -r requirements-strix-ci-hashes.txt` (not just an audit) -- this hits the exact same strix-agent/cryptography declared-range conflict the pip-audit fixes in this branch address, and neither --require-hashes nor --disable- pip apply here (this is a real install, not pip-audit). Verified locally: plain `pip install --require-hashes --no-deps --dry-run -r requirements-strix-ci-hashes.txt` succeeds cleanly ("Would install ... cryptography-50.0.0 ... strix-agent-1.5.3 ..."), confirming --no-deps alone is sufficient for a real pip install (unlike pip-audit's `-r` mode, which calls a different code path where --no-deps didn't help -- see the prior two commits on this branch). Checked opencode-review-dispatch.yml's Dockerfile and install-base-python-locks.py for other real installs of this file: none found -- that file only pip-installs requirements-opencode-review-ci- hashes.txt directly and preflights *target-repo-provided* lock candidates separately (already fixed for contextual-orchestrator's fuzz/requirements-atheris.txt via a different PR). Full .github test suite green (1208 passed, 16 subtests) plus scripts/ci/strix_required_workflow_smoke.sh passes directly. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/strix.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/strix.yml b/.github/workflows/strix.yml index 03ec23257..f8c361b95 100644 --- a/.github/workflows/strix.yml +++ b/.github/workflows/strix.yml @@ -543,7 +543,12 @@ jobs: # private install umask before creating the credential-bearing Strix # entry point; the runtime gate still rejects any later relaxation. umask 022 - python3 -m pip install --disable-pip-version-check --no-cache-dir --require-hashes -r requirements-strix-ci-hashes.txt + # --no-deps: strix-agent declares cryptography<49, conflicting with this repo's + # cryptography==50.0.0 pin (CVE-2026-39892 fix, see requirements-strix-ci-overrides.txt). + # --require-hashes already pins every package (including transitive deps) to an exact, + # hash-verified version, so skipping pip's redundant declared-range resolution here is + # safe -- verified locally with --dry-run against this exact file before pushing. + python3 -m pip install --disable-pip-version-check --no-cache-dir --require-hashes --no-deps -r requirements-strix-ci-hashes.txt strix_executable="$(command -v strix || true)" if [ -z "$strix_executable" ] || [[ "$strix_executable" != /* ]] \ || [ ! -f "$strix_executable" ] || [ -L "$strix_executable" ] \