What it is. The framework's first step beyond discrete answer sets, in two tracks. Track 1 replicates the "turtle paper" (outcome-based RL to predict the future) on Polymarket binary questions: the model reads a question written before resolution and outputs a probability, rewarded by a proper scoring rule once the outcome is known. Track 2 moves to continuous targets, where the model outputs a full density — first a single Beta distribution, then a mixture of Betas. Everything is GRPO + LoRA on Qwen3-4B (scale probes at 14B/32B), trained on 4.7k synthetic "future-as-label" examples, tested on 1,265 real Polymarket questions (zero train/test contamination verified by exact-match and Jaccard checks).

Track 1 — Polymarket binary forecasting

Headline table below is the historical parse-conditioned view — each model scored only on the questions it parsed. The parse % column is the new addition that exposes the catch: the Beta-format methods abstain on ~20% of questions, so their Brier is not comparable to the ~99%-parse point methods. The set-matched comparison directly below corrects this.

Model / configparse %Brier ↓ECE ↓Acc ↑extreme (>0.95) %
Base Qwen3-4B, point probability~0.990.4860.4870.420~20%
Base Qwen3-14B, point probability0.9900.3470.2620.57634%
Base Qwen3-14B, Beta format, zero-shot0.8090.2110.0910.6792%
Base Qwen3-32B, Beta format, zero-shot0.9120.2040.1130.6882.4%
4B + Brier-reward LoRA (s300)0.9930.2560.1430.6388.2%
4B + log-reward LoRA (s300)0.9970.2410.1410.6485.8%
4B + Beta-format RL (s200) — best 4B0.8020.2130.0930.6920.2%
o1 (reference, no RL)1.0000.2020.0960.700
ReMax 14B, 110k train (turtle paper SOTA)1.0000.1910.0530.717
Polymarket aggregate odds (oracle)1.0000.1510.0450.781

Brier/ECE/Acc here are each model's own parsed subset (1,265-question turtle test set). Parse % from forecasting_matched.py; Beta-format rows abstain heavily (PP-Beta 4B parses 1014/1265). o1 / ReMax / Polymarket predictions are full-coverage references shipped with the test set.

Findings.

Prompt ablation (2026-05-28) reframes the Beta story. Nine prompt variants on 250 test questions, Qwen3-14B zero-shot, scored with an honest Brier (failed parses charged at the base rate): the raw "Beta wins by −0.150" shrinks to −0.079 once parse failures are charged; simple discrete quantization of output probabilities to {0.05,…,0.95} reaches 0.262 with perfect parse rates, rivaling Beta; and just reordering the prompt to "output FIRST, then reason" captures about half the Beta benefit (0.276) with no format change at all. Interpretation: much of the Beta advantage is commit-before-rationalize behavior plus selective abstention on hard questions — the format matters less than when the number is emitted.

Example: one question, three prompt formats (click to expand)

The same question ("Will Apple launch an iPhone SE on February 19?", gold = No) answered by the 14B base model under three prompt formats — full reasoning and completion each:

Set-matched comparison (added 2026-06-18)

Parse failure is informative abstention: a model that declines 20% of questions is scored only on the (easier) 80% it answered, so a parse-conditioned Brier flatters it. The project-wide fix (see Overview → Measurement standards) is to compare every method on the matched subset — the questions all methods in the group parsed — and to show parse rate beside the score. Full-coverage references (o1, ReMax, Polymarket) are scored on the same subset. Tooling: 4-regression-forecasting/forecasting_matched.py.

The 4B reward comparison (log vs Brier vs Beta-format RL), matched n=1005:

4B methodparse %Brier (own / matched)ECEAccextreme
log-reward LoRA0.9970.241 / 0.2320.1290.6510.044
Brier-reward LoRA0.9930.256 / 0.2360.1220.6500.056
Beta-format RL0.8020.213 / 0.2130.0920.6930.008
o1 (ref)1.0000.202 / 0.2070.1010.6910.092
ReMax (ref)1.0000.191 / 0.1920.0660.7100.074
Polymarket (ref)1.0000.151 / 0.1540.0500.7790.272

On the matched subset Beta-format RL still leads the 4B field (0.213 vs log 0.232) — that win is real, not an artifact. But log/Brier improve when restricted to the questions Beta answered (0.241→0.232, 0.256→0.236), confirming those 1005 questions are easier; and Beta carries a 20-point lower parse rate. The honest reading: Beta is better per answered question while answering fewer of them.

The base-model format/scale comparison (14B/32B point vs Beta), matched n=964:

base methodparse %Brier (own / matched)ECEAccextreme
14B point probability0.9900.348 / 0.2820.1860.6320.240
14B Beta, zero-shot0.8090.203 / 0.2000.0890.6820.024
32B Beta, zero-shot0.9120.204 / 0.2020.1050.6910.023

The point format's Brier falls hard on the matched subset (0.348→0.282): the questions Beta abstains on are exactly where the point format flails. The Beta win survives matching (0.200 vs 0.282) but is ~40% smaller than the parse-conditioned gap implied.

Example rollouts — per method (click to expand)

For each method, a confident-correct rollout and a confident-wrong one (the overconfident miss is the failure a proper score punishes). Each shows the full prompt, reasoning, gold resolution, and completion.

Track 2 — continuous targets and branching uncertainty

For continuous outcomes the model emits an XML mixture of Betas (K ≤ 4 components, normalized weights), inducing \( p(y) = \sum_k w_k\, \mathrm{Beta}(y;\alpha_k,\beta_k) \) on the range-normalized target, rewarded with the mixture log-likelihood. Unlike the binary case, here the full density is scored — mixtures can genuinely help.

"Apartment price?" latent factor in the text dishwasher? latent branch, p = 0.5 yes no Beta(a₁, b₁) high-price regime Beta(a₂, b₂) low-price regime marginal = true mixture
"Branching uncertainty": a synthetic dataset (1,200 train / 300 test) where a discrete latent variable selects between two outcome regimes. A single unimodal Beta cannot express the marginal; a mixture can. Ground-truth branch probabilities and per-branch parameters are stored, so an exact oracle ceiling is computable.

Synthetic branching benchmark — the architectural test

Oracle ceilings: true mixture +0.377 nats mean LL; best possible single Beta (moment-matched) +0.106 nats. The mixture's theoretical advantage is therefore +0.271 nats.

ModelstepsLL ↑MSE ↓cov 80%PIT KS p% bimodal
Single Beta200−0.2900.0950.790.0000
Single Beta800+0.0010.0850.850.0550
Mixture400+0.1300.0770.860.125100
Mixture800+0.2230.0770.800.82100
Mixtures capture 82% of the oracle advantage. +0.223 of the available +0.271 nats, with coverage exactly nominal (80% → 0.80) and PIT indistinguishable from uniform (KS p = 0.82). Single Beta at the same 800 steps only reaches +0.001 — the gap is architectural, not a training-budget artifact.

Set-matched check: unlike Track 1, the Track 2 headline rows do not need a matched-subset correction — at s800 both the mixture and single-Beta parse 300/300 test cases (parse rate 1.00), so every continuous metric is already computed over the same complete set. Parse rates only dip at s200 (single-Beta 0.89, mixture 0.98); those are not the reported architectural-comparison rows.

Metaculus continuous questions (real data)

CheckpointLL ↑MSE ↓cov 80%mean K% K≥2
Single Beta s200−0.9880.09910
Mixture s200−0.7190.0730.661.8180
Mixture s400 (best calibration)−0.5830.0640.761.9595
Mixture s800−0.4610.0690.741.7676

Mixture beats single Beta by −26% MSE and +0.27 nats at matched steps; s800 keeps improving LL but MSE worsens slightly — log-likelihood mildly incentivizes oversharpening. A per-component sharpness bonus (λ=0.1) was ablated and does not help (−0.12 nats on branching, flat on Metaculus).

Open items → and the bridge to project 5

Why project 5 exists. Track 2 proved distributional outputs are valuable but the model must guess mixture weights and parameters directly from text. The natural next step is to let it write a small probabilistic program — "price depends on a coin-flip over dishwasher" — and have an inference engine derive the exact mixture. That is project 5 (Regression-PPL), with Alex's pluck as the engine.

Status: both tracks complete. Last activity: prompt-ablation study, 2026-05-28.