# FR-166 Agent 獨立作業主控台 — LOG（append-only，每棒一 block）

---

## 2026-10-26 首腦第 1 棒：立案 → 討論稿 v4 → 八幕雛形 → §14 全量工作清單（session 名「[R1]Agent獨立作業頁面首腦」）

**做了什麼**
- 老闆五點需求白話複述對齊 → FR-166 立案登記 → 討論稿 v1（五種登入模式比較、D1～D10）＋六幕雛形。
- v2：決策者問「C 模式斷線怎麼登」「沒設過密碼怎麼辦」「業界有這種設計嗎」「要不要起 Postgres」→ 三層登入、不起 PG、未同步只准診斷、離線 30 天停掃；情境盤點三十餘條併入七條設計改動。
- v3：決策者要求「整個重新分析：死結、沒想到的情境、既有機制、不重複造輪子、規範」→ §13 四張表（既有機制 24 列逐項開檔實查、死結 18 條、新情境 15 條、八支資安規則逐條對照）；推翻前稿四處；新 D15（7 天 reaper）、D16（DB 版本表）。
- v4：LDAP 實查（jedi-iam `ldap_adapter.py` 登入本體對、六個缺口未修）→ D17 三選一、D18 釘住推翻 CM-2239、D19 抽 jedi-ldap；§14 全量工作清單 37 項五階段含可砍性與最小可出貨組合。
- 雛形：登入頁照主站 `Login.vue`；殼改側欄＋頂欄＋狀態列（四個環境訊號）；總覽改儀表板（數字卡／狀態燈牆／疊柱／容量條）；掃描頁改步驟條；身分來源獨立幕 8；未同步幕 7。
- 決策者糾正兩處：第三方元件掃描「本來就在 Agent 跑，不是移過來」→ §4.3b；「所有工具都要能在 Agent 獨立執行」→ D3 修正 ZAP 全開（網址納清冊）。
- analysis 文件、兩筆 memory、README 三段、FR 登記表。

**commits**：`042fda5d9`、`998071b95`、`8e875d4a7`、`b3725ec04`、`741af922e`、`5c29e087b`、`07e264d65`、`cb6e290d4`、`b731e7c06`、`c15de726a`、`c3e28f19b`、`85a6c9e7a`、本次交棒 commit。全在 BE repo `feature/FR-139`，未 push。

**決策（決策者裁）**：D1～D19 全裁，見 STATE §2 與 discussion §9。殼與儀表板形狀、登入頁照主站。多因子明列不做。

**推翻了什麼**
- 前稿「Nmap 執行主機不過清冊」→ 實查 `_run_one` 整包 check，已過。
- 前稿「離線暫停逾時」→ 主系統根本沒有派工逾時機制，改為新增 reaper。
- 前稿「回報端點已冪等」→ 只對 cancelled，succeeded 重送會重產證據，要改任何終態。
- 前稿「FR-071 診斷包可沿用」→ 那是主系統端的，Agent 要新做。
- 首腦「D3 手動模式不含 ZAP」→ 決策者裁全開，網址納清冊。
- 首腦「第三方元件掃描結果落 agent_local_runs」理由講錯 → 它已在 Agent 執行，結果走既有 `source_scans`。
- 首腦「不做從主系統發動重啟」→ 決策者指出跳轉進主控台按就是從主系統發動；加心跳旗標。
- 首腦「LDAP 太龐大第二期」→ 決策者判老闆會要，納入；抽套件後變中等。
- FR-157 頂部 TabView 殼 → 七頁改側欄。

**教訓**
- 大型 FR 定案前整案重走一遍，既有機制只能開檔驗（memory `feedback_rewalk_whole_case_before_design_verify_existing_mechanisms`）。
- 「第二期」不能默默留，要明列「太龐大不做、決策者可反對」。
- 拿別案（FR-129）當理由砍需求是錯的；需求在、就在本案把前提補齊。
- 雛形用 regex 批次改殼會吃掉內容（幕 3、幕 7 各丟一段）、殘留多餘 `</div>` 讓後面幕位移；改完要逐幕驗 div 配對與側欄座標。
- 討論稿 §14 表七欄在 1400 寬要橫向捲動，給 PM 看時可另出只有 §14 的精簡頁。

**未完**：PM 砍工項；互動雛形（決策者未選範圍）；design.md；套件異動點頭；開卡。

---

## 2026-10-26 首腦第 2 棒：雛形從八幕補到十二幕（session 名「[R1]Agent獨立首腦-2」）

**做了什麼**
- 冷接盤點後對照 §14 逐項找雛形缺口，決策者令「12 幕都畫」。
- 新增四幕：服務與重啟、檢測工具與檔案（FR-157 既有頁換殼）、主系統 LDAP 設定、安裝與升級終端機。
- 補回幕 4 網路除錯上半區（九卡儀表板、目標、十項勾選），從 07e264d65 取回。
- 幕內加「這一頁的變化」切換：登入四種變化、掃描三種、除錯確認框、重啟確認框、LDAP 現況與憑證變了、安裝四種。
- 主系統 Agent 管理補「身分來源」欄與「主控台連入白名單」設定。
- 修既有三個錯：幕 5 殘留 FR-157 舊頂欄（標頭出現兩次）、未同步時側欄仍顯示王小明登入、未同步總覽仍顯示執行數字與紀錄。
- 做法：scratchpad 寫 Python 產生器切片既有幕、新幕用同一個殼函式產生，不用 regex 改殼；逐幕驗 div 配對、79 張 headless 截圖逐張看，亮暗兩模式都看過。

**決策**：無新裁示。雛形照 D1～D19 畫。

