← All projects
Case study · Applied AI · LLM agent

Downfield

A local AI research agent that turns game, injury, news and weather data into structured, versioned NFL reports for BetTail. It runs with only the tools it needs and no app secrets, treats web pages as untrusted, and code checks every report before it's published.

Status
Running locally, private source
Timeline
September–October 2026
Stack
Node.js, JavaScript, JSON Schema
Works with
Claude (run headless), BetTail

Key decisionKeep source tracking in the app, not the model. A citation only counts if the app saw the agent fetch that page, and every forecast version is kept, so an update never erases an earlier prediction.

What it shows

Output you can check

Reports follow a JSON Schema, and code checks the arithmetic and that player totals reconcile, such as receiving yards against passing yards.

Forecasts you can audit

Each version keeps its own evidence, and code grades predictions against final stats after each game, so accuracy can be tracked over time.

Least privilege for an agent

A fixed tool list, a fixed model and an allowlisted environment, all checked when the session starts. Anything unexpected stops the run. Sportsbook price APIs are called only from a separate server, so their keys never reach the agent.

Untrusted input

Web pages are evidence to weigh, never instructions to follow. Reports reach BetTail through a short-lived, report-only credential, never a login or database key.

How it works

A fluent report can still rest on a stale injury report or numbers that don't add up. Downfield gathers recent games, rosters, injuries, news and weather into a research packet, lets the model write its forecast, then checks the result before anyone sees it.

Follow a report Choose a stage

  1. 01Research packet
  2. 02Agent run
  3. 03Code checks
  4. 04Publish

Stage 01 / Research packet

What's known before the model starts?

Game, player, injury, news and weather data are saved as snapshots, and anything missing is listed as a gap instead of being filled in.

Boundary

A saved snapshot can't prove an injury report is still current.

Stage 02 / Agent run

What can the agent do?

The agent runs headless with web search and fetch only, a fixed model and an environment built from an allowlist. Any other tool, model or API-key sign-in stops the run.

Boundary

Fetching a page shows the agent read it, not that the page supports the claim.

Stage 03 / Code checks

Does the report hold together?

The report must match the schema, use known player and game IDs, and pass arithmetic and cross-player checks. Citations the app didn't see fetched are marked unverified and lower the report's confidence.

Boundary

Consistent numbers don't make a forecast right.

Stage 04 / Publish

What happens when the forecast changes?

Each version keeps its own evidence, so new information adds a version instead of overwriting the old one. After each game, code grades the predictions against final stats and leaves missing stats ungraded.

Boundary

Fresh reports need my computer awake and online.

What's tested

Forbidden tools

Tests try shell, file, edit and plug-in tools, an extra exposed tool, a different model and an API-key sign-in. Each one stops the run with no report saved.

Credential exclusion

Tests confirm the agent's environment drops API keys, tokens and provider overrides. The environment code and its tests run on their own from the public folder.

Bad output

Malformed responses, unknown citation IDs and inconsistent totals are rejected before anything is published.

Forecast history

Tests check that grading uses the earliest pregame forecast, rejects evidence saved after kickoff and leaves missing stats empty instead of scoring them as zero.

Limits

Discuss Downfield

Ask about locking down an AI agent's tools, handling untrusted web pages or checking model output with code. Email me at aagarwalcollege@gmail.com.