# FR-166.1 LOG（append-only）

## 2026-10-29 首腦第 1 棒：分析、design、開卡

**做了什麼**：PM 六條回饋逐條對照既有機制（jedi-file-upload 守門鏈、vulndb 心跳同步、credential_handover、jedi-common logging 管線、Agent SQLite），寫 design D1～D8，底表 17 張 6 批，建卡。

**決策**：下載權限點掛簽票層（D1）；`file.download` 出貨零角色（D2）；profile 照 vulndb（D4）；代設帳密走 handover overwrite 不落地（D5）；稽核接 logging 管線（D6）；留 SQLite（D7）；jedi-common 不升、handler 過渡子類（D8）。

**推翻了什麼**：首腦第一版把 Agent 日誌寫成「新開一張 audit_logs 表＋改 record()」，決策者點名「用 logging 機制、不要硬刻」後改 D6。FR-166 待裁第 1 項（檢測工具頁）隨 B3 定案翻回改用途。

**教訓**：「有既有框架就接上去」要在提案前先查 Agent 端有沒有接——jedi-common 早就裝了、SQLite 也是它起的，差的只是沒掛 handler；第一版沒查就提了新表。

**未完**：全部待派。

---

## 2026-10-29 第 2 棒：首腦驗收批 1／批 2 ＋ 下載權限點改判、補開 5 張卡（session CM-3199-首腦）

**驗收結果**：A1、A2（2 輪）、A3（2 輪）、A4（2 輪）、A5、A6、A7、A9（2 輪）、F1（2 輪）通過，皆改「驗收通過待確認」。B1 卡在能力點名兩段撞 DB 三段約束。

**退件原因（供後面的卡避開）**：A2 清空整支既有測試檔卻回報「新增 3 條測試」；A4 upsert 把 `uid=None` 明給進 VALUES、NOT NULL 一寫就炸（手測時用了手動帶 uid 的 entity，沒走到真路徑）；A3 心跳回傳的 `action` 改成事件名，現行主系統 sink 不認得會整筆丟掉卻照樣 ack；A9 只跑自己那支測試檔漏掉既有一條紅；F1 新 i18n key 與弱點資料卡既有 key 同名互蓋。共同點：**回報「全綠」但沒跑全套或沒走真路徑**。

**改判（決策者）**：不做一顆全系統 `file.download`；每類資料用自己模組的 download／export 動作，角色頁多一欄讓管理員逐模組決定；13 類上傳檔鎖 9 開 4；匯出端點只補「只擋 read 的客戶資料匯出」；匯入範本與管理功能匯出不動。詳見母卡「2026-10-29 改判」段。

**開卡**：A1b CM-3217、A2b CM-3219（批 3）、B4 CM-3218（批 6）、B5 CM-3220（批 7）、F6 CM-3221（批 8）。既有卡重排批次：B2／F3→4、B3／F4→5、F2→7、F5→8、D1→9。B1 範圍縮小、仍在批 2（回饋在卡上）。spec／產生器：`gen_notion_cards_2.py`、`notion-cards-2(-made).json`。

**踩到的坑**：一開始用 agent-workshop 的 `notion_create_case.py` 建卡，那支指向工作坊自己的 DB，5 張建到錯清單（Case No 72～76，已 archive）；建 CM 清單的卡要用**主專案** `scripts/notion_create_case.py`。

**待決策者**：A3 自訂的 6218～6227 十個本機事件碼要不要補登套件與主系統（可併 B4 或另開）。

**未完**：design.md §3 D1／D2 尚未照改判改寫，收尾時補；B1 等小弟縮範圍後再驗。

---

## 2026-10-29 首腦第 3 棒：母卡層總驗（決策者「166.1 看起來都好了 你驗收一下」）

**做了什麼**：核 23 張子卡狀態與四 repo commit 一一對得上；跑四支套件、Agent、BE、FE 全套測試；BE HEAD 以套件原始碼樹起在 8077，用 blsadmin（super_admin）與 blsit（IT Manager，無任何 download／export／configure）實打下載簽票、匯出、代設帳密、profile 補更新；FE 主站與主控台各 build 一次。結果寫在 STATE §2。

