FR-193 現況

Agent 主機 rootless Docker;真包首裝後的修正都已推上,等重出包重驗

只描述此刻。沿革看 fr193-LOG.md 與 git log。接手讀完本檔與指定讀序、答完自檢題、跑完唯讀盤點後停下,等決策者發令。

🧭 原始需求(先懂這個再往下讀)

決策者 2026-11-10 裁示:Docker 要做 rootless,照 Docker 官方 Rootless mode 完整做,PM 不接受替代方案(userns-remap 已排除)。Agent 先出安裝包,主系統晚一點。背景是部署同仁要在台灣把 Agent 裝好帶去印尼,連回 GCP 上的主系統。

rootless 的意思:客戶主機上開容器的 Docker 引擎不再用 root 跑,改由一個不能登入、沒有 sudo 的普通帳號 guidant 跑。容器裡面 FR-180 已全數非 root,這案補的是引擎那一層。程式碼與 image 不動,改動全在安裝程式、維運指令與主機設定。

決策者沒有這類經驗,回報一律白話、講到「不做會怎樣」。當天多次點名:做太多不必要的事、驗收卡拆太細反覆裝機、解釋太細看不懂。接手後不要擴大範圍,不要為了驗一件事去補一堆測試。

§0 接手讀序與自檢

必讀,依序:

  1. 本檔全部
  2. fr193-LOG.md 最後一個 block
  3. ../design-v1.4.md §1 決策表(D1~D11)、§3 詳細設計
  4. ../evidence/agent-rootless-probe.md §3 壞掉清單、§7

冷接自檢題(答得出來才算讀懂):

  • 為什麼維運指令本身用 root 跑,而不是用 guidant?那「把主機目錄掛進容器」為什麼還是會壞?
  • uninstall 在 wipe 之後原本為什麼沒還原主機設定?
  • 今天抓到的兩個壞指令,哪一個是 rootless 造成的、哪一個不是?
  • 192 現在是什麼狀態,可以直接拿來重裝嗎?

§1 此刻的狀態(2026-11-10 22:40)

沒有做到一半的事

真包首裝後抓到的六個問題都已修、已推(Agent feature/FR-172,最後一個是 3ea579d)。接手後沒有未 commit 的程式改動要收。但這六個修正還沒有一起被打進同一顆包裡從頭驗過,這是下一步的第一件事。

Notion 卡

卡 做什麼 狀態
CM-3804 母卡(Agent 先行) 進行中
CM-3805 A0 乾淨機手動踩坑 驗收通過待確認
CM-3806 A1 主機準備層 驗收通過待確認
CM-3807 A2 出貨包帶 Docker 驗收通過待確認
CM-3808 A3 Docker 指到 guidant、維運程式讀主機副本 驗收通過待確認
CM-3809 A4 合併卡(原 A4+A5+A6) 驗收通過待確認
CM-3810、CM-3811 已併入 CM-3809 暫緩(不用做,等決策者按「這張不用做」)
CM-3812 A7 deploy/README 驗收通過待確認
CM-3813 A8 資安報告 SR-09.5 驗收通過待確認
CM-3814 A9 出貨包總驗 In progress(小弟開工後回寫「等測試包」停下,沒改檔)
CM-3865 A10 部署/演練/健康檢查腳本跟上 rootless 暫緩(首腦親手做完,commit 710467e;狀態沒改)
CM-3867 指令改名 guidant-agent-compose → guidant-agent 待決策者裁三件事
CM-3868 console-login 壞掉(FR-180 留下) 待修
CM-3818 上線前就緒檢查(備份、告警、事故應變) 另一個 session 接手,與本案無關

A1~A8 的「驗收通過」是在換檔進舊 1.7.4 包的條件下驗的。真包首裝之後又抓到六個問題(見 LOG),所以這些卡的結論要打折看。

三個 repo

repo branch HEAD 與遠端 工作區
evidence-agent feature/FR-172 3ea579d 相同 只剩 M .claude/rules/workshop.md(不是本案的,不要碰)
compliance-manager-be feature/FR-172 c225c114d 相同 本檔與 LOG 未 commit;其餘 M 都不是本案的
compliance-manager-fe feature/FR-172 1d393861 相同 沒有本案的改動

工作坊 branch ws-CM-3804 已於 20:19 合回 Agent 的 feature/FR-172(62c23c3)並推上遠端。

測試機 192.168.50.192

Ubuntu 24.04.2、TPM 2.0、ssh jedi@192.168.50.192、免密 sudo。

決策者依序跑過 wipe、uninstall、再一次 uninstall(修正後)。Agent 與 rootless 的主機設定都已清掉:沒有 guidant 帳號、沒有 dockerd 行程、兩個主機設定檔不在、升級單元與主機副本不在、系統層 docker.service/docker.socket/containerd.service 恢復 enabled(未啟動)。

跟「剛裝好的 OS」還差這些,所以要驗「全新主機安裝」請決策者還原 192:

  • Docker 套件還裝著(docker-ce 等,設計上 uninstall 不移除)。直接重裝會走「已有官方 Docker、只補附加套件」那條,不會走「從包裡裝 Docker」。
  • ~/guidant-agent-compose-1.7.4/ 與 tar 檔在。其中 install.sh 是對應 3ea579d 的版本,但包內映像裡的 lib 仍是 753e4e2 的,不是一致的一組。
  • /var/lib/guidant-agent 空目錄、systemctl --failed 留一筆 guidant-agent-upgrade-order.service not-found、ping_group_range 的執行中值仍是全開(重開機才回預設)。
  • 188 的公鑰在 192 的 authorized_keys(原檔備份 authorized_keys.bak-20261110-134336),188 可直接 scp 到 192。192 一還原就消失,要再加。

