本卡屬 FR-085(母卡 CM-XXXX,建完補號),第 3 棒:輸出面與打包(jedi monorepo)。只掃不修。 建議在 C2 驗收完之後跑。
掃 jedi-common 的 interfaces/+utils/+enums/+constants/ 加上套件根目錄的 .env、publish.sh,共 30 檔。這是「資料整形後回給前端」的那一層:回應信封長什麼樣、分頁參數怎麼收、物件怎麼變成 JSON、密碼遮罩怎麼做,以及套件本身怎麼打包發布。要找的是:回給前端的東西會不會夾帶不該有的欄位或錯誤原文、分頁參數能不能拿來拖垮資料庫、共用工具裡有沒有不該存在的東西、打包腳本會不會把憑證帶出去。只找問題、不修問題。
這一棒的共同問題是「輸出面」——什麼會被序列化回前端、什麼欄位會被過濾掉。它不碰授權判斷、也不寫外部系統,是純資料整形+打包設定,可以完全獨立掃。宿主 import:utils.response_util 78 處、interfaces.* 58 處、enums.* 26 處。CM-1598(.env 受版控)落在這一棒。
首腦與偵察 agent 讀過程式碼後的起點,未經驗證。工具不會照這份清單走,工具沒答的你要自己開檔查,並在報告標明「(工具未報,runner 人工查證)」。
utils/response_util.py:23-27 except Exception as e: ... data = e.args[0]; return {"status": False, "data": data}。這是全站信封的最後一道。要追:哪些例外會在這裡被接到(序列化失敗?DTO 缺欄位?)、e.args[0] 會是什麼(可能是含路徑、表名的原文)。接縫:例外的上游是第 1 棒 C1 的 handler/handler.py,本棒允許越界讀它追完整條路。utils/gen_comment.py::8 OPENAI_API_KEY=os.getenv(...) 模組級直讀;:49 with open(file_path, "w") 用未定義變數 file_path 開檔覆寫原始碼;:54 except Exception as e: return f"Error: {str(e)}" 吞光。要追:有沒有任何 consumer import 它(grep 25 支套件與 BE)?它會不會被 Nuitka 編進出貨產物?一支開發輔助工具混在 runtime 套件裡本身就該報。page_size 沒有上限。 interfaces/schema/common.py:13 page_size = fields.Int(missing=25)——page 有 validate.Range(min=1),page_size 完全無界。要追:page_size=99999999 打到任何列表端點會怎樣(全表撈進記憶體?);:24-25 另一組 allow_none=True 的分頁 schema 是給誰用的;base_repository_impl.py 的分頁實作有沒有自己的上限兜底。interfaces/dto/base_dto.py:9-16 asdict() 全欄位輸出、to_json_dict 只濾 None;interfaces/entities/envelope_entity.py:16-30 to_dict 把 self.data 原樣塞進信封;utils/serialization_util.py:18 to_serializable 遞迴序列化任意物件。要追:to_serializable 會不會把 ORM model 的私有欄位/關聯物件一併吐出?FR-083 D1 F2 的「密碼鹽值原樣回傳」就是走 to_serializable,本棒要回答「這是套件層的系統性問題還是那一支的個案」。utils/common_utils.py:150 mark_password:只處理 JSON 字串裡 "key":"value" 形態——值非字串(數字、巢狀物件、陣列)、表單格式、header 一律漏遮。要追:誰呼叫它(grep 宿主與 25 支套件)?呼叫端餵的是什麼格式?漏遮的路徑實際會出現嗎?utils/savepoint.py:30-35 rollback 失敗 except Exception: pass 靜默。要追:savepoint rollback 失敗後上層 raise 的是原例外,DB 連線狀態會不會停在 aborted transaction 連累後續 request?utils/response_util.py(status/data,本專案主線)與 utils/common_response.py(code/msg/data,舊信封)。要追:舊信封還有誰在用?兩套的錯誤處理是否一致(一套遮、一套不遮)?.env(受版控,CM-1598 已知 LOW,本棒不重報,但要確認值是真憑證還是佔位——只做相等性比對,不印值);publish.sh 發版腳本會不會把 .env 打進 wheel(查 pyproject.toml 的 include/exclude,可越界讀);wheel 內容有沒有 gen_comment.py。jedi-common/.env 受版控,LOW,待派):FR-077 R1 越界撈到的。本棒補查「值是否為真憑證」與「有沒有打進 wheel」即可,不重報。salt)走的正是 to_serializable——本棒 ④ 要回答它是不是套件層系統性問題。page_size 這種「小輸入、大輸出」的形狀。handler/handler.py(在 C1)是例外走到信封的上一站,本棒允許越界讀它。