Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

fix(live): a night lost to a total market-data failure reads "an internal error" on the board

Open Beginner friendly
#698 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
Under an hour
Newbie friendliness
85/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
javascript, python
Domain
backend, frontend

Research direction

Start at dashboard/backend/domain/leaderboard/live.py:1153 where the bare RuntimeError is raised; add LiveNoBarsError subclass and raise it. Then add a parametrized case to dashboard/backend/tests/test_live_budget.py:163 and a deploy-level test asserting last_attempt.kind == "market_data_gap". Done when the board shows the existing gap copy for empty-bar live segments and tests pass.

Written by the indexing model from the issue text.

Description

Deferred from #693 (live attempt ledger); docs/superpowers/plans/2026-10-14-live-board-fixes.md ("Out of scope") named it a follow-up. Re-verified against origin/main @ 7f9ce0f3.

What. When fetch_hourly_bars returns nothing for a live segment, _trade_live_segment raises a bare RuntimeError("No market data returned for live increment …") (dashboard/backend/domain/leaderboard/live.py:1153-1156). classify_attempt matches by class name along the exception's MRO (live_budget.py:236-252); a plain RuntimeError matches nothing and falls through to KIND_ERROR, which the board renders as "failed: an internal error" (dashboard/frontend/js/live-leaderboard.js:134).

The neighbouring case is already typed: a trading day with no bars raises LiveSessionGapError (live.py:631), maps to market_data_gap (live_budget.py:74) and reads "market data was missing for a session" (live-leaderboard.js:127).

Impact (cosmetic). Public board copy only. No spend is lost: the attempt fails before any model call (the strategy is built at live.py:1086, bars are fetched at 1150), and deploy_live_model_increment still records the attempt through attempt.finish(exc) (live.py:1037-1048).

Suggested fix.

  • Add class LiveNoBarsError(LiveSessionGapError) next to LiveSessionGapError and raise it at live.py:1154. classify_attempt walks the MRO, so it maps to market_data_gap with no change to live_budget.py. (No except LiveSessionGapError exists in the backend, so nothing else changes behaviour.)
  • If a separate meaning is wanted, subclass RuntimeError and add its name to _KIND_BY_TYPE_NAME (live_budget.py:72-77).
  • Wording needs an owner call: "market data was missing for a session" is slightly off for "no bars for the whole segment". A new kind must be added to KINDS (live_budget.py:58-66; an unknown kind is coerced to error by clean_last_attempt) and to LIVE_ATTEMPT_KIND_COPY in the JS.
  • The same message shape exists on the contest/daily path (service.py:2387-2390); it is outside the live attempt ledger and needs no change.

Tests. Add a case to test_an_attempt_is_classified_without_its_message (dashboard/backend/tests/test_live_budget.py, the parametrize list at 163-184), plus one deploy-level case: an empty fetch_hourly_bars leaves last_attempt.kind == "market_data_gap" on the ledger row.

Estimate. About 1 hour.

Dominant language
Python
Stars
767
Forks
156
Avg merge
1d 19h
Merged PRs (30d)
71

Getting set up

  • Ships a Dockerfile or Docker Compose file
  • No pull request template
  • No contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from Open-Finance-Lab/AgenticTrading

All issues in Open-Finance-Lab/AgenticTrading

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.