# FR-167 LOG（append-only）

## 2026-10-29 開卡（首腦）

- 母卡 CM-3241；子卡 CM-3242～CM-3276（35 張 8 批），工作坊四欄（母卡／Stage／Model／Effort／Repo）已填，開頭引用已回填母卡號。
- 開卡前決策：CRA 兩題先不管；開發期（小弟本機驗）與測試期（首腦操作 190）分開；小弟可 push ws branch、套件發 beta；更新站改 TypeScript；R2 既有 bucket `guidant-ai-release` 分主版號資料夾；新 repo `update-center` 建好並完成工作坊登記；Cloudflare 權杖與 R2 金鑰實打驗過。
- 產卡：`handoff/gen_notion_cards.py` → `notion-cards.json` → `scripts/notion_create_case.py` → `patch_workshop_fields.py`。
- 踩坑：頁面 API 的 relation 欄預設只回 25 筆（`has_more: true`），要用 `/pages/{id}/properties/{prop_id}` 分頁查才看得到 35 張；子卡開頭的母卡號佔位要建完再補。

| 批 | 卡 | Case No | 標題 |
|---|---|---|---|
| 1 | P1-1 | CM-3242 | 升級骨架：guidantai 加 upgrade／recover 子命令、先換成新版的自己 |
| 1 | P1-3a | CM-3244 | jedi-remote-agent 心跳契約一次改完：dispatch_gate port |
| 1 | P1-8 | CM-3246 | 前門維護頁：nginx 後端連不上改送 maintenance.html，頁面每 3 秒讀唯讀掛進來的進度檔畫步驟與時限 |
| 1 | P1-9a | CM-3243 | 出包：產未簽的 release.json |
| 1 | P2-1 | CM-3247 | 更新站 repo 骨架：TypeScript Worker |
| 1 | P2-5 | CM-3248 | 授權檔 payload 加 product_major |
| 1 | P3-1 | CM-3245 | 能力點 system.product-update.read／update、更新中心選單路由、預設角色授權 |
| 2 | E-1 | CM-3249 | 環境卡：主 repo 改釘 jedi-remote-agent beta 版 |
| 2 | P1-2 | CM-3250 | 預檢：空間 |
| 2 | P1-3c | CM-3251 | 停接新工作、等做完：寫 draining 旗標檔、psql 輪詢進行中數、30 分提醒寫進度檔、時段結束放棄並清旗標 |
| 2 | P2-2 | CM-3253 | 更新站後台：Cloudflare Access 守門的管理端點 |
| 2 | P2-3 | CM-3254 | 發布 CLI guidant-release |
| 2 | P3-2a | CM-3252 | 主系統更新模組骨架：product_update_jobs 表、domain／infra／app service、狀態與 |
| 3 | P1-3b | CM-3255 | 主系統接 draining：core/maintenance_gate 讀旗標檔、worker 不撿新單、心跳不派新任務 |
| 3 | P1-4 | CM-3256 | 停服務、複製資料庫到複本、讓升級接複本跑：lib/upgrade_db_copy、compose 資料庫目錄改吃變數、f |
| 3 | P1-5 | CM-3257 | 在複本上升級：載映像驗雜湊、init image migrate 模式對複本、migrate.sh 每支印進度行、run |
| 3 | P2-4 | CM-3258 | CI 出包後登記草稿：先打更新站 register-draft 拿到 R2 目標 key，再上傳包、release.js |
| 3 | P2-6 | CM-3259 | 發布印樣進產品：DEV 公鑰檔放 scripts/installer/release-keys/、install 與 u |
| 3 | P3-2b | CM-3260 | 發現新版與下載：更新站 client、每日排程 |
| 3 | P3-3 | CM-3261 | 更新中心頁：目前版本、最新版本、版本說明、預檢、下載、下載中、已就緒 |
| 4 | P1-6 | CM-3262 | 啟動新版、健康檢查、開放使用：新版接複本起、180 秒＋登入與主要 API 實打、換接 |
| 4 | P3-2c | CM-3263 | 更新單：立即／排程／取消／重試端點寫 upgrade-order.json；systemd path＋service 單 |
| 4 | P3-4 | CM-3264 | 有新版橫幅 |
| 5 | P1-10 | CM-3266 | 收尾與診斷：保留上一版映像、更新包保留到下次成功、清掉更早的；diag 併進度檔與更新單並遮罩；下載診斷包走更新單 |
| 5 | P1-7 | CM-3265 | 自動退回、開機檢查、guidantai recover：丟棄複本、改接原份、啟動保留的舊映像、健康檢查；systemd  |
| 5 | P3-2d | CM-3267 | 跨版兩段：更新站回路徑 |
| 5 | P4-5 | CM-3268 | Agent 升級指令比照主系統：每步時限、進度檔、失敗自動退回 |
| 6 | P1-9b | CM-3269 | CI 跨版排練：e2e 目標先裝舊版＋灌真實舊庫，再用新包 guidantai upgrade；失敗擋 package |
| 6 | P4-2 | CM-3270 | Agent 跟進 |
| 7 | P4-3 | CM-3271 | Agent 跟進 |
| 7 | P4-4 | CM-3272 | 更新中心 Agent 跟進區：批次表、暫停／繼續、推選定、只升 Agent 說明 |
| 8 | P5-1 | CM-3273 | 手冊與安裝文件：升級一章改寫 |
| 8 | P5-2 | CM-3274 | SPEC：更新中心頁新頁 |
| 8 | P5-3 | CM-3275 | e2e：更新中心頁 |
| 8 | P5-5 | CM-3276 | 結案卡：jedi-remote-agent 發正式版 |

---

## 第 2 棒｜2026-10-30｜首腦：工作坊 25 跑完後的盤點與交接

**角色**：首腦（開卡那位接續）。工作坊 25 的驗收由工作坊自己開的「CM-3241-首腦-2」做，本棒只盤點與交接，沒有重驗。

**結果**
- 34 張卡 `驗收通過待確認`；CM-3276 結案卡 `In progress`，小弟停在四題等決策者（版號 1.10.0 非 1.9.0、套件清單確認、PROD 印樣怎麼分辨、更新站網域）。
- CM-3273 手冊卡合回 `ws-CM-3241` 失敗兩次：卡工作區有 34 支 security-report 產物未 commit（小弟重跑 render_index 連帶改到），不是本卡內容。
- 各 repo `ws-CM-3241` 領先 feature 分支：BE 54、FE 10、update-center 6、agent 4、jedi 3、LC 2、test 2；全部未 push。jedi-remote-agent `1.10.0b1` 已在 Nexus。
- 新開 `fr167-STATE.md`；README 狀態改「開發期完成，待決策者裁結案事項」。

**決策（本棒無新裁示；待裁清單收進 STATE §4-1，共 11 項）**

**推翻了什麼**
- 第 1 棒文件寫 jedi-remote-agent beta 為 `1.9.0b1`：1.9.0 已被 FR-166.1 占用，實際發 `1.10.0b1`，正式版應為 `1.10.0`。design／README／cards.py 已改。
- P2-4 卡上 R2 路徑 `releases/<版>/` 是筆誤，正確是 `v<主版號>/<版>/`（design §5.4 原本就對）；cards.py e2e 欄已改。
- design §5.1「`mv pgdata pgdata-prev-<舊版>`」做不到：第一次升級前資料庫在 named volume。落地契約見 STATE §3，design 原文不回改（設計稿凍結），測試期照 STATE。