**推翻了什麼**
- STATE 前一版寫「雛形八幕」未註明幕 4 上半區已遺失；實際 b731e7c06 起就只剩結果卡。
- 第 1 棒雛形的總覽在未同步狀態顯示數字卡與最近執行，與 §3.4「總覽只顯示註冊狀態與診斷入口」不符，已改。

**教訓**
- 用 regex 批次改殼吃掉內容的事故，第 1 棒只補回兩幕，第三幕（幕 4）漏了；改完要拿每幕的關鍵詞對照 git 前一版，不只驗 div 配對。
- 登入失敗畫面不能為了「好看」寫出被鎖或帳號不存在，SR-01.1 規定四種失敗同一句。畫錯誤狀態前先查資安規則。

**發現待修**：討論稿 §3.3 表格「升級強制補設、不設不起服務」與 D13「無人值守不強制」矛盾；雛形照 D13。

**未完**：決策者確認雛形；PM 砍工項；design.md；套件異動點頭；開卡。

**決策者第一輪審雛形（同日）**：幕 2 總覽拿掉近 7 天、被拒絕等歷史數字（「只要當下」），狀態燈與 Agent 資訊分開（「燈裡混了資訊，那不是燈」）；幕 4 這台的網路同樣拆成資訊＋連線狀態，補「勾幾項跑幾項、會不會被當攻擊」說明；幕 7 身分來源改名「LDAP 設定」（「就是 LDAP 就叫 LDAP」）。決策者四問：手動掃描進不進歷史、本機執行與回傳的關係、檔案頁權限、安裝題目能否搬進 UI——前三題首腦查檔答覆，第四題盤出可搬清單等裁。教訓：狀態燈只能放「有沒有問題」，一盞一句原因；純資訊另開區塊、不上色。功能名用使用者認得的名詞（LDAP）不用抽象詞（身分來源）。

**決策者第二輪（同日，「都照你建議的改」）**：噪音——不限制只勾一項，改成按開始前算總連線數（勾幾項加總）顯示噪音條，超過 10 次或含中高項目跳確認；埠上限 10→5、連線間隔 1 秒。文案——「本機手動」改「Agent 手動」。回傳——三狀態（已回傳附時間／待回傳／回傳失敗附原因），在線可「立即重試」、離線反灰等自動補傳，主系統端手動匯入列第二期。**裁示兩項**：檔案頁維持 FR-157 租戶層（離線操作者授權逐人勾、專案層另開 FR），授權頁與手冊加「Agent 檔案＝看得到整台」一句；安裝題目只搬儲存設定進「服務與重啟」頁（CLI 留備援），重新註冊與升級留 CLI。教訓：決策者問「全勾不就一堆」是對的——首腦前一版只回答單項噪音，沒算總量；噪音要以「這次總共幾次連線」計，不是逐項標籤。

**裁示併進討論稿（同日，決策者令）**：§9 加 D20～D22；§14 P1-2／P2-1／P2-4／P2-6／P2-7／P2-8／P4-5 對應補字，P2 卡數 12→13（儲存表單）、合計約 51；§5 加「噪音以總量計」段、埠上限 10→5；§4.2 回傳三狀態與立即重試；§3.3 升級那格對齊 D13（原矛盾消除）。順手清掉兩處「原本」。v4→v5。

**互動雛形（同日，決策者令「老闆跟 PM 要看」）**：決策者要省額度但不用 subagent，切 Opus 由首腦主線做。做法：十二幕靜態畫面一個位元組都不改（建置後比對與已提交版完全相同），只在上面加一層互動 JS／CSS；按鈕依「所在幕＋按鈕文字」委派，沒接的跳「雛形不做」提示。上方加「跟著走」四條流程。點擊測試 31 項全過、page error 0。

**踩到的坑**（點擊測試抓到、DOM 檢查抓不到的）：
- 總覽「執行紀錄 ›」連結的監聽選擇器寫成 `.scene[overview] a`，連側欄連結一起吃掉，點側欄任何一項都跑去執行紀錄。改成只選 `.content` 裡文字含「執行紀錄」的那一個。
- 跑完掃描再從側欄點「掃描工具」，會停在「執行中」畫面。側欄導覽改成把掃描、除錯重設回第一步。
- 執行中畫面用寫死的兩台假資料，使用者在步驟②只勾一台也顯示兩台。改成照步驟②實際勾的目標產生。
- 確認框標頭的噪音等級是從靜態框複製來的「中」，全勾含「持續監測」時應該是「高」。改成跟實際等級。
- 教訓：互動雛形要跑點擊測試＋看截圖，兩個都要。DOM 斷言全過時截圖仍抓到三個錯（目標數、標頭等級、殘留提示）。

**design.md 落地（同日，PM 裁全做）**：決策者先改三條規範再寫——套件異動不必事前點頭改發版前統一確認；「不做義大利麵」入 CLAUDE.md／卡片範本／skill；「批＝能同時跑的那一組」入 workshop.md／CLAUDE.md／skill。design 照 FR-157 結構：§3 D1～D22、§4 現況接入點 25 列、§5 七段、§6 拆卡表、§7 驗收 20 步。**拆卡表先寫成 `handoff/cards.py` 跑斷言**：第一版 42 張手排，程式抓到 7 組同批撞檔（routes.py blueprint、enroll.py observer、Shell.vue 選單、i18n、RemoteAgentManage.vue）。解法不是往後推批而是「登記型檔先佔位給 owner 卡」：P1-4 一次掛四支 blueprint、P1-3 一次掛三個 observer、P1-7a 一次寫全選單；P3-6b 併進 P3-4b。終版 41 張 9 批零撞檔。這個做法已寫進 big-feature-workflow skill Step 4。發現 evidence-agent 未登記在 workshop.toml（20 張卡派不出去），已加；Notion「Repo」選項要決策者加。教訓：拆卡表用程式驗比用眼睛排可靠，撞檔的解法是改結構（owner 先佔位）不是改順序。

