FR-111 · 需求索引 · 本頁由 build 掃資料夾生成

FR-111 證據自動分類套件(jedi-evidence-classification)資安掃描

✅ arc 收口(2026-09-20);發現已全數處理(2026-10-01 同步)——M07 問題隨 1.21.0 出貨:舊 Drive 線 4 條隨舊線退場拆除(CM-2222)、其餘已修(CM-2192/2193/2212/2223/2225/2226/2227),無裁定不修項;五棒全部掃完並驗收,淨新增 8 條資安(1 高 4 中 3 低)+4 條功能 bug,SUMMARY 見 handoff/2026-09-20-FR-111-SUMMARY.md(E1 3 條→第 102~104,E2 零+人工第 106/§3.2 25,E3 4 條→第 108~111 含本 arc 首條高風險,E4 範圍內零條,E5 範圍內零條+四條重複報 E3 已挑掉),arc 已收口**(盤點卡 CM-1945;母卡 CM-1946、子卡 CM-1947~1951 一次建完連號)。套件正式碼 97 檔 10,450 行(含 docker/ 容器端與 migration),剔除 56 支無邏輯檔後五棒 41 檔 7,849 行,每棒 ≤2,000 行(含接縫檔):E1 容器執行鏈(7 檔 1,476 行,✅ 已掃完,3 條發現一中二低,報告見 scan-E1) → E2 批次分類主幹(2 檔 1,900 行,✅ 已掃完,範圍內 0 條;守門十五支逐支核完無漏,卡片七項人工查證另記三項陷阱,報告見 scan-E2) → E3 舊 Drive 線(4 檔 1,781 行,✅ 已掃完,🔴 4 條發現一高三中全票通過——預覽端點可讀客戶整個雲端硬碟,報告見 scan-E3) → E4 設定與插件殼(16 檔 1,850 行,✅ 已掃完,範圍內 0 條;工具唯一候選 0:3 駁回,卡片七項人工查證全數核完、25 支路由包裹逐支數過無漏,另記兩項觀察,報告見 scan-E4) → E5 邊界層(12 檔 842 行,✅ 已掃完,範圍內 0 條;工具四條通過但全部越界到舊 Drive 線、與 E3 重複已挑掉,卡片六項人工查證全數核完,報告見 scan-E5)。主專案接線 5 檔約 1,300 行另棒。全機一次只跑一支掃描。

狀態:✅ 已完成 文件 5 份 handoff 1 份

這是資安掃描系列的一個 arc。 跨 arc 的結論、修正卡狀態、還沒開卡的待辦與覆蓋率,在跨 arc 總表:security-scan-consolidated/。本頁只講這一支。

🔴 一頁看完

E1 容器執行鏈掃完並驗收(2026-09-19):3 條發現、三位檢查員 9 票全投、驗證章 verified,登記跨 arc 總表第 102~104 項。 最嚴重的是「證據檔內文可以對 AI 下指令、左右它判符合哪些合規項目」(中等);另兩條「AI 金鑰走 docker run 命令列」「容器無資源上限逾時殺不掉」被面板評輕微,理由是出貨的落地版後端刻意沒裝 docker(D4 定案)、分類功能在落地版根本跑不到——這是功能決策題,要決策者確認是否維持。報告:scan-E1-container-chain.md。

E2 批次分類主幹掃完並驗收(2026-09-19):範圍內零發現——工具唯一通過的一條是越界讀到的 Nexus 明文連線(已有 CM-1634,不計)。runner 人工核七項:十五支端點守門全掛無漏、清單強制帶範圍、審核結果塞不進別人的東西、背景執行緒身分帶得完整;另記兩件——刪整批後工作目錄的判定結果與容器紀錄永久留在後端主機(第 106 項)、失敗原文入庫(§3.2 第 25)。報告:scan-E2-batch-chain.md。