**教訓**
- 連撈 35 張 Notion 卡會 429，中間七張撈成錯誤頁卻沒報錯，差點把「沒撈到」當「沒復核」寫進交接。撈卡要隔幾秒、撈完 grep 429。
- 兩張相鄰的卡各測自己那一半（P3-3 只用假 route、P3-2b 只測 BE），端到端缺口（離線上傳 400）到 e2e 卡才現形。整合點的卡驗收要拿對方真實端點打一次。
- 小弟在 docs 類卡裡重跑整站 build 會把不相干產物弄髒工作區、擋住合回；docs 卡要寫明「只 build 自己那個資料夾、只 add 自己的檔」。

**環境實況（當時）**
- BE 主資料夾 `pyproject.toml` 釘 `jedi-remote-agent==1.9.0`、共用 `.venv` 1.9.0；`ws-CM-3241` 釘 `1.10.0b1`。190 跑 1.26.0。工作坊 daemon 7777／8011；決策者 DEV BE 8000。

---

## 第 3 棒｜2026-10-30｜首腦：11 項待裁拍板、CM-3273 合回、結案卡重派

**角色**：首腦（冷接，讀 STATE／LOG／母卡交接段後 pre-flight，與 STATE 全部相符）。

**結果**
- 決策者對 §4-1 全部 11 項「都照建議」：正式版 `1.10.0`；套件清單可發；PROD 印樣 `PROD-<kid>.pub` 檔名；網域測試期 `*.workers.dev`、`UPDATE_SITE_URL` 出包預設原廠網域；`.venv` 現在換；基線合回後一次重產；版本說明三段放更新站後台（另開卡）；備用章命令第一版不做；送更新站改只送編號加簽章片段（另開卡）；DEV 殘留清掉；34 張 Done。裁示整段回寫 CM-3276，並併入「正式包缺 Agent 交付包就紅」。
- 決策者 10:17 在狀態頁按完 34 張 Done。
- CM-3273 合回：在卡工作區 `git stash push -u -- docs/security-report/` 把 34 支產物移走（留 BE repo `stash@{0}`），`POST /api/workshops/25/resume` 後 10:20 merged；工作坊隨即把 CM-3276 舊卡工作區重建、重派小弟（ccy3，sonnet／low）。
- 共用 `.venv` 的 jedi-remote-agent 1.9.0 → `1.10.0b1`（pip 直裝、Nexus 認證取自 keychain `poetry-repository-nexus`；poetry 的 auth.toml 只有帳號沒有密碼）。主資料夾 pyproject／lock 不改，隨合回帶入。
- DEV 清掉 `background_jobs` 937（`fr167_drain_probe`）與 `product_update_jobs` 4～9（都是 1.27.0 的驗收假單）。表在 `public` schema，不是 `compliance`。
- 35 張卡的「首腦復核」段全部撈過一遍（隔 4 秒撈、grep 429 無命中），把「留給後面」的事收進 STATE §4-3／§4-4。

**決策**：見上，全部是決策者裁示，本棒沒有自行加判。

**推翻了什麼**：無。

**教訓**
- pip 直連 Nexus 要帳密，`--no-input` 沒給會 EOFError 停在互動問帳號；poetry 的 `auth.toml` 只存 username，密碼在 macOS keychain（service `poetry-repository-nexus`），要 `security find-generic-password -w` 取。輸出要 sed 遮掉再印。
- 工作坊的 `/api/workshops/<id>/resume` 一次解兩件事：合回被拒的卡重新檢查再合，anomaly 的卡沿用（或重建）卡工作區重派。不用分別按。
- Notion 母卡的 relation 欄最多回 25 筆，母卡屬性摘要列的子卡數不是全部，看卡數要靠 STATE §2 或工作坊狀態頁。

**環境實況（當時）**
- `.venv` 1.10.0b1；決策者 8000 的 DEV BE 是 1.9.0 時代起的，重啟後才吃新版。BE `ws-CM-3241` 領先 feature 57 commits；其餘六 repo 不變（FE 10、update-center 6、agent 4、jedi 3、LC 2、test 2）。全部未 push。工作坊 28（FR-170）同時卡在 CM-3236 合回 `jedi-password/poetry.lock`，與本案無關。

### 第 3 棒續記（11:40）：批 9、10 收完；決策者裁 A 案、工作坊首腦擴卡
- CM-3276 第 2 輪過、合回；批 9（3293／3295／3299）、批 10（3294／3296／3297）全過全合回。
- CM-3293 小弟做完卻把「本機驗不到」當卡住留 In progress，工作坊 anomaly 暫停一次；首腦判打折送驗後過。小弟自述誤用 `git checkout` 還原自己檔案，已請工作坊首腦核 reflog。
- **推翻了什麼**：我開的 P6-5「簽章片段」在簽章上做不到（驗片段需客戶端私鑰，主系統沒有）。CM-3297 小弟給 A／B／C，決策者在工作坊裁 A：授權中心另簽不含客戶名稱的 `update_ticket`。工作坊首腦據此開 CM-3300～3302、改寫 CM-3298 到批 13。這是決策者直接在 runner 視窗裁示，首腦事後驗收不回頭質疑授權（LOG 記一行）。
- **教訓**：① 開「改身分格式」這類卡前，要先問「驗證端拿什麼驗」——片段驗章需要私鑰，我沒想到這層就開卡；② Monitor 管線尾端接 `cut` 會吃緩衝，兩次 30 分鐘零事件都是這原因，log 其實一直在動；③ 工作坊首腦會在首腦不在時直接開卡，`cards.py` 底表會落後 Notion，收尾要補回。

### 第 3 棒續記（12:00）：開發期全部收完
- 批 11（3300／3301）、批 12（3302：jedi-license-runtime `1.1.7b1`＋套件 migration 005）、批 13（3298：BE 有票送票、無票退回送原文並 warning；釘 1.1.7b1、lock 只動該套件；手冊三處改回）全過全合回。首腦抽核 3302 Nexus 有包、3298 lock／manifest／DEV 欄位三件屬實。
- 工作坊 25 `waiting_approval`，十張等 Done。CM-3298 卡工作區 remove 失敗留殘骨（41,934 追蹤檔已刪、剩 dotfile），不自己清。
- 七 repo `ws-CM-3241` 領先：BE 67／FE 14／update-center 11／agent 4／jedi 7／LC 4／test 5，全未 push。
- **教訓**：套件 migration 是 build 期從 site-packages 攤平、不入版控——核「manifest 沒變」不是漏，是對的；要核的是 DEV 欄位在不在。

### 第 3 棒續記（12:20）：七 repo 合回 feature 分支
- 決策者按完十張 Done 後下令合回。工作坊 `/merge` API 要主資料夾乾淨且會在衝突停住，改手動 `merge --no-ff`。BE 四處、FE 一處衝突，皆為 ws 從 10/29 開出後 feature 又收了 FR-166.1／FR-169，雙方在同一登記型檔各加一段。
- **推翻了什麼**：FR-167 事件碼 `AGENT_UPDATE_BUNDLE_FETCH`／`AGENT_UPDATE_ROLLOUT_CHANGED` 原占 6229／6230，FR-166.1 已先占到 6236，合回時重編 6237／6238（程式只以符號名引用、無字面值，FE 無對應 i18n）。
- lock 以 feature 為底只重解兩支；`.venv` 順帶補齊 FR-169 五支（lock 早有、venv 落後）。
- **教訓**：① 平行 arc 各自在 `event_code.py` 挑號，合回才撞——下次開卡時事件碼先在母卡佔號段；② zsh 把 `$T:path` 的 `:c` 當修飾子吃掉，用 `git cat-file -p "${T}:path"` 繞；③ 工作坊 merge API 的「主資料夾乾淨」前提在 LC／test 有不相干髒檔時過不了，手動 merge 不受影響。

