Guidant AI · FR 登記表
⌂ 需求中心

docs/features/README.md · FR 編號 single source of truth

功能開發紀錄 (Feature Development Records)

所有需求的編號登記,含尚未建站的。建有文件站的需求另見需求中心。

開發過程中的設計探討、實作計畫、前端規格等歷史文件。

API 模組文件(SA/SD)已搬至 docs/api/,本目錄只保留功能開發過程的紀錄。

要用看的? 建有文件站的需求都掛在 需求中心 index.html(總入口, 掃資料夾自動生成)。本頁是 FR 編號登記表(single source of truth),涵蓋所有需求 含尚未建站的;總入口只列有 README.md 的。


§1

命名規範(FR 編號)

資料夾一律用 FR-<序號>-<YYMM>-<功能名> 格式:

FR-016-2604-google-drive-sync
│   │    │    └── kebab-case 功能名
│   │    └────── 提出年月(2604 = 2026-04)
│   └─────────── 流水序號(提出先後,補零到 3 位)
└─────────────── Feature Requirement 前綴

2026-05-29 一次性導入此規範,既有 33 個資料夾全數重編(見 docs/changelog/2026-05-29-tweak-feature-folder-fr-numbering.md)。


§2

目錄結構

docs/features/FR-<序號>-<YYMM>-<功能名>/
├── design.md               ← 設計探討 / 需求分析
├── implementation-plan.md  ← 實作計畫(步驟、時程)
├── frontend-spec.md        ← 前端整合規格
├── README.md               ← 跨 phase tracker(選填)
└── handoff/                ← 跨 session 交接 prompt / phase 收口 SUMMARY

§3

FR 登記表(single source of truth)

排序依 FR 號(子題緊接母題);實際提出時間看「提出」欄。