**關鍵發現**：
- 守門層全對：預覽票進不了下載端點、下載票只發上傳者本人或持能力點者、匯出與代設各擋各的能力點、密碼只以密文進派工單。
- **BE HEAD 用現有 wheel 起不來**（jedi-file-upload 1.3.8 沒有 `FILE_ACTION_DOWNLOAD`）：工作坊規範的「環境卡」沒開，小弟各自改 path 跑；發版前要處理，否則 push 後任何人 `poetry install` 起不來。
- 123 的 Agent 停在 10-28，Agent repo 未 push；e2e 第 4～8 步只能等升級後補。
- 四條紅都是舊的：jedi-file-upload 契約測試停在 2 支 migration（CM-1850）、FE 裸縮寫（FR-142～162 字串）、`jedi_masking` 層號（FR-133）、seed 缺新能力點（基線重產後消）。

**DEV 寫入**：實打代設帳密端點建了一張 handover 單（agent_tasks uid 68816706…，pending、未派出），驗完已刪；`profiles_check_requested` 旗標留 true，下次心跳自清。

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

**未完**：design.md D1／D2 仍是改判前版本，收尾時改；出貨基線待重產；套件未發版。

---

## 2026-10-29 首腦第 4 棒：決策者「都幫我處理」——發版、釘版、push、升 123、e2e 補驗、基線重產、收尾文件

**做了什麼**：四套件進中版號發 Nexus（開包驗 migration 與改過的檔都在）；BE 釘新版、`poetry update`、守衛測試只剩 seed 兩紅；四 repo push `feature/FR-139`；123 Agent `git pull`＋`poetry install`＋換主控台前端＋用 `start-agent-dev.sh` 重起；DEV 8000 重啟到 HEAD；e2e 第 5～8 步真路徑驗過（profile 心跳同步 ok／sha 一致、代設帳密密文落單→Agent 收→稽核→回傳主系統）；基線備份後補套 3 支、重產 02／04／99、守衛 119 綠；design／analysis／memory／jedi-packages.md／FR-169 對照句收尾；開舊紅燈小卡 CM-3277～3279。

**推翻了什麼**：design.md D1／D2 從「一顆全系統 `file.download`」改寫成改判後終局（第 2 棒已在母卡記改判，文件現在才跟上）。

**踩到的坑**：
- 用 `pkill -f main_app.py` 重啟 123 Agent 時把自己的 ssh 命令列也殺了，連線斷在半路；要 kill 就用 pid 檔。
- 第一次重起沒用 `start-agent-dev.sh`，少了 `CLOUD_ENDPOINT` 心跳報「URL 缺協定」；開發機一律用它的啟動腳本。
- 123 以 jedi 直接跑源碼，`/data/content/cache`（profile 凍結契約路徑）是 root 的，profile 全報 PermissionError；建目錄給 jedi 即解。正式版 compose 掛 volume 沒這問題。
- DEV 8 月灌的 11 支內建 profile 檔在 188 SeaweedFS 已不存在（bucket 在、8 月只剩 15 件），Agent 拉檔 404；內建 profile 唯讀不能補版，改建一支租戶 profile 驗。這是 DEV 資料遺失，不是程式。
- BSD sed 的 `0,/re/` 不支援，版號改用 Python 只改第一個 `version` 行。
- 8010／8011 被 Agent 開發程序與 `http.server` 佔住，測試 BE 改 8077。

**DEV 寫入**：建租戶 profile「FR-166.1 e2e Ubuntu 22.04 (DEV 驗收用)」（uid 85d66cd4…）與一張 nmap handover 單（已 succeeded，123 本機 `tool-credentials.enc` 有一組 probe 帳密）。都留著供決策者看畫面；要清再說。

**未完**：母卡 Done、CM-3277 派工、合回 main、STG／POC 上版——皆等決策者。

---

## 2026-10-29 首腦第 5 棒：決策者手測，追加批 10 四張、量心跳體積、記 WebSocket 待辦