### 第 3 棒收（14:35）：DEV 看畫面、雛形 v2 套上、開批 14～17、交接
**結果**
- 七 repo push（決策者授權當次）。DEV 起測試環境：BE／worker 指本機假更新站（test repo `update-site-stub.js`）、LC DEV 5062；DEV 授權換成本機 LC 簽、綁本機 Mac 指紋的落地版照（id 5087，帶身分票），決策者裁維持不還原。
- 決策者逐點改更新中心：iOS 式一張卡 → 另一 session 出雛形 v2（`d2c7c81a6`）決策者「OK 就這樣」→ 首腦照 v2 套 FE。之後決策者連續微調：儀表板橫幅字級／位置／間距、展開區不要灰卡、停機不寫分鐘、按鈕說明改 hover、版本說明加框、失敗改主卡內警示區、Agent 全部最新只留清單、跟主系統一起更新時可選台。FE 13 個 commit 見 STATE §2。
- `version-bump` skill 加「更新中心顯示文字」段（`83115a96f`）。
- 開批 14～17 八張卡 CM-3306～3313（`a47658200`），決策者 14:10 按開始；工作坊 25 開了新首腦「CM-3241-首腦-3」，CM-3309 已合回、CM-3308 第 1 輪不通過修正中、CM-3307 送驗中。

**推翻了什麼**
- 首腦先把雛形 v2 讀成「推翻 D16、Agent 一律分開」並照此開了 CM-3306／3313；決策者更正為「**可選**跟主系統一起或分開，一起時可選台」。兩張卡改標題、改卡尾模型理由段、append 三段首腦更正；cards.py 同步。
- CM-3306 卡上寫「apply schema unknown=EXCLUDE、FE 先送新欄位會被略過」是錯的：apply schema 拒收未知欄位，決策者 DEV 實測 400。FE 加 `SEND_AGENT_FOLLOW=false` 先不送，卡上更正。
- 第 2 棒 STATE 說「影響範圍顯示預設文字是資料源沒欄位」：真因是 e2e 假站只回 `notes`，假站已補（test `18fa48a`）。

**教訓**
- 查 schema 寬鬆度要看**那支端點用的 schema**，同檔別的 schema 是 EXCLUDE 不代表全部都是；最穩是實打一次。
- 起測試環境時 API 與 worker 是兩支程序，環境變數要兩邊一起帶；worker 漏帶 `GUIDANT_RELEASE_KEYS_DIR` 讓下載驗章失敗，頁面跳出「上次更新沒有開始」，決策者看不懂以為是 UI 問題。
- 決策者說「Agent 跟主系統分開」時要追問是「一律分開」還是「也可以分開」；雛形畫的是兩條路徑之一，不代表另一條要拿掉。
- 拆成多張卡的說明區塊只露出最後一張時會失去脈絡；狀態類訊息放在它所屬的那張卡裡，不要獨立浮在頁首。
- Monitor 管線尾端別接會緩衝的指令（`cut`），否則 30 分鐘收不到事件。

## 第 4 棒｜2026-10-30｜首腦：批 14～17 收完、合回 feature、DEV 重啟到新程式

**角色**：首腦（決策者開的 session，冷接）。pre-flight 與 STATE 相符，差異只有批 14 進度比 STATE 寫的更前面。

**結果**
- 批 14～17 十張功能卡全過驗、全合進 ws；工作坊首腦-3 另補開 CM-3316（更新站 `min_agent_version` 斷在 register-draft／publish 這段）、CM-3317（Agent compose 包旁產 `.notes.json`，即第 3 棒在 CM-3310 卡上預告要補開的那半）。決策者 16:10 按完 Done。
- CM-3312（test e2e 綁 v2）兩次 anomaly 暫停工作坊：小弟程式寫完 commit，但卡上要求「本機 8003＋FE dev＋假站實跑全綠」做不到（本機沒服務、`.env.e2e` 指 190 禁碰）；重派後又停下等人回答。決策者裁暫緩，留 190 測試期實跑。
- 四 repo `merge --no-ff ws-CM-3241`（BE／FE／update-center／agent）零衝突（merge-tree 先試）。BE 登記型檔只有 `product_update_error_code.py` 加三碼、`manifest.tsv` 加一行。
- `fr167-dev/` 從第 3 棒 scratchpad 複製到 `~/Projects/Billows/Audit-Manager/.fr167-dev/`；kill 核過的兩個 PID 後以三個更新站變數重啟 BE 8000 與 worker，status 端點 401（守門在）、假站 health 的 kid 與公鑰一致。
- FR-170 首腦通知 Agent repo 結構已換（`core/` 凍結、背景工作一律 WorkerComponent、六支守衛、venv 換 knWYPLiu）。盤過：FR-167 碰 agent 的卡只有 P4-5／P4-3／P7-4／P7-10，全做完，都不碰 CM-3314 的兩支檔；agent HEAD 五支守衛紅是 FR-167 `update_sync` 舊寫法，由 FR-170 CM-3314 改。

**決策**：CM-3312 暫緩（決策者）；BE 守衛兩紅判為 FR-170 範圍不擋本案（合回前同一 commit 跑一樣紅）。

**推翻了什麼**：無。

**教訓**
- 「本機驗不到」的 e2e 卡在開發期會反覆觸發工作坊 anomaly（CM-3293、CM-3312 兩次）；e2e 卡的驗收條件該寫成「dry-run 無未定義 step」，實跑放測試期，不然每張都要人介入。
- 工作坊首腦會自行補開卡（CM-3316／3317），STATE §2 與 cards.py 都會落後；接手先看 workshop.log 的「派工」行而不是只看 STATE 的卡表。
- 合回前先 `merge-tree --write-tree` 試合，零衝突再真合，四 repo 一次做完；判「既有紅」要拿合回前那個 commit 開 detach worktree 跑同一支測試對照，不憑印象。

### 第 4 棒續記（17:40）：進測試期——套件發版、清漏洞、換測試章、pipeline 跑 190
**結果**
- 決策者要測真的更新。190 現在 1.26.0 沒有 `guidantai upgrade`，第一次只能走 pipeline 排練（清 190、裝舊版、灌 STG dump、install.sh --upgrade）；之後再出 1.27.1 用離線檔在更新中心真換版。
- 第一次 pipeline 3007700648 擋在 verify：pip-audit 81 項新 CVE（12 支第三方）。決策者裁「升版這 12 支」，並要求「套件有要發的都要發，用最新套件包版」。發六支套件、BE 改釘、版號進 1.27.0（細節見 STATE §1「測試期第一步」）。
- 原 DEV 發布印樣私鑰遺失，換新測試章 `b91819f86eb4b4f8`（決策者選「我產新測試章」）。
- 188 jedi clone `main` → `feature/FR-139`（決策者授權）。pipeline 3007809601 開跑。

**推翻了什麼**
- STATE 寫「jedi-remote-agent 1.10.0 已發正式版」屬實，但事件碼 6230～6236 的 commit 晚於 release commit，1.10.0 不含；補發 1.10.1。
- 第 2 棒說 jedi-ldap 0.1.0 之後有未發改動：核 Nexus wheel，0.1.0 已是新分層、雜湊與 lock 一致，不需發。

