FR-181 · 需求索引 · 本頁由 build 掃資料夾生成

FR-181 Agent 只出站通道(直推關閉、長輪詢取指令)

客戶網路不讓主系統連進 Agent。主系統不再連 Agent;Agent 常駐一條長輪詢向主系統取指令,同步問答(測試連線、證據檔、查日誌)也走同一條加「等回答插槽」;直推程式留著用開關關、客戶不用開 8443。心跳維持只表存活。

狀態:詳見下方 文件 4 份 handoff 2 份
§1

🔴 先看哪一份

文件 性質 什麼時候看
design-v1.1.md 設計定版 v1.1(現行):決策表、流程、契約、拆分表、驗收;末節列相對 v1.0 的差異 要知道定案是什麼、卡怎麼拆
design.md v1.0(凍結) 稽核對照用
discussion.md 需求討論稿(D1~D8 的推導與被排除的選項) 要知道為什麼這樣定
handoff/cards.py 拆卡底表(13 張 6 批,python cards.py 驗批) 開卡、看每張卡改哪些檔
handoff/fr181-STATE.md 交接現況(living)+ LOG(每棒紀錄) 接手時先讀
§2

結論

  • 主系統不主動連 Agent。Agent 常駐一條 GET /agents/commands?wait=30 長輪詢,主系統有事立刻回、沒事 30 秒換一條;派工、取消、重啟、升級、換證、存工具帳密、測試連線、查日誌、送檔、對帳全部走這條。
  • 同步問答走「等回答插槽」(agent_requests 表,5 分鐘過期):瀏覽器那條請求吊著等,Agent 經 POST /agents/replies/<request_id> 回答,Redis pub/sub 跨 gunicorn worker 喚醒;Agent 沒回應時逾時回「Agent 無回應」。證據檔以 multipart 隨回答送上,主系統暫存 /tmp/agent-outbound/、取走即刪。
  • 直推程式不刪:主系統 AGENT_DIRECT_PUSH_ENABLED、Agent AGENT_DATA_PLANE_COMMANDS_ENABLED 預設 false,守衛測試擋預設值被改。Agent 8443 照起(/blob、/detection 仍掛著、mTLS+短效 JWT 守門),平台不連;客戶不用開任何入站埠,只有使用者瀏覽器要連 8444。
  • gunicorn 改 gthread(16 執行緒);長輪詢與等回答各有每進程配額,滿了不吊(長輪詢停一下回 204、等回答回 503);每台 Agent 同時一條長輪詢,新的進來舊的回 204(P-0 實測通過)。
  • 心跳只表存活;舊 Agent 全部重裝不留相容;源碼包瀏覽器直傳 8444 維持原樣。
  • 文件:FR-170/171 設計檔頭指向本案;Agent 安裝手冊第一、二、三、四、九~十二章與首頁改為「只需連出」;資安報告 C20/C21、DFD 對齊。
§3

📊 總進度

批 卡 做什麼 狀態
1 P-0 CM-3596、F-1 CM-3597、F-2 CM-3598 gunicorn 併發驗證、契約、Agent 長輪詢元件 ✅ 11-07 驗過(走長輪詢;契約實發 0.5.0→0.5.1)
2 F-3 CM-3599、E-1 CM-3600 主系統端點、環境卡(都讀 P-0 證據檔) ✅ 11-07(F-3 撞 FR-178 先發的 1.15/1.16,決策者裁 B 合 ws-CM-3533 後發 1.17.0;E-1 釘版轉 A-1)
3 A-1 CM-3601 等回答插槽 ✅ 11-07
4 A-2~A-4 CM-3602~3604 指令六種/回答九種/jedi-detection 三 client ✅ 11-07(A-4 發 jedi-detection 1.10.1)
5 B-1~B-3 CM-3605~3607、B-4 CM-3619、B-5 CM-3631(兩張補卡) 證據檔、查日誌、連線欄(FE+套件)、工具帳密 ✅ 11-07(B-5 發 remote-agent 1.17.1)
6 C-1 CM-3608 釘 1.17.1、守衛 ✅ 11-07(runner 斷線首腦接手收尾)
7 C-2 CM-3632 文件收口 🟡 11-07 完成待驗(決策者裁首腦在真機驗收前先做)
8~10 B-6a~d CM-3634~3637(補卡) 「對帳」改走插槽 ✅ 11-07(B-6a 發的 0.5.2 被 FR-182 同號覆蓋,FR-182 發 0.5.3 合併版修掉)
§4

