FR-066 檢測 Agent 原生安裝包 — STATE(living,只描述此刻)

這份是 living 檔:每棒就地 Edit,只描述「此刻」。歷史脈絡與決策軌跡見同資料夾 FR-066-LOG.md

項目
最後更新 2026-08-23(全案收口:母卡 CM-1284 收 Done;FR-065 側 1246/1264/1275 同日收。本檔轉歷史紀錄,下一戰線=v1.16.0→PROD 鑰→189 遷移,接手讀 §3)
branch evidence-agent feature/FR-066(主要 code 標的)/BE+FE feature/FR-066(文件+.6 起含主產品修正:1331 守門/1333 恢復預設)
母案卡 CM-1284(Done,2026-08-23 收口
子需求卡 1285(.1,Done)/1286(.2,修正待驗證)/1287(.3,修正待驗證)/1288(.4,In progress)/1318(.5,暫緩)/1323(.6,Done
.6 系卡 1324~1328/1330~1335 全 Done(決策者 2026-08-22 裁示 .6 通過);1329(web 下發,等 PM,Not started)
早期追加卡 1303/1304(第二棒);1305~1309(第三棒,皆完成);1316/1317(真機三缺口,修正待驗證)
.4 系卡 1298(T-4.1,暫緩——隨 D16 原生凍結)/1299(T-4.2 手冊,範圍改 compose 為主)/1300(T-4.3 Windows 評估,修正待驗證,首腦已親驗合格)
Notion CLI python3 scripts/notion_case.py get/status/append/query(在 BE repo 跑;見 memory reference_notion_case_cli)
接手前必讀 §0 讀序

🧭 原始需求 / WHY

這節寫一次,之後各棒不動(需求改案要在 LOG 記一筆)。

  • 要解決什麼:檢測 Agent(evidence-agent repo,v0.2.27)目前以 docker 三容器(agent+agent-db postgres+nginx mTLS sidecar)出貨,但 agent 的本職是量測宿主機——機器指紋(/sys/class/dmi/id/product_uuid/etc/machine-id、主網卡 MAC)在容器內讀不到或會漂移(已發生 Debian base image machine-id 空檔退回隨機 MAC 的指紋漂移事故),現行靠 deploy/collect-host-id.sh workaround 硬撐。業界同類(Nessus / Qualys / Wazuh / Datadog Agent)全部原生套件+systemd 交付——貼宿主量測的產品,原生安裝就是行規。
  • 目標模型:agent 改 Nuitka standalone 編譯(原始碼不可見)+外部檢測工具(CINC / sonar-scanner / LibreOffice+中文字型…)全包一顆 tarball(~1GB+,已接受),install.sh 一鍵裝成 Linux systemd 服務;封閉網路(既定支援情境)離線完全自足。SQLite 取代 agent-db、agent 自起 TLS 取代 nginx sidecar、build 期 manifest 簽章+啟動驗章(FR-064 泛用層瘦身複用)。
  • Windows 不實作,只出評估文件與前提清單(D8;附錄有 2026-08-18 口頭初判,非定案)。
  • 戰線位置:落地版交付三部曲(FR-063 編譯/FR-064 防竄改/FR-065 installer,皆已收)之後的獨立新戰線——FR-065 期間決策者裁定「agent 安裝包另起新 FR、非 docker」,即本案。與 FR-065 殘項(PROD 鑰/T-4.2/收尾)無依賴,可平行。

角色定位

本 arc 首腦 session=分析決策/協調:需求釐清、拍板、拆卡、派工單、親驗抽查(不信 runner 自報)。實作全走 runner session——派工只給卡號+一句話,內容都在卡裡。push 永遠 user 本人做

§0 接手讀序

0.1 🔒 先懂需求 gate(全讀,讀完才能碰任何東西)

  1. 本檔 🧭 WHY 節+ §2 已定裁示
  2. docs/features/FR-066-2608-agent-native-installer/design.md §2(分工概述)+§3(D1–D9 決策表)+§6(拆分表與 Q1–Q4 歸屬)全讀;要細節再開 §4/§5
  3. notion-fetch CM-1284+要派的對應子卡

0.2 現況與待辦

  1. 本檔 §1 當前狀態、§3 下一步
  2. FR-066-LOG.md 最後 2 個 block

0.3 ✅ 冷接自檢(答不出來回 0.1,不要碰任何東西)

  1. 為什麼 agent 不能繼續用 docker 交付?(指紋量測在容器內讀不到/漂移+業界行規)
  2. D3 為什麼外部工具全包一顆 tarball、不做分層附加包?(封閉網路漏帶無法補救)
  3. SQLite 檔為什麼落資料目錄、不能放版本目錄?(D7 升級=切 symlink,資料要跨版本存活)
  4. 本案改 code 的 repo 是哪個?(evidence-agent,不是 BE——BE 只放文件)

§1 當前狀態(2026-08-22 晚,第八棒)

D16 拍板:原生 tarball 暫不出貨、出貨一律 compose 版。.6 全系(1323~1328/1330~1335)收 Done;T-4.3 Windows 評估完成(1300 修正待驗證,首腦已親驗);T-4.1 隨 D16 暫緩。

面向 實況
BE repo HEAD 4d172cae(CM-1300 Windows 評估文件),branch feature/FR-066領先 origin(4d172cae+design/STATE/LOG 更新待 commit/push)
FE repo HEAD 1143e37(CM-1333 恢復按鈕),feature/FR-066 與 origin 同步;工作樹乾淨
evidence-agent HEAD a89a701(CM-1335 交付包收斂一顆,已 push),feature/FR-066 與 origin 同步
Notion 卡狀態 In progress:CM-1284(母)、1288(.4)/修正待驗證:1286、1287(子需求,等總複測)、1293~1297(.2/.3 實作)、1316、1317、1300/Done:1285、1289~1292、1303~1309、1323~1328、1330~1335(.6 全系)Not started:1299、1329/暫緩:1318~1321(.5)、1298(T-4.1,隨 D16)
188 build 區 HEAD a89a701;主產品包 guidant-ai-1.15.0.tar.gz(933MB,烙印 429a4c21);agent onepack guidant-agent-compose-0.2.28(1375MB,sha256 0b5d47f0…,烙印 6f86303+打包腳本 a89a701
190(agent 驗收機) 0.2.28 舊制包跑動中;待砍掉重裝(用 onepack 包,驗首裝全鏈+恢復循環+upgrade 路徑);onepack 已放 ~/guidant-agent-compose-0.2.28-onepack.tar.gz;臨時免密 sudo 仍在(重裝後收)
191(落地版 PRD 驗收機) 1.15.0 已升級(commit 429a4c21)、六容器 healthy;blsadmin break-glass 已收回is_super_admin=f,第八棒 DB 實查);四頁守門+恢復循環決策者手測通過;臨時免密 sudo 是否收回待裁示
PROD 簽章鑰 仍未生成——191 的包以 --skip-prod-key-check 產出,屬內部測試包不可交付客戶(FR-065 既有殘項)

§2 已定裁示(不要重新討論;完整理由與被排除方案見 design.md §3)

  • D1 Nuitka standalone(非 onefile)→ tarball → systemd(2026-08-18)
  • D2 agent-db(postgres:16)退役換 SQLite——現況只服務 jedi-file-upload upload_files 一張表;Q2 PG 方言掃描是 T-1.1 前置守門(2026-08-18)
  • D3 外部工具全包一顆 tarball、離線自足,體積 ~1GB+ 已明示接受(2026-08-18)
  • D4 nginx sidecar 退役,agent 以 gunicorn/ssl 自起 8443 mTLS(2026-08-18)
  • D5 設定=/etc/guidant-agent/agent.env(systemd EnvironmentFile),install.sh 互動三題生成;enrollment 既有流程零改(2026-08-18)
  • D6 簽章防竄改瘦身版:build 期 manifest 簽章+啟動驗章(FR-064 泛用層加 agent_manifest type),不做 runtime 抽查/lockdown(2026-08-18)
  • D7 升級=versions/<ver>/current symlink 切換;SQLite/憑證在資料目錄不隨版本走;無備份模型(agent 無 migration)(2026-08-18)
  • D8 Windows 只出評估文件不實作;design.md D8 附錄有口頭可行性初判(非定案),是 T-4.3 起點素材(2026-08-18)
  • D9 指紋只做 Linux 原生直讀,不預抽 OS 抽象層;collect-host-id.sh 廢除(2026-08-18)——⚠️ D11 起指紋改二源,本條的「三源直讀」已被 D11 部分取代
  • Q1–Q4 是對應卡的前置查證項(Q1 LibreOffice 離線形式→T-2.1/Q2 PG 方言→T-1.1/Q3 EXCLUDE 名單→T-1.3/Q4 openscap-utils・sshpass 殘留→T-2.1),不阻擋開工但 Q2 先行
  • D10 EL(Rocky/RHEL)=方案 A 低 glibc 容器編譯(2026-08-20 定,隨 .5 暫緩
  • D11 指紋二源化全域:sha256(product_uuid|machine-id),MAC 退場;撞號防護=BE enroll 端偵測(2026-08-21)
  • D12 雙形態單產線:compose=有 docker 首選/原生=封閉網路;同一顆產物同一套簽章;升級包不帶 seaweedfs image、形態宣告寫 manifest 檔頭(2026-08-21)
  • D13 「使用 Agent 服務」=FR-039 既有功能,BE/FE 零新功能,只做 agent 端(2026-08-21)
  • D14 儲存後端設定=CLI(configure-storage)先做;web 下發開 CM-1329 評估卡等 PM(2026-08-21)
  • D15 compose 版配互動安裝程式(照 FR-065 主產品模式),受眾一線工程師不假設會 docker(2026-08-22)
  • 恢復預設方案(2026-08-22):出廠快照+一鍵恢復(主產品 FACTORY_DEFAULT 隱藏列/agent factory-defaults.env);排除動態讀現值、教 user 翻 credentials、恢復重生帳密
  • D16 出貨形態收斂(2026-08-22):原生 tarball 暫不出貨、現階段一律 compose 版(開發成果保留,解凍等商務需求);T-4.1 暫緩、T-4.2 改 compose 為主。同日裁示:compose 交付包廢除 install/upgrade 兩包制、收斂一顆通吃(CM-1335,evidence-agent a89a701)。⚠️ 斷網封閉網路驗證(D3 根基)至今無人跑過,不隨原生凍結——歸屬待裁示
  • WSL/docker 過渡風險接受度(2026-08-22 決策者口頭):Windows docker 過渡的指紋不穩問題,「只要有 log 記錄發生什麼事、或可重新註冊 agent 就沒問題」——重置後重綁定屬可接受維運事件,非否決點(T-4.3 文件的「不建議當正式方案」讀成「不當長期形態」即可)
  • 防篡改宣稱邊界(T-6.2 查證,2026-08-21):只可講「改動必被偵測」(雲端 sha256 錨點),不可講 WORM/不可刪除——SeaweedFS 3.99 Object Lock 有效但整桶刪擋不住、且我們未啟用

§3 下一步(2026-08-23 第八棒續版 v2——189 路線已定案)

主線(決策者 2026-08-23 拍板):手冊收完 → v1.16.0 進版 → 189 遷移 bundle 形態。之後全環境統一「拿新 bundle 跑 install.sh --upgrade」升級模式。

  1. 手冊全收(2026-08-23):CM-1347(主產品對齊 1.15.0)+CM-1299(agent 手冊十一章)+CM-1348(21 章全面白話化,決策者初審打回後改寫、終審過)+CM-1349(build 工具修 .md→.html 連結改寫+SPEC 站白名單補兩頁)四卡 Done。手冊落點:docs/user-manual/onprem/agent/(md)與 onprem-html/agent-html/(網頁版,入口在 FR-065/066 文件站)。⚠️ 決策者提過「有個需求要先處理再發版」——內容未揭露,下一棒先問
  2. 可與手冊平行的前置:①PROD 簽章鑰四步組(LC repo 生鑰→BE PUBLIC_KEYS commit→出貨簽章切 PROD→驗證;正式 bundle 硬門檻)②189 探路盤點(唯讀):舊 DB schema 落差(guidant_ai_poc 在機上 postgres 容器 port 25432、main HEAD 8c82e8e6 約 1.13 era、跑已退役 main_app.py)、.env 全量抄錄、camunda/pgadmin 誰在用、停機窗口問決策者。
  3. 按序執行:merge feature/FR-066→main(BE+FE,決策者親手或明示)→ version-bump v1.16.0(skill 全套:release note/pyproject/FE 對齊/specs 凍結快照;⚠️ 191 現跑的 1.15.0 bundle 內容超前 main 的 1.15.0——進版時收掉此不一致)→ build_all 出正式 bundle(PROD 鑰簽)→ 189 遷移(pg_dump 舊庫→裝 bundle→灌回→upgrade 自動補 migration→驗收;POC 異動,執行當天等決策者當次明示)。
  4. 連帶待拍:STG(188 裸跑)要不要同批遷 bundle;190/191 免密 sudo 收回。
  5. 母卡 CM-1284 收口條件:雙手冊收完+user 過目(Windows 已由 D19 移出範圍;斷網維持「先不管」)。
  6. design.md D6 註記仍欠;其餘掛置:1298/.5 四卡/1329 暫緩;agent 自更新 follow-up;DEV 測試資料收尾清;demo 用 160 要有人登入帶 Docker Desktop(runbook 素材在 t71 報告)。

⚠️ 本節是建議清單,不是執行授權。接手方讀完盤點完即停,等 user 發令。

§4 Pre-flight(必跑)

cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
git status -sb          # 應在 feature/FR-066
python3 scripts/notion_case.py get CM-1284   # 母案 In progress
python3 scripts/notion_case.py get CM-1292   # .2 進行中的卡,看 runner 有無回寫

cd ~/Projects/Billows/Audit-Manager/evidence-agent
git status -sb          # feature/FR-066、與 origin 同步(CM-1292 runner 可能有新 commit)
git log --oneline -3    # 基準 0fc80c8(.1 收口點),其後為 .2 的 commits

ssh jedi@192.168.50.188 'cd /opt/guidant-ai-agent && git log --oneline -1 && ls .build/dist/'
# 基準:HEAD 0fc80c8、dist 有 evidence-agent-0.2.27(.1 驗收級產物,🔴 不可覆蓋/刪除)

§5 環境座標

素材 路徑
標的 repo(改 code 的地方) ~/Projects/Billows/Audit-Manager/evidence-agent(branch feature/FR-066
BE repo(只放文件+Notion CLI) ~/Projects/Billows/Audit-Manager/compliance-manager-be(branch feature/FR-066
design(§3 決策表/§5 詳設/§6 拆分) docs/features/FR-066-2608-agent-native-installer/design.md
討論稿(D 項拍板全文) 同資料夾 discussion.md
FR-063 複用(build 管線/私房 wheel/resource_path) scripts/build/build_release.shrebuild_wheels.sh、FR-063 design
FR-064 複用(簽章泛用層) gen_integrity_manifest.pysign_manifest.sh/License Center 簽發
FR-065 複用(install.sh 七步/維運子命令體例) FR-065 design+scripts/install/
Notion CLI BE repo scripts/notion_case.py

§6 行為規範提醒(與本 arc 相關)

  • 不切 branch、push 永遠 user 本人做、顯式 git add <檔名>-am;BE 與 evidence-agent 分開 commit
  • runner 收工回寫子卡「修正待驗證」+白話已完成修正段+commit hash;母卡/子需求卡收尾等令(首腦驗收後收)。
  • 碎片卡預設不寫新 unit test(CLAUDE.md 測試政策);驗證=手測步驟+既有測試不弄壞。
  • 🔴 環境鐵律:開發只動本機/DEV;STG/POC/基線庫不碰。
  • 派工=先有 Notion 卡(本案 17 卡已建齊,派工 prompt 帶實際卡號+URL)。

§7 不在本期 scope

  • Windows 實作(只出 T-4.3 評估文件);OS 指紋抽象層(D9 明示延後)。
  • ZAP / OpenVAS / OpenSCAP / Nmap 引擎不進 bundle(客戶自備或裝在受測機)。
  • FR-064 runtime 全家桶(抽查/lockdown/unlock)不做(D6 瘦身版)。
  • FR-065 殘項(PROD 鑰/T-4.2/全案收尾)屬另一條戰線,不在本 arc 順手做。

§8 給 fresh session 的短 prompt

接手 FR-066 檢測 Agent 原生安裝包(母案 CM-1284)。先讀
docs/features/FR-066-2608-agent-native-installer/handoff/FR-066-STATE.md(§0 讀序全走:
WHY+design.md §2/§3/§6+Notion 母卡)+ FR-066-LOG.md 最後 2 block,
答完自檢 4 問、跑完 §4 pre-flight 後回報現況。
讀取與盤點完成後不做任何事——不派工、不跑測試、不改檔,等我下指令才開始作業。