🔴 E3 舊 Drive 線掃完並驗收(2026-09-19):4 條發現、一高三中,四條全部三位檢查員一致通過,驗證章 verified。這是本 arc 目前唯一的高風險。 最嚴重的一條是預覽證據檔的端點你給什麼檔案編號就抓什麼——不驗這份檔案屬不屬於這個專案、也不驗你是不是專案成員,而系統向 Google 申請的是整個雲端硬碟的完整權限(app/cloud_integration/service/google_drive_integration_service.py:41,首腦開檔核對),所以能撈的不是證據資料夾、是客戶整個硬碟。門檻是「有任何一個能登入的帳號」。 另三條是同一條鏈的其他環節:查結果與報表的端點不驗成員、Drive 查詢字串字串拼接可改寫搜尋範圍、job 列表不驗專案且記憶體登記簿不分租戶(那份 dict 不受資料庫租戶隔離管轄)。四條要一起修,補一個等於沒補。這條線已標 legacy、下一版要刪,但路由現在仍掛著——觸發功能目前確實跑不起來(容器改成只讀 stage 目錄、這條沒那一步),但那只擋住「觸發」,四條全是查詢端點、不受影響。報告:scan-E3-legacy-drive-chain.md。

E4 設定與插件殼掃完(2026-09-19):範圍內零條發現。 工具唯一提出的候選——「查可用型號的端點沒有管理員檢查」——三位檢查員一致駁回(0:3),理由是它回的只有廠商名字加一張寫死在程式裡的公開型號表(沒有金鑰、沒有網址、拿不到別租戶的東西),而且前端的分類操作畫面本來就要呼叫它填下拉選單,加上管理員檢查反而會擋掉正常功能;runner 開檔核對三個駁回理由全部屬實,同意不開卡。卡片七項重點全數人工查證:設定的四支建改刪查每一支第一行都有租戶管理員守門、守門零件沒接上是「當場拋錯拒絕服務」而不是放行、資料庫租戶隔離的四條規則形狀正確(讀放行原廠那列、寫入三條不放行)、25 支路由的登入包裹逐支數過零遺漏、金鑰入口 container_env 全套件 7 處引用無一被寫進 log。另記兩項觀察(都不開卡):①人設與判斷指引兩欄沒有長度上限,但寫得進去的只有自家租戶管理員、影響只限自己;②設定裡的「預設廠商/預設型號」存得進去但分類跑起來時沒有人讀它們(只有思考深度被讀),是 FR-107 功能沒接完不是資安缺口。報告:scan-E4-settings-plugin-shell.md。

E5 邊界層掃完(2026-09-19,FR-111 最後一棒):範圍內零條發現。 工具通過四條、但四條全部越界到舊 Drive 線,而且都是 E3 已經報過的同一批(預覽端點、查結果端點、報表端點、Drive 查詢字串拼接),依重複報由驗收者挑掉的紀律不計入總表——但這反過來提高了 E3 那四條的可信度:第二組獨立的研究員與檢查員在不知道 E3 存在的情況下重現了同樣四條。唯一落在範圍內的候選(「批次編號沒填時查檔案會查到整個客戶的檔案」)三位檢查員一致駁回,runner 開檔核對四個駁回理由全部屬實:新版分類結果建立時一定填批次編號、舊版沒批次編號但它的內部識別碼從不回給前端、就算拿到也會被 _require_run 的 fail-closed 擋下、刪批次時先刪結果列不留孤兒。卡片六項重點全數人工查證:三個查詢格式共 21 個欄位全部預設為空(兩個檔案自己用紅字寫了這條規則,是主動防範不是碰巧)、建立端點是一個欄位一個欄位手動取的所以「大量指派」結構上不可能(全套件 apply=False 零命中,總表建議的那項盤點本套件可標已查)、分頁上限 200(總表第 31 項同型有防到)、列表強制帶範圍+再檢查成員(總表第 70 項同型有防到)、兩張表各 4 條隔離規則讀寫都擋、子表有自己的客戶欄位不靠父表傳遞。本棒淨新增 0 條。 報告:scan-E5-boundary-layer.md。

