本卡屬 FR-107(母卡 CM-1843),第 .2 棒:儲存 port 與容器改取檔。這是子需求卡,實際工作在底下的子任務卡。
port(插座) 是套件開出來的抽象介面:套件只說「我需要有人幫我拿檔/找任務/查框架版本」,實際怎麼拿由主專案插上去的 adapter(轉接頭) 決定。這樣套件就不必知道檔案存在主機硬碟、物件儲存還是客戶內網的遠端代理。
這一棒開三個插座(IEvidenceStorage 取檔放檔、ITaskEvidenceSink 找任務掛證據、IClassificationContext 查框架版本鏈),主專案寫對應的三個轉接頭。
同時改造分類容器:現在容器自己連資料庫、自己解密 Google Drive 憑證、自己下載檔案——等於把資料庫密碼交給一個外部容器。改成「主專案先把整批檔拉到一個工作目錄,再起容器,容器只讀那個目錄」(D2 甲案)。改完容器的環境變數只剩一個 AI 金鑰,網路可以完全關掉。容器 image 也從主專案搬進套件 repo,改名 evidence-classifier(原本叫 cmmc-classifier,名字綁死框架)。
這一棒是「把分類引擎與儲存方式解耦」的核心。插座定好之後,.3(分類跑在批次上)與 .5(框架去硬編碼)才有東西可以接;而容器改造牽動 image build 與出貨包,越早定下契約越好。
stage_to_dir + ITaskEvidenceSink/IClassificationContext port 定義 + 舊 Drive port 標 deprecated一台沒有 Drive 憑證、沒有資料庫密碼的容器跑一次分類能拿到檔、能回結果;儲存後端從 local 切到 seaweedfs 再跑一次,程式零改動;docker inspect 看新容器環境變數只剩 AI 金鑰。
前置:FR-107.1 完成(需要批次表與 IEvidenceStorage 的骨架)。下游:.3 與 .5 都吃這一棒的 port。
docs/features/FR-107-2609-evidence-classification-v2/design.md(HTML 版 design.html)discussion.md~/Projects/Jedicogy/module/jedi-python-package/jedi-evidence-classification/、.../jedi-file-upload/~/Projects/Billows/Audit-Manager/compliance-manager-be/、前端 ~/Projects/Billows/Audit-Manager/compliance-manager-fe/、E2E ~/Projects/Billows/Audit-Manager/compliance-manager-test/