diff --git a/frontend/src/leftoverMapAxisBadge.ts b/frontend/src/leftoverMapAxisBadge.ts index 4a00d425f..84941caa9 100644 --- a/frontend/src/leftoverMapAxisBadge.ts +++ b/frontend/src/leftoverMapAxisBadge.ts @@ -13,6 +13,9 @@ export const LEFTOVER_MAP_AXIS_BADGE_SINGULAR = "leftover axis {axis} σ {value} export const LEFTOVER_MAP_AXIS_BADGE_SINGULAR_ONLY = "leftover axis {axis} σ {value}"; +export const LEFTOVER_MAP_AXIS_TICK_SINGULAR = + "leftover axis {axis} tick {value} σ {singular}"; + export type LeftoverMapAxisBadge = { template: string; values: Record; @@ -70,3 +73,19 @@ export function leftoverMapAxisBadge( values: { axis: axis.axis_index, value: singular, share }, }; } + +/** Project finite persisted σ onto one report-axis tick without inventing share evidence. */ +export function leftoverMapAxisTickBadge( + axisIndex: number, + tickLabel: string, + leftoverSingular: number | null | undefined, +): LeftoverMapAxisBadge | null { + const singular = formatLeftoverMapPlotAxisSingular(leftoverSingular); + if (singular === null) { + return null; + } + return { + template: LEFTOVER_MAP_AXIS_TICK_SINGULAR, + values: { axis: axisIndex, value: tickLabel, singular }, + }; +} diff --git a/tests/test_leftover_axis_tick_singular_contract.py b/tests/test_leftover_axis_tick_singular_contract.py new file mode 100644 index 000000000..e13c8f657 --- /dev/null +++ b/tests/test_leftover_axis_tick_singular_contract.py @@ -0,0 +1,27 @@ +"""Executable contract for period/report leftover-axis tick singular captions.""" + +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +BADGE_SOURCE = ROOT / "frontend" / "src" / "leftoverMapAxisBadge.ts" + + +def test_report_leftover_axis_tick_keeps_persisted_singular_without_share() -> None: + """A report leftover-axis tick may name valid persisted σ with no axis share.""" + assert BADGE_SOURCE.exists(), "report-axis badge helper is missing" + source = BADGE_SOURCE.read_text(encoding="utf-8") + + assert "leftoverMapAxisTickBadge" in source + assert "leftover axis {axis} tick {value} σ {singular}" in source + + +def test_report_leftover_axis_tick_never_infers_sigma_or_share() -> None: + """Invalid σ falls back to an ordinary leftover-axis tick; share is never synthesized.""" + assert BADGE_SOURCE.exists(), "report-axis badge helper is missing" + source = BADGE_SOURCE.read_text(encoding="utf-8") + + assert "formatLeftoverMapPlotAxisSingular" in source + assert "Math.sqrt" not in source + tail = source.split("leftoverMapAxisTickBadge", 1)[-1][:1600] + assert "leftover_share" not in tail