🔵 五棒跑完後的 arc 結論:這支套件的風險集中在「待刪的舊 Drive 線」,不在現行的新批次線。 E3 那四條全部落在舊線上,而新線(FR-107 寫的)把舊線踩過的坑都避開了——查詢格式紅字寫明預設必須為空、列表強制帶範圍並檢查成員、預覽端點比對檔案歸屬(正是 E3-1 那條高風險的正確寫法)、兩張表都有自己的客戶欄位。舊線已由 FR-107.6 T-6.1 拿掉前端入口、後端保留一版待刪(見 followup_fr107_remove_legacy_drive_classification_line)。所以排修正時有個取捨要決策者定:舊線若照計畫下一版刪掉,E3 的四條會隨之消失;若要留,那四條就得補守門。

🔵 方法論教訓(記給下一個 arc):E5 是五棒裡範圍最小的(842 行)卻跑最久(5 小時 32 分),因為研究員被停滯偵測強制中斷五次(每次都精準在最後一次動作後 3 分 12 秒,累積上下文都在 20 萬上下)。根因不是檔案多,是研究員追出了範圍——去主專案全庫搜誰呼叫這些函式、找隔離判斷函式的定義。「接縫檔算進範圍」那條規則在這種棒不夠用,因為接縫是整個主專案的呼叫鏈、怎麼算都放不進 2,000 行。下次遇到「本體很小但接縫發散」的棒,該做的不是再切小,是在卡片裡把接縫需要的事實先查好寫進去,讓研究員不必自己跑出去挖。

這支套件是 21 支裡唯一同時做三件高風險事的:跑外部程式(docker 容器)、連客戶的雲端硬碟(帶授權)、用 AI 服務金鑰。 跨 arc 總表把它排在「還沒掃」的第 3 順位,理由是「檔案最少但值得排查的程度最高」。決策者 2026-09-18 裁:分類線的功能開發(FR-107/FR-110)已收口,可以排掃。

盤點結論:套件正式碼 97 檔 10,450 行(含容器端程式與 6 支 migration),剔除 56 支無邏輯檔後剩 41 檔 7,849 行,切五棒、每棒不超過 2,000 行(這是 jedi-detection D3 五次零產出換來的硬上限——掃描工具的研究員 180 秒沒有工具呼叫就被砍掉,上下文一大單次思考就破 3 分鐘)。

先派 E1(容器執行鏈):金鑰怎麼交給容器、容器命令怎麼組、容器跑完的紀錄怎麼遮——這三件事全在這 7 個檔裡,也是首腦開檔時看到最多疑點的地方(見「首腦開卡錨點」)。

§1

結論(三句話)

  1. 五棒的順序照風險排:E1 容器執行鏈(金鑰進命令列、遮蔽只遮一半)→ E2 批次分類主幹(十個端點的守門、背景執行緒身分、審核結果誰能改)→ E3 舊 Drive 線(觸發端點吃前端給的資料夾 ID、job 狀態查詢無守門)→ E4 設定與插件殼(誰能改 AI 設定、原廠設定曝露多少)→ E5 邊界層(空條件回全表、RLS 規則形狀)。
  2. 切法是「按業務鏈垂直切」,唯一例外是 E5:E2 的主幹服務單檔就 1,653 行,資料層放不進同一棒,只能把「入口 schema + 查詢預設 + repo 過濾 + RLS」拆成一棒。這五件事本來就活在邊界上、不需要看服務層也能判斷。
  3. E2 是唯一逼近上限的一棒(1,900 行),三支 domain service 接縫(239 行)放在 E5;若 E2 的研究員仍被停滯偵測砍掉,預備切法已定:主幹服務檔上下半各跑一次(同 D3-4a/4b 作法),不重試同一設定。

切棒表

scope 以套件 HEAD 955e409(2026-09-18,branch feature/review)為準。 最近 15 個 commit 全是 FR-107(批次分類、AI 金鑰、多供應商、模型碼表換代)與 FR-110 相關,開卡前已逐一看過,卡上的行號對到這個版本。