**教訓**
- 看 Nexus 版本清單別用 `tail -N`：1.10.0 照字母排在 1.6.0 前面，被截掉後誤判「Nexus 沒有」。要 `sort -V` 列全部。
- 升一支漏洞套件可能把另一支壓回有洞的版本（litellm 1.104.0 加 filelock<4）；每次 poetry update 後看 Downgrading 行，再跑一次 audit。
- 分類沙箱有自己的鎖檔（pip-compile、帶 hash、在 amd64 image 內解析），BE poetry update 清不到它；pip-compile 不帶 --upgrade-package 不會升版。
- 188 的 BE／FE／jedi 三個 clone branch 要一致：CI 只 pull 不切，jedi 停在 main 會讓 build_classifier_image 版號不符而停。
- 出包前先核「這次會不會跨版」：rehearse 要求新舊版號不同，同版號的 pipeline 就算 verify 綠也會在 rehearse 停。
- glab 登入過期時 `glab auth login` 在 Claude 內跑不了（要互動），請決策者開一般終端機跑。

### 第 4 棒續記（18:55）：排練連三紅、修兩支 migration、190 清空
**結果**
- pipeline 3007825867 紅在 verify：被取消的 3007809601 在 188 留下孤兒 build_release.sh／nuitka（掛到 PID 1），CI 的 pgrep 守門以為有人手跑。只 kill 那三個確切 PID。
- pipeline 3007846452 紅在 build-be 的 smoke：從 STG 1.26.0 升級停在 `2026-10-24-fr162-seed-iec62443-reference-framework.sql`（寫套件 012 才加的 language_code；migrate.sh 先主線後套件）。修：主線改空操作，資料由 jedi-oscal-v2 025 同 uid 冪等提供（`b3e9a0821`，同 fr135 先例）。
- pipeline 3007940374 紅在 rehearse ⑤：**1.26.0 舊包本身在全新機器裝不起來**（`2026-09-22-fr114-asset-read-capability-backfill` 查能力點，但能力點在第三輪才建）。已出貨的舊包改不了，所以「CI 排練從零重灌 1.26.0」在 190 必紅。
- 改走全新安裝 1.27.0 前，用出貨 1.27.0 init image 在空庫 init＋照 migrate.sh 順序逐支套（不中斷）：只有 `2026-10-17-fr144-project-task-menu-order.sql` 失敗（驗證段整串比對選單，FR-161 後來在同群組加了 pre-engagement=25）。修：只驗本檔管的六項（`7b3918a65`，**未 push**：git 對 gitlab.com 的憑證過期，`could not read Username`）。修後新裝 148／0、從 1.26.0 升級 164 支＋能力點 243 皆 0 錯誤；突變驗證段仍會擋錯。
- 決策者裁：190 的 Guidant 主系統＋Agent＋安裝包全部移除、清空間；sentry／glitchtip／bugsink／repos／jenkins／e2e-env／舊備份一律不動。已清：兩個 compose 專案與全部 guidant／agent volume、/srv/guidant-ai(-agent)、/etc/guidant-ai(-agent)、/usr/local/bin 三支、home 下 1.25.1／1.26.0／1.27.0 包與解開目錄、Guidant 與 classifier 映像。磁碟 106G → 45G。設定與祕密先備份在 190 `/home/jedi/guidant-config-backup-20261030-185327.tar.gz`（600）。

**推翻了什麼**
- 第 4 棒前段說「排練段只有 package 會紅」：排練段自己也會打包，PROD 印章與 Agent 交付包守門在那裡就擋。已加 CI input `internal_test`（`0de0d3ca2`）。
- 「從 1.26.0 重灌再升」不可行（舊包缺陷），測試起點改「全新安裝 1.27.0」；升級路徑改以 STG dump＋migrate.sh 在本機驗。

**教訓**
- seed 類 migration 在全新安裝必重放；驗證段寫死「整個群組現在長怎樣」，之後任何功能往同群組加東西都會讓新裝失敗。驗證只驗本檔自己改的那幾列。
- 主線 migration 不可寫套件 migration 才建的表或欄位（先主線後套件）；要寫就放進套件。
- 驗「新裝」與「升級」是兩條路：STG dump 只驗得到升級；新裝要拿出貨的 init image 在空庫跑 init＋migrate。
- 取消 pipeline 後先在 188 查 pgrep 孤兒 build，否則下一條 verify 直接紅。
- 一次掃完所有失敗再修（不中斷逐支套），不要修一支、跑一輪 pipeline、撞下一支。

### 第 4 棒收（22:35）：190 線上更新第一次實測，第 0 步逾時；交接
**結果**
- Agent 兩版：1.4.3 裝 190（已核准、心跳正常）、1.4.4 收進 1.27.1。Agent build 一路撞三個 FR-166／FR-170 後過時的檢查（LDAP 收錄路徑、smoke 用 http、就緒判定寫死舊名）與 Go 工具 CVE，全修。
- 189 LC 更新到 feature（product_major＋身分票），決策者授權。
- 更新站部署到 Cloudflare、改掛 `guidantai-update.jedicotech.com`（決策者不要個人名稱）、Access＋R2 設好；1.27.1 直接寫進 D1 發布（決策者裁，略過 Access／內部先裝）。190 指向更新站。
- 決策者實測：檢查更新 → 預先下載（成功）→ 更新到 1.27.1 → **第 0 步 self_replace 60 秒逾時，系統未動**。
- 依決策者「一天太久」改檢查更新每 6 小時＋啟動先問一次（`7774e7345`），順修 GUARDED_TICKS 漏列 `_agent_rollout_tick`。

**推翻了什麼**
- 以為只有 package 段會紅：排練段自己也打包，PROD 印章與 Agent 包守門在那就擋（加 `internal_test`）。
- 以為更新中心「立即」會先提醒 5 分鐘：FE 文案如此，後端與 design 都是立刻開始，文案錯。

**教訓**
- 每步時限要依「這版包多大」估，不能沿用小包時代的數字；gzip 包抽單一檔也得讀完整包。Agent 包收進主系統後包大 1.8G，第 0 步就爆。
- 出包流程第一次真機跑會把所有跨 FR 的過時檢查一次壓出來：開發期只在 DEV／本機驗，全鏈從沒跑過。
- 監看 log 的 pgrep 會抓到自己的 ssh 指令列，判「還在跑」要看確切進程，不要信 pgrep -f 的計數。
- 對決策者回報要全程中文，本棒多次混英文被點名。

## 第 5 棒｜2026-10-30～31｜首腦：190 四次實測、P8 九張卡、夜間無人值守出 1.27.2

**角色**：首腦（決策者開的 session，冷接；中途決策者授權 push／套件發版為常態、交付無人值守）。

**結果**
- 190 線上更新實測四次：①第 0 步 60 秒逾時（systemd 繞道 600 秒）②第 4 步 bugsink 變數未設、自動退回成功 ③第 4 步 vulndb 因 redis unhealthy、**自動退回也失敗**、`guidantai recover` 救回 ④成功 1.27.0→1.27.1。Agent 1.4.3→1.4.4 推送成功（心跳等 4 分、解包無進度 3 分）。
- 首腦當場修並 commit：bugsink 每段 `ensure_bugsink_env`、退回換設定改原目錄覆寫（`dbc_restore_item`）、重試跳第 0 步、退回起 bugsink、診斷包 644；同 patch 手套 190。
- 待辦 1～27 拆 P8 九張卡 CM-3336～3344（批 18～21），工作坊 30 auto 模式自跑全過全合回（CM-3339 驗不過一輪、CM-3343 因卡含 FE 檔停下問，首腦縮範圍 resume）。
- 夜間：合回三 repo 並 push、FE 補 14 個錯誤碼翻譯、Agent 升 1.4.5、188 出 Agent 1.4.5 與 BE 1.27.2、測試章簽、R2、D1 發布。