**開卡（同日，決策者令「建吧」）**：`gen_notion_cards.py` 從 cards.py 產 spec → `notion_create_case.py` 一次建 42 張連號 CM-3109～3150 → `patch_workshop_fields.py` 補五欄＋母卡子卡清單。讀回驗證：41 張 `母卡`／`Stage` 全對、Repo 欄 agent／fe／jedi-packages／test 對、主 repo 空。**踩到**：母卡「子卡」relation 讀回只 25，查是 Notion relation 分頁（`has_more: True`）不是 PATCH 失敗——驗的時候要看子卡的 `母卡` 欄，不看母卡的 `子卡` 欄。**Repo 欄**：決策者問「沒有後端不是很詭異」，先加了 `be` 選項，查工作坊程式 `repo_of` 空＝main、`work_dir` 對不在 `[repos]` 的名稱拒派，加了選了就派不出去，移掉並寫進 workshop.md；BE 卡在卡名標「BE」。**規範**：決策者授權 Notion 欄位與選項首腦自加（skill 與 tracker 已記）。交棒：STATE 任務總表 41 列為單一來源。

**未完**：決策者派批 1；下一棒首腦驗收。


---

## 2026-10-26～27 首腦第 3 棒：冷接、批 1 派出、工作坊整晚自動跑（session 名「[R1]Agent獨立首腦-3」）

**做了什麼**
- 冷接讀完 STATE／LOG／design §3 §4 §6／母卡，答自檢四題、唯讀盤點（五 repo 皆 `feature/FR-139`、無 FR-166 實作 commit、批 1 四張五欄齊）後待命。
- 決策者問記憶有沒有跨帳號共享：查出 `~/.claude`、`~/.claude-runner`、`~/.claude-runner2` 三份各自獨立、只靠人工單向同步，runner2 有 7 支、runner 1 支從沒進 repo。依決策者令：①10 支彙整進 `docs/claude/memory/`（8 搬、2 合併）；③工作坊規則「git status 有別人改動就停」加例外「`docs/claude/memory/` 不算」（BE `.claude/rules/workshop.md`、agent-workshop 範本與 CLAUDE.md）；再把 repo 395 支整份覆蓋到 runner、runner2 個人目錄（原目錄備份 `memory.bak-20261026-221052`）。symlink 方案決策者裁捨棄。
- 批 1 派出後盤自動跑風險：三 repo（evidence-agent、jedi-python-package、test）有工作坊產的未提交 CLAUDE.md 指標＋`.claude/rules/workshop.md`，小弟 git status 會停 → 各自 commit。
- BE pyproject 掛著 FR-165 的 path dependency，批 3 CM-3120 要切 jedi-remote-agent 會疊在一起 → 決策者令「可以發就發」：review diff（兩支只新增）、跑全套（226／179 passed）、bump jedi-detection 1.5.0、jedi-source-scan 0.3.0、build 到乾淨資料夾開包驗、publish Nexus、BE 還原 pin 驗 venv 非 editable。
- 確認 jedi-remote-agent 1.6.0 無欠發。

**commits**：BE `1f57b4d44`（記憶彙整＋規則例外）、`7756d5b29`（STATE 批 1 In progress）、`1e54d10a2`（FR-165 pin 還原）、本次交棒；agent-workshop `c3bb5e0`；evidence-agent `ba3dd01`、jedi-python-package `0f88a559`（工作坊檔）＋`348adaa1`（FR-165 進版）、test `f297f6c`。全未 push。

**決策（決策者裁）**：記憶走「repo 一份＋各帳號複製」不做 symlink；FR-165 兩支套件發版。

**推翻了什麼**
- STATE §3b 寫「首腦收到『驗收 #N』才驗」——實際工作坊 22 是 `auto` 模式且**自開首腦 session**（CM-3109-首腦）驗收，手動開的首腦收不到驗收指令。手動首腦的角色變成複核與總表維護。
- STATE 寫「批 1 全驗完決策者按『開始下一批』」——auto 模式不用按。

**教訓**
- 接手前先看工作坊 `/api/status` 的 `dispatch_mode` 與 `planner`，才知道驗收是誰做、要不要等人按。
- macOS sed 不吃 `0,/re/` 語法，靜默不改；bump 版號用 python 或 `sed -i '' '1,/re/s//…/'`，改完 grep 驗再往下。
- 記憶「個人副本＋人工同步」實測會漂（30／336／359／387 四個數字），要定期從 repo 推回各帳號。

**未完**：§3 總表以 Notion 重刷；複核工作坊首腦驗過的卡；看合回衝突與額度；STATE §3b 第 4 點四件小事等決策者。

---

## 2026-10-27 首腦第 4 棒：重刷總表、批次複核 54 張已驗卡（session 名「[R3]Agent獨立首腦-4」）

**做了什麼**
- 冷接讀 STATE／LOG／design §3 §6，答自檢四題，查工作坊 22 `/api/status`：`paused`、runner 0、首腦「CM-3109-首腦-2」standby、已驗 54；停在 CM-3164【要決策者決定】；批 14（CM-3160）未 approved。
- §3 總表以 `/api/status` 的 stages＋Notion 五欄重刷成 57 張 14 批（補進 CM-3151～3166 十六張補丁／P5 卡），批號改以工作坊實際排法為準。
- 複核不逐卡重讀，改按 repo 批次實跑：五支套件測試、Agent 全套＋守衛、BE 守衛＋全套（對 merge-base 基線 diff）、FE vitest＋兩個 build、登記型 owner 卡佔位 grep、DEV DB migration／能力點／RLS／ui_routes。結果表在 STATE §3b。

