From 506ad57cc606ae03be17c29bb3abc678d260b980 Mon Sep 17 00:00:00 2001 From: John McCardle Date: Thu, 2 Jul 2026 20:46:32 -0400 Subject: [PATCH] Gauntlet #340: menu layout polish; commit first captured baseline; closes #340 Menu rows no longer clip at the right edge (baseline text shortened, info column moved left). Commit the first real windowed baseline (run of 2026-07-02 on the dev machine, all six trials scored, full get_metrics snapshots at peak) with a provenance/variance caveat recorded as DESIGN.md deviation 10 -- scores for callback-heavy trials vary several-fold on a busy desktop, so recapture on a quiet system before trusting fine-grained deltas. The Gauntlet delivers: interactive menu/trial/results scenes with the instrument-panel HUD (sparkline, budget-colored FPS, load/ramp readout), six subsystem stress trials with geometric auto-ramp and p95-vs-16.67ms scoring, JSON baseline diffing with letter grades, and a headless suite test. Co-Authored-By: Claude Fable 5 --- .../baseline/gauntlet/baseline.json | 161 ++++++++++++++++++ tests/benchmarks/gauntlet/DESIGN.md | 7 + tests/benchmarks/gauntlet/gauntlet_main.py | 4 +- 3 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 tests/benchmarks/baseline/gauntlet/baseline.json diff --git a/tests/benchmarks/baseline/gauntlet/baseline.json b/tests/benchmarks/baseline/gauntlet/baseline.json new file mode 100644 index 0000000..7231ad1 --- /dev/null +++ b/tests/benchmarks/baseline/gauntlet/baseline.json @@ -0,0 +1,161 @@ +{ + "schema": 1, + "version": "0.2.8", + "commit": "7b943ed", + "date": "2026-07-02", + "platform": "Linux-6.1.0-42-amd64-x86_64-with-glibc2.36", + "budget_ms": 16.67, + "trials": { + "entity_swarm": { + "unit": "entities", + "max_load": 10555, + "p50_ms": 4.147, + "p95_ms": 11.66, + "samples": 91, + "metrics_at_peak": { + "frame_time": 1.2350000143051147, + "avg_frame_time": 1.410433053970337, + "fps": 709, + "draw_calls": 0, + "ui_elements": 0, + "visible_elements": 0, + "grid_render_time": 0.0, + "entity_render_time": 0.0, + "fov_overlay_time": 0.0, + "python_time": 0.0, + "animation_time": 0.0, + "grid_cells_rendered": 0, + "entities_rendered": 0, + "total_entities": 0, + "current_frame": 26629, + "runtime": 37.08416748046875 + } + }, + "animation_storm": { + "unit": "animations", + "max_load": 154, + "p50_ms": 0.711, + "p95_ms": 6.537, + "samples": 121, + "metrics_at_peak": { + "frame_time": 6.5370001792907715, + "avg_frame_time": 0.8120667338371277, + "fps": 1231, + "draw_calls": 0, + "ui_elements": 0, + "visible_elements": 0, + "grid_render_time": 0.0, + "entity_render_time": 0.0, + "fov_overlay_time": 0.0, + "python_time": 0.0, + "animation_time": 0.0, + "grid_cells_rendered": 0, + "entities_rendered": 0, + "total_entities": 0, + "current_frame": 38498, + "runtime": 53.4407844543457 + } + }, + "grid_titan": { + "unit": "grid side", + "max_load": 3111, + "p50_ms": 6.431, + "p95_ms": 13.068, + "samples": 102, + "metrics_at_peak": { + "frame_time": 6.113999843597412, + "avg_frame_time": 6.679051399230957, + "fps": 149, + "draw_calls": 0, + "ui_elements": 0, + "visible_elements": 0, + "grid_render_time": 0.0, + "entity_render_time": 0.0, + "fov_overlay_time": 0.0, + "python_time": 0.0, + "animation_time": 0.0, + "grid_cells_rendered": 0, + "entities_rendered": 0, + "total_entities": 0, + "current_frame": 67962, + "runtime": 112.59493255615234 + } + }, + "pathfinder_rush": { + "unit": "queries/tick", + "max_load": 450, + "p50_ms": 0.976, + "p95_ms": 11.755, + "samples": 120, + "metrics_at_peak": { + "frame_time": 0.8529999852180481, + "avg_frame_time": 1.2676669359207153, + "fps": 788, + "draw_calls": 0, + "ui_elements": 0, + "visible_elements": 0, + "grid_render_time": 0.0, + "entity_render_time": 0.0, + "fov_overlay_time": 0.0, + "python_time": 0.0, + "animation_time": 0.0, + "grid_cells_rendered": 0, + "entities_rendered": 0, + "total_entities": 0, + "current_frame": 107925, + "runtime": 220.12948608398438 + } + }, + "ui_avalanche": { + "unit": "elements", + "max_load": 4123, + "p50_ms": 7.403, + "p95_ms": 10.3, + "samples": 100, + "metrics_at_peak": { + "frame_time": 7.5889997482299805, + "avg_frame_time": 8.624098777770996, + "fps": 115, + "draw_calls": 0, + "ui_elements": 0, + "visible_elements": 0, + "grid_render_time": 0.0, + "entity_render_time": 0.0, + "fov_overlay_time": 0.0, + "python_time": 0.0, + "animation_time": 0.0, + "grid_cells_rendered": 0, + "entities_rendered": 0, + "total_entities": 0, + "current_frame": 130350, + "runtime": 253.55264282226562 + } + }, + "sightline_siege": { + "unit": "FOV entities", + "max_load": 537, + "p50_ms": 1.144, + "p95_ms": 10.743, + "samples": 120, + "metrics_at_peak": { + "frame_time": 8.36299991607666, + "avg_frame_time": 1.2766335010528564, + "fps": 783, + "draw_calls": 0, + "ui_elements": 0, + "visible_elements": 0, + "grid_render_time": 0.0, + "entity_render_time": 0.0, + "fov_overlay_time": 0.0, + "python_time": 0.0, + "animation_time": 0.0, + "grid_cells_rendered": 0, + "entities_rendered": 0, + "total_entities": 0, + "current_frame": 153274, + "runtime": 280.9121398925781 + } + } + }, + "gauntlet_score_vs_baseline": 1.0 +} \ No newline at end of file diff --git a/tests/benchmarks/gauntlet/DESIGN.md b/tests/benchmarks/gauntlet/DESIGN.md index 4494e53..e946678 100644 --- a/tests/benchmarks/gauntlet/DESIGN.md +++ b/tests/benchmarks/gauntlet/DESIGN.md @@ -40,6 +40,13 @@ preserved verbatim after this section.)* 9. **Pathfinder Rush starts its ramp at 1 query/tick** (spec table implied a larger start via the shared default). Queries burst on one 100 ms tick, so even a handful spike a single frame; starting at 1 lets the ramp find the true sustainable level. +10. **Committed baseline provenance + variance caveat.** The committed + `tests/benchmarks/baseline/gauntlet/baseline.json` is real data from a windowed run + on the implementer's machine (2026-07-02, live desktop with Xorg/Firefox running). + Even with the strike-based bail, run-to-run scores for callback-heavy trials + (notably ANIMATION STORM) varied several-fold between runs on the busy desktop. + Treat per-trial deltas below ~2x as noise until a baseline is captured on a quiet + system; delete baseline.json and re-run `run_gauntlet.py` to recapture. --- diff --git a/tests/benchmarks/gauntlet/gauntlet_main.py b/tests/benchmarks/gauntlet/gauntlet_main.py index a1996a3..61df9ed 100644 --- a/tests/benchmarks/gauntlet/gauntlet_main.py +++ b/tests/benchmarks/gauntlet/gauntlet_main.py @@ -232,8 +232,8 @@ class Gauntlet: info = "unit: %s" % cls.unit base = bt.get(cls.key) if base: - info += " baseline: %d %s" % (base.get("max_load", 0), cls.unit) - ic = mcrfpy.Caption(text=info, pos=(690, y + 4)) + info += " baseline: %d" % base.get("max_load", 0) + ic = mcrfpy.Caption(text=info, pos=(640, y + 4)) ic.font_size = 14 ic.fill_color = color(DIM) scene.children.append(ic)