FR-166 Agent 獨立作業主控台 — LOG(append-only,每棒一 block)


§1

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;套件異動點頭;開卡。


§2

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;下一棒首腦驗收。


§3

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 點四件小事等決策者。


§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 仍跑舊程式。


§5

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 發版;出貨基線重產。

§6

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 項。

§7

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 項。

§8

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)。

§9

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

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