棒 範圍(白話) 檔數 行數 對應卡片重點 順位
E1 容器執行鏈 宿主怎麼組 docker run 命令、金鑰怎麼交給容器、容器端怎麼讀證據檔並呼叫 AI、容器紀錄怎麼遮蔽落地 7 1,476 ①帳密三處防護 ②容器執行 ③紀錄遮蔽 1(先派)
E2 批次分類主幹 批次的上傳/封口/分類/審核/歸檔進任務/清理十個端點的服務與路由 2 1,900 ⑥批次 API 守門 ⑦結果回寫身分 ③紀錄落地 2
E3 舊 Drive 線 舊的「掃雲端硬碟資料夾」觸發線:觸發/job 狀態/Drive 讀寫/正解匯入(端點已標 legacy 但仍掛著) 4 1,781 ④雲端硬碟授權與範圍 ③紀錄上傳 Drive ⑥守門 3
E4 設定與插件殼 分類設定(AI 供應商/模型/人設)的 CRUD 與守門、模型碼表、plugin 契約與接線檢查、路由表 16 1,850 ⑤金鑰解析鏈套件側 ⑥守門殼 4
E5 邊界層 request schema 放行哪些欄位、查詢條件預設值、repo 過濾、批次三張表的 RLS 規則 12 842 ⑥空條件回全表 / 租戶隔離 5
§2

各棒檔案清單(驗檔數用)

E1 容器執行鏈(7 檔 1,476 行)

jedi_evidence_classification/infra/classifier_container_runner.py   261
jedi_evidence_classification/domain/exceptions.py                    11
docker/container_entrypoint.py                                      811
docker/llm_clients.py                                               314
docker/Dockerfile                                                    44
docker/rebuild.sh                                                    29
docker/requirements.txt                                               6

E2 批次分類主幹(2 檔 1,900 行)

jedi_evidence_classification/app/service/evidence_batch_service.py  1653
jedi_evidence_classification/api/routes/evidence_batch_route.py      247

E3 舊 Drive 線(4 檔 1,781 行)

jedi_evidence_classification/app/service/evidence_classification_service.py  1246
jedi_evidence_classification/api/routes/evidence_classification_route.py      237
jedi_evidence_classification/infra/evidence_drive_ops.py                      183
jedi_evidence_classification/app/service/job_registry.py                      115

E4 設定與插件殼(16 檔 1,850 行)

jedi_evidence_classification/app/service/classification_profile_service.py            311
jedi_evidence_classification/api/routes/classification_profile_route.py                85
jedi_evidence_classification/api/schemas/classification_profile_schema.py              84
jedi_evidence_classification/domain/llm_models.py                                      95
jedi_evidence_classification/domain/service/classification_profile_domain_service.py   57
jedi_evidence_classification/infra/repository/classification_profile_repository_impl.py 59
jedi_evidence_classification/domain/entity/classification_profile_query_entity.py      21
jedi_evidence_classification/migrations/005-classification-profiles.sql               175
jedi_evidence_classification/plugin/__init__.py                                       125
jedi_evidence_classification/plugin/assembly.py                                       114
jedi_evidence_classification/plugin/contract.py                                       144
jedi_evidence_classification/plugin/runtime.py                                         54
jedi_evidence_classification/plugin/migrations.py                                      20
jedi_evidence_classification/api/guards.py                                             33
jedi_evidence_classification/api/routing.py                                           190
jedi_evidence_classification/domain/ports.py                                          283

E5 邊界層(12 檔 842 行)

jedi_evidence_classification/domain/service/evidence_batch_domain_service.py         62
jedi_evidence_classification/domain/service/evidence_batch_file_domain_service.py    67
jedi_evidence_classification/domain/service/classification_run_domain_service.py    110
jedi_evidence_classification/infra/repository/evidence_batch_repository_impl.py      71
jedi_evidence_classification/infra/repository/evidence_batch_file_repository_impl.py 28
jedi_evidence_classification/infra/repository/classification_run_repository_impl.py  28
jedi_evidence_classification/domain/entity/evidence_batch_query_entity.py            20
jedi_evidence_classification/domain/entity/evidence_batch_file_query_entity.py       20
jedi_evidence_classification/domain/entity/classification_run_query_entity.py        18
jedi_evidence_classification/migrations/003-evidence-batches.sql                    220
jedi_evidence_classification/app/service/run_state_keys.py                           82
jedi_evidence_classification/api/schemas/evidence_batch_schema.py                   116

