diff --git a/app/verify/signals.py b/app/verify/signals.py index 00b8316..0ccfb89 100644 --- a/app/verify/signals.py +++ b/app/verify/signals.py @@ -110,8 +110,15 @@ def cpu_signals(rec: dict[str, Any], now_year: int) -> list[Signal]: _cmp_ge("threads_ge_cores", rec.get("threads"), rec.get("cores"), hard=True), _cmp_ge("boost_ge_base", rec.get("boost_clock_ghz"), rec.get("base_clock_ghz"), hard=True), _cmp_ge("max_tdp_ge_tdp", rec.get("max_tdp_w"), rec.get("tdp_w"), hard=False), - _cmp_ge("passmark_multi_ge_single", rec.get("passmark_cpu_mark"), - rec.get("passmark_single"), hard=False), + # No passmark_cpu_mark vs passmark_single check: PassMark's CPU Mark and + # its Single Thread Rating are separately normalised scales, so their + # magnitudes are not comparable. The old check read that as a defect — + # it failed 51 of 51 single-core parts, and its failures tracked absolute + # weakness rather than parallelism (failing median CPU Mark 641 vs 19,657 + # for passing), with near-ties at the boundary (Core 2 Duo E8600: 1378 vs + # 1388). It only ever "held" because modern CPU Marks are large. + # Cinebench and Geekbench below DO report both figures on one scale, so + # multi >= single is a real expectation there. _cmp_ge("cb23_multi_ge_single", rec.get("cinebench_r23_multi"), rec.get("cinebench_r23_single"), hard=False), _cmp_ge("gb_multi_ge_single", rec.get("geekbench_multi"), diff --git a/tests/verify/test_signals.py b/tests/verify/test_signals.py index f20bd7a..3a4138c 100644 --- a/tests/verify/test_signals.py +++ b/tests/verify/test_signals.py @@ -122,3 +122,17 @@ def test_core_count_under_the_wrong_vendor_field_fails(): def test_core_count_in_the_right_field_passes(): rec = {"manufacturer": "amd", "stream_processors": 2048, "release_date": "2020-01-01"} assert _named(signals.gpu_signals(rec, NOW), "vendor_core_field").result == "pass" + + +def test_passmark_figures_are_not_compared(): + """CPU Mark and Single Thread Rating are separately normalised PassMark + scales; a single-core part legitimately scores lower on the first.""" + rec = {"cores": 1, "threads": 1, "passmark_cpu_mark": 195, "passmark_single": 301} + names = {s.name for s in signals.cpu_signals(rec, NOW)} + assert "passmark_multi_ge_single" not in names + + +def test_cinebench_multi_below_single_still_fails(): + """One scale, so multi < single there really is a defect.""" + rec = {"cores": 8, "threads": 16, "cinebench_r23_multi": 900, "cinebench_r23_single": 1500} + assert _named(signals.cpu_signals(rec, NOW), "cb23_multi_ge_single").result == "fail"