{
 "license": "CC BY 4.0",
 "kind": "methodology-versions",
 "what": "The versions of the rules in force by the date of the run (one scale m1..m4, council_event.METHODS). sha256 = methodology_sha256 of the run line the ten seals in asks.jsonl before its first send (sha256 of the canonical JSON of the methodology and its dated rules); a version with no sealed run line has none. The column methodology_sha256 of council-forecasts.csv carries it per row. dated_rules: every dated rule, one line each, with the date of the first run it is sealed in (for example corrections_line, from 2026-10-26).",
 "versions": [
  {
   "version": "m1",
   "from_session": null,
   "changed": "first rules: Brier on the cells with a move (draws left out), a cell without a forecast is no score",
   "sha256": null,
   "sha256_run": null,
   "sha256_all": [],
   "run_lines": 0,
   "note": "no run line of the ten is sealed under this version (asks.jsonl starts on 2026-10-21)"
  },
  {
   "version": "m2",
   "from_session": "2026-10-20",
   "changed": "a cell left unanswered counts as 50% (missing50, №112)",
   "sha256": null,
   "sha256_run": null,
   "sha256_all": [],
   "run_lines": 0,
   "note": "no run line of the ten is sealed under this version (asks.jsonl starts on 2026-10-21)"
  },
  {
   "version": "m3",
   "from_session": "2026-10-21",
   "changed": "dated rules: the Brier on every row with the draw band, one reference price per shared score (same event), Kalshi strikes, buy_dips, US10Y/VIX direction",
   "sha256": "01aa8d83b0eba2c993d0c7c363401e345cc512022d7dcb127cc930416ba19d30",
   "sha256_run": "2026-10-21-am",
   "sha256_all": [
    {
     "sha256": "01aa8d83b0eba2c993d0c7c363401e345cc512022d7dcb127cc930416ba19d30",
     "first_run": "2026-10-21-am",
     "sealed_at": "2026-10-21T12:30:09.402Z"
    }
   ],
   "run_lines": 2,
   "note": null
  },
  {
   "version": "m4",
   "from_session": "2026-10-22",
   "changed": "the dated rules of 2026-10-22: the \"am\" question before the open (early ask), the confirmed-bar close wording (close_bar_v2), thin crowd markets flagged, the number and sides of the AIs from the roster, rating B by sessions, score versions on every line, the dated rules crowd_line and crowd_comparison",
   "sha256": "0a8c8bacef1e504382c1388c7c4367b2e1d3b400ad3afebc25ed944e0adab06f",
   "sha256_run": "2026-10-22-am",
   "sha256_all": [
    {
     "sha256": "0a8c8bacef1e504382c1388c7c4367b2e1d3b400ad3afebc25ed944e0adab06f",
     "first_run": "2026-10-22-am",
     "sealed_at": "2026-10-22T12:30:35.518Z"
    }
   ],
   "run_lines": 2,
   "note": null
  }
 ],
 "dated_rules": [
  {
   "name": "bitcoin_day",
   "from": "2026-10-21",
   "rule": "The Bitcoin «day» is a window, not a calendar date: it runs from the minute the answer is sealed (the reference price, BTC has no open) to 24 hours later, but at most to the scheduled close of the session (normally 16:00 ET, 13:00 ET on an early-close day) that scores the run - about 7 hours for a morning run. A run sealed on a weekend or a holiday is scored by the next session: its window is the full 24 hours when that session closes later than that (BTC trades every day), else it too ends at that close (a Sunday 20:00 ET run - 20 hours); 1w, 1m and 6m are exactly 7, 30 and 182 days after the seal. The minute of the seal and the end of the window are in the row."
  },
  {
   "name": "buy_dips_entry",
   "from": "2026-10-21",
   "rule": "buy_dips with no entry level (entry null) is a valid action, not a refused answer: its prob_up, exp_pct and levels are scored as given. An entry is kept only when it is a number below the reference price; entry null then means «no own level, the default applies»: the account buys at the reference minus half the day's average move, and only if the price touches it in the session (no touch = no buy). An entry belongs to the 1d action only: on 1w, 1m and 6m the word is a view, never a trade, and its entry is not used."
  },
  {
   "name": "close_bar_refresh",
   "from": "2026-10-21",
   "rule": "From 2026-10-21 the score row records the minute of the end bar it used (1d.close_at). A market scored in an earlier pass keeps its prices, its outcome, its noise threshold and the late answers' own reference prices and outcomes in every later pass, except one: when its end bar was more than 60 seconds before the end of the event and may not be the last bar of the asset's session, the issue stays in the score queue (close_pending). The FULL end bar is the last bar of the session: a bar at most 60 seconds before the end; or, when the series already has a bar after the end (a thin series with no bar in the last minute), the last bar up to the end; or, 3 hours after the end with no newer bar up to it, the bar there is. Once a full bar later than the scored one has come, the close is scored again from it; the reference price stays the accepted one, and a later bar that is still not full changes nothing. This is never silent: the book gets a correction line (kind correction, close_refresh: the earlier close, its minute, the new close, its minute) and the row carries close_refresh. End bars more than 60 seconds before the end that stand as the session's last are named in close_early. Only an explicit price_fix line replaces prices otherwise."
  },
  {
   "name": "crowd_questions",
   "from": "2026-10-21",
   "rule": "The crowd questions of a day are not a fixed list: Polymarket's daily «Up or Down» lines (SPX, DJI, GOLD, WTI, DXY, BTC — only those with a trade that day) and Kalshi's «above K» lines. Kalshi's index lines (SPX = KXINXU, NDX = KXNASDAQ100U, 4 pm ET against the last close) and extras (GOLD = KXGOLDD 5 pm spot, WTI = KXWTI 2:30 pm, US10Y = KXUST10AD 3:30 pm par yield, each against Kalshi's own last settlement) are read each run and sealed in the run line (crowd.kalshi). A Kalshi line is ASKED of the AIs only for an asset Polymarket has no question for that day (the same question is never asked twice), so the asked list is shorter than the sealed one: the asked list is in the run's ask, the sealed one in crowd.kalshi. A line with no trade at its two strikes, no quote, or a reference outside the listed strikes is absent."
  },
  {
   "name": "kalshi_strikes",
   "from": "2026-10-21",
   "rule": "Kalshi lists «above K» markets at many strikes, not «above the last close». Each strike's price is the midpoint of its Yes bid and ask (a spread over 10 cents or no quote: no price, the strike is left out). Among the strikes with a price, the two around the reference r are taken: K0 = the highest strike <= r and K1 = the lowest strike > r. p_up = p0 + (p1 - p0) * (r - K0) / (K1 - K0), a straight line between the two midpoints, rounded to 0.1%. No extrapolation: with no strike on one side of r, or no trade (volume) at the two strikes, there is no line. The settlement is Kalshi's own where it decides (r above the upper strike = Yes at both, below the lower = No); between the strikes the official close decides; a tie with r follows the sealed strike_type: «greater» (strict) is No, «greater_or_equal» is Yes. The interpolated number is an approximation of the crowd, not a Kalshi price: both strikes are sealed (lo, hi, ref)."
  },
  {
   "name": "pre_reference_information",
   "from": "2026-10-21",
   "rule": "Everything the AIs see before the reference price of the session is allowed: the snapshot of the ask (prices, the futures ES, NQ, YM and the Russell 2000 change before the open, news, the crowd's questions without their prices), and whatever the AI finds by its own search until it answers. The reference price is the 09:30 ET open (or the model's own price when it answers after it); an answer sealed after the open is counted apart, with its own reference time. The snapshot is sealed by its hash (snapshot_sha256 of the run line)."
  },
  {
   "name": "rank_rule",
   "from": "2026-10-21",
   "rule": "The 30/10 rule is counted BY HORIZON: a model is ranked on a horizon after 30 resolved forecasts of that horizon on at least 10 trading days (runs for 1w, 1m, 6m). The first rank is the 1d one: a model has no 1w, 1m or 6m place before its 1d place. Equal Brier shares a place (1, 1, 3). A place is published with its interval (95%, re-ranking all models over resampled sessions, or over blocks of the horizon's sessions for 1w, 1m, 6m) and a tie group: models in rank order join the current leader's group when their interval's best place (rank_lo) is no greater than the leader's worst (rank_hi), else start a new group; a group of one has no tie group. With a single model qualified there is no interval (rank_lo, rank_hi null) (council-stats.json, ranks)."
  },
  {
   "name": "same_event_scores",
   "from": "2026-10-21",
   "rule": "The shared scores of a day (the number of answers, the consensus, the closest model, the right minority, the league) take only forecasts about one event: the move from the issue's one reference price (the 09:30 ET open; BTC: the minute of the seal). An answer sealed after it has its own reference price, a different event: it is scored apart from its own price (own_event and own_seats in the score line; in council-forecasts.csv reference_at is the time of the row's reference price and same_event is false) and does not enter the shared scores. What was published before this date is not recounted."
  },
  {
   "name": "us10y_vix_direction",
   "from": "2026-10-21",
   "rule": "One reading for US10Y and VIX everywhere: the 1d call (buy_strong, buy_dips, hold, trim, sell) is a bet on the INDICATOR itself - buy = the yield (the VIX) rises, trim/sell = it falls. The Council account holds that bet as the inverse of IEF (yield up) or IEF (yield down), VIXY (VIX up) or SVXY (VIX down). The portfolio leagues ask another question: the model picks FUNDS. US10Y there is IEF, held long only, and IEF rises when the yield FALLS, so a long US10Y weight is the opposite of «buy = the yield rises»; the ordinary league cannot hold VIX, the Pro league trades it as VIXY (up with the VIX). A league weight is never read as the 1d call on the yield, and the 1d call is never scored as a weight."
  },
  {
   "name": "accuracy_stages",
   "from": "2026-10-22",
   "rule": "The first line of the accuracy block (council-stats.json, goal.headline) is chosen by fixed stages, in force from 2026-10-22. Sealed in the run line from 2026-10-22; the first line of 21.10 was shown by this same rule before the seal. The window is always from the first scored session. A comparable question is a crowd question of the contract's own outcome where the Council and the crowd both back a side (a probability other than exactly 50); a side is right when it is the contract's outcome. Stage count - under 5 scored sessions: the count in pieces, the Council against the crowd (right of comparable), the number of sessions and the date of the 5th session by the trading calendar, when the interval appears. Stage bss - from 5 scored sessions and the interval: the Council's BSS to the crowd with its interval by sessions. Stage percent - from 20 comparable questions on top of that: the percents of right sides of the Council and of the crowd, with the BSS and its interval. No number comes from an AI; the stages are not changed after the fact."
  },
  {
   "name": "ask_roster",
   "from": "2026-10-22",
   "rule": "The question to the AIs names the number and the sides of the seats asked in this run: the MAIN seats, the first five of each side of the issue's roster (for example «You are one of 10 AIs (5 from the USA, 5 from China)»). The spare seats of the roster (the ones after the fifth of a side) are not counted: they are asked only when a main seat falls, with the same sentence, and are not named in it; a spare starts at once beside the fallen seat's own web version, and if both answer, the first five answers of a side count and the sixth is kept apart (extra-answers.json), not scored. Who is main and who is a spare is sealed before the first send in the run's roster line (asks.jsonl, kind roster: ask = main, spares = spare). Before this date the question said 10 / 5 / 5 whatever the seats asked were; those asks, their ask.md and sha256 stay as they were sealed. Runs before and after this date therefore were asked a slightly different sentence (the number of AIs a model thinks it is compared with); the tasks, the prices and the scoring are the same, so the comparison is kept, with this line as its caveat. From this date the run line sealed before the first send carries the dated rules in its methodology, so its methodology_sha256 differs from earlier runs."
  },
  {
   "name": "claim_origin",
   "from": "2026-10-22",
   "rule": "From 2026-10-22 api/v1/council-claim-origin.json classifies every link of the answers of the runs that have a source check by where its claim comes from: given_in_packet, source_article (first sight of a confirmed page text), reprint (the same sha256 as a page first seen under another URL), new_claim (page opened, the claim is not in it), new_no_source (an answered cell with no link), unknown (not opened / not received / section; only an aggregate breakdown). The unit is the link, not the sentence. One denominator everywhere: links plus answered cells with no link. The file changes no weight and no score."
  },
  {
   "name": "close_bar_refresh_v2",
   "from": "2026-10-22",
   "rule": "From 2026-10-21 the score row records the minute of the end bar it used (1d.close_at). A market scored in an earlier pass keeps its prices, its outcome, its noise threshold and the late answers' own reference prices and outcomes in every later pass, except one: a CONFIRMED end bar. An end bar is confirmed when it is at most 60 seconds before the end of the event, or when the series already has a bar after the end (a thin series with no bar in the last minute: its last bar up to the end). While the scored end bar is earlier and not confirmed, the issue stays in the score queue (close_pending). Once a confirmed end bar later than the scored one has come, the close is scored again from it, once; the reference price stays the accepted one. This is never silent: the book gets a correction line (kind correction, close_refresh: the earlier close, its minute, the new close, its minute) and the row carries close_refresh. 3 hours after the end with no confirmed bar the wait is over: the scored early bar stands and is named in close_early, the issue leaves the queue, and a later bar that is still early changes nothing; only a confirmed bar, if the score is run again, corrects it (once, as above). Only an explicit price_fix line replaces prices otherwise."
  },
  {
   "name": "crowd_comparison",
   "from": "2026-10-22",
   "rule": "The comparison with the crowd is made on a CLOSE question, not on the same one as the league's: the league's 1d call is a call on the day's move from the 09:30 ET reference price, while the crowd's question is its own yes/no line (its own window, rule and end). Where the line is the same market with the same event and time, the pair is scored as one; otherwise it is shown «for orientation». The number of markets with a daily crowd question («N of 12 markets») is counted from the day's sealed crowd questions (crowd.odds and crowd.kalshi), never written as a fixed number."
  },
  {
   "name": "crowd_line",
   "from": "2026-10-22",
   "rule": "From this session a run's «crowd» book line is written once every crowd market of the run is settled by its own source (Polymarket's resolution, Kalshi's settlement) or has waited more than 6 hours after its own end unsettled; the line names the unsettled ones in `waiting`, and once they settle a fuller line of the same run follows (the book only grows, nothing written is changed). Every reader takes the run's last «crowd» line. A line of a session that had none in time is a new line marked written_late with the date it was written (written_on); its settled numbers are never recomputed. Each row carries `by`: for each model, its own answer to the crowd's question (crowd_up of its 1d answer) and the crowd's price at the minute of that answer, read from the market's public price history (Polymarket's prices-history, Kalshi's candlesticks of the two strikes)."
  },
  {
   "name": "crowd_liquidity",
   "from": "2026-10-22",
   "rule": "A crowd market with a turnover under $1 000 is THIN (Polymarket: its volume in dollars; Kalshi: the contracts traded at the two strikes times each strike's Yes midpoint, vol_usd, sealed beside the contracts in the run line): it is shown with the label «thin market» and is not counted in the AI-against-crowd results (the league of the AIs against the crowd, the share d of different sides, the pairs of the calibration). The rule applies to the runs of the sessions from this date; earlier runs are counted as they were (on 20.10 the Dow, the dollar and Bitcoin had $20, $4 and $38). A market with no sealed volume is not judged thin."
  },
  {
   "name": "crowd_refs",
   "from": "2026-10-22",
   "rule": "From the session of 2026-10-22 every crowd comparison row carries `refs`: TWO references of the crowd's price in time - `at_question` (the mean of the crowd's price at the answers' own minutes, the minute the AI asked; everything public before that minute was available to the AIs, the snapshot of the ask included) and `at_print` (the crowd's price at the count time of the run, the minute the answers are sealed by, with the information of the whole window between the two) - plus the quote (bid, ask in points, `quote_at` the minute it was read, `quote_age_s` = seconds from that read to the count time, negative with `quote_after_cut` true when it was read after it, spread) and the volume (`vol_unit`: usd for Polymarket, usd = contracts x the Yes midpoint of each strike for Kalshi; `min_volume_usd` the liquidity tolerance, `liquid` true / false). A field the source does not give is null and a `*_why` field says why; it is never guessed. The earlier sessions are not recounted. The first run line that carries this rule is the run 2026-10-22-am; the eve run of 21.10 belongs to the session of 22.10 and has no rule line (its outcomes are untouched)."
  },
  {
   "name": "crowd_tail",
   "from": "2026-10-22",
   "rule": "From the session of 2026-10-22 the `refs` of every crowd comparison row carries `tail`: a flag that the crowd's price sits in its tail, under 10% or over 90% (the quoted spread is wider on improbable outcomes, so a price there is read with less trust). `tail.flag` is true / false on the price at the minute the AIs asked (`at_question`), or on the price at the count time (`at_print`) when no model answered that very question (`tail.price_from` names which); null with `tail.why_null` when the feed gave neither. A label only: no row is dropped, no score changes. The earlier sessions are not recounted."
  },
  {
   "name": "estimators_sealed",
   "from": "2026-10-22",
   "rule": "The estimators of the Council counted from the session of 2026-10-22 are fixed here before that session: the list, the weights rule of each, and the map seat -> family (lab). Block: {\"estimators\": {\"china\": \"equal, China-side seats\", \"consensus\": \"equal weights\", \"family\": \"one equal share per family (lab), equal inside it; from 2026-10-22\", \"trimmed\": \"from 5 forecasts in a cell the highest and the lowest are dropped (one from each end), the rest averaged equally; under 5 - the plain mean\", \"usa\": \"equal, US-side seats\", \"weighted\": \"weight = the seat's hit rate on the earlier sessions (1d calls with a side, from 5 resolved calls; otherwise 0.5; at least 0.01), learned only after the session\"}, \"families\": {\"chatgpt\": \"openai\", \"claude\": \"anthropic\", \"deepseek\": \"deepseek\", \"ernie\": \"baidu\", \"gemini\": \"google\", \"glm\": \"zhipu\", \"gpt\": \"openai\", \"grok\": \"xai\", \"kimi\": \"moonshot\", \"llama\": \"meta\", \"meta\": \"meta\", \"mimo\": \"xiaomi\", \"mistral\": \"mistral\", \"qwen\": \"alibaba\", \"stepfun\": \"stepfun\", \"wenxin\": \"baidu\", \"zai\": \"zhipu\"}, \"from\": \"2026-10-22\"} | sha256 of the block (json.dumps(block, sort_keys=True, ensure_ascii=False), UTF-8): 99ed7b076e25daf61602468f87dcf379136a1f3eabb0d6ccc386c4cb77919c65. A change of the list, a rule or the map is a new dated rule before the session it applies to; the sessions before are not recounted."
  },
  {
   "name": "frozen_ensemble",
   "from": "2026-10-22",
   "rule": "The frozen ensemble of the Council is fixed here before the session of 2026-10-22: its weights rule and the map seat -> family are this block and never change after. frozen = the family estimator as it stands on the day of the freeze; from then on frozen never changes, family may (a new lab, a new prefix), and then the two differ. The first run line that carries this rule is the run 2026-10-22-am; the eve run of 21.10 belongs to the session of 2026-10-22 and has no rule line (its outcomes are untouched). Block: {\"families\": [[\"chatgpt\", \"openai\"], [\"gpt\", \"openai\"], [\"claude\", \"anthropic\"], [\"gemini\", \"google\"], [\"grok\", \"xai\"], [\"meta\", \"meta\"], [\"llama\", \"meta\"], [\"deepseek\", \"deepseek\"], [\"kimi\", \"moonshot\"], [\"mimo\", \"xiaomi\"], [\"stepfun\", \"stepfun\"], [\"wenxin\", \"baidu\"], [\"ernie\", \"baidu\"], [\"zai\", \"zhipu\"], [\"glm\", \"zhipu\"], [\"qwen\", \"alibaba\"], [\"mistral\", \"mistral\"]], \"family_match\": \"the first prefix that the seat id starts with wins (the order of the list)\", \"from\": \"2026-10-22\", \"name\": \"frozen_family\", \"scored\": \"prospectively: sessions from the freeze date only; the sessions before it are never scored by it\", \"weights\": \"dependence-aware: every family (lab) in the cell has one equal share, split equally inside the family; no learning, no refit, no parameter of the data - the weights are a function of the seat list and the map only\"} | sha256 of the block (json.dumps(block, sort_keys=True, ensure_ascii=False), UTF-8): 62fc0d2820a3af409994f2cf4a26e1516e4f0185d32ca59215eaea52445db4dd. It is scored only on the sessions from 2026-10-22 (prospectively, never fitted on past outcomes) and published beside the consensus on the same events. A change is a NEW ensemble under a new dated rule and a new name, scored from its own date; this one stays as it is."
  },
  {
   "name": "league_run",
   "from": "2026-10-22",
   "rule": "One run per session counts in the league, the calibration and the trading days (methodology.league of the run line, sealed: «the run sealed last before the session's open (session_run)»). The league takes the run sealed last before the open - the scheduled morning run (id ending -am) when it is the last, as the declaration of 2026-10-21 (asks.jsonl, kind declaration: the scheduled morning run counts, the others are for reference) says; the other runs aimed at the same session are reference only (council-forecasts.csv run_role earlier_run). The league's code is not changed by this line; the text sealed before this date is not changed; this line is its dated reading."
  },
  {
   "name": "regime_descriptors",
   "from": "2026-10-22",
   "rule": "From 2026-10-22 every run has regime descriptors of each asset, computed only from the closes of the run's price snapshot (data up to snapshot.at, which is before asked_at) and published in api/v1/council-regime.json: vol_daily_pct = sample standard deviation of the last 20 daily returns in percent (fewer if the snapshot holds fewer, at least 5); vol_ann_pct = vol_daily_pct * sqrt(252); vol_ratio_5_20 = std of the last 5 returns / std of the last 20 and vol_state = rising when above 1.25, falling when below 0.8, else steady; trend_20d_pct = the change of the close over the last 20 returns; trend_t = trend_20d_pct / (vol_daily_pct * sqrt(n_returns)) and trend_state = up when trend_t >= 1, down when <= -1, else range; gap_pct = price / prev_close - 1 in percent at the snapshot minute, gap_vs_vol = gap_pct / vol_daily_pct and gap_state = gap when |gap_vs_vol| >= 2, else none; range_pos_52w = (price - lo52) / (hi52 - lo52); drawdown_hi52_pct = price / hi52 - 1 in percent. A descriptor that cannot be computed is null with the reason in `missing`. The descriptors describe the regime; they change no forecast, no weight and no score."
  },
  {
   "name": "score_versions",
   "from": "2026-10-22",
   "rule": "From 2026-10-22 every new score line of the book (score, score_view, score_h, score_h_view) and the corrections the score (close_refresh) and a price_fix write carry `versions`; the corrections of an answer's cells or model carry none. The versions: resolver (the rules from prices to outcome and Brier) and aggregation (the consensus), each a version name with the sha256 of its code and pinned (true when that code is the one pinned to the version name); contract (the event contract the event_id is hashed under, ev1 + the first 16 hex of the schema's sha256); methodology (the dated rules' version m1, m2, m3 ...); models (seat: model · mode of the answer scored). A score line also names the answer line it scored per seat (answer_refs: answer_n = its line number in the book, answer_sha256 = the seal of that line, items_sha256). An answer line's first appearance on the public site is recorded once (disclosed.jsonl, disclosed_at), apart from the time it was sealed; a season code and the author named later are two separate disclosures. Lines written before this date are not rewritten and have none of these fields."
  },
  {
   "name": "modes_mean_counted",
   "from": "2026-10-23",
   "rule": "A model's mean_distance in arena-modalities.json is the mean over its COUNTED pairs only (the same model on both routes); a pair of different models stays in mean_distance_all. A pair of an issue before this day keeps counting in the mean (as published)."
  },
  {
   "name": "rating_b_entry",
   "from": "2026-10-23",
   "rule": "Rating B (the accuracy table for Top) shows every model from 10 counted calls with a side, as before; a row carries `ranked`: true only after the protocol's own minimum - 30 counted calls with a side over at least 10 sessions of its own (thresholds rank_after and rank_days), as the main rating; below it `ranked`: false, `status`: preliminary and `need` (an early standing, never a ranking). Records of earlier sessions stay as published (no such fields)."
  },
  {
   "name": "rating_b_ranks",
   "from": "2026-10-23",
   "rule": "№299 (Статья №9 п.14): from this session a RANKED row of rating B (`ranked`: true) carries its place's interval and tie group, as the main ranks (rank_rule): rank_lo - rank_hi (95%) from resampling the sessions (2000 draws) and re-ranking every row of the table by its share of right calls with a side each time (equal shares share a place); in rank order a ranked row joins the current leader's tie_group when its rank_lo is no greater than the leader's rank_hi, else starts a new group; a group of one has no tie group (null). Under two sessions there is no interval (null). A preliminary row (`ranked`: false) has none of the three - it is an early standing, not a place. The value, the share's interval and the place itself (`rank`, given by the share when the record is written: 1, 1, 3) stay as they are."
  },
  {
   "name": "closed_book_arms",
   "from": "2026-10-26",
   "rule": "Dated 22.10.2026, rules cbx-1, from the run of 2026-10-26 with the switch on (engine/council-cb-arms.json); “am” runs only. The Closed Book question goes IN PARALLEL with the open question (the same start, the same deadline: 09:00 ET, never past 09:28) on the command lines; the web seats right after the seal, before 09:28. Two factors varied independently: the shared dated packet (0/1) and the right to search (0/1); prices, versions, task and deadline the same. Cells: closed_book (packet, no search), prices_only (the price snapshot and the question only), packet_search (packet and own search), open (the issue's question). The order of the arms a day is sha256(seed|day|arm), sealed before the first day in the cb_design line. No arm trades, none enters the daily ranking. Score: heat, n_eff and the paired Brier arm − open on the intersection of seats and sessions. Switch at the run: off (engine/council-cb-arms.json); `off` = the rule is written, nothing is asked."
  },
  {
   "name": "corrections_line",
   "from": "2026-10-26",
   "rule": "one rule: a cell given by a line of kind `correction` (council-forecasts.csv: line_kind, sealed_at = the seal time of that line) is NOT in the published days (their score and every number here stand as published); a horizon closed after its sealed_at counts it, apart (nr); every other cell counts by its status (counted, counted_50)"
  },
  {
   "name": "forecast_retry",
   "from": "2026-10-26",
   "rule": "From the run of 2026-10-26: a seat whose forecast has cells the check did not take (an action word outside the list: «buy» alone is not an action) is asked once more, right after the seal, only those cells, with the check's own words — one try per seat per run, as the portfolio's second try. Its answer is sealed as a line of kind correction (of: the answer line, forecast_retry: true): a cell that was missing and comes back with a word of the list and a probability is restored by the rule of corrections (corrections_line); a cell whose probability was already scored keeps it, the new word is kept apart (retry_actions), shown and not scored. A cell is restored only when the second answer is sealed before the reference of its forecast (the 09:30 ET open; BTC: the issue's seal), else it is kept apart (after_reference), shown and not scored: an answer given with the market's minutes after the reference never enters a count. The second try has its own ceiling, a third of the extra pass's time left and at most 240 seconds. Nothing is changed by hand."
  },
  {
   "name": "kalshi_ranges",
   "from": "2026-10-26",
   "rule": "A Kalshi question in ranges (buckets floor <= value < cap, each with a Yes midpoint) is turned into “above the last close r” by: p_up = (the midpoints of the buckets entirely above r + the share of the bucket that holds r above r, p * (cap - r) / (cap - floor)) / (the sum of all midpoints), so the buckets are first scaled to 100%. A bucket's price is the midpoint of its Yes bid and ask when the spread is at most 10 cents (a bid of 0 and an ask of 2 cents: 1%). A real ladder of 30 buckets sums to 111-128% (Kalshi's candles of 20-22.10: every bucket carries half its spread and the far ones trade at 0 / 1-4 cents), so the sum must be 90-140%; the scaling takes the excess off every bucket in proportion. A bucket with no price (no quote, or a spread over 10 cents) counts 0 only in a tail: the nearest priced bucket on each side of it (or the end of the ladder) is priced at most 2.5% - its own weight is then about that small; a bucket with no price next to a bucket priced over 2.5%, no price at the bucket holding r or at either bucket next to it, an open-ended bucket at r, no trade in the buckets, or a sum outside 90-140%: no line. Kalshi writes an edge as 7399.9999 or 28099.99: the edge is 7400 / 28100. Where it is used: the S&P 500 and the Nasdaq-100 at 4 pm ET are read first from Kalshi's “above K” question (KXINXU, KXNASDAQ100U); when that gives no line, from the range question of the same close (KXINX, KXNASDAQ100), sealed in the run line with every bucket (kind ranges, buckets). Its outcome is Kalshi's own settled value of the close against r (a tie with r is not above); its price at a minute is the same rule over every bucket's last quote at that minute (Kalshi's 1-minute candles, read once per bucket, paused between reads and read again after a rate limit). When Polymarket and Kalshi both ask one asset, they are TWO market-sessions: each is compared with the AIs and scored on its own (a Kalshi line is the key A@kalshi) and never merged into one score; only the crowd's price shown for the asset is the mean of the two (crowd-contracts.json, pairs)."
  },
  {
   "name": "market_prior_arm",
   "from": "2026-10-26",
   "rule": "Dated 22.10.2026, rules mp-1, from the run of 2026-10-26 with the switch on (engine/council-market-prior.json). A separate arm: the run's shared question byte for byte + the crowd's price per still-open question as sealed in the run line before the blind answers (crowd.odds, crowd.kalshi: price, quote time, end), asked only while at least 30 min remain before the question ends (an answer after the end is not kept), the answer key \"market_prior\"; its own sealed book daily/council/market-prior.jsonl. Never mixed with the blind crowd_up: the blind number is not read when asking, and in the score it stands beside, never averaged. Score: Brier of p_prior/100 against the outcome; beside it the same seat's blind Brier and the crowd's on the same question; prior_minus_blind = the difference of the means on the same lines."
  },
  {
   "name": "price_check_vix_brent",
   "from": "2026-10-26",
   "rule": "From the run of 2026-10-26 VIX and BRENT are checked like the other markets: VIX against CNBC .VIX (the same Cboe index) at the same minutes, the end at the 16:00 ET minute, tolerance 0.50%; BRENT against CNBC @BZ.1 (NYMEX Brent, the contract Yahoo BZ=F stands for), tolerance 0.20%, compared only when CNBC's contract month is the month of Yahoo's series (else contract_differs, as GOLD, WTI, COPPER); runs before that date stay not_checked and are not recounted."
  },
  {
   "name": "shown_positions",
   "from": "2026-10-26",
   "rule": "From the session of 2026-10-26, council-positions.jsonl also logs the Council's position of the day as published (kind `shown`): for each of the 12 markets the consensus 1d action of the issue (action, votes count of of, the world probability), the time the issue went out (published_at, the first good upload), valid until the session's close, the issue's seal and the run line of the book it comes from; a changed published position is a new version with `supersedes` (status correction), a withdrawal is status withdrawn. A line the build wrote without the upload's minute has published_at null, recorded_late and recorded_at (the build's time); the upload's minute, once known, comes as the next version. Lines without kind are the executed weights of the league account, as before."
  },
  {
   "name": "sources_archive",
   "from": "2026-10-26",
   "rule": "From the run of 2026-10-26: a link the source itself did not give (HTTP 401 / 403 / 429 / 503 or a page under 200 characters) is read from its last web.archive.org snapshot (status 200); such a row keeps status not_received (the source did not open) and carries via=archive, archive_url, archive_ts, archive_sha256 and archive_status (confirmed / not_confirmed by the same key-terms rule, or no_snapshot / not_received); per model, received_any = opened at the source + received via the archive, counted apart (via_archive)."
  },
  {
   "name": "counted_first_line",
   "from": "2026-11-02",
   "rule": "From the session of 2026-11-02 (session 11): within a run, each seat's first well-formed answer line sealed before the reference counts; later lines of the same seat are labelled retries (sealed and published, outside the count; council-forecasts.csv status `retry`). A seat with no line sealed before the reference keeps its first line after it, scored from its own reference price, as before. Before this session the line sealed last before the reference counts, as sealed."
  }
 ]
}