Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ops/quant-monitor/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ merge 或 deploy。成功记录策略劣化后,monitor 正常结束,不再
因此健康卡片里的 `canary_eligible` 和
`pause_request_pending_confirmation` 是**证据状态**,不是券商侧已执行的事实。
只有日后接入并回传执行回执的预授权运行时,才能把暂停或 canary 推进标为已完成。
当前 payload 的 policy mode 为 `evidence_only`:自动化仅限监控、工件校验和
issue-only 研究任务,任何策略阶段、canary 或券商订单状态都不会被它自行改变。

| 变量 | 说明 |
|------|------|
Expand Down
8 changes: 4 additions & 4 deletions ops/quant-monitor/scripts/build_dashboard_snapshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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": [
Expand All @@ -314,7 +314,7 @@ def build_payload(
"成本、OOS/WFA 与证据包(如已提供)",
],
"human_actions": ["批准正常 live", "批准提高资金/杠杆", "确认例外覆盖"],
"notice": "研究、shadow、canary 可按固定规则自动推进;正常 live 与资金/杠杆变更必须人工确认。",
"notice": "当前监控只自动生成研究与风险证据,不推进阶段、不运行 canary、不暂停券商订单;正常 live 与资金/杠杆变更必须人工确认。",
},
"strategies": strategies,
}
Expand Down
7 changes: 5 additions & 2 deletions ops/quant-monitor/tests/test_dashboard_snapshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down