本文是派工單,不是交接文件。 兩個實作 session 各讀自己那一段即可,不必全讀。 協調者以短 prompt 指向本文對應章節派發,見 §5。
| 項目 | 內容 |
|---|---|
| 範圍 | FR-058.3 GCB — T-3.1(seed)/ T-3.2(文件)/ T-3.3(Demo profile) |
| Notion | CM-976(子需求母卡)→ CM-977 / CM-978 / CM-979 |
| Branch | 三 repo 皆 feature/FR-058,不切 branch、不 push |
| 前置 gate | ✅ 已通過——InSpec / CINC run() 實機驗收 2026-07-31 完成(見 §1) |
| Session 切分 | 兩個 session:A = T-3.1 + T-3.2,B = T-3.3(理由見 §5.1) |
docs/features/FR-058-2607-detection-tools-expansion/design.md
scripts/sql/2026-07-30-fr058-6-inspec-seed.sqlevidence-agent/core/task_executor_connectors/inspec.pyD7 原要求「content 不可硬編、必須可從外部載入」,原規劃 T-3.2 要做一層載入接口。 已裁示不做抽象層——CINC 原生支援三種 content 來源(Git URL / 本機路徑 / Supermarket), 而 params.profile 是直接進 cinc-auditor exec 的 argv,外部載入能力本來就在, 另做一層抽象只是把 CINC 的能力再包一次。
今日實跑驗證的結論(直接採信,不要重驗):
git 查 default branchgit,導致 Errno::ENOENT;已於 agent commit 6d1a4fc 補裝, DEV 現跑 0.2.17,容器內 git 2.47.3dev-sec/linux-baseline 對 151(Linux/SSH)pass 131 / fail 60 / error 0 / n/a 2; dev-sec/windows-baseline 對 160(Windows/WinRM)pass 300 / fail 472 / error 0 / n/a 122所以 T-3.2 只剩「把這個結論寫成文件」——不需寫 code、不需重驗。
UI 名稱 InSpec / CINC Auditor → CINC Auditor。決策者 2026-07-31 拍板,理由: ① 客戶/稽核方看到 InSpec 會問「這要授權嗎」——名稱製造了它自己要闢謠的問題; ② InSpec 是 Progress 商標(CINC 專案本身就是因商標才改名)。
對本單的影響:seed 與 setup_guide 裡使用者可見的引擎名稱一律寫「CINC Auditor」; 描述相容性時可寫「相容 InSpec profile 格式」(合法的描述性使用)。 內部識別碼 code='inspec'、檔名 inspec.py 一律不動。
現況:InSpec 的 param_schema.profile 是純文字(type: "text"),使用者得自己貼網址。 已上線的 OpenSCAP 早就用 select_or_text(下拉給預設選項 + 允許自行輸入), FE 元件 DetectionConfigField 已支援此型態——FE 與 agent 零改動。
要做的是把 InSpec 與 GCB 的 profile 欄位都改成 select_or_text:
| 層 | 內容 |
|---|---|
| 下拉選項 | 我方預置的已知可用 content:dev-sec linux-baseline / windows-baseline,以及 T-3.3 產出的 GCB Demo profile |
| 自行輸入 | 客戶自備的 Git repo / 本機路徑 / Supermarket 名稱——維持現有彈性,一個都不減 |
⚠️ 選項的網址形式要實跑驗證後才定案:git 已裝所以兩種都能跑, 但建議下拉選項用 tarball 形式(.../archive/refs/heads/master.tar.gz),少一個外部相依與故障點。 實跑比較兩種形式再決定,不要憑猜。
新增 migration(先 ls scripts/sql/ | grep fr058 確認流水號——目前已到 fr058-9, 另一 session 的改名單可能已佔用 fr058-10):
code='gcb'、connection_type='SSH'、status='available'、 requires_credentials=TRUE、requires_target_host=TRUEconfig_field_schema 與 credential_group_schema 直接對照 inspec 那筆 ——GCB 是 credential_group_schema 的第二個使用者(SSH 給 Linux 目標、WinRM 給 Windows 目標)param_schema:hosts / transport / profile(select_or_text,選項含 T-3.3 的 GCB Demo profile) / timeout_secsetup_guide:目標主機準備(比照 inspec 的 SSH / WinRM 兩段)、 明確寫「本工具的檢測引擎為 CINC Auditor(Apache 2.0)」、 Windows 政策區與 tattoo settings 警語、GCB content 的來源與限制說明param_schema.profile 也改成 select_or_text(§1 事實③)SQL migration 鐵則:檔頭 -- Date:、每語句加日期註解、收尾 INSERT public.schema_migrations
三環境都套(DEV / STG / POC,連線資訊見 CLAUDE.md「DB 環境清單」段,密碼查 .env 的 DB_SECRET): psql --single-transaction -v ON_ERROR_STOP=1 -f <檔> 用 cmmgr,套完各 SELECT 確認
agent factory 要不要動?先查再說——GCB 走 code='gcb' 但要複用 inspec connector。 grep evidence-agent/core/task_executor_connectors/ 的 factory(get_connector 依 code 取), 確認 code → connector 的對應處;若需要加一筆 gcb → InspecConnector 映射就加 (這是 agent repo 的改動,要另外 commit)。 D11 已把 factory 改為依 code 取,不要回頭加硬編 id 映射。
驗收:設定頁出現 GCB、任務可選 GCB 並指定目標與 content。
不寫 code。 把 §1 事實① 的驗證結論寫成文件:
design.md §4.4 的 content 外部載入段(或加一個小節),寫明: 三種來源、裸 GitHub URL 走 git fetcher(有實跑佐證)、agent image 已補裝 git、 更換 content 不需重建 image 也不需改 connector(D7 的約束已滿足)params.profile 是非 secret 純文字欄位,沒地方放 token⚠️ 文件類工作要分段寫檔:先 Write 骨架再多次 Edit,不要一次寫完整份 (本專案已三次遇到一次寫大檔時 API 中斷)。
前置:Session A 的 T-3.1 已完成並經協調者放行(profile 下拉選項需含本棒產出的 Demo profile 路徑, 若順序上有相依,回報協調者協調)。
一份 Windows 最小 Demo profile(InSpec profile 格式,Ruby DSL):
HKLM\Software\Policies 正規政策區——避開 tattoo settings 陷阱: 非政策區的設定在套用前不會被清空、會殘留舊值,讀到殘留值會誤判為通過,稽核情境屬嚴重問題params.profile 指向——放哪裡要先想清楚並在回報中說明你的選擇與理由🔴 驗收要看統計數字,不要看到「有證據進池」就算過——報告結構不符時會統計全零但證據照常上傳 (這是刻意的容錯,也是本案最不明顯的陷阱)。
| 項目 | 值 |
|---|---|
| DEV agent | 192.168.50.123,容器名 deploy-guidant-ai-agent-1,目前 0.2.17(含 CINC + git + xsltproc) |
| 測試目標(Linux) | 192.168.50.151——audit-scan 帳號已設 NOPASSWD sudo |
| 測試目標(Windows) | 192.168.50.160——WinRM 憑證已在設定頁 |
| BE | 本機 port 8000(main_app.py;main_socketio.py 是 socket 8002 不是 API 入口);重啟必先 kill -9 |
| agent 測試 | 必帶 PYTHONPATH=.(repo 缺 conftest.py),基線 407 passed, 1 skipped |
feature/FR-058,不切 branch、不 pushgit add 檔名,禁 -am——BE working tree 有 CLAUDE.md / .claude/skills/... 兩個無關 modified 與一批 untracked docs,絕不可帶進feat(cm-977): / docs(cm-978): / feat(cm-979): 開頭中文說明, 結尾帶 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>| 棒 | 要回報什麼 |
|---|---|
| T-3.1 | migration 檔名與流水號;三環境套用結果(各環境 SELECT 出的 gcb 那列);factory 是否需改(查證結果);profile 下拉選項的最終形式與實跑比較依據;commit hash |
| T-3.2 | 文件改動落點、寫了哪幾段、commit hash |
| T-3.3 | Demo profile 選了哪個基準項目與理由(如何確認在政策區);放置位置與理由;端到端實跑的 summary 實際統計數字;commit hash |
| Session | 內容 | 理由 |
|---|---|---|
| A | T-3.1 + T-3.2 | 兩者共用同一批脈絡——T-3.1 的 setup_guide 要寫 content 來源說明,T-3.2 正是把那份說明寫進 design.md。同一個 session 做,第二棒幾乎零額外理解成本。兩棒都不重、合計仍在單 session 舒適範圍 |
| B | T-3.3 | 性質不同:要寫 Ruby DSL、查 Windows 政策區註冊表項目、跑端到端實測。與 A 的 SQL / 文件工作沒有共用脈絡,混在一起只會讓 context 變雜 |
不建議三棒一個 session:T-3.3 的實跑除錯可能拉很長(Windows 政策區選題若踩到 tattoo settings 要重挑), context 爆掉會連累前兩棒已完成的脈絡。
Session A:
接手 FR-058.3 GCB 的 T-3.1(seed)+ T-3.2(文件)兩棒。
派工單:docs/features/FR-058-2607-detection-tools-expansion/handoff/2026-07-31-fr058-batch4-gcb-dispatch.md
先讀該文的 §0 必讀、§1 三個既成事實、§2(你的工作內容)、§4(共通環境與鐵則)。
§3 是另一個 session 的工作,不用讀。
T-3.1 做完先停下回報,等放行才做 T-3.2。
Session B(等 A 的 T-3.1 放行後才派):
接手 FR-058.3 GCB 的 T-3.3——Windows 最小 Demo profile。
派工單:docs/features/FR-058-2607-detection-tools-expansion/handoff/2026-07-31-fr058-batch4-gcb-dispatch.md
先讀該文的 §0 必讀、§1 三個既成事實、§3(你的工作內容)、§4(共通環境與鐵則)。
§2 是另一個 session 已完成的工作,需要時再看。
做完停下回報,不要自動往收尾跑。
T-3.1 完成 → 協調者抽查(三環境 DB gcb 那列、profile 欄位確實變 select_or_text、factory 查證結果)
↓ 放行
T-3.2 完成 → 協調者抽查(design.md 實際內容)
↓ 放行(此時可派 Session B)
T-3.3 完成 → 協調者抽查(Demo profile 的註冊表路徑真在政策區、實跑 summary 統計數字非零)
↓
GCB 三棒收口 → 全案最終端到端驗收(§4.3 of 交接文件)