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

FR-167 線上更新

開發期 90 張卡全部驗收(批 1~32);1.27.10 已發布、189 POC 線上升級成功、Agent 線上推送驗過;收口修正已合回未出包;正式出版路徑待走通(2026-11-01)

狀態:詳見下方 文件 15 份 handoff 3 份
§1

🔴 先看哪一份

文件 性質 什麼時候看
定版交付 FINAL-SPEC 定版:現在長什麼樣、三台版本、沒做完的、延伸 FR、每份文件的定位表 第一份看這個
十份技術規格(側欄「設計」節) 技術規格:主機升級程式、狀態機、循序圖、更新中心 API、Agent 跟進、更新站規格、更新站資料表、發布簽章 功能師要改某個部件時,看對應那份;每份都對回程式碼行號
發版操作手冊 操作手冊:原廠出包→簽章→上傳→發布→三台升級,含三道 CI 前提與 build 機清理 要發一版時
設計文件、討論稿 設計(定稿凍結):D1~D31 為什麼這樣決定、排除了什麼、業界對照 想知道「為什麼」時;數字以 FINAL-SPEC 與技術規格為準
PM 簡報、機制問答 簡報與問答:給 PM/主管的機制總覽與 23 條提問的回答 要對非工程師說明時
互動雛形 雛形:假資料畫面 看畫面長什麼樣
交接現況、逐棒紀錄、拆卡底表 交接:此刻狀態與待辦、每棒做了什麼、90 張卡的依賴表 接手或開卡時
§2

結論

需求分成兩層。第一層是讓升級指令絕不出事:guidantai upgrade 改成在資料庫複本上升級、每步有時限、寫進度檔,失敗、卡住、斷電都自動退回更新前,現在那份資料庫從頭到尾沒動過,所以退回不需要還原、一筆資料也不掉;停機期間前門直接顯示進度頁。第二層是把搬檔與敲指令拿掉:系統每天向我們的更新站問一次有沒有新版,有就通知管理員;管理員確認後才下載(跟 iPhone 一樣)、驗簽名,就緒後有「系統更新」權限的人按「立即更新」或選排程時間,主系統只在主機上寫一張更新單,主機的 systemd 看到才呼叫 guidantai upgrade;連不到外網的客戶自己上傳更新包。每次更新都記錄誰按的下載、誰按的更新。服務停掉之後沒有取消鈕,每步有時限,失敗自動退回。客戶主機上不多任何常駐程式、不開任何新的埠;真要人出手走客戶本來就有的主機登入(guidantai recover)。只升 Agent 走同一套機制。版本只有一種:每版都是修正加功能混著出,安全修正就是發下一版,只維護最新版,每版包留 10 年;任何版本都不自動裝,一律人按,客戶不更新是客戶的事。授權管能用什麼、不管能不能裝:授權過期仍可升到同主版號(1.x)最新版,升上去是唯讀、功能鎖著;換主版號(2.0)要重新授權。五年支援靠「永遠可以免費升到最新版」達成;受不受 CRA 管、這種寫法過不過,兩題要找懂 CRA 的人確認。更新站跑在 Cloudflare Worker、檔案放 R2,先用免費方案;發版的最後一步在決策者電腦蓋章(發布印章一正一備、備用封存、跟授權中心的印章分開),CI 只能登記草稿;草稿可以指定給 STG、POC 先裝,不做頻道;停權客戶由決策者在後台手動加拒絕名單。開放使用是唯一的不可退回點,之後有問題發修正版。Agent 在主系統升完後跟進,先升 1 台,正常再推其他台。更新站與授權中心分開,互不持有對方憑證。

不做:救援頁、常駐更新助手、更新頻道、只換單顆容器(每版整包)、服務停掉後的取消鈕、強制中斷進行中的工作、任何形式的自動安裝、分安全修補版與功能版、維護舊版本線、每年一個長期支援版、升完之後的回滾、差異更新包、作業系統更新、買 Replicated(只支援 Kubernetes)。

§3

📊 總進度

階段 Notion 卡 做什麼 狀態
討論稿 v8+雛形 v2、設計文件、拆卡底表 — 首腦自寫,35 張卡 8 批斷言過 ✅ 定案
P1~P5 開發期(批 1~8) CM-3242~CM-3276 升級程式、更新站、更新中心、Agent 跟進、手冊 SPEC e2e ✅ 2026-10-30
P6 開發期收完後的修正、P7 雛形 v2 接線(批 9~17) CM-3277~CM-3317 離線單一檔、Agent 跟進可選、min_agent_version ✅ 2026-10-30
P8 190 測試期修正(批 18~21) CM-3336~CM-3344 第 0 步依包大小、退回終態、主動通知 Agent、幽靈選單、1.27.2 ✅ 2026-10-31
P9 測試期第二輪(批 22~24) CM-3346~CM-3356 ops.tar 秒級第 0 步、快速出包、Agent 進度拉取、證據白名單、1.27.3~1.27.7 ✅ 2026-10-31
P10 188/189 升級後修正(批 25~28) CM-3358~CM-3365 空窗遮罩、側欄、翻譯、CRA PDF、拿掉 90 天、report、1.27.8 ✅ 2026-11-01
P11 PM 會議功能調整(批 29~31) CM-3366~CM-3372 Agent 結果回報更新站、文案、支援頁、system_logs、診斷包、1.27.9 ✅ 驗收通過,等按 Done
1.27.10/Agent 1.4.8 無卡(決策者直接令改) 容器版 Office 預覽、主控台 Profile 下拉、jedi-detection 1.7.2 ✅ 2026-11-01 發布;189 線上升級成功
P12 收口(批 32) CM-3374~CM-3376 Agent 升級磁碟預檢與錯誤原因與清舊映像、SeaweedFS 上限、8 格欄位 ✅ 2026-11-01 合回主線,未出包
P12 結案出 1.27.11 CM-3378 — ⏸ 決策者裁等 FR-171/172 一起出
技術文件站 — FINAL-SPEC、十份技術規格、發版手冊、簡報靜態頁、SPEC 與手冊對 1.27.10 ✅ 2026-11-01
正式出版路徑 待開卡 正式章、CI publish 帶 ops 欄、從推 tag 到 publish 走通一次 ⬜ 出貨前

交接現況看 handoff/fr167-STATE.md,每棒紀錄看 handoff/fr167-LOG.md。

§4

