from pathlib import Path def test_current_step_uses_stabilized_timeline_not_view_header(): js = Path("web/static/progress.js").read_text(encoding="utf-8") render = js.split("function renderRunViewModel", 1)[1].split("function renderProgress", 1)[0] assert "const stable=stabilizeProgressPayload(p,view)" in render assert "setText('currentStep',stable.currentStepLabel" in render assert "header.current_phase_label" not in render assert "animateProgressBar(progress,runStatus,stable.currentStep)" in render def test_events_and_last_event_use_same_stable_event_source(): js = Path("web/static/progress.js").read_text(encoding="utf-8") render = js.split("function renderRunViewModel", 1)[1].split("function renderProgress", 1)[0] assert "const stableEvents=mergeStableEvents" in render assert "const latestEvent=stableEvents[stableEvents.length-1]" in render assert "renderActivityFeed(stableEvents)" in render assert "view.activity||[]" not in render def test_stabilized_payload_returns_current_step_label(): js = Path("web/static/progress.js").read_text(encoding="utf-8") assert "function activeTimelineItem" in js assert "currentStepLabel:activeItem?.label" in js assert "progressStability.currentStep" in js def test_timeline_centering_css_escape_is_safe(): js = Path("web/static/progress.js").read_text(encoding="utf-8") assert "typeof CSS!=='undefined'" in js assert "const safeStep=" in js def test_app_version_v69(): assert '"version": "v74-grouped-timeline-rings"' in Path("app.py").read_text(encoding="utf-8")