diff --git a/kaievolve/viewer/server.py b/kaievolve/viewer/server.py
index 6946897..d9779fc 100644
--- a/kaievolve/viewer/server.py
+++ b/kaievolve/viewer/server.py
@@ -610,7 +610,11 @@ def compare_page():
"delta": f"{delta:.4f}" if abs(delta) > 1e-9 else "best",
"delta_cls": dcls,
"level": svg.hbar(
- a.best_mean - lo + 1e-9, (hi - lo) + 1e-9, width=150, height=14
+ a.best_mean - lo + 1e-9,
+ (hi - lo) + 1e-9,
+ width=150,
+ height=14,
+ show_label=False, # gap is already shown in the 'vs best' column
),
"spark": (
svg.sparkline(curves[a.label], lo=clo, hi=chi)
diff --git a/kaievolve/viewer/svg.py b/kaievolve/viewer/svg.py
index af89792..68a50dc 100644
--- a/kaievolve/viewer/svg.py
+++ b/kaievolve/viewer/svg.py
@@ -236,21 +236,31 @@ def effect_bar(delta: float, scale: float, width: int = 200, height: int = 20) -
# ─── horizontal bar (model usage etc.) ───────────────────────────────────────
-def hbar(value: float, max_value: float, width: int = 180, height: int = 16) -> str:
- """A plain left-anchored bar with the count at its end. For 'AI models used'
- and similar small categorical breakdowns."""
+def hbar(
+ value: float, max_value: float, width: int = 180, height: int = 16, show_label: bool = True
+) -> str:
+ """A plain left-anchored bar. With ``show_label`` (the default) the integer
+ ``value`` is printed at the bar's end - for count breakdowns like 'AI models
+ used'. Set ``show_label=False`` when the bar encodes a continuous magnitude
+ (e.g. a score gap) whose exact value already lives in an adjacent column;
+ an ``int()`` count label would otherwise read as a meaningless '0'."""
if max_value <= 0:
return _empty(width, height)
frac = max(0.0, min(1.0, value / max_value))
- w = frac * (width - 34)
+ pad = 34 if show_label else 4
+ w = frac * (width - pad)
y = height * 0.5
+ label = (
+ f'{int(value)}'
+ if show_label
+ else ""
+ )
return (
f'"
)
diff --git a/tests/test_viewer.py b/tests/test_viewer.py
index de4eead..2a6d74d 100644
--- a/tests/test_viewer.py
+++ b/tests/test_viewer.py
@@ -32,6 +32,13 @@ def test_charts_well_formed(self):
self._well_formed(svg.effect_bar(0.0, 0.0)) # zero delta + zero scale
self._well_formed(svg.hbar(12, 40))
self._well_formed(svg.hbar(0, 0)) # empty
+ self._well_formed(svg.hbar(0.07, 0.2, show_label=False)) # magnitude bar, no label
+
+ def test_hbar_label_toggle(self):
+ # count bars print the integer value; magnitude bars omit it so a
+ # fractional gap doesn't render as a meaningless int() '0'
+ self.assertIn("