**手測發現與裁示**：①登入後語言鈕只有地球看不出是什麼→補文字（FE `41b53fbc`，已部署 123）；②總覽缺「檢測基準」卡（profile 改心跳推送後該像弱點資料一樣看得到多久前更新）→A10／F7；③離線超過天數 **AD 登入也鎖、不留例外**（推翻 FR-166 D17）→A10；④日誌只有 3 筆：A3 沒搬舊 jsonl 61 筆、預覽／下載／登出／改設定有埠點卻沒進表、「看」類沒埠點→A11；⑤代設帳密頁又選 Agent 又選工具、底下留舊目錄→F8（雛形五幕）；⑥離線 Agent 直接鎖整頁說明離線中，不等送出才 409→併 F8。

**心跳體積實測（123 一跳）**：請求 5 KB（profiles 3.3 KB、configured_tools 1 KB 全量重送）、回應 3 KB。決策者：「偷雞的架構，應該要有能力往 Agent 推」；裁示基本功能先做完、第二期改 WebSocket 出站推送。記進 FR-170 design §3.x。

**做了什麼**：Agent 端 profile 摘要（`summary()`、cache 標記 mtime、overview 燈）先做好 commit `ac7aa21` 當 A10 起點；開 CM-3282～3285；主控台語言鈕修正。

**踩到的坑**：用 Agent 內部函式重放心跳量體積兩次失敗（device_uuid 與 local_db 初始化耦合），改 `tcpdump` 抓 Content-Length 一次就準。

**未完**：批 10 等派；DEV 8000 已重起、FE 5180 已重起。

## 2026-10-29 首腦第 6 棒：批 10 複驗（決策者「批10好了 你驗一下」）

**做了什麼**：讀四張卡的小弟回寫與工作坊首腦復核；到兩個工作坊工作區（`evidence-agent/.worktrees/CM-3199` 在 `c333d97`、`compliance-manager-fe/.worktrees/CM-3199` 在 `435f6587`）自己重跑：Agent 全套 1691 綠、FE vitest 362 綠、主控台與主站 vite build 都過；突變兩項（A10 天數判斷改永真→5 紅；A11 匯入拿掉冪等標記→1 紅），還原後清 pyc、工作區乾淨；`merge-tree` 試合回 `feature/FR-139` 兩 repo 都無衝突。開檔核：A10 擋在送 AD 之前、local-admin 另走分支；A11 匯入表 35 個舊動作名涵蓋 123 那份 61 行的 10 種動作、6230～6235 不撞主系統 6228／6229、不進心跳回報；F7 `useSyncCheck` 一份共用、殘留「AD 不受限」文案已清、圖示在 primeicons 6.0.1 內；F8 狀態只讀心跳 `configured_tools`、`configured_by==='handover'` 與 Agent 端 `_ACTOR` 一致、`v-can` 陣列寫法是既有用法、舊目錄五檔刪乾淨、`border-left` 0。

**結論**：四張通過，維持「驗收通過待確認」。

**打折處**：全部只到程式與測試，四項畫面（離線 AD 被擋與分頁灰、總覽檢測基準卡與燈、日誌分頁多 61 筆舊紀錄、代設帳密新頁與離線整頁鎖）要等合回、push、升 123 才看得到。123 現在仍跑 `ac7aa21`，`console-audit.jsonl` 61 行原封未動，升上去第一次啟動就會匯入。

**待裁（問題→建議→理由）**：
1. 事件碼 6230～6235 只在 Agent 本機 → 建議開一張 BE 小卡鏡像進 `common/enum/event_code.py` 與套件 `AgentEventCode`，一張 FE 小卡補主控台日誌分頁 `lang.agent_console.logs.event.6230～6235` → 不補的話日誌頁那六種只顯示數字；都不隨心跳回傳，所以只影響顯示不影響功能。
2. jedi-detection 的 `POST …/configs/<uid>/test-connection`、`…/reset` 前端已無人呼叫 → 建議先留著不退，等 FR-166 第二期（主系統對 Agent 的即時連線）再決定 → 退端點要動套件發版，現在沒有收益。
3. 掃描頁記不到「進頁」、進「服務與重啟」頁會多記一筆總覽 → 建議先不做，手測若覺得日誌不準再開 FE 小卡讓切頁主動打一支 API → 現在的作法是掛在既有 API 上零成本，補一支 API 要 FE＋Agent 兩張卡。

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

