本卡屬 FR-192(母卡 FR-192 母案(同清單上一張)),卡 A-3,批 4。只改 evidence-agent。依賴:A-1、M-3。
A-1 做了新增,本卡補上修改、刪除、刪單一附件,以及「主系統那邊改了,Agent 這邊跟著變」。修改與刪除走與新增同一條待回傳佇列,多帶一個動作欄位,同一筆的動作照順序送。主系統改了會透過設定通道把「這台送出的回饋現況」下發,Agent 收到以主系統端更新時間較新者覆寫本機、主系統刪的標已刪。兩邊同時改以較新的為準:Agent 送修改時帶它看到的主系統版本時間,主系統回「過期」就標示並請求拉一次設定,使用者重改一次。
extend:feedbacks.py 加 update/delete/remove_file/apply_cloud;feedback_routes.py 加 PUT/DELETE 兩條與刪附件;outbox 的 stale 回應處理(標 sync_error 並 config_pull.request());套用者照 labels.py 形狀
repo:~/Projects/Billows/Audit-Manager/evidence-agent
改既有:guidant_agent/feedback/app/feedbacks.py
改既有:guidant_agent/feedback/api/feedback_routes.py
改既有:guidant_agent/feedback/adapters/feedback_repo.py
改既有:guidant_agent/sync/app/outbox.py(stale 分支)
改既有:guidant_agent/shared/event_codes.py(UPDATED/DELETED/OVERWRITTEN_BY_CLOUD)
改既有:test/feedback/test_feedbacks.py
新開:guidant_agent/feedback/app/cloud_state.py(KIND_FEEDBACKS 套用者)
app/feedbacks.py 加 update(uid, sub, title, description, type_label_uid, add_files, remove_file_uids)(更新列、附件增刪走 blob_ops.save_upload/blob_ops.delete、outbox.enqueue(KIND_FEEDBACK, uid, "update", payload) 且 payload 帶 base_cloud_updated_at=cloud_updated_at)、delete(uid, sub)(deleted_at=now、入列 delete)、remove_file(uid, file_uid, sub)(入列 update)。api/feedback_routes.py 加 PUT /console/api/feedbacks/<uid>(multipart 同 POST,另收 remove_file_uids)、DELETE /console/api/feedbacks/<uid>、DELETE /console/api/feedbacks/<uid>/files/<file_uid>;非本人一律 404。app/cloud_state.py:設定類 KIND_FEEDBACKS 套用者——每項以 local_uid 對本機列:deleted → 標 deleted_at;updated_at 比本機 cloud_updated_at 新 → 覆寫 title/description/type_label/files(where=cloud 的檔只記 metadata)並記 AGENT_FEEDBACK_OVERWRITTEN_BY_CLOUD;較舊或相同 → 不動。platform/registry.py 申報。sync/app/outbox.py _post_feedbacks 回應多處理 stale[]:該筆 sync_error="主系統已有較新版本"、settle 不重送、呼叫 config_pull.request()(既有)。shared/event_codes.py 加 UPDATED/DELETED/OVERWRITTEN_BY_CLOUD;tests 補驗收四條+突變(把「較新者才覆寫」拿掉要紅)。守衛六支綠。主控台 PUT 改標題 → outbox 一列 op=update;DELETE → op=delete、清單不列;收到設定類 feedbacks 內某筆 cloud_updated_at 比本機新 → 本機覆寫、稽核 OVERWRITTEN_BY_CLOUD;比本機舊 → 不動;deleted=true → 本機標 deleted_at;主系統回 stale → 該筆 sync_error 為「主系統已有較新版本」且觸發一次 config_pull;守衛六支綠
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-192-2611-agent-console-feedback/design.md §3 決策定案、§5 詳細設計(本卡那節)、§6 拆卡表本卡那列、§8 風險;討論稿 discussion.md §4 只在想知道「為什麼這樣裁」時看~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-192-2611-agent-console-feedback/prototype/index.html(純畫面,只取結構與資訊順序;文案依 i18n 重寫)guidant_agent/scan/app/local_runs.py(本機先存+同步欄位)、sync/app/outbox.py(待回傳佇列)、console/api/runs_routes.py(清單/404/resend)、files/app/blob_ops.py(附件存本機);主系統 api/source_scan/routes/agent_manual_scan_route.py(Agent 收單端點先例)、infra/upload_file/remote_agent_adapter.py(Agent 檔參照)、core/plugins/_agent_config_sections.py+_agent_config_notify.py(設定通道)、core/plugins/issue.py(jedi-issue 接線);jedi-issue app/feedback/service/feedback_service.py、api/routes/feedback_route.py、plugin/contract.py(SchemaExtensions);jedi-remote-agent app/service/local_run_service.py(ingest 形狀)、migrations/011-remote-agent-offline-operators.sql(RLS/GRANT 先例);FE src/views/feedback/system/SystemFeedbackForm.vue、console/views/Runs.vue、console/views/Logs.vue(Dialog)、src/views/source-scan/SourceFilePicker.vue(拖放)docs/system-design/system-integration/04-Agent到主系統API.md、05-主系統到Agent指令.md