**commits**：BE `8a1f05b1e`（STATE 重刷）、本次（複核結果＋LOG）。未 push。

**決策（待決策者）**：CM-3164 套件補兩欄小卡；Agent `cap_add: NET_RAW` 守衛紅沒卡；CM-3148 兩題；CM-3160 必做。

**推翻了什麼**
- STATE 寫 CM-3148 暫緩原因之一「主站要求重啟未合回」——實查 BE／FE `ws-CM-3109` 都有 restart 接線（CM-3143／3144），這個缺口已消失，只剩兩題。

**教訓**
- BE venv 用 `.pth` 把六支套件根目錄都放進 sys.path，`jedi-ldap/tests/__init__.py` 會遮住 jedi-remote-agent 自己的 `tests`（它沒有 `__init__.py`），直接 `pytest` 會 7 支 collection error；要在該套件目錄用隔離過的 sys.path 跑。這不是程式問題，但發版前把 jedi-remote-agent `tests/` 補 `__init__.py` 或各套件 pytest 設 `--import-mode=importlib` 會省事。
- 全套 BE 測試有互相污染（license_status 8 支、task_execution 2 支整批跑紅、單跑綠），比對基線要先排除這類，不然會把它們算成本案造成。
- 54 張卡逐張重讀成本太高；owner 卡的佔位、守衛、build、DB 狀態用一輪批次就能覆蓋八成風險，剩下靠決策者手測清單。

**未完**：四件待決（上）；合回規劃（BE `feature/FR-139` 領先 ws 35 commit）；8000 BE 仍跑舊程式。

---

## 2026-10-28 首腦第 4 棒（續）：決策者邊測邊改，主控台與登入機制收斂（session 名「[R3]Agent獨立首腦-4」）

**做了什麼**（依決策者發問順序）
- 套件六支發版（jedi-ldap 0.1.0、jedi-iam 1.8.0、system-core 1.3.0、remote-agent 1.7.0、detection 1.6.0、source-scan 0.4.0），BE 還原 pin；123 改源碼模式跑 Agent。
- 主系統 Agent 管理頁重整（主表 21→7 欄、⋮ 選單、細節進對話框、頂端四格儀表板）；全站數字卡收回 `MetricCard`。
- 主控台：總覽重設計（健康環＋數字卡＋問題優先燈號）、網路除錯三步精靈、殼切兩個獨立捲動區；登入頁拿掉 console-login 指令與在線標語。
- 「前往主系統登入」：`CLOUD_WEB_URL`（開發環境前後端分開時用）＋主系統回程頁 `/agent-console-return?agent=<uid>`，登入（含兩階段）後自動簽票跳回；回程網址不由主控台帶（防 open redirect）。
- 登入機制收斂（延伸卡 CM-3170～3178）：離線登入天數由租戶設定（預設 7、1～30、心跳下發、Agent 夾上限）；AD 只問 AD 且不受天數限制；已登入的離線操作者每個請求重驗（**實測確認原本是漏洞**：天數到期後既有 session 仍 200）；本機關閉離線登入開關；密碼規則同主系統；授權一鍵全選；主系統與主控台閒置 15 分提醒 30 分登出（**主系統原本整段閒置登出被註解掉**）；本機管理員登入通知租戶管理員、密碼 180 天提醒；主系統位址只收 https（源碼模式明確設定才放 http，打包版無效）。
- 名稱雙向同步（CM-3179）：主系統管理頁與主控台都能改，以修改時間較新者為準。
- 總覽「這台 Agent」只留使用者看得懂的六列；可掃描目標清單只給有掃描或除錯範圍的人；磁碟燈文字依狀態、拿掉沒用的「前往處理」。

**commits**：evidence-agent `4c2b115`～`b123741`、FE `21843ee4`～`aadb68b6`、BE `bfca2987b`～`b6136542b`＋本交棒、套件 `8611b4a3`、`5e7b75ad`、`ec27f616`。全部 push。

**決策（決策者拍板）**
- AD 登入仍要在名單上（AD 只證明你是誰，範圍看主系統授權）；未同步不准 AD。
- 本機管理員保留為救援帳號；不做主系統遠端停用或重設（主系統掛掉時做不到，且要多開一條傳密碼的路）。
- 不做主控台反向登入主系統（Agent 在內網，被攻破就能簽主系統身分；權限會往上擴大）。
- 離線天數由租戶在主系統設、預設 7；本機開關只能收緊。
- 改名第一種：兩邊可改、以最後修改時間為準。

**推翻了什麼**
- 「重啟 Agent 會解除密碼鎖定」——錯，鎖定存 DB；是**整台機器重開**才會解（monotonic 時鐘）。
- 決策者記得主系統密碼要求特殊符號——實查 jedi-iam `PasswordPolicy` 只要 12 碼＋大小寫＋數字。

**教訓**
- **實機走一遍抓到單元測試沒抓到的兩個 bug**：`EventCode` 是整數常數類別不是 Enum，`EventCode(int)` 拋 TypeError 被吞成 method=null；axios 攔截器「網址含 login 就不帶 token」讓 `offline-login-policy` 一律 401。新端點與新欄位一定要實打一次。
- 自動資安檢查三次都說中：寫入沒限定租戶的疑慮（查過無害）、https 只在啟動檢查一次（改進共用出站層）、總覽對所有登入者吐內網拓撲（改跟 targets 端點同門）。**新增資料出口時先問「同一份資料在別條路要什麼權限」**。
- 停背景指令會連帶殺掉它 `nohup` 起的 BE／Agent（踩兩次，第二次讓改名同步看起來失敗）；重啟一律 `(nohup … &)` 起、不要包在等待迴圈裡。
- 心跳下發「只有 key 在才動」的慣例讓「清空」做不到；本棒的新欄位都接受這個限制（密碼只能重設不能清、名稱不會變空），以後要能清空的欄位得另設計。

**未完**：延伸 10 張手測（STATE §3b 表）；§3b 待決策者六項；jedi-remote-agent 發版；出貨基線重產。

## 2026-10-28 首腦第 5 棒：陪決策者手測、直接修、開 13 張卡、復核工作坊 8 張（session 名「[R3]獨立Agent首腦-5」）

**做了什麼**
- 冷接自檢後陪決策者手測延伸卡。決策者邊測邊丟，首腦直接修（不開卡）的：主控台 20 條贅述、步驟條置中、根網址導頁、執行紀錄整頁（今日／自訂區間、⋮ 操作選單、狀態／結果拆兩欄、可左右滑照主站 user-manage 寫法、工具顯示名、網路除錯列勾的項目、重新執行帶入設定、失敗看原因可複製）、Agent 錯誤訊息寫入前遮罩（網址帳密貪婪吃到最後一個 @）、麵包屑三層、「檢測工具管理」改名、測試主機從清冊選＋Agent 端過清冊＋對話框關閉清空、側欄「與主系統連線中」、建立專案參與人員下拉 5→50＋搜帳號、主系統檢測工具頁 enable=0 隱藏。
- 查原因不改程式的：第三方元件掃描失敗＝本機 osv-scanner 2.0.3 太舊（安裝包釘 2.6）；掃完四個圈空轉＝本機沒起 worker，且排程累積 70 筆重複弱點庫檢查單（清掉、開 3181 修根因）；「新增專案沒其他人可選」＝下拉只列前 5 個且中文名排前面。
- 開卡 13 張（3180～3192），全部掛 CM-3109、四欄齊；工作坊當棒派了 3180～3187，首腦用合回後程式實跑復核 8 張全過（表在 STATE §3b）。
- 決策者改判 D22：儲存位置只剩內建 SeaweedFS（3190／3191）。決策者裁「檢測工具」主系統頁先隱藏等 PM。

**commits**（都在 `feature/FR-139`，**未推**）：Agent `3b3ea04` `49865a5` `5c2347f` `7b1b946`；FE `cc243c3a` `ec969546` `78dc20ea` `76f3dfbf` `fd375b59` `1588e794` `54a2a6b0` `e961a8f7`；BE `5522f819b`。工作坊合回的另計（Agent `a48207b`～`a181274`、FE `d356a1b8`～`432116a8`、BE `2a9f399a5`～`a0d5377c0`、套件 `1040e044` `783e9a5a`）。

**決策（決策者拍板）**
- 失敗原因要原文可複製，給原廠看；執行紀錄也要看得到，關掉不能消失。
- 執行紀錄要能重新執行；報告要跟主系統一樣線上預覽。
- 主控台路由要跟主系統一樣（history 模式）。
- Agent 名稱、儲存位置：只剩內建 SeaweedFS。
- 主系統檢測工具頁：帳密全在 Agent，先隱藏，PM 確認再拆。
- **AD 分頁要填 AD 帳號，跟主系統一樣**（推翻 3184 的做法）。

**推翻了什麼**
- 首腦自己：3184 開卡時把方向定成「填主系統帳號、查綁定的 AD 帳號去問 AD」。決策者在主系統習慣填 AD 帳號，到主控台照填就 `not_listed`。正確是用 AD 帳號反查名單。**開登入類卡先問「使用者在主系統是填哪個帳號」，不要發明第二個要記的帳號**（已記 memory）。
- 首腦自己：3187 卡上寫 `?inline=1`，runner 做成 `/preview` 子路由，首腦驗收先打錯 URL 以為沒做；以 runner 實作為準。
- 第一次建卡跑錯腳本（agent-workshop 自己的 `notion_create_case.py`），建到工作坊的任務清單、Case No 不是 CM；決策者授權後封存。CM 的卡一律用 BE repo `scripts/notion_create_case.py`，建完另外 PATCH 四欄。
- 「主系統沒有觸發其他工具的掃描」——錯，八支都能從稽核任務派；缺的只是「不經任務臨時掃」的入口。
- 「Agent 自主執行紀錄看不到失敗的第三方元件」不是沒同步，是第三方元件結果刻意只落 `source_scans`，另一個頁籤看得到；3180 做的是索引不是搬資料。

**教訓**
- **實機實打才算驗**：本棒三次單元測試綠但實機錯——工具欄讀錯 `summary.summary` 一層、全部陣列參數合成字串把勾選陣列弄壞、`?inline=1` 打錯端點。每次都是截圖或 curl 抓到。
- **spec 修正腳本斷在第三處，建卡指令照跑**：兩張卡帶著錯座標建出去，只能 append 補正。改 spec 要 `set -e` 或分兩個 Bash。
- **Fast mode 的 grep 吃不到 `--include`**，用 `find … | xargs grep`。
- **本機 worker 沒起是常態陷阱**：STATE §4 已補一行。
- **sleep 65 會被擋**：等心跳用 `until … sleep 3` 的背景 Bash。

**未完**：push → 123 升級；派 3188（進行中）、3189（進行中）、3190～3192；STATE §3b 待決策者 8 項。

## 2026-10-28 首腦第 6 棒：驗收剩餘卡、push 四 repo、升 123（session 名「[R3]獨立Agent首腦-6」）