需求討論紀錄

  • 2026-11-07 決策者問「主系統連不到 Agent 但 Agent 連得到主系統,功能還正常嗎」。首腦實查:FR-171 後六種指令與 FR-039 以來的證據檔、FR-178 遠端查日誌全部是主系統主動連 Agent 8443,單向網路下一個都送不到;心跳補推也是連 8443,救不了。
  • 2026-11-07 決策者裁:客戶確定不能開入站埠;Agent 要定時回來拿工作。首腦指出固定間隔輪詢解不了同步問答,提長輪詢。
  • 2026-11-07 決策者裁:同步問答也走輪詢同步回去;直推退役,不留兩套。開新 FR。
  • 2026-11-07 決策者追問長輪詢會不會佔住 API——會,出貨 sync worker 1 台 Agent 就佔 1 個。裁:批 0 先驗 gunicorn,過了走長輪詢,不過退定時輪詢。
  • 2026-11-07 決策者問證據存 Agent 後主系統怎麼拿——裁 A 經主系統中轉;D5 瀏覽器直傳先不管。
  • 2026-11-07 決策者改判「8443 先不要退役、把 API 功能關掉就好,怕未來又說要開」——D6/D7 改成留程式加開關;確認客戶仍不用開 8443。
  • 2026-11-07 決策者裁舊 Agent 全部重裝;D3、D8 照建議;本案獨立母卡,FR-170/171 母卡只加連結指過來。
  • 本案推翻 FR-170 §3.x「落地版同內網直推一定通」的前提與 FR-171 A 指令通道;FR-171 其餘(身分、換證、金鑰登記簿、設定通道、事件通道、DPoP)保留。
  • 2026-11-07 開卡:母卡 CM-3595、子卡 CM-3596~3608(13 張 7 批,四欄已補);FR-170 母卡 CM-3324、FR-171 母卡 CM-3379 各 append 一段指向本案。等決策者在工作坊派批 1。
  • 2026-11-07 決策者「不想被中斷、半夜放著跑」——design v1.1:批次 7→6(F-1、F-2 併進批 1;F-3 與 E-1 同批),P-0 判據寫死不等人裁,批 4、5 驗收改本機 Agent 模擬單向網路(真機 123 擋埠在母卡收口時首腦做),A-4 釘版併進 B-1。全程只剩母卡 Done 由決策者收。Notion 13 張 Stage 已改、各卡與母卡 append 補充。
  • 2026-11-07 工作坊首腦驗 A-4 時補開 B-4(CM-3619):A-4 卡列的 agent_credential_client.py 實際在主系統不在 jedi-detection(首腦拆卡位置寫錯)。FR-177 Agent 資安修正已合回主線,與本案 F-2/A-3 交集三檔合併乾淨,ws-CM-3595 上 132 passed。
  • 2026-11-07 工作坊首腦驗 B-3 時補開 B-5(CM-3631):連線欄的值是 jedi-remote-agent 算的,直推關掉後在線 Agent 都會被算成 one_way,FE 改不到——首腦拆卡時漏套件那一半。B-5 發 1.17.1,主系統改釘歸 C-1。
  • 2026-11-07 決策者裁「文件不用現在寫,太早」:C-1 只留釘版+守衛,文件四項拆到 C-2(CM-3632)批 7 暫緩,真機驗收過後派。
  • 2026-11-07 工作坊 42 跑完(15 張程式卡 verified);決策者裁直接合回——四 repo ws-CM-3595 已合進 feature/FR-172(未 push),本機主系統+Agent 以新版起、長輪詢通。首腦靜態驗收:BE 178/Agent 173/detection 303/契約 73 綠(補刀 b20f85c5 契約鏡像測試)。
  • 2026-11-07 首腦驗收抓到 Agent 管理頁「對帳」仍走直推(§1.2 盤點併進證據檔沒單獨列),補開 B-6a~d(CM-3634~3637,批 8~10);升級路徑確認仍是 Agent 自己來主系統拿包,只有「叫一聲」改長輪詢。
  • 2026-11-07 B-6 四張驗過合回;FR-182 首腦合回時連本案一併推遠端,主線釘 0.5.3/1.17.4。本機 Agent 沒授權照被 FR-182 閘門擋住 sync、主控台登不進(等 FR-179 A1「未註冊也能登」合回)。決策者裁:本案動態/真機驗收等 FR-179 合回後與 FR-182 一起測。
  • 2026-11-07 FR-179 合回後本機以三案合併版(主線 1.17.5/0.5.3/1.10.1)起主系統+Agent:BE Agent 相關測試 176 passed;Agent 無照被 FR-182 閘門關 sync,主控台本機管理員登入通、主系統票登入被擋(根因閘門關時不載 holder.state,已回寫 FR-182 母卡 CM-3609 L69 待開卡)。本案動態驗收等 Agent 裝照後做。
  • 2026-11-07 決策者裁首腦直接修 FR-182 主控台三個缺陷(閘門關時不載身分、8444 取不到授權閘門致授權分頁 500、總覽沒照不提示),修完本機 Agent 裝照、長輪詢與心跳跑通;123 更新到主線待裝照。動態驗收前置解除。
  • 2026-11-07 決策者裁 C-2 文件收口由首腦直接做、不等真機驗收:FR-170/171 四份設計檔頭加指路行;Agent 手冊與資安報告 C20/C21、DFD 改為只需連出、8443 預設關閉。