需求討論紀錄

  • 2026-10-26 決策者:人力有限,想請客戶開對外白名單、由我們提供更新服務;要成熟穩定、不要技術債。
  • 2026-10-27 決策者:更新來源要與授權中心分開——授權中心可能不開放客戶連線,且合在一起「一被攻破兩個都被攻破」。
  • 2026-10-27 決策者:討論卡在技術面、沒有一條真的更新流程;要先講流程。首腦改以九步流程為主軸,技術選擇掛在步驟底下。
  • 2026-10-27 決策者:程式大改版與內容熱更新分開,本案只管程式大改版;每版出整包、跨多版靠 migration 補套。
  • 2026-10-27 決策者:主軸是「按下 accept 後自動化更新、顯示進度、不可以卡住、卡住也要能復原、可以反悔中斷與重啟、資料絕對不可以掉、不能靠人到現場(客戶在俄羅斯怎辦)」。首腦把升級改成在複本上做,加上獨立救援頁與開機自動退回。其餘四項(開放使用後不退回、預設排程、Agent 先推一台、必經版本規則)照建議定案。
  • 2026-10-27 首腦實查:STG、POC 都是 1.26.0,跟主線同版,跨版排練要另外在測試機做;Agent 送不出的結果現在會直接丟掉,排進第一期補。
  • 2026-10-27 決策者:客製化版本客戶的更新路徑這輪先不談。
  • 2026-10-27 決策者:更新包不該讓使用者上傳,要由我們幫客戶抓;管理員確認要更新之後才下載(像 iPhone);離線更新才自己上傳;要記錄是誰更新的。首腦把更新站從第四期提到第二期,流程改成「發現新版 → 確認 → 下載 → 升級」,加 D22–D24。
  • 2026-10-29 決策者:進行中的工作永遠不強制停;救援頁「感覺像後門」;問「業界是不是這樣做、有沒有現成工具(Ansible、runner)可以用」,並點名首腦「順著話跑」要求重新分析。首腦回頭查安裝腳本:主機本來就有 guidantai 指令與 systemd,企業自架軟體的常態是「IT 敲一道絕不出事的指令」。結論:拿掉救援頁與常駐助手,執行者就是 guidantai upgrade,排程靠系統定時器(D26 裁放哪期);服務停掉之後不接受取消(D25);停機期間畫面由前門維護頁讀進度檔顯示。D19 改定案、D20/D21 改為不做,新增 D25、D26。
  • 2026-10-29 決策者:D25「不能取消」要先講清楚失敗怎麼判、炸了怎麼復原——首腦補每步時限表(複製三倍預估、映像 5 分、每支 migration 10 分無進度、健康檢查 5 分、總上限 60 分),失敗一律自動退回不用人按;服務停掉後不給取消鈕照建議定案。D26「沒有輸入指令這件事,就是讓有權限的人按」——改成按鈕觸發:加「系統更新」權限,主系統寫更新單,主機 systemd 觸發器呼叫 guidantai upgrade,指令退成備援。追問「只更新 Agent 能不能用一樣的機制」——能,更新站發 Agent 修正版,主系統不停服務直接推。
  • 2026-10-29 決策者:CRA 四項照建議——D7 改為安全修補版支援期內照給、功能版看授權;D27 維護最新加最近 2 個功能版、五年支援靠免費升級路徑、先找懂 CRA 的人確認;D28 安全修補版預設在維護時段自動裝、可關可延後、功能版照舊要人按;D29 修補包留 10 年。D15 補例外。
  • 2026-10-29 決策者:盤點更新站那一組,問 D2a「不是已經改成客戶那邊自己處理」、D3「簽名是什麼」——首腦釐清 D2a 是我們這邊對客戶開放的更新站(跟客戶主機上誰執行升級無關),D3 的簽名是「發版最後一步要不要決策者親自蓋章」;並盤出 D8、D9、D10、D11 早已在流程與安全原則裡寫定、D3 與 D5 是同一題。決策者逐項:D1 OK;D3 蓋章放決策者電腦、一正一備、跟授權印章分開;D6 不做頻道改草稿指定內部機器;D12 拒絕名單手動加;D2a 選 Cloudflare Worker、先用免費方案試、再考慮要不要自己維護。待裁項清空。
  • 2026-10-29 決策者:安全修補版也整包出去,不做只換有洞那顆容器,太麻煩,未來看產品走向再決定。首腦查 188 實包 2.9GB,討論稿原寫 1.7GB 已改正。
  • 2026-10-29 決策者:看雛形問「安全修補自動安裝開關有什麼用,現在不是都一大包」,裁「絕對不要自動裝,通通手動確認,客戶不更新是他的事」;再指出「我們沒有分安全性更新,都是發新版本」。首腦確認整包加手動之後兩種版本在技術與安裝方式上已無差別,建議連分類一起拆。決策者問授權過期剩什麼、是否要對每版做安全更新、能不能用範圍版本——定案:不分安全修補版與功能版,安全修正就是發下一版、只維護最新版;授權管能用什麼不管能不能裝,過期仍可升同主版號最新版(唯讀、功能鎖),換主版號要重新授權。D7、D27、D28、D29 改寫,§10 重寫,雛形拆掉自動安裝區塊、⑥b 安全修補頁、更新站的種類欄與版本線表。CRA 功課改成兩題:受不受管、這種寫法過不過。
  • 2026-10-29 決策者:雛形更新中心頁的「升級指令 guidantai 1.24.1 相容」不對。首腦確認:主機上的指令是裝機時複製的舊版,新版升級流程寫在新版指令裡,舊指令不會做。定案 D30:升級指令開跑第一步先從已驗簽名的新包取出新版指令換掉自己,再用新版跑剩下的步驟;畫面上不顯示指令版本。
  • 2026-10-29 決策者:「往後面進行吧」。首腦落 design.md v1 與 handoff/cards.py(35 張卡 8 批,依賴與撞檔斷言過)。探脈補兩件:Agent 送不出的結果 FR-166 outbox 已做、本案不開卡;討論稿「回應 24 小時內」做不到(更新站無私鑰),改 D31 發布清單 90 天有效。卡等決策者看過 design 再開。
  • 2026-10-29 決策者:CRA 兩題先不管;要放著工作坊自動跑,問「有沒有環節會卡住、哪裡要我介入」。首腦逐卡盤點出 16 張卡的驗收要 190 獨佔、pipeline、真 Cloudflare 或 PROD 印章;決策者裁「先把功能開發好,測試我跟你互動」——卡片驗收改成只寫小弟本機能驗的事,190 情境另欄給測試期。
  • 2026-10-29 決策者:授權小弟在工作坊可 push 自己的 ws branch、套件要發就發 beta 版號(jedi-remote-agent 1.10.0b1),正式版留結案卡。環境卡改釘 beta,不再 path 安裝。
  • 2026-10-29 決策者:Cloudflare 已有 R2 bucket guidant-ai-release,要分大版本資料夾存——首腦定物件 key v<主版號>/<完整版號>/…、只在 Worker 拼,客戶端與 CI 不寫死路徑。決策者備妥 API 權杖(D1/Workers/R2/Access 編輯)與 R2 金鑰,首腦實打驗過;網域出貨前再定。
  • 2026-10-29 決策者:Worker 用 TypeScript 寫(原討論稿選 Python Worker);新 repo 放 ~/Projects/Billows/Audit-Manager/update-center、遠端 gitlab.com/auditmanager/update-center;後台 Access 只放行決策者信箱。首腦完成工作坊登記、Notion Repo 選項、新 repo CLAUDE.md 與祕密搬家;「開新 repo 固定五步」寫進 big-feature-workflow skill,不另開 skill。
  • 2026-10-30 工作坊 25 跑完:34 張卡驗收通過;結案卡停在版號(1.10.0 非 1.9.0)、套件清單、PROD 印樣、網域四題;離線上傳端到端 400 列修正卡;授權檔原文含客戶名稱要不要改送法、UPDATE_SITE_URL 怎麼帶進客戶機、出貨基線重產時機,等決策者。
  • 2026-10-31 決策者:推送 Agent 要主動通知、不等心跳(「這太蠢了,後來是有通道可以進去的」);Agent 跟進改可選(預設勾、可選台),取代 D16「一律自動」。
  • 2026-11-01 決策者:主系統與 Agent 要分開更新(取代「第二期先不討論」);不再用心跳帶訊息(「雷到一個不行」)。兩題走新 FR 與 FR-171 同一討論週期。
  • 2026-11-01 決策者:收口修正合回但先不出 1.27.11,等 FR-171/172 做完一起出;Bugsink 密碼每台隨機那張先不做;更新站後台 Agent 三欄為 0 的 bug 等 FR-172。
  • 2026-11-01 決策者:技術文件要很詳細、一主題一份、結構化分開靠左側選單導航;簡報與問答要放進 FR 站;循序圖架構圖流程圖都要;更新站 Worker 規格架構 schema 要寫。