**推翻了什麼**
- 第 4 棒 STATE 待辦 11 寫「對 failed 按更新到 X 會重下載 5.25GB」：錯，下載前會重驗 incoming 包、驗過直接 ready（190 實測 26 秒）。
- CM-3343 卡寫「13 個錯誤碼」、小弟報 16：用 Python AST 實數為 14（grep 會把跨行定義算錯）。
- P8-9 原卡要小弟去 188 出包：會打出不含修正的包（188 pull 的是 feature/FR-139，修正只在 ws 分支），派工前改由首腦接手。

**教訓**
- **188 手跑出包有三道只寫在 CI 的前提**：PATH 加 BE `.venv/bin`（pip-audit）；DB 斷言 rc 3 走 `smoke_tempdb.sh`（`build_all.sh` 沒這條分流，手跑永遠出不了包；絕不升 STG）；export `GUIDANT_BUGSINK_ADMIN_PASSWORD`。另 Agent build 要 `FE_CONSOLE_DIST` 指**當下 FE** 建的主控台產物（沿用舊暫存會帶舊前端）。
- 退回換「被常駐容器 bind mount 的目錄」不可 `rm -rf`＋`cp`：inode 變了容器看到空目錄，退回自己也起不來。
- 「先換自己再跑」的設計：修在升級過程中執行之程式（主機 lib、前端跳轉）的東西，要裝了那版之後**下一次**升級才生效。
- Mac git 對 gitlab.com 憑證失效時，用 `-c credential.helper='!glab auth git-credential'` 借 glab 既有登入，不存新憑證。
- i18n JSON 補翻譯要文字插入，`json.dumps` 整檔寫回會重排數百行（今晚又犯一次，已還原）。
- Agent 程式有改就要升版號，同號重出會被更新中心判「已是最新」而送不到。

### 第 5 棒續記（11:05）：190 升 1.27.2 成功、P9 九張開卡、交接
**結果**
- 10:04 決策者按更新到 1.27.2，10:19:41 完成（7 分 40 秒）；第 4 步以正式包過錯誤追蹤站與弱點庫兩關、redis 全程 healthy；清理刪 1.27.0 映像與首次升級 named volume。190 繞道 `fr167-self-replace-timeout.conf` 已刪。`role-manage` 已被第三輪清掉；`tool-plugin-manage` 仍在（待辦 28 未修）。
- 決策者點出結構性痛點：每修一次升級流程要出兩包升兩次才看得到、一包一兩小時。裁 A（維護頁隨第 0 步換新）＋B（第 0 步秒級）＋D（快速出包），C 同版重升不做；本體與 Agent 各出兩包（1.27.3／1.4.6、1.27.4／1.4.7）驗收。
- 開 P9 九張 CM-3346～3354（批 22～24）；決策者同意升級後刪解開目錄只留安裝包；eml／msg 待裁。
- 決策者授權 push 與套件發版為常態（CLAUDE.md、memory 已改）；定調朝向無人值守自動化。

**推翻了什麼**
- 第 5 棒先前說「待辦 17 已修」：只對維護頁成立，更新中心頁 `STEP_NAMES` 到 1.27.2 仍漏第 0 步（待辦 31 補）。
- 第 5 棒先前說「190 升 1.27.2 時會一起清 tool-plugin-manage」：錯，那是待辦 28 未修的部分，1.27.3 才會。

**教訓**
- 修在「升級過程中執行之物」（主機 lib 第 0 步、維護頁、更新中心升級中畫面）的東西，第一次升級跑的是舊版，要再升一次才看得到。回報「這次升級會看到 X」前先分清 X 是升級前就在跑的、還是升級中才用到的。
- 升級流程停服務前前門仍是舊版，所以「自動跳維護頁」這類前端修正天生晚一版；A 的做法（維護頁靜態檔隨 ops.tar 在第 0 步換到前門掛載目錄）把它拉回當次。
- 190 實測的回饋要邊看邊記進 STATE 編號（本棒記到 34），決策者說「晚點一起修」時才拆得出卡；不要等測完憑記憶補。


## 第 6 棒｜2026-10-31｜首腦：P9 批 22～23 驗收合回、兩張改拉、補兩張卡、188 清磁碟

**角色**：首腦（決策者開的 session，冷接第 5 棒）。

**結果**
- 決策者裁 CM-3349／3351「不要靠心跳、不要等 Agent 回報」：改成 Agent 開唯讀 `GET /update/progress`（守門沿用 `/update`）、主系統 overview 對下發中那幾台並行拉、記憶體快取；不加表不加 migration，心跳與 `enroll.py` 零 diff。
- 補開 CM-3355 P9-10（fe，批 23：Agent 8 格展開＋五個證據上傳入口 accept 讀白名單端點＋錯誤碼翻譯）、CM-3356 P9-11（fe，批 22：Dockerfile npm install 獨立層、.dockerignore 不排 .git；另一 session 清 188 時發現，派工單核過三處修正後開）。
- 批 22～23 十張全過工作坊首腦驗收（P9-1 退一輪：維護頁 js/css 多一層；P9-9 退一輪：關卡掛在共用 adapter 會擋掃描結果 .spdx；P9-7 退兩輪），出版首腦開檔抽查全對得上卡。四 repo `--no-ff` 合回 `feature/FR-139` 並 push：BE `742787553`（含 CM-3353 的 1.27.3、pyasn1 0.6.5）、FE `a51fabaf`（1.27.3）、agent `58793ac`（1.4.6＋RELEASE_NOTES）、jedi `47050878`（iam 1.11.1／detection 1.7.1／file-upload 1.6.0b1 已在 Nexus）。
- 188 磁碟 98%→79%（83G 可用）：只刪自家舊包（1.25.1／1.26.0／1.27.0、1.27.1 解開目錄、fr167-bundle-old、fr167-offline、home 的 guidant-ai-1.26.0）、Agent compose 1.4.1～1.4.3、自家映像 1.27.0／1.27.1、Agent 1.4.1～1.4.4；第三方映像、dist、build cache、Prompt Guard 不清（決策者明示）。kill 兩個 FR-133 留下 21 天的 `until pgrep build_all` 等待迴圈。

**推翻了什麼**
- 第 5 棒 P9-4／P9-6 設計（心跳帶進度、升級中 5 秒一跳、rollout 加 progress 欄）：決策者裁改拉，整張改寫。
- 「先清三週前那 9G build cache」：實跑 `builder prune --filter until=168h` 回收 0B，104 筆舊快取全是被現存 image（STG 現役 1.26.0、Harbor 1.26.0 副本、LibreOffice／Prompt Guard 層）引用的 shared 層，刪不掉；根治改寫進 P9-7 的 `--keep-storage 20G`。
- prune 先 append 到 P9-2，但小弟 11:50 已做完、12:40 才追加沒看到——移到 P9-7（CM-3352）才做進去。

**教訓**
- 卡派出後再 append 的修正 runner 看不到（memory 早有）；這次自己又犯。追加前先看工作坊 log 那張是否已判 done。
- `pgrep -f` 守門會抓到自己的命令列（含關鍵字的 `bash -c`），遠端跑要用腳本檔或 `[x]` 字元類技巧；FR-133 的兩個等待迴圈就是這樣互相卡 21 天。
- Nexus 私庫 pip index／pip download 都探不到版本，要用該套件目錄下 `poetry search`。
- CM-3353 小弟判斷正確：首腦還沒合回 feature 時，188 pull 到的是舊 HEAD，出包會白跑；結案卡的前置是「首腦先合回 push」，下次開結案卡寫明依賴首腦動作、或把合回放進結案卡前一批。

### 第 6 棒續記（18:20）：五版發布、190 熱換、188／189 核心重開、交接
**結果**
- 發更新站：1.27.3（P9）→ 1.27.4（版號）→ 1.27.5（FE 三修正）→ 1.27.6（版號）→ 1.27.7（FE 輪詢看單不看畫面＋Agent 無本輪紀錄不畫格）。update-center 部署 ops 支援（`8e6ea6e`）。
- 190：1.27.2→1.27.3→1.27.4→1.27.5→1.27.6 四次線上升級全成功（第 0 步 1 秒、自動跳維護頁、亮色都驗到）；18:00 熱換前端 image 為修正版；正在升 1.27.7。
- 188 STG／189 POC：seccomp errno 524 根因＝核心沒重開（跑 -187／-171、已裝 -202），兩台重開後全 healthy；189 磁碟 90%→61%、188 98%→82%。188 STG api 三容器起回、資料完好。
- FE 修正四個 commit：`a4126e2b`（Agent 成功收合）、`13ef3ecc`（目標版號不被舊單蓋）、`30addad1`（遮罩＋scheduled 已到＝submitted）、`e1849538`（輪詢看未結束更新單）。

**推翻了什麼**
- 第 6 棒自己先後三次（待辦 13／19／37 延伸）在「問到狀態後怎麼畫」上補格，決策者點名「一直在原本的機制上找答案」。access log 一看才發現是輪詢停了（`ready` 不在 ACTIVE_VIEWS）。正解是輪詢看「有沒有未結束的單」。
- 第 6 棒先判 seccomp 524 是 runc bug、升了 189 的 containerd（無效）。對照 190（同軟體版本、核心 -198 正常）才指到核心沒重開。
- 第 6 棒 12:xx 誤刪 188 `/home/jedi/guidant-ai-1.26.0`（以為是解開的舊包，實為 STG compose 工作目錄）；從 tar.gz 重建救回。

**教訓**
- **修畫面問題先看 access log 有沒有在問**，再看問到什麼。輪詢條件綁畫面狀態＝每多一個狀態就漏一格；綁「單結束了沒」才是機制層的修。
- **錯誤訊息指到的那層不一定是壞的那層**：errno 524 在 runc 報，壞的是核心；先找「同軟體版本但正常」的對照機。
- **刪目錄前 `docker inspect` 全部容器 working_dir／mount**（memory 已立）。
- 驗 minified JS 有沒有某段程式，不能 grep 變數名（被改名），要 grep 字面值序列（字串常數順序不變）。
- 熱換單一容器：compose 檔要用資料目錄那份，容器標籤的 working_dir 可能已被清理刪掉；`guidantai restart` 不重建容器。

## 第 7 棒｜2026-10-31～11-01｜首腦：升 188／189、P10 八張、1.27.8 發布三台線上升、Agent 1.4.7、PM 簡報與機制報告、P11 七張

**角色**：首腦（決策者開的 session，冷接第 6 棒）。

**結果**
- 188 STG 18:33→18:39、189 POC 19:21→19:33 用 1.27.7 `install.sh --upgrade` 升（第一次、1.26.0 無升級程式），各 164 支 migration、資料完好；兩台加 `UPDATE_SITE_URL`、`guidantai start` 套用；刪 1.26.0 解開目錄（核零引用）。
- 決策者升級後三問 → 待辦 45（側欄 localStorage）、46（能力點翻譯）、47（CRA PDF 沒進包：188 `.build/storage-seed` 8/21 殘留＋build_bundle「已存在不動」）；另 44（下載完 37 秒空窗：ready 當中途狀態、寫單前重算雜湊）、48（決策者裁拿掉 90 天）、49（主系統沒打 report）、51（Agent 目標版空判「已是最新」）、52（CRA 繁中 deprecated 列升級路徑留下）。開 P10 八張 CM-3358～3365（批 25～28，衝突檢查抓到 P10-1／P10-3 同撞 error_code 登記檔，移批）。
- 工作坊跑完 P10-1～7；結案小弟被決策者停，首腦 188 接手出包（22:16→22:52，smoke 9 PASS），`publish-1278.sh` 23:01 發布；190 apply → **P10-3 新預檢擋「核心沒重開」**→ reboot → retry 23:19 成功；188／189 同時 apply 23:34 成功（兩台第一次走線上）。更新站回報表三台 `succeeded`（P10-6 真環境驗過）。
- 189 兩台 Agent 1.4.2 手動升 1.4.7（1.4.2 無遠端更新能力；主機間無免密 SSH 經 mac 中轉 1.8G 兩趟）。
- 三台 bucket 補灌 CRA PDF（照 install.sh `load_storage_seed` 同路）。
- PM 簡報 10 張（決策者逐頁改：拿掉現況與對象句、簽章頁改一張圖、第 7 頁流程圖、第 8 頁狀態中文、第 10 頁架構圖、刪 11／12 頁）；PM 會議 23 條分類 → A 類開 P11 七張 CM-3366～3372、B 類先不討論、Q5＋20 查為備份機制缺口 → 機制問答報告。
- 本機 BE／worker／FE 重啟到合回後程式。

**推翻了什麼**
- STATE 寫「188／189 沒裝 Agent」→ 189 有兩台 Agent 在別機器報心跳；「update-center 在 main」→ 本機在 feature/FR-139 且 8e6ea6e 未 push。
- 第 6 棒待辦 42「文案把被刪說成沒附」只是表象，根因是 `install.sh --upgrade` 路徑 `bundles/` 不存在 → 目標版空 → `is_lagging` 回 False。
- 簡報初稿「不信任更新站」「六道驗證含 90 天」「CI 傳 R2 登記草稿」三處被決策者點名：用語像罵自己、90 天已裁拿掉、CI 段從沒跑過要據實。
- 「Q5 backup 目錄檔案不見」→ 不是不見，是舊流程 pg_dump 停更、新流程只留一代快照，沒有備份機制。

**教訓**
- **修畫面問題先對時間軸**：待辦 44 用檔案 mtime＋DB 列＋journal 三方對出 37 秒落在哪一段，才知道洞在「寫單前重算 5G 雜湊」不在輪詢。
- **mac 沒有 `setsid`**：`nohup setsid …` 在 mac 靜默失敗、服務沒起；188（Linux）可用。本機起服務用純 nohup 加子 shell。
- **開包 grep 整顆 3G image 太慢**（`grep -r /` 超過 3 分），改用實升驗證或 grep dist 目錄字串。
- **新預檢第一次就擋到真狀況**：190 跑 -198 已裝 -202 卻正常，是運氣；P10-3 擋下後重開再升才乾淨。預檢擋的是「會不會炸」不是「現在有沒有炸」。
- **同範本複製的 VM 指紋會相同**（待辦 54），更新站按指紋統計與封鎖會互相干擾。
- **卡上寫「已存在就不動」的快取邏輯要配守門**：storage-seed 殘留讓 CRA PDF 漏包，守門「map 筆數 ≠ 檔數就擋」比「每次重建」更早抓到。
- **決策者追問機制時，一題一答、先結論再事實**；他連問九題（min_base、release.json 欄位、90 天、兩把章、公鑰放哪、簽名在哪、UC 存什麼、check 給什麼、怎麼認證）每題都要對回程式碼那一行，不能憑簡報措辭。


