Kaynağa Gözat

chore(roi): move internal test schedule to 15:30

刘立冬 10 saat önce
ebeveyn
işleme
368271a923

+ 2 - 2
examples/auto_put_ad_mini/DEPLOYMENT.md

@@ -184,8 +184,8 @@ curl -X POST http://localhost:8080/trigger | jq .
 - 汇总表将三日总 T0 裂变人数 / 三日总首层 UV 的加权比例展示为“日均T0裂变率”。汇总顺序为关停、扩量、中间观察、条件不足观察;第一条扩量行和扩量后第一条观察行顶部均使用粗线分隔。“当日效率ROI”和“预测总效率ROI”均使用深红—黄—绿色阶,绿色代表表现好。普通数值显示两位小数,UV、人数、数量和广告年龄显示整数;两个“裂变系数-总裂变UV/…”比率列固定显示两位小数。“传播裂变系数匹配”保留审计数据但默认隐藏。
 - “审批选择”默认隐藏,需取消隐藏后审批;创意级“当前创意状态”只对关停建议只读腾讯状态,显示正常、已停止或读取失败,其他行留空。
 - 完整主报表保存后,流程会额外按“小程序投流”渠道的“代理名称”生成一代理一份调控建议工作簿;文件名为 `YYYYMMDD_代理名称_调控建议.xlsx`。代理版只包含小程序创意级和广告级三日汇总,广告级 Sheet 继续隐藏,不包含每日明细。包名、广告age、日均首层UV、建议说明、收入、预测总效率ROI、P20/P80/P30、排名、两个裂变系数、日均T0裂变人数/率、审批、执行状态和幂等键均不会写入代理文件;内部“当日效率ROI”仅改名为两位小数的“评分”展示,建议动作仍按预测总效率ROI计算并保留“关停创意/关停广告/扩量/观察”。代理表默认只落本地;开启 `ROI_AGENCY_WEBHOOK_ENABLED` 后,飞书应用先上传在线表,再由 `ROI_AGENCY_WEBHOOKS_JSON` 中精确匹配的代理机器人发送卡片。未配置代理直接跳过,不回退总群;完整 webhook 只能放在真实 `.env` 或密钥系统,数据库和日志只保存哈希指纹。
-- 可选内部测试任务每天北京时间14:30执行独立复算,只将“自动化投放”分表发送到“内部”Webhook,不发送完整主表、正式总群或代理群,也不生成可审批腾讯动作。缺少该分表时任务失败并告警。正式任务始终去重;内部测试使用 `ROI_INTERNAL_TEST_DEDUP_ENABLED` 控制,设为`0`时每次显式触发都发送新的测试批次。内部任务无startup入口,重启服务不会自动补发。
-- 09:00正式任务或14:30内部测试执行失败时,调度服务通过飞书应用向 `ROI_FAILURE_FEISHU_CHAT_ID` 发送红色告警卡片;未配置时回退 `FEISHU_OPERATOR_CHAT_ID`。告警失败只记日志,不会掩盖原任务失败。
+- 可选内部测试任务每天北京时间15:30执行独立复算,只将“自动化投放”分表发送到“内部”Webhook,不发送完整主表、正式总群或代理群,也不生成可审批腾讯动作。缺少该分表时任务失败并告警。正式任务始终去重;内部测试使用 `ROI_INTERNAL_TEST_DEDUP_ENABLED` 控制,设为`0`时每次显式触发都发送新的测试批次。内部任务无startup入口,重启服务不会自动补发。
+- 09:00正式任务或15:30内部测试执行失败时,调度服务通过飞书应用向 `ROI_FAILURE_FEISHU_CHAT_ID` 发送红色告警卡片;未配置时回退 `FEISHU_OPERATOR_CHAT_ID`。告警失败只记日志,不会掩盖原任务失败。
 
 离线复算不发送飞书:
 

+ 4 - 4
examples/auto_put_ad_mini/docs/unified_services_deployment.md

@@ -74,7 +74,7 @@ DAILY_ROI_HOUR=9
 DAILY_ROI_MINUTE=0
 DAILY_ROI_RUN_ON_STARTUP=0
 ROI_INTERNAL_TEST_ENABLED=0
-ROI_INTERNAL_TEST_HOUR=14
+ROI_INTERNAL_TEST_HOUR=15
 ROI_INTERNAL_TEST_MINUTE=30
 ROI_INTERNAL_TEST_DEDUP_ENABLED=1
 ROI_FAILURE_FEISHU_CHAT_ID=
@@ -198,9 +198,9 @@ ROI 表格使用获得链接者可编辑权限。默认隐藏的黄色【审批
 
 总表继续由飞书应用按 `ROI_FEISHU_CHAT_ID` / `FEISHU_OPERATOR_CHAT_ID` 发布。代理表发布由 `ROI_AGENCY_WEBHOOK_ENABLED` 独立控制,完整机器人地址仅允许保存在密钥系统或真实 `.env` 的 `ROI_AGENCY_WEBHOOKS_JSON`,JSON key 使用代理简称。飞书应用先上传并开放在线表链接,再由对应代理机器人发送可点击卡片;未配置代理记录为跳过,不回退到总群。同一 `run_id + 代理 + 代理报表版本` 幂等审计,已上传表格在通知重试时复用,避免重复建表。机器人地址只保存哈希指纹,不能写入数据库或日志。
 
