Cryptolean
// Transparency notice

Every number here can move.

Not the values — those are fixed the day they are computed. The definitions. Retuning a metric silently rewrites every historical chart drawn with it, so each definition carries a version, a change to the definition changes the version, and every change is below with its date and its reason.

Generated from src/metrics/, src/resolution/
// 19 versioned metrics35 recorded changes3 ever restated410 charts stamped26 not stamped

Is a value ever restated?

A published value is never edited in place. Every series is computed from a daily close and normalised against an expanding window, so the value plotted for a past date depends only on that date and the dates before it. Tomorrow's data cannot reach backwards and change it. That is the whole reason the normalisation is expanding rather than global, and it is why our backtests look worse than the ones that are not.

A definition change restates everything at once, and says so. If a formula changes — a different constant, a different window, a fixed bug — every historical value drawn from it changes with it. That is a restatement, it is not avoidable, and the only honest handling is to make it visible: the version string changes, every chart carrying it changes stamp on the same day, and the entry below records what moved. Of the 19 metrics here, 3 have ever restated a historical value.

Nothing is silently backfilled. A gap in a source stays a gap on the chart. Where a filter removes days — the prediction-market ladders lose illiquid ones — the filter is named on the chart that lost them.

3 recorded changes do not state whether values moved. They are marked unclear below rather than assumed harmless. An entry that cannot answer the question is a defect in our own record and is listed as one.

Metrics in production

One row per version that a chart on this site actually carries, counted from the exported payloads rather than from the code — so a definition that ships to nothing does not appear, and one that ships to a hundred charts cannot be understated. Current means the module produces this version today.

VersionDefined inChartsFamiliesFirst datedCurrentMetric ever restated
tech-v5unrecorded13710superseded
cycle-v5src/metrics/cycles.py11396 Aug 2026yesno
risk-v1src/metrics/risk.py4895 Aug 2026yesno
logreg-v2src/metrics/logreg.py3336 Aug 2026yesno
val-v1src/metrics/valuation.py3335 Aug 2026yesno
riskstat-v1src/metrics/riskstats.py1525 Aug 2026yesno
cycleroi-v2unrecorded102superseded
implied-v1src/metrics/implied.py445 Aug 2026yesno
latency-v1src/resolution/latency.py445 Aug 2026yesno
dom-v1src/metrics/dominance.py335 Aug 2026yesno
breadth-v2src/metrics/breadth.py339 Aug 2026yesno
resrisk-v2src/resolution/risk_score.py335 Aug 2026yesyes
alt-v1src/metrics/altseason.py115 Aug 2026yesno
stable-v1unrecorded11superseded
align-v2src/metrics/alignment.py116 Aug 2026yesno
calib-v1unrecorded11superseded

4 of these versions reach a chart but have no entry in the catalogue, and are marked unrecorded above. A version in production with no recorded definition is a gap in this notice, not a formatting choice.

The ledger

Every version each module has declared, in date order, with the reason recorded at the time rather than reconstructed afterwards. An entry with no version of its own is an amendment that changed no computed value. The full definition of any metric is on its catalogue page; this is only the record of what changed and when.

align src/metrics/alignment.py · now align-v2

  • align-v12026-08-05initial
    blockchain_com offset measured at −1 day; Binance and Yahoo at 0. Applied to cross-source charts only.First version — nothing existed before it to restate.
  • align-v22026-08-06additive
    sessions(), periods_per_year(), common_returns() and the crypto/benchmark symbol split. align-v1's offsets are unchanged and no existing series moves.Added series or functions. No existing value changed.

alt src/metrics/altseason.py · now alt-v1

  • alt-v12026-08-05initial
    top-50 by basket cap, 90d cap return vs BTC, stables excluded.First version — nothing existed before it to restate.

breadth src/metrics/breadth.py · now breadth-v2

  • breadth-v12026-08-05initial
    share above own moving average, advance/decline ratio and cumulative line, rolling pairwise correlation.First version — nothing existed before it to restate.
  • breadth-v22026-08-09additive
    macro_correlation(): the rolling correlation the macro charts were computing inline. Additive — 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.Added series or functions. No existing value changed.

cat src/resolution/categories.py · now cat-v1

  • cat-v12026-08-05initial
    eight buckets, keyword and marker rules, first match wins.First version — nothing existed before it to restate.

cycle src/metrics/cycles.py · now cycle-v5

  • cycle-v12026-08-05initial
    drawdown, anchored ROI, monthly return grid.First version — nothing existed before it to restate.
  • cycle-v22026-08-05additive
    calendar-year returns, rolling ROI, run streaks, days since a decline, DCA-by-weekday. cycle-v1's series are untouched: no existing chart moves.Added series or functions. No existing value changed.
  • cycle-v32026-08-06additive
    seasonal_ytd() and milestones(). Additive again — every v1 and v2 series is unchanged and only the stamp moves.Added series or functions. No existing value changed.
  • cycle-v42026-08-06additive
    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.Added series or functions. No existing value changed.
  • cycle-v52026-08-06additive
    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.Added series or functions. No existing value changed.

dom src/metrics/dominance.py · now dom-v1

  • dom-v12026-08-05initial
    CapMrktEstUSD basket, 2019-01-01 onward.First version — nothing existed before it to restate.

flags src/resolution/flags.py · now flags-v2

  • flags-v12026-08-05initial
    subjective wording, missing source, timezone, edge-case coverage, dispute history. Substring matching.First version — nothing existed before it to restate.
  • flags-v22026-08-05restated
    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 — see DEFAULT_WEIGHTS.Historical values moved. What moved and by how much is recorded.

implied src/metrics/implied.py · now implied-v1

  • implied-v12026-08-05initial
    outcome panels from daily candles, raw sum reported.First version — nothing existed before it to restate.

latency src/resolution/latency.py · now latency-v1

  • latency-v12026-08-05initial
    close_time -> settlement_time, signed, three populations, censoring counted not dropped.First version — nothing existed before it to restate.