剔除清單(56 檔 2,601 行,不掃)

類別 檔案 為什麼不掃
空 __init__.py 12 支 api/routes、app、app/service、app/service/report、common、domain、domain/entity、domain/repository、domain/service、infra、infra/mapper、infra/repository 各一 0 行
近空 __init__ 3 支 __init__.py(15)、api/schemas/__init__.py(2)、infra/model/__init__.py(15)、api/__init__.py(22,只 re-export) 只有 import
純資料 entity 4 支 evidence_batch_entity(45)、evidence_batch_file_entity(34)、classification_run_entity(54)、classification_profile_entity(34) dataclass 無邏輯;query entity 保留在 E4/E5(決定空條件行為)
ORM model 4 支 evidence_batch_model(49)、evidence_batch_file_model(40)、classification_run_model(53)、classification_profile_model(36) 欄位宣告;隔離看 migration 的 RLS policy(E4/E5 有收)
mapper 4 支 evidence_batch_mapper(48)、evidence_batch_file_mapper(39)、classification_run_mapper(55)、classification_profile_mapper(42) entity↔︎model 逐欄搬
repository 介面 4 支 evidence_batch_repository(31)、evidence_batch_file_repository(10)、classification_run_repository(16)、classification_profile_repository(20) abstract method 殼
正解(ground truth)整條 6 支 classification_ground_truth_{entity,query_entity,model,mapper,repository,repository_impl,domain_service}(共 160 行) 純 CRUD,唯一入口是 E3 的 import_ground_truth,守門在 E3 掃
報表 builder 4 支 report/report_common(225)、validation_report_builder(320)、adjudication_report_builder(176)、summary_builder(112) 讀 state 與正解表做統計,不碰 DB/檔案/網路;各有 unit test
migration 4 支 001(80,建舊表)、002(30,GRANT)、004(87,加欄位)、006(62,加欄位) 不含 policy;002 檔頭「刻意不掛 RLS」已過時(見錨點 ⑥),若研究員讀到會誤判,卡上已標
error code common/error_code.py(70) 常數表
開發輔具 harness/dev_app.py(182)、harness/docker-compose.yml(11)、docker/README.md(86)、README.md(267)、pyproject.toml(62)、poetry.toml、publish.sh、docker/.dockerignore 不進出貨包
測試 tests/ 23 支、docker/test_container_entrypoint.py(378)、docker/test_llm_clients.py(245) focus=attack-surface 本來就跳過

主專案側接線(另棒,本 arc 不掃,只列數量)

grep -rl 'evidence_classification' api app core di_containers infra config common 在 BE repo 找到 5 支實質接線檔約 1,300 行:

檔 行 做什麼
core/plugins/evidence_classification.py 718 八個 adapter:專案角色守門、平台管理員守門、AI 金鑰解析(container_env() 只塞這次要用的那一家的鑰)、Drive 資料夾來源、控制項目錄、證據儲存(stage_to_dir 拉檔到工作目錄)、任務證據回寫、LibreOffice 轉檔
di_containers/evidence_classification/evidence_classification_containers.py 198 DI 接線;Drive token_provider 綁在這裡(取權杖是宿主的憑證疆界)
app/system_config/service/ai_provider_key_resolver.py 199 金鑰解析鏈「租戶 → ROOT 原廠鑰 → 環境變數」的本體(卡片重點 ⑤ 的一半在這)
infra/flow_engine/models/job_evidence.py 117 任務證據表(歸檔落點)
common/middleware/request_context_mw.py 69 request 身分脈絡

另有 config/app_modules.py/di_containers/containers.py 只是註冊行,scripts/evidence/classify/classify_evidence_drive.py(724 行)是已停用的離線腳本(FR-110 記待刪)。

🔴 重點 ⑤「非平台管理員拿不拿得到原廠鑰」的判定一半在主專案側(ai_provider_key_resolver.py+core/plugins 的 container_env()),套件本體只透過 IAiProviderConfig port 呼叫——E4 掃套件側能答「套件有沒有把鑰露出去」,答不了「解析鏈本身守不守」。主專案接線棒開卡時要把這兩支放同一棒。

