nightly_resolution_job() is called with 1 argument and needs 2 — VYNDR Nightly Resolution dies on every run #1

Open
opened 2026-08-13 18:35:32 +00:00 by builtbykev · 0 comments
Owner

Pre-existing defect. Not caused by anything outside this repo, and nothing outside this repo fixes it.

It surfaced on 2026-08-13, when a Gitea Actions runner came online on the forge for the first time and VYNDR's dormant cron workflows became live. That runner has since been re-scoped to builtbykev/colyra only, so VYNDR's schedules will not execute again until VYNDR has a runner of its own — at which point this fails on the first nightly. Filing it now so it is not rediscovered as a mystery then.

The defect

.github/workflows/vyndr-nightly.yml:32 calls the job with one argument:

python -c "import sys; sys.path.insert(0, '.'); from blueprints.resolution import nightly_resolution_job; from datetime import date, timedelta; nightly_resolution_job((date.today() - timedelta(days=1)).isoformat())"

The function takes two required parameters — src/services/python/blueprints/resolution.py:245:

def nightly_resolution_job(game_date, unresolved_grades, get_odds_fn=None):

Observed at 2026-08-13T07:00:43Z (Actions task 8, commit 0657b71):

Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: nightly_resolution_job() missing 1 required positional argument: 'unresolved_grades'

It writes no data

The call fails before the function body runs, so no Supabase client is built and no row is touched. Independently of that, the step's env arrived empty — the log shows bare SUPABASE_URL:, SUPABASE_SERVICE_KEY:, ODDS_API_KEY:, SHADOW_MODE:, because no repository secrets are set for this repo on this forge. There is nothing to clean up.

It is not a one-line fix

There is nothing at the call site to pass. The repo has no Python-side query for unresolved grades; the equivalent read is JS — src/routes/grading.js:231 pulls unresolved props for a game from Supabase. So the fix is a decision about where the Python job gets its input:

  • add a loader in the Python service and give the module a real entry point (if __name__ == '__main__') instead of an inline python -c, or
  • have the JS side resolve the grades and hand them over, or
  • make the parameter optional with a loader as its default.

Related, and worth deciding in the same pass: the call passes no get_odds_fn, which defaults to None, so CLV and model/market alignment would be skipped silently on every run even once the signature is satisfied.

The other five schedules are in the same position

security-scan, vyndr-morning-odds, vyndr-pregame, vyndr-reporter-poll and vyndr-weather all live under .github/workflows/ — Gitea reads that directory as well as .gitea/workflows/. Whatever runner VYNDR is given will fire all six on their crons, with no repository secrets set. Worth deciding whether these schedules should be live on this forge at all before pointing a runner at it.

**Pre-existing defect. Not caused by anything outside this repo, and nothing outside this repo fixes it.** It surfaced on 2026-08-13, when a Gitea Actions runner came online on the forge for the first time and VYNDR's dormant cron workflows became live. That runner has since been re-scoped to `builtbykev/colyra` only, so VYNDR's schedules will not execute again until VYNDR has a runner of its own — **at which point this fails on the first nightly.** Filing it now so it is not rediscovered as a mystery then. ## The defect `.github/workflows/vyndr-nightly.yml:32` calls the job with one argument: ``` python -c "import sys; sys.path.insert(0, '.'); from blueprints.resolution import nightly_resolution_job; from datetime import date, timedelta; nightly_resolution_job((date.today() - timedelta(days=1)).isoformat())" ``` The function takes two required parameters — `src/services/python/blueprints/resolution.py:245`: ```python def nightly_resolution_job(game_date, unresolved_grades, get_odds_fn=None): ``` Observed at `2026-08-13T07:00:43Z` (Actions task 8, commit `0657b71`): ``` Traceback (most recent call last): File "<string>", line 1, in <module> TypeError: nightly_resolution_job() missing 1 required positional argument: 'unresolved_grades' ``` ## It writes no data The call fails before the function body runs, so no Supabase client is built and no row is touched. Independently of that, the step's env arrived **empty** — the log shows bare `SUPABASE_URL:`, `SUPABASE_SERVICE_KEY:`, `ODDS_API_KEY:`, `SHADOW_MODE:`, because no repository secrets are set for this repo on this forge. There is nothing to clean up. ## It is not a one-line fix There is nothing at the call site to pass. The repo has **no Python-side query for unresolved grades**; the equivalent read is JS — `src/routes/grading.js:231` pulls unresolved props for a game from Supabase. So the fix is a decision about where the Python job gets its input: - add a loader in the Python service and give the module a real entry point (`if __name__ == '__main__'`) instead of an inline `python -c`, or - have the JS side resolve the grades and hand them over, or - make the parameter optional with a loader as its default. Related, and worth deciding in the same pass: the call passes no `get_odds_fn`, which defaults to `None`, so **CLV and model/market alignment would be skipped silently on every run** even once the signature is satisfied. ## The other five schedules are in the same position `security-scan`, `vyndr-morning-odds`, `vyndr-pregame`, `vyndr-reporter-poll` and `vyndr-weather` all live under `.github/workflows/` — Gitea reads that directory as well as `.gitea/workflows/`. Whatever runner VYNDR is given will fire all six on their crons, with no repository secrets set. Worth deciding whether these schedules should be live on this forge at all before pointing a runner at it.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: builtbykev/vyndr#1