本卡屬 FR-181(母卡 FR-181 母案 CM-3595),卡 B-6b,批 9。只改 evidence-agent。依賴:B-6a。
對帳改走長輪詢的 Agent 端:長輪詢拿到 verify_file 指令,讀本機那個證據檔算 SHA-256 回覆主系統。算法跟現在 8443 /blob/<uid>/sha256 那支一模一樣,抽成同一支 app 層函式兩邊共用,不複製。檔案不存在就回 failed、原因 missing(主系統據此標「Agent 上找不到」)。
extend:files/app/blob_ops.py 加 verify(uid) -> str(讀 open_blob(uid) 算 sha256,照 blob_route.py:49 既有 /blob/<uid>/sha256 的算法抽成同一支,route 殼改呼叫它);files/api/commands.py HANDLERS 加 KIND_VERIFY_FILE: _verify(照 _send 的 _found 形狀:找不到→failed reason=missing)。釘契約 0.5.2
repo:~/Projects/Billows/Audit-Manager/evidence-agent
改既有:guidant_agent/files/app/blob_ops.py
改既有:guidant_agent/files/api/commands.py
改既有:guidant_agent/files/api/blob_route.py(sha256 route 改呼叫 blob_ops.verify)
改既有:pyproject.toml(契約 0.5.2)
新開:test/files/test_verify_file_command.py
files/app/blob_ops.py 加 verify(uid: str) -> str:open_blob(uid) 讀 bytes 算 sha256(用既有 evidence_sha256.sha256_of);找不到走既有 _found 的例外。files/api/blob_route.py 49 行 /blob/<uid>/sha256 的算法改呼叫 blob_ops.verify(route 殼 ≤ 10 行,開關開時仍能用)。files/api/commands.py:def _verify(cmd) -> Answer 照 _send 用 _found(blob_ops.verify, uid),回 {"sha256": ...};HANDLERS[KIND_VERIFY_FILE] = _verify。pyproject.toml 契約釘 0.5.2(B-6a 已發到 Nexus;沒有就 path 指 jedi 工作區、不 commit、回寫說明)。test/files/test_verify_file_command.py:存一檔→verify_file→taken→done 帶正確 sha;不存在 uid→failed missing;route 與 handler 同值。pytest:verify_file → taken → done 帶 {sha256};uid 不存在 → failed reason=missing;/blob/<uid>/sha256 route 與 handler 算出同值(抽層沒抽壞)
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-181-2611-agent-outbound-only-channel/design.md §3 決策定案(D1~D8)、§4 端到端流程兩張圖、§5 詳細設計本卡那節、§7 拆分表本卡那列;為什麼這樣定看 discussion.mdcore/plugins/_agent_commands.py(檔頭說明三個觸發點)、app/remote_agent/service/agent_command_service.py、core/plugins/_agent_config_notify.py、core/plugins/_agent_keys.py、infra/upload_file/remote_agent_adapter.py、core/plugins/remote_agent.py(plugin mount 與 handle)jedi-remote-agent/jedi_remote_agent/api/routing.py(端點表與 AUTH_AGENT)、api/routes/(心跳 route 範本)、app/service/agent_data_plane_client.py(直推出口,留著)、app/service/heartbeat_vulndb.py(_CORE_KEYS 心跳守衛);契約 jedi-agent-protocol/jedi_agent_protocol/commands.py、heartbeat.py、events.pyguidant_agent/sync/app/config_pull.py(WorkerComponent 拉取範本)、enroll.py(心跳 client 與通行證)、event_sender.py+outbox.py(送不到補送)、task_queue.py、sync/api/data_plane_server.py(8443 與 blueprint 掛點)、sync/api/cmd_*.py(直推 handler,本案改薄)、files/api/blob_route.py、scan/api/routes/、docs/ARCHITECTURE.md