**做了什麼**
- 冷接自檢後盤點發現本機 BE 的 jedi-source-scan 不是 path dependency（第 5 棒切 jedi-iam 重裝時被換回 Nexus 0.4.0 wheel），`GET /remote-agents/local-runs` 16:43 起一直 500 `AttributeError: page_agent_manual_scans`。切回 path（`pip install -e --no-deps`，`poetry install` 被 lock 擋）、重啟 8000、實打 200／7 列。
- 驗收 CM-3190、3192：讀 diff、讀工作坊首腦復核、在合回後的 `feature/FR-139` 跑 ldap／local_auth／console_ops 四支測試 165 綠。3188／3189／3191 看狀態與 border-left（0）。
- CM-3189 的登入頁 `hint_ldap` 還是舊方向（填主系統帳號），首腦直接改中英兩句（FE `9bc68bc6`），補「要先在主系統用 AD 登入過一次」。
- 決策者授權 push：四 repo 推到 origin `feature/FR-139`（Agent `0acf7a5`／FE `9bc68bc6`／BE `b5716a8d0`／套件 `783e9a5a`）。
- 升 123：`git pull` → `poetry install` → 新 dist-console（備份舊的）→ kill 核過的 PID 3018302 → 重起 PID 3313094 → 心跳 200、`/console/runs` 200、`/console/nope` 404、SQLite schema v5。

**commits**：FE `9bc68bc6`；BE 本棒只動 STATE／LOG（下一個 commit）。

**決策（決策者拍板）**：授權 push 四 repo 並直接升 123 拿來測。

**推翻了什麼**
- 第 5 棒 STATE 寫「本機 BE 三支都走 path dependency」與 3180 ✅——當時是真的，但之後重裝把 source-scan 換回 wheel，驗過的環境又漂走了。教訓寫進 STATE §1 套件列。
- 第 5 棒 §3b 寫「名單用 Agent log『離線操作者名單已更新』看」——123 的 log 沒這句，因為 123（Agent 61）在 DEV 根本沒被授權任何離線操作者，名單是空陣列。不是 bug，是資料面：決策者要在主系統對 ubuntu-lab-03 新增 blsadmin。

**教訓**
- **切 path dependency 後要 `pip show` 三支都 Editable**，別只看自己剛切的那支；重裝會互相覆蓋。
- **123 的 curl 打 Agent TLS 要 `--http1.1`**，h2 協商會回 000 看起來像沒起來；8443 是 mTLS，主控台在 8444。
- **升級前先查這台 Agent 在 DEV 的名單有沒有人**，否則 AD 登入測試一定 not_listed，會誤判成程式問題。

**未完**：決策者在 123 測（先補名單）；本機 Agent 8444 重啟；STATE §3b 待決策者 7 項（套件發版／檢測工具頁拆不拆／守衛測試 4 紅／https／通知管道／基線重產／密碼燈）。

### 第 6 棒（續）：決策者手測後的四件改動與 D23

**做了什麼**
- 離線操作者對話框改版（FE `ddb1f574`）：兩層表頭、文案改管理後台語氣、空狀態與工具列重排。
- 主控台版本號統一加 `v`（FE `430f7fde`）。
- 角色權限頁補漏翻譯（FE `8cd39617`、`d9d04048`）：拿 DB 全部 245 顆能力點對照中英翻譯檔，補 17 個資源名、12 個動作名、17 顆能力點標籤、22 條中文說明；英文說明 232 條整段沒有是既有缺口，沒做。
- 決策者問「沒設定離線操作者還能從主系統連進 Agent 嗎」「權限怎麼判」，查程式回答：入場券範圍由主系統當下依能力點算、能力點是租戶層不分台、離線名單是另存一份範圍。決策者裁 **D23**：離線權限跟主系統同一份，名單只管能不能離線登入；沒有 Agent 能力點的人不可加入。開 CM-3193（BE＋套件，Stage 16）、CM-3194（FE，Stage 17）。discussion.md §9 加 D23、D22 改判同步寫回表格。

**推翻了什麼**
- D1 的「主系統授權離線操作者」原本含逐人勾範圍；D23 改成範圍即時跟主系統，名單上的 scope 欄退為授權當下快照。
- discussion.md 的 D22 表格還寫「四種型別」，決策者第 5 棒已改判只剩內建，這次才寫回。

**教訓**
- **開卡時「順手改另一個 repo 的一兩行」也違反一卡一 repo**：3193 原本叫 BE runner 順手補 FE 的 error-code.json，建完才發現，派工前 append 更正移到 3194。
- **Stage 號要接在母卡最大值後面**：同母卡的舊卡已用到 15，新卡填 7／8 會跟已完成批次混在一起。開卡前先查同母卡 Stage 最大值。
- **i18n 缺漏要拿 DB 當清單比**，不要靠肉眼看畫面；這次一次比出 46 個缺口，畫面只看得到其中一部分。

### 第 6 棒（續 2）：弱點立即檢查、文件 v2、placeholder

- CM-3195／3196 驗收：Agent 全套 1613 綠；本機實機用入場券換 session 打 `/ops/vulndb/check`，心跳 1 秒內出現、去抖與 401 正確。
- 推四 repo、升 123（Agent `0ffacff`）；之後再推 FE／BE 並換 123 主控台為 `11265753`。
- 母卡 CM-3109 append「設計 v1 之後的變更總表」；design.md 出 v2（D2／D17／D22／D23、§5、§8、新增 §10）；SPEC 兩頁補 2026-10-28 變更紀錄並改內文到現況（BE `9cdf880f1`）。
- 主控台輸入框補 placeholder（FE `11265753`）：登入頁依分頁切換、設離線密碼三欄、改名、埠號。
- 按鈕改「連線至 Agent」（FE `10bfdeae`）。

