做了什麼: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;第一版沒查就提了新表。
未完:全部待派。
驗收結果: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 等小弟縮範圍後再驗。
做了什麼:核 23 張子卡狀態與四 repo commit 一一對得上;跑四支套件、Agent、BE、FE 全套測試;BE HEAD 以套件原始碼樹起在 8077,用 blsadmin(super_admin)與 blsit(IT Manager,無任何 download/export/configure)實打下載簽票、匯出、代設帳密、profile 補更新;FE 主站與主控台各 build 一次。結果寫在 STATE §2。
關鍵發現:
FILE_ACTION_DOWNLOAD):工作坊規範的「環境卡」沒開,小弟各自改 path 跑;發版前要處理,否則 push 後任何人 poetry install 起不來。jedi_masking 層號(FR-133)、seed 缺新能力點(基線重產後消)。DEV 寫入:實打代設帳密端點建了一張 handover 單(agent_tasks uid 68816706…,pending、未派出),驗完已刪;profiles_check_requested 旗標留 true,下次心跳自清。
推翻了什麼:無。
未完:design.md D1/D2 仍是改判前版本,收尾時改;出貨基線待重產;套件未發版。
做了什麼:四套件進中版號發 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 缺協定」;開發機一律用它的啟動腳本。/data/content/cache(profile 凍結契約路徑)是 root 的,profile 全報 PermissionError;建目錄給 jedi 即解。正式版 compose 掛 volume 沒這問題。0,/re/ 不支援,版號改用 Python 只改第一個 version 行。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 上版——皆等決策者。
手測發現與裁示:①登入後語言鈕只有地球看不出是什麼→補文字(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 已重起。
做了什麼:讀四張卡的小弟回寫與工作坊首腦復核;到兩個工作坊工作區(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 行原封未動,升上去第一次啟動就會匯入。
待裁(問題→建議→理由):
common/enum/event_code.py 與套件 AgentEventCode,一張 FE 小卡補主控台日誌分頁 lang.agent_console.logs.event.6230~6235 → 不補的話日誌頁那六種只顯示數字;都不隨心跳回傳,所以只影響顯示不影響功能。POST …/configs/<uid>/test-connection、…/reset 前端已無人呼叫 → 建議先留著不退,等 FR-166 第二期(主系統對 Agent 的即時連線)再決定 → 退端點要動套件發版,現在沒有收益。推翻了什麼:無。
未完:合回、push、升 123、手測、三件待裁、母卡 Done,皆等決策者。
做了什麼: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,皆等決策者。
①入場券錯誤訊息:決策者問「什麼是票券、怎麼判斷、使用者完全沒訊息」。驗票五關裡只有「票上有本機不認得的能力」是版本不一致、不是操作問題,原本混在「無效或已過期」裡。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。
裁示:與同選單「掃描設定檔管理」「掃描工具資源管理」對齊,拿掉工程詞「代設」。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 仍寫舊名。
裁示:設定改 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。
根因: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 按「清除」或「設定」重填。
推翻了什麼: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 就不切(這次改直連後本來就不需要)。
整合結論:程式面已接齊,不需改碼。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 重填、待裁三件、基線重產、上版——皆等決策者。
收尾:四 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,皆等決策者。