本卡屬 FR-114(母卡 CM-2019),CM-2110 第五段 188 全量 build 撞到的 CM-2053 回歸。擋住 188 build(CM-2053 三點實證)。只改 BE build 腳本。
CM-2053 把驗簽零件 cryptography、cffi 列為「安全關鍵套件」,要求一律編成機器碼、不可以原樣 .py 附帶(原樣附帶就能被換掉,驗簽失效)。出包前有一道守門檢查這件事,但檢查方式是「產物裡要有 <套件名>/ 這個目錄、而且目錄內沒有 .py」。cryptography 自帶 .so,編完會留一個目錄,所以過得了;cffi 的 Python 部分被 Nuitka 直接編進主程式、不留目錄,只在根目錄留一支 _cffi_backend.so——守門看不到目錄就判「cffi 不在產物內」,整個 build 失敗。cffi 其實有正確編進去(runner 在 binary 裡查得到 cffi.api、cffi.model 字串),是守門的判斷條件寫錯。CM-2053 驗收退回時補 cffi 進清單(b64995ac9),當時只在 188 跑了 cryptography 單支探針、沒跑全量,所以沒被發現。
BE scripts/build/security_critical_pkgs.sh
:7-10 SECURITY_CRITICAL_PKGS=(cryptography cffi)
:13-22 assert_security_critical_compiled::17 `[[ -d "${target}/${sc}" ]] || 判不在產物內` ← 條件寫錯
BE scripts/build/build_release.sh:724 呼叫處;:763-764 對每支安全關鍵套件 add_pkg 顯式編譯(這段是對的,不動)
188 失敗 log:/opt/guidant-ai-be/.build/build-cm2110-run2.log
188 半成品產物:.build/dist/guidant-ai-1.20.0(cryptography/ 有 1 個 .so、0 個 .py;無 cffi/ 目錄;根目錄有 _cffi_backend.so)
<套件>/**.py 或根目錄 <套件>.py);②它確實有被帶進來(不然就是漏編、開機才炸)。find "$target" -path "*/${sc}/*.py" -o -name "${sc}.py" 零命中才過(不再以目錄存在為前提)。cryptography/ 目錄內有 .so;cffi→根目錄 _cffi_backend*.so。每支一行、註解寫為什麼是這個證據。先看 build_release.sh:763 的 add_pkg 與 Nuitka 輸出實際長相再定,不確定就回寫問首腦。assert_security_critical_compiled:①兩支都正確(cryptography/ 有 .so、根目錄有 _cffi_backend.so、零 .py)→ 過;②cffi 多一個 cffi/api.py → 擋;③根目錄多一個 cffi.py → 擋;④拿掉 _cffi_backend.so → 擋(漏編)。四種結果寫進回寫。ls(根目錄與 cryptography/ 的檔案清單)當第①種情境的真實樣本。不在 188 跑 build(重跑由 CM-2110 做)。.claude/worktrees/wt-fix-security(branch fix/security-b1),主 checkout 不動;不碰 pyproject/lock;只改 security_critical_pkgs.sh(build_release.sh 若要動只准改呼叫處)。git push origin fix/security-b1(188 要拉得到;決策者已放行推此分支)。