§5

文件

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

定版交付

文件 類型 標題 最後更新
FINAL-SPEC / md 定版交付 ▸ 線上更新的最終長相 2026-11-01

說明與手冊

文件 類型 標題 最後更新
release-runbook / md 操作手冊 發版操作手冊 2026-11-01

需求與討論

文件 類型 標題 最後更新
discussion / md 需求討論稿 需求討論稿:為什麼這樣決定 2026-11-01

設計

文件 類型 標題 最後更新
design / md 設計 設計文件:D1~D31 與各部件設計 2026-11-01
agent-rollout-spec / md 設計 Agent 跟進 2026-11-01
release-signing-spec / md 設計 發布簽章 2026-11-01
sequence-diagrams-spec / md 設計 循序圖 2026-11-01
state-machines-spec / md 設計 狀態機 2026-11-01
update-center-api-spec / md 設計 更新中心 API 2026-11-01
update-site-schema-spec / md 設計 更新站資料表 2026-11-01
update-site-spec / md 設計 更新站規格 2026-11-01
upgrade-runner-spec / md 設計 主機升級程式 2026-11-01

簡報與問答(給 PM/主管)(2 份)

其他文件

文件 類型 標題 最後更新
mechanism-qa-2026-11-01 文件(手刻 HTML) 機制問答:PM 會議 23 題 2026-11-01
pm-deck-2026-10-31 文件(手刻 HTML) PM 簡報:線上更新機制 2026-11-01