**教訓**：決策者說「本機」時要先問是哪台：本機 Agent（127.0.0.1:8444）與 123 是兩個獨立部署，換程式要各自重啟；這次 AD 登入失敗就是本機 Agent 還跑舊程式。

### 第 6 棒（續 3）：主控台不印指令、工具與目標顯示名稱

- 決策者裁示主控台畫面「一定要拿掉」所有 CLI 指令：密碼燈（改導服務與重啟、非 local-admin 顯示聯絡管理員）、登入頁與改密碼對話框、連入網段重設、儲存面板、本機登入網址失效，共六處（FE `5b52ab17`、`3ece9011`、`6c722029`）。原則：看到的人多半沒有主機權限，一律改「請聯絡負責這台 Agent 主機的系統管理員」；指令留在手冊。
- 總覽「正在執行」工具印代碼、目標空白（Agent `d7d1d54`、`3bb0a6d`）：根因是 `_running()` 把主系統派工的 targets 寫死 `[]`，回應只有代碼。修法：派工登記時用 `iter_targets(params)` 記目標；`local_runs.display_fields()` 回 `tool_name`（工具目錄）與 `target_names`（清冊設備名，名稱等於 IP 的不算），總覽與執行紀錄共用；`targets` 維持純值。
- 本機與 123 都已換上 `3bb0a6d`＋`6c722029`。

**推翻了什麼**：密碼燈說明第一版寫「以本機管理員登入後到服務與重啟設定」，截圖驗證時發現是死路——密碼未設定就登不進 local-admin。改成聯絡管理員。

**教訓**：清冊的「名稱」欄常常就是 IP 本身，顯示名稱前要排除，否則畫面變「10.0.0.1（10.0.0.1）」。

### 第 6 棒（續 4）：123「前往主系統登入」跳不回來

- 症狀：123 主控台按「前往主系統登入」→ `http://10.8.0.6:5180` 登入 → 停在登入頁、不簽票。
- 根因（headless 重現＋抓被吞的錯誤）：`aiChatStore.initSession()` 用 `crypto.randomUUID()`，瀏覽器只在 https／localhost 提供；登入成功後呼叫它拋錯，被 Login.vue 外層 `.catch` 吞掉。**不只 Agent 回程：任何人用 http＋IP 開主系統都登不進**。
- 修法：改用既有相依 `uuid` 的 v4（FE `8e10ad8d`），加測試＋突變；headless 全流程走通。

**教訓**：「登入成功卻停在原頁、沒有錯誤」先懷疑被 `.catch` 吞的例外；用 http＋IP 測一次，安全環境才有的瀏覽器 API（`crypto.randomUUID`、`navigator.clipboard`、Service Worker）會在那裡現形。

### 第 6 棒（續 5）：網路除錯版面、HTML 報告、系統派工名稱

- 網路除錯頁：本機網路資訊收進對話框（頁首按鈕），主畫面只剩三步驟（FE `683c25c3`）。
- 執行紀錄 HTML 報告：Agent 刻意不 inline HTML／SVG（內含腳本，同源執行風險），選單改直接寫「下載」，不再顯示會失敗的「預覽」。
- `credential_handover` 顯示「工具帳密轉移」（Agent `09fed37`）。
- 123、本機都已更新。

### 第 6 棒（續 6）：HTML 預覽——主系統開發機修好、主控台補上

- **主系統開發機 HTML 預覽空白**：後端回應正確（inline＋sandbox），但帶 `X-Frame-Options: SAMEORIGIN`（jedi-file-upload 1.3.8，CM-2062），前端 5180 打 8000 跨埠被擋。正式版前端打相對路徑經 nginx 同來源，不受影響；2026-09-22 起開發機就壞。決策者選 A：Vite 開發代理 `/api`（FE `f9efac75`），各人 `.env.development.local` 改 `VITE_API_URL=/api/1.0`，不放寬資安標頭。5180 已依同參數重起。
- **主控台 HTML 預覽**（CM-3197 Agent `f9fc1af`／`0ccb44c`、CM-3198 FE `9c0d778b`）：照主系統 preview_policy 加 sandbox；HTML 一律 iframe 直接載預覽網址、不轉 blob；頁面 `frame-src 'self' blob:`（PDF blob 預覽原本也被擋，一併修）。卡建成 In progress、作業人員首腦、不設 Stage，工作坊不派。
- 決策者問「報告是否回主系統存」：主系統派工的報告會被主系統向 Agent 取回、存進租戶儲存並掛成任務證據；Agent 手動執行的報告只留 Agent（D4）。

**我自己犯的錯**：突變還原時對 `console/reportPreview.js` 用了 `git checkout --`，把同一檔我剛做的修改也還原掉（只影響我自己未 commit 的那一檔，已重新套用）。違反「禁 git checkout -- <檔>」；之後突變一律用 `cp` 備份還原。
**教訓**：headless 下 PrimeVue popup 選單點不開（四輪皆同），不要再耗時；改以元件單元測試＋在頁面內直接嵌入目標網址實測。

### 第 6 棒（續 7，交棒）：Nmap、私鑰、套件發版