FR 提出 功能 arc 關聯
FR-001 ≈2026-02 稽核生命週期整體分析 稽核生命週期母題
FR-002 ≈2026-02 稽核員儀表板
FR-003 ≈2026-03 多重 AP 支援 生命週期 Stage 1
FR-004 ≈2026-03 外部稽核 生命週期 Stage 2
FR-005 ≈2026-03 POA&M 改善追蹤 生命週期 Stage 3
FR-006 ≈2026-03 多輪稽核 生命週期 Stage 4
FR-007 ≈2026-03 啟用專案 生命週期 Stage 5
FR-008 ≈2026-03 前端 API 遷移
FR-009 ≈2026-03 SSP 控制項現況
FR-010 ≈2026-03 SSP 程序書池
FR-011 ≈2026-03 SSP 控制項批次匯入匯出 SSP 匯入匯出 arc 母題
FR-011.2 2026-05-18 SSP 匯入匯出 Phase 2(全領域匯入 + 6 格式匯出) ↳ FR-011 子(Phase 2)
FR-011.3 2026-05-22 專案內直接編輯 SSP ↳ FR-011 子(Phase 2 Track C 補強)
FR-012 ≈2026-03 任務批次匯入匯出
FR-013 ≈2026-03 批次完成任務
FR-014 2026-04-06 稽核模組歷史開發規格 合併自 grc-project / job-comment / job-evidence / job-revert
FR-015 2026-04-24 GitLab CI 自動 code review
FR-016 2026-04-24 Google Drive 整合
FR-017 2026-04-25 稽核範圍合併
FR-018 2026-04-25 ModuleFrame 範本預設 MF defaults arc 母題
FR-018.2 2026-05-26 MF 範本預設 Phase 2 ↳ FR-018 子(Phase 2)
FR-019 2026-04-26 SSP 版本控制
FR-020 2026-04-27 通知設定
FR-021 2026-04-28 問卷答案去重
FR-022 2026-04-30 SSP 程序書 docx parser
FR-023 2026-04-30 問卷答案 checkpoint 最佳化
FR-024 2026-05-04 合規框架 PDF 匯入 v2
FR-025 2026-05-06 SSP 更新 diff
FR-026 2026-05-12 專案流程引擎整合
FR-027 2026-05-23 docx 匯入一致性 relates to FR-022 / FR-011.2
FR-028 2026-05-24 SSP OSCAL 對齊
FR-029 2026-05-26 選單群組
FR-030 2026-05-27 證據自動分類 證據分類 arc 母題
FR-030.2 2026-05-29 證據分類支援圖片 / PDF 內容辨識(Claude Vision) ↳ FR-030 子(多模態能力補強,流程不變)
FR-030.3 2026-05-29 證據分類支援 .xlsx / .pptx(本地抽文字) ↳ FR-030 子(補檔型,sibling of FR-030.2)
FR-031 2026-05-31 證據分類分析結果報表(驗證報表 + 各 AO 誰對誰錯)+ run 結果入 DB relates to FR-030(分類結果可視化)
FR-032 2026-06-04 系統資產盤點(資訊系統作為資產納入 SSP inventory,hybrid soft-ref) relates to FR-018(MF 範本預設)
FR-033 2026-06-04 專案進度稽核事件埋點(任務完成/指派/退回 + 問卷狀態變更寫 system_logs)+ 查詢 runbook relates to FR-013 / FR-021
FR-034 2026-06-08 jedi-flow-engine vs BE WorkflowExecutionService 收斂評估 — feasibility done,採方案 c 文件化結案(無第二稽核產品、BE 版架構合規;未來有第二產品改走抽 jedi-audit-workflow 層) relates to FR-026(flow-engine 整合)
FR-035 2026-06-10 SSP table 改名(system_security_plans*ssp(s)_*,表名 only)— 跨 BE + jedi-oscal + 4 DB 環境,in-place ALTER RENAME relates to FR-028(SSP OSCAL 對齊)
FR-036 2026-06-10 module_frame ↔︎ SSP 整併(樣板 SSP 模型)— *_defaults 折進「一份 is_template=True 的 SSP」,啟動專案 clone 樣板 SSP → 專案 SSP;消除 MF defaults 與 SSP 子表雙套 schema 維護 relates to FR-018(MF 範本預設)/ FR-019(SSP 版本控制)/ FR-035(SSP 改名)
FR-037 2026-06-10 🗄️ ARCHIVED(2026-06-14) — OSCAL 5 模型 × DB schema required 欄位盤點,後續演變成「全 OSCAL 關聯式 schema 重新設計」(45→42 表),方向已偏離原盤點原意,user 決定整個重來、不續作。成果(v2 schema + 審查報告)保留供未來重啟參考,見資料夾 SUMMARY。新一輪將另開 FR relates to FR-028(SSP OSCAL 對齊)/ FR-036(SSP 表族整併同期動表)
FR-038 2026-06-14 OSCAL 重新設計(接替 FR-037 ARCHIVED,整個重來) relates to FR-037(前一輪盤點,已封存)
FR-039 2026-06-17 分散式檔案 Agent(證據檔案落地客戶端,雲端不託管 binary,依客戶分流到各自 agent)— demo 階段 relates to FR-016(檔案儲存抽象)/ FR-030(證據檔案來源)
FR-040 2026-06-20 稽核計畫填寫(ap-authoring)優化 — 查核方法改 system_menu 可擴充 + 行程(task)鉤稽控制項/受評對象/參與人員(OSCAL task→activity 模型,related-controls / subjects / responsible-roles) relates to FR-038(OSCAL 重新設計)
FR-041 2026-06-21 稽核結果(AR)填寫優化 — A 繼承 AP 查核指引進判定頁 / B 缺失→風險→矯正(POA&M)串接 / C 觀察照規劃方法引導化(順 OSCAL Observation→Finding→Risk→POA&M 四段,漸進增強既有面板) relates to FR-040(承接 AP 規劃)
FR-042 2026-06-28 合規框架與客戶儲存空間脫鉤,改由系統部門集中管理 — 框架 PDF 改存「最高層 tenant」系統儲存;upload_filesstorage_scope(system/customer),下載依「檔案 scope」解析後端(繞呼叫者 RLS);既有檔 migration 一次性搬遷;下載端補 auth、登入即可讀(全 tenant 共享) relates to FR-039(檔案儲存抽象 / RemoteAgent)/ FR-024(框架 PDF 匯入 v2)
FR-043 2026-07-02 稽核計畫 docx 匯入 — ap-authoring 上傳顧問稽核報告 docx → 解析預填行程 → 預覽修改 → 確認寫入(走既有 set_tasks/add_ap_party,零 AP schema 新欄位);parser adapter registry 支援多版本格式,v1=亞航 CMMC L1 格式 relates to FR-040(ap-authoring 行程模型)
FR-044 2026-07-03 稽核紀錄 xlsx 匯入 — 稽核執行頁上傳顧問逐條檢查紀錄 → AO 判定+observation+佐證分級自動配對 → 批次寫入;FindingState 加 not_applicable(jedi_oscal_v2);NOT MET 自動建中風險;三層 adapter 架構(template×framework×共用 core,FR-043 registry 泛化) relates to FR-043(匯入管線同族)/ FR-041(AR 填寫)
FR-045 2026-07-03 CMMC 2.0 v2.13 (2024) PDF parser 相容性修正 — jedi-oscal-v2 CMMC adapter 單一 parser 雙格式:L1 FAR 式編號(AC.L1-b.1.i)regex alternation + [FCI/CUI Data] 標題尾綴剝除;行抽取字型分流(Cambria-Bold 標題 vs 內文)解 v2.13 疊字造成的 AO 遺失 / methods 分桶全毀;L1/L2 新舊四份 guide 都要可解析 relates to FR-024(框架 PDF 匯入 v2)
FR-046 2026-07-04 客戶交付文件套件(架構顧問評估版)— 6 份正式 Word 文件(GAI-SD-01~06:架構 / API 全量規格 / DB / 權限安全 / jedi-* 套件 / 授權清單);Markdown 內容源 + 共用 python-docx renderer 管線;內容從 code / DB 程式化產生並對帳;產出 docs/交付文件/v1.8.0/
FR-047 2026-07-05 功能 SPEC 手冊(新人工程師導向)— docs/specs/ 兩層結構(功能群 _overview + 頁面 spec 13 節模板:UC / 權限矩陣 / 狀態機 / 前後端檔案地圖 / API / DB / 頁面邏輯資料對應 / 已知坑 / 開發驗證);md 為主 + FR-046 renderer 轉 docx 雙軌;pilot = 專案規劃頁 relates to FR-046(renderer 共用、GAI-SD-02/03/07 內容引用)
FR-048-2607-unified-auth-guard 2026-07-07 全站統一授權守門機制 — 收斂 4 套散落守門 helper 至 common/authz/(platform-admin / super-admin / project-role / capability / signed-token 五軸);補 B 族(系統設定僅 JWT)+ C 族(GRC 專案寫入裸奔)守門;瀏覽器原生 GET 免 bearer 端點走簽章短期 token。設計拍板前見 docs/analysis/2026-07-07-unified-auth-guard-design.md relates to FR-047(SEC 桶產出)/ FR-038 2B(flow_engine 守門復活)
FR-049 2026-07-18 問卷流程規則(跳題)補回 + 子題 Designer 接線 — 復刻 v1 goto 跳題語意(同題組跳題 + 跳一~多個題組,混合情境原生支援)、v2 flowRules 資料形狀、填答端可見性計算引擎;順手收 D-3a 子題兩處 FE 接線。四段完成 commit 未部署;來源側模型經 user 手測拍板推翻 → 由 FR-049.1 目標側重構取代(引擎/快照/子題接線保留) relates to site-regression bug 批次(D-3)
FR-049.1 2026-07-18 問卷顯示條件(目標側重構)— 跳題規則從「來源選項宣告目的地(goto_*)」翻轉為「目標題目/題組自宣告顯示條件(display_condition)」,解來源側四瑕疵(隱式副作用/漏網坑/零全局視圖/心智模型錯位);子題定為純排版附屬 + 母題卡直建入口。六決策全拍板見 design §2 FR-049 母案續作
FR-050 2026-07-18 稽核輪次階段回退(Stage Rollback)— 流程推進後可有條件返回上一步:僅相鄰上一步 / closed 不可退 / AR 已填保留+標記 / manager only + reason 必填 / UI 可見階段歷程時間軸(新表 round_stage_transitions,advance 也落)。副作用一律作廢標記不物理刪;BPMN 反向支援度為 plan 前提查證第一項。五決策見 design §2 relates to FR-038(round 狀態機 / stage_advance)
FR-051 2026-07-21 規劃階段推進前置檢核 — 規劃→下一階段(launch_audit)前跑兩項軟提醒(confirm 放行,非硬擋):A 本輪證據蒐集 job 未完成(reuse get_ap_dashboard 統計)/ B 流程模板 userTask main_role 未在專案參與人員指派(BpmnUtils 列角色 vs participant role)。復用既有 handler-warning→needsConfirmation→force 機制,聚合單一彌窗;兩頁(規劃/總覽)嵌 Banner 自動涵蓋。五決策見 design §1.1 relates to FR-038(stage_advance)/ FR-050(Banner);來源 Notion 母題 80ed + 子項 8020
FR-053-2607-round-scoped-jobs 2026-07-22 輪次隔離任務執行(覆核輪 job 實例化)— 根治「第二輪操作污染第一輪歷史」:job 全專案僅一批(project_start 生成一次),任務狀態/證據/聊天/問卷全掛 job 上被跨輪共用覆寫。三刀:① workflow_execution_control_mappinground_id(接線 truth 從 catalog AO props 轉移至 wecm,props 保留相容)② launch_reverify 對 narrowed scope(母輪 not_met)復用 _generate_prep_jobs 核心生成新輪 execution+job ③ 讀取端(control-tree/dashboard/匯出)按輪過濾+凍結輪範圍改讀本輪 AP reviewed_controls(拆 profile 共用潛伏雷)。AR/凍結 SSP/程序書已健康不動;資源庫(範本工廠層)不動;歷史資料不遷移(user 拍板後續全刪)。調查全文見 Notion case relates to FR-038(engagement 模型)/ FR-050(輪次);影響面僅專案執行層
FR-053.1-2607-reverify-clone-and-context 2026-07-23 覆核輪承襲與脈絡(FR-053 續作,user 手測後拍板)— ①task-execution/progress 統計補輪次(第 3 刀漏網 bug)②覆核輪任務 clone 上輪配置:指派/問卷綁定/設備綁定+證據 clone(新 row 同檔案帶「承襲自第 N 輪」標記)+問卷含填答 clone(同帶承襲標記),狀態一律 TODO 起手 ③控制樹「上輪未通過」badge+控制項卡上輪判定/缺失參照(規劃頁+稽核頁,讀母輪 AR)④查證覆核輪 job PROCESSING 起手根因(應 TODO)。設計原則:第一輪資料零觸碰(clone 只讀),承襲標記讓稽核員分清沿用 vs 新補 FR-053 母案續作
FR-051.2-2607-stage-advance-prechecks-expansion 2026-07-22 階段推進前置檢核擴展(FR-051 續作)— 軟提醒+log 備查模式擴到三個推進點:稽核計畫填寫(≥1 筆行程與方法)/ 稽核(所有稽核項目已回報,接 AO/task 完成度)/ 缺失改善(檢核待定義)。全軟阻擋 confirm 放行;比照 PlanningReadinessChecker 掛 stage_advance handler,考慮抽通用 checker 介面。尚未開工——等 FR-051 STG 驗收體感後走 brainstorm→design→plan。來源 Notion case 3a5346da-…-89f5 FR-051 母案續作;relates to FR-038(stage_advance)
FR-052 2026-07-21 雲端整合 Tab 顯示 gate — 專案規劃頁「雲端整合」tab(index 5)只在 tenant drive status==CONNECTED 時顯示,未連接直接隱藏(fail-closed)。FE v-if gate 末 tab(不影響前 index);狀態源 tenant get_status。BE 選項:reuse 既有 GET /integrations/google-drive(建議,零改)或新 /connected 端點(待 Step 0 拍板)。三決策見 design §1.1 relates to FR-016(Drive 整合)/ FR-042(storage scope);來源 Notion 80fd
FR-055-2607-survey-export 2026-07-23 問卷匯出(既有問卷內容匯出成 Excel 供再匯入)— 把已建立的問卷(題目/題型/選項/顯示條件等設定)匯出成與既有批次匯入樣板相容的 Excel,讓 user 匯出→修改→再匯入複製問卷。範圍待釐清:匯出欄位覆蓋度(FR-049.1 顯示條件等新結構能否被樣板格式承載)、跨租戶搬運情境、要不要含作答資料(傾向不含)。現況:只有空白匯入樣板下載(藏在批次匯入 Dialog 內)。尚未開工——等 user 下令走 brainstorm→design→plan relates to FR-049/FR-049.1(問卷結構);來源 Notion case 3a6346da-…-8026
FR-056 2026-07-26 檢測工具整合平台 — 租戶設定自家檢測工具(首接 OpenVAS,未來 Nessus/SonarQube)→ 任務設「檢測工具執行」+ 掃描參數 → 按開始 → 客戶端 Agent(FR-039 evidence-agent 擴充 executor)觸發掃描 → 報告自動回收成 job_evidences(source=DETECTION_TOOL,沿用 DRIVE_SYNC 模板)→ 發信通知 → 依完成模式 flag 自動完成/人工覆核。新 config schema 三表(detection_tools 目錄 / tenant_detection_tool_configs 加密憑證 / detection_tool_param_schemas 版更參數);派工走心跳夾帶待辦(D3);第一版只存報告不 parse findings(D4)。D1–D8 全拍板見 design.md §3。4 子需求 × 15 子任務分階段:.1 工具管理 config schema(地基)/ .2 任務類型+參數 / .3 Agent 派工+executor / .4 執行編排+證據+通知。討論稿 discussion.html relates to FR-039(Agent 認證鏈/心跳)/ FR-043·044(三層 adapter registry)/ FR-051(軟提醒);來源本 session brainstorm
FR-057 2026-07-28 OpenSCAP 掃描工具接入(SSH 連線型態)— FR-056 續作,新增第二個檢測工具 OpenSCAP(CIS/STIG 組態合規稽核)並開出 connector 第三種連線型態 SSHoscap-ssh 官方遠端模式:Agent 維持 Docker 作發起端,SSH 登入目標主機在其上原生執行 oscap、報告拉回)。目標主機前提=一次性裝 openscap-scanner+scap-security-guide+稽核帳號(Tenable 同款「同名專用掃描帳號」業界標準)。憑證=租戶層一組共用帳號(金鑰/密碼二擇一推薦金鑰 + sudo 提權),沿用既有加密鏈與 D9 派工下發。證據=每台一份 HTML 原樣上傳(多目標逐台掃),牽動 result 回收鏈單檔→多檔擴充(result_ref.upload_uids,向下相容)。D1–D7 全拍板見 design.md §2。3 子需求 × 8 子任務:.1 BE 地基(SSH 型態+seed+FE 欄位型態)/ .2 Agent connector / .3 多檔回收鏈(.2/.3 可並行)。討論稿 discussion.html relates to FR-056(檢測工具平台/connector 架構)/ FR-039(Agent);來源本 session brainstorm
FR-058 2026-07-30 檢測工具擴充(四工具接入)— FR-056/057 續作,一次接入 ZAP / InSpec·CINC / GCB / Nmap 四個工具,並補上平台唯一結構性缺口 任務層敏感參數param_schema 支援 secret: true:BE 存 tool_params 前 Fernet 加密、派工時解密下發、FE 執行紀錄與稽核 log 一律剝除;D1)。ZAP 走 API/daemon 客戶自備(D3),三種 scan_mode 預設被動加攻擊流量警語(D2),PDF 上傳 + JSON 僅記憶體解析雙格式(D4),對齊 zaproxy 0.6.0 與 2.17.0 警報去重語意,舊碼參考前同事 auto-pentest(可搬 API 序列 + 12 報告模板矩陣 + 四種登入認證;必丟 DDD 分層/自起容器/報告落地;必修硬編憑證/無取消無 timeout/Nashorn)。InSpec 選 CINC Auditor(Apache 2.0,非官方商業 binary;D5)、SSH+WinRM 雙 transport 一次到位(D6),吸收並結案 Notion CM-953(異質 OS 檢測;OpenSCAP 官方棄 Windows 已證實不可行)。GCB 不另立引擎複用 .2 connector,content 格式統一 InSpec profile(D8),本案只做引擎 + 一份 Windows 最小 Demo profile,驗收=鏈路可運作非規則覆蓋量,content 產製/後台更新機制/macOS 15 全排除,但 content 外部載入接口本案就要留(D7)。Nmap 為 CLI 型態首個使用者,NPSL 授權不 bundle 進 image,需先放寬 start_execution 零憑證誤擋(detection_tools 加「是否需要憑證」宣告欄位;D9)。橫向項 _TOOL_ID_TO_CODE 解耦(派工 payload 夾帶 tool code,消除三環境 seed id 錯一位就靜默跑錯工具;D11)最先做完。D1–D11 全拍板見 design.md §2(D10 隨 SonarQube 移出本案,編號保留不重排)。1 橫向項 + 5 子需求 × 20 子任務(Notion CM-957~983,27 張卡連號)。排程=分批出貨(2026-07-30 改版,ZAP 優先上線):第一批 ID 解耦+.0 敏感參數+.1 ZAP(CM-958~970,切平台側/agent 側兩 session 並行)→ 第二批 .2 InSpec→.3 GCB → 第三批 .4 Nmap;端到端測試留到各批結束才做一次(重建 agent image+部署三台+等 300 秒心跳才是真成本)。2026-07-31 追加 SonarQube 兩棒(同一個工具、兩種模式,非兩個工具).5 拉取快照(D13–D16,§4.6)——SonarQube Server 沒有任何觸發掃描的 Web API,故為平台首個 pull-snapshot 型工具,任務執行=拉最近一次分析結果組自包含 HTML(Community Build 無報告匯出,自組是必做非 fallback;issue 明細取前 200 條防 api/issues/search 一萬筆硬上限,統計走 facets/measures 全量)、憑證 base_url+user token(squ_sqp_/sqa_ analysis token 不能讀)、issue 解析 impacts[] 優先 fallback 舊 type+severity 相容 9.9 LTS~2026.x LTA、probe 陷阱=authentication/validate 匿名呼叫也回 valid:true 必須帶 header、seed 是 UPDATE 既有 id=3 佔位列非 INSERT(照 ON CONFLICT DO NOTHING 會靜默跳過);T-5.1~5.3(CM-995+)程式碼已完成 commit,UI 端到端驗收未做detection_executions 內 sonarqube 仍 0 筆)。.6 主動掃描(雛形)(D17–D24,§4.7)——決策者看到 .5 畫面後指出「要的是平台真的發動掃描」,是新需求不是 bug(D13 排除 agent 自跑 scanner 的前提是「沒有源碼」,本案補上該前提 + 收斂語言解掉「備不齊 build 環境」);D17 ZAP 式共存(同一張卡 + scan_mode 分流,非另立 tool code——GCB 式唯一優勢「憑證各自乾淨」不存在,實查兩模式共用同一組 config_field_schema 一字不改)、D18 只做 A 類純源碼 7 語言(Py/JS/TS/Go/PHP/Ruby/Kotlin;Java 送進來是硬失敗、C# 是靜默淺掃=零發現誤讀成很乾淨,故三件配套必做)、D19 公開 Git repo(0 新層;檔案上傳要動 FE 元件+upload 中繼+派工鏈路三層且 RemoteAgentAdapter 在 MINIO 租戶不存在)、D20 scanner 打進 image(zip 自帶 JRE 不裝 JDK;agent 無 docker CLI/socket,poetry.lockdocker 7.2.0 是 testcontainers 測試相依洩漏易誤判)、D21 一律加 Guidant-AI- 前綴D22 只做逾時 + 磁碟型 tmp 掃完即刪不可用 /dev/shm,那是 tmpfs 記憶體型)、D23 coverage 紅燈照實顯示D24 scan_mode 預設 scan(與 ZAP D2 預設被動方向相反是刻意的——代價量級不同:D2 是對外部系統送攻擊流量、本案是在客戶自有系統留一筆可刪紀錄;但預設指向不可回復側故事前告知升級為必做)。兩個官方文件確認的坑:①沒有 dry-run(每次掃描都是對客戶 server 寫入、專案不存在會自動建立)②掃完≠能讀EXECUTION SUCCESS 只代表上傳完成,須解析 report-task.txtceTaskId 輪詢 ce/task 脫離 IN_PROGRESS,否則拉到舊資料且不報錯;CE 顯示的處理時間不含排隊不能當 timeout 依據)。FE 硬編陷阱 JobExecutionDrawer.vue:308 _PRIMARY_PARAM_KEYS 需一併改(scan 模式下 Git URL 才是主要識別);模式值非法明確 raise 不靜默降級(照 zap.py:164-171)。拆 T-6.1 BE seed(param_schema v2 + setup_guide 改寫)/ T-6.2 agent(Dockerfile + scan 分支 + 輪詢 + tmp 清理)/ T-6.3 FE + 驗收.5 的 UI 驗收併入 T-6.3 一起做(決策者:「那版基本不能用了,先不測試,要等這版」)。討論稿 discussion.html(四工具母案)、discussion-sonarqube-scan-mode.html(.6 主動掃描) relates to FR-056(檢測工具平台/三表 schema)/ FR-057(connector 架構·SSH 型態·多檔回收·setup_guide)/ FR-039(Agent 心跳派工);吸收 Notion CM-953;來源本 session brainstorm
FR-059 2026-08-01 檢測工具 Profile / Content 庫(掃描設定檔後台管理)— 把掃描依據(profile / content)從「BE repo 版控+人工 rsync+migration seed 選項」四步人工鏈搬進後台管理:上傳(file)/ 登記(url)雙軌(P5,URL 憑證一概不管)、SYSTEM 公用版+TENANT 租戶自有雙軌(Category C 模式照抄 flow_templates)、version+is_current 單現行版(P4)、任務下拉動態化(param_schema 加 options_source: "profile_library" 宣告,FE 零改即可為未來工具接庫)、agent 動態拉檔+cache(/data/content/cache/<uid>/v<version>/,sha256 對帳)。即 Notion CM-992 範圍③「後台 content 管理機制」的立案,做完同時消掉封閉網路投放與私有版本庫憑證兩限制。第一期只做形態 A(inspec+gcb,P1);新表 config.detection_tool_profiles(D1,config schema RLS 有 tenant_detection_tool_configs 前例非首例);庫參照下發格式 profile:<uid> 顯式前綴、派工展開 _profile(D2);上傳收 zip / tar / tar.gz / tgz 四格式、50MB、tarfile+zipfile streaming 防 slip/bomb、agent 端統一解壓成目錄餵 cinc-auditor(D4 決策者修訂版);只驗結構+檔案安全、正確性由掃描結果反映(D8);8 支 TWGCB(file 型)+dev-sec 2 條(url 型)搬遷 seed 上線第一天下拉零回歸(P3/D7);舊路(bind mount+靜態 options)過渡一版退役(D5);agent 取檔復用 FR-058.7 通道、授權 resolver 分流 source_file / profile_ref 兩 claim(P2/D6,resolver 可插拔介面須在 058.7 開工前談定寫進其 T-7.1)。P1–P7 + D1–D10 共 17 項全拍板見 design.md §3。4 子需求 × 12 子任務:.1 BE 地基(表+RLS / API+守門 / 上傳驗證管線 / 搬遷 seed)→ .2 下發整合(宣告升版 / 派工展開 / profile_ref resolver)∥ .4 FE(管理頁 / 下拉動態化)→ .3 Agent 端(cache+拉檔+sha256 / 目錄交付 / 封閉網路驗證,硬依賴 058.7 通道)。Notion 開卡待 058.7 開卡完成後接續(避免 Case No 跳號)。討論稿 discussion.html relates to FR-058(母脈絡)/ FR-058.7(agent 取檔通道依賴,先行)/ FR-039(agent 安全基建與 sha256 信任根不變式);承接 Notion CM-992 範圍③
FR-060 2026-08-03 檢測基準內容管理(Detection Profile Content Management)— 設計定案,待實作。FR-059 把 profile 檔搬進後台,但平台仍把它當不透明二進位檔,使用者在下拉只看得到一個名字:實跑 TWGCB-01-014 抽取得 234 條控制項,其中 199 條是 impact 0.0 人工待判項(執行時直接 skip)、真正自動檢查只有 35 條、覆蓋率 15%——使用者要等報告出來才知道,等於白等一輪掃描。三個需求:①瀏覽 profile 檢驗內容(核心,選擇「之前」就看得到要驗什麼)②修改基本資料含改名(現況改不動,名稱參與唯一索引,唯一改名途徑是 fork 複製)③分類體系(CINC 不只 OS 連瀏覽器都有,profile 一多下拉會選錯)。核心是主從拆表detection_profiles 主檔(名稱/描述/分類三軸/scope/工具/is_active)+ detection_profile_versions 從檔(來源檔/sha256/version/is_current/supports/extraction_status)+ detection_profile_controls 控制項(一條一列,FR-061 豁免要能以外鍵綁單條控制項,這是最不可逆的決定)。現在是最便宜的時機——DEV 僅 13 筆(10 SYSTEM/3 TENANT)、FR-059 上線才兩天。D1–D19 全拍板見 design.md §3;D5 於 2026-08-03 二度裁示定案:分類 enum 存 DB 由 root 維護(推翻原「FE 寫死」建議),但多語不落庫——DB 只存 key、顯示由前端 i18n 翻譯不另開翻譯表,代價是新 key 未補前端翻譯前以原始 slug 顯示(優雅降級,須寫進 spec 免被誤認為 bug)。四項不可逆決策:D4 uid 由從檔逐列沿用(10 筆凍結契約 soft-ref 零轉換)/ D12+D19 controls 表跨格式形狀(正規欄最小集合+attributes jsonb+extraction_format·origin 雙標記,嚴重度欄不叫 impact 免第二個工具進來要改上線表)/ D2 is_current 布林+partial unique index(不用 FK 當唯一性保證oscal.frameworks 走過該路且官方已認錯廢棄)/ D3 從檔自掛 RLS 冗餘欄(PostgreSQL 不沿外鍵繼承,file_id 洩漏搭 FR-058.7 取檔通道=實質檔案越權路徑;本專案首例主從雙表 RLS 無前例可抄)。🔴 兩處派工鏈破口(原以為零影響,實 grep 推翻):_load_profile()is_active 守門拆表後在主檔,從檔 entity 有屬性但預設 None 則 None is False 為假 → 守門靜默失效、已停用 profile 照樣派得出去(無聲授權漏洞,比 500 更糟);_humanize_profile_param()getattr(profile,"name",None) 有 default 不報錯,只讓通知信「掃描設定」靜默退化成 profile:<uuid> 且無任何測試會抓到——解法為 domain service 新增 get_version_with_profile(uid) 合成 entity。抽取落點=BE 主機裝 CINC Auditor(⚖️ 授權紅線 Apache 2.0,絕不可換官方 InSpec 6+ 商業 binary 或 inspec-core gem,均受 Chef EULA;275MB/三台部署機+每台開發機都要裝/路徑走 CINC_AUDITOR_CMD 比照 LibreOffice 慣例不硬編);抽取必非同步(234 條 28–29 秒/708 條 117 秒,遠超任何 HTTP 逾時),走 D19 抽取器註冊表骨架(依 profile_format 取 extractor,本期只實作 InSpec);失敗判定 exit != 0 controls == []——第七種錯誤形狀是 Ruby 語法錯導致 exit 0/stderr 全空/JSON 合法但零控制項,只看 exit code 會變無人察覺的資料缺漏。3 子需求:.1 資料模型(拆表+13 筆三段式搬遷+RLS 兩表八段+派工鏈破口修補,地基必先行)→ .2 分類與編輯(含 D5 改存 DB 新增的 enum 表/刪除保護/root 維護介面)∥ .3 抽取與瀏覽。🔴 遷移三大陷阱:搬遷 JOIN 必 (tool_id, tenant_id, name) 三欄(少一欄 id 32/33 會 cross join)/app_tenant_allowed_for_session(integer) 只接 integer 而 tenant_id 是 bigint → 八處都要 tenant_id::integer/id 33 搬遷後是 current_version_id IS NULL 的合法狀態(驗證預期 12 筆非 13)。環境紀律:開發期只套 DEVSTG 已服役(10 筆全 SYSTEM 無 TENANT)→ 🔴「STG 跑得順」不能當驗收依據(測不到租戶 RLS 路徑/32·33 三欄 JOIN 陷阱/孤兒主檔),驗收必須在 DEV;POC 等同 production,STG/POC 均需決策者當次明示放行。舊表只 rename 為 _deprecated_20260803 不 DROP(觀察期後另案)。討論稿 discussion.md relates to FR-059(profile 庫母脈絡,直接續作)/ FR-058(檢測工具平台·param_schema 宣告機制)/ FR-058.7(agent 取檔通道,RLS 越權路徑相關)/ FR-039(sha256 信任根);後續 FR-061(選用範圍/豁免/人工判定/自訂項,本案只定模型契約見 design.md §6)
FR-062 2026-08-08 License 控管機制 — 設計定稿,待實作。Guidant AI 上線銷售前的授權地基:公司內部自建簽發端(獨立極簡 Flask 應用+CLI 共用同一 Ed25519 簽章引擎、獨立 repo 獨立 DB、部署內部不對外;不採 Keygen 等外部 license server)、產品端驗章執法(公鑰列表 kid 查表編譯進後端、時鐘回撥防護)、按功能模組授權(沿用 capability.resource_type,基礎包 21 模組+4 加值包,Plan 與分層皆為簽發端 plans 表資料非寫死)、可組態到期管線(notify 30 → grace 14 → readonly 終態、lockout 預設關,整組 expiry_policy 簽進照內、產品端零天數設定)、序號開通(離線先行/線上後續兩張 case)與機器指紋綁定、補發換綁、kid 金鑰輪替。照型態只有 formal / trial / extension(過渡照機制刪除,上線 migration 直接為既有租戶發正常照、執法第一天全量生效無特例分支);升級 Plan=換發新照立即生效;子租戶上限預設 5。執法走 common/authz 第六軸+唯讀 gate(全域攔寫入、登入/上傳照豁免)+任務型態與選單過濾+環境總開關;順帶補 api/grc/api/project 零守門技術債、退役 TENANT_ADMIN_EXCLUDED_RESOURCE_TYPES。D1–D15 全定案見 design.md §2;8 子需求(FR-062.1–.8)× 28 子任務見 design.md §5。2026-08-10 驗收回饋追加 FR-062.8:角色權限矩陣缺 license 維度(ui-routes 無授權標記/roles 寫入端零檢查/provisioning 未扣未授權模組),未購買模組的能力點看得到也勾得下去且真的入庫,採業界 show-and-disable(反灰+原因)、存量走 evaluate-time 抑制不刪權限資料(存量項最終定案為反灰空框、差異只留 tooltip,不用假勾勾表達),另含選單結構調整(/license/manage 改由 is_platform capability 表達平台專屬、取代 BE 與 FE 兩份硬編 url 清單;License 兩頁獨立為「授權管理」群組 sort=45;關閉未完成的自定義儀表板入口),× 5 子任務(T-8.1~T-8.5,Notion CM-1166~1171)。討論稿 discussion.md relates to FR-048(authz 五軸→六軸)/ FR-054(租戶生命週期·子租戶額度)
FR-054-2607-tenant-lifecycle-delegation 2026-07-23 租戶生命週期與管理權下放(經銷商模式)— 五決策已拍板:①租戶 CRUD 全下放子樹管理員(限自己子樹;建 root 仍限 platform admin)②守門沿用 tenant.create/update/delete capability(拔 route 層 @require_platform_admin_route 硬門檻;DB RLS 已支援子樹判定不用動)③刪除改軟刪除(tenants 加 deleted_at;擋登入/選單過濾;空租戶保留硬刪;保留期清除排程後做)④同名策略=唯一性只算活租戶(partial unique:name WHERE deleted_at IS NULL;恢復時重新查重)⑤復原機制=獨立「已刪除」清單顯式 restore(絕不同名自動接舊資料,防跨客戶資料洩漏)+新增時善意提示;另含一條龍最後一哩:建租戶表單選填管理員 email → 自動 add_user 綁 System Manager 角色(寄密碼信)。涉 jedi-auth 套件異動(delete/查重/軟刪在套件內)。設計輸入補充(2026-07-24):①CM-860 遺留的硬刪 RLS+cascade 500 併入本 FR(軟刪上線即繞過,不另深查)②一條龍 provisioning 必 seed 部門+角色 × tenants FK RESTRICT → 每個正常租戶天生不可硬刪,「刪除」形同虛設——加重軟刪除優先度。尚未開工——等 user 下令走 brainstorm→design→plan;第一段緊急修(POST /tenant 下放)已由 Notion bug-loop 先行處理,見 Notion case 3a6346da-…-8056 relates to FR-048(authz 五軸);來源 Notion case 3a6346da-4cd0-8056
FR-063-2608-nuitka-packaging 2026-08-14 落地版程式碼保護:Nuitka 編譯打包(Linux 容器版)— 三階段戰線第一段(FR-063 編譯 → FR-064 防竄改 → FR-065 Installer)。採 Nuitka standalone 編譯為機器碼 binary 包成 Linux Docker image 交付(取代 .pyc 方案),本階段只做 Linux 容器版、另開 production Dockerfile(現有 Dockerfile 為 E2E 專用不可疊改)。2026-08-13 STG 實測:冷 build 1h27m / 產物 808MB,import 期炸 dependency_injector(Cython 與 Nuitka 靜態環境不相容)。清障項:私房 wheel(CYTHON_PEP489_MULTI_PHASE_INIT=0)、DI auto-scan 改 build 期靜態模組清單、eventlet/WeasyPrint 逐雷排除。Notion CM-1187。設計定案 2026-08-14,見 design.md relates to FR-062(License Center)
FR-064-2608-tamper-detection 2026-08-14 落地版程式碼保護:防竄改偵測與授權鎖定 — 三階段第二段,依賴 FR-063 產物。Build 期逐檔 SHA-256 manifest 以原廠私鑰簽章(復用 FR-062 License Center 簽發體系,不另建 PKI);啟動驗章+逐檔比對與 license 驗證共用同一 code path;runtime APScheduler 低頻抽查;偵測竄改 → tamper 雙落點 + exit + 之後啟動一律拒絕,唯一解鎖路徑=原廠一次性 unlock token。已知限制已對齊:目標是拉高成本 + 留蓄意痕跡,B2B 法律層是真實防線。Notion CM-1188。設計定案 2026-08-15,見 design.md relates to FR-062(License Center)/ FR-063(編譯產物)
FR-065-2608-onprem-installer 2026-08-14 落地版 Installer(安裝器與交付流程)— 三階段第三段,依賴 FR-063(image 產物)與 FR-064(簽章/license 機制)。目標:客戶端落地安裝標準化,不依賴原廠工程師手動部署。2026-08-16 設計定案(D1–D12,餘 D11.3/D11.5/D13 開放):full-stack compose(PG/Redis 全包+FE production image nginx 同源反代)、docker save bundle+digest 驗證、分段 SQL+one-shot init 容器建庫、純 bash install.sh+Web 設定精靈(setup token+建 admin+指紋展示+license 匯入)、--upgrade 四步與回滾、PROD 簽章鑰、K8s 預留;Windows 僅出評估文件。見 design.md。Notion CM-1189 relates to FR-063(image 產物)/ FR-064(簽章機制)
FR-066 2026-08-18 檢測 Agent 原生安裝包 — 把檢測 Agent(evidence-agent)從 docker 三容器出貨改為 Nuitka 編譯+外部工具全包的一顆 tarballinstall.sh 一鍵安裝為 Linux systemd 服務。動機:agent 本職是量測宿主機,指紋(product_uuid / machine-id / MAC)容器內讀不到或會漂移,業界同類(Nessus/Qualys/Wazuh)皆原生交付。D1–D9 全拍板:D1 Nuitka standalone→tarball→systemd(排除 onefile);D2 agent-db(postgres:16)退役換 SQLite(僅 jedi-file-upload 一張表);D3 外部工具全包一顆(CINC ~275MB/sonar-scanner+JRE/LibreOffice+fonts-noto-cjk/xsltproc/git,~1GB+ 已接受,封閉網路完全自足;ZAP/OpenVAS/OpenSCAP/Nmap 引擎不 bundle);D4 agent 自起 TLS 8443 砍 nginx sidecar;D5 systemd EnvironmentFile+互動問答三題、客戶側 mTLS 全自動零 openssl;D6 build 期 manifest 簽章+啟動驗章(複用 FR-064 泛用層加 agent_manifest type,不做 runtime 全家桶);D7 升級回滾=versions/ 目錄+symlink 切換(無 pg_dump 備份模型);D8 Windows 只出評估文件;D9 指紋 Linux 原生直讀、廢 collect-host-id.sh、不預抽 OS 抽象層。開放查證 Q1–Q4(LibreOffice 離線化形式/PG 方言掃描/EXCLUDE 名單重評/openscap-utils 殘留)。4 子需求 × 11 子任務串行:.1 Nuitka build 管線與程式改造(SQLite 化/version bake/resource_path/指紋直讀)→ .2 tarball 打包+工具 bundle+簽章 → .3 install.sh 七步+systemd+upgrade/rollback+維運子命令 → .4 乾淨機真機+封閉網路驗收+客戶手冊+Windows 評估。標的 repo:evidence-agent。見 design.md、討論稿 discussion.html relates to FR-063(Nuitka build 管線)/ FR-064(簽章泛用層)/ FR-065(install.sh 結構)/ FR-039(evidence-agent 本體)
FR-067 2026-08-23 檢測多 Agent 分派(Detection Multi-Agent Dispatch)— 設計定案,待拆卡。檢測任務可設定多組「哪台 agent 掃哪些目標」(assignment),一次執行展開 N 張工單同時派給多台、各掃自己的網段,全部回報完才算完成,報告與通知彙總呈現。動機:現況 _pick_agent 挑機無序且不驗在線(挑中離線機工單永遠 pending 卡死),客戶多網段環境(辦公網/機房網/DMZ 各一台 agent)無處指定「這批目標給哪台」。D1–D9 全拍板(2026-08-23):D1 模型 B(展開 N 筆 detection_executions 維持與 agent_tasks 1:1,上加 detection_execution_groups 彙總層——1:1 是回報鏈/報告反查/FE 渲染的大量隱含依賴,原地保留);D2 assignment 存新子表 job_execution_detection_tool_agents(每列有 uid 可單列 CRUD/按列稽核/兩入口併發不互蓋,支撐未來中心 UI 與我的任務頁調整兩場景;排除 tool_params JSONB 內陣列——無列身分且會整份快照進 agent_tasks.params 漏到執行紀錄);D3 執行前逐台驗證(存在/enabled/未 revoke/有能力/在線)任一不過整次 400 列全部不合格機;D4 彙總=全成 succeeded/任一敗無跑 partial_failed/全敗 failed/cancelled 比照 failed;D5 auto 完成=group 全 succeeded 才 complete_job(partial 留人工),順修「多筆各觸發撞 409→agent 收 5xx」地雷(收口 group 列鎖);D6 通知改 group 收口一封彙總(每 assignment 一列);D7 整組啟動+單組重跑+單組/整組取消(user 修訂比討論稿多單組操作;重跑=同 group 追加新 execution、彙總以每 assignment 最新一筆計;單組首次啟動第一版不做);D8 不做存量 backfill(開發階段資料會重置;無 assignment 時 fallback 自動挑一台健康的保留);D9 四項地基併入(remote-agents 補 capabilities+在線+過濾/執行紀錄 enrich agent 名/test_connection 對齊/_pick_agent 濾離線)。Agent 端(evidence-agent)零改動。6 子需求 × 14 子任務:.1 地基 ∥ .2 資料層 → .3 綁定設置 / .4 展開收口 → .5 彙總呈現與通知 → .6 收尾。見 design.md、討論稿 discussion.md relates to FR-056(檢測工具平台)/ FR-058(檢測執行/工單模型)/ FR-039(evidence-agent 心跳領單)
FR-068 2026-08-25 系統 Log 轉發(Log Forwarding)— 已上線(v1.17.0)。系統 log 可於 UI 設定轉發到客戶自有 log server(ELK/Graylog/rsyslog)。D1–D6 拍板(2026-08-25):D1 協定 Syslog(RFC 5424,UDP/TCP)+GELF 兩種(三家最大公約數;排除各家專屬 API);D2 範圍=應用 log+稽核事件兩流分開勾選(合規客戶接 SIEM 要的是稽核事件);D3 系統層全域一份、表帶可空 tenant_id 預留租戶層;D4 轉發失敗不拖垮主服務(QueueHandler 旁路+靜默降級);D5 第一版不過濾敏感內容、預留遮罩 pipeline 掛點與 UI 開關位;D6 熱生效+測試按鈕。agent log 轉發本案不做(未來另案)。3 子任務:T-1 BE(表+CRUD+handler 鏈)→ T-2 FE 設定頁 → T-3 手冊三家對接範例,另 T-4/T-5 出版與 188/189 升級、四筆修正(syslog 不合 RFC 5424/license 誤標未授權/遮罩開關隱藏)皆已 Done。見 站台索引design.md relates to 稽核事件埋點(reference_audit_event_logging_pattern)/ FR-065(落地版場景)

前 13 個(FR-001 ~ FR-013)的提出月份為推估值:它們同屬 2026-04-01 一次性 docs/ 目錄重組 commit(a098cfa5)遷入,無精確日期,月份依文件內部日期 + 邏輯分組推得。