本卡屬 FR-166(母卡 CM-3109 延伸),批 3,BE(含 jedi-remote-agent 套件)。
白話
一、有人用本機管理員登入 Agent,紀錄隨心跳回主系統時,主動通知該 Agent 所屬租戶的管理員(Email;Telegram/Discord 有設就一起發)。本機管理員多在斷線時用,所以是事後通知。
二、收 Agent 回報的本機管理員密碼最後設定時間,存起來給 Agent 管理頁用(超過 180 天提醒)。
怎麼做
- 【extend】core/plugins/_agent_console_audit.py console_event_sink:寫完稽核後,若新寫入的事件 actor=local-admin 且 action in (login, local_login),呼叫新的 notifier。只對 fresh(去重後)事件發,重送不重發。
- 【new】core/plugins/_agent_local_admin_notice.py:收件人用 core/plugins/license.py 的 TenantAdminDirectory().list_admin_recipients(agent.tenant_id)(reuse,「誰算管理員」只有一份定義);寄信照 core/plugins/remote_agent.py CertExpiryNotifier 寫法;Telegram/Discord 用 notification_service 既有方法,未啟用就略過。寄送失敗只記 log。
- 【extend 套件】jedi-remote-agent heartbeat_offline._INBOUND 加 local_admin_password_set_at(ISO 時間,解不開不收),remote_agents 加欄位(套件 migrations 新一支)、entity、清單 serializer 欄位。走 path dependency 開發,套件發版等決策者確認。
- 回寫明列:動了哪個套件、範圍、其他 consumer 風險。
驗證
- 測試:fresh 的 local-admin 登入才發、重送不發、非 local-admin 不發、寄送失敗不讓 sink 失敗。套件測試照套件 README 跑。
紀律
- 要寫任何新函式/元件/composable/service 方法之前,第一步不是寫,是查:按行為 grep 真實程式碼,再查 docs/claude/domain-capabilities.md 與 FE frontend-overview.md §4。三擇一、預設不新增:reuse → extend → 確認沒有才新增。回寫列出 reuse 了哪些、新增了哪些、為什麼不能 reuse。
- BE 動到 api/app/infra 時 .claude/rules/security/ 自動載入,照著做;FE 規則在 FE repo .claude/rules/security/frontend.md,跨 repo 改 FE 不會自動載入,動手前自己讀。回寫列出本卡對到哪幾條、怎麼滿足。
- 不做義大利麵式程式:「怎麼做」每項已標 reuse/extend/new。extend 就改既有那支,不另開一支;紅旗:複製一段改兩行、開 XxxV2、同一行為兩條路徑。
- 檔案內註解只寫「為什麼」與「陷阱」(一到兩行),做了什麼進 commit message。
- 顯式 git add <檔名>,禁 -am;不切 branch(feature/FR-139);做完立刻 commit +本卡 append 回寫(含 commit hash、手測清單)+狀態改「修正待驗證」;push 等決策者。
建議模型與思考強度(首腦判斷)
Stage 3/Model opus/Effort medium/Repo (主 repo,空著)。要改套件心跳收欄位(jedi-remote-agent)+宿主通知,牽涉套件發版。
狀態先設「暫緩」:決策者 2026-10-28 指示首腦本 session 直接實作,不交工作坊派;做完首腦回寫並改「修正待驗證」。