**未完**：合回、push、升 123、手測、三件待裁、母卡 Done，皆等決策者。

## 2026-10-29 首腦第 7 棒：批 10 合回、本機與 123 Agent 升級（決策者「幫我合併回來且重啟本機的 agent 還有更新到 123」）

**做了什麼**：`ws-CM-3199` 合回 `feature/FR-139`（Agent `742d6db`、FE `66c78577`，皆 `--no-ff`，無衝突）；Agent push（決策者此令含「更新到 123」，123 只能 `git pull`，視為授權）；FE 未 push。主控台前端用合回後 HEAD 重 build；本機 Agent 以 `~/guidant-agent-local/start-agent.sh` 重起（舊 pid 18931 → 8502）；123 `git pull`＋`poetry install`＋換 `dist-console`（舊的備份成 `dist-console.bak-<時間>`）＋start 腳本重起（pid 1056835）。兩邊主控台 200、`net=online`。

**決策者回報「本機 Agent 無法從主系統登入」的根因**：本機 Agent 程序是 10-28 起的，之後 FR-166.1 給入場券多了 `download-files` 能力；舊程序的 `CONSOLE_SCOPES` 不認得，整張票當無效拒收（log：`ticket scope [...] is empty or unknown`）。同一支舊程序也因 A3 改了 `audit.py` 而弱點同步 ImportError。重起到 HEAD 即解，不是程式 bug。**教訓**：開發機 Agent 是跑源碼的長駐程序，底下程式碼被合回改掉後它不會自己重載；合回 Agent repo 後要順手重起本機與 123。

**舊日誌匯入實況**：本機 115 筆、123 61 筆，0 跳過，檔皆改名 `.imported`。

**順帶看到（不擋）**：本機 Agent 的 profile 同步全報 `Read-only file system: '/data'`——mac 沒有 `/data`，凍結契約路徑在開發機要另外處理（123 是 `sudo mkdir` 給權），之前第 4 棒已記在 LOG；本機磁碟剩 4%。

**未完**：四項手測、FE push、三件待裁、母卡 Done，皆等決策者。

## 2026-10-29 首腦第 8 棒：決策者手測直修兩件（「你直接做」）

**①入場券錯誤訊息**：決策者問「什麼是票券、怎麼判斷、使用者完全沒訊息」。驗票五關裡只有「票上有本機不認得的能力」是版本不一致、不是操作問題，原本混在「無效或已過期」裡。Agent 端拆成 `TicketScopeUnknown` 例外與錯誤碼 `AGENT_CONSOLE_TICKET_SCOPE_UNKNOWN`（401），登入頁對應一句「這台 Agent 版本比主系統舊…請升級」。空 scope 仍是一般無效。

**②日誌匯出**：決策者「agent 日誌沒有下載功能」。Agent 加 `GET /console/api/logs/export`（同一組篩選、不分頁、上限 50,000 列、CSV 帶 BOM、公式開頭儲存格加單引號），走 `file_protect.send_protected`（保護開啟時加密 zip），事件碼 6236 只留本機。守門疊兩層：看日誌的 scope ＋ `download-files`（安全掃描點出只守後者時「不能看卻能帶走」，當場補）。FE 日誌頁加「匯出 CSV」鈕，走 `useProtectedDownload`，只對有 `download-files` 的人顯示。

**合回後露出的紅**：A11 走訪測試寫在 FR-169 前，下載沒帶檔案密碼記不到那一步，補 `file_protect_off` fixture。

**決策者裁示不動的**：角色頁 `lang.menu.product-update` 中英文都沒 key——那是 FR-167 的路由（DEV `ui_routes` id 223「更新中心」），FE 頁面與 i18n 未做，屬 FR-167 範圍，決策者說先不動。

**踩到的坑**：`send_protected` 的 `audit_fields` 不能用 `event_code` 當鍵（與 `audit()` 參數同名）；關保護時 bytes 要包 `BytesIO` 才能進 `send_file`。