## 第 8 棒｜2026-11-01｜首腦：P11 七張驗收合回、UC 0004 部署、基線重產 1.27.9、出 1.27.9 包並發布（三台升級留決策者）

**角色**：首腦（決策者開的 session，冷接第 7 棒）。決策者 01:2x 令「他出完包你幫我跑發佈腳本、我要自己測試一次升版」「交給你囉我明天早上來看、允許 push 跟發套件包」，之後無人值守。

**結果**
- 工作坊 30 在決策者 01:11 按完 P10 Done 後自動派 P11 批 29（01:14）→ 批 30（01:29）→ 批 31（01:40），工作坊自己開的首腦 session 逐張驗收通過；本棒做合回／部署／基線／出包。
- update-center：合回 `9cd76ea`、Worker 測試 97＋CLI 48 綠、push、`d1 migrations apply --remote` 0004、`wrangler deploy` a24b6d26。
- FE：合回 `88cb65b4`、版號 1.27.9 `fb0b3e7f`、push。BE：合回 `38889a128`（3369／3370／3371）、DEV 套 reported-at、基線重產 `aef74c6b0`、版號合回 `55c8d574d`、push。
- 188 02:02 `fr167-build-1279.sh` 出包；發布結果見下一行（出完補）。
- 出包 02:02→02:35（Nuitka＋smoke 9 PASS＋8 顆 image＋封包），開包：storage-seed 11 檔含 CRA PDF、`lib/diag_upgrade_stage.sh` 含 upgrade_log、ops.tar 22 項、Agent 1.4.7 包在、BE 執行檔含 `PRODUCT_UPDATE_STEP_SELF_REPLACE`／`agent_fingerprint`／`upgrade_log`／`last-switch.json`。`publish-1279.sh 1.27.9` 02:42→02:46：測試章簽（含 ops 兩欄）、R2 `v1/1.27.9/` 五檔、D1 一列 published（18:46Z）、說明四條。包 sha256 `6810fdfd…`、5,262,333,964 bytes。三台未升（決策者自己按）。

**推翻了什麼**
- STATE 寫「P11 等決策者在工作坊派」→ 工作坊 30 是 auto 模式，P10 全 Done 後自動往下派，首腦接手時批 29 已在跑。
- STATE §6 註解的套件版號（jedi-remote-agent 1.10.0／jedi-license-runtime 1.1.7b1）過期，實際 1.11.0／1.1.7。
- 第 7 棒待辦 44 修法「主機撿單與預檢兩次可併一次」未做，只做了寫單前不重算；非本棒範圍，記著。

**教訓**
- **結案卡要寫「首腦先合回才能出包」而且 stamp gate 會擋新 migration**：CM-3372 小弟正確地停在「188 出包會被 stamp 檢查擋下」並建議基線重產，首腦照 8206f1788 流程做（備份→套→重產→三張 diff）。下次 P-結案卡前一批若有主線 migration，首腦在合回時就順手重產，不要等結案小弟報。
- **`gen_stamp_sql.sh` 版號來自 pyproject**：前兩次重產時 pyproject 還是 1.26.0 所以標記沒動；這次會跳到 1.27.9。`init.sh` 用 `LIKE '__init_baseline_v%'` 判斷，版號只是標籤，但 diff 會看到 289 行全換，要用「檔名集合 diff」而不是行 diff 判斷有沒有掉列。
- **update-center `npm test` 會把 `.worktrees/` 底下的 node_modules 測試一起跑**（30 紅全是 blake3／zod 套件自己的測試與 worktree 副本），要 `--exclude '**/.worktrees/**'`。
- **`tail -F` 監看工作坊 log 收不到事件**（log 檔被整檔重寫），改成每 20 秒比行數的輪詢才可靠。
- **等 build 的 `until grep` 不能只抓 `FAILED`**：smoke 輸出含 `FAIL=0`／`FAILED` 字樣會提前跳出，要錨定 build 腳本自己印的 `^[time] DONE|build_all FAILED|build_bundle FAILED`。
- **Agent 回報更新站（P11-1／6）沒有新 Agent 版就驗不到真環境**（待辦 57）。

## 第 8 棒（後半）｜2026-11-01 09:00～12:50｜首腦：Office 預覽與 Profile 下拉、jedi-detection 1.7.2、1.27.10＋Agent 1.4.8、189 升級、決策者兩項裁示

**角色**：同一個首腦 session，決策者在場即時下令。機制問答另交給 QA session（`qa-session-handoff.md`）。

**結果**
- 決策者回報 189 證據 Word 預覽 500（存在遠端 Agent 121 上的 docx）。根因兩層：Agent 從沒接 jedi-file-upload 的設定讀取 port（`settings.configure`），`LIBREOFFICE_CMD` 設了也沒人讀，退回 PATH 找 `soffice`；容器 PATH 只有 `guidant-soffice`。另一份外部分析只看到「容器版漏設 env」，只加 env 不會好。
- demo 應急（決策者令「直接改」）：121 容器內 `ln -s guidant-soffice soffice`，免重啟生效；12:31 換 1.4.8 新容器後消失、由正式修正接手。
- 正式修正：evidence-agent `ab3a5b6`（接線＋Dockerfile ENV＋守衛測試、兩條突變紅）。
- 決策者問 Agent 主控台 CINC 為何不能選 Profile：主控台從 FR-166 P2-3 起把 Profile 庫欄退成文字；但 Profile 早由心跳同步到 Agent 本機（121 有 8 支 TWGCB）。加主控台下拉：evidence-agent `3215a8c`（`/console/api/scan/profiles`）、FE `bd8ce295`；再依決策者要求補「依工具過濾、名稱同主系統」：jedi-detection `7aed6d2a` 1.7.2（心跳清單帶 `tool`、`name`，已發 Nexus）、BE `0643d95b7` 改釘、evidence-agent `6a184d3`、FE `a156ea01`。
- 出包：Agent 1.4.8（`67bc162`）、BE／FE 1.27.10（`ee7d1a807`／`23b700fb`）；188 先刪 1.27.5～1.27.7 本機包騰空間（R2 已有、無容器引用）；主控台前端在本機 build 後 scp 到 188（188 沒 node）。11:06→12:01 出完，開包核 Agent env／BE `tool_code`／主控台字串；`publish-12710.sh` 發布，用 Worker `planPath` 以 vitest 實跑確認 1.27.9／1.27.8 都直選 1.27.10。
- 189：決策者 12:14 升 1.27.10 八步全成功；12:22 推 Agent。121 12:31:50 升完、12:36:30 主系統收成功、12:37:07 回報更新站；60.167 12:27:36 失敗「無法讀取新映像」並回報更新站（**P11-1／P11-6 第一次真環境驗過**）。
- 支援頁診斷包說明只列「包含什麼」（決策者令）：FE `f0a2e29b`。
- 機制問答報告加升級接力圖（改了四版：泳道→時間軸→mermaid flowchart→sequenceDiagram＋autonumber，再改亮色單主題），拿掉 Q8 打折段。
- 決策者裁示：①主系統與 Agent 分開更新（取代「第二期先不討論」）②不再用心跳帶訊息（「雷到一個不行」）。需求紀錄 `docs/draft_requirement_spec/2026-11-01-agent-independent-update.md`、memory `feedback_no_heartbeat_piggyback_messaging`。

