{"version":"catalog-v1","generated_from":"src/metrics/, src/resolution/","packages":[{"id":"metrics","title":"Market metrics"},{"id":"resolution","title":"Settlement and resolution"}],"restatement_classes":["initial","additive","restated","unclear"],"metrics":[{"id":"align","module":"src/metrics/alignment.py","package":"metrics","version":"align-v2","summary":"Putting two sources on the same calendar day.","title":"Putting two sources on the same calendar day.","definition":[{"kind":"para","text":"`blockchain_com` stamps a daily value one calendar day later than Binance and Yahoo do. Its 00:00 UTC print is the *previous* day's close; Binance stamps a kline at its open. So `BTC` dated D lines up with every other tracked asset dated D\u22121.","lead":"The finding."},{"kind":"para","text":"Measured on daily log returns against ETH, the correlation at lag 0 is \u22480.00 and at lag \u22121 is \u22480.82, and that holds in 2018-2020, 2021-2022 and 2024-2026 alike. A stable ~0.82 sitting one day off a ~0.00 is a calendar convention, not a market relationship. Yahoo (`BCH`) and Binance agree at lag 0 and need no correction."},{"kind":"para","text":"It should be, and the fetch layer is not this workstream's to change. More importantly, moving BTC's index by a day would move the 365-day mean, the expanding extremes and therefore every historical value of `risk-v1` \u2014 a silent rewrite of the flagship metric to fix a cross-asset chart. So the correction lives here, is opt-in, and is applied only where two sources are compared to each other:","lead":"Why this is not fixed in `src/fetch/`."},{"kind":"pre","text":"- single-asset charts:      never aligned; each asset against its own history\n- cross-source comparisons: aligned, and the chart says so"},{"kind":"para","text":"`measure_lag` exists so the constant below can be re-derived from the data rather than trusted, and `tests/test_charts.py` re-derives it on every run. If a source changes its convention, the test fails instead of the charts quietly going wrong."},{"kind":"para","text":"`SPX`, `GOLD` and `SILVER` arrive on a seven-day index with weekends and holidays carrying the previous close. Measured: 100% of Saturdays and Sundays are zero-change on all three, against 2.3% for Bitcoin. The S&P frame holds 36,014 rows for roughly 24,750 actual sessions.","lead":"The second problem: forward-filled calendars."},{"kind":"para","text":"That is fine for a price line and wrong for anything that counts days. Two sevenths of every window are fabricated flat observations, so the daily return spread comes out about 21% low, correlation is diluted by a mass of artificial zeros on one side of each pair, and a run-length or advance/decline count is measuring the calendar. `sessions()` recovers the real observations; `periods_per_year()` gives the annualiser that goes with them."},{"kind":"para","text":"The fetch layer should carry an `is_session` column and this heuristic should then be deleted. Until it does, the detection is measured from the data rather than declared per source, because `yahoo` serves both `^GSPC` on a five-day calendar and `BCH-USD` on a seven-day one \u2014 the calendar is a property of the instrument, not of the vendor."}],"functions":["aligned_close","aligned_panel","benchmark_symbols","common_returns","crypto_symbols","is_business_calendar","measure_lag","offset_days","periods_per_year","session_close","sessions"],"history":[{"version":"align-v1","date":"2026-08-05","text":"blockchain_com offset measured at \u22121 day; Binance and Yahoo at 0. Applied to cross-source charts only.","restatement":"initial","evidence":[]},{"version":"align-v2","date":"2026-08-06","text":"sessions(), periods_per_year(), common_returns() and the crypto/benchmark symbol split. align-v1's offsets are unchanged and no existing series moves.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"sessions(), periods_per_year(), common_returns() and the crypto/benchmark symbol split. align-v1's offsets are unchanged and no existing series moves."}]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"btc-correlation","title":"Bitcoin against the Benchmarks \u2014 Correlation","category":"crossasset","version":"align-v2"},{"slug":"correlation","title":"Cross-Asset Correlation","category":"structure","version":"align-v2"}],"chart_count":2,"chart_count_leading":1},{"id":"alt","module":"src/metrics/altseason.py","package":"metrics","version":"alt-v1","summary":"Alt season index \u2014 share of large alts outperforming BTC over a rolling window.","title":"Alt season index \u2014 share of large alts outperforming BTC over a rolling window.","definition":[{"kind":"para","text":"CHART_LIBRARY.md \u00a73.3 defines it as \"% of top-50 alts outperforming BTC over 90d\"."},{"kind":"para","text":"\u2014 the basket carries capitalisation, and there is no free price series for 800 assets. For an asset with fixed supply the two are identical; for one still inflating its supply, cap return overstates price return. That biases the index *up* for high-emission alts. Stated here rather than hidden, and it is the reason this chart is a regime indicator, not a tradable signal.","lead":"Measured on market cap, not price"},{"kind":"para","text":"Membership is ranked per day, so the index never back-fills today's winners into 2019."}],"functions":["compute"],"history":[{"version":"alt-v1","date":"2026-08-05","text":"top-50 by basket cap, 90d cap return vs BTC, stables excluded.","restatement":"initial","evidence":[]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"altseason","title":"Alt Season Index","category":"structure","version":"alt-v1"}],"chart_count":1,"chart_count_leading":1},{"id":"breadth","module":"src/metrics/breadth.py","package":"metrics","version":"breadth-v2","summary":"Market breadth and cross-asset correlation \u2014 Zone 5 category 3.","title":"Market breadth and cross-asset correlation.","definition":[{"kind":"para","text":"Dominance says where the money is. Breadth says how many things are moving, which is a different question and the one that separates a broad advance from four large caps carrying an index."},{"kind":"para","text":", because the basket carries capitalisation and there is no free price series for 700 assets. For a fixed supply the two are identical; for an asset still issuing, cap return overstates price return, which biases every breadth reading *up* for high-emission names. Same caveat as `altseason.py`, same reason, and it is why these are regime indicators rather than tradable signals.","lead":"Breadth here is measured on market capitalisation"},{"kind":"para","text":"Correlation is the exception: it runs on the eleven registered price series, because a correlation of issuance schedules is not a correlation of prices."},{"kind":"para","text":"Membership is evaluated per day. Nothing back-fills today's survivors into 2019, so a falling asset count in the early record is real history rather than a bug."}],"functions":["above_ma","advance_decline","compute","correlation_from_returns","correlation_matrix","macro_correlation","rolling_correlation","rolling_correlation_from_returns","snapshot"],"history":[{"version":"breadth-v1","date":"2026-08-05","text":"share above own moving average, advance/decline ratio and cumulative line, rolling pairwise correlation.","restatement":"initial","evidence":[]},{"version":"breadth-v2","date":"2026-08-09","text":"macro_correlation(): the rolling correlation the macro charts were computing inline. Additive \u2014 every breadth-v1 series is unchanged; the macro charts now have a version to stamp, which they previously did not and were exempted from carrying one for.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"Additive \u2014 every breadth-v1 series is unchanged; the macro charts now have a version to stamp, which they previously did not and were exempted from carrying one for."}]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"advance-decline","title":"Advances and Declines","category":"structure","version":"breadth-v2"},{"slug":"breadth","title":"Breadth \u2014 Assets Above Their 200-Day Average","category":"structure","version":"breadth-v2"},{"slug":"btc-correlation","title":"Bitcoin against the Benchmarks \u2014 Correlation","category":"crossasset","version":"breadth-v2"},{"slug":"correlation","title":"Cross-Asset Correlation","category":"structure","version":"breadth-v2"}],"chart_count":4,"chart_count_leading":3},{"id":"cat","module":"src/resolution/categories.py","package":"resolution","version":"cat-v1","summary":"Market categories \u2014 the denominator for \"dispute rate by category\".","title":"Market categories \u2014 the denominator for \"dispute rate by category\".","definition":[{"kind":"para","text":"Neither venue ships a usable category on the endpoints we pull. Kalshi's series ticker is a category of sorts but only for Kalshi; Polymarket's Gamma market payload carries no tag at all (`scripts/polymarket_ingest.py` pulls 31 fields and none of them is one). So the category is derived from the question text, here, by keyword."},{"kind":"para","text":"That is a shallow rule and it is meant to be. Its whole job is to put 132k questions into buckets big enough to compare dispute rates across. Every classification records the term that produced it, so a suspicious bucket can be audited rather than believed \u2014 the same standard `flags.py` holds itself to."},{"kind":"para","text":"Order matters and is deliberate. A question can match several vocabularies (\"Will Trump create Bitcoin reserve in first 100 days?\" is both politics and crypto); the first rule in RULES order wins, and `classify` returns which one it was. Sports goes first because it is 60% of the corpus and its markers (\"vs.\", \"O/U\", \"Spread:\") are unambiguous \u2014 leaving it late lets a team nickname get caught by another vocabulary and quietly inflate that bucket."}],"functions":["classify","classify_frame"],"history":[{"version":"cat-v1","date":"2026-08-05","text":"eight buckets, keyword and marker rules, first match wins.","restatement":"initial","evidence":[]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"dispute-rate","title":"Dispute Rate by Market Category","category":"trust","version":"cat-v1"},{"slug":"disputed-volume","title":"Disputed Volume Over Time","category":"trust","version":"cat-v1"},{"slug":"repeat-disputes","title":"Repeat-Dispute Leaderboard","category":"trust","version":"cat-v1"}],"chart_count":3,"chart_count_leading":0},{"id":"cycle","module":"src/metrics/cycles.py","package":"metrics","version":"cycle-v5","summary":"Cycle and ROI comparison \u2014 CHART_LIBRARY.md \u00a73.4.","title":"Cycle and ROI comparison.","definition":[{"kind":"para","text":"Align cycles to a common anchor and overlay them. This is where diminishing returns become visible, which is the core thesis of the whole product."},{"kind":"para","text":"Every chart built on this embeds one assumption: that cycles continue in roughly the shape they have so far. That assumption is stated on every page that uses it, because nothing here can tell you when it stops holding."}],"functions":["anchored_roi","cohort_years","compute","days_since_decline","dca_by_weekday","drawdown","drawdown_episodes","milestones","monthly_returns","rolling_cagr","rolling_roi","seasonal_envelope","seasonal_ytd","streaks","time_since","troughs","yearly_returns"],"history":[{"version":"cycle-v1","date":"2026-08-05","text":"drawdown, anchored ROI, monthly return grid.","restatement":"initial","evidence":[]},{"version":"cycle-v2","date":"2026-08-05","text":"calendar-year returns, rolling ROI, run streaks, days since a decline, DCA-by-weekday. cycle-v1's series are untouched: no existing chart moves.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"calendar-year returns, rolling ROI, run streaks, days since a decline, DCA-by-weekday. cycle-v1's series are untouched: no existing chart moves."}]},{"version":"cycle-v3","date":"2026-08-06","text":"seasonal_ytd() and milestones(). Additive again \u2014 every v1 and v2 series is unchanged and only the stamp moves.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"Additive again \u2014 every v1 and v2 series is unchanged and only the stamp moves."}]},{"version":"cycle-v4","date":"2026-08-06","text":"drawdown_episodes(): peak, trough, depth and recovery time, DERIVED per asset instead of hand-dated. Additive; the hand-dated CYCLE_BOTTOMS are untouched and every chart built on them is unchanged.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"Additive; the hand-dated CYCLE_BOTTOMS are untouched and every chart built on them is unchanged."}]},{"version":"cycle-v5","date":"2026-08-06","text":"seasonal cohorts and the mean +/- n*sigma envelope the payload's `standard-deviation: cohort` control needs. seasonal_envelope() gains columns; nothing it already returned changed, so no drawn series moves.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"seasonal cohorts and the mean +/- n*sigma envelope the payload's `standard-deviation: cohort` control needs. seasonal_envelope() gains columns; nothing it already returned changed, so no drawn series moves."}]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"days-since-decline-ada","title":"Cardano \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-avax","title":"Avalanche \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-bch","title":"Bitcoin Cash \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-dot","title":"Polkadot \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-eth","title":"Ethereum \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-gold","title":"Gold \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-link","title":"Chainlink \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-ltc","title":"Litecoin \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-pol","title":"Polygon \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-silver","title":"Silver \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-sol","title":"Solana \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-spx","title":"S&P 500 \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"days-since-decline-xrp","title":"XRP \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"dayssince-btc","title":"Bitcoin \u2014 Days Since a Decline","category":"cycles","version":"cycle-v5"},{"slug":"dca-btc","title":"Bitcoin \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-ada","title":"Cardano \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-avax","title":"Avalanche \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-bch","title":"Bitcoin Cash \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-dot","title":"Polkadot \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-eth","title":"Ethereum \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-gold","title":"Gold \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-link","title":"Chainlink \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-ltc","title":"Litecoin \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-pol","title":"Polygon \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-silver","title":"Silver \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-sol","title":"Solana \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-spx","title":"S&P 500 \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"dca-weekday-xrp","title":"XRP \u2014 Best Day of the Week to Buy","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-ada","title":"Cardano \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-avax","title":"Avalanche \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-bch","title":"Bitcoin Cash \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-btc","title":"Bitcoin \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-dot","title":"Polkadot \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-eth","title":"Ethereum \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-gold","title":"Gold \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-link","title":"Chainlink \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-ltc","title":"Litecoin \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-pol","title":"Polygon \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-silver","title":"Silver \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-sol","title":"Solana \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-spx","title":"S&P 500 \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"drawdown-xrp","title":"XRP \u2014 Drawdown from All-Time High","category":"cycles","version":"cycle-v5"},{"slug":"monthly-btc","title":"Bitcoin \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-ada","title":"Cardano \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-avax","title":"Avalanche \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-bch","title":"Bitcoin Cash \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-dot","title":"Polkadot \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-eth","title":"Ethereum \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-gold","title":"Gold \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-link","title":"Chainlink \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-ltc","title":"Litecoin \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-pol","title":"Polygon \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-silver","title":"Silver \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-sol","title":"Solana \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-spx","title":"S&P 500 \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"monthly-returns-xrp","title":"XRP \u2014 Monthly Returns","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-ada","title":"Cardano \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-avax","title":"Avalanche \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-bch","title":"Bitcoin Cash \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-dot","title":"Polkadot \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-eth","title":"Ethereum \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-gold","title":"Gold \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-link","title":"Chainlink \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-ltc","title":"Litecoin \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-pol","title":"Polygon \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-silver","title":"Silver \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-sol","title":"Solana \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-spx","title":"S&P 500 \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"return-streaks-xrp","title":"XRP \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"roibottom-btc","title":"Bitcoin \u2014 Return After Each Cycle Bottom","category":"cycles","version":"cycle-v5"},{"slug":"roihalving-btc","title":"Bitcoin \u2014 Return After Each Halving","category":"cycles","version":"cycle-v5"},{"slug":"roipeak-btc","title":"Bitcoin \u2014 Return After Each Cycle Peak","category":"cycles","version":"cycle-v5"},{"slug":"rolling-btc","title":"Bitcoin \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-ada","title":"Cardano \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-avax","title":"Avalanche \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-bch","title":"Bitcoin Cash \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-dot","title":"Polkadot \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-eth","title":"Ethereum \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-gold","title":"Gold \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-link","title":"Chainlink \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-ltc","title":"Litecoin \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-pol","title":"Polygon \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-silver","title":"Silver \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-sol","title":"Solana \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-spx","title":"S&P 500 \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"rolling-returns-xrp","title":"XRP \u2014 Rolling Holding-Period Returns","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-ada","title":"Cardano \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-avax","title":"Avalanche \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-bch","title":"Bitcoin Cash \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-btc","title":"Bitcoin \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-dot","title":"Polkadot \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-eth","title":"Ethereum \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-gold","title":"Gold \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-link","title":"Chainlink \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-ltc","title":"Litecoin \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-pol","title":"Polygon \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-silver","title":"Silver \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-sol","title":"Solana \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-spx","title":"S&P 500 \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"seasonality-xrp","title":"XRP \u2014 Year-to-Date by Month","category":"cycles","version":"cycle-v5"},{"slug":"streaks-btc","title":"Bitcoin \u2014 Consecutive Up and Down Closes","category":"cycles","version":"cycle-v5"},{"slug":"yearly-btc","title":"Bitcoin \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-ada","title":"Cardano \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-avax","title":"Avalanche \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-bch","title":"Bitcoin Cash \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-dot","title":"Polkadot \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-eth","title":"Ethereum \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-gold","title":"Gold \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-link","title":"Chainlink \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-ltc","title":"Litecoin \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-pol","title":"Polygon \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-silver","title":"Silver \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-sol","title":"Solana \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-spx","title":"S&P 500 \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"},{"slug":"yearly-returns-xrp","title":"XRP \u2014 Returns by Calendar Year","category":"cycles","version":"cycle-v5"}],"chart_count":115,"chart_count_leading":115},{"id":"dom","module":"src/metrics/dominance.py","package":"metrics","version":"dom-v1","summary":"Dominance \u2014 share of a defined basket, not of \"the total crypto market cap\".","title":"Dominance \u2014 share of a defined basket, not of \"the total crypto market cap\".","definition":[{"kind":"para","text":"Say this plainly on the methodology page: **this is not the BTC.D everyone else quotes.** There is no free source for true total market cap \u2014 CoinGecko's /global/market_cap_chart is PRO-only. So we define our own basket, publish its constituents, and report share within it."},{"kind":"para","text":"Basket: Coin Metrics community `CapMrktEstUSD`, chain-variant rows removed. Measured against CoinGecko's live total on 2026-08-05 it covered 99.4%, putting BTC's share within +0.28pp of the quoted BTC.D. That is a calibration point, not a guarantee \u2014 we cannot validate the spread historically without paid data, and the methodology page must say so."},{"kind":"para","text":"Membership evolves: an asset joins the basket the day its data starts. That is correct \u2014 it mirrors how a real total behaves and avoids survivorship bias from back-filling today's winners into 2019."}],"functions":["basket_total","compute","group_share","others_share"],"history":[{"version":"dom-v1","date":"2026-08-05","text":"CapMrktEstUSD basket, 2019-01-01 onward.","restatement":"initial","evidence":[]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"dominance","title":"Market Structure \u2014 share of the Cryptolean basket","category":"structure","version":"dom-v1"},{"slug":"logreg-total","title":"Cryptolean Basket \u2014 Logarithmic Regression","category":"valuation","version":"dom-v1"},{"slug":"others-dominance","title":"Dominance of Everything Outside the Top 10","category":"structure","version":"dom-v1"}],"chart_count":3,"chart_count_leading":3},{"id":"flags","module":"src/resolution/flags.py","package":"resolution","version":"flags-v2","summary":"Phase 4 \u2014 the flag taxonomy. This is the product, not the plumbing.","title":"Phase 4 \u2014 the flag taxonomy. This is the product, not the plumbing.","definition":[{"kind":"para","text":"Five flag types, per the design:"},{"kind":"pre","text":"1 source        the two venues name different deciding authorities\n2 cutoff        different deadline or timezone convention\n3 edge_case     one side says what happens on cancellation/postponement, the other does not\n4 subjective    wording that requires a judgement call \u2014 \"officially\", \"significant\"\n5 dispute       this venue, or this category, has contested outcomes on record"},{"kind":"para","text":"Types 4 and 5 are computable on a single venue, and are live now. Types 1-3 compare a linked pair, so they depend on the matching step and are scored only where a link exists."},{"kind":"para","text":"Every rule here is deliberately shallow: a keyword list and a regex are not comprehension. They exist to rank what a human should read first, which is exactly what the design says the manual layer is for. A flag is a pointer, not a verdict."},{"kind":"para","text":"MATCHING \u2014 read before adding a term"},{"kind":"para","text":"Every needle below is matched on WORD BOUNDARIES, and a trailing `*` marks a stem that may take a suffix. `flags-v1` matched by plain substring, which was a bug with teeth once the corpus grew from 4,199 markets to 132,154:"},{"kind":"pre","text":"\"tie\"      matched parties, securities, authorities, entities, hostilities\n           \u2014 3,400 markets, of which 2,434 had no other edge-case term and\n           were credited with coverage purely because their rules say\n           \"the parties\"\n\"draw\"     matched withdraws (3,356 of its 9,942 hits)\n\"official\" matched officially, so one word raised two of the four subjective\n           slots \u2014 14,996 markets carry \"officially\", and 2,976 of them lost\n           a subjective term when the double-count was removed"},{"kind":"para","text":"The first two are the dangerous direction: a false match on an edge-case term CREDITS a contract with coverage it does not have and LOWERS its risk score. A contract that never says what happens on cancellation was passing because it said \"the parties\"."},{"kind":"para","text":"Fixing it made the edge-case flag much sharper, which is the point. Holding volume decile fixed, on the top decile where the money is, markets lacking edge-case coverage are disputed at 11.39% against 1.70% for those that have it \u2014 a 6.7x separation, against 1.3x for the same flag under substring matching."},{"kind":"para","text":"Note the stems: `cancel*` still matches \"cancelled\" and \"cancellation\", so the fix is narrow. Only 4.2% of the corpus changes score, and the two scorings rank the corpus at a 0.995 correlation. This corrects a defect; it does not re-tune."}],"functions":["compare_pair","find","label","patterns","resolution_risk","score_market","score_markets"],"history":[{"version":"flags-v1","date":"2026-08-05","text":"subjective wording, missing source, timezone, edge-case coverage, dispute history. Substring matching.","restatement":"initial","evidence":[]},{"version":"flags-v2","date":"2026-08-05","text":"word-boundary matching with explicit stems. Scores move; see PHASE4_THRESHOLDS.md for the before/after distribution and for which flags survive a volume control. Weights are UNCHANGED and deliberately so \u2014 see DEFAULT_WEIGHTS.","restatement":"restated","evidence":[{"claim":"moved","quote":"Scores move; see PHASE4_THRESHOLDS.md for the before/after distribution and for which flags survive a volume control."},{"claim":"unchanged","quote":"Weights are UNCHANGED and deliberately so \u2014 see DEFAULT_WEIGHTS."}]}],"history_source":"docstring","restatement_policy":"restated","restated_ever":true,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"dispute-rate","title":"Dispute Rate by Market Category","category":"trust","version":"flags-v2"},{"slug":"disputed-volume","title":"Disputed Volume Over Time","category":"trust","version":"flags-v2"},{"slug":"repeat-disputes","title":"Repeat-Dispute Leaderboard","category":"trust","version":"flags-v2"}],"chart_count":3,"chart_count_leading":0},{"id":"implied","module":"src/metrics/implied.py","package":"metrics","version":"implied-v1","summary":"Market-implied probabilities from Kalshi candles.","title":"Market-implied probabilities from Kalshi candles.","definition":[{"kind":"para","text":"A Kalshi contract settles at $1 if the outcome happens and $0 if it does not, so its price reads as a probability. Three caveats that belong on every chart built from it:"},{"kind":"para","text":"1. **It is a risk-neutral probability, not a forecast.** It includes whatever risk"},{"kind":"pre","text":"premium and hedging demand sit in the price."},{"kind":"para","text":"2. **Mutually exclusive outcomes rarely sum to exactly 1.** Fees and spread leave a"},{"kind":"pre","text":"gap. We report the raw sum so the gap is visible, and normalise only for display."},{"kind":"para","text":"3. **Mid, not last.** Last trade can be stale on a thin market; the midpoint of the"},{"kind":"pre","text":"bid/ask is the better read where both sides exist."}],"functions":["bridge_gaps","calibration","compute","default_event","easing_probability","epoch_ms","liquidity_disclosure","outcome_panel","settled_outcomes"],"history":[{"version":"implied-v1","date":"2026-08-05","text":"outcome panels from daily candles, raw sum reported.","restatement":"initial","evidence":[]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"easing-scatter","title":"Easing Odds against Bitcoin Risk","category":"markets","version":"implied-v1"},{"slug":"fed-path","title":"Bitcoin Risk vs the Market-Implied Fed Path","category":"markets","version":"implied-v1"}],"chart_count":2,"chart_count_leading":2},{"id":"latency","module":"src/resolution/latency.py","package":"resolution","version":"latency-v1","summary":"Settlement latency \u2014 how long a venue takes to pay out after the question is answered.","title":"Settlement latency \u2014 how long a venue takes to pay out after the question is answered.","definition":[{"kind":"pre","text":"compute(df, **params) -> pd.Series   # hours, indexed venue:market_id"},{"kind":"para","text":"Slow settlement is the quiet failure mode of a prediction market. It never shows up in a dispute count: nobody contests the outcome, the money simply sits. Zone 11 measures dispute *frequency* everywhere else; this is the other half, and it needs no credential at all \u2014 both venues ship the timestamps for free."},{"kind":"heading","text":"WHAT `closed != settled` ACTUALLY COSTS YOU"},{"kind":"para","text":"Kalshi's `expiration_time` is the SCHEDULED expiration and `settlement_ts` is when the contract actually settled. Anchoring on the wrong one does not produce a slightly-off number, it produces a nonsense one. Measured on 13,237 finalized Kalshi markets:"},{"kind":"pre","text":"anchor = close_time                median   +2.53h    0 negative\nanchor = expected_expiration_time  median   +0.03h    5,599 negative\nanchor = expiration_time           median  -167.97h   13,089 negative"},{"kind":"para","text":"The third row says Kalshi settles a week before its contracts expire. It does not. `schema.py` carries `settlement_time` so this stays fixed in one place."},{"kind":"heading","text":"WHY THE TWO VENUES ARE NOT ONE NUMBER"},{"kind":"para","text":"The anchors mean different things and the difference is not cosmetic:"},{"kind":"pre","text":"Kalshi      close_time is when TRADING STOPS. It is scheduled, and a\n            contract cannot settle before it.\nPolymarket  endDate is a DEADLINE \u2014 \"by June 30\". A market resolves the\n            moment the event happens, which is often long before it."},{"kind":"para","text":"28.8% of Polymarket markets (22,897 of 79,539) close BEFORE their stated end date, a median of 162 hours early. That is the venue working correctly, not negative latency. Pooling those into a mean drags Polymarket's average to \u2212142 hours and would let us publish \"Polymarket settles six days before the deadline\" as if it were an operational fact about payout speed."},{"kind":"para","text":"So `compute` reports signed hours and nothing else, and `summary()` splits the two populations rather than averaging across them:"},{"kind":"pre","text":"early       resolved before its stated deadline (Polymarket, mostly)\nsettled     resolved at or after the anchor \u2014 the comparable population\ncensored    trading stopped, never settled. Excluded from every quantile,\n            counted in `censored_n`, because dropping it silently is how a\n            venue's slowest contracts disappear from its latency figure."},{"kind":"para","text":"On the comparable population the venues are nearly identical at the median \u2014 Kalshi 2.53h, Polymarket 2.71h \u2014 and diverge hard in the tail: p99 of 85h against 679h. The tail is the finding. A median is a claim about a normal day; the 99th percentile is a claim about the day it matters."},{"kind":"heading","text":"CENSORING, READ BEFORE QUOTING IT"},{"kind":"para","text":"1,886 Kalshi markets are `closed` with no settlement timestamp \u2014 12.5% of everything past trading close, median age 188 days. That reads like a settlement backlog and it is not: **1,859 of the 1,886 have zero volume.** They are untraded strike ladders (500 hourly EURUSD, 500 USDJPY, 400 index strikes) that nobody has any reason to settle. Only 27 censored markets carry volume at all, and their median age is 36 days. Report the count, then report what it is."}],"functions":["by_size","censored","compute","curve","key","population","settled","summary","tail","tail_context"],"history":[{"version":"latency-v1","date":"2026-08-05","text":"close_time -> settlement_time, signed, three populations, censoring counted not dropped.","restatement":"initial","evidence":[]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[],"chart_count":0,"chart_count_leading":0},{"id":"logreg","module":"src/metrics/logreg.py","package":"metrics","version":"logreg-v2","summary":"Logarithmic regression \u2014 fit log(price) against log(days since genesis).","title":"Logarithmic regression \u2014 fit log(price) against log(days since genesis).","definition":[{"kind":"para","text":"Because appreciation is rapid early and settles over time, log-log linearises the trend. Bands above and below mark historical over/under-extension."},{"kind":"para","text":"The conventional presentation fits once over the whole history and plots that line back to the start \u2014 which means the 2013 fair value is drawn using 2026 data. That is exactly the lookahead the project's core rule forbids for normalisation, and it is the same mistake in a different place. Expanding fit answers \"what did fair value look like *at the time*\".","lead":"The fit is expanding by default, and that is a deliberate departure from how everyone else draws this chart."},{"kind":"para","text":"Pass `expanding=False` for the conventional view. It will look tidier and it is a lie about the past."}],"functions":["bands","compute","project","residual","slope"],"history":[{"version":"logreg-v1","date":"2026-08-05","text":"expanding OLS on (log t, log price), residual-sigma bands.","restatement":"initial","evidence":[]},{"version":"logreg-v2","date":"2026-08-06","text":"`project()` added for the projected-x chart shape. Purely additive: compute(), residual() and bands() are byte-for-byte the v1 definitions and every historical value is unchanged. Only the stamp moves.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"Purely additive: compute(), residual() and bands() are byte-for-byte the v1 definitions and every historical value is unchanged."},{"claim":"unchanged","quote":"Only the stamp moves."}]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"fan-btc","title":"Bitcoin \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-ada","title":"Cardano \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-avax","title":"Avalanche \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-bch","title":"Bitcoin Cash \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-dot","title":"Polkadot \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-eth","title":"Ethereum \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-link","title":"Chainlink \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-ltc","title":"Litecoin \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-pol","title":"Polygon \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-sol","title":"Solana \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"log-regression-xrp","title":"XRP \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-btc","title":"Bitcoin \u2014 Logarithmic Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-ada","title":"Cardano \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-avax","title":"Avalanche \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-bch","title":"Bitcoin Cash \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-dot","title":"Polkadot \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-eth","title":"Ethereum \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-link","title":"Chainlink \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-ltc","title":"Litecoin \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-pol","title":"Polygon \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-sol","title":"Solana \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logreg-oscillator-xrp","title":"XRP \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"logregosc-btc","title":"Bitcoin \u2014 Distance from Log Regression","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-ada","title":"Cardano \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-avax","title":"Avalanche \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-bch","title":"Bitcoin Cash \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-dot","title":"Polkadot \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-eth","title":"Ethereum \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-link","title":"Chainlink \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-ltc","title":"Litecoin \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-pol","title":"Polygon \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-sol","title":"Solana \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"quantile-fan-xrp","title":"XRP \u2014 Asymmetric Quantile Fan","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-ada","title":"Cardano \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-avax","title":"Avalanche \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-bch","title":"Bitcoin Cash \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-btc","title":"Bitcoin \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-dot","title":"Polkadot \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-eth","title":"Ethereum \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-link","title":"Chainlink \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-ltc","title":"Litecoin \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-pol","title":"Polygon \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-sol","title":"Solana \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"},{"slug":"rainbow-xrp","title":"XRP \u2014 Rainbow Chart","category":"valuation","version":"logreg-v2"}],"chart_count":44,"chart_count_leading":33},{"id":"match","module":"src/resolution/matching.py","package":"resolution","version":"match-v3","summary":"Phase 4 step 3 \u2014 candidate generation for cross-venue matching.","title":"Phase 4 step 3 \u2014 candidate generation for cross-venue matching.","definition":[{"kind":"para","text":"The design is candidates -> LLM verification -> manual review. This module is **only the first stage**, and deliberately so: it is free, deterministic, and reproducible, which the other two are not. Nothing here writes `verified=True`."},{"kind":"para","text":"TF-IDF cosine over question text, implemented directly rather than pulling in scikit-learn for one function."},{"kind":"para","text":"Numbers are deliberately kept OUT of the similarity vector and used only as a contradiction check. See the comment on `numbers()` \u2014 folding them into the vector is what made v1 unusable."}],"functions":["candidates","numbers","strip_dates","tokenize","years"],"history":[{"version":"match-v1","date":"2026-08-05","text":"TF-IDF cosine candidates, unverified by construction.","restatement":"initial","evidence":[]},{"version":"match-v2","date":"2026-08-05","text":"Words and numbers separated. v1 tokenised on [a-z0-9']+, so \"$4.07\" became {4, 07} and \"2026-07-07\" became {2026, 07}. Rare digit fragments earn high IDF, so a question scored against an unrelated one purely on a shared \"07\" \u2014 \"Will average gas prices be above $4.07?\" matched \"Will Argentina win on 2026-07-07?\" at 0.71, above genuine same-event pairs. Numbers now carry no similarity weight; instead, two questions that both quote thresholds but share none are penalised, because \"above $4.07\" and \"above $4.04\" are different markets.","restatement":"unclear","evidence":[]},{"version":"match-v3","date":"2026-08-05","text":"Dates stripped before numbers are read. v2 still let a date's parts become thresholds: \"2026-07-05\" gave 7 and 5, which then AGREED with an inflation question about 5.00% and cancelled the very penalty meant to separate them \u2014 \"inflation in Brazil above 5.00%\" scored 0.709 against \"Will Brazil win on 2026-07-05?\". Years are still read from the original text, because a year inside a date is exactly the deadline worth comparing.","restatement":"unclear","evidence":[]}],"history_source":"docstring","restatement_policy":"unclear","restated_ever":false,"unclear":["match-v2","match-v3"],"first_date":"2026-08-05","charts":[],"chart_count":0,"chart_count_leading":0},{"id":"resdb","module":"src/resolution/schema.py","package":"resolution","version":"resdb-v2","summary":"Phase 4 \u2014 the resolution database. Four tables, one per RESOLUTION_DB's design.","title":"Phase 4 \u2014 the resolution database. Four tables, one per RESOLUTION_DB's design.","definition":[{"kind":"pre","text":"markets      one row per contract, both venues, with full rules text\nresolutions  what was proposed, whether it was disputed, what settled\nlinks        kalshi_ticker <-> polymarket_id, with confidence and method\nflags        where a linked pair's rules diverge, typed and scored"},{"kind":"para","text":"What the venues actually give us, measured (see PHASE4_RESULT.md):"},{"kind":"pre","text":"Kalshi       rules text on 100% of markets; settlement sources with URLs on\n             1,457 of 1,459 series. Structured, and the best half of the pair.\nPolymarket   `resolutionSource` populated on 705 of 4,200 (17%); criteria\n             otherwise buried in free prose, median 738 characters.\nUMA          `umaResolutionStatuses` carries the proposal/dispute sequence\n             directly from Gamma \u2014 no Polygon RPC and no Dune. BUILD_PLAN\n             budgeted a chain-indexing pipeline for this."}],"functions":["kalshi_markets","polymarket_markets","resolutions","unified_markets"],"history":[{"version":"resdb-v1","date":"2026-08-05","text":"markets + resolutions + candidate links + single-venue flags.","restatement":"initial","evidence":[]},{"version":"resdb-v2","date":"2026-08-05","text":"`settlement_time` added \u2014 when a contract ACTUALLY settled, which on Kalshi is not `expiry_time`. See below.","restatement":"unclear","evidence":[]}],"history_source":"docstring","restatement_policy":"unclear","restated_ever":false,"unclear":["resdb-v2"],"first_date":"2026-08-05","charts":[{"slug":"dispute-rate","title":"Dispute Rate by Market Category","category":"trust","version":"resdb-v2"},{"slug":"disputed-volume","title":"Disputed Volume Over Time","category":"trust","version":"resdb-v2"},{"slug":"repeat-disputes","title":"Repeat-Dispute Leaderboard","category":"trust","version":"resdb-v2"}],"chart_count":3,"chart_count_leading":0},{"id":"resrisk","module":"src/resolution/risk_score.py","package":"resolution","version":"resrisk-v2","summary":"Resolution risk as a metric module \u2014 the locked contract, plus the evidence.","title":"Resolution risk as a metric module \u2014 the locked contract, plus the evidence.","definition":[{"kind":"pre","text":"compute(df, **params) -> pd.Series      # 0-1 per market, indexed venue:market_id\nevidence(df, **params) -> pd.DataFrame  # one row per raised flag, with its clause"},{"kind":"para","text":"`SPEC.md` \u00a7 7 makes the second function binding, not optional:"},{"kind":"pre","text":"Never publish a resolution-risk score without the clause that produced it. An\nunexplained score about someone else's contract is an accusation, not analysis."},{"kind":"para","text":"So the score and its evidence are one module and one version. `compute` does not invent a second scoring rule \u2014 it delegates the arithmetic to `flags.py`, which owns the five-flag taxonomy and `DEFAULT_WEIGHTS`. This module adds the part `flags.py` never had: *where in the rules text* each flag came from."},{"kind":"para","text":"The five flags, and what evidence each can produce:"},{"kind":"pre","text":"subjective      PRESENT in the text  -> the sentence containing the term\nno_named_source ABSENT from the text -> no clause; the absence is the finding\nno_edge_cases   ABSENT from the text -> no clause; the absence is the finding\nno_timezone     ABSENT from the text -> no clause; the absence is the finding\nprior_dispute   from the RECORD      -> the UMA status sequence, not the rules"},{"kind":"para","text":"Three of the five fire on absence. There is no sentence to quote for \"this contract never says what happens if the event is postponed\" \u2014 the honest rendering is the absence itself, stated with the length of text it is absent from, which is why every evidence row carries `basis` and `rules_chars`. A UI that only knows how to show quotes will silently drop three flags out of five."},{"kind":"para","text":"This is a ranking device, not a probability. It has never been calibrated against realised disputes: the observable dispute sample is 758 markets on one venue over 17 months, and fitting weights to it would fit noise. A high score means \"read this one first\"."}],"functions":["components","compute","evidence","explain","key"],"history":[{"version":"resrisk-v1","date":"2026-08-05","text":"wraps flags-v1's taxonomy and weights; adds clause extraction, absence basis, and the record basis for dispute history. Score values identical to flags-v1 \u2014 this version adds evidence, it does not re-tune.","restatement":"initial","evidence":[]},{"version":"resrisk-v2","date":"2026-08-05","text":"follows flags-v2's word-boundary matching. SCORES MOVE, but narrowly: 4.2% of the corpus changes, mean 0.3263 -> 0.3289, rank correlation 0.995. The change is a matching fix \u2014 flags-v1's \"tie\" matched \"parties\" and credited 2,434 markets with edge-case coverage they never had. Weights unchanged. PHASE4_THRESHOLDS.md records the before/after and which flags survive a volume control. Evidence spans now come from flags.find(), the same matcher that scores, so a quoted clause cannot disagree with the number.","restatement":"restated","evidence":[{"claim":"moved","quote":"SCORES MOVE, but narrowly: 4.2% of the corpus changes, mean 0.3263 -> 0.3289, rank correlation 0.995."},{"claim":"unchanged","quote":"Weights unchanged."}]}],"history_source":"docstring","restatement_policy":"restated","restated_ever":true,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"dispute-rate","title":"Dispute Rate by Market Category","category":"trust","version":"resrisk-v2"},{"slug":"disputed-volume","title":"Disputed Volume Over Time","category":"trust","version":"resrisk-v2"},{"slug":"repeat-disputes","title":"Repeat-Dispute Leaderboard","category":"trust","version":"resrisk-v2"}],"chart_count":3,"chart_count_leading":3},{"id":"risk","module":"src/metrics/risk.py","package":"metrics","version":"risk-v1","summary":"Risk metric \u2014 reconstruction, not a clone.","title":"Risk metric \u2014 reconstruction, not a clone.","definition":[{"kind":"para","text":"Definition (v1):"},{"kind":"pre","text":"raw   = log(close) - log(SMA(close, ma_days))\nadj   = raw * index ** diminishing_factor        # index = 1..N calendar days\nrisk  = (adj - adj.expanding().min()) / (adj.expanding().max() - adj.expanding().min())"},{"kind":"para","text":"The `index ** f` term compensates for diminishing returns: log deviations from the mean shrink cycle over cycle, so later cycles need to be scaled up to reach comparable extremes. Normalisation is expanding-window on purpose \u2014 a global min/max would leak future information and make every historical value a lie."},{"kind":"para","text":"Version this. Changing `diminishing_factor` changes every historical chart."}],"functions":["compute","smooth"],"history":[{"version":"risk-v1","date":"2026-08-05","text":"f=0.395, ma=365d. Phase 0 gate: 6/6 on cycle-risk extremes. Deliberately not retuned to 0.625 to force the Apr-2021 price-date reading. See PHASE0_RESULT.md.","restatement":"initial","evidence":[]},{"version":null,"date":"2026-08-05","text":"SMOOTHING_DAYS=14 added as a display constant. compute() output UNCHANGED \u2014 the six pinned numbers do not move.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"SMOOTHING_DAYS=14 added as a display constant. compute() output UNCHANGED \u2014 the six pinned numbers do not move."}]}],"history_source":"comment","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"bubble-btc","title":"Bitcoin \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-ada","title":"Cardano \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-avax","title":"Avalanche \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-bch","title":"Bitcoin Cash \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-dot","title":"Polkadot \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-eth","title":"Ethereum \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-gold","title":"Gold \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-link","title":"Chainlink \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-ltc","title":"Litecoin \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-pol","title":"Polygon \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-silver","title":"Silver \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-sol","title":"Solana \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-spx","title":"S&P 500 \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"bubble-risk-xrp","title":"XRP \u2014 Short Term Bubble Risk","category":"risk","version":"risk-v1"},{"slug":"nfci","title":"Financial Conditions vs Bitcoin Risk","category":"macro","version":"risk-v1"},{"slug":"risk-alts-btc","title":"Risk on BTC Pairs","category":"risk","version":"risk-v1"},{"slug":"risk-alts-usd","title":"Risk on the Majors","category":"risk","version":"risk-v1"},{"slug":"risk-btc","title":"Bitcoin \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-heatmap","title":"Risk Heatmap \u2014 all tracked assets","category":"risk","version":"risk-v1"},{"slug":"risk-levels-ada","title":"Cardano \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-avax","title":"Avalanche \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-bch","title":"Bitcoin Cash \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-dot","title":"Polkadot \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-eth","title":"Ethereum \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-gold","title":"Gold \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-link","title":"Chainlink \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-ltc","title":"Litecoin \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-pol","title":"Polygon \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-silver","title":"Silver \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-sol","title":"Solana \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-spx","title":"S&P 500 \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"risk-levels-xrp","title":"XRP \u2014 Historical Risk Levels","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-ada","title":"Cardano \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-avax","title":"Avalanche \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-bch","title":"Bitcoin Cash \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-dot","title":"Polkadot \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-eth","title":"Ethereum \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-gold","title":"Gold \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-link","title":"Chainlink \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-ltc","title":"Litecoin \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-pol","title":"Polygon \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-silver","title":"Silver \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-sol","title":"Solana \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-spx","title":"S&P 500 \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"time-in-bands-xrp","title":"XRP \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"},{"slug":"timeinbands-btc","title":"Bitcoin \u2014 Time in Risk Bands","category":"risk","version":"risk-v1"}],"chart_count":46,"chart_count_leading":46},{"id":"riskstat","module":"src/metrics/riskstats.py","package":"metrics","version":"riskstat-v1","summary":"Statistics *about* the risk metric \u2014 SPEC.md Zone 5 category 1.","title":"Statistics *about* the risk metric.","definition":[{"kind":"para","text":"`risk.py` says where an asset sits. This module answers the questions that follow from that reading and are otherwise left to the reader's imagination:"},{"kind":"pre","text":"- what has historically happened *next* from each risk level,\n- how long the market has stayed at an extreme once it got there,\n- how much a lookahead-normalised version of the metric would have lied."},{"kind":"para","text":"Nothing here re-defines risk. Every function takes the risk series produced by `risk.compute` and describes it, so a change to the risk definition propagates rather than being silently duplicated."},{"kind":"para","text":"They describe what followed in the record we have; they are not a forecast and there is no out-of-sample holdout large enough to make one. Every consumer of `band_forward_returns` states the sample size beside the number, because a decile with eleven observations and a decile with two thousand are not the same claim.","lead":"Forward returns are in-sample by construction."}],"functions":["band_forward_returns","compute","excursions","forward_returns","naive_risk"],"history":[{"version":"riskstat-v1","date":"2026-08-05","text":"forward returns by risk decile, band excursions, lookahead gap against global normalisation.","restatement":"initial","evidence":[]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"forward-returns-ada","title":"Cardano \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-avax","title":"Avalanche \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-bch","title":"Bitcoin Cash \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-dot","title":"Polkadot \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-eth","title":"Ethereum \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-gold","title":"Gold \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-link","title":"Chainlink \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-ltc","title":"Litecoin \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-pol","title":"Polygon \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-silver","title":"Silver \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-sol","title":"Solana \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-spx","title":"S&P 500 \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"forward-returns-xrp","title":"XRP \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"fwdret-btc","title":"Bitcoin \u2014 Forward Returns by Risk Level","category":"risk","version":"riskstat-v1"},{"slug":"lookahead-btc","title":"Bitcoin \u2014 What Lookahead Normalisation Costs","category":"risk","version":"riskstat-v1"}],"chart_count":15,"chart_count_leading":15},{"id":"tech","module":"src/metrics/technicals.py","package":"metrics","version":"tech-v4","summary":"Technical indicators \u2014 CHART_LIBRARY.md \u00a73.5.","title":"Technical indicators.","definition":[{"kind":"para","text":"All price-only, so every one of these is free and exact. Shared contract: compute-style functions take the price frame and return a Series or DataFrame indexed by date."},{"kind":"para","text":"Every source in `src/fetch/` returns a daily CLOSE and nothing else, so anything needing a true high, low or volume is not implementable here and is absent rather than approximated. Supertrend and the ATR family are the notable casualties; a close-only ATR is a different indicator wearing the same name."}],"functions":["bollinger","bull_market_support_band","compute","donchian","ma_crossings","ma_ribbon","ma_strength","macd","mayer_multiple","moving_averages","pi_cycle","pi_cycle_crossings","realised_volatility","rsi","stochastic"],"history":[{"version":"tech-v1","date":"2026-08-05","text":"moving averages, bull market support band, Pi Cycle, Mayer multiple, RSI.","restatement":"initial","evidence":[]},{"version":"tech-v2","date":"2026-08-05","text":"MACD, Bollinger bands, MA crossings, realised volatility, MA ribbon strength. Nothing in tech-v1 was redefined \u2014 every existing series is unchanged and no historical chart moves.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"Nothing in tech-v1 was redefined \u2014 every existing series is unchanged and no historical chart moves."}]},{"version":"tech-v3","date":"2026-08-06","text":"realised_volatility() takes the annualiser as a parameter instead of hardcoding 365. The default is still 365, so every crypto series is unchanged to the last digit. Benchmarks on a five-day calendar were reading about 18% low and now do not.","restatement":"restated","evidence":[{"claim":"moved","quote":"Benchmarks on a five-day calendar were reading about 18% low and now do not."},{"claim":"unchanged","quote":"The default is still 365, so every crypto series is unchanged to the last digit."}]},{"version":"tech-v4","date":"2026-08-06","text":"Donchian channel and a close-only stochastic. Additive; nothing earlier is redefined.","restatement":"additive","evidence":[{"claim":"unchanged","quote":"Additive; nothing earlier is redefined."}]}],"history_source":"docstring","restatement_policy":"restated","restated_ever":true,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"bmsb-btc","title":"Bitcoin \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"bollinger-ada","title":"Cardano \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-avax","title":"Avalanche \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-bch","title":"Bitcoin Cash \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-btc","title":"Bitcoin \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-dot","title":"Polkadot \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-eth","title":"Ethereum \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-gold","title":"Gold \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-link","title":"Chainlink \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-ltc","title":"Litecoin \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-pol","title":"Polygon \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-silver","title":"Silver \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-sol","title":"Solana \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-spx","title":"S&P 500 \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"bollinger-xrp","title":"XRP \u2014 Bollinger Bands","category":"technicals","version":"tech-v4"},{"slug":"ma-btc","title":"Bitcoin \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-ada","title":"Cardano \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-avax","title":"Avalanche \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-bch","title":"Bitcoin Cash \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-dot","title":"Polkadot \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-eth","title":"Ethereum \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-gold","title":"Gold \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-link","title":"Chainlink \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-ltc","title":"Litecoin \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-pol","title":"Polygon \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-silver","title":"Silver \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-sol","title":"Solana \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-spx","title":"S&P 500 \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-crosses-xrp","title":"XRP \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-ada","title":"Cardano \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-avax","title":"Avalanche \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-bch","title":"Bitcoin Cash \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-dot","title":"Polkadot \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-eth","title":"Ethereum \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-gold","title":"Gold \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-link","title":"Chainlink \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-ltc","title":"Litecoin \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-pol","title":"Polygon \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-silver","title":"Silver \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-sol","title":"Solana \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-spx","title":"S&P 500 \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"ma-ribbon-xrp","title":"XRP \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"macd-ada","title":"Cardano \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-avax","title":"Avalanche \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-bch","title":"Bitcoin Cash \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-btc","title":"Bitcoin \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-dot","title":"Polkadot \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-eth","title":"Ethereum \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-gold","title":"Gold \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-link","title":"Chainlink \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-ltc","title":"Litecoin \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-pol","title":"Polygon \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-silver","title":"Silver \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-sol","title":"Solana \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-spx","title":"S&P 500 \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macd-xrp","title":"XRP \u2014 MACD","category":"technicals","version":"tech-v4"},{"slug":"macross-btc","title":"Bitcoin \u2014 Golden and Death Crosses","category":"technicals","version":"tech-v4"},{"slug":"mayer-btc","title":"Bitcoin \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-ada","title":"Cardano \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-avax","title":"Avalanche \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-bch","title":"Bitcoin Cash \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-dot","title":"Polkadot \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-eth","title":"Ethereum \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-gold","title":"Gold \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-link","title":"Chainlink \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-ltc","title":"Litecoin \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-pol","title":"Polygon \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-silver","title":"Silver \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-sol","title":"Solana \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-spx","title":"S&P 500 \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"mayer-multiple-xrp","title":"XRP \u2014 Mayer Multiple","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-ada","title":"Cardano \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-avax","title":"Avalanche \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-bch","title":"Bitcoin Cash \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-dot","title":"Polkadot \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-eth","title":"Ethereum \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-gold","title":"Gold \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-link","title":"Chainlink \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-ltc","title":"Litecoin \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-pol","title":"Polygon \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-silver","title":"Silver \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-sol","title":"Solana \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-spx","title":"S&P 500 \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"moving-averages-xrp","title":"XRP \u2014 Long Term Moving Averages","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-ada","title":"Cardano \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-avax","title":"Avalanche \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-bch","title":"Bitcoin Cash \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-dot","title":"Polkadot \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-eth","title":"Ethereum \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-link","title":"Chainlink \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-ltc","title":"Litecoin \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-pol","title":"Polygon \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-sol","title":"Solana \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"pi-cycle-xrp","title":"XRP \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"picycle-btc","title":"Bitcoin \u2014 Pi Cycle Top","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-ada","title":"Cardano \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-avax","title":"Avalanche \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-bch","title":"Bitcoin Cash \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-dot","title":"Polkadot \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-eth","title":"Ethereum \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-gold","title":"Gold \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-link","title":"Chainlink \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-ltc","title":"Litecoin \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-pol","title":"Polygon \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-silver","title":"Silver \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-sol","title":"Solana \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-spx","title":"S&P 500 \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realised-volatility-xrp","title":"XRP \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"realisedvol-btc","title":"Bitcoin \u2014 Realised Volatility","category":"technicals","version":"tech-v4"},{"slug":"ribbon-btc","title":"Bitcoin \u2014 Moving Average Ribbon","category":"technicals","version":"tech-v4"},{"slug":"rsi-ada","title":"Cardano \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-avax","title":"Avalanche \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-bch","title":"Bitcoin Cash \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-btc","title":"Bitcoin \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-dot","title":"Polkadot \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-eth","title":"Ethereum \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-gold","title":"Gold \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-link","title":"Chainlink \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-ltc","title":"Litecoin \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-pol","title":"Polygon \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-silver","title":"Silver \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-sol","title":"Solana \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-spx","title":"S&P 500 \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"rsi-xrp","title":"XRP \u2014 Relative Strength Index (14d)","category":"technicals","version":"tech-v4"},{"slug":"support-band-ada","title":"Cardano \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-avax","title":"Avalanche \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-bch","title":"Bitcoin Cash \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-dot","title":"Polkadot \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-eth","title":"Ethereum \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-gold","title":"Gold \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-link","title":"Chainlink \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-ltc","title":"Litecoin \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-pol","title":"Polygon \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-silver","title":"Silver \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-sol","title":"Solana \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-spx","title":"S&P 500 \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"},{"slug":"support-band-xrp","title":"XRP \u2014 Bull Market Support Band","category":"technicals","version":"tech-v4"}],"chart_count":137,"chart_count_leading":137},{"id":"uma","module":"src/resolution/uma.py","package":"resolution","version":"uma-v1","summary":"UMA's DVM: who settles disputes, with what stake, which way, and when slashed.","title":"UMA's DVM: who settles disputes, with what stake, which way, and when slashed.","definition":[{"kind":"para","text":"Zone 11 has held dispute EVENTS since the Gamma pull \u2014 758 markets contested at least once. It has never held the VOTING. This module is that half: the VotingV2 event log on Ethereum mainnet, read directly."},{"kind":"heading","text":"WHY NOT THE SUBGRAPH (kept, because it cost a day to establish)"},{"kind":"para","text":"`docs.uma.xyz/resources/subgraph-data` points at The Graph, and every UMA doc page and tutorial still links to the hosted service. Measured 2026-08-05:"},{"kind":"pre","text":"api.thegraph.com/subgraphs/name/umaprotocol/mainnet-voting\n    HTTP 301 -> error.thegraph.com/apierror.json. The hosted service is\n    sunset.\ngateway.thegraph.com/api/subgraphs/id/<id>\n    HTTP **200** carrying {\"errors\":[{\"message\":\"auth error: missing\n    authorization header\"}]}. Note the 200: a fetcher that checks the status\n    code and not the body caches that as a dataset."},{"kind":"para","text":"The decentralised gateway needs a Graph Studio key, and Graph Studio authenticates with a crypto wallet. That is a wallet to reach a convenience layer over data that is public. The contract is public, `eth_getLogs` is public, and the subgraph was only ever an index of the same events \u2014 so this module reads them at the source. `SPEC.md` Appendix B's \"auth: none\" row was true right up until it was not."},{"kind":"heading","text":"THE CONTRACTS"},{"kind":"pre","text":"VotingV2   0x004395edb43EFca9885CEdad51EC9fAf93Bd34ac   from block 16,697,232\n                                                        (2023-02-24)\nVoting     0x8B1631ab830d11531aE83725fDa4D86012eCCd77   the predecessor"},{"kind":"para","text":"Every row records `contract` and every table records its block range. The two schemas are not identical \u2014 V2 added `VoterSlashed` per request, staking, and delegation \u2014 so they are never merged silently."},{"kind":"para","text":"Zone 11's 758 disputed markets settle between 2025-03-30 and 2026-08-05, because Gamma only populates `umaResolutionStatuses` from 2025 onward. VotingV2 has been live since 2023-02-24. Zero disputed markets in the corpus predate it, so V2 alone covers every dispute this repo can observe \u2014 measured, not assumed. If the corpus ever gains earlier disputes, V1 becomes necessary and its rows must stay in their own table.","lead":"V1 is not read, and does not need to be."},{"kind":"heading","text":"EVENT SIGNATURES ARE COMPUTED, NOT REMEMBERED"},{"kind":"para","text":"`EVENTS` below carries ABI type lists, and `topic0()` hashes them with `src/fetch/keccak.py` at call time. The signatures came from `@uma/contracts-node`'s `VotingV2.json` artifact, and all ten topic0 values in a live 4,220-block sample matched an entry here. A topic0 copied from a blog post decodes the wrong event's fields into the right-looking columns and nothing anywhere errors."},{"kind":"heading","text":"WHAT THE VOTE VALUES MEAN"},{"kind":"para","text":"`price` on a `VoteRevealed` is an int256 in UMA's 18-decimal fixed point. For the YES_OR_NO_QUERY identifier that Polymarket uses, 0 is NO, 1e18 is YES, 0.5e18 is UNRESOLVABLE, and `type(int256).min` is \"too early\". `vote_label` maps those and returns the raw value for anything else rather than guessing \u2014 other identifiers use the same field for a numeric answer."}],"functions":["caller_concentration","decode_logs","delegation_blocs","herfindahl","request_concentration","slash_evidence","slash_reasons","topic0","vote_label","voter_agreement","voter_concentration","voter_evidence"],"history":[{"version":"uma-v1","date":"2026-08-06","text":"VotingV2 reveals, slashing and resolutions read straight from mainnet logs. Replaces the subgraph route entirely.","restatement":"initial","evidence":[]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-06","charts":[],"chart_count":0,"chart_count_leading":0},{"id":"val","module":"src/metrics/valuation.py","package":"metrics","version":"val-v1","summary":"Valuation multiples and the asymmetric regression fan \u2014 Zone 5 category 2.","title":"Valuation multiples and the asymmetric regression fan.","definition":[{"kind":"para","text":"Two kinds of thing live here, and the difference matters more than the code."},{"kind":"para","text":"\u2014 the Golden Ratio Multiplier and the two-year multiplier \u2014 are a moving average times a constant somebody picked because it fitted the chart. There is no mechanism. They are included because they are widely watched and a library that omits them is answering a question nobody asked, and every one of them ships with its own *empirical* expanding percentile beside the constant, so a reader can see whether the folklore level and this asset's actual record agree. Often they do not.","lead":"Folklore multiples"},{"kind":"para","text":"is the honest counterpart: expanding quantiles of the log regression residual, so the band above the fit and the band below are allowed to be different widths. Crypto's residual distribution is not symmetric and a \u00b1k-sigma band asserts that it is.","lead":"The asymmetric fan"},{"kind":"para","text":"Everything is expanding. A multiple's percentile in 2015 is computed from 2015's record and no later day, exactly as `risk.py` does it."}],"functions":["base_multiple","compute","expanding_percentile","fan","golden_ratio_bands","two_year_bands"],"history":[{"version":"val-v1","date":"2026-08-05","text":"golden ratio multiplier, two-year multiplier, expanding multiple percentiles, asymmetric quantile fan.","restatement":"initial","evidence":[]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[{"slug":"fan-btc","title":"Bitcoin \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-ada","title":"Cardano \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-avax","title":"Avalanche \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-bch","title":"Bitcoin Cash \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-dot","title":"Polkadot \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-eth","title":"Ethereum \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-link","title":"Chainlink \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-ltc","title":"Litecoin \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-pol","title":"Polygon \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-sol","title":"Solana \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"golden-ratio-xrp","title":"XRP \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"goldenratio-btc","title":"Bitcoin \u2014 Golden Ratio Multiplier","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-ada","title":"Cardano \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-avax","title":"Avalanche \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-bch","title":"Bitcoin Cash \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-dot","title":"Polkadot \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-eth","title":"Ethereum \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-link","title":"Chainlink \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-ltc","title":"Litecoin \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-pol","title":"Polygon \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-sol","title":"Solana \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logreg-oscillator-xrp","title":"XRP \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"logregosc-btc","title":"Bitcoin \u2014 Distance from Log Regression","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-ada","title":"Cardano \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-avax","title":"Avalanche \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-bch","title":"Bitcoin Cash \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-dot","title":"Polkadot \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-eth","title":"Ethereum \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-link","title":"Chainlink \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-ltc","title":"Litecoin \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-pol","title":"Polygon \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-sol","title":"Solana \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"quantile-fan-xrp","title":"XRP \u2014 Asymmetric Quantile Fan","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-ada","title":"Cardano \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-avax","title":"Avalanche \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-bch","title":"Bitcoin Cash \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-dot","title":"Polkadot \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-eth","title":"Ethereum \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-link","title":"Chainlink \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-ltc","title":"Litecoin \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-pol","title":"Polygon \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-sol","title":"Solana \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"two-year-multiplier-xrp","title":"XRP \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"},{"slug":"twoyear-btc","title":"Bitcoin \u2014 Two-Year Moving Average Multiplier","category":"valuation","version":"val-v1"}],"chart_count":44,"chart_count_leading":33},{"id":"verify","module":"src/resolution/verify.py","package":"resolution","version":"verify-v1","summary":"Phase 4 step 3, stage two \u2014 LLM verification of candidate links.","title":"Phase 4 step 3, stage two \u2014 LLM verification of candidate links.","definition":[{"kind":"para","text":"Stage one (`matching.py`) proposes pairs by text similarity and is deliberately crude. This stage reads both contracts in full \u2014 question plus rules text on each side \u2014 and answers one question: do these resolve on the same underlying event?"},{"kind":"para","text":"It writes `llm_verdict`, `llm_confidence` and `llm_reason`. `verified` is set by a human reading the top pairs by volume, which is the layer RESOLUTION_DB calls uncopyable. A test pins that separation.","lead":"This never sets `verified`."},{"kind":"para","text":"Provider-agnostic over any OpenAI-compatible chat-completions endpoint. Groq and xAI are both supported; note these are different companies with confusingly similar names \u2014 Groq (`gsk_` keys, api.groq.com) serves open models; xAI (`xai-` keys) serves Grok. Set CL_LLM_PROVIDER, or let the key prefix pick."},{"kind":"para","text":"The reasons matter as much as the verdicts: \"same event, but Kalshi settles on the BLS print and Polymarket on media consensus\" is already a Phase 4 source flag, not just a rejected match."}],"functions":["base_url","build_prompt","estimate","key_env","list_models","max_tokens_for","provider","verify_pair"],"history":[{"version":"verify-v1","date":"2026-08-05","text":"xAI chat-completions, JSON verdicts, resumable cache.","restatement":"initial","evidence":[]}],"history_source":"docstring","restatement_policy":"additive","restated_ever":false,"unclear":[],"first_date":"2026-08-05","charts":[],"chart_count":0,"chart_count_leading":0}],"by_version":{"align-v1":"align","align-v2":"align","alt-v1":"alt","breadth-v1":"breadth","breadth-v2":"breadth","cat-v1":"cat","cycle-v1":"cycle","cycle-v2":"cycle","cycle-v3":"cycle","cycle-v4":"cycle","cycle-v5":"cycle","dom-v1":"dom","flags-v1":"flags","flags-v2":"flags","implied-v1":"implied","latency-v1":"latency","logreg-v1":"logreg","logreg-v2":"logreg","match-v1":"match","match-v2":"match","match-v3":"match","resdb-v1":"resdb","resdb-v2":"resdb","resrisk-v1":"resrisk","resrisk-v2":"resrisk","risk-v1":"risk","riskstat-v1":"riskstat","tech-v1":"tech","tech-v2":"tech","tech-v3":"tech","tech-v4":"tech","uma-v1":"uma","val-v1":"val","verify-v1":"verify"},"charts_joined":true,"chart_count":396,"unknown_versions":{},"stale_stamps":[]}