**部署**：Agent 已 push；本機（`start-agent.sh`）與 123（`git pull`＋start 腳本、`dist-console` 換新）都在最新。FE 三個 commit 未 push。

## 2026-10-29 首腦第 9 棒：頁名改「Agent 掃描工具設定」（決策者「代設這名稱很奇怪」→ 文案優化 → 「就這樣改」）

**裁示**：與同選單「掃描設定檔管理」「掃描工具資源管理」對齊，拿掉工程詞「代設」。FE 四個語系檔（選單名與說明、頁標題、卡片「由主系統設定」、啟用工具提示）＋五個檔頭註解；BE seed migration `2026-10-29-fr166-1-rename-agent-tool-credentials-menu.sql` 改 `ui_routes.description`，已套 DEV、登記 manifest，出貨基線待重產。design.md 同步。

**未動（等收尾令）**：`docs/spec-site/current/system-admin/tool-plugin-manage.md`、`evidence/agent-console.md`、`docs/user-manual/agent/13-standalone-operation.md` 仍寫舊名。

## 2026-10-29 首腦第 10 棒：Agent 掃描工具設定頁依手測改彈窗、補測試連線與清除（決策者連續裁示）

**裁示**：設定改 Dialog（卡下展開難用）；按鈕一律叫「設定」不叫「重新設定」；「送出給 Agent」改「儲存」；原本的測試連線要回來；要能清除；「在線」太中國用語改「連線中」；「管理啟用的工具」關閉＝租戶層整個停用（任務設定也選不到），非只隱藏卡片。

**做法（extend 不 fork）**：清除走同一張 `credential_handover` 單加 `clear=true`——jedi-detection `start_for_agent(clear=True)`／`build_payload`（`fcea827a`，版號未動），Agent `credential_handover._clear` 回 `{cleared, skipped}`、稽核 6087（`f2cbb4d`），BE `DELETE /remote-agents/<uid>/tool-credentials` 同能力點（`bb5521652`）。測試連線沿用既有 `POST /detection-tools/configs/<uid>/test-connection` 帶 `agent_uid`（它早就支援 Agent 本機帳密、結果由 Agent `mark_test` 記回心跳）。FE 新 `AgentToolDialog`（set／test／clear 同一個 Dialog）、卡片三顆鈕、輪詢加 `clearReceived`（`0e173b92`）。

**開發期狀態**：BE `pyproject.toml` 的 jedi-detection 改 path dependency（未 commit）；發版前要發 jedi-detection 新版、還原釘版。本機與 123 Agent 已重起到 `f2cbb4d`；BE 8000 已重起。

**未動（屬 FR-167）**：角色頁 `lang.menu.product-update` 無 key。

## 2026-10-29 首腦第 11 棒：測試連線失敗根因（決策者「測試連線會失敗」）

**根因**：123 的 nmap 存的是第 4 棒 e2e 時首腦用 curl 直打代設端點寫進去的欄位（`ssh_host`／`ssh_user`／`ssh_password`），不是 nmap 的欄位（`username`／`auth_method`／`password`）；那個 probe 帳號在 123 也不存在。connector 一跑就「缺少憑證」，卡片卻顯示已設定。畫面上的表單照工具 schema 出欄位，正常操作不會寫錯。

**修**：Agent 收帳密派工單時改用主控台存檔同一套 `secret_form.validate` 照工具目錄 schema 驗，不合就不存、整單回 failed（`eda5f3d`，已 push，本機與 123 已升）。

**DEV 殘留**：123 的那組錯誤 nmap 帳密仍在，請決策者在頁上對 ubuntu-lab-03 的 Nmap 按「清除」或「設定」重填。

## 2026-10-29 首腦第 12 棒：設定／清除改直連 Agent（決策者「改吧，不然實在太蠢了」）

**推翻了什麼**：design D5「代設帳密走 credential_handover 派工單、等心跳收」改成直連 Agent 資料面當場存。第 5 棒在 FR-170 §3.x 寫的「主系統永遠不主動連進 Agent」也是錯的：測試連線、取證據檔早就是主系統直推 8443，§3.x 已改寫成兩條路並存、直推前提只有 SaaS 要開 8443。