**做了什麼**
- 前端 HTML 預覽補兩道防線（FE `44f2e5f7`）：自動資安檢查指出只靠 Agent 的 CSP；改成回應須帶 sandbox 才畫、iframe 自帶 `sandbox=""`（共用 `FilePreviewPane` 加 `sandboxed` 參數，預設 false，主站與 PDF 不受影響）。
- 決策者要掃描帳號的私鑰：123 本機那幾把都不是；實際用的那把存在 Agent 帳密庫（CINC、GCB），123 上另有一份相同的檔案，比對指紋與雜湊確認一致、能登入掃描目標。私鑰全程未進對話與文件，決策者自行用 scp 取回。
- 123 Nmap 掃描失敗：Nmap 的執行主機設成 123 本身，123 的掃描帳號不收那把私鑰。在 123 為該帳號補上授權（改前已備份），測試連線與實掃皆成功。另發現 123 的掃描帳號 sudo 權限過寬（不限於 nmap），記入 STATE 待決策者。
- **套件第二批發版**（決策者明示）：jedi-iam 1.9.0、jedi-remote-agent 1.8.0、jedi-source-scan 0.5.0（套件 `b7844b71`，已 publish、已 push）。發版前測試：remote-agent 391、source-scan 203 綠；iam 824 綠＋4 支 FR-155 既有紅燈。BE 改回釘版、取消 assume-unchanged（BE `060ff69c8`），以正式版重啟 8000＋worker，三支端點 200。

**commits**：FE `44f2e5f7`；套件 `b7844b71`；BE `060ff69c8` 與 STATE／LOG 若干（BE 8 支未推）。

**決策（決策者拍板）**：發版；私鑰要取回原本那份；複製按鈕在 http＋IP 下失效「測試機的關係先不管」。

**推翻了什麼**
- 以為 123 家目錄那把名字像掃描帳號的金鑰是它的私鑰——不是，比對指紋後跟任何掃描帳號都對不上。
- 第一次讀帳密庫私鑰回「有密碼保護」——是 `ssh-keygen -f /dev/stdin` 讀法失敗的誤判，寫 600 暫存檔就推得出公鑰。

**教訓**
- **Nexus simple index 要認證（401），密碼在 keyring 讀不到**：查已發版號別再繞，`poetry publish` 遇已存在的版號會被拒、不會覆蓋。
- **SSH 金鑰問題先比指紋再動手**：同一台機器上檔名相近的金鑰可能毫無關係；`ssh-keygen -y | ssh-keygen -lf -` 不印私鑰就能比對。
- **Nmap 跟其他工具不同，要登「執行主機」**：執行主機設成 Agent 本機時，Agent 本機的掃描帳號也要收那把私鑰。

**未完**：決策者 123 手測（STATE §3b 五項）；BE 8 支待推；CM-3170～3198 待按 Done；出貨基線重產；STATE §3b 待決策者 9 項。

## 2026-10-28 首腦第 7 棒：收尾（session 名「[R3]獨立Agent-7」）

**做了什麼**
- 冷接自檢四題、唯讀盤點；回報「還欠什麼」清單（五類）。決策者裁：手測全過、卡全 Done、收尾、基線也補。
- CM-3170～3198 共 29 張改 Done（CM-3148 本來就 Done）。
- **出貨基線重產**：落差不只本案 3 支，共 12 支（FR-157 一支、FR-161 三支、FR-162 四支、FR-165 一支、FR-166 三支）。本機 pg_dump 備份 `~/backup/guidant_ai_baseline_20261028_2235_before_FR166_regen.dump` → 依 manifest 行序逐支套 188 基線庫（308→320）→ 三支產生器重產 → 02-schema `-` 行只有 CHECK 整行替換與尾逗號、04 新增 10 顆能力點與路由綁定、99 補登 12 支、gate (a) 綠。BE `4c927ece4`。
- DEV `schema_migrations` 補登記套件 011／012（物件早在，登記列漏）。`hide-tool-plugin-manage-menu.sql` 補進 manifest（seed，不蓋章）。
- 文件：手冊 13.3 改 D23（唯讀「主系統權限」）、13.8 補報告線上預覽與選單新位置；SPEC 執行紀錄列改 HTML 可預覽；features/README FR-166 列改收尾狀態；FR-166 README 總進度表補到收尾；analysis `2026-10-28-fr166-offline-permission-source-and-html-report-preview.md`；SUMMARY `2026-10-28-FR-166-SUMMARY.md`；memory 兩條；STATE 刷成收尾狀態。

**commits**：BE `4c927ece4`（基線）＋收尾文件 commit。

**決策（決策者拍板）**：手測通過、全案收尾、基線重產。

**推翻了什麼**
- 第 6 棒 STATE 寫「BE 8 支未推」——冷接時已與 origin 一致，決策者自己推了。
- 第 6 棒 STATE 寫「租戶 102 離線天數 14」——DEV 實際是 5。
- 「基線待重產＝本案 3 支」——實際 12 支，前四個 FR 都沒重產過；stamp 整份蓋章，不能只補本案的。

**教訓**
- **基線重產前先算整個差集，不是算本案的**：stamp 由整份 manifest 產生，少一支就是把別的 FR 蓋章卻不在結構裡。
- **zsh 的 `for f in $VAR` 不按行拆**：12 個檔名被當一個路徑，第一輪零套用但看起來像跑過；逐支套要 `while read` 並逐支確認登記列。
- fr093-1 那支補登檔（檔頭明寫不套基線、stamp 已含）每次重產都會出現在差集，是正常的，別套。

**未完**：push BE 收尾 commit（等令）；母卡 Done（決策者）；STG／POC 上版（等令，前提 https）；待決策者清單剩 7 項（STATE §3b）。

## 2026-10-29 首腦第 7 棒續：PM 回饋另立 FR-166.1

PM 六條回饋立為續作 FR-166.1（母卡 CM-3199，子卡 CM-3200～3216），兩邊母卡已互相 append 關聯；本案不重開。待裁第 1 項隨 FR-166.1 B3 定案翻回改名「Agent 工具帳密代設」。
