本卡屬 FR-187(母卡 CM-3711),第 1 批 A1:長輪詢通道(主系統端)(主系統 repo
compliance-manager-be,8 檔/約 1000 行)。只掃不修。工作坊會用.claude/workshop-prompts/dispatch-<本卡號>.md當開場 prompt 直接啟動掃描,小弟不必自己打指令。
用 Claude Code 官方 claude-security plugin 掃「長輪詢通道(主系統端)」這一塊,找出資安問題,寫成 PM 與新手工程師都看得懂的報告。只找問題、不修問題,修是另外開卡的事。
FR-181 把「主系統連進 Agent」改成「Agent 吊一條連線等主系統派事」。這一棒看主系統這一頭:主系統怎麼把要 Agent 做的事寫進 agent_requests、怎麼敲鈴叫醒吊著的那條連線、Agent 回答(含回傳檔案)怎麼收下來。
這是全新的通道,所有主系統對 Agent 的指令(派工、查日誌、取證據檔、換證)都會走這裡。回答收錯台,就是 A 客戶的 Agent 能改 B 客戶的結果;暫存檔沒上限,一台被控的 Agent 就能塞爆主系統磁碟。套件那一頭(端點本身、持有證明)在 J1,兩棒的接縫首腦驗收時會串起來看。
背景:這一輪掃的是 2026-11-01(FR-172 開案)到 11-09 之間主專案與 jedi-remote-agent 新寫或大改的程式(FR-171/172/178/179/180/181/182),這些程式都沒掃過。
core/plugins/_agent_channel.py
core/plugins/_agent_commands.py
app/remote_agent/service/agent_request_service.py
infra/remote_agent/redis_command_waiter.py
infra/remote_agent/file_spool.py
domain/remote_agent/service/agent_request_domain_service.py
infra/remote_agent/repository/agent_request_repo_impl.py
infra/remote_agent/model/agent_request.py
檔數 8、約 1000 行。驗檔數:git -C <工作目錄> ls-files -- core/plugins/_agent_channel.py core/plugins/_agent_commands.py app/remote_agent/service/agent_request_service.py infra/remote_agent/redis_command_waiter.py infra/remote_agent/file_spool.py domain/remote_agent/service/agent_request_domain_service.py infra/remote_agent/repository/agent_request_repo_impl.py infra/remote_agent/model/agent_request.py | wc -l 應為 8。scope 外的檔不要讀,除非下面「重點看什麼」明寫「只追這幾行」;越界的發現首腦驗收時會挑掉。
首腦讀過程式碼後認為最容易出事的地方,是思考起點不是檢查清單,行號以 2026-11-09 的主線為準,對不上就以內容為準。工具不會照這份走,掃完後你要自己逐條對一遍:工具沒報的,開檔看一眼,寫「人工查過:成立/不成立/為什麼」。
agent_request_service.py:213-232 的 owns/reply 只用 agent.id 比對歸屬;reply 的 result 是 Agent 給的任意 dict,原樣寫進 agent_requests.result。確認大小與型別有沒有上限,之後讀它的地方(_agent_channel.py:51-62 讀 result["sha256"]、日誌查詢把結果回畫面)會不會被塞怪東西。reply 在 :226-227 把 file_path 合進 result:Agent 若自己在 result 帶一個 file_path 欄位,會不會蓋掉或被後面拿去開任意路徑的檔。file_spool.py:43-71 用 request_id 當檔名:形狀檢查、symlink 檢查、目錄 0700;save 有沒有大小上限(被控的 Agent 送超大檔吃光磁碟);open 開完就刪的競態。redis_command_waiter.py 頻道名是 ra:<namespace>:<kind>:<key>,key 是 agent_uid 或 request_id:能不能被別台敲鈴、搶走別台的回答插槽(reply_slot/ring_reply);Redis 斷線時退回只靠行程內喚醒,多個 worker 時等回答會不會永遠吊住。ask(:109-124)的配額 semaphore 與逾時上限:一般使用者能觸發的 ask(查 Agent 日誌、對帳)能不能把配額吃滿,讓其他功能全部卡住。_agent_channel.py:65-69 source_archive_fallback:/agents/files/<uid> 不是暫存檔時交給舊的源碼包下載。確認舊路徑仍用通行證裡的 agent_uid 綁任務(api/remote_agent/routes/agent_file_route.py → get_file_for_agent),沒有因為改走 fallback 少一道。_agent_commands.py 掛在 agent_tasks 新增事件上敲鈴:敲的是不是那張工單指派的那一台。