**做法**：Agent 加 `PUT／DELETE /detection/credentials`（`d2fe93f`），沿用 `credential_handover.store`（照 schema 驗、稽核）不另寫，`/detection` 前綴已在資料面守門內；BE 新 `infra/remote_agent/agent_credential_client.py` 認證同 `AgentProbeClient`，回來的 status 當場寫回 `configured_tools`（`2e4281cf5`）；FE 拿掉輪詢與「等收單」、刪 `useCredentialHandoverPoll`（`3861bb1b`）。jedi-detection 的 clear 旗標 revert（`233891ff`），BE 回 1.7.0 釘版，**不需要發套件**。

**踩到的坑**：平行的 FR-169 首腦在 BE 做 stash／pop 時撞到我留的 jedi-detection path 改動，`poetry.lock` 變 UU。我沒動它的狀態，傳訊說明終局是 HEAD 釘版；它解完衝突後由我自己還原 path 與 drop stash。教訓：開發期的 path dependency 改動放在共用 working tree，就會被別的 session 的 stash 捲進去；能不切 path 就不切（這次改直連後本來就不需要）。

## 2026-10-29 首腦第 13 棒：與 FR-169 整合、文件與雛形對齊現況（決策者「整合 FR-169、更新所有文件跟設計稿、準備收尾」）

**整合結論**：程式面已接齊，不需改碼。Agent 主控台所有下載出口（檔案、網路除錯報告、診斷包、本案新增的日誌匯出 CSV）與主系統「Agent 掃描執行紀錄」報告都走 `send_protected`，FE 全部走 `useProtectedDownload`；預覽不加密是 FR-169 既定。

**文件**：design.md 升 v2（標頭、做完之後、§2 兩條路、D5 改直連、新增 D9 AD 鎖與 D10 日誌覆蓋與匯出、§4 盤點補直推、§5.2～5.5、§5.7、§6 批 10 四列與 B3／F5 註記、§7 驗收、§8 風險）；README 重寫；雛形改七幕終局畫面；SPEC 三頁與手冊第十三章改正舊說法（AD 不受天數限制、等心跳收單、代設、在線）並加變更紀錄；FR-170 §3 已於第 12 棒改寫。說明文件時序措辭 grep 清零（D1 卡驗收指令內引用的 pattern 除外）；`border-left` 0；mkdocs build 過；兩個 FR 站重 build。

**推翻了什麼**：無新推翻；把第 5、12 棒的推翻落進文件。

**未完**：收尾令、push、123 Nmap 重填、待裁三件、基線重產、上版——皆等決策者。

## 2026-10-29～30 首腦第 14 棒：收尾、事件碼補登、交接（決策者「push、收 Done、砍工作樹」→「事件碼現在做」→「交接」）

**收尾**：四 repo push；analysis 補第五節（設定帳密改直連的取捨與反悔條件）；memory 新增 `feedback_main_system_can_push_to_agent_8443`（repo 與個人目錄同步）；母卡 CM-3199 append 收尾摘要、母卡與批 10 四張改 Done；CM-3199 四個 repo 的工作樹與 `ws-CM-3199` 分支移除（先驗乾淨、零未合 commit，用 `branch -d`）。

**事件碼 6230～6236**（是七個不是六個，6236 匯出日誌是後加的）：套件 `AgentEventCode` 補登、守衛上限 6227→6236（`1c1cdcd5`，全套 397 綠）；主系統 `event_code.py` 鏡像、加守衛確認七碼都在且不進 sink（`1b964f400`）；主控台日誌頁中英文名、依號碼排序（FE `3a2f60d6`），123 主控台前端已換。**套件未發 1.9.1**：決策者說直接發、首腦還沒執行就被叫停「先不動」。

**踩到的坑**：無新坑。BE 有 FR-170 首腦的兩筆未推 commit，交接時明列為「不是本案、別代推」。

**未完**：見 STATE §3，皆等決策者。