互動雛形(1 份)

其他文件

文件 類型 標題 最後更新
update-center-v2 文件(手刻 HTML) 更新中心 v2 2026-10-30

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

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

日期 文件 標題
2026-11-01 qa-session-handoff / md FR-167 線上更新:機制問答接手說明(給 QA session)
2026-11-01 fr167-STATE / md FR-167 交接現況(STATE)
2026-11-01 fr167-LOG / md FR-167 LOG(append-only)

資產子資料夾(無文件,不建頁):diagrams/(4 個檔)、prototype/(1 個檔)

§6

Notion 卡

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

關係 卡號 標題 狀態
母案 CM-3241 FR-167 線上更新(35 張卡 8 批) —
子卡 CM-3242 FR-167.P1-1 升級骨架:guidantai 加 upgrade/recover 子命令、先換成新版的自己(D30)、lib/ 步驟空殼、進度檔讀寫、每 —
子卡 CM-3244 FR-167.P1-3a jedi-remote-agent 心跳契約一次改完:dispatch_gate port(停派新任務)、下發 target_vers —
子卡 CM-3246 FR-167.P1-8 前門維護頁:nginx 後端連不上改送 maintenance.html,頁面每 3 秒讀唯讀掛進來的進度檔畫步驟與時限(雛形 ②)(F —
子卡 CM-3243 FR-167.P1-9a 出包:產未簽的 release.json(版號、主版號、雜湊、大小、可直升起始版、是否含安全修正)、可直升起始版由 migration —
子卡 CM-3247 FR-167.P2-1 更新站 repo 骨架:TypeScript Worker(wrangler 4)、D1 六張表、客戶端三端點(check/downlo —
子卡 CM-3248 FR-167.P2-5 授權檔 payload 加 product_major(預設 1);簽發畫面與 CLI 帶欄位(License Center) —
子卡 CM-3245 FR-167.P3-1 能力點 system.product-update.read/update、更新中心選單路由、預設角色授權(照 FR-134 vulnd —
子卡 CM-3249 FR-167.E-1 環境卡:主 repo 改釘 jedi-remote-agent beta 版(P1-3a 發的 1.10.0b1),poetry updat —
子卡 CM-3250 FR-167.P1-2 預檢:空間(包+複本+映像+保留)、版本路徑對 release.json 的可直升起始版、資料庫連得上、驗 release.json 簽 —
子卡 CM-3251 FR-167.P1-3c 停接新工作、等做完:寫 draining 旗標檔、psql 輪詢進行中數、30 分提醒寫進度檔、時段結束放棄並清旗標(D19)(BE) —
子卡 CM-3253 FR-167.P2-2 更新站後台:Cloudflare Access 守門的管理端點(發行版列表/撤回/指定內部先裝/拒絕名單/印章表)與簡單後台頁(雛形 ⑦ —
子卡 CM-3254 FR-167.P2-3 發布 CLI guidant-release(決策者電腦):init-keys 一正一備(passphrase)、publish <版> —
子卡 CM-3252 FR-167.P3-2a 主系統更新模組骨架:product_update_jobs 表、domain/infra/app service、狀態與紀錄端點(讀進 —
子卡 CM-3255 FR-167.P1-3b 主系統接 draining:core/maintenance_gate 讀旗標檔、worker 不撿新單、心跳不派新任務(接 P1-3 —
子卡 CM-3256 FR-167.P1-4 停服務、複製資料庫到複本、讓升級接複本跑:lib/upgrade_db_copy、compose 資料庫目錄改吃變數、fe 掛進度檔唯讀 —
子卡 CM-3257 FR-167.P1-5 在複本上升級:載映像驗雜湊、init image migrate 模式對複本、migrate.sh 每支印進度行、runner 轉寫進度 —
子卡 CM-3258 FR-167.P2-4 CI 出包後登記草稿:先打更新站 register-draft 拿到 R2 目標 key,再上傳包、release.json、.sha2 —
子卡 CM-3259 FR-167.P2-6 發布印樣進產品:DEV 公鑰檔放 scripts/installer/release-keys/、install 與 upgrade 都 —
子卡 CM-3260 FR-167.P3-2b 發現新版與下載:更新站 client、每日排程(抽 core/scheduler_update.py)、立即檢查端點、通知管理員、背景 —
子卡 CM-3261 FR-167.P3-3 更新中心頁:目前版本、最新版本、版本說明、預檢、下載、下載中、已就緒(立即/排程/取消)、離線上傳、更新紀錄、失敗原因(雛形 ①、①b、 —
子卡 CM-3262 FR-167.P1-6 啟動新版、健康檢查、開放使用:新版接複本起、180 秒+登入與主要 API 實打、換接(複本轉正、舊份留作升級前快照)、前門最後才換(B —
子卡 CM-3263 FR-167.P3-2c 更新單:立即/排程/取消/重試端點寫 upgrade-order.json;systemd path+service 單元隨 inst —
子卡 CM-3264 FR-167.P3-4 有新版橫幅(儀表板,只給系統管理員)、更新前 30 分與 5 分全站提醒、「這版先不提醒」(雛形 ⓪)(FE) —
子卡 CM-3266 FR-167.P1-10 收尾與診斷:保留上一版映像、更新包保留到下次成功、清掉更早的;diag 併進度檔與更新單並遮罩;下載診斷包走更新單(type=diag —
子卡 CM-3265 FR-167.P1-7 自動退回、開機檢查、guidantai recover:丟棄複本、改接原份、啟動保留的舊映像、健康檢查;systemd oneshot —
子卡 CM-3267 FR-167.P3-2d 跨版兩段:更新站回路徑(必經版本)、下載多包、更新單帶序列、CLI 依序跑每段各自複本與健康檢查、第二段失敗停在中間版(雛形 ⑤)(B —
子卡 CM-3268 FR-167.P4-5 Agent 升級指令比照主系統:每步時限、進度檔、失敗自動退回(兩份 install.sh 只加一行呼叫,邏輯進 install-lib —
子卡 CM-3269 FR-167.P1-9b CI 跨版排練:e2e 目標先裝舊版+灌真實舊庫,再用新包 guidantai upgrade;失敗擋 package(BE) —
子卡 CM-3270 FR-167.P4-2 Agent 跟進(主系統側):agent_update_rollouts 表、開放後自動建第一批 1 台、心跳回 target_vers —
子卡 CM-3271 FR-167.P4-3 Agent 跟進(Agent 側):心跳 observer 看 target_version、從主系統下載包驗雜湊、寫 agent-up —
子卡 CM-3272 FR-167.P4-4 更新中心 Agent 跟進區:批次表、暫停/繼續、推選定、只升 Agent 說明(雛形 ④)(FE) —
子卡 CM-3273 FR-167.P5-1 手冊與安裝文件:升級一章改寫(更新中心、離線上傳、排程、失敗怎麼看、recover、diag)、防火牆放行清單、資安例外登記(對外更新站 —
子卡 CM-3274 FR-167.P5-2 SPEC:更新中心頁新頁(writing-feature-specs)(BE) —
子卡 CM-3275 FR-167.P5-3 e2e:更新中心頁(有新版→下載→就緒→排程→取消;離線上傳驗不過;無權限只看)對 stub 更新站(compliance-manage —
子卡 CM-3276 FR-167.P5-5 結案卡:jedi-remote-agent 發正式版(決策者確認套件清單後)、主 repo 釘正式版、PROD 印樣進 scripts/ —