-`ROI_INTERNAL_TEST_ENABLED=1` 时,服务每天北京时间14:30注册独立内部任务。该任务复算后使用空管理账户集合,不生成可审批腾讯动作,只把“自动化投放”分表发送到 `ROI_AGENCY_WEBHOOKS_JSON` 的“内部”路由,不发送完整主表、正式总群或代理群;缺少该分表时任务失败并告警。它不注册startup任务,服务重启不会主动补发。正式任务始终去重;内部测试由 `ROI_INTERNAL_TEST_DEDUP_ENABLED` 控制,生产默认`1`,测试环境显式设为`0`时每次触发生成独立测试run并重新发送。
+`ROI_INTERNAL_TEST_ENABLED=1` 时,服务每天北京时间15:30注册独立内部任务。该任务复算后使用空管理账户集合,不生成可审批腾讯动作,只把“自动化投放”分表发送到 `ROI_AGENCY_WEBHOOKS_JSON` 的“内部”路由,不发送完整主表、正式总群或代理群;缺少该分表时任务失败并告警。它不注册startup任务,服务重启不会主动补发。正式任务始终去重;内部测试由 `ROI_INTERNAL_TEST_DEDUP_ENABLED` 控制,生产默认`1`,测试环境显式设为`0`时每次触发生成独立测试run并重新发送。
 
-09:00正式任务或14:30内部测试的子进程启动失败或非零退出时,调度服务通过飞书应用向 `ROI_FAILURE_FEISHU_CHAT_ID` 发送红色失败告警;该变量为空时回退 `FEISHU_OPERATOR_CHAT_ID`。失败告警本身发送失败只记录错误日志,不会吞掉或替换原任务异常。
+09:00正式任务或15:30内部测试的子进程启动失败或非零退出时,调度服务通过飞书应用向 `ROI_FAILURE_FEISHU_CHAT_ID` 发送红色失败告警;该变量为空时回退 `FEISHU_OPERATOR_CHAT_ID`。失败告警本身发送失败只记录错误日志,不会吞掉或替换原任务异常。
 
 1. 首次部署先执行下方参数发布命令并完成回读校验。
 2. 设置 `DAILY_ROI_ENABLED=1`、`ROI_APPLY_ENABLED=0`、`ROI_SHEET_APPROVAL_ENABLED=0`,观察09:00的T-1来源校验、ODPS计算、数据库快照和可编辑飞书表。
@@ -276,7 +276,7 @@ docker compose --env-file /dev/null logs --since=30m ad_daily_service
 - 飞书只有一个 WebSocket 消费者。
 - 10:30 只出现一次创建任务。
 - 审核扫描每 2 小时最多一个实例。
-- 09:00正式任务只生成一个相同指标/策略版本的ROI批次,同日重跑不会重复发布;14:30内部测试是否去重由独立变量控制。
+- 09:00正式任务只生成一个相同指标/策略版本的ROI批次,同日重跑不会重复发布;15:30内部测试是否去重由独立变量控制。
 - ROI 审批执行与实时 CPM 调控不并发写腾讯,基础出价调整后两边状态一致。
 
 回滚时将 `VERSION` 改为上一个镜像版本并重新部署。数据库新增表和列可以保留,

+ 2 - 2
examples/auto_put_ad_mini/roi_control/config.py

@@ -78,7 +78,7 @@ class RoiConfig:
     report_hour: int = 9
     report_minute: int = 0
     internal_test_enabled: bool = False
-    internal_test_hour: int = 14
+    internal_test_hour: int = 15
     internal_test_minute: int = 30
     internal_test_dedup_enabled: bool = True
     approval_ttl_minutes: int = 120
@@ -110,7 +110,7 @@ class RoiConfig:
             report_hour=int(os.getenv("DAILY_ROI_HOUR", "9")),
             report_minute=int(os.getenv("DAILY_ROI_MINUTE", "0")),
             internal_test_enabled=env_flag("ROI_INTERNAL_TEST_ENABLED"),
-            internal_test_hour=int(os.getenv("ROI_INTERNAL_TEST_HOUR", "14")),
+            internal_test_hour=int(os.getenv("ROI_INTERNAL_TEST_HOUR", "15")),
             internal_test_minute=int(os.getenv("ROI_INTERNAL_TEST_MINUTE", "30")),
             internal_test_dedup_enabled=env_flag(
                 "ROI_INTERNAL_TEST_DEDUP_ENABLED",

+ 1 - 1
examples/auto_put_ad_mini/run_daily_service.py

@@ -48,7 +48,7 @@ def _notify_roi_failure(
     extra_args: list[str] | None,
     error: str,
 ) -> None:
-    mode = "内部14:30测试" if "--internal-test" in (extra_args or []) else "正式09:00任务"
+    mode = "内部15:30测试" if "--internal-test" in (extra_args or []) else "正式09:00任务"
     publisher: RoiFeishuPublisher | None = None
     try:
         publisher = RoiFeishuPublisher(require_chat_ids=False)

+ 1 - 1
examples/auto_put_ad_mini/test_roi_agency_delivery.py

@@ -53,7 +53,7 @@ class AgencyDeliveryTest(unittest.TestCase):
         self.assertEqual((config.report_hour, config.report_minute), (9, 0))
         self.assertEqual(
             (config.internal_test_hour, config.internal_test_minute),
-            (14, 30),
+            (15, 30),
         )
         self.assertTrue(config.internal_test_dedup_enabled)