**推翻了什麼**
- 「8 格之前是好的」→ 從 P9-6／P9-10 起 BE 放 `item.progress`、FE 讀 `rollout.progress` 就沒對上；成功時 FE 全打勾不看進度，10-31 在 190 看結果才沒發現（待辦 60）。
- 「121 沒收到進度請求＝主系統沒拉」→ 錯，`docker logs` 只看得到新容器；舊容器那段 log 跟著被換掉。查升級中 Agent 行為不能只看現容器 log。
- 「預覽 PDF 只存儲存區、不寫 DB」→ 錯，jedi-file-upload `convert_to_pdf` 另寫一列 `upload_files`（`file_name`＝存檔 ID、scope 預設 customer），Agent 主控台照列（待辦 58）。
- 「主系統完全不用動、只升 Agent 就好」→ Office 預覽確實只靠 Agent；但現行 Agent 只能隨主系統包送達，且依工具過濾要主系統帶新欄位，所以仍得出 1.27.10。

**教訓**
- **背景等待的 grep 不能抓 `FAIL`**：smoke 輸出含 `FAIL=0`，兩次被誤觸提前結束；一律錨定自己腳本印的 `^[時間] ALL DONE|... FAILED` 並加「腳本已不在跑」退出條件。
- **兩張同批平行卡寫同一份契約（BE 產、FE 讀），開卡要附 JSON 形狀範例**；驗收要看「途中」而不是「結果」，結果畫面常用捷徑蓋掉資料。
- **Agent 升級會換容器**：任何「升級中 Agent 狀態」的判讀都要跨新舊容器看，或看主機層檔案（`/srv/guidant-ai-agent/upgrade/`）。
- **心跳當訊息通道，延遲就是心跳間隔本身**：新容器啟動那一跳早於主機收尾，結果晚 5 分鐘回；決策者裁不再用。
- **artifact 只存在 claude.ai、scratchpad 會清**：產出要給 PM／主管的頁，做完就拉一份進 FR `briefing/`。
- **mermaid 的 init 配色只有淺色**，頁面支援深色時圖會看不見；給主管的頁直接定亮色單主題。

## 第 9 棒｜2026-11-01 12:5x～15:3x｜首腦：60.167 真因、兩台清磁碟、P12 收口卡、批 32 合回、技術文件站、重試 412 修、母卡收 Done

**角色**：首腦（冷接第 8 棒，決策者在場即時下令）。決策者此棒明令：收口卡現在開、文案改立刻開始、合回 main 但不跑出版流程、Agent 獨立更新放下一個 FR 與 FR-171 一起、技術文件「一主題一份、分類做好」、重試 bug 直接修且允許 subagent、最後「都幫我收 Done」。

**結果**
- 60.167 推 1.4.8 失敗真因＝磁碟滿（dockerd journal `no space left on device`，`upgrade_order.sh:305` 吞 stderr），不是 docker／核心。清舊 1.4.2 映像、1.4.7 包副本、舊 compose 專案 0230 三個 volume → 13G→31G。
- 188 build 機 6.7G→100G：24 個無容器引用的舊 tag、build cache 74G→36G、解開的 1.27.8／1.27.9 目錄、Agent 舊包、`/home/jedi/seaweedfs` 獨立實驗組、0.2.28 孤兒 seaweedfs＋volume（決策者逐項裁）。**沒刪 `/home/jedi/guidant-ai-1.27.7`**：redis／seaweedfs／bugsink 標籤仍指它（待辦 62）。
- P12 收口開五張 CM-3374～3378（`6d58890eb`）；CM-3377 Bugsink 密碼決策者裁不做（`596cbdbbb`）；CM-3378 結案出包裁等 FR-171／172。批 32 三張工作坊 30 自動跑完、決策者 13:47 Done；首腦合回 FE `d18e98a2`、Agent `2b78d00`（RELEASE_NOTES 衝突：ws 基底只到 1.4.4，以主線為底加「下一版」段），bats 51 綠、vitest 27 綠、push。
- 技術文件站（`d03ab084c`）：四棒 subagent（決策者明令允許）寫 FINAL-SPEC、九份技術規格、發版手冊、SPEC 與兩份手冊對 1.27.10；首腦自做 PM 簡報靜態頁（claude.ai Slides 專案轉單檔）、README 重寫、側欄分類（三支改名 `-spec`、QA 交接搬 handoff/、design／discussion h1 改名、render_index 登記 briefing／prototype）、build 與截圖驗 mermaid。
- 重試 412 修（決策者「直接修掉」）：BE `38ce72ad2` 進度檔 `failed／timeout＋unchanged` 同步成 `skipped`；FE `78e4f535` `canRetry` 只認 rolled_back／skipped。BE 213 綠、FE 79 綠。
- 收 Done：P11 七張、母卡 CM-3241（append 收口段）。analysis `docs/analysis/2026-11-01-fr167-online-update-four-decisions.md`（先換自己、輪詢看單、無有效期、不用心跳）；memory `feedback_agent_upgrade_image_unreadable_means_disk_full`。

**推翻了什麼**
- 第 7 棒「三台指紋相同會被更新站算成一台」→ 錯，主鍵含 license_id，三列都在；真正會撞的是 LC（範本 VM machine-id 相同）。
- 第 8 棒「60.167 疑 docker／核心」→ 磁碟滿。
- 首腦自己把待辦 39（Bugsink 密碼）當「要修的缺口」開卡 → 決策者問「為什麼會跳出這項」，它只是記下的疑慮，關卡。
- 待辦 2「立即」文案 → P8-3 `933aa083` 早已修，不必開卡。
- 文件棒查到 design 與程式碼不同：七張表非六張、客戶端無 90 天、身分改身分票、正式 publish 不帶 ops 兩欄、第 5 步不起 worker、時限數字；後台 Agent 三欄永遠 0（待辦 63，等 FR-172）；`failed＋unchanged` 重試 412（待辦 65，已修）。

**教訓**
- 「記下的疑慮」與「裁定要修的缺口」要分開列，開收口卡前先問決策者哪些是後者。
- 刪遠端目錄前的防呆（容器 working_dir／config_files／mount）這次擋下一次：線上升級不重建的服務標籤仍指舊目錄。
- claude.ai Slides 匯出的 deck.json＋slide 片段本地開不了，要給站用就轉成單檔靜態頁。
- build script 的底線規則只對資料夾生效，檔名加底線藏不住；交接類文件放 handoff/。
- 同一份 `RELEASE_NOTES.md` 工作坊基底過舊必衝突，解法固定：主線為底、ws 的段落放最上。

### 第 9 棒收（15:5x）：雜檔整理、worktree 清除、交接

- 決策者把七 repo `feature/FR-139` 合回 `main`（首腦未切 branch，接手時 `git branch --show-current` 皆為 main）。
- 七 repo 雜檔：BE FR-170 `unattended-rules.md`＋站頁入版控（`89d270e8b`、`4f9cc336d`）；LC 工作坊規則入版控＋`.gitignore` 比照主專案（`4cfa423`）；test／update-center／jedi 各補 `.gitignore` 排產物（`80e8087`、`f4d2cd0`、`7842c01b`）。PyCharm 顯示的三個「Changes」與 HEAD 無差，是狀態沒刷新。
- 七 repo `.worktrees/CM-3241` 與 `ws-CM-3241` 全刪（決策者令「worktree 跟 branch 都刪掉」）：每個先核 ws 對 feature ahead 0、工作樹乾淨，`branch -d` 安全模式全放行；遠端本來就沒這個 branch。
- 教訓：build script 的底線規則只對資料夾生效；站重 build 後要 `git status` 看連帶變動的 html（這次漏了 design.html 與新頁 html 一次）。