logreg src/metrics/logreg.py · now logreg-v2

  • logreg-v12026-08-05initial
    expanding OLS on (log t, log price), residual-sigma bands.First version — nothing existed before it to restate.
  • logreg-v22026-08-06additive
    `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.Added series or functions. No existing value changed.

match src/resolution/matching.py · now match-v3

  • match-v12026-08-05initial
    TF-IDF cosine candidates, unverified by construction.First version — nothing existed before it to restate.
  • match-v22026-08-05unclear
    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" — "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.The entry does not state whether values moved. Treat as unresolved.
  • match-v32026-08-05unclear
    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 — "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.The entry does not state whether values moved. Treat as unresolved.

resdb src/resolution/schema.py · now resdb-v2

  • resdb-v12026-08-05initial
    markets + resolutions + candidate links + single-venue flags.First version — nothing existed before it to restate.
  • resdb-v22026-08-05unclear
    `settlement_time` added — when a contract ACTUALLY settled, which on Kalshi is not `expiry_time`. See below.The entry does not state whether values moved. Treat as unresolved.

resrisk src/resolution/risk_score.py · now resrisk-v2

  • resrisk-v12026-08-05initial
    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 — this version adds evidence, it does not re-tune.First version — nothing existed before it to restate.
  • resrisk-v22026-08-05restated
    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 — 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.Historical values moved. What moved and by how much is recorded.

risk src/metrics/risk.py · now risk-v1

  • risk-v12026-08-05initial
    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.First version — nothing existed before it to restate.
  • ↳ amendment2026-08-05additive
    SMOOTHING_DAYS=14 added as a display constant. compute() output UNCHANGED — the six pinned numbers do not move.Added series or functions. No existing value changed.

riskstat src/metrics/riskstats.py · now riskstat-v1

  • riskstat-v12026-08-05initial
    forward returns by risk decile, band excursions, lookahead gap against global normalisation.First version — nothing existed before it to restate.

tech src/metrics/technicals.py · now tech-v4

  • tech-v12026-08-05initial
    moving averages, bull market support band, Pi Cycle, Mayer multiple, RSI.First version — nothing existed before it to restate.
  • tech-v22026-08-05additive
    MACD, Bollinger bands, MA crossings, realised volatility, MA ribbon strength. Nothing in tech-v1 was redefined — every existing series is unchanged and no historical chart moves.Added series or functions. No existing value changed.
  • tech-v32026-08-06restated
    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.Historical values moved. What moved and by how much is recorded.
  • tech-v42026-08-06additive
    Donchian channel and a close-only stochastic. Additive; nothing earlier is redefined.Added series or functions. No existing value changed.

uma src/resolution/uma.py · now uma-v1

  • uma-v12026-08-06initial
    VotingV2 reveals, slashing and resolutions read straight from mainnet logs. Replaces the subgraph route entirely.First version — nothing existed before it to restate.

val src/metrics/valuation.py · now val-v1

  • val-v12026-08-05initial
    golden ratio multiplier, two-year multiplier, expanding multiple percentiles, asymmetric quantile fan.First version — nothing existed before it to restate.

verify src/resolution/verify.py · now verify-v1

  • verify-v12026-08-05initial
    xAI chat-completions, JSON verdicts, resumable cache.First version — nothing existed before it to restate.

Charts carrying no version

26 of the 436 charts on this site do not carry a metric version. The metrics behind them are versioned in the code like every other — what is missing is the stamp on the payload, so these charts cannot be traced to an entry above. Until they can, this is what a reader is missing, by family:

FamilyChartsLast computed
Bitcoin: Market Capitalization86 Aug 2026
Bitcoin: Hash Rate16 Aug 2026
Bitcoin: Network Difficulty16 Aug 2026
Bitcoin: Miner Revenue16 Aug 2026
Bitcoin: Transaction Fees16 Aug 2026
Bitcoin: Mempool Transaction Count17 Aug 2026
Bitcoin: UTXO Count17 Aug 2026
Bitcoin: MVRV Ratio14 Aug 2026
Total Stablecoin Supply (USD)17 Aug 2026
Total DeFi TVL (USD)17 Aug 2026
Decentralized Exchange Volume17 Aug 2026
Protocol Fees17 Aug 2026
Protocol Revenue17 Aug 2026
Holders Revenue17 Aug 2026
Bitcoin Priced in Gold17 Aug 2026
Bitcoin against the Benchmarks17 Aug 2026
Dollar Index vs Bitcoin131 Jul 2026
10-Year Treasury Yield vs Bitcoin15 Aug 2026
M2 Money Supply vs Bitcoin11 Jun 2026

This table is generated, so it shrinks on its own as the export starts stamping those families and disappears when none are left. It is here rather than fixed-and-forgotten because a page claiming to list every metric in production has to account for the charts it cannot.

The export format

Series are versioned separately from metrics. The payload format is web-v6, and it is stamped on every chart page beside the metric version. A format change moves no value — it changes how the numbers are packed for the browser — but it is versioned for the same reason: a renderer written for the previous shape should fail loudly rather than draw an empty plot.

The export also deletes any payload the manifest no longer lists. None were removed on the last run. A chart dropped from the registry that keeps its file is still answering deep links with whatever numbers it held on the day it was dropped.

What this page does not cover

This is a disclosure about metric mutability, not a security posture. There is no SOC 2 report, no penetration-test summary and no uptime commitment, and there will not be until there is a customer for whom those mean something. Claiming otherwise on a static site with no accounts would be the cheapest possible lie.

Freshness is not covered either, beyond this: every series is a daily close from a free public endpoint, cached to disk before it is processed, and it lags the market by hours. The date on a chart is the date it was computed. Nothing here is real-time and nothing here should be traded off as though it were.

// Related

The study we published against ourselves.

The same principle applied to a feature rather than a formula: we replicated the paper our own pitch rested on, it did not hold, and the tier that would have sold it was deleted rather than repriced.