From f9044094a7bdb2b6e1f7a40ba55d1f1e31c670a6 Mon Sep 17 00:00:00 2001 From: KiriAky 107 Date: Wed, 9 Sep 2026 18:16:21 +0800 Subject: [PATCH] =?UTF-8?q?fix(acceptance):=20=E9=AA=8C=E8=AF=81=E6=9C=89?= =?UTF-8?q?=E9=99=90=E6=95=B0=E5=80=BC=E6=8C=87=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/tests/test_phase3_acceptance_runner.py | 18 ++++++++++++++++++ scripts/phase3_acceptance.py | 8 +++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/backend/tests/test_phase3_acceptance_runner.py b/backend/tests/test_phase3_acceptance_runner.py index 052df56..b8f4df9 100644 --- a/backend/tests/test_phase3_acceptance_runner.py +++ b/backend/tests/test_phase3_acceptance_runner.py @@ -107,6 +107,24 @@ def test_driver_result_must_supply_assertions_metrics_and_zero_exit(tmp_path): runner.ROOT = original_root +def test_driver_result_accepts_finite_nonnegative_float_metrics(): + base = { + "schema": 1, + "case_id": "S-09", + "status": "PASSED", + "assertions": [{"name": "latency", "status": "PASSED"}], + "metrics": {"api_p95_ms": 61.4481}, + "files": [], + "revisions": [], + } + assert runner._validate_driver_result("S-09", base, ("api_p95_ms",)) == [] + for invalid in (float("nan"), float("inf"), -0.1, True): + base["metrics"]["api_p95_ms"] = invalid + assert runner._validate_driver_result("S-09", base, ("api_p95_ms",)) == [ + "RESULT_METRIC_MISSING:api_p95_ms" + ] + + def test_valid_driver_passes_and_its_log_is_redacted(tmp_path): driver = tmp_path / "driver.py" driver.write_text( diff --git a/scripts/phase3_acceptance.py b/scripts/phase3_acceptance.py index 5d75575..eb5ca2b 100644 --- a/scripts/phase3_acceptance.py +++ b/scripts/phase3_acceptance.py @@ -5,6 +5,7 @@ from __future__ import annotations import argparse import hashlib import json +import math import os import re import subprocess @@ -377,7 +378,12 @@ def _validate_driver_result(case_id: str, result: Any, required_metrics: tuple[s else: for name in required_metrics: value = metrics.get(name) - if not isinstance(value, int) or isinstance(value, bool) or value < 0: + if ( + not isinstance(value, (int, float)) + or isinstance(value, bool) + or not math.isfinite(value) + or value < 0 + ): errors.append(f"RESULT_METRIC_MISSING:{name}") for name in ("files", "revisions"): if not isinstance(result.get(name), list):