feat: add public h5 dashboard and publish traceability

This commit is contained in:
Wyndham ARR
2026-08-03 13:04:41 +08:00
parent 7e7470821b
commit 2107f00e32
29 changed files with 1047 additions and 71 deletions

View File

@@ -92,6 +92,9 @@ class JobTraceTests(unittest.TestCase):
self.assertEqual(trace["job"]["current_stage"], "downstream")
self.assertFalse(trace["job"]["active"])
self.assertIsNone(trace["job"]["remote_run_id"])
self.assertEqual(trace["job"]["execution_scope"], "arr_runtime")
self.assertEqual(trace["job"]["processor_mode"], "fixed_processor")
self.assertEqual(trace["job"]["remote_dispatch"], "none")
self.assertEqual(trace["job"]["version_no"], 2)
self.assertEqual(trace["job"]["output_rows"], 17)
codes = [item["code"] for item in trace["logs"]]
@@ -121,6 +124,9 @@ class JobTraceTests(unittest.TestCase):
"MCP",
):
self.assertNotIn(private_value, rendered)
self.assertNotIn("本地处理", rendered)
self.assertIn("ARR 固定处理器输出", rendered)
self.assertIn("Finance 数据库提交已完成", rendered)
def test_runtime_failure_is_located_at_processor_boundary(self) -> None:
finished = self.started + timedelta(minutes=4)
@@ -160,6 +166,43 @@ class JobTraceTests(unittest.TestCase):
self.assertGreaterEqual(len(errors), 2)
self.assertTrue(all(item["stage"] == "processor" for item in errors))
def test_legacy_direct_mcp_trace_exposes_remote_semantics(self) -> None:
finished = self.started + timedelta(minutes=4)
trace = build_job_trace(
{
"job_id": "arrjob-legacy-001",
"run_status": "failed",
"public_status": "failed",
"delivery_mode": "direct_mcp",
"failure_code": "REMOTE_FAILED",
"failure_message": "remote processor failed",
"created_at": self.started,
"updated_at": finished,
"finished_at": finished,
"filename": "source.xml",
"byte_size": 99,
"source_sha256": "d" * 64,
},
attempts=[
{
"attempt_no": 1,
"attempt_status": "failed",
"remote_run_id": "remote-run-123",
"failure_code": "REMOTE_FAILED",
"failure_message": "remote processor failed",
"created_at": self.started + timedelta(seconds=1),
"started_at": self.started + timedelta(seconds=2),
"finished_at": finished,
}
],
refreshed_at=finished,
)
self.assertEqual(trace["job"]["execution_scope"], "remote_agent")
self.assertEqual(trace["job"]["processor_mode"], "legacy_direct_mcp")
self.assertEqual(trace["job"]["remote_dispatch"], "mcp")
self.assertEqual(trace["job"]["remote_run_id"], "remote-run-123")
def test_active_run_ends_with_current_programmatic_state(self) -> None:
trace = build_job_trace(
{