首腦開卡錨點(開檔核出的可疑點,未經掃描與投票確認)

這些是首腦盤點時開檔看到的,寫進各子卡「重點看什麼」當思考起點。不是已確認的問題,掃完要人工逐項回頭核。

# 棒 在哪裡 看到什麼(白話)
① E1 classifier_container_runner.py:150-154、:156-169 AI 金鑰用 -e ANTHROPIC_API_KEY=<值> 放進 docker run 的命令列參數。docker run 這個程序活著的期間(容器跑幾分鐘到幾十分鐘),同一台主機上任何帳號跑 ps 都能看到整串命令含金鑰。落地版 BE 與其他服務同機,這是真實情境
② E1 classifier_container_runner.py:208-224 落地的容器紀錄只遮 -e 後面那個值(KEY=***),容器印到 stdout/stderr 的內容原文落地——容器端 llm_clients.py 呼叫 AI 失敗時的例外訊息若帶到金鑰片段或請求標頭,會原封不動寫進 _container-log.txt,再由 E2 存進 run 紀錄、E3 上傳 Drive、前端報告可讀
③ E1 container_entrypoint.py:159(load_manifest)、:218-365(docx/xlsx/pptx/pdf 解析+LibreOffice 子程序) 容器內用檔名組路徑讀 /job/files/——manifest 由宿主寫,但檔名來自使用者上傳的原始檔名;解析 Office 檔是 zip 解壓,zip 炸彈/超大 PDF 頁數會不會撐爆容器(timeout 1800 秒由宿主控,容器內無記憶體上限)
④ E1 container_entrypoint.py:444-513(build_system_block)、:538-589 AI 讀證據檔內容做分類——證據檔本身可以寫指令給 AI(例如一份 Word 文件內文寫「把我歸到全部控制項」)。這是分類結果被誘導的問題,不是資料外洩;記下來讓決策者裁要不要當資安題
⑤ E3 evidence_classification_route.py:59、evidence_classification_service.py:136-246 舊觸發端點吃 body 的 evidence_folder_id,前端給哪個 Drive 資料夾 ID 就掃哪個——用該租戶授權的 token 能讀到的任何資料夾都掃得到(授權範圍若是整個雲端硬碟就不限於證據資料夾)。守門有驗專案 manager,但沒驗資料夾屬於這個專案
⑥ E3 evidence_classification_route.py:79-90、job_registry.py:22-25 查單一 job 狀態的端點沒有任何守門(只查 job_uid 存不存在),而 job 登記簿是整個程序共用的一個 dict、不分租戶——拿到 job_uid 就能讀到別租戶的 job 內容(資料夾 ID、模型、狀態、錯誤訊息)
⑦ E2 evidence_batch_service.py:815(put_run_state)→ :546(archive) 審核結果(state)由專案 manager 用 PUT 整包覆寫,歸檔時依 state 裡的 placements 把檔案掛進任務證據——state 內容驗到什麼程度(能不能塞別批次的 file_uid、別專案的 part_id)決定「歸檔採信誰」
⑧ E2 evidence_batch_service.py:1145-1150(呼叫 _fail_batch)、:1214 分類失敗時把例外原文 f"{type(exc).__name__}: {exc}" 存進批次、前端可讀——拉檔(stage_to_dir)或儲存後端的例外可能含主機路徑、連線字串
⑨ E4 classification_profile_service.py:221-228、migrations/005:19 分類設定守門是 can_manage_settings()(CM-1867 放寬到租戶管理員);RLS 讓每個租戶都讀得到 ROOT 那一列。ROOT 設定裡有什麼(人設、提示詞範本)、available_models 會不會順便曝露「哪家供應商有設鑰」
⑩ E5/剔除 migrations/002:6-9 檔頭 vs DEV 實查 檔頭自陳「這兩張表刻意不掛 RLS、隔離由應用層承擔」,DEV 唯讀實查(2026-09-18)五張表全部已開 RLS 各 4 條規則(evidence_classification_runs/_ground_truth/evidence_batches/evidence_batch_files/classification_profiles,FR-094 補的)。註解過時——研究員讀到會報「無 RLS」假陽性,卡上明標
⑪ E5 003-evidence-batches.sql:23、evidence_batch_query_entity.py policy 檔頭自陳「只取 tenant 維度、不加 org 維度」(部門隔離靠應用層);批次列表的查詢條件全選填——空條件回整租戶(總表第 70 項同型,要驗有沒有專案維度必填)

需求討論紀錄

  • 2026-09-18 決策者裁:classification 線(FR-107/FR-110)已收口,可以排掃;盤點開卡完成後本 session 直接接任 FR-111 首腦,不交回主首腦。
  • 2026-09-18 決策者裁(全機規則):一次只跑一支掃描。jedi-detection D3-1 正在跑(CLAUDE-SECURITY-20260918-110643),收完前不派 E1;D3 後面還有 D3-2~D3-4b 四棒,兩個首腦輪替、順序由決策者裁。
  • 修正卡當時不開(決策者 2026-09-17 裁:等全部掃完分類後統一開);後續已統一派工並修完,舊 Drive 線三支路由已整條拆除(1.21.0 出貨)。
  • 切棒硬判準(決策者 2026-09-18 立,D3 五次失敗換來):每棒總行數 ≤2,000 含接縫檔;失敗一次就換變數不重試同一設定。

沿革

見 security-scan-STATE.md 的 111 那組列與 git log。

§3

文件

以下全部由 build 掃資料夾產生,新增檔案重 build 即自動出現。標題連結指向渲染後的 HTML,md 連向源檔。

證據與盤點

文件 類型 標題 最後更新
scan-E1-container-chain / md 盤點證據 E1 檢查結果:容器執行鏈——docker 命令組裝/金鑰下發/容器端程式/log 遮蔽(jedi-evidence-classification) 2026-09-19
scan-E2-batch-chain / md 盤點證據 E2 檢查結果:批次分類主幹——上傳/封口/分類/審核/歸檔/清理(jedi-evidence-classification) 2026-09-19
scan-E3-legacy-drive-chain / md 盤點證據 E3 檢查結果:舊 Drive 線——觸發/job 狀態/Drive 讀寫/正解匯入(jedi-evidence-classification) 2026-09-19
scan-E4-settings-plugin-shell / md 盤點證據 E4 檢查結果:設定與插件殼——分類設定 CRUD/模型碼表/plugin 契約/守門殼(jedi-evidence-classification) 2026-09-19
scan-E5-boundary-layer / md 盤點證據 E5 檢查結果:邊界層——欄位驗證/查詢預設/資料層過濾/資料庫隔離規則(jedi-evidence-classification) 2026-09-19

交接與收口時間軸(handoff/,1 份)

由新到舊。每份是某一棒次交接當下的完整現況快照,看某個時間點「當時知道什麼」請從這裡進。

日期 文件 標題
2026-09-20 2026-09-20-FR-111-SUMMARY / md FR-111 證據自動分類套件資安掃描 — arc 收口 SUMMARY
§4

Notion 卡

卡片內容(決策紀錄、驗收條件)以 Notion 為準,本頁只記座標。

關係 卡號 標題 狀態
母案 CM-1946 FR-111 jedi-evidence-classification 證據自動分類套件資安掃描(五棒 41 檔 7,849 行,只掃不修) —
子卡 CM-1947 E1 容器執行鏈:docker 命令組裝/金鑰下發/容器端程式/log 遮蔽(7 檔 1,476 行) ✅ 已驗收
子卡 CM-1948 E2 批次分類主幹:上傳/封口/分類/審核/歸檔/清理(2 檔 1,900 行) ✅ 已驗收
子卡 CM-1949 E3 舊 Drive 線:觸發/job 狀態/Drive 讀寫/正解匯入(4 檔 1,781 行) ✅ 已驗收
子卡 CM-1950 E4 設定與插件殼:分類設定 CRUD/模型碼表/plugin 契約/守門殼(16 檔 1,850 行) ✅ 已驗收
子卡 CM-1951 E5 邊界層:request schema/查詢預設/repo 過濾/RLS policy(12 檔 842 行) ✅ 已驗收