§5

文件

以下全部由 build 掃資料夾產生,新增檔案重 build 即自動出現。標題連結指向渲染後的 HTML,md 連向源檔。

需求與討論

文件 類型 標題 最後更新
discussion / md 需求討論稿 Agent 只出站,客戶一個埠都不用開 2026-11-07

設計

文件 類型 標題 最後更新
design-v1.1 / md 設計 FR-181 Agent 只出站通道 — 設計定版 v1.1 2026-11-07
design / md 設計 FR-181 Agent 只出站通道 — 設計定版 v1.0 2026-11-07

evidence/(1 份)

證據與盤點

文件 類型 標題 最後更新
bench-longpoll / md 文件 FR-181 P-0 gunicorn 長輪詢併發驗證 2026-11-07

交接與收口時間軸(handoff/,2 份)

由新到舊。每份是某一棒次交接當下的完整現況快照,看某個時間點「當時知道什麼」請從這裡進。

日期 文件 標題
2026-11-07 fr181-STATE / md FR-181 Agent 只出站通道 — 交接現況(STATE)
2026-11-07 fr181-LOG / md FR-181 Agent 只出站通道 — 交接日誌(LOG)
§6

Notion 卡

卡片內容(決策紀錄、驗收條件)以 Notion 為準,本頁只記座標。

關係 卡號 標題 狀態
母案 CM-3595 — —
子卡 CM-3596 P-0 gunicorn 併發驗證(批 1) —
子卡 CM-3597 F-1 契約 0.3.0(批 2) —
子卡 CM-3598 F-2 Agent 長輪詢元件(批 2) —
子卡 CM-3599 F-3 主系統長輪詢端點(批 2) —
子卡 CM-3600 E-1 環境卡(批 3) —
子卡 CM-3601 A-1 等回答插槽(批 4) —
子卡 CM-3602 A-2 指令六種改敲鈴(批 5) —
子卡 CM-3603 A-3 Agent 回答九種接線(批 5) —
子卡 CM-3604 A-4 jedi-detection 三 client 換 port(批 5) —
子卡 CM-3605 B-1 證據檔四操作(批 6) —
子卡 CM-3606 B-2 遠端查日誌(批 6) —
子卡 CM-3607 B-3 FE 連線欄二態(批 6) —
子卡 CM-3608 C-1 守衛與文件(批 7) —
子卡 CM-3634 B-6a 契約 verify_file kind、發 0.5.2(批 8,補卡) —
子卡 CM-3635 B-6b Agent 接 verify_file(批 9,補卡) —
子卡 CM-3636 B-6c 套件 reconcile 改 port、發 1.17.2(批 9,補卡) —
子卡 CM-3637 B-6d 主系統注入 file_verifier(批 10,補卡) —
子卡 CM-3632 C-2 文件收口(批 7,暫緩) —