建置機 192.168.50.188

五個目錄都在 feature/FR-172、工作區乾淨:/opt/guidant-ai-agent 753e4e2(落後遠端 3 個:cd54c60、b0efcba、3ea579d)、/opt/guidant-ai-be c225c114d、/opt/guidant-ai-fe 1d393861、/opt/jedi-python-package 3408f5fa、/opt/update-center eb8352b。

/opt/guidant-ai-agent/.build/compose/ 的 guidant-agent-compose-1.7.4.tar.gz 是測試包(21:37 建,commit 753e4e2,--internal-test,不可出貨),不含 cd54c60、b0efcba、3ea579d。原本 v1.7.4 的正式包備份為同目錄 *.v1.7.4-release.bak-20261110-2021 三個檔。

我留下、可刪的:/home/jedi/fr193-verify/(445 MB,獨立測試環境與掃描報告)、/opt/guidant-ai-agent/.build/docker-debs.stale-2127/(舊的 Docker 套件快取,含 systemd 那組)。

/opt/compliance-manager-be(4 個未提交改動)與 /opt/jedi-iso-llm(擁有者不是 jedi)我沒動。

§2 下一步(建議,不是授權;每一項等決策者發令)

  1. 188 git pull 到 3ea579d,重新出測試包。安裝程式會進映像並被簽章,所以從打包簽章那步重跑,不必重編譯。做法見 LOG「怎麼不重編譯重出包」。出完開包確認 host-lib/ 與映像內的 lib 都是新版。
  2. 決策者還原 192,用新包從頭裝一次。這是第一次六個修正都在同一顆包裡的完整驗證,要看:首裝一路到底、wipe 後 uninstall 一次清乾淨、upgrade <同一顆包> 走到底。
  3. 上面過了再處理 Python 3.11 的全量測試(見 §3)。
  4. 192 接上一台主系統後補驗:主控台的網路診斷(ping/traceroute/MTU)、派一次掃描、主系統發更新的自動升級。這三項至今沒有實測過。
  5. CM-3814 改回 Not started 重新派,或由首腦親手做總驗。
  6. 主系統的 rootless(FR-193.1)還沒有設計,等 Agent 這輪收完再開。

§3 待辦清單

本案內、擋出貨

  • 六個修正打進同一顆包、在還原後的 192 從頭驗一次(§2 第 1、2 項)
  • 全量測試要在 Python 3.11 的環境重跑。今天那次 2555 全過是 3.13,只能當參考。正式流程 verify_agent.sh 用 188 /opt/guidant-ai-agent/.venv(3.11)
  • 整條出包流程在全部修正都進去之後,再完整綠一次

本案內、不擋出貨

  • wipe 的說明寫「不會刪除設定檔」,實際清掉了設定檔的加密存放,之後 status 不能用。行為合理,文字要改
  • RHEL 系(el-9)那組套件還有 4 個 systemd 相關的檔,沒在實機驗過
  • 這輪的修正只在 Ubuntu 24.04 實測,Ubuntu 22.04、Debian 12、el-9 未驗
  • Ubuntu 26.04 目前不支援離線安裝(包只帶四組)
  • uninstall 後的三個小尾巴:/var/lib/guidant-agent 空目錄沒刪;systemctl --failed 留一筆升級單元的失敗紀錄(該 reset-failed);ping_group_range 執行中的值到重開機才回預設
  • test/shell/manual_upgrade.bats 有 4 條在本案之前就紅(第 2、3、4、10 條)。bats 不在 CI 與 pytest 內,不擋發版
  • 正式發版前:換新版號、寫 RELEASE_NOTES.md 新版段(1.7.4 已發過);不要勾升級演練(190/188/189 同機有主系統,新版安裝程式會拒絕)

另開的卡:CM-3867(改名)、CM-3868(console-login)

§4 已定裁示(不要重新問)

  • 完整 rootless,不用 userns-remap。Agent 先行。
  • D1 主系統對外一律 8443(PM 裁)。只影響 FR-193.1。
  • D2 ping sysctl 全開;D3 網路驅動預設 slirp4netns;D4 包裡帶 Docker Engine;D7 不留 root Docker 相容路徑。
  • GCP 主系統從 root 轉 rootless 要用「遷移子命令」原地轉,不用 uninstall 重裝。屬 FR-193.1,還沒寫進設計。
  • 推送:可直接推自己當下的 feature branch,不推 main、不 force、不切 branch。
  • 唯讀查任何環境不必請示;改 STG/POC 要當次明確指示。192 是測試機可任意裝拆。
  • wipe、uninstall 設計上要人在終端機前打確認字串,不繞過;請決策者自己跑。

§5 行為規範(今天被點名的)

  • 不要寫「私下盤點」式的長篇推理給決策者看,查完只講結論。
  • 回報問題固定「問題 → 建議 → 理由」,不能只列問題。
  • 「未驗」不可以直接丟給決策者,能跑就先跑。
  • 碎片修正不補新的單元測試。驗證靠實機。
  • 動 git 前先 git status。不帶路徑的 git stash 禁用(今天誤用過一次,已還原)。
  • 進行中的卡不要再往卡尾疊修正段,小弟看不到。