本卡屬 FR-137(母卡 CM-2714),實作卡 ⑤/5:資訊系統版本支援期到期前 90/30/7 天提醒。前置:卡 ②(排程)、卡 ④(通知紀錄表與頁)。設計:
docs/features/FR-137-2610-recurring-tasks-and-conditional-notify/design.md§6.1 ④、§6.8;背景草案:docs/features/FR-135-2610-cra-compliance-framework/phase3-deferred-to-recurring-tasks-fr.md「提醒排程」節。
CRA 要求每個產品版本宣告支援期。版本快到期時(剩 90、30、7 天各一次),寄信給「有把這個資訊系統納入評估的 CRA 專案」的專案管理者,並記在同一個通知紀錄頁。沒有被任何專案納入的版本不寄。通報三階段期限提醒不做(D16)。
compliance.task_alert_notifications 加 object_type varchar(32) NOT NULL DEFAULT 'scan_alert'、object_uid varchar(36)、stage varchar(16);job_execution_id、scan_uid 改可空。(object_type, COALESCE(scan_uid, object_uid), stage, recipient_email);既有列 object_type='scan_alert'、stage 為空。卡 ④ 的 ON CONFLICT 寫法要跟著改成對到新 index,改完要回頭驗卡 ④ 的「同包重掃不重寄」仍成立。app/task_alert/service/support_end_reminder_service.py;卡 ② 的 task_recurrence_tick 尾端加一行呼叫。每小時跑、每天實際只命中一次:撈 compliance.information_system_versions.support_end_date - today(Asia/Taipei) 等於 90、30、7 的版本。information_system_id → 資訊系統 uid → oscal.ssp_inventory_items.props 中 ref-id=該 uid → system_implementation_id → SSP → compliance.projects.living_ssp_id → 專案,濾框架為 CRA → 該專案參與者 role=manager 的 email。object_type='support_end'、object_uid=版本 uid、stage=d90/d30/d7、project_id=收件人所屬專案;同樣先 INSERT 搶列才寄;寄信與失敗記法同卡 ④。信件 msgid 新增,force_locale("zh_Hant_TW")。support_end:「掃描」欄改顯示「支援期提醒・<系統名> <版本>・剩 N 天」,點列跳資訊系統盤點。feature/FR-135(決策者裁沿用),不切 branch、不 push;開工先 git branch --show-current 確認,不對就停下問。