FR-167 · 需求索引 · 本頁由 build 掃資料夾生成
開發期 90 張卡全部驗收(批 1~32);1.27.10 已發布、189 POC 線上升級成功、Agent 線上推送驗過;收口修正已合回未出包;正式出版路徑待走通(2026-11-01)
| 文件 | 性質 | 什麼時候看 |
|---|---|---|
| 定版交付 FINAL-SPEC | 定版:現在長什麼樣、三台版本、沒做完的、延伸 FR、每份文件的定位表 | 第一份看這個 |
| 十份技術規格(側欄「設計」節) | 技術規格:主機升級程式、狀態機、循序圖、更新中心 API、Agent 跟進、更新站規格、更新站資料表、發布簽章 | 功能師要改某個部件時,看對應那份;每份都對回程式碼行號 |
| 發版操作手冊 | 操作手冊:原廠出包→簽章→上傳→發布→三台升級,含三道 CI 前提與 build 機清理 | 要發一版時 |
| 設計文件、討論稿 | 設計(定稿凍結):D1~D31 為什麼這樣決定、排除了什麼、業界對照 | 想知道「為什麼」時;數字以 FINAL-SPEC 與技術規格為準 |
| PM 簡報、機制問答 | 簡報與問答:給 PM/主管的機制總覽與 23 條提問的回答 | 要對非工程師說明時 |
| 互動雛形 | 雛形:假資料畫面 | 看畫面長什麼樣 |
| 交接現況、逐棒紀錄、拆卡底表 | 交接:此刻狀態與待辦、每棒做了什麼、90 張卡的依賴表 | 接手或開卡時 |
需求分成兩層。第一層是讓升級指令絕不出事: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)。
| 階段 | 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。
guidantai 指令與 systemd,企業自架軟體的常態是「IT 敲一道絕不出事的指令」。結論:拿掉救援頁與常駐助手,執行者就是 guidantai upgrade,排程靠系統定時器(D26 裁放哪期);服務停掉之後不接受取消(D25);停機期間畫面由前門維護頁讀進度檔顯示。D19 改定案、D20/D21 改為不做,新增 D25、D26。guidantai upgrade,指令退成備援。追問「只更新 Agent 能不能用一樣的機制」——能,更新站發 Agent 修正版,主系統不停服務直接推。handoff/cards.py(35 張卡 8 批,依賴與撞檔斷言過)。探脈補兩件:Agent 送不出的結果 FR-166 outbox 已做、本案不開卡;討論稿「回應 24 小時內」做不到(更新站無私鑰),改 D31 發布清單 90 天有效。卡等決策者看過 design 再開。1.10.0b1),正式版留結案卡。環境卡改釘 beta,不再 path 安裝。guidant-ai-release,要分大版本資料夾存——首腦定物件 key v<主版號>/<完整版號>/…、只在 Worker 拼,客戶端與 CI 不寫死路徑。決策者備妥 API 權杖(D1/Workers/R2/Access 編輯)與 R2 金鑰,首腦實打驗過;網域出貨前再定。~/Projects/Billows/Audit-Manager/update-center、遠端 gitlab.com/auditmanager/update-center;後台 Access 只放行決策者信箱。首腦完成工作坊登記、Notion Repo 選項、新 repo CLAUDE.md 與祕密搬家;「開新 repo 固定五步」寫進 big-feature-workflow skill,不另開 skill。以下全部由 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 |
其他文件
| 文件 | 類型 | 標題 | 最後更新 |
|---|---|---|---|
| mechanism-qa-2026-11-01 | 文件(手刻 HTML) | 機制問答:PM 會議 23 題 | 2026-11-01 |
| pm-deck-2026-10-31 | 文件(手刻 HTML) | PM 簡報:線上更新機制 | 2026-11-01 |
其他文件
| 文件 | 類型 | 標題 | 最後更新 |
|---|---|---|---|
| update-center-v2 | 文件(手刻 HTML) | 更新中心 v2 | 2026-10-30 |
由新到舊。每份是某一棒次交接當下的完整現況快照,看某個時間點「當時知道什麼」請從這裡進。
| 日期 | 文件 | 標題 |
|---|---|---|
| 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 個檔)
卡片內容(決策紀錄、驗收條件)以 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/ | — |