{
 "name": "AI Portfolio League — open data",
 "license": "CC BY 4.0",
 "license_url": "https://creativecommons.org/licenses/by/4.0/",
 "attribution": "AI Council · Markets, trends.polyhelper.ai/markets/",
 "rules": {
  "version": "arena-3",
  "start_usd": 100000.0,
  "cost": 0.001,
  "cost_means": "one rate for all costs on every dollar of the portfolio that changes",
  "execution": "the first price of 09:30–09:45 ET at the first open after the decision is sealed",
  "position_min_max": [
   0.05,
   0.25
  ],
  "cash": "earns the 13-week T-bill (^IRX)",
  "dividends": "a right on the ex-date (counted in the value), the cash 10 days later; a short owes it",
  "splits": "the units × the ratio, once",
  "instruments": {
   "SPX": "SPY",
   "NDX": "QQQ",
   "DJI": "DIA",
   "SOX": "SOXQ",
   "US10Y": "IEF",
   "DXY": "UUP",
   "GOLD": "GLD",
   "WTI": "USO",
   "BRENT": "BNO",
   "COPPER": "CPER",
   "BTC": "BTC-USD"
  }
 },
 "sources": [
  "Yahoo Finance chart API: minute and hourly bars, dividends and splits",
  "Yahoo Finance ^IRX: the T-bill yield"
 ],
 "files": {
  "council-book.jsonl": "the sealed book: every answer line and score line, hash-chained (never rewritten)",
  "asks/<sha256>.md": "the question text behind an `ask_sha256` of the book (asks/index.json lists the hashes and the runs)",
  "council-forecasts.csv": "every forecast with its horizon and result; status: counted (in the score) / not_counted (a line the score did not take: one line per seat and session counts) / no_answer or refused_shape (a cell with no forecast, why_missing says why) / counted_50 (from 2026-10-20: a cell left unanswered, scored as 50%) / not_counted also covers a cell added to the book after the day was scored; retry (from the session of 2026-11-02) is a seat's later line of the counted run, kept and published, outside the count; run_role: session_run (the run that trades its session — the one the league and the score count) / earlier_run (another run resolving the same session, shown apart); action_word: a word outside the list, its probability kept; seat_versions_in_run: 2 or more = one seat, its model version changed within the run (one participant, not two); line_kind: issue (the cell is in the answer line as sealed) / correction (the cell was added by a later line of kind correction; sealed_at is the seal time of THAT line; a published day is counted without such cells — a horizon closed after sealed_at counts them, apart; the same rule as council-stats.json `corrections.rule`)); reference_at: the time of the reference price of the row; same_event: true = the issue's one reference price (the shared scores of the day), false = the answer's own reference price (from 2026-10-21 counted apart; before it such rows were in the shared scores as published); empty = a row the score skipped; resolution_state (the last column, from 2026-10-21): resolved = the event of THIS row (its run, asset and horizon) has its own outcome in the run's score line (from 2026-10-21 only a final close: close_final, no close_pending) / unresolved = no such outcome (a horizon not closed, a run whose session another run scored, a close not final), whatever the row's `status` is: status says whether the line is in the score, resolution_state whether the event is over; model: the model of the answer line, and for a line the book holds with no model (a late line read from a saved page) the model of the seats table (council-models.json) only if the seat has one model version in the book; model_source (the last column): answer = the model is the line's own / seat_table = taken from the seats table / seat_history = the seat's previous known model (the seat has several versions); empty model = none could be told; reference_price_at (the last column, from 2026-10-21): the minute of the bar of the reference price = the first 1m bar at or after reference_at (reference_at rounded up to the minute; derived from the rule, not read from the feed); a late line with its own reference has it on every horizon (1d, 1w, 1m, 6m), same_event false on all of them",
  "arena-trades.csv": "session, account, side, instrument, units, price_usd, amount_usd, cost_usd, system, decision_run, model, sealed_at, why, risk, revise_if",
  "arena-accounts.csv": "session, account, value_usd, cash_share, fees_usd, rules, weights_json, vs_sp500 (pp: the account's return since its start minus the S&P 500 account's over the same dates, from the close before its first day; empty for the f12 shadow accounts, 0 for the S&P 500 account)",
  "arena-prices.json": "each session: the execution and close prices, the T-bill, the AIs' values; dividends and splits (corp)",
  "arena-decisions.csv": "id, run_session, trades_at, counted, league, account, source, run_id, model, mode, sealed_at, booked_at, decision, ok, reasons, late, replaces, weights_json, cash, given_json, rules, book_n, book_seal, ask_sha256, own_sha256, answered_at, ask_note, trigger — trigger: why the decision was made (scheduled:am / eve / btc / radar — the issue's own answer; weekly_review — the bench; retry — the repeat ask; guardian — the league guardian's hourly ask; event:<what>@<day>T<HH:MM> ET — a round asked inside the day after an event, trading at the next open); sealed_at: the minute the line was sealed in the book (the trades' sealed_at too), answered_at: the answer's own minute; ask_note: for a run before 2026-10-19 ask_sha256 is the hash recorded when the question went out; weights_json and cash: shares 0–1; given_json: the model's own percents; counted: yes / pending (its window not stepped yet) / superseded / rewritten / no; decision: trade / hold / refused / no_answer / template; source: answer / bench / retry / guardian (an hourly asked_again try that brought no decision - one row a try, ask_sha256 the run's question); reasons: the check's codes",
  "arena-overtakes.csv": "id, league, session, who, whom, value_usd, value_whom_usd",
  "arena-accounts-dictionary.json": "where the accounts of arena-accounts.csv come from: the distinct accounts by family (the AIs' own, their shadows, the yardsticks), with the total",
  "arena-protocol.json": "the protocol as each question went out: its version and history, the assets and funds, the formulas, the question's template and schema",
  "arena-code.json": "the league engine's own code as text, each file with its sha256, and the league's settings",
  "arena-pro-trades.csv": "session, account, side, instrument, units, price_usd, amount_usd, system, decision_run, model, sealed_at, why, risk, revise_if",
  "arena-cb-league.json": "the Closed Book league: each account's value, return, drawdown, return per risk, its last action and decision, and vs_open_pp — its return minus the same model's daily-league account over the same dates",
  "arena-cb-accounts.csv": "session, account, value_usd, cash_share, fees_usd, rules, weights_json (the Closed Book accounts)",
  "arena-cb-trades.csv": "session, account, side, instrument, units, price_usd, amount_usd, cost_usd, system, decision_run, model, sealed_at, why, risk, revise_if",
  "arena-cb-decisions.csv": "run_id, account, model, mode, model_seen, sealed_at, answered_at, trades_at, decision, ok, reasons, weights_json, cash, retry, search (its real state: off (verified) / off (switches set, not verified live) / off (toggle clicked, state read) / not guaranteed (…) / on (seen: …); before 2026-10-20 — the route only), via, horizon, asked_after_open, sources, outside_links, used, packet_sha256, ask_sha256, own_sha256, book_n, book_seal",
  "arena-cb-packets.json": "every sealed packet: the snapshot (prices, sha256), the macro context, 5 headlines (title, source, link, time, sha256), the packet's sha256 and its check",
  "arena-cb-experiment.json": "the same news → less dispute? heat, n_eff, ρ̄ and the portfolios' spread, Open against Closed, per run and on average; the paired Brier closed − open over the common cells (`brier_paired`), from 2026-10-22, the interval's unit is the session, only the seats asked BEFORE the open, on the final prices; the Closed Book is asked after the open issue's answers (not in parallel), before 09:30 ET, so its packet may be fresher by `lag_min` minutes",
  "arena-sp100-league.json": "the S&P 100 league: each account's value, return, cash share, positions, turnover, fees and its last decision",
  "arena-sp100-accounts.csv": "session, account, value_usd, cash_share, rules (the S&P 100 accounts)",
  "arena-sp100-trades.csv": "session, account, side, ticker, units, price_usd, amount_usd, cost_usd, system",
  "arena-sp100-decisions.csv": "session (the open it trades at), account, attempt, model, mode, sealed_at, decision (trade / hold / refused), ok, reasons (the check's codes), weights_json, cash, composition_asof, composition_sha256, ask_sha256, rules, book_n, book_seal",
  "council-talk.json": "the Council after the discussion and the court over the portfolios (talk-1): each week the chair (one model by rotation) read every sealed portfolio under letters and wrote the Council's portfolio and 2–3 critiques of the riskiest bets, each with a checkable consequence; the criticised models answered once; the checks against the prices and the shadow accounts (_council_talk, _talk_keep:, _talk_heed:, _talk_court:)",
  "council-talk-critiques.csv": "week_run, chair, chair_model, id, letter, seat, asset, held_pct, instead_pct, expect, bet, why_risky, consequence, from_session, to_session, sessions, move_pct, status, verdict, reply, heed_minus_keep_pp — one row per critique: held_pct and instead_pct in % of the account; expect: the direction of the fund's price over the check window; status: confirmed / not_confirmed / pending; verdict: the model's own answer (accept / partly / reject)",
  "council-talk-court.csv": "week_run, seat, letter, chair, model, mode, at, answered_at, ok, hold, weights_json, cash, why, replies_json — one row per answer to the court: what the model would hold after it (not a decision of its account); weights_json and cash: shares 0–1",
  "arena-modalities.json": "one model in two ways (mod-1): the same question of an issue asked again in the model's other way (website against command line, both at their maximum) — each pair's weights in both ways, their distance, and both shadow accounts (_mod2:<model>:web, _mod2:<model>:cli) in dollars",
  "arena-roles.json": "the league of characters and risk modes (roles-1): 8 role instructions added to the same question of an issue — each role answer's weights, cash and distance from the model's own decision, each role account in dollars, the role against the model's own account and against its Vanilla over the same sessions (p.p.)",
  "arena-schools.json": "one model in two schools of thinking (schools-1): the same question of an issue asked as an analyst of the American and of the Chinese school - each pair's weights, their distance, both accounts (_school:<model>:us, _school:<model>:cn) and us - cn in dollars and p.p.; the coverage of the Council",
  "arena-tri.json": "the optional three-way form (tri-1): up / draw / down summing to 100 per market for the next session, the Brier score on the triple beside the same seat's binary Brier on the same cells",
  "methodology-versions.json": "the register of the versions of the methodology (m1..m4): the date each starts from, what changed, the sha256 of the methodology text of the run line",
  "event-contract.schema.json": "the contract of an event (asset, horizon, reference_at, end_at, rule) and its event_id; from 21.10 also the full contract (contract_v2: resolver version, reference rule, price provider and symbol; event_id_v2) with examples; the schema every league can check its rows against",
  "council-analysis-kit.json": "the fixed analysis kit: what is counted for every session date, the versions, the events of each date and the sha256 of the set",
  "council-clim-window.json": "the sealed fixed climatology window 2016-2025 (its own sha256 inside)",
  "council_clim_window.json": "the same sealed window byte for byte under the file name of the registered seal (inner sha256 2810d11e...); python3 primary.py --clim-window council_clim_window.json checks the seal offline",
  "council-equal-resource.json": "the variants of the Council at equal resource (the same number of model calls): one model, k models, the whole Council",
  "council-book-offsets.json": "where each line of council-book.jsonl lies (offset, length, link, kind, run_id, at) and the size and sha256 of the book they hold for: take one run's lines with an HTTP Range request (the site answers 206)",
  "readers-schema.json": "the readers' experiment: the group rule, what is stored and for how long, the bot rule, the unit of analysis (the reader), each planned change marked planned until the votes worker runs it; the sha256 of the salt of the salted group printed before use",
  "primary-endpoint.json": "the registered primary test (tools/osf-rules-1/primary.py) run on the release at every build: status, window, events, sessions, climatology seal, check date; the running values are not published before the check date",
  "council-answer-lag.json": "the two times of every answer line: the raw answer sealed in asks.jsonl and the book line, the lag in seconds against the 5-minute ceiling; per run in a blind season",
  "league-passive.json": "the passive portfolios matched to the mandate of each league (main, pro, cb, f12, f12p, sp100): each passive account checked against the league's limits (within_mandate, breaks) with its return; a league without its own passives says why",
  "prediction-ledger.json": "the one public ledger of the registered predictions F1-F30: set, window, check date, the open files each measure reads, the counted runs inside the window so far, the data a row still lacks and its status (before_window / collecting / check_date_passed / resolved only with a published result); the registration record",
  "council-crowd-spread.json": "the gap between the crowd and the Council on the crowd's own question, per contract and day: crowd_gap_pp (Council minus crowd, points), same_side (both on one side of 50), the distances from 50 of the crowd and of the seats, their ratio, the volume; summary over the contracts with volume of at least $1,000; the CSV beside it; no seat is named",
  "releases/index.json": "the archived releases (№588): once a New York day, api/v1/releases/<day>/release.tar.gz holds the files of release-manifest.json but the book, council-book.part.jsonl beside it the bytes the book gained since the previous release (book_parts joined in order = the book), release.json their sha256; a day folder is never rewritten and each release.json is hashed into the next manifest; the Zenodo record 10.5281/zenodo.23552700 is a separate snapshot (archives)",
  "asks-used.json": "what `used` of an asks.jsonl answer line means (the order of arrival: the seat's first answer line of the step) set beside the status of its book line in council-forecasts.csv; the count is decided by the dated rule counted_first_line, quoted inside (№647)",
  "council-partitions.json": "the partitions of the seats declared in advance for the block test (laboratory, open weights), dated; their sha256 is in council-block-test.json (№518)",
  "tools/check-forecasts.html": "open it in a browser: checks a forecasts CSV against event-contract.schema.json on your computer (nothing is uploaded); the same verdicts as tools/conformance.py",
  "offline-check.json": "the daily offline check (a New York day, after the release manifest): verify_all.py on the release as built, and on the archived release at Zenodo 10.5281/zenodo.23552700 (md5 of the record, sha256 of its manifest, the hash chains, the conformance of its forecasts, the Brier recount, the archived book as a prefix of the current one); the text of the badge is `badge`",
  "tools/conformance.py": "python3 conformance.py their.csv - checks every row of a league CSV against event-contract.schema.json",
  "tools/replay_brier.py": "python3 replay_brier.py https://trends.polyhelper.ai/api/v1/ - recounts the seats' Brier from council-forecasts.csv; the result of the last run is the line last_run.replay_brier of environment.json",
  "tools/verify_chain.py": "python3 -I verify_chain.py council-book.jsonl - recounts the hash of every line and the chain (link, prev, seal): \"N lines, chain OK\" or the first line that differs",
  "tools/seals.py": "the check code of the proof page, a byte-for-byte copy of the engine file with the modules it imports (tools/seals_asks.py, conductor*.py, forecasts.py, seals_*.py); how to run it: README.md",
  "README.md": "how to reproduce the checks: the tools, what each checks, Python >= 3.9, standard library only, python3 -I",
  "environment.json": "the same in a file: Python version, the tools with the sha256 of each, the command to run the seals tools, the last result of replay_brier.py"
 },
 "accounts": {
  "<model id>": "a model's own account",
  "_council": "the Council: the mean of the models' weights, each week",
  "_council_w": "the Council by past accuracy (and by how often a model trades with its own words)",
  "_cash": "cash only",
  "_equal": "every market alike, each week",
  "_random": "a random portfolio within the rules",
  "_passive": "60/40",
  "_spy": "the S&P 500 bought once and held",
  "_hold_all": "every traded market bought once and held",
  "_crowd3": "the markets it holds plus those 3+ models raised in one session, less those 3+ cut, alike (any day)",
  "_crowd_rest": "the same for the markets 1–2 models raised or cut (any day)",
  "_team_us": "the mean weights of the US models that have decided, each week",
  "_team_cn": "the mean weights of the Chinese models that have decided, each week",
  "_wo:<model id>": "the Council without that model — its worth to the Council",
  "_eqw:<model id>": "that model's own markets alike, at its own cash level, when it decides",
  "_dir:<model id>": "that model's own markets alike, all in (the directions without the sizes)",
  "_nc:<model id>": "that model's own weights without costs",
  "_readers": "the median of the readers' own portfolios sealed before the open (each reader's last one), under the rules: under 5% — cash, over 25% — 25%, a sum over 100% scaled to 100%; from 10 readers, at most 2 from one address a day; each week",
  "_full:<model id>": "that model's own weights scaled to 100% invested, no cash (the cap lifted: full-1)",
  "_wk:<model id>": "that model's decisions applied in the virtual league only on the week's first session",
  "_ver:<model id>:<n>": "the n-th version of that model, its own account from the day it took over, no positions inherited; from 2026-10-21 an earlier version still reachable is asked the same question of each issue (book kind portfolio_oldver) and its account trades its own answers; otherwise it holds",
  "_f12:<model id>": "that model's own weights as applied in the virtual league (opened with what it holds at the first open) held in the 12 funds (SPY, QQQ, DIA, SOXX, TLT, UUP, VIXY, GLD, USO, BNO, CPER, IBIT — SOXX, TLT, IBIT for SOXQ, IEF, BTC-USD) at those funds' own prices, dividends and splits; its own $100,000 from its first session on or after 2026-10-20, no past recounted (rules f12-1; its trades in arena-trades.csv name the fund; the funds' prices — arena-prices.json “f12”)",
  "_f12p:<model id>": "that model's own Pro-league weights (signed, VIX as VIXY) held in the same 12 funds at their own prices, dividends and splits, with the Pro league's loan, borrow and margin; its own $100,000 from its first session on or after 2026-10-20, no past recounted (rules f12p-1; its trades in arena-trades.csv name the fund)",
  "_council_maj": "the markets more than half the models hold, alike",
  "_council_conf": "the models' weights times their own confidence, averaged",
  "_council_dis": "the Council's mean weights cut by the models' disagreement on each market",
  "_council_talk": "the Council after the discussion: the weekly chair's portfolio after reading every sealed portfolio (talk-1), at the first open after it is sealed, fresh $100,000 on its first day",
  "_talk_keep:<model id>": "a model criticised by the weekly chair: its sealed weights as they were (the yardstick of the court)",
  "_talk_heed:<model id>": "the same weights with the chair's critiques put in — what it would have made had it listened",
  "_talk_court:<model id>": "what the model said it would hold after the court",
  "_mod2:<model id>:web": "that model asked by its website: the issues' decisions it gave there and its answers there to the same question asked again (mod-1), traded at the same open as its twin; fresh $100,000 on its first day",
  "_mod2:<model id>:cli": "the same model by its command line — its twin (api/v1/arena-modalities.json)",
  "_role:<model id>:<role>": "that model in a role (roles-1): Vanilla, Steady Eddie, YOLO, Contrarian, Crypto Chad, Tactical, Balanced or Conviction — the role's answers to the same question, each traded at the first open after it, held between; fresh $100,000 on its first day (api/v1/arena-roles.json)",
  "_school:<model id>:us": "that model asked as an analyst of the American school (schools-1, from 2026-10-26 with its switch): the same question of an issue, traded with its twin at the first open after the pair; fresh $100,000",
  "_school:<model id>:cn": "the same model as an analyst of the Chinese school — its twin (api/v1/arena-schools.json)",
  "_bear (Pro league)": "the S&P 500 short with the whole capital, held",
  "<model id> (Closed Book league, arena-cb-*)": "the model's own Closed Book account: search off, the sealed packet only (cb-1)",
  "_council (Closed Book league)": "the mean of the Closed Book models' weights under the same rules",
  "_spy (Pro league)": "the S&P 500 bought once with the whole capital and held, from 2026-10-20 (no past recounted)"
 },
 "notice": "These results are based on simulated or hypothetical performance results that have certain inherent limitations. Unlike the results shown in an actual performance record, these results do not represent actual trading. Also, because these trades have not actually been executed, these results may have under-or over-compensated for the impact, if any, of certain market factors, such as lack of liquidity. Simulated or hypothetical trading programs in general are also subject to the fact that they are designed with the benefit of hindsight. No representation is being made that any account will or is likely to achieve profits or losses similar to these being shown.",
 "notice_csv": "the same notice for every league CSV (council-follow.csv, arena-*.csv): a CSV has no room for it without breaking readers, so it goes out as the HTTP response header `X-Notice` of each file, and here",
 "forecast_columns": {
  "disclosed_at": {
   "type": "DateTime",
   "description": "when the answer line first appeared publicly (UTC)"
  },
  "entry_source": {
   "type": "Text",
   "description": "own (entry below the reference) | not_below_ref | no_ref | default (no entry given) | none (the field exists and the cell is not a buy_dips 1d cell); EMPTY (no value at all) = the row was written before the field existed (before 2026-10-21) — empty is not none"
  },
  "aggregation_version": {
   "type": "Text",
   "description": "the version of the consensus aggregation (a1, ...) written into the book line; empty before it was recorded"
  },
  "methodology_version": {
   "type": "Text",
   "description": "the methodology version of the run (m1, m2, m3, m4; the register is methodology-versions.json)"
  },
  "model_source": {
   "type": "Text",
   "description": "where the `model` of the row comes from: answer (named in the answer line) | seat_table (the seat's model at the time) | seat_history (the seat's earlier model)"
  },
  "resolution_state": {
   "type": "Text",
   "description": "resolved | unresolved: whether the row's own event already has its outcome (apart from `status`)"
  },
  "reference_price_at": {
   "type": "DateTime",
   "description": "the minute of the bar of the reference price (UTC): the first 1m bar at or after `reference_at`, i.e. reference_at rounded up to the minute (derived from the rule, not read from the price feed; if the feed has no bar at that minute, the real bar is the first one after it); empty when the row has no reference"
  },
  "methodology_sha256": {
   "type": "Text",
   "description": "the sha256 of the methodology text (canonical JSON with its dated rules) as the run line of the ten sealed it in asks.jsonl before the first send; the same value for every row of a run; empty where the run has no such line (before 2026-10-21); the versions m1..m4 with their sha256 are in methodology-versions.json"
  },
  "climatology_delta": {
   "type": "Float",
   "description": "prob_up minus the share of starts that ended up in the fixed climatology window (council-clim-window.json, p_up_ex_draw x 100, same market and horizon), in points; empty where the cell holds no probability or the window has no number; descriptive, changes no score (the same values as council-clim-delta.csv)"
  },
  "asked_at": {
   "type": "DateTime",
   "description": "when the seat was first asked in the run (UTC, from the sealed asks book); empty before 2026-10-21 and in a blind or unsure season"
  },
  "ask_step": {
   "type": "Integer",
   "description": "the wave of questions of that first ask in the run (asks less than 600 s apart are one step; 1 = the first); empty as asked_at"
  },
  "ask_attempts": {
   "type": "Integer",
   "description": "the number of questions sent to the seat in the run; empty as asked_at"
  },
  "ask_channel": {
   "type": "Text",
   "description": "the channel of the seat's first answer in the run: cli | web; empty as asked_at"
  },
  "run_role_declared": {
   "type": "Text",
   "description": "the role of the run by the declaration of 21.10.2026 (asks.jsonl, declaration 1): scheduled_run (the morning run on schedule, counted) | reference_only (any other run) | not_applicable_before_2026-10-21; `run_role` keeps its published value"
  }
 },
 "event_contract": {
  "schema": "https://trends.polyhelper.ai/api/v1/event-contract.schema.json",
  "conformance": "https://trends.polyhelper.ai/api/v1/tools/conformance.py",
  "replay_brier": "https://trends.polyhelper.ai/api/v1/tools/replay_brier.py"
 }
}