diff --git a/ops/quant-monitor/README.md b/ops/quant-monitor/README.md index 1f952ea..bd57dd7 100644 --- a/ops/quant-monitor/README.md +++ b/ops/quant-monitor/README.md @@ -42,6 +42,8 @@ merge 或 deploy。成功记录策略劣化后,monitor 正常结束,不再 因此健康卡片里的 `canary_eligible` 和 `pause_request_pending_confirmation` 是**证据状态**,不是券商侧已执行的事实。 只有日后接入并回传执行回执的预授权运行时,才能把暂停或 canary 推进标为已完成。 +当前 payload 的 policy mode 为 `evidence_only`:自动化仅限监控、工件校验和 +issue-only 研究任务,任何策略阶段、canary 或券商订单状态都不会被它自行改变。 | 变量 | 说明 | |------|------| diff --git a/ops/quant-monitor/scripts/build_dashboard_snapshot.py b/ops/quant-monitor/scripts/build_dashboard_snapshot.py index 1bea98b..c3683eb 100755 --- a/ops/quant-monitor/scripts/build_dashboard_snapshot.py +++ b/ops/quant-monitor/scripts/build_dashboard_snapshot.py @@ -303,9 +303,9 @@ def build_payload( **counts, }, "policy": { - "mode": "read_only", - "automatic_stages": ["research_backtest_only", "ai_monitored_candidate", "shadow_candidate"], - "automatic_modes": ["bounded_canary_run"], + "mode": "evidence_only", + "automatic_stages": [], + "automatic_modes": [], "human_gate_stages": ["live_candidate", "runtime_enabled"], "canary_requirements": ["预批准固定预算", "固定最长运行时间", "最大回撤熔断", "禁止自动加仓与加杠杆"], "machine_checks": [ @@ -314,7 +314,7 @@ def build_payload( "成本、OOS/WFA 与证据包(如已提供)", ], "human_actions": ["批准正常 live", "批准提高资金/杠杆", "确认例外覆盖"], - "notice": "研究、shadow、canary 可按固定规则自动推进;正常 live 与资金/杠杆变更必须人工确认。", + "notice": "当前监控只自动生成研究与风险证据,不推进阶段、不运行 canary、不暂停券商订单;正常 live 与资金/杠杆变更必须人工确认。", }, "strategies": strategies, } diff --git a/ops/quant-monitor/tests/test_dashboard_snapshot.py b/ops/quant-monitor/tests/test_dashboard_snapshot.py index a96c1ed..fe2a85b 100644 --- a/ops/quant-monitor/tests/test_dashboard_snapshot.py +++ b/ops/quant-monitor/tests/test_dashboard_snapshot.py @@ -245,12 +245,15 @@ def test_redacts_untrusted_review_fields_and_keeps_missing_scores_null(self): self.assertNotIn("secret", strategy["review"]) self.assertNotIn("token", strategy["review"]["validation"]) - def test_policy_keeps_normal_live_as_human_gate(self): + def test_policy_reports_evidence_only_until_runtime_is_bound(self): with tempfile.TemporaryDirectory() as tmp: payload = build_payload(health_file=Path(tmp) / "missing.json") - self.assertIn("bounded_canary_run", payload["policy"]["automatic_modes"]) + self.assertEqual(payload["policy"]["mode"], "evidence_only") + self.assertEqual(payload["policy"]["automatic_stages"], []) + self.assertEqual(payload["policy"]["automatic_modes"], []) self.assertEqual(payload["policy"]["human_gate_stages"], ["live_candidate", "runtime_enabled"]) + self.assertIn("不暂停券商订单", payload["policy"]["notice"]) def test_healthy_live_candidate_still_waits_for_human(self): with tempfile.TemporaryDirectory() as tmp: