# Offdiagonal handoff v6.22.1 (2026-10-26) - Polymarket wallets, rules polymarket-trader-v4

HF revision 46d136eb03647138afb0e4c0fbaea7308e9a4497, folder handoff-v6.22.1-20261026/ (11 files, all re-downloaded and fingerprint-verified).

Supersedes v6.22 (3bd0b2ec) wallet cases, panels and split. Same bets, same refusals, same split; only two
features were wrong and one comparison price is added. Keep v6.21.1 notes, v6.20 minute prices, v6.19 episodes,
v6.17 energy + Numinous graph. Inputs were the frozen v6.22 files, each matching its v6.22 MANIFEST sha256.

## What was wrong in v6.22 (measured on the real rows)
1. prev_tape_yes could come from another trade at the SAME second (order within a second is not causal).
   424,500 of 674,741 eligible bets (63%) had a same-second previous price; 537,297 change value or time in v4.
   v4: only trades at a strictly earlier second count. If several trades share that second, the price is their
   size-weighted mean and prev_tape_n says how many. Present for 633,494 eligible bets; empty otherwise, never filled.
2. wallet_settled_before counted questions the wallet had not yet traded, and refused/late trades.
   204,959 eligible bets had it overstated (never understated). v4: a question counts only when the wallet's own
   first ELIGIBLE trade on it and its public answer are both strictly before the bet.

## New: judge the aggregate at the same decision time
- Panels gain tape_yes_at_check / tape_at_check: market price from trades strictly before check_at.
  Present for 83,197 of 83,199 usable rows.
- baseline_brier = (tape_yes_at_check - label)^2: the plain latest-trade rival. Mean 0.1106 over 5,263
  question-check rows. A wallet aggregate must beat this at the same check_at; beating prev_tape (an earlier,
  per-bet price) proves nothing about market edge. Keep prev_tape for explaining single bets only.
- forecaster_family = wallet, independence_basis = unknown. Duplicated wallets/copies must never count as extra
  independent evidence; test this by duplicating one forecaster and checking the output does not move.
- Panel rows 958,884 (v6.22: 958,769; 115 extra non-usable rows from refreshed question open/close times);
  usable rows unchanged at 83,199.

## Future-trades test (regression-append-future.json)
Removed every trade at/after 2026-05-15 and rebuilt: every earlier bet's prev_tape and wallet_settled_before and
every earlier check's tape price must be identical (float tolerance 1e-8). Result in the file.

## Combined overlap audit (combined-overlap-audit.json/.csv)
One row per Polymarket condition_id across wallets (eligible), ForecastBench exact-venue links and Numinous
markets, each placed by its own clock against the same cutoffs. 14,930 questions; 6 appear in two sources
(2 wallet+ForecastBench, 4 ForecastBench+Numinous); 0 split conflicts. 100 questions have their answer public
after the end of their assigned split: train only on a label at decision times after label_available_at.
Of 1,254 ForecastBench-linked Polymarket questions, 123 have wallet captures but only 2 have eligible bets
(the rest are capped or unlabelled). Missing evidence aborts this audit; it never becomes an empty set.

## Instructions for the next Zeno run (not data changes)
- Questions with post-freeze deadlines are historical evaluation, not a sealed test. A sealed test needs an
  immutable prediction receipt (POST /api/public/v1/assessment-receipts/submit) after weights and calibration
  freeze and before the answer is public, on events never used for training, selection or judging; freeze
  size, Numinous inclusion and fallback settings first.
- Missing exposure evidence must refuse judging, never become an empty set. Re-score the 39% ForecastBench
  Polymarket result against the actual v0.86.7 training exposure; the result stays a historical diagnostic.
- Forecaster exclusion must remove indirect contributions (references, normalisation scales, panel averages,
  derived features). Test: changing an excluded forecaster's training forecasts changes no tensor, scale or loss.
  Report seen / mixed / unseen panels separately for wallets.
- Ranges: score the deployed seed ensemble, aggregate by outcome, day-block uncertainty, interval score,
  coverage and width vs matched rivals. Calibration per supported contract group, regularised for small groups.
- Numinous stays background until timing, settlement, duplicate and shared-event checks pass, and until it is
  checked whether any retained consensus already includes Zeno30 forecasts. Match seeds, cases and exposure for
  with/without. M uses lr 2e-4, L 1e-4: document the effective recipe and the total fit count.
- Before launch: one full startup rehearsal on these frozen files and the replacement configs (intake,
  exclusions, combined splits, tensors, new-input checks, optimiser step, reload, verdict export).
- Send back a training report with run_id and code_sha256.

Still held: site locations, older trades of capped markets (9,087,821 refused as capture_truncated),
Numinous graph as input. Builders: build-polymarket-traders-v4.py, build-combined-overlap-audit.py.
Verify every file against MANIFEST.json.
