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'' f'' - f'{int(value)}' + f"{label}" 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("