diff --git a/.github/workflows/daily-leaderboard.yml b/.github/workflows/daily-leaderboard.yml index 7020bca4..82a3a003 100644 --- a/.github/workflows/daily-leaderboard.yml +++ b/.github/workflows/daily-leaderboard.yml @@ -8,11 +8,17 @@ name: Daily Leaderboard refresh # # Requires repository secret LEADERBOARD_DAILY_REFRESH_SECRET matching # the value configured on the Render service. +# +# UI is temporarily hidden (Daily Leaderboard subtab parked). The nightly +# schedule is paused until model curves deploy reliably — keep +# workflow_dispatch so operators can still trigger a refresh by hand. +# To re-enable: restore the `schedule:` block below and un-hide the subtab +# in dashboard/frontend/app.html (+ the navigateToPage redirect in app.js). on: - schedule: - # 22:30 UTC Mon–Fri ≈ 18:30 EDT / 17:30 EST — after the 16:00 ET cash close. - - cron: "30 22 * * 1-5" + # schedule: + # # 22:30 UTC Mon–Fri ≈ 18:30 EDT / 17:30 EST — after the 16:00 ET cash close. + # - cron: "30 22 * * 1-5" workflow_dispatch: inputs: deploy_models: diff --git a/dashboard/backend/tests/test_frontend_daily_leaderboard.py b/dashboard/backend/tests/test_frontend_daily_leaderboard.py index c43300a2..8ac3c3b1 100644 --- a/dashboard/backend/tests/test_frontend_daily_leaderboard.py +++ b/dashboard/backend/tests/test_frontend_daily_leaderboard.py @@ -90,3 +90,18 @@ def test_leaderboard_cache_buster_bumped(): match = re.search(r"js/leaderboard\.js\?v=(\d+)", _APP_HTML) assert match, "leaderboard.js must be loaded with a ?v= cache buster" assert int(match.group(1)) >= 19 + + +def test_daily_leaderboard_subtab_is_parked(): + """UI is hidden until daily model deploys are reliable; backend stays. + + Re-enable by removing ``hidden`` from the subtab (and About card), restoring + ``NAV_VIEW_MAP['daily']`` → ``competitionTab: 'daily'``, dropping the + navigateToPage redirect in app.js, and turning the workflow schedule back on. + """ + assert re.search( + r'data-competition-tab="daily"[^>]*\bhidden\b', + _APP_HTML, + ), "Daily Leaderboard subtab must stay hidden while the board is parked" + assert "competitionTab: 'leaderboard'" in _APP_HTML + assert re.search(r"\bdaily\s*:\s*\{[^}]*competitionTab:\s*'leaderboard'", _APP_HTML) diff --git a/dashboard/backend/tests/test_frontend_fast_boot.py b/dashboard/backend/tests/test_frontend_fast_boot.py index e2f9c6a6..c90a9861 100644 --- a/dashboard/backend/tests/test_frontend_fast_boot.py +++ b/dashboard/backend/tests/test_frontend_fast_boot.py @@ -183,5 +183,5 @@ def test_cache_busters_bumped(): # branch started from. Two branches cut from different bases can both # "bump" to the same number, merge without a conflict, and leave prod # serving new app.js content under a ?v= browsers have already cached. - assert "app.js?v=101" in APP_HTML + assert "app.js?v=102" in APP_HTML assert "styles.css?v=101" in APP_HTML diff --git a/dashboard/frontend/app.html b/dashboard/frontend/app.html index e4895fdc..d992b360 100644 --- a/dashboard/frontend/app.html +++ b/dashboard/frontend/app.html @@ -36,7 +36,9 @@ playground: { page: 'playground', playgroundTab: 'agents' }, 'my-algo': { page: 'playground', playgroundTab: 'agents' }, contest: { page: 'competition', competitionTab: 'leaderboard' }, - daily: { page: 'competition', competitionTab: 'daily' }, + // Daily Leaderboard UI is temporarily retired (backend/cron kept). + // ?view=daily deep links fall through to the contest board. + daily: { page: 'competition', competitionTab: 'leaderboard' }, competition: { page: 'competition', competitionTab: 'leaderboard' }, leaderboard: { page: 'competition', competitionTab: 'leaderboard' }, participants: { page: 'competition', competitionTab: 'participants' }, @@ -52,6 +54,10 @@ if (saved && saved.page === 'playground' && saved.playgroundTab === 'marketplace') { return { page: 'community' }; } + // Daily Leaderboard tab is hidden until the deploy pipeline is fixed. + if (saved && saved.page === 'competition' && saved.competitionTab === 'daily') { + return { page: 'competition', competitionTab: 'leaderboard' }; + } return saved; } window.migrateSavedNavState = migrateSavedNavState; @@ -1455,7 +1461,8 @@
The Daily Leaderboard is the same chart + standings UI as Competition, but each entry is an hourly backtest over the last completed US cash session (after 16:00 ET that weekday; before the close, the prior session). Baseline and index lines refresh automatically on load. New AI entries appear when the leaderboard next updates.