Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
9715e2e
test(agentic): add characterization tests before generalization refactor
ethancjackson Jul 16, 2026
57c307e
refactor(agentic): make forecasting machinery domain-agnostic via Dom…
ethancjackson Jul 16, 2026
fe137aa
chore(deps): bump mistune to 3.3.3 and pillow to 12.3.0 for pip-audit
ethancjackson Jul 16, 2026
447e3c2
Merge pull request #1 from VectorInstitute/generalize-agentic-predictors
ethancjackson Jul 16, 2026
bc5758d
feat(llmp): add optional covariate blocks to QuantileGridLLMPredictor
ethancjackson Jul 16, 2026
87767ac
feat(workshop): scaffold workshop_experiments S&P 500 package
ethancjackson Jul 16, 2026
b1b130e
chore(workshop): commit conventional smoke predictions as proof-of-life
ethancjackson Jul 16, 2026
d861ad6
Merge pull request #2 from VectorInstitute/workshop-experiments
ethancjackson Jul 16, 2026
2e23291
feat(monitor): add experiment-monitor site, data contract, and Pages …
ethancjackson Jul 16, 2026
dbd87de
Merge pull request #3 from VectorInstitute/experiment-monitor
ethancjackson Jul 16, 2026
59e9276
fix(llmp): unbreak covariate variants and OpenAI-strict structured ou…
ethancjackson Jul 16, 2026
c511671
chore(workshop): commit LLMP smoke artifacts across the 6-model matrix
ethancjackson Jul 16, 2026
15a6702
Merge pull request #4 from VectorInstitute/fix/llmp-smoke-issues
ethancjackson Jul 16, 2026
5d3099c
feat(live): add stage 2b live daily forecasting harness
ethancjackson Jul 16, 2026
5de208f
feat(contract): bump data contract to 1.1.0 with per-rung method enum
ethancjackson Jul 16, 2026
74f4f76
Merge pull request #5 from VectorInstitute/live-harness
ethancjackson Jul 16, 2026
6f1d19f
feat(workshop): adaptive study driver, tiered gates, and live twins (…
ethancjackson Jul 16, 2026
2468bed
Merge pull request #6 from VectorInstitute/adaptive-twins
ethancjackson Jul 16, 2026
664762b
chore(workshop): agent smoke artifacts + scored smoke leaderboard
ethancjackson Jul 16, 2026
6d76df7
test(live): derive simulate expectations from the smoke store
ethancjackson Jul 16, 2026
71402c4
Merge pull request #7 from VectorInstitute/smoke-artifacts
ethancjackson Jul 16, 2026
3059ce8
feat(agentic): capture curated tool calls end to end
ethancjackson Jul 16, 2026
ece634f
chore(workshop): fill the one resumed code-agent smoke prediction
ethancjackson Jul 16, 2026
f6773fa
Merge pull request #8 from VectorInstitute/tool-call-capture
ethancjackson Jul 16, 2026
9f70481
Merge pull request #9 from VectorInstitute/smoke-fill
ethancjackson Jul 16, 2026
b672696
ci(monitor): gate Pages deploy to manual-only pending approval
ethancjackson Jul 16, 2026
067b80f
feat(live): make GitHub the timestamping authority for submissions
ethancjackson Jul 16, 2026
ed42e6a
feat(agentic): bound code-agent loops via workstyle guidance + gracef…
ethancjackson Jul 16, 2026
cfcd075
Merge pull request #10 from VectorInstitute/ops-honesty-agent-efficiency
ethancjackson Jul 16, 2026
ee78c2a
feat(workshop): add TSX data layer, domain, registry, and specs
ethancjackson Jul 16, 2026
0f81f2d
feat(workshop): deploy the TSX ladder in the live harness
ethancjackson Jul 16, 2026
4c15a08
test(workshop): TSX tests and conventional smoke proof-of-life
ethancjackson Jul 16, 2026
2d256f5
feat(workshop): bring TSX code agent to efficiency parity
ethancjackson Jul 16, 2026
3f9a53e
Merge pull request #11 from VectorInstitute/tsx-pivot
ethancjackson Jul 16, 2026
b84c807
chore(live): move the opus tier to claude-opus-4-8
ethancjackson Jul 16, 2026
af3bc52
Merge pull request #12 from VectorInstitute/opus-48
ethancjackson Jul 16, 2026
7d84129
fix(llm_processes): nest litellm generations under the predict trace
ethancjackson Jul 16, 2026
d149d93
Merge pull request #13 from VectorInstitute/fix-llmp-tracing
ethancjackson Jul 16, 2026
a65801a
fix(workshop): serialize LLMP histories at return-scale precision
ethancjackson Jul 16, 2026
8f657fe
Merge pull request #14 from VectorInstitute/fix-llmp-precision
ethancjackson Jul 16, 2026
59fa92f
feat(live): add claude-sonnet-5 to the model matrix
ethancjackson Jul 16, 2026
fd5a7d0
test(live): update pinned ladder counts for the sonnet-5 rungs
ethancjackson Jul 16, 2026
1f29eef
Merge pull request #15 from VectorInstitute/sonnet-5
ethancjackson Jul 16, 2026
ac23830
fix(agentic): log cap recovery at WARNING, not as a run failure
ethancjackson Jul 16, 2026
140a9a3
fix(agentic): steer Gemini agents to serialise tool calls (proxy work…
ethancjackson Jul 16, 2026
d27228b
fix(agentic): retry predict once on the proxy function_response.name 400
ethancjackson Jul 16, 2026
6c00832
Merge pull request #16 from VectorInstitute/agent-run-hygiene
ethancjackson Jul 16, 2026
8533d33
feat(agentic): harden code-exec workstyle with fresh-interpreter + pa…
ethancjackson Jul 16, 2026
009b917
Merge pull request #17 from VectorInstitute/code-exec-instruction-har…
ethancjackson Jul 16, 2026
4762045
feat(workshop): add ws-progress experiment monitor
ethancjackson Jul 16, 2026
357be88
Merge pull request #18 from VectorInstitute/progress-monitor
ethancjackson Jul 16, 2026
28c619a
feat(adaptive): add TSX adaptive domain, seed strategy, and pipeline …
ethancjackson Jul 16, 2026
fc1a8e1
feat(adaptive): wire single-session TSX study and pre/post eval
ethancjackson Jul 16, 2026
032babc
test(adaptive): cover TSX adaptive domain, reseed, eval, and CLIs
ethancjackson Jul 16, 2026
b6a35b1
chore(workshop): complete TSX smoke store (36/36) + trace-audit log
ethancjackson Jul 16, 2026
d5d769c
Merge pull request #19 from VectorInstitute/tsx-adaptive
ethancjackson Jul 16, 2026
c96a745
fix(llmp): retry transient provider errors with backoff
ethancjackson Jul 16, 2026
2adac4f
Merge pull request #20 from VectorInstitute/llmp-retry-backoff
ethancjackson Jul 16, 2026
8aee0d7
docs(audit): stage-2 LLMP trace reads (sonnet-5, gpt-5.4 cov)
ethancjackson Jul 17, 2026
31501c1
data(retro): weekly grids complete — conventional + LLMP matrix + scores
ethancjackson Jul 17, 2026
10551c8
feat(workshop): monthly 2025 backtest spec for the reduced code-agent…
ethancjackson Jul 17, 2026
914c2e0
fix(agentic): retry transient proxy errors on the ADK agent path
ethancjackson Jul 17, 2026
feed6cc
feat(workshop): add optional inter-prediction pacing to the runner
ethancjackson Jul 17, 2026
78279cc
chore(deps): bump mcp to clear new pip-audit advisories
ethancjackson Jul 17, 2026
3157ae5
Merge pull request #21 from VectorInstitute/agent-backoff-pacing
ethancjackson Jul 17, 2026
8ed9f67
data(retro): incremental artifact snapshot (news backtest, daily LLMP…
ethancjackson Jul 17, 2026
6a4da66
data(retro): snapshot before overnight agent resume (news-sonnet eval…
ethancjackson Jul 17, 2026
0a08a00
feat(workshop): add Track-2 scenario harness + LLM judge for the TSX
ethancjackson Jul 17, 2026
7fb7fd9
docs(blog): add Part-1 figure set with regenerable scripts
ethancjackson Jul 17, 2026
3885713
style: ruff-format under post-merge toolchain
ethancjackson Jul 17, 2026
8e24dd4
docs(blog): draft Part 1 — an honest scoreboard for market forecasting
ethancjackson Jul 17, 2026
197f3ab
edit(blog): orchestrator pass on Part 1 — sourced sonnet-5 aside, For…
ethancjackson Jul 17, 2026
35fceae
Merge pull request #22 from VectorInstitute/scenario-judge
ethancjackson Jul 17, 2026
b13bdb3
feat(workshop): WS_VERIFIER_MODEL env override for the leakage verifier
ethancjackson Jul 17, 2026
1e88240
Merge pull request #23 from VectorInstitute/verifier-override
ethancjackson Jul 17, 2026
4654ccc
data(retro): snapshot after quota-outage pauses
ethancjackson Jul 17, 2026
1ddcfa9
feat(blog): add publication-ready HTML rendering pipeline
ethancjackson Jul 17, 2026
64649ce
Merge pull request #24 from VectorInstitute/writing-ethan
ethancjackson Jul 17, 2026
738db18
fix(llmp): strip integer minimum/maximum from non-OpenAI wire schemas
ethancjackson Jul 18, 2026
f3628c0
Merge pull request #25 from VectorInstitute/schema-sanitize
ethancjackson Jul 18, 2026
791ffa3
data(track2): scenario write-ups + judge verdicts for 4 landmark orig…
ethancjackson Jul 18, 2026
ef0dec8
fix(data): define market covariates on cross-calendar holidays
ethancjackson Jul 18, 2026
421549f
chore(data): add trailing newlines to scenario artifacts (repo-wide h…
ethancjackson Jul 18, 2026
52ad4eb
Merge pull request #26 from VectorInstitute/covariate-holiday-fill
ethancjackson Jul 18, 2026
8ec1da3
fix(adaptive): never force-reseed the trained strategy on study resume
ethancjackson Jul 18, 2026
a448015
Merge pull request #27 from VectorInstitute/study-resume-no-reseed
ethancjackson Jul 18, 2026
529924c
data: covariate-rung full refresh under calendar fix + monthly code l…
ethancjackson Jul 19, 2026
ef0c32f
data: heal degenerate 2025-02-03 gemini-3.5 LLMP prediction (inf quan…
ethancjackson Jul 19, 2026
96a849e
data: retrospective COMPLETE — code-agent eval leg, adaptive pre/post…
ethancjackson Jul 19, 2026
e8e4616
blog: Part 2 complete + Part 1 reconciliation under refreshed data
ethancjackson Jul 19, 2026
4f8556c
blog(part-2): coda names the efficient-market testbed choice explicitly
ethancjackson Jul 19, 2026
907fe1b
blog(part-2): final polish — full scoreboard + where-agents-earn figu…
ethancjackson Jul 19, 2026
c3d85c4
blog(figures): regenerate all Part-2 figures for legibility at blog c…
ethancjackson Jul 20, 2026
beebfff
blog(fig4): move LightGBM+cov reference-line label into the legend
ethancjackson Jul 20, 2026
9dd6503
blog(fig4): 2-column legend so it stays clear of the right-hand cards
ethancjackson Jul 20, 2026
8b5fcd2
Merge pull request #28 from VectorInstitute/writing-part-2
ethancjackson Jul 20, 2026
fcffcd0
blog(part-1): cite Requeima et al. (2024), LLM Processes (NeurIPS)
ethancjackson Jul 20, 2026
f914b70
Merge pull request #29 from VectorInstitute/cite-llmp-paper
ethancjackson Jul 20, 2026
50535a4
edits
ethancjackson Jul 20, 2026
e5b4980
Merge branch 'main' of https://github.com/VectorInstitute/agentic-for…
ethancjackson Jul 20, 2026
887dc0f
blog(part-2): retitle Coda -> "What's next", conclude on the live-eva…
ethancjackson Jul 20, 2026
46c748d
Merge pull request #30 from VectorInstitute/blog-whats-next
ethancjackson Jul 20, 2026
3acd1e8
edits
ethancjackson Jul 20, 2026
ced80cc
Merge branch 'main' of https://github.com/VectorInstitute/agentic-for…
ethancjackson Jul 20, 2026
c1ef307
blog(part-2): figure QA pass — stray arrows, header spacing, caption …
ethancjackson Jul 20, 2026
0b8bf3c
edits
ethancjackson Jul 20, 2026
27f5a95
edits
ethancjackson Jul 20, 2026
8fb6e27
a bunch of comments left
ethancjackson Jul 20, 2026
94a3ef6
blog: resolve all review comments — claims, structure, numbering
ethancjackson Jul 20, 2026
c96b934
blog(part-2): add sentinel flagship figure; temper the flagship claim…
ethancjackson Jul 20, 2026
45cb1af
blog(part-2): temper the remaining agent claims to what rigorous test…
ethancjackson Jul 20, 2026
99e947b
blog(part-2): compress and reframe — adaptive cut to its transferable…
ethancjackson Jul 20, 2026
2ab7617
blog: chrome-out figure system — shared FS/figure_title/savefig API, …
ethancjackson Jul 20, 2026
c18f0c5
blog: re-render dist after caption pass
ethancjackson Jul 20, 2026
aca2338
added inline comments to address throughout
ethancjackson Jul 21, 2026
d18d0d0
blog: address Ethan's July 20 inline comments throughout, leaning sho…
ethancjackson Jul 21, 2026
8721b7f
edits
ethancjackson Jul 21, 2026
92eaae2
consistency edits
ethancjackson Jul 21, 2026
447879b
Merge pull request #31 from VectorInstitute/blog-edits
ethancjackson Jul 21, 2026
e75d427
blog: humanize prose toward Ethan's spoken voice, strip AI-isms
ethancjackson Jul 22, 2026
1075dca
Merge pull request #32 from VectorInstitute/humanize-blog-voice
ethancjackson Jul 23, 2026
d7ca190
Merge upstream/main from VectorInstitute/agentic-forecasting.
ethancjackson Aug 24, 2026
2ad4bae
Stop advertising search_web on basic (no-tool) analyst configs.
ethancjackson Aug 24, 2026
0016afa
Host this fork's two-part series on GitHub Pages.
ethancjackson Aug 24, 2026
16d69d3
small landing page edits
ethancjackson Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
105 changes: 105 additions & 0 deletions .github/workflows/attest-live-log.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: attest live log

# Tamper-evident submission timestamps for the live forecast log.
#
# The paper claims the commit history of this public fork proves *when* each
# daily prediction was submitted. Git author/committer dates are client-supplied
# and trivially forgeable (`git commit --date=...`), so they cannot be the trust
# anchor. This workflow makes GitHub the timestamping authority: on every push to
# `main` that touches the append-only live log, it cuts a lightweight GitHub
# Release. A Release's `created_at` is set server-side by GitHub at creation and
# cannot be back-dated by a client — that server timestamp is the anchor.
#
# An auditor compares the Release `created_at` against the `submission_timestamp`
# inside the newly-committed log record: they should agree to within minutes.
# See workshop_experiments/workshop_experiments/live/ops/HONESTY.md for the full
# trust model and its limitations.
#
# The `paths:` filter mirrors `log_dir` in
# workshop_experiments/workshop_experiments/live/live_config.yaml.

on:
push:
branches:
- main
paths:
- workshop_experiments/workshop_experiments/live/log/**

# Least privilege: creating a Release (and its tag) needs contents: write only.
permissions:
contents: write

# Never run two attestations for the same head concurrently.
concurrency:
group: attest-live-log-${{ github.sha }}
cancel-in-progress: false

jobs:
attest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7.0.0
with:
# Need the previous commit to diff which log files changed.
fetch-depth: 2

- name: Create attestation release
env:
# gh CLI authenticates via GITHUB_TOKEN.
GH_TOKEN: ${{ github.token }}
BEFORE_SHA: ${{ github.event.before }}
HEAD_SHA: ${{ github.sha }}
run: |
set -euo pipefail

LOG_PATH="workshop_experiments/workshop_experiments/live/log"
SHORT_SHA="$(git rev-parse --short=7 "$HEAD_SHA")"
UTC_DATE="$(date -u +%Y-%m-%d)"
TAG="attest/${UTC_DATE}-${SHORT_SHA}"

# Idempotent: if this attestation tag already exists, do nothing. This
# makes re-runs safe and avoids duplicate releases for the same head.
if gh release view "$TAG" >/dev/null 2>&1; then
echo "Release $TAG already exists; skipping."
exit 0
fi

# Which log files changed in this push? Diff against the pre-push tip
# when we have it; otherwise fall back to the head commit alone (first
# push to a branch, or a force-push, reports an all-zero before-sha).
ZERO_SHA="0000000000000000000000000000000000000000"
if [ -n "${BEFORE_SHA:-}" ] && [ "$BEFORE_SHA" != "$ZERO_SHA" ] \
&& git cat-file -e "${BEFORE_SHA}^{commit}" 2>/dev/null; then
CHANGED="$(git diff --name-only "$BEFORE_SHA" "$HEAD_SHA" -- "$LOG_PATH" || true)"
else
CHANGED="$(git show --name-only --pretty=format: "$HEAD_SHA" -- "$LOG_PATH" | sed '/^$/d' || true)"
fi

# Assemble the release body. Server-side `created_at` (visible in the
# release metadata / API) is the trust anchor; the head SHA and file
# list below are the human-readable cross-check.
{
echo "Server-timestamped attestation of live forecast-log submission."
echo
echo "- **Head commit:** \`${HEAD_SHA}\`"
echo "- **Attested at (UTC date):** ${UTC_DATE}"
echo
echo "The trust anchor is this Release's server-set \`created_at\`, not any"
echo "git author/committer date. See"
echo "\`workshop_experiments/workshop_experiments/live/ops/HONESTY.md\`."
echo
echo "**Changed log files:**"
echo
if [ -n "$CHANGED" ]; then
echo "$CHANGED" | sed 's/^/- `/; s/$/`/'
else
echo "- (none detected under \`${LOG_PATH}\`)"
fi
} > release_body.md

gh release create "$TAG" \
--title "Live log attestation ${UTC_DATE} (${SHORT_SHA})" \
--notes-file release_body.md \
--target "$HEAD_SHA"

echo "Created release $TAG."
55 changes: 55 additions & 0 deletions .github/workflows/deploy-blog.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: deploy blog

# Publishes this fork's two-part blog series to GitHub Pages.
# This is the public site for agentic-forecasting-live: a bootcamp-project
# writeup built on VectorInstitute/agentic-forecasting.
#
# One-time repo setting (cannot be scripted from the workflow itself):
# Settings -> Pages -> Source: GitHub Actions
#
# This workflow owns Pages on this fork. The monitor workflow
# (deploy-monitor.yml) is still manual-only and must not be run — it would
# replace this site with monitor/site/. Fold the dashboard in as /monitor/
# once publication approval lands.

on:
push:
branches:
- main
paths:
- blog/**
- .github/workflows/deploy-blog.yml
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: false

jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v7.0.0

- name: Assemble Pages site
run: python3 blog/assemble_pages.py

- name: Configure Pages
uses: actions/configure-pages@v5

- name: Upload site artifact
uses: actions/upload-pages-artifact@v3
with:
path: blog/site/build

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
74 changes: 74 additions & 0 deletions .github/workflows/deploy-monitor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
name: deploy monitor

# Publishes the zero-backend experiment-monitor site (monitor/site/) to GitHub Pages.
# A fixture-validation gate runs first, so a data file that violates the schemas fails
# the deploy instead of shipping. Requires a one-time repo setting:
# Settings -> Pages -> Source: GitHub Actions (see monitor/README.md).
#
# THIS FORK: GitHub Pages is owned by the blog series (deploy-blog.yml). Do not
# run this workflow — it would replace the published site with monitor/site/.
# Fold the dashboard in as /monitor/ once Vector Institute publication approval
# lands. Until then, serve the monitor locally (see monitor/README.md).

# MANUAL-ONLY (workflow_dispatch) until Vector Institute publication approval lands.
# The monitor is deliberately NOT auto-published: while approval is pending, the
# supported way to view the dashboard is locally (see monitor/README.md). We keep
# this workflow in place so a Pages deploy is one click away once approved, but we
# do NOT wire a `push` trigger — no commit to `main` should silently publish the
# site to a public URL before sign-off. Re-add the `push:` trigger (site/schemas/
# validate_fixtures.py/this file) at that point to restore automatic deploys.
on:
workflow_dispatch:

# Least-privilege token for Pages deploy.
permissions:
contents: read
pages: write
id-token: write

# One in-flight deploy at a time; don't cancel a running publish.
concurrency:
group: pages
cancel-in-progress: false

jobs:
validate-fixtures:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7.0.0

- name: Install uv
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39
with:
version: "0.9.11"
enable-cache: true

- name: "Set up Python"
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
with:
python-version-file: ".python-version"

- name: Validate fixtures against schemas
# --no-project keeps this fast: no workspace build, just jsonschema (+ referencing).
run: uv run --no-project --with jsonschema python monitor/validate_fixtures.py

deploy:
needs: validate-fixtures
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v7.0.0

- name: Configure Pages
uses: actions/configure-pages@v5

- name: Upload site artifact
uses: actions/upload-pages-artifact@v3
with:
path: monitor/site

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
2 changes: 1 addition & 1 deletion .github/workflows/unit_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,4 @@ jobs:
uv venv .venv
source .venv/bin/activate
uv sync --all-extras --dev --all-packages
uv run pytest -m "not integration_test" tests ../implementations/tests
uv run pytest -m "not integration_test" tests ../implementations/tests ../workshop_experiments/tests
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ implementations/**/data/
!implementations/energy_oil_forecasting/data/predictions/
!implementations/energy_oil_forecasting/data/predictions/**

# blog/dist/ is regenerable (`blog/render.sh`) but the canonical rendered
# HTML is committed so it can be opened/emailed without a build step
!blog/dist/
!blog/dist/**

# workspace-specific agents
.github/agents/
.github/prompts/
Expand Down
13 changes: 10 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# Agentic Forecasting
# Agentic Forecasting Live

A foundation for building, evaluating, and comparing forecasting systems — conventional numerical models, LLM Processes, and agentic forecasters — on real economic, financial, and event-prediction tasks.
> **This is a fork.** [`VectorInstitute/agentic-forecasting`](https://github.com/VectorInstitute/agentic-forecasting) is the bootcamp foundation. This repository is a worked example of what a participant project can look like: a live evaluation of news-reading forecasting agents, written up as a two-part series.
>
> **Read the series** (hosted on this fork’s GitHub Pages): [Part 1 — An honest scoreboard for market forecasting](https://vectorinstitute.github.io/agentic-forecasting-live/part-1/) · [Part 2 — Forecasting agents that read the news](https://vectorinstitute.github.io/agentic-forecasting-live/part-2/) · [series home](https://vectorinstitute.github.io/agentic-forecasting-live/).

A foundation for building, evaluating, and comparing forecasting systems — conventional numerical models, LLM Processes, and agentic forecasters — on real economic, financial, and event-prediction tasks. The library and reference implementations below are kept in sync with origin `main` so this fork stays a drop-in descendant of that foundation.

## Contents

Expand Down Expand Up @@ -73,6 +77,8 @@ On Coder workspaces, bootcamp keys (`OPENAI_*`, `E2B_*`, `LANGFUSE_*`) live in y
aieng-forecasting/ # Installable library: import as aieng.forecasting
implementations/ # Self-contained reference implementations + co-located specs
guides/ # Step-by-step strategy guides for common build-phase tasks
blog/ # Two-part series (this fork); GitHub Pages source
workshop_experiments/ # Live TSX / S&P 500 evaluation that the series reports
scripts/ # Data-fetch scripts + E2B template builder
tests/ # Onboarding integration tests (not run in CI)
planning-docs/ # Architecture notes and the extension/roadmap catalog
Expand Down Expand Up @@ -204,7 +210,8 @@ uv run pre-commit run --all-files

- Per-implementation READMEs under [`implementations/`](implementations/) — the primary user surface.
- [`guides/`](guides/) — self-contained, step-by-step strategy guides for the most common build-phase tasks: onboarding a dataset, creating an experiment, customizing an agent's strategy, and auditing a result before you believe it.
- [Architecture atlas](https://vectorinstitute.github.io/agentic-forecasting/architecture-atlas.html) ([source](docs/architecture-atlas.html)) — a self-contained visual atlas of the system architecture: the loop, the temporal fence, predictor families, the harness, agent anatomy, and how each reference implementation instantiates them.
- [This fork’s series](https://vectorinstitute.github.io/agentic-forecasting-live/) ([source](blog/)) — the two-part live-evaluation writeup hosted on this repository’s GitHub Pages.
- [Architecture atlas](https://vectorinstitute.github.io/agentic-forecasting/architecture-atlas.html) ([source](docs/architecture-atlas.html)) — the origin repo’s visual atlas of the system architecture: the loop, the temporal fence, predictor families, the harness, agent anatomy, and how each reference implementation instantiates them.
- [`aieng-forecasting/README.md`](aieng-forecasting/README.md) and [`aieng-forecasting/aieng/forecasting/methods/README.md`](aieng-forecasting/aieng/forecasting/methods/README.md) — the library and the method catalog.
- [`planning-docs/roadmap.md`](planning-docs/roadmap.md) — architecture principles and extension ideas.

Expand Down
22 changes: 22 additions & 0 deletions aieng-forecasting/aieng/forecasting/data/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,28 @@ def business_daily_ffill(df: pd.DataFrame) -> pd.DataFrame:
return canonical_three_col(out)


def business_daily_zero_fill(df: pd.DataFrame) -> pd.DataFrame:
"""Reindex a daily *return* feature onto the business calendar, zero-filling gaps.

The return-series counterpart of :func:`business_daily_ffill`. When an
instrument's market is closed (e.g. a US holiday while the TSX trades), its
incremental return over that day is zero — the price cannot move without a
session. Forward-filling would instead repeat the previous session's return,
double-counting a move that happened once; zero-filling keeps the running sum
of daily returns equal to the cumulative price change. Leak-safe for the same
reason as forward-filling: inserted values encode no future information.
"""
if df.empty:
return df
x = df.copy().sort_values("timestamp").reset_index(drop=True)
idx = pd.bdate_range(x["timestamp"].min(), x["timestamp"].max())
filled = x.set_index("timestamp")["value"].reindex(idx).fillna(0.0)
out = filled.reset_index()
out.columns = ["timestamp", "value"]
out["released_at"] = out["timestamp"]
return canonical_three_col(out)


def log_ratio_level_feature(
numerator_df: pd.DataFrame,
denominator_df: pd.DataFrame,
Expand Down
28 changes: 28 additions & 0 deletions aieng-forecasting/aieng/forecasting/methods/agentic/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
"""

from aieng.forecasting.methods.agentic.adaptive_skill import AdaptiveSkillState, AdaptiveSkillStore
from aieng.forecasting.methods.agentic.adaptive_skill_tools import build_skill_tools
from aieng.forecasting.methods.agentic.adk_runner import AdkTextRunner, AdkTextRunnerConfig
from aieng.forecasting.methods.agentic.agent_factory import (
AgentConfig,
Expand All @@ -72,7 +73,13 @@
format_backtest_report,
load_context_documents,
)
from aieng.forecasting.methods.agentic.domain import (
DomainConfig,
build_adaptive_config,
build_analyst_config,
)
from aieng.forecasting.methods.agentic.forecast_tool import ForecastTool
from aieng.forecasting.methods.agentic.history import compress_history
from aieng.forecasting.methods.agentic.outputs import (
AgentCategoryProbability,
AgentForecastOutput,
Expand All @@ -81,8 +88,17 @@
ContinuousAgentForecastOutput,
ContinuousAgentHorizonForecast,
DiscreteAgentForecastOutput,
ScenarioAgentForecastOutput,
ScenarioCard,
)
from aieng.forecasting.methods.agentic.predictor import AgentPredictor, ForecastPromptBuilder
from aieng.forecasting.methods.agentic.strategy_state import (
CalibrationCorrection,
Hypothesis,
Observation,
StrategyState,
VersionEntry,
)


__all__: list[str] = [
Expand All @@ -95,16 +111,28 @@
"AgentForecastOutput",
"AgentPredictor",
"AgentQuantileForecast",
"CalibrationCorrection",
"CategoricalAgentForecastOutput",
"CodeExecutionConfig",
"ContinuousAgentForecastOutput",
"ContinuousAgentHorizonForecast",
"ContextRetrievalConfig",
"DiscreteAgentForecastOutput",
"DomainConfig",
"ForecastPromptBuilder",
"ForecastTool",
"Hypothesis",
"Observation",
"ScenarioAgentForecastOutput",
"ScenarioCard",
"StrategyState",
"VersionEntry",
"build_adaptive_config",
"build_adk_agent",
"build_analyst_config",
"build_curriculum_prompt",
"build_skill_tools",
"compress_history",
"format_backtest_report",
"load_context_documents",
]
Loading
Loading