Research · Methods
Methods, Audit and Changelog
The methodology, audits and change history behind every research page. Use this page to understand how a number was calculated, which sources produced it, what alternatives were tested, what was rejected, and what has changed.
Current readings
Computed from the daily public snapshot for 14 October 2026, published 2026-10-15 11:22 UTC. The charts and tables below are drawn in the browser from the same file; these figures are the ones they show.
| Sources in the snapshot | 15 | see the provenance table |
|---|---|---|
| Errors at the last run | 0 | |
| Stale sources | 0 | |
| Self-test | ok | headline numbers re-derived independently |
Current build status
- Last verified15 October 2026
- Scorecardfetch/scorecard.py → data/scorecard.json, recomputed each run; thirty-six rules scored against opportunity-set baselines, thirty external and six of the site’s own
- Glossary41 terms, /tools/glossary
- Tests137 pipeline tests in tests/, run before every daily snapshot; six browser harnesses in the build
- Pages38: the dashboard, twenty research pages, fifteen tested-claim pages, a glossary and this one; ten reconciled cell by cell against an independent Python computation, the Relative Value page reconciled for its gold, S&P 500, calendar and rotation panels with the ether, Solana and correlation panels pending real figures from the source
- Data sources13 external source families in the snapshot (macro added); LPPL, the composite and the research layers are derived from them, not counted (plus a hand-maintained references file and a derived KPI file), no errors and none stale at the last scheduled run
- ETF issuer coveragedaily: 5 measured from primary disclosures (OBTC added), 8 documented as publishing no daily coin count (MSBT assessed and added); quarterly: SEC 10-Q/10-K reconciliation attempted across the 13-name universe; 7 currently resolve to a recognised coin-quantity XBRL concept (IBIT, FBTC, GBTC, BTC, ARKB, EZBC, OBTC); the rest are reported unresolved with what they do tag from its own 10-Q/10-K via EDGAR XBRL, as a reconciliation layer; universe last checked 2 September 2026
- Open itemthe node pipeline is written and tested but not running; it needs hardware
- Current LPPLS record561 signal days in 18 runs under the current specification (Gerlach 2019 filters, critical time searched on the full permitted interval to an exact boundary): a 40% fall within a year followed 28% of them against 34% of all days, a doubling 64% against 53%, random-block probability 0.67. The 424- and 525-day figures in the dated entries below belong to superseded search specifications and are retained only as history.
Corrections to published figures, and changes to any model specification, are announced as they happen on Crypto Exponentials. If you rely on numbers from this site, that is the list to be on.
Everything below is a dated changelog in the order things happened, so earlier entries describe implementations that later entries superseded: the ETF section records three issuers as outstanding in one entry and the survey as complete in a later one, and both were true when written. This panel is the current state.
Bitcoin Metcalfe Value Monitor: audit and sign-off
Prepared for CryptoExponentials. Date: 1 September 2026. File audited: bitcoin-metcalfe-monitor.html (final build).
1. Scope
The page computes a Metcalfe's Law network valuation of Bitcoin from public on-chain data and displays it against price with regime, distribution, forward-return, specification-comparison, out-of-sample validation and data-audit panels. This audit covers: (a) the correctness of every computation the page performs; (b) the integrity of the data pipeline; (c) the statistical validity of the default specification; (d) runtime behaviour across all user controls.
Data used for the audit: the page's own CSV export of 5,858 daily rows, 18 August 2010 to 1 September 2026, sourced from the Blockchain.com Charts API (market-price, n-unique-addresses, total-bitcoins, n-transactions), with a Coinbase spot price of $78,274.
2. Method
- Line-by-line review of the computation code (data alignment, effective supply, user-series construction, least-squares fit, residual statistics, distribution statistics, forward returns, validation loop, rendering).
- The page was executed unmodified against the real data with the production chart engine in a headless DOM with a canvas renderer, and every displayed cell was captured.
- Every captured cell was recomputed independently in Python (pandas, numpy) from the same input columns and compared.
- Every user control combination (4 user definitions, 1 model in the selector plus 2 diagnostic forms in the comparison tables, 6 lost-coin rates, 3 smoothing windows, 5 fit windows, halving toggle, 5 range presets) was exercised for runtime errors.
3. Cell-by-cell reconciliation
Tolerance is the display rounding of each cell. Page value on the left, independent Python value on the right.
| Cell | Page | Python | Result |
|---|---|---|---|
| effective supply today (M BTC) | 15.63 | 15.63 | PASS |
| share of supply lost today % | 22.2 | 22.2 | PASS |
| Metcalfe value today | 83,236 | 83,236 | PASS |
| Premium (live price) | -6.1 | -6.1 | PASS |
| Deviation z | -0.13 | -0.13 | PASS |
| sigma pts | 47.6 | 47.6 | PASS |
| Percentile | 47 | 47 | PASS |
| Cumulative address-activity proxy (B) | 2.38 | 2.38 | PASS |
| Addresses YoY % | 8.1 | 8.1 | PASS |
| k | 2.29e-07 | 2.29e-07 | PASS |
| Fit window days | 3530.0 | 3530 | PASS |
| R2 window | 0.843 | 0.843 | PASS |
| R2 full | 0.757 | 0.757 | PASS |
| Residual skew | 0.29 | 0.29 | PASS |
| Excess kurtosis | -0.60 | -0.60 | PASS |
| sigma (fit panel) | 47.6 | 47.6 | PASS |
| Largest premium | +150% on Dec 17, 2017 | +150% on Dec 17, 2017 | PASS |
| Largest discount | -98% on Mar 13, 2020 | -98% on Mar 13, 2020 | PASS |
| p10 | -60 | -60 | PASS |
| median | -2 | -2 | PASS |
| p90 | 60 | 60 | PASS |
| Ribbon low year | Low 2020 | Low 2020 | PASS |
| Ribbon high year | High 2017 | High 2017 | PASS |
| Days above value % | 48 | 48 | PASS |
| Median premium | -1.9 | -1.9 | PASS |
| p30..p70 | -34% to +27% | -34% to +27% | PASS |
| Current state days | 290.0 | 290 | PASS |
| Last crossing date | May 16, 2026 | May 16, 2026 | PASS |
| Streak start date | Nov 15, 2025 | Nov 15, 2025 | PASS |
| bucket 0 count | 590.0 | 590 | PASS |
| bucket 0 share % | 16.7 | 16.7 | PASS |
| bucket 0 median 90d | 45 | 45 | PASS |
| bucket 0 median 180d | 102 | 102 | PASS |
| bucket 0 median 365d | 138 | 138 | PASS |
| bucket 1 count | 668.0 | 668 | PASS |
| bucket 1 share % | 18.9 | 18.9 | PASS |
| bucket 1 median 90d | 12 | 12 | PASS |
| bucket 1 median 180d | 43 | 43 | PASS |
| bucket 1 median 365d | 153 | 153 | PASS |
| bucket 2 count | 578.0 | 578 | PASS |
| bucket 2 share % | 16.4 | 16.4 | PASS |
| bucket 2 median 90d | 9 | 9 | PASS |
| bucket 2 median 180d | 13 | 13 | PASS |
| bucket 2 median 365d | 75 | 75 | PASS |
| bucket 3 count | 555.0 | 555 | PASS |
| bucket 3 share % | 15.7 | 15.7 | PASS |
| bucket 3 median 90d | 0 | 0 | PASS |
| bucket 3 median 180d | 13 | 13 | PASS |
| bucket 3 median 365d | 58 | 58 | PASS |
| bucket 4 count | 621.0 | 621 | PASS |
| bucket 4 share % | 17.6 | 17.6 | PASS |
| bucket 4 median 90d | -4 | -4 | PASS |
| bucket 4 median 180d | -13 | -13 | PASS |
| bucket 4 median 365d | -25 | -25 | PASS |
| bucket 5 count | 440.0 | 440 | PASS |
| bucket 5 share % | 12.5 | 12.5 | PASS |
| bucket 5 median 90d | -11 | -11 | PASS |
| bucket 5 median 180d | -19 | -19 | PASS |
| bucket 5 median 365d | -48 | -48 | PASS |
| bucket 6 count | 78.0 | 78 | PASS |
| bucket 6 share % | 2.2 | 2.2 | PASS |
| bucket 6 median 90d | -43 | -43 | PASS |
| bucket 6 median 180d | -48 | -48 | PASS |
| bucket 6 median 365d | -70 | -70 | PASS |
| spec n2 value | 83,236 | 83,236 | PASS |
| spec n2 premium | -6 | -6 | PASS |
| spec n2 sigma | 48 | 48 | PASS |
| spec n2 R2 | 0.843 | 0.843 | PASS |
| spec fitted value | 88,661 | 88,661 | PASS |
| spec fitted premium | -12 | -12 | PASS |
| spec fitted sigma | 47 | 47 | PASS |
| spec fitted R2 | 0.845 | 0.845 | PASS |
| spec activity value | 78,403 | 78,403 | PASS |
| spec activity premium | -0 | -0 | PASS |
| spec activity sigma | 47 | 47 | PASS |
| spec activity R2 | 0.847 | 0.847 | PASS |
| OOS RMSE | 49 | 49 | PASS |
| OOS bias | 7 | 7 | PASS |
| OOS refit min | 72,844 | 72,844 | PASS |
| OOS refit max | 86,142 | 86,142 | PASS |
| OOS refits | 7 | 7 | PASS |
| OOS predicted days | 2435.0 | 2435 | PASS |
| audit price min | 0.06 | 0.06 | PASS |
| audit price max | 124,777 | 124,777 | PASS |
| audit supply latest | 20,077,669 | 20,077,669 | PASS |
| audit days | 5858.0 | 5858 | PASS |
Result: 86 of 86 pass after one fix; re-verified after finding 14 (9 specification rows, default value unchanged at $83,236) (the validation loop previously counted an empty refit dated the following January; corrected).
4. Code review findings and fixes applied during the audit
| # | Finding | Severity | Fix |
|---|---|---|---|
| 1 | Chart library color mapping threw inside the engine, aborting all panels after the premium chart | Blocking | Replaced with explicit area series |
| 2 | Daily unique addresses used as n; a flow, not a user stock; value ~$9k | Model | Cumulative address stock; four alternatives retained for comparison |
| 3 | Address feed missing ~40 days; cumulative took zero-then-double increments | Data | Linear interpolation of missing days; increments now equal the daily series |
| 4 | Full-history fit through 2010 to 2013 inflated σ to 150 points and pushed k up | Calibration | Default window 2017 onward; earlier years drawn as out of sample |
| 5 | Distribution statistics (percentile, extremes, regimes, forward returns) included out-of-sample years | Statistics | Restricted to fit window |
| 6 | R² reported on full history only, mislabelled for the default model | Reporting | In-window and full-history R² reported separately |
| 7 | Regime bands at ±σ multiples on right-skewed residuals | Statistics | Empirical percentile cuts (10/30/70/90) |
| 8 | Regime-share panel became tautological after (7) | Reporting | Replaced with fixed premium-bucket shares |
| 9 | Free-fitted affinity decay chose a negative sign, contradicting the published positive decay | Model | Removed; replaced by lost-coin decay of supply (positive by construction) |
| 10 | "Best fit" half-life selected on full-history R², rewarding fast decay | Calibration | Selection on 2014 onward; default 8 years |
| 11 | Validation loop counted one refit with no predicted days | Reporting | Loop bounded to the last data year |
| 12 | Smoothing control shown when irrelevant | UX | Shown only for the activity specification |
| 13 | Fitted-exponent and activity-adjusted forms selectable as headline values despite failing stability | Presentation | Removed from the model selector; retained in comparison tables labelled diagnostic, with out-of-sample error and validation status per row |
| 14 | Daily unique addresses offered as a user definition; produced $6k to $23k valuations with R² near zero | Model | Removed from the selector and comparison table; documented in the method note as tested and rejected |
5. Validation of the default specification
Default at the time of this validation: cumulative address-activity proxy as n, exponent fixed at 2, lost-coin decay 2% per year of each vintage, fit window 2017 onward. (Superseded: the shipped defaults are now fit-from-2011 with no lost-coin adjustment, per the lost-coin control redesign and calibration change notes below; the validation conclusions are unchanged.)
- In-sample: R² 0.843, residual σ 47.6 points, skew 0.29, excess kurtosis −0.60 (near symmetric).
- Out of sample (fit through each 31 December, predict the next year, seven refits, 2,435 predicted days): RMSE 49 points, bias +7 points.
- Stability: today's value across those refits $72,844 to $86,142; current value $83,236.
- Comparison: fitted-exponent and activity-adjusted forms reach RMSE 58 to 99 with refit ranges spanning a factor of 2 to 100; the full-history fit has RMSE 167 and bias −143 points. These are shown on the page and should not be quoted as headline values.
6. Data integrity checks (automated on the page, all passing)
Daily calendar continuous; supply never decreases; all prices positive; value recomputed from k, n and effective supply at the last day matches the chart; mean log residual in the fit window is zero to machine precision; premium at last close recomputed matches the series; live price within 0.8% of last daily close; percentile computed over 3,530 fit-window days.
7. Sign-off
Signed off: the arithmetic of every displayed value; the data pipeline; the runtime across all controls; the default specification as a validated estimate with stated error.
Not signed off, and not to be presented as such: any claim that the value is a price target; the non-default specifications as headline numbers; agreement with any third-party proprietary figure. The Metcalfe value is a model estimate with roughly 50 log points of one-year prediction error, and the page states this.
Conditions for hosting: open the page once on live data and confirm the Data audit checks are all green and the Out-of-sample validation panel names the fixed-exponent, since-2017 row as lowest error. If both hold, the build is ready.
8. Macro overlay (Cane Island MAC) tested and not adopted
Specification tested: log price = k + ln(n²/S_eff) + β·ln(broad dollar index) + γ·(fed funds rate), month-start observations, sources FRED DTWEXBGS and FEDFUNDS via a public mirror. Result on the 2017 window: in-sample σ improves from 47.0 to 45.0 points; out-of-sample RMSE worsens from 49 to 64 points and bias from +7 to +52; today's value across annual refits widens from $71k–$84k to $26k–$78k. On the 2014 window: R² improves from 0.85 to 0.93 while out-of-sample RMSE worsens from 55 to 69. The dollar coefficient is negative and large but unstable; the rate coefficient changes sign across windows. The overlay is not adopted. Scope: Cane Island's exact variables are unpublished; this test covers the two natural public proxies only.
9. External references panel
The page carries a hand-maintained, dated table of external estimates (Cane Island MET $138,557 and MAC $109,000 as of 1 September 2026), showing price versus each and each versus the page's value. These are display only and enter no calculation. To refresh them, edit the REFERENCES block near the top of the script. (Superseded on 2 September 2026: the figures now live in the hand-maintained data/references.json, read by the hub and the Metcalfe page.)
10. Claim level
The page's method note states its claim level explicitly: descriptive fit and one-year forecasting error are claimed and tested; price targets and causation are not claimed. The known causal weakness, feedback from price to address counts, is stated on the page.
11. Site integration
The page adopts the cryptoexponentials.com design system taken from index.html: colour tokens (obsidian background, gold, cyan, emerald), typefaces (Bebas Neue display, Playfair Display italic accents, JetBrains Mono labels, Inter body), the fixed site navigation with logo and mobile menu, the site footer with disclaimer and legal links, the favicon, and the responsive breakpoints. Chart palette: price in gold, Metcalfe value in cyan, discount in emerald, premium in the site's red. The page was re-run on the real data after restyling: no runtime errors, all values unchanged.
12. Known limitations
- Blockchain.com's unique-address count is a proxy for users, affected by exchange batching, ordinals and privacy tooling.
- The lost-coin rate is an assumption (2% per year, about 22% of supply today at the time of this audit); it is a control, not a measurement. (Superseded: the control now states a total assumed lost and a loss profile, per finding 15 below, and the shipped default applies no adjustment.)
- Forward-return statistics use overlapping windows and are in-sample descriptions, not forecasts.
- The page depends on Blockchain.com and Coinbase public endpoints with no service guarantee; a daily server-side snapshot is recommended.
Bitcoin Power Law Monitor: build note and reconciliation
Companion page, same site shell, same data pipeline (Blockchain.com daily price and addresses, Coinbase spot), same validation protocol. Built 1 September 2026.
Specification
log10 P = a + β · log10 t, t in days since the genesis block (3 January 2009), OLS on daily closes from day 560, following Santostasi and Perrenod (2026). Origin, fit start and band type are user controls; a sensitivity table shows the fit under all combinations of three origins and four starts.
Reconciliation against the published result and against Python
| Quantity | Published (to Feb 2026, from day 560) | Page on live feed (to 31 Aug 2026, feed begins day 592) | Independent Python |
|---|---|---|---|
| β | 5.69 ± 0.05 | 5.61 | 5.61 |
| R² | 0.961 | 0.960 | 0.960 |
| Residual σ | 0.302 dex | 0.301 dex | 0.301 dex |
| Trend today | $136,351 | $136,351 | |
| Pooled next-year error, last five refits | 0.212 dex (49 pts) | 49 pts |
The difference from the published β is accounted for by the sample end (five extra months, −0.04), the missing first month of 2010 in the public feed (about +0.03 if restored), and 2010 price-source differences; all inside the published ±0.05.
Panels
Reading strip (price, trend, deviation in dex and as a multiple, β, residual percentile, R² and σ); corridor ribbon at fit-window percentiles; price and trend chart with ±1σ/±2σ or percentile bands and the as-of trend refit each January; deviation chart; fit statistics; exponent sensitivity (12 specifications); forward returns by starting deviation; out-of-sample validation table by refit year with the exponent and the value for today each refit implied; exponent stability (rolling 2000-day and expanding window); decomposition β = β_A × β_M using the public address stock as adoption proxy (labelled indicative; published values shown); falsifiability monitor (deviation within ±2σ, consecutive days beyond, expanding-window β stability over five years within 0.30, residual drift over four years); trend extrapolation to 2035 with ±1σ and the range across the last five refits; external references; data audit with recomputation checks; method, claims and sources including the arXiv critique.
Checks
Real-data run: no runtime errors; 17 control combinations swept; all audit checks green (calendar continuous, prices positive, trend recomputed from a and β matches, mean residual zero to 1e-14 dex).
Limitations specific to this page
The adoption proxy is cumulative address-activity proxy, not non-zero-balance addresses, so the decomposition does not reproduce the published 3.05 × 1.84. The public price feed starts on day 592. Early refits (2013 to 2015) are unstable and are shown, not suppressed. Extrapolations are extensions of a fitted line, labelled as such.
Literature validation (added 1 September 2026)
A live Literature check panel compares the page against the published record. Results on the real data: Santostasi and Perrenod β consistent (5.61 vs 5.69, difference explained), R² and σ reproduced (0.960/0.301 vs 0.961/0.302); JBEF 2025 R² consistent (0.960 vs 0.9589) and its long-horizon mean reversion reproduced (365-day median return +1006% in the lowest deviation decile vs −56% in the highest), its short-horizon momentum not reproduced on medians (the published result is a Sharpe ratio); Glassnode-reported trend levels for Dec 2025 and Feb 2026 within 5% of the page's as-of trend ($113.7k vs $118k, $120.3k vs $122k); Metcalfe exponent estimates in the literature (Wheatley 1.69, Santostasi and Perrenod 1.84, Perrenod DOLS 1.92, Peterson 2) bracket the page's proxy-dependent values (1.35 on the address stock here, 2.0 to 2.1 on the companion monitor); the arXiv critique acknowledged and answered by the falsifiability monitor; power-law return tails (Begušić et al., 2018) identified as a different regularity and excluded from scope; stock-to-flow included as contrast only.
Every correction since the site went up, newest first. The three most recent are open; the rest expand. 92 entries.
Every page reviewed at once: pages without scripts, stale sentences, and tables cut off on phones (15 October 2026)
Forty-eight tables and most headline figures were filled only in the reader’s browser, so a reader without scripts, a link preview or an AI crawler saw table headers with nothing under them. Where the build did write a figure, it was a second copy of the page’s own arithmetic, and on At a glance that copy had stopped: it said 865 days since the halving when it was 906, an MVRV of 1.46 when it was 1.52, and a drawdown of 38% when it was 34%. The build now runs each page’s own script once against the day’s data and keeps what it draws, so the page without scripts and the page with them come from one piece of code. The check that compares the two found 24 differences before and none after.
Two figures on At a glance had never updated at all. ETF holdings read 865,175 bitcoin because the script expected a list of issuers and the data carries a count; the figure is now 888,950. The gold ratio read 15.6 ounces because the script needed a year of monthly gold prices and was given one month; it is now 18.9, against a December 2024 peak of 37.1. The crowding reading was shown as the 56th percentile and called middling. The composite is an average of three percentiles, so its own range is narrow, and ranked in its own history, as the front page and the flows page rank it, 56 is the 87th percentile: crowded. The dashboard’s summary of what the evidence supports now takes each strength and its reason from the evidence brief on Where Things Stand, after the two had disagreed about hedging.
On the relative-value page the rotation tables against ether started each lookback as soon as it had history, so the 6-month column began in January 2017 and the 24-month one in May 2018, and “hold bitcoin” read 92, 46 and 10 times along one row. Every column of a table now starts in the same month. On equal periods mean reversion wins 2 of its 18 tests, both against ether, so the sentence that it “loses everywhere” is now computed from the table, here and on two other pages.
The bubble model’s claim chart said it fitted 0 of 8 windows on a day it fitted one, because the share was printed without decimals. One window in eight is below the four that make a signal, and three pages that called it “partly” a bubble or “a qualified bubble configuration” now say so. The front page printed deviations in log points with a per cent sign (−53% beside a card saying 41% below for the same reading); they are now real percentages with log points beside them.
The page body clips sideways overflow, so tables wider than a phone were cut off with no way to reach the right-hand columns: fifteen tables on nine pages, and the data audit on the realised-value page even on a desktop. Every table now scrolls inside its panel when it has to, and the evidence brief, which is prose, becomes one card per question on a phone. Smaller corrections: “−0.00%” and “−0.00” where a value rounded to zero; “thirteen free sources” when the snapshot has fifteen; the cycle gauge labelled “since the cycle low” when it is measured from halving day; a Pi Cycle baseline typed as 25.9% beside a table showing 26.5%; a supply-age row listed as “not loaded” for a series the free data tier does not carry.
Power-law page corrections (14 October 2026)
A review of the power-law page found no error in the fit and six things to correct. The deviation was described as “−54% log points”; it now reads as the real gap, 42% below the trend, with log points named separately. The fit was labelled as starting on 17 July 2010, day 560, but the feed begins on 18 August, day 592, so the label now gives the first day actually fitted; the method had also dated day 560 to 16 July. Three tables on this page, and others on the base-rates and autopsy pages, printed “/th>” in their headers from a broken closing tag. The exponent-sensitivity table was cut off in a third of the page width and now has its own row; on a phone the validation and published-research tables are cards. The page said the portfolio page had measured the model’s deceleration “exactly, independently and out of sample”. It had not: the uplift does not fall steadily with entry year, and entries just after a cycle top did worse than those a year later, so the text now calls it broadly consistent and not a test. The forward-returns table now says its deepest rows lean on 2010 to 2012.
The Metcalfe page leads with the fit that passes its own test (14 October 2026)
The Metcalfe page headlined the fit from 2011, because it reproduces Cane Island’s published value within a few percent. The page’s own specification table marked that fit as failing: 148 log points of out-of-sample error against 50 for the fit from 2017, and a bias that overvalued the following year by about three times on average. So the headline said price was 53% below network value while the validated fit said it was about 5% above. The default is now the fit from 2017. The 2011 fit stays one click away, in the validation table and beside the published references, labelled as failing validation. The front-page gauge follows the same rule.
Log points. The premium is 100 × ln(price / value), but it was printed with a per cent sign. At the extremes that was badly wrong: “+622%” on 9 June 2011 was price about 500 times value. Every gap is now labelled as the real percentage, the chart is still spaced in log points so a halving and a doubling sit the same distance from zero, and the statistics keep log points by name. The distribution buckets are now cut at real percentages.
Network or time. The page said the model contains no calendar term. Its network input is a running total of a daily address count that has been roughly flat since 2017, so it rises almost exactly like time: its logarithm correlates 0.994 with the logarithm of bitcoin’s age. The pipeline already tested price on time alone against the network model, and found them about equal one year ahead; that result was shown only on the front page. It now has its own panel on the Metcalfe page.
Wording. The page described its input as the “stock of addresses ever used”. It is a running sum of daily active addresses, in which an address is counted on every day it is used; the total passes two billion while about 57 million addresses hold a balance. The opening paragraph, the method and the sources now say so, and the method adds why addresses are a weak proxy for economic network size: exchanges, custodians and ETFs hold the coins of millions of people in a few addresses.
Fixes. On a phone two wide tables pushed the page sideways; they are now cards. The data audit dated its interpolated gaps to 1970, because day numbers were formatted as milliseconds. The references table showed “−0%”. A fixed exponent was reported as “implied”. The no-JavaScript summary repeated a clause, and a dropdown option was a paragraph long.
The portfolio page after an outside review (14 October 2026)
Two outside reviews of the portfolio tool found no errors in its arithmetic and asked for five things: a conventional stock-and-bond benchmark, stocks with dividends, drawdowns measured on finer data, results over every window rather than nine entry years, and an independent reproduction of the published figures. All five are now on the page.
The base. The default is now 60% stocks and 40% bonds. Stocks are the S&P 500 with dividends reinvested, from Shiller’s series; his dividend column ends in June 2023, and later months are extended at the dividend’s own ten-year growth rate, which the page states. Bonds are a constant-maturity 10-year Treasury priced monthly from FRED’s yield. The original base, stocks without dividends and gold, stays as an option so earlier links still open as they were. At 10% bitcoin the weight added 6.5 points a year next to bonds and 6.3 next to gold. Leaving out dividends had understated the whole portfolio by about 1.1 points a year and changed what bitcoin added by less than a tenth of a point.
Cash. Sharpe and Sortino used a flat 2% risk-free rate. They now use the effective federal funds rate month by month. Over the whole sample it averaged 2.2%, so the full-sample figures barely move; for entries after 2022, when cash paid 4% to 5%, the old figures were overstated.
Daily check. The stock and gold series exist only as monthly averages, so month-end or daily figures are not possible for every base. Where daily closes exist (the S&P 500 from late 2016, the 10-year yield, bitcoin), the 60/40 base was rebuilt day by day. Its worst fall is 2.5 to 3.6 points deeper than monthly averages show, and the extra fall from a 10% weight is about the same either way: 5.6 points daily, 6.1 monthly.
Every window. A rolling table and chart show what the weight added over every 3, 5 and 10-year window. At 10% it never cost return over any three-year window in this sample; the least it added was 0.7 points, from October 2021.
Independent reproduction. verify/verify_portfolio.py shares no code with the pipeline and recomputes 702 published figures from the monthly series in the published file; all match. A test proves it fails when one figure is altered. The browser engine is now tested against the ladder for all three bases, not one.
Readability. The headline gives the range across entry years instead of the first and last rows, which had hidden the weakest years. The entry-year chart says why seven years stack in one column. Entry years with less than three years of returns are no longer offered: annualising 32 months had shown a 26% return and a Sharpe of 2.2. Charts are drawn at the width they are shown, so their labels stay readable on a phone, and tables become cards there instead of hiding columns off the edge.
Across the site. On 24 pages the small label above the title sat in its own column beside it, squeezing the title onto three to seven lines on a desktop; it now sits above. The parity test, which compares each page with and without JavaScript, read its data from a fixed folder that did not exist on most machines, so it had been comparing pages that never loaded their data. It now reads SNAP_DIR, and the differences it finds on other pages are the next thing to fix.
The spectrum, and a block that ran off the page (12 September 2026)
The equity index reported its position as “the 51st percentile of its own 1.34-year history”, which is a number a reader has to convert into a picture. It now shows the picture: a bar spanning the index’s own range, a marker at today, and the path drawn above it, under one sentence saying how far up that range it sits.
No cycle labels, deliberately. The obvious design bands such a bar bottom, bearish, bullish and top. That is a claim about where tops occur, and this index has about one cycle of history, which cannot support it. The ends of the bar are the lowest and highest days it has published and are labelled as exactly that.
And the subscribe block had been rendering outside its container on all four pages that carry it — no maximum width and no padding, so the text ran off the left edge of the viewport. Every harness passed it: the markup is valid, the selectors match, the parity check is clean and the page reads with scripts off. Layout is the one thing they cannot see, which is why five layout bugs in the first week were found only by looking. Validation now fails any panel sitting outside a container, which is the cheapest structural proxy for the thing a screenshot would have caught.
And the range was set by a different basket. The high came from the constituents that qualified earliest, which are the ones with the longest price histories, so a reader comparing today against that high is comparing two memberships rather than two prices. A chain-linked index legitimately spans changing membership and this one does — but the sentence under the bar now names how many constituents stood at the high, at the low and today, because saying so is cheaper and more honest than truncating the history to tidy the range.
The crypto equity index, and a page withdrawn (12 September 2026)
Exchanges, miners, treasury companies and stablecoin issuers, weighted by market value, with every inclusion and exclusion recorded. One question decides membership: would this company’s revenue or balance sheet be materially different if crypto ceased to exist?
Two automated screens were built first and both selected the wrong universe. A balance-sheet test — crypto assets over total assets — measures what proportion of a company is a pile of coins, so Coinbase scored 5.5% and was excluded while a $2m shell holding nothing else scored 79% and qualified. A text test counting crypto phrases in a filing scored Coinbase at four and the same shell at five, because a company that has just pivoted writes expansively about its new strategy while Coinbase describes its operations plainly. Segment revenue would settle it and has no standard XBRL element. So the list is a judgment, and the judgment is published rather than implied; the candidate universe behind it remains mechanical, so nothing is omitted without having been considered.
The same question removes companies as well. Two constituents were bitcoin miners and are now AI infrastructure businesses — one holds no bitcoin at all and draws most of its revenue from computing leases. The mining sector outperformed bitcoin in 2026 because of that pivot, so an index keeping them would be measuring the AI trade and calling it crypto.
What it cannot say. The history is about one cycle long, because most constituents are recent and a market-value index admits a company only from the date it became one. A percentile here describes where the index sits among its own published days, not how far a cycle has to run. Several large filers tag no instant share count, so a weighted average is used and every affected constituent is marked: it lags mid-quarter issuance, which understates exactly the companies that fund purchases by issuing stock.
A page was removed to make room for it. A treasury index published earlier the same day listed the companies holding bitcoin on their balance sheets. It was accurate and it was not useful: several established trackers list far more companies, and being narrower than them is only a virtue when the narrowness buys something. This index measures the whole listed sector rather than one sleeve of it, so the treasury page was answering a question nobody needed a second answer to.
Sixteen years of firing, drawn to scale (12 September 2026)
The scorecard now carries a timeline: every rule, every episode, across sixteen years. It was impossible until today for a reason one line deep — the pipeline published the episode count while the boundaries and each outcome were already computed in the same function and simply never emitted. Each rule now carries its episode dates, and a pending episode is carried through as pending rather than flattened into a miss, because one awaiting its answer is not one that failed.
The design is borrowed and the content is not. Dashboards draw this coloured by phase, which makes a rule that has fired three times look like a persistent regime indicator because the blocks are wide. This draws episodes, the unit the scorecard already scores by, ordered by how often each rule has fired — so the first thing visible is that most rows are nearly empty. Twelve rules have fired fewer than five times in sixteen years. The shape of the chart is the finding.
Colour is the outcome and never the direction, and hits and misses are deliberately neutral against each other rather than green and red: a signal picked at random is right about half the time, so colouring them good and bad would smuggle in a verdict the intervals do not support. Only no answer yet stands out. Episodes are drawn as spans because that is what they are — the shortest here lasted a day, the longest ran over twelve years.
A page published and withdrawn the same day (12 September 2026)
A page arguing that most valuation signals are one quantity restated — that NUPL is 1 − 1/MVRV by algebra rather than correlation — was published and taken down within hours. The arithmetic is right and the page was wrong: it told a reader what not to trust and helped them decide nothing, it argued with an interface they may never have seen, and it sat in “start here”, which is no place for a technical rebuttal.
The finding is kept where it belongs: as a paragraph on the scorecard, where a reader has just seen that two of thirty-six rules are judgeable and is already asking why counting more does not help.
A newsletter, and where it is allowed to ask (12 September 2026)
Four pages now carry an invitation to subscribe: the scorecard, the base rates, the forward record and the treasury index. Not the other thirty-four. A site whose argument is that most indicators cannot be told from chance should not interrupt that argument to ask for an email, and the invitation only appears where the reader has just been given a reason to want the next instalment — after seeing that two of thirty-six rules are judgeable, or that the first forward-record row becomes scoreable on 8 September 2027.
It is a plain link, not an embedded form. Substack’s form is an iframe carrying its own scripts and cookies; every page here is readable with JavaScript off and loads nothing from a third party, and one email box is not worth giving that up. Nothing about a reader is stored on this site, and the list lives where unsubscribing is one click.
What it will carry: a rule crossing the episode floor and becoming judgeable for the first time, a verdict changing, and any correction to a published figure with its date. No signals, no price calls, no promotions.
The treasury index page, and a cap it was about to claim without applying (11 September 2026)
The page nearly shipped asserting that no constituent may exceed 15% of the index, while its largest held 78.9%. Both facts were correct: with six constituents a 15% limit is mathematically unreachable, six times fifteen being ninety, so the cap is skipped by design. The page stated it anyway, unconditionally, which would have been a false claim about its own method on a published page. It now says when no cap is in force and why.
Two exclusions were also wrong, and in opposite directions. Strategy was thrown out of its own index: its 2023 comparative, 189,150 bitcoin against a $3.6bn carrying value, implies $19,172 a coin against a $42,288 market. That is not a mis-tag, it is cost-less-impairment accounting behaving exactly as the standard required before ASU 2023-08. The reconciliation now runs only on fair-value periods, and only a current-period disagreement removes a company. Meanwhile the index had been built after the file was written, so the figures reached the console and never reached the file the page reads — a dashboard that would have rendered empty while the run reported success.
And a note on coverage. This is narrower than the treasury trackers in general use, which accept press releases and self-reported figures. Only what a company has tagged in its own filings appears here: a smaller set, and a harder one to argue with.
A thirty-eighth page: who actually holds it (11 September 2026)
A new page publishes the treasury index. Every US company that reports a digital-asset holding to the SEC, found by sweeping the XBRL frames API rather than from a list someone wrote, weighted by treasury value, with every exclusion and the arithmetic that produced it.
Each holding is checked against the filer’s own carrying value. Divide a reported unit count by a reported fair value and the result is a price per unit, and a price names the asset. That identifies a holding whose unit string says only “Integer” — two thirds of the universe — and it catches a count that cannot be what it claims. One filer reported 1,719,000 bitcoin in the standard element with the unit string “Bitcoin”; its own carrying value implies $58.53 a unit against a market price of $58,523.93, so the count is out by a factor of a thousand. It is excluded and the arithmetic is the reason shown.
Weights are treasury value rather than market capitalisation, because weighting by market value weights by the premium the market puts on the treasury, and an index whose weights move with that premium cannot then measure it. Where a constituent’s claims have not yet been read from its filings, its value is gross of debt and preferred and every row says so: a gross figure overstates a leveraged holder against a fully recorded one.
It covers US filers only, and describes economic exposure rather than anything investable — no free float, no liquidity screen, no corporate actions. The page says that too.
The Metcalfe gauge now headlines the same fit basis as the power law (10 September 2026)
The two valuation gauges sat side by side holding themselves to different standards: the power law fitted over the full history, the Metcalfe figure fitted to 2017 and run forward. One standard is better than two, and the reading shown is now the published 2011 calibration on both. The validated fit is still named beside it, with what each implies for the network’s value, so a reader sees how far the answer moves with the window rather than only one end of it.
The percentile had to move with it. Each fit has its own distribution of premiums, so the reference reading sits at its own rank — the 45th, where the validated fit sits at the 54th. Swapping only the headline number would have paired a figure with the rank of a different figure, which is the fault this change set out to remove.
And the note is written from the reading, not asserted. Until a full pipeline run publishes the reference figures the gauge falls back to the validated ones, and a note that claimed the 2011 calibration regardless would have had the gauge contradicting itself on the page for a day. It describes whichever reading it is actually showing.
The most important caveat was on two pages and not on the fifteen that needed it (10 September 2026)
Asked whether the fitting inconsistency ran wider, every page carrying a model was checked for whether it states the basis its figures are fitted on. Most do. The valuation monitors distinguish the validated fit from the full-history one; the flow model publishes its walk-forward; the scorecard says plainly that its thresholds were chosen after seeing the record; the rule builder warns that anything found by searching it has been fitted to the history it is tested on.
The fifteen claim pages said none of it. Each showed an interval, a difference and a verdict, and nothing to tell a reader that the threshold being tested was picked by someone who already knew what bitcoin had done. That caveat sat on the scorecard and on this page — which is no use at all to a reader arriving at one claim from a shared link, and those pages are the ones that get shared. All fifteen now carry it, beneath “what this does not mean”, with the interval’s scope spelled out: sampling variation between independent trials, not the choice of threshold, not the fact that cycle turns are few and related, and not that thirty-six rules were tested in total.
The composite gauge pointed at the wrong three lenses (10 September 2026)
Asked whether the Metcalfe fit should match the power law’s for consistency, and checking what each actually uses, the composite gauge turned out to be describing itself wrongly. It read “the three lenses below, averaged”. The composite is MVRV, the Mayer multiple and the power law. The gauges below it show Metcalfe, which is not a component, and do not show the Mayer multiple, which is. The note now names the three it actually contains. The market context page had it right all along; only the dashboard’s summary of it was wrong.
On the consistency question itself. The power law is fitted over the full history and so has seen every day it is judged against; the headline Metcalfe figure is fitted to 2017 and run forward, and has not. Those are different standards sitting side by side. Neither is in the composite’s way — Metcalfe is not one of its components — but as a matter of presentation the two gauges do hold themselves to different bars, and the site should say which it means. The resolution belongs in the direction of the stricter test rather than the looser one: a fit that has seen the answer will always flatter itself. Recorded here rather than quietly settled.
A comparison with only one side named, and the one other place it occurs (10 September 2026)
The Metcalfe gauge read “on the 2011 reference calibration instead, −43%” without saying what the headline figure was fitted from, so “instead” pointed at something the reader had never been told. Both windows are named now, and both years are read from the file rather than typed.
Every short note on the site was then searched for the same shape — a comparison, a pronoun or a definite article with nothing to attach to. Twenty-three candidates, and all but one were fine in context: “the model” on the Metcalfe page can only mean one model, and “the baseline” on the cross-asset tables is defined in the same sentence.
The exception is the power law, and it is the same error. That page carries a table of the model level computed from several different start dates, precisely because the answer depends on where the fit begins — and the gauge quoted one number as though it were the number. The gauge now says so and points at the table. It does not yet quote the alternatives the way the Metcalfe gauge does; that needs the start-date fits published in the snapshot rather than computed in the browser, and it is on the list.
The Metcalfe gauge named one fit window and not the other (10 September 2026)
The gauge read “On the 2011 reference calibration instead, −43%” without ever saying what the headline 1.9% was fitted from. “Instead” pointed at something the reader had not been told. It now names both: the number shown is the fit trained on data to 2017 and run forward, and the published 2011 calibration says the opposite — same model, longer window, an answer nearly twice apart. Both years are read from the file rather than typed, so re-specifying either fit cannot leave a stale year in the prose.
Every page compared with and without JavaScript (10 September 2026)
Yesterday a rewrite reached the pre-rendered dashboard and not the script that replaces it on load, so the page showed the old wording while the file on the server was correct — and every check passed, because the bytes were right. A harness now runs all thirty-seven pages, compares every identified element before and after the script has executed, and fails the build on any that read differently.
It found six faults on its first run. The dashboard’s headline block and status line said “Loading the composite” and “Snapshot status loading” to a reader without scripts; both are now pre-rendered. The realised-value page carried a label for a coin-age figure this site cannot compute without a full node, while the page always renders the fallback instead. Two more labels on the Metcalfe page named something more generic than what the page actually opens with. And the reconciliation line — the one that claims the figures agree to the cent — was rounded to whole dollars by one renderer and to cents by the other, the third place this week where the same quantity was formatted two ways.
What it has not fixed: six tables and a handful of stat cards are still filled only by the script, so a reader without it sees their headings and no rows. They are listed by the harness every time it runs. That is a real limit on the claim that every page is readable without JavaScript: the pages are readable, but those tables are empty, and saying so is better than leaving it to be discovered.
The dashboard is written twice, and only one copy was changed (10 September 2026)
Yesterday’s rewrite of the gauge notes reached the pre-rendered page and not the script that replaces it on load, so the file on the server was correct and the page still read the old wording. Every check passed: the byte counts matched, because the bytes were right.
All six notes are now in both, and a harness runs the page and compares every filled element before and after the script has executed. It fails the build if any of them differ — the gauges, their readings, the evidence summary, the firing count, the base-rate footer. Three divergences it found immediately: two hyphens where the other copy used an en dash, and a halving date printed raw as 2024-04-20 rather than in words.
Also: two gauges have no percentile — the cycle multiple and days since the halving — and were drawing the cheap-to-dear scale with nothing on it, which reads as a control that has failed. They now show their figure and their note alone.
Numbers whose scale a reader had to already know (10 September 2026)
A reader asked what “Metcalfe · 2% · 52nd percentile” meant, and the honest answer is that it was two numbers on two different scales with nothing saying so: the first is a premium in per cent, the second is where that premium sits in its own history. Every gauge on At a glance had the same shape. Each now states what its own number is and what the figure beside it measures — that MVRV of 1.50 means the average coin is up 50%, that −0.23 dex is about 42% below the trend line, with that conversion computed rather than written down.
And the Metcalfe gauge was more confident than the page it summarises. It quoted the premium from the fit validated on 2017 data, which reads +3.6% today. The same model on the published 2011 reference calibration reads about −42% — the same data, a different window, an answer nearly twice apart. The page always carried both; the gauge now does too.
Ten table headers carried a unit a reader had to bring with them: p5, p25, p75, p95 on the base rates, four columns measured in dex on the power law, Mayer and DVOL on the autopsy. Each now has a plain name with the technical one beneath, the treatment the flow monitor already used.
Every card carries its own page’s figure (10 September 2026)
All thirty-eight social cards now show the figure their own page draws: the price series with this site’s power-law and realised-price bands on the front doors and the valuation monitors; each tested claim’s own indicator with every firing marked; the halving bars on base rates; the episodes-against-edge scatter on the scorecard; and, for the two pages with no series of their own, the square-per-rule grid.
I argued at first that only pages “about a series” should carry a chart and that anything else was decoration. That conflated two objections. “This chart repeats another page’s” is an aesthetic complaint; “this chart is not what the page shows” is an honesty one, and only the second matters. It applies to almost nothing here.
And I nearly shipped the fault I had objected to. The first Metcalfe card drew its valuation line from hash rate and labelled it network value — a plausible line that was not the thing it claimed to be, which is exactly what made a designed comp unusable. It now uses the cumulative address count the monitor names, anchored to the published value, so the line converges with price at the right-hand edge as the page’s stated premium of a few per cent requires.
Every axis is scaled to its own data, so no card can draw a ceiling the data never reaches. Firings are marked rather than shaded: shading the year that followed is right on a page five hundred pixels tall, and at card size twelve of them hid the price line entirely.
The front-door card is drawn from the data (10 September 2026)
A designed comp for this card was proposed and could not be used. Its price axis ran to a million dollars with the line near the top, when the highest close on record is $124,777; its valuation line sat far below price throughout, while the page it links to reports the two within a few per cent of each other; its x-axis printed 2013 twice and omitted 2015; and it counted fifteen signals when the scorecard holds thirty-six. On a marketing page any of that is survivable. Here it is not: the whole proposition is that every figure comes from a public snapshot and can be checked, and the first reader who notices the million-dollar ceiling stops believing the rest.
The composition is kept — the lockup, the serif headline, the rule, the subtitle, the chart, the figures — and every mark in it is now computed. The price line is the published weekly series since 2013; the two bands are this site’s own power-law level and realised price on the same dates; the vertical scale is the data’s own range, so it cannot draw a ceiling nothing reaches; and the counts are read from the scorecard. It is the same card the comp was reaching for, with nothing on it that a click would contradict.
Social cards rebuilt: one design, no daily figures, legible at a thumbnail, and the mark (10 September 2026)
Every page had a card and every card was the right size, but they came from two sources with no common grammar. All thirty-eight now share one palette, one typography and one gold rule.
The first version put live market readings on them — the last close on the front page card, MVRV on three others, twenty-three daily figures across twelve cards. A card is a PNG: committed, regenerated only where the drawing library is installed, and cached by every platform for months. Those figures would have been wrong within a day, inside an image where nothing on this site could read them. They now carry only what describes the site, and a guard refuses to draw a card holding a market reading.
The type was set for a poster, not a preview. Platforms render these at four to six hundred pixels and as little as two hundred and fifty in a chat, where a fifteen-pixel label becomes three pixels: a reader saw three large numbers with nothing legible to say what they counted. Every size is raised and the footer line, unreadable at any scale, is gone.
And they were entirely text. Four cards now carry the site’s own figure — one square per rule, the two that can be judged lit — which survives a thumbnail when words do not. All thirty-eight carry the mark, reversed out for a dark ground: the supplied logo is a black disc on white, which pasted onto a card would have shown a white square with the disc itself invisible, so the disc is keyed out and the ring and monogram drawn in the site gold. It sits bottom right, the one corner nothing else uses — it was top right at first and a long headline ran under it.
Counts written as words had gone stale in six places (10 September 2026)
The cross-asset page opened with “Two of fifteen scorecard rules have enough bitcoin history to judge”. The scorecard holds thirty-six. Five more sentences carried the same number, on the power law, the scorecard itself and the rule builder — each written out as a word at a time when fifteen was right, and invisible to every check the site had, because nothing could tell a number in prose from a number in a table.
All six are computed now, and the build fails if a spelled-out rule count no longer matches the live scorecard. The changelog is excluded from that check: an entry from an earlier date saying “twenty-one rules” is a record of what was true then, and rewriting it would be the one thing this page must never do.
Also found: the number-to-words table stopped at twenty-five, so the day the scorecard passed that count a sentence began reading “30 rules” in the middle of prose. It now covers every count the site can produce.
Three faults found by looking at the pages (10 September 2026)
The intraday run was deleting the provenance record. It fetches five sources, and it wrote its manifest out whole — so the entries for the other ten sources vanished, and this page reported five sources in the snapshot instead of fifteen. The manifest is the record of where every figure came from; a partial run now merges into the previous one rather than replacing it, and states which five it actually refreshed. The ten it did not fetch keep their last entry, which is exactly what still describes them.
The halving bars rendered as an empty box. Each column was set to shrink to its own label, so a bar asking for 81% of its column’s height was 81% of nothing. The columns now fill the plot, and each figure sits on top of its own bar.
The flow monitor counted unfinished forecasts as misses. It read “of the last 54 origins, 0 landed inside the range” — but 36 of those 54 were the open forecasts added yesterday, whose answers arrive between 2026 and 2029. Eighteen have been scored, and none landed inside. Both the pre-rendered and the live sentence were wrong in the same way and are now checked against each other.
An open tab stopped updating; the site index took a third of the row (10 September 2026)
The page fetched its figures once, at load. Only the price was on a timer, so a tab left open through a pipeline run showed a current price beside a “published” time hours old — which reads as a stale site rather than an open tab. The view is now re-fetched every five minutes, and if the pipeline has run since, the whole dashboard is redrawn from it. Verified by simulating a later run: the figures follow it.
The site index was still one column, and my previous fix was aimed at the wrong thing. I set an explicit column count inside it, but the directory was sharing a three-column row with two notes, so it had a third of the width; five columns inside that third would have been ninety pixels each, worse than one. The directory now takes the whole row and the two notes sit beneath it, side by side, where they read as footnotes rather than as peers of the index.
That is the second time this week a layout was fixed at the wrong level. The lesson is the same both times: when something renders in one column, the question is not how many columns it asks for but how wide its container turned out to be.
A layout sweep, and why the daily date is yesterday’s (10 September 2026)
The same defect had appeared three times — charts boxed into grid columns, the evidence gauges orphaning one cell, the site index collapsing to a single strip — so rather than fix a fourth instance when it surfaced, every page was searched for the pattern: a layout whose column count is decided by measuring its container. Seven such grids exist in the stylesheet. Only two sit inside a narrow parent, and both have room. The site index was the real one, and its columns are now an explicit count.
One further case, on a phone. The valuation band strip on Where Things Stand set five columns inline, and an inline style cannot be overridden by any media query — the same defect that stopped panels stacking on the first day of this work. On a narrow screen “VERY EXPENSIVE” was crushed into a column a few characters wide. The proportions are the point and are kept; the labels shorten instead.
And the date. The freshness line read “Daily readings through 9 September, published 10 September” and looked a day stale. It is not: Blockchain.com publishes a running value for the current day, and this site drops it, because a partial day once produced a golden cross that the complete day withdrew. The last day with a finished close is therefore always the previous one. The line now says so, rather than leaving a reader to work it out.
The dashboard’s site index ran down one column (10 September 2026)
The “Start here” panel lists all thirty-seven pages in five groups. Its columns were set with auto-fit, which sizes against the container, and inside that panel the container measured narrow enough that every group stacked — thirty-eight links down a single strip rather than a directory. The columns are now an explicit count at each width, so they cannot collapse that way. This is the same failure as the charts boxed into grid columns earlier today: a layout that depends on a measurement, in a place where the measurement turned out to be small.
The fifteen tested claims were also listed inline, which made that one group four times the height of the other four. They are collapsed behind a toggle, as they are in the rail. It is a native <details>, so it opens without scripts, and the links remain in the page for crawlers whether it is open or shut.
Intraday refresh, four times a day (10 September 2026)
The pipeline ran once a day, at 06:15 UTC. Funding, open interest and implied volatility can move a great deal in the eighteen hours after that, and the positioning figures sat unchanged through all of it. There is now a second workflow at 00:15, 12:15 and 18:15 UTC.
It deliberately refreshes almost nothing. Five sources change within a day — spot, the mempool, the Fear and Greed index, dominance, and the derivatives feed — and three layers read them: alignment, the KPI computation, and the front page’s view. Everything else is daily-close arithmetic. The scorecard, base rates, all fifteen claims, cross-asset, the register, the portfolio and the flow model would recompute the same completed day at noon and write byte-identical files; the bubble model is the expensive one and reads only the close; and the forward ledger writes one row per day, and an intraday run has not changed the day it describes. Committing all of that four times over would have quadrupled the repository’s growth for no new information.
Both workflows run the test suite before fetching, refuse to publish a manifest with a failed layer, and share a concurrency group so they can never overlap on the same files. The intraday run commits only if something actually changed. The manifest records which kind of run wrote it.
What this changes on the pages: crowding and the Fear and Greed reading on the dashboard, and the positioning table on the flows monitor. Nothing else, which is the point. The live price on At a glance was already refreshing from the exchange while the page is open, and still does.
Weight, capability and the visual pass (10 September 2026)
The front page was downloading 2.46 megabytes. It fetched eleven files, and the largest — the whole Blockchain.com source at 1.34 MB — was there for a single price line. A new pipeline layer publishes glance.json, a ten-kilobyte view assembled from layers that had already computed every figure in it, and the page now fetches that plus the slim price series: 149 KB in two files. A test asserts the view performs no arithmetic of its own, so there is no second implementation to drift, and another asserts it stays under sixty kilobytes.
Each claim page shipped 221 KB of invisible chart. When the interactive charts arrived, the static fallback stayed at daily resolution — drawn, then immediately hidden. Fifteen pages, 3.3 MB of path data nobody saw. The fallback is now weekly, which is indistinguishable at that size, with every episode boundary kept exactly because a shaded band that moved three days would misreport when a rule fired. The site’s total HTML fell from 3,716 KB to 1,913 KB.
Eleven pages could not draw anything. The charting library was never loaded on them, so the newest pages defaulted to tables because tables were the only thing available. Enabled on the eight that needed it, and then used: the scorecard gained a chart of every rule — how often it fired against how far it beat its baseline, with the twenty-episode floor drawn as a line, which puts almost every rule on the wrong side of it. Cross-asset gained a heatmap of six rules across five assets. Base rates gained the halving bins as paired bars, where the 81% doubling rate in the first six months and the 100% fall rate at eighteen to twenty-four are visible before any number is read.
The rule builder had no picture. A reader could invent a rule and get a table, while every claim page showed its rule on a chart with each firing marked. It now draws the rule you built, using the same clustering as the scoring, and names the difference between firings marked and episodes scored — twenty-three against twenty-one for the default rule — so the chart and the table cannot appear to contradict each other.
The evidence grid. Every rule as one cell, all the same size, shaded by how much is known rather than by whether it points up or down. Colouring thirty-six rules green and red would rebuild the scoreboard this site exists to argue against; a wall of grey with two lit cells is the finding itself.
Also: thirteen pages showed “Loading price history” as a visible heading to anyone without scripts; four pages never said which day their figures came from; At a glance duplicated its own dashboard in a table beneath it, with the composite rounded differently in each; the scorecard’s 820-pixel table now becomes labelled cards on a phone; and this correction log, sixty-three entries run inline, is now collapsed newest-first with the three most recent open.
At a glance becomes a dashboard (10 September 2026)
The page was fourteen hundred words of prose with one table and no charts — a reader wanting a view of the market had to read it. It now opens with a dashboard: price with its position in the ninety-day range, the site’s own valuation reading, six gauges placing each published reading in its own history against cheap and dear bands, the rules firing today as links with their episode counts and verdicts, and what the evidence adds up to — rules scored, rules with enough episodes to judge, rules that beat doing nothing, and how many would clear a 90% interval by chance at that count. Beneath it, unchanged, are the ten questions with the reasoning attached, for a reader who wants more than the reading.
Every figure is filled by the pre-render from the same files the pages below read, and refreshed live by the same logic; the two were compared element by element and agree. The dashboard works with JavaScript off.
Cross-references, and figures that had drifted (10 September 2026)
Every page was checked for typed figures and for links to the pages added this week. Three had drifted. At a glance still said “7 of the 8 tested did no better than a random day” while the scorecard held thirty-six rules; its headline finding is now generated from the scorecard, as the other five already were. The scorecard’s cross-asset footer named four rules when six are scored across the five assets. And the at-a-glance line about the flow model counted the still-running forecasts as misses once open rows were added to that table. All three are computed now, and the build fails if any at-a-glance finding is left unfilled.
The five pages added this week were reachable from the rail and from At a glance but rarely cited by the pages whose figures they underpin. The scorecard now points to the base rates its baselines rest on; base rates points to the rule builder and the forward record; the rule builder points to base rates and the register; cross-asset points back to the scorecard; the record points to both; and the flow monitor points to base rates. No broken internal link, no page without an inbound one.
Two figures also disagreed between the pre-rendered page and the live script by a single unit, from rounding halves differently in Python and JavaScript — the third occurrence this week. Both now carry one decimal in both renderers, and all six findings on At a glance match exactly.
Fourteen indicators from the wider tally (9 September 2026)
The most-watched bull-versus-bear analyses in this space work by listing forty indicators and awarding each a point to one side or the other. The tally is usually close, and the closeness is presented as genuine ambiguity. Fourteen of those indicators are computable from series this pipeline already publishes, so they are now on the scorecard, scored exactly like the rest: the Puell multiple at both extremes, the MVRV Z-score at both, market capitalisation against thermocap, price against realised and balanced price, the stablecoin supply ratio, weekly and monthly RSI, the trailing one-year return, the 50-week average recapture, transaction fees at a multi-year low, and public attention at both extremes. Thresholds are the ones the people making the claims use, not thresholds fitted here.
The result is the finding. Every one of the fourteen reads “not enough episodes to score”. The Puell multiple below 0.4 — the usual opening argument — has fired six times since 2013. Market capitalisation under ten times thermocap: seven. The stablecoin supply ratio in its lowest tenth: two. Across all thirty-four rules the median is five episodes, and two clear the twenty-episode floor. Neither beats its baseline.
And the arithmetic of the tally itself. Thirty-four rules at 90% confidence means about 3.4 would clear their intervals by chance if none of them worked. A scoreboard of forty indicators finishing nine to seven is inside that. Counting votes is not the same as measuring edges, and a close tally is what a null result looks like when the counting method cannot distinguish signal from sampling.
On attention. Search interest is the series everyone quotes and nobody can reproduce: Google publishes no official API, and the indices the unofficial ones return are relative to the query window, so the same request made twice gives different numbers. Wikimedia’s pageviews API is public, keyless and absolute — the count of times the English Bitcoin article was read in a month, back to July 2015. It is a narrower measure than search, since people who already hold bitcoin do not look it up, and the page says so.
What was left out, and why. Five indicators are proprietary constructions that cannot be reproduced from public data. Three need chain-analytics or app-store sources this pipeline does not have. Seven are analogies drawn from a single past episode — the 1999 Nasdaq ETF, gold’s multi-year bleed, a presidential-term path — and scoring an analogy with one observation would mean building machinery to measure nothing. Four are timing counts rather than conditions that fire, and the base-rate page already covers that ground by months since the halving, with the four-observation caveat attached.
Interactive claim charts (9 September 2026)
Every claim page’s chart was a static image: no hover, no zoom, and on the golden cross page the crosses themselves were not marked. Each of the thirteen engine-scored claims now carries an interactive chart drawn in the browser from the same published series the pipeline reads, with the same indicator maths as the rule builder: the price and the averages or indicator the rule uses, a second panel showing the rule’s own quantity against its threshold, every firing marked with the year that followed it shaded, hover for values, drag to zoom, and arrows that step through each firing in turn. The static chart remains for readers without scripts. LPPLS and Stock-to-Flow keep the static chart, as their inputs are pipeline-only.
Every table now says what it shows, and every chart what it plots. An audit of the built pages found 107 tables of which 61 carried no caption at all: a reader met a grid of numbers with nothing stating what the rows were, over what period, or from which source. Captions now live in one file, captions.py, applied at build time, and the build fails if any table lacks one. Nine header sets that could not be read from the columns alone — the cross-asset rule tables among them — now carry a plain name with the technical name beneath. Every static claim chart opens with what it plots and how to read it, which matters most on the LPPLS page, where the line is a model confidence indicator rather than a price and nothing had said so. The Fear and Greed panel says what its levels mean and that neither extreme beat its baseline when tested.
The walk-forward table now runs to the present. It ended at the last origin whose three years were up, which is necessarily three years ago, and nothing on the page showed the method still running — so readers reasonably concluded it was stale. The 36 forecasts already made whose answers have not yet arrived are now shown beneath a divider, each with the date it comes due. They carry no result and are excluded from the coverage figure, which a test asserts. The section is retitled “What this method would have said, and what happened”.
The walk-forward table said nothing about itself. Its columns were headed Origin, Target, p25, Median, p75, Actual, Inside, and a reader who did not already know the method could not tell what any of them meant. They now read “Standing on”, “Forecasting”, “It said, low / middle / high”, “What happened” and “Right?”, each with its technical name beneath. And the section now explains, before the table, why its newest row is three years old: a three-year forecast can only be marked once three years have passed, so the newest scoreable origin is exactly three years back and its target date is today. Readers were reasonably concluding the page was stale.
A rendering defect in the first upload of the interactive charts. ECharts was initialised while its container was still hidden, measured it at zero width, and drew every claim chart about a hundred pixels wide with the static fallback already removed. The container is now shown before initialisation and the chart resized once layout settles. None of the existing harnesses could see it, because they stub the chart library; a new one records the container’s state at the moment of initialisation on every claim page, and fails on the shipped version.
Chart sizing across the site. Eleven charts sat in two- and three-column grids at a fixed height, so on a laptop each had a third or half of the width; two on the dashboard were 220px tall and five pages had charts at 300px. Every chart panel inside a grid now spans the full row, the base height is 460px, the short variants 380 and 400, and the dashboard pair 340. The stat panels around them keep their columns.
On the golden cross of 9 September. The chart now shows it plainly: on the complete 8 September day the 50-day average sat $124 below the 200-day; the gap had been closing by roughly $250 a day; a partial 9 September point briefly pushed it to +$89, which the site showed and withdrew. On the complete 9 September the 50-day will almost certainly be above, and the pipeline records that on the morning of the 10th, dated the 9th. A source using exchange closes rather than Blockchain.com’s daily average may date the same cross a day or two differently.
Sixth audit round: the verdict becomes inferential, and the pipeline order is fixed (9 September 2026)
The scorecard ran last. After the ledger, which reads it. So the forward record’s row for each day carried the previous run’s scorecard, and a row dated 9 September recorded a golden cross the corrected scorecard had already withdrawn. The order is now align, kpis, slim, base rates, cross-asset, treasuries, flows, scorecard, register, portfolio, ledger; a test asserts every consumer of the scorecard runs after it.
“Beats the baseline” now means the interval clears it. The verdict had been a five-point gap on twenty episodes, while the interval sat beside it unused, so a rule could read “worse than the baseline” with an interval that contained the baseline. Both RSI rules did: 31–65% against a 60% baseline. They now read indistinguishable, which is what the evidence supports. The criterion applies on the scorecard, in the cross-asset pooling, and in the browser rule builder, and the harness compares verdicts as well as figures. Every rule now names its evaluation type; LPPLS is a random-block signal-day test and says so.
Publication is gated on tests. The daily workflow runs the suite before fetching a byte and refuses to commit a snapshot whose manifest records a failed layer. Sources that were not current when the derived layers ran are listed in the manifest as degraded, and the site build refuses a critical one.
The Realised Value page no longer falls back to the Coin Metrics API. The snapshot shifts and reconciles dates; the raw API does not; the same page could show two MVRVs. It reads the audited snapshot or says it could not.
Figures that were typed are now generated. The opening sentence of every claim page’s “What the numbers say” was written by hand with figures the daily scorecard could outrun; one was already a tenth off. It is now built from the scorecard, with only the editorial clause kept. The Methods status block — last verified, rule count, test count — is generated too. Claim social cards record the figures they were drawn with, and the build fails if the scorecard has moved since; it also fails if the expected claim pages are not all generated, rather than publishing a partial site. LPPLS history carries a specification hash and an input hash and recomputes in full when either changes.
Also: the glossary’s NUPL entry now matches the code, which derives it from MVRV; the 25-delta skew is defined as put minus call, the convention the code uses; the browser’s realised volatility uses the sample denominator, as the pipeline does; the register’s seeded count is stated as thirteen, with the reason the other eight cannot be expressed; and the rule builder says nine of its ten indicators are the scorecard’s. Recommendations accepted for later work: a per-metric timestamp contract for Coin Metrics rather than a provider-wide shift, one machine-readable rule specification consumed by pipeline, browser and register alike, and a release manifest with checksums.
Fifth audit round: an incomplete day, and a ledger row corrected (9 September 2026)
Blockchain.com publishes today before today is over. Its market-price chart carries a running value for the current day, and every layer that read price directly — the scorecard, base rates, the register, the flow monitor — took it as a completed close. The protection lived in the schedule, not the code: the daily run at 06:15 UTC lands after the day rolls, but a manual run at 16:41 UTC evaluated the site on two-thirds of a day. The golden cross fired on it, on a margin of $88.80 between the 50-day and 200-day averages; on the last complete day the 50-day was $124 below. Today’s point is now dropped at ingest for that source, so nothing downstream can see it, and every layer’s date agrees again. Coin Metrics is not affected: its leading point is a completed day, shifted at ingest, and lands within 0.02% of Blockchain.com’s eventual value.
The ledger’s second row was wrong, and is corrected in the open. It was stamped 8 September but its firing list came from the scorecard run on the partial 9 September, so it recorded a golden cross on a day none occurred. The row is unscored and so may be corrected — not silently: the original list and the reason are kept on the row, the page shows them, and the git history holds every version. Two further defences: each firing rule is now stored with its direction and name frozen at write time, because scoring a year-old row from today’s scorecard would let a renamed or retired rule change or erase a historical verdict; and the row is stamped with the scorecard’s own date rather than another layer’s.
Multiple testing, on the scorecard itself. The counter reached the cross-asset and register files and skipped the page it matters most on. The scorecard now states how many rules were tested, how many would look significant by chance, and how many did — twenty-one rules, about two by luck, two found — and every “not enough episodes” row shows the smallest edge its sample could have detected, so a non-verdict reads as a statement about the sample rather than about the rule.
Also: the ETF weekend-row filter is applied before the stored holdings file is written, not only to the presentation output — the docstring said it “clears them once” and two BITB rows survived four rounds; the cross-asset page states that its percentile cuts are in-sample; and the rule-engine harness now refuses to run on an incomplete snapshot rather than reporting a missing file as engine mismatches.
Navigation. The fifteen tested claims in the rail are a collapsible group under the Scorecard: open on the scorecard and on a claim page, closed elsewhere, the reader’s choice remembered for the tab, and simply open without JavaScript.
The site tested by its own method; a forward ledger; a public register (9 September 2026)
Self-test. The scorecard held fifteen external claims to a standard the site had not applied to itself. Six of the site’s own instruments — the composite’s cheap, dear, very cheap and very dear bands, and the power-law percentile’s bottom and top fifths — are now scored as rules through the same engine, in their own group on the scorecard. All six read “not enough episodes”, as the once-per-cycle external rules do, and the two top signals were followed by a 40% fall on none of their six firings. The cuts are the bands published on Where Things Stand and the Power Law page; they were still chosen by us after seeing history, and the group says so.
The ledger. A layer that runs last in the pipeline writes one row a day: the price, the composite and its band, the power-law percentile, MVRV, and every rule that was firing. A row is scored once its year has closed — did a 40% fall or a doubling follow, and which of the firing rules were right — and is never rewritten. The first row becomes scorable a year after the ledger began; the page states the date. The value is the accumulation, and the git history of the file, which makes every past version visible.
The register. Anyone can enter a rule, in the rule builder’s vocabulary, by GitHub issue. The pipeline scores every entry daily and shows the record since registration separately from the full history, because only the first is a prediction. The site’s own thirteen engine-scored rules are seeded, marked as such, and carry no pre-registration credit; a test asserts the register reproduces the scorecard’s episodes and hit rates for them. A first version of the register read the price series from 2013 and lost early episodes to the moving-average warm-up; it now reads what the scorecard reads.
Joining the pages up (9 September 2026)
Five gaps found by asking what a visitor could fail to find. The rule builder’s count of rules tried — the page’s whole argument — reset on every reload; it now lives for the tab, survives a reload and a shared link, and can be reset by hand. At a glance, the on-ramp, did not mention four of the pages; it now carries each as a tested finding, filled from the same files as the page it summarises. Ten pages shared one generic social card; each now has its own, in the same design as the claim cards, with a live figure where the page has one. The glossary defines the seven terms the new pages introduced. And the scorecard’s table now ends with each rule’s cross-asset verdict, so the two pages that test the same rules no longer stand apart.
Cross-asset, and a date scrubber (9 September 2026)
Does it work anywhere? Six scorecard rules run across bitcoin, ether, Solana, the Nasdaq and the S&P 500 through the scorecard’s engine. The methodology decision, stated before any result: the scorecard’s outcomes are bitcoin-scale and equities never double in a year, so a hit is defined relative to each asset’s own one-year forward returns — above the 80th percentile for a bottom rule, below the 20th for a top rule — making the base rate 20% by construction everywhere. Horizons are calendar days, not index steps, so equities are not silently given a seventeen-month window. A pooled “beats” is downgraded to “mixed” if any asset with five or more episodes runs the other way by more than five points; the death cross beats its pooled baseline and reverses in the Nasdaq, and without that check it would have been called a rule that works. Results: overbought RSI predicts nothing in any of the five, the cleanest null on the site; oversold RSI is indistinguishable pooled and reverses between equities and crypto; the golden cross beats its baseline by eleven points with the same sign in all five assets, the first rule on the site to do so, presented with its caveats first — a thin margin, no asset significant alone, momentum rather than chance as the alternative explanation, and six rules tested. The bitcoin row is a different test from the scorecard’s, and the page says so.
Date scrubber. The dashboard’s change table can now compare today against any published day rather than only yesterday. It is as deep as the history file, which began when the pipeline started recording readings and deepens by one each morning; the panel states its depth.
Rule builder (9 September 2026)
The scorecard tests thirty rules other people made. A new page tests the reader’s own, through the same engine: pick an indicator from the ten the scorecard uses, an operator, a threshold and a direction, and it is scored in the browser with episode clustering, the transition-matched baseline, the Wilson interval and the twenty-episode floor, the scoring function score() ported line for line from fetch/scorecard.py. The browser covers the thirteen scorecard rules expressible in its vocabulary; it does not carry LPPLS, which uses a different statistical design, Stock-to-Flow, which needs the supply series, or the six site-specific rules, which read the composite. A harness runs those thirteen through the browser engine on every build and asserts it reproduces the pipeline’s episodes, hit rate, baseline, open-episode count and verdict exactly. The page counts how many rules the reader has scored and states how many would look good by chance at that count — one in ten — because that number, not any single result, is what a backtester is for. Without JavaScript the page shows the default rule’s result from the scorecard, which the engine reproduces. Every rule is encoded in the page address so it can be shared.
Base rates, costs on the portfolio tool, shareable links (9 September 2026)
Base rates. Every claim on the scorecard is measured against “what happened anyway”, and until now that denominator had no page. It has one: forward returns from every day since 2013 at four horizons, the two scorecard outcomes unconditionally — a 40% fall within a year on 34.5% of days, a doubling on 53.0% — and both by starting cycle, by months since the halving, and by starting MVRV quartile. A test asserts the outcome definitions are identical to the scorecard’s. The halving table is the only cycle conditioning on the site whose dates were not chosen after seeing the data, and it is four observations; the page says both.
Costs. The portfolio tool now shows return after a spread on each month’s rebalancing trade and a flat annual custody charge, both on the bitcoin sleeve only, both adjustable to 3%. Gross reproduces the pipeline exactly, and the engine test asserts it; the net figure is what a real sleeve would have kept. At ordinary rates the drag is about 0.14 points a year at a 10% weight.
Shareable state. Every control on the portfolio tool is encoded in the page address, so a finding opens exactly as it was left. The link is shown beside the controls.
Capital Flow Monitor (9 September 2026)
A new page answering the question every visitor arrives with — what will it be worth — the only honest way available. Market value at a horizon is realised cap now, plus the capital that arrives, times MVRV at the horizon. Published targets collapse the last two into one number and call the second a multiplier; kept apart, the second is the larger lever and the two are anti-correlated over three-year windows. Realised cap is derived as market cap divided by MVRV, the reconciliation is published to the cent, and a test asserts it. The empirical model is walk-forward tested at every monthly origin before any figure from it appears: it puts the actual inside its own interquartile range 28% of the time against 50% for a calibrated model, forecasting too high by a factor of about 2.3, because each cycle’s capital growth has been lower than the one before. That result is the first thing on the page. The surface shows what each pair of assumptions implies, with every published target located on it and the endpoint MVRV it silently assumes. Holders are counted from primary sources only — SEC XBRL filings and published on-chain addresses — and the residual is everyone else. Four tripwires, each dated, report against live data every morning.
The scorecard shows today (9 September 2026)
Fifteen rules with a track record and no column for whether the rule was firing on the latest day. A visitor’s question is both halves at once: is the signal on, and does it matter. A Today column now sits beside each rule, so the reading and its record are never quoted apart.
LPPLS: the model’s own claim, tested (9 September 2026)
The claim page had scored “a 40% fall within a year” — a reasonable reading of a bubble signal, but not what LPPLS asserts. It fits a critical time. Three further evaluations, all from series the pipeline already computed daily and had never scored: the strict filter set, which turns out never to fire; the negative-bubble mode, two runs, no verdict; and the critical time itself — whether the year’s high landed near the fitted tc, one trial per signal run. One hit in sixteen, worse than random at every tolerance. Scored per day instead of per run the same test gave a p-value indistinguishable from zero; that was an artefact of counting correlated days as trials, and the page reports both numbers so a reader who scores days will know why theirs is wrong.
Power-law page: coverage, limits, and the constant band (9 September 2026)
The walk-forward table now reports band coverage — the share of next-year days inside each refit’s own ±1σ and ±2σ — because that, not RMSE, is what the model’s claim rests on. Pooled coverage is close to calibrated; the per-year rows show why that is not vindication. A new section states the limits the page had not: an effective sample of four cycles, survivorship among model forms, the absence of any mechanism, and that the band is a constant multiple at every horizon rather than widening. The 2040 row is shown with that band. Every figure in the section is filled from the page’s own computation; a check fails the build if a bare number appears there.
The portfolio page (7 September 2026)
Fixed bitcoin weights in a conventional base, measured across every entry year, recomputed in the browser from the aligned monthly series the pipeline publishes. The browser engine is tested against the pipeline on every published weight. Two corrections during review: the equity and gold series are monthly averages, so bitcoin is averaged the same way rather than mixing a close with two averages; and a portfolio missing an asset used to report as whole with weights summing to 0.64, and now refuses. The finding: a 20% weight added 12.2 points of annual return to a 2015 entrant and 0.6 to a 2022 entrant.
Confidence intervals on every scored rule (7 September 2026)
“Five observations cannot be told from luck” was an assertion. It is now a measured range, on the scorecard and on every claim page. A resampling bootstrap was tried first and rejected: when every episode is a hit, every resample returns 100% and the interval collapses to certainty from five observations. The statistic is a binomial proportion, so the Wilson score interval is used; it is correct at both boundaries and deterministic. Pi Cycle’s five-for-five reads 65% to 100%. Where an interval does not overlap its baseline, the page says what the interval does and does not measure: sampling variation between independent trials, and nothing else.
Four external audit rounds (7 September 2026)
An independent review of the pipeline, the site build and the shipped pages, in four rounds over two days. Twenty-four findings; all closed or declined with a stated reason. The ones that changed published data:
Coin Metrics was dated four days in the future, and the drift compounded. The date-convention shift recorded on 6 September was applied to the stored file, and the idempotency flag meant to stop it re-applying was dropped every time the file was rewritten. Each pipeline run pushed the series one more day forward. Five phantom days, each a copy of the last real value, were served publicly, and the freshness check reported them as current because a negative age passes an “older than” test. The shift now happens at ingest on raw rows; every source is truncated at today on write; and a negative age is its own state, future_dated. The convention is re-verified on every run by comparing offsets, and the fit is published in align_report.json.
The published price and MVRV came from different days. Realised value ran to Coin Metrics’ own last date while the headline price came from the Blockchain.com calendar. Price divided by realised price disagreed with the published MVRV by 5.2%, then 0.6%, and now by 0.05% — the residual being the two providers’ prices themselves, which cannot go to zero without picking one source for both.
Censored episodes were never counted. Every eligibility rule already required a complete outcome window, so the “counted separately” promise in the methodology was unreachable code reporting zero. Seven rules had fired inside the last year with no hint on the page. Eligibility now means inputs present; the horizon is applied at scoring; open episodes are named and dated on each claim page.
Hash-rate gaps were zero-filled, which manufactures the capitulation condition because a zero costs a 30-day mean more than a 60-day. Forward-filled. ETF holdings were dated to the scrape day, inventing weekend rows; undated scrapes now fall back to the last business day and every such case is published in date_asserted. The Stock-to-Flow coefficient was described as PlanB’s; it is his exponent with a coefficient that is neither of his published forms, and three pages now say so.
Also from the audits: a build harness that reported success on Windows while rendering nothing, because its snapshot path could not exist there; the chart library served as immutable without a cache-busting hash; social cards generated on one machine and never committed; and the methods contents block covering the page once it outgrew the viewport. Each is fixed and each has a check that fails the build if it recurs.
Source date conventions reconciled (6 September 2026)
Affects every figure derived from Coin Metrics: MVRV, the MVRV Z-score, realised price and realised cap, Puell, thermocap and NVT, and the two MVRV rules on the scorecard.
Blockchain.com and Coin Metrics label the same day’s closing price one day apart. Over the four hundred most recent overlapping days the mean difference between the two price series is 1.59%; shifting Coin Metrics forward a single day reduces it to 0.09%. They describe the same days and disagreed only about what to call them.
Until now kpis.json published both under one as_of, so this site showed a price drawn from one convention beside a ratio computed from the other. On 4 September the dashboard carried a closing price of $81,272.88 and a realised price of $53,139.56 — which divide to 1.53 — beside a published MVRV of 1.499, computed against $79,656, the Coin Metrics value labelled the 4th and in fact describing the 5th. Dividing the two published numbers did not reproduce the third published number, and that was a defect in what this site published, not a rounding artefact.
Blockchain.com is now the canonical convention, because its price is what this site publishes as the daily close, what every chart draws and what the scorecard scores against. Coin Metrics is shifted forward one day to match, in fetch/align.py, which runs before any derived layer and records the choice in the manifest. Price, supply, hash rate, fees, transactions and addresses are untouched.
Which provider is correct in absolute terms is not established here. Checked against an independent daily close — a USDT pair, three hundred days — both series appear late: Blockchain.com by two days, Coin Metrics by one. That reference is itself of unverified convention, so it settles the relative offset and not the truth. Deciding the absolute case needs each provider’s own definition of a daily close, and internal consistency does not depend on it. If Blockchain.com later proves to be the one that is wrong, two constants in align.py change and nothing else does.
The effect on published results is smaller than the effect on published coherence. Both MVRV rules on the scorecard are unchanged — five episodes each, 20.0% against 28.0% and 60.0% against 54.9% — because the clustering window is ninety days and a one-day shift does not move an episode across it. What changed is that the numbers on a page now reconcile with each other.
Unavailable and stale are now different states (3 September 2026)
The dashboard reported “1 source errors” on a morning when every figure on the page was current and correct: CoinGecko’s free endpoint had rate-limited one run, the previous value was eight hours old, and the pipeline recorded the source as an error. That conflates two different situations. A source with no usable value is an error and a reader should be warned in red. A source that failed to refresh but still serves a real value inside its expected age is stale, and the honest report is which figure is how old, not a red warning on a page that is telling the truth. Treating both the same way makes the red notice meaningless, which matters most on the day something is genuinely broken.
The pipeline now decides between them by the same freshness rule it already applies elsewhere: on failure it looks at the newest observation in the stored file, and if that sits inside the source’s expected maximum age the state is stale with the age published, otherwise error. The manifest carries three lists rather than two, along with a plain sentence the pages print verbatim — “all thirteen sources refreshed”, or “twelve of thirteen refreshed; coingecko_global is 1 day old”, or the red form naming what is unavailable. Requests that fail with a rate-limit or a gateway error are now retried twice with a growing pause before any of this applies, since those clear within a minute and were the most common cause. Verified offline against four cases: a failure with a fresh stored value, a failure with a stale one, a failure with nothing stored, and a healthy source.
No further changes are planned as of the last entry above. The suite has now had more review than it has had readers, and the remaining risk is no longer statistical correctness but the temptation to keep adding: another indicator, another composite, a score. Each would make the research worse, and each is declined in advance.
Bitcoin and the Macro Cycle (3 September 2026)
Asked what the toolkit lacked among the series people correlate with bitcoin cycles — the Fed funds rate, M2, the ISM index — the honest inventory was that the readings existed in the snapshot but had never been tested, and that the popular ones were overlays rather than results. The new page publishes nine FRED series raw (the effective funds rate, the two-year yield, M2, the Fed balance sheet, the Treasury account, reverse repo, the high-yield spread, the VIX and ten-year breakevens), assembles net liquidity from its three legs, and tests each against bitcoin the way the technical signals were tested. For every series the thirteen-week change is correlated, Spearman with midranks, with bitcoin’s forward thirteen-week log return at every lead from zero to twenty-six weeks on weekly observations since 2013. Each point carries a moving-block bootstrap interval (26-week blocks, 200 draws, 5th to 95th percentile) and sits against a baseline built from the same series circularly shifted by one to five years, which preserves its own autocorrelation and removes any relation to bitcoin; the 95th percentile of that band is what “no relationship” produces on data like this. A verdict of evidence requires the observed correlation outside the band with the interval excluding zero at three consecutive leads.
Two series are stated as not carried and why: the ISM manufacturing PMI is proprietary with no free primary feed since FRED dropped it in 2016, and “global M2” is an author-specific blend of central-bank aggregates with no single public definition, so US M2 is published and the blend is not; the famous “global M2 leads bitcoin by ten weeks” chart is not reproducible as published. On synthetic random-walk fixtures the page correctly reports no evidence for every series with bands of about ±0.15 to ±0.27, which is the noise floor of roughly seven hundred overlapping weekly observations and the bar a live series must clear. The live results appear after the first pipeline run that carries macro.json; whatever they show, they will show it with a lead, an interval and a baseline, and the page will not turn them into a forecast.
The macro page’s first live run corrected three things. The Treasury General Account is published by FRED in millions of dollars, not billions, so net liquidity had been computed hugely negative and had dropped out of the test; the legs are now converted explicitly and net liquidity reads about $5.8 trillion. The charts were drawn while the page was still hidden and so measured no width; the page now reveals before it draws. And the verdicts moved between two runs on the same data — the high-yield spread read as evidence in one and not the other, the two-year yield the reverse — because both sit within a few hundredths of the shifted-series band and the band is estimated from random draws whose sequence changed when a series was added. Each series now has its own fixed seed, the draws are increased, and the verdict has three tiers: evidence requires a margin of 0.03 beyond the band at three consecutive leads; within 0.03 of the band is reported as marginal; the rest is none. On the live data the first result is that no macro series clears the bar: the two-year yield (−0.26 at lead zero) and the high-yield spread (−0.47 at a 26-week lead) are marginal, net liquidity, M2, the funds rate, the VIX and breakevens sit inside the band at every lead. The liquidity overlay everyone draws describes two series that rose together in 2020–21; on this test it does not lead.
Final audit patch (3 September 2026)
Two further reviews of the complete package converged on a short list, and every item was adopted. The Metcalfe input is now named for what it is everywhere it appears: a cumulative address-activity proxy, the running sum of daily unique addresses, in which an address is counted again on every day it is used — a proxy for network size, not a count of distinct users. The null comparison is correspondingly a Metcalfe proxy vs time-model comparison, and its question is whether that proxy adds information beyond time, not whether “the network” does. The ETF coverage sentences say five issuers by ticker (IBIT, ARKB, BITB, HODL, OBTC), the daily series is called a holdings-derived flow with the disclosure-to-disclosure convention stated, and the quarterly layer says what it is: thirteen trusts attempted, seven currently resolving to a recognised coin-quantity element, the rest reported unresolved with what they do tag. The source principle is restated accurately as free, keyless, publicly accessible sources with primary sources preferred, since the relative-value layer uses a public mirror for two monthly series. The dependence matrix no longer speaks of factors; it summarises evidence overlap. The hand-maintained reference figures now live in data/references.json, which both pages read, with the in-page values as fallback, and the Cane Island as-of date is 1 September 2026 in one place.
The LPPL calibration had one remaining inconsistency: the optimiser excluded critical times within a day of the window end while the filter permits them, and the window convention was stated two ways. The search now covers (t2, t2 + dt] to within a hundredth of a day, dt is t2 − t1 for every window, readings are computed through the last completed daily-average observation by design, and the trailing thirty days are recomputed on every run so a revised daily average is absorbed. The full history was recomputed a third time. The record moved again and the conclusion did not: 561 signal days in 18 runs (from 424 in 16), a 40% fall within a year after 28% of them against 34% of all days, a doubling after 64% against 53%, random-block probability 0.67. The 2017 top now reads 0.625 on its eve, April 2021 reads 0.25 and November 2021 0.125 — both now faintly qualifying under the exact boundary — and October 2025 still reads zero. Earlier figures in the entries above are superseded by these. The lead-time table notes that the early-2014 runs fired after the December 2013 top, which is part of the record rather than a display fault.
Two wording corrections on the newest panels. The “if you came here to decide” box on Where Things Stand had drifted back into instruction in three sentences; it now describes — what a fall of half would do is a fact about the reader’s position that no reading changes; the record of a signal is on the pages named; holding is a decision with evidence for and against it — and the sentence naming it the best-supported course is gone. The dashboard’s start-here text said the readings were independent observations while the dependence panel beneath it shows seven pairs correlating at 0.8 or above; it now says separate, not votes, and not independent, and points to the panel. The deployment script omitted the LPPL module and history and checked an ETF field before fetching it; both corrected, and the script now takes the package’s LPPL history only on first deploy or when newer than the live file.
Navigation and reading order (3 September 2026)
Three questions from the author decided the last changes before publication: where the synthesis page belongs, how a visitor is meant to move through twelve pages, and how far ahead the bubble model fires. The subnav on every page now runs synthesis first — Dashboard, Where Things Stand — then the valuation lenses, then market structure, then the two pages that show what does not work, then Methods; the previous order was the order the pages were built in. The dashboard opens with today’s composite state read from composite.json, the “what changed” panel moved above the grid, and a “start here” block that gives a first visitor three steps and a returning one the two places to look. The extended-indicator table on the dashboard carries the LPPL reading with its record beside it, and the evidence brief on Where Things Stand carries one LPPL line under the reduce question, stating that a qualified bubble fit on the record preceded a large fall less often than an ordinary day did.
The lead-time question got its own table on the Autopsy. For every run of days at or above 0.5 since 2013 it shows the first day fired, the run’s length, the highest close within the following year, the days and the rise to it, and the fall from that high. The 2017 row is the one to read: the condition first fired on 18 January 2017 at $907; the high came 333 days later at $19,280, twenty-one times higher, and only then came the 83% fall. The model marks a condition that can persist for most of a bull market; treating its first firing as a sell signal would have cost the whole year. That is now stated on the panel, computed from the same series, rather than left for a reader to work out.
LPPL, the bubble model, built and tested the house way (2 September 2026)
Asked whether a log-periodic power law would have caught the October 2025 event, the answer was that it is the one model in this family designed for cycle tops and makes no claim on shocks; the useful thing was to build it properly and publish its record beside the others. The pipeline now computes the Johansen–Ledoit–Sornette model in the Filimonov and Sornette (2013) linearised form, in which the four linear parameters are solved by least squares for each candidate critical time, exponent and log-frequency, and only those three are searched, by a fixed coarse grid (twelve critical times spanning the full interval the primary filter permits, three exponents, three frequencies) followed by Nelder–Mead. The published reading is the share of eight window lengths, 120 to 730 observations, whose best fit passes the qualification filters, computed daily from 1 January 2013 as of each day on that day’s data only. A window of W days is the last W observations. The full daily history, 4,993 points, was computed once and ships with the repository; each run extends it by the days not yet stored.
The specification was fixed before evaluation, and the reason is recorded because an earlier draft got it wrong. That draft described its filters as “Gerlach et al. style” and justified them as the set under which the model performs best; a reviewer pointed out that the filters were not the published ones and that choosing a specification by its historical record is selection bias. Both points were right. The primary specification is now the Gerlach, Demos and Sornette (2019) rule set as published: exponent strictly between 0 and 1, log-frequency between 4 and 25, negative power-law coefficient for a positive bubble, critical time within one window length ahead, damping at least 0.5, and at least two and a half oscillations, that last condition applied only when the oscillation amplitude relative to the power-law term is at least 5%, as the paper specifies. It is used because it is an externally defined rule set, not because of how it performs. A stricter set — exponent 0.1 to 0.9, frequency 6 to 13, critical time within a fifth of the window, damping at least 1 — is computed alongside as a sensitivity analysis and is never used to select a result. Both sets are published in the data file with the series, and the fit diagnostics include the oscillation-to-trend ratio so the size of the log-periodic component can be read.
Under the published filters the model is not quiet. A positive reading of some size appears on about 39% of days and a reading of 0.5 or more on about 10%, in twelve runs with a median length of 23 days and a longest of 210. Evaluated at the level of signal days with a completed year — 525 of them — a fall of 40% or more within the following year came after 23% of those days, against 34% of all days since 2013; a doubling came after 68% of them against 53%. (These figures come from an earlier build with a narrower critical-time search and are retained only as a development note. The current specification, recomputed on the full permitted interval to an exact boundary, gives 561 signal days in 18 runs; a 40% fall within a year followed 28% of them against 34% of all days, a doubling 64% against 53%, random-block probability 0.67. Every panel on the site uses the recomputed series.) Against ten thousand random draws of day-blocks matching the number and lengths of the signal runs, the probability of a hit rate at least as high as the observed one is 0.70. (earlier search; now 0.69) On this record the model fires during the accelerating phase of advances, which mostly continued. Under the strict sensitivity set the confidence never reached 0.5 on any day. The clearest single reading in the record is the 17 December 2017 top, at 0.75 on its eve and 0.75 a month before; it is also true that the reading had been at 0.5 or more for most of the preceding eleven months, from a price near $1,100. On the eve of the other four rule-defined tops it read 0.25, 0.00, 0.00 and 0.00, and on the eve of every shock it read zero. These are three different scores on three different denominators — tops and shocks, episode starts, and signal days — and the page keeps them apart rather than blending them.
Three findings from the build are recorded because a reader may otherwise take the model’s reputation for its record. The fit is genuinely multi-modal: a first implementation without a grid search missed the 2017 fits altogether, and the result is stated as conditional on the fixed search, which is not the original authors’ optimiser. The qualifying fits of December 2017 have small oscillation amplitude; the detectable part of that bubble was the super-exponential trend rather than the log-periodicity in the model’s name, and Pele and Mazurencu-Marinescu-Pele (2019) report the same of their own fits, with the oscillation coefficient near zero. And their published result, a next-day critical time from a 700-observation window ending 11 December 2017, could not be reproduced: on that window a standard fit drifts to the exponent boundary with a critical time months out; the detection here comes from the shorter windows and is stated as window-dependent. The structural critique of Brée and Joseph (2013), that LPPL fits are unstable and the published criteria fail out of sample, is consistent with this record.
The model has its own panel on the Indicator Autopsy with the confidence drawn under price, the episode table with the strict reading beside each, the signal-day evaluation against the random baseline, and a column in the day-before table where the values are exact daily readings. Elsewhere it appears only as a reading: one clause on the dashboard’s technical line and one clause in the Evidence Brief on Where Things Stand, each carrying the note that confidence is a robustness measure across windows and not a probability, and each pointing to the record. It is not a gauge and it raises no alert. Verified headlessly: the strip, the episode table, the chart, the day-before column, the dashboard clause and the brief clause reproduce the pipeline’s file, and the file reproduces the independent computation.
A further external review of the LPPL work, made on the earlier draft, raised six points; three were already resolved by the fixed primary specification and the run-based evaluation, and the other three are adopted as wording. The reading is labelled a qualified-fit confidence, house implementation, because eight windows is a coarser ensemble than the published multiscale indicator, which scans many nested windows; the shocks are said to read zero “consistent with the model’s intended focus” rather than “as it should”, since the first is a description and the second a validation claim; and the 2017 detection is described as reproducible under the stated specification and strongly window-dependent, rather than as real, which would be a claim about the bubble rather than the fit. It is also stated that neither filter set uses a relative-error criterion, so there is no formula to disclose. The results were not changed by the review, as they should not be.
The final external review of the LPPL package asked for two changes and signed off on the rest. The strict sensitivity set is no longer attributed to any single paper; it is described as a commonly used restrictive parameter set, included only as a sensitivity analysis. And the random-block sampler behind the baseline had an inexact non-overlap test — it compared a candidate block’s length against earlier starting points, so a longer earlier block could still overlap a shorter later one. It now tracks placed intervals and rejects any intersection. The baseline was regenerated: the probability of a hit rate at least as high as the signal’s under random blocks moved from 0.70 to 0.71, which changes nothing and was fixed anyway, because a randomisation should be exact whether or not its result is favourable.
A review of the combined release as one system raised two LPPL points, both adopted. First, the numerical search for the critical time covered only the first 40% of the window ahead while the primary filter permits a full window ahead, so the filter described the qualification rules but not the calibration; the search now spans the full permitted interval with twelve grid points, and the entire daily history was recomputed under it. The record moved modestly and the conclusions did not: 424 signal days in 16 runs (from 525 in 12), a 40% fall within a year after 25% of them against 34% of all days, a doubling after 64% against 53%, and a random-block probability of 0.69. The 2017 top still reads 0.75 on its eve; the 2021 and October 2025 tops still read zero. Second, the reading is described as a share of eight windows, and it is now published only when all eight exist; on this price series that has always been the case from the first published day, so the rule is a guard rather than a change. The LPPL file is also now written atomically, so a failed daily extension cannot damage the last good history. Two documentation points were corrected with it: the release notes still called the Where Things Stand panel a decision brief, and the build status now says that its thirteen external source families are external, with LPPL, the composite and the research layers derived from them rather than counted among them.
Transition-matched baseline on the Autopsy comparison (2 September 2026)
The fifth item from the same review, taken rather than deferred. An eligibility-matched baseline compares a crossing with every day the line existed; but a crossing is a transition, and the days that most resemble a non-event are those on which the line existed and was not crossed. Each rule’s baseline is now the median over eligible days excluding the trigger days and the ninety days after each, so the aftermath of a crossing is not counted as “did not cross”. The difference then answers whether crossing the line added information over days the line existed and was not crossed. On the current data the 2-year MA buy band, which had trailed the eligible-day baseline by 7 points, is level with the days it could have fired but did not: +71% against +71%, a one-point difference, and the verdict now reads “indistinguishable” rather than “behind”. The 200-week cross is 96 points ahead of its non-firing days (+153% against +58%), on seven triggers, still without an interval. The Pi Cycle and the 5× sell band move by a few points. The all-days figure, the eligible-day figure and the transition-matched figure are all on this page now, so the reader can see that the choice of baseline is a choice, and which one the table uses.
Fifth review: censoring, naming and the grouping convention (2 September 2026)
Four small corrections from a review of the v8 build, none of which changes a number on the day of writing. Right-censoring. A state episode still running today, or one that ended within the last thirty days, has an outcome that is not yet known; it had been counted in the base-rate denominator as “no fall”. Episodes now enter the denominator only once their whole thirty-day horizon has elapsed, and the note says how many are waiting. Today the composite reads average, so nothing is excluded and the figures stand at 5 of 32, 5 of 12 and 4 of 4. Pi Cycle. The base-rate note had said the indicator was “in a fired state on four occasions”, which describes the condition persisting, not the crossing that is the rule as published; the note now states both, four condition episodes and four crossings, and points to the ex-ante comparison for the crossings. The grouping convention. Declines within 180 days of one another are treated as one episode. That is a convention, not an estimate, and it is now said so on the panel with the count under 90-, 180- and 365-day grouping: fourteen, ten and six events on the current data. Naming. The panel is an ex-ante signal comparison, not a test: with four to a dozen triggers per rule there is no interval and no verdict, and calling it a test implied machinery the page does not use. The Autopsy’s strap now reads “the popular signals, measured” and names what the page contains. The dependence panel on the dashboard states that it is a level correlation, not a causal or factor-independence test.
Technical Signals re-baselined the same way (2 September 2026)
The caveat recorded in the previous entry is closed. Each of the eight rules on the Technical Signals page is now compared with the median over the days on which it could have fired — after day 14 for relative strength, 26 for the MACD, 200 for the moving-average crosses and 750 for the two squeeze rules — and the baseline side of every bootstrap interval is drawn from the same eligible set. The full-history median stays in the banner for context only. No verdict changed: six rules still show no clear evidence, the Bollinger squeeze still shows evidence of trailing at one month, and relative strength above 70 still shows evidence of an edge at one and three months. The sizes moved where eligibility mattered, which is the squeeze rules: their all-days baseline had included 2010 to 2012, days on which a two-year lookback did not exist, so Bollinger’s one-year difference moves from −19 to −1 points and realised volatility’s from +14 to +32, both still inside intervals that include zero; the golden cross moves from +5 to +12 at one year, likewise inside its noise. Relative strength and the MACD, which need a fortnight of history, barely move. Rendered headlessly against the live snapshot before and after; the before and after tables are both recorded here so the change can be seen for what it is.
Fourth review: the baseline must be eligibility-matched (2 September 2026)
A reviewer of the previous build made one point that changed a number. The ex-ante table on the Indicator Autopsy had compared each rule with the median return after any day since 2010, but a rule can only fire on days its inputs exist: the 2-year moving average after day 730, the 200-week after day 1,400, the Pi Cycle after day 350. Days a rule could not see should not be in its baseline. Each rule is now compared with the median over the days on which it could have fired, with a completed forward window, and the note states the count. The 2-year MA buy band, which had trailed the all-days baseline by 25 points, trails its eligible-day baseline (+78% at one year, not +96%) by 7; the 200-week cross is 84 points ahead of its eligible baseline of +69% rather than 58 ahead of +96%. The direction of every verdict survived; the sizes did not, which is the point of matching. The Technical Signals page still uses the full-history baseline for the reasons its method note gives, and its rules need at most 200 days of history, so the mismatch there is a fraction of this one; it is recorded here as the next thing to check rather than changed in this build.
Three wording corrections from the same review. The null test now reports the network-versus-time difference year by year as well as pooled: pooled, the user stock predicts the following year 2.5 points better than calendar time; across the seven refit years it was better in five, with the difference ranging from −24 to +20 points, so the panel says the user stock does not clearly outperform the simpler model and that this is not a finding that the Metcalfe model fails. The dashboard panel that had been headed “how independent are the readings” is now “evidence dependence”, because a correlation of 0.8 establishes strong association, not identity; what it establishes is that such readings are not independent confirmation, and that is all the panel claims. And the page count is stated one way everywhere: thirteen pages: the dashboard, eleven research pages and this one.
The three items that needed the live endpoints (2 September 2026)
Osprey OBTC is now measured. REX serves the Osprey Bitcoin Trust page from the server with the holdings table in plain HTML — a bitcoin row with a coin count and an as-of date — so it meets the same standard as the four daily issuers and is parsed with a fixture test against the page as it read on 1 September 2026 (935 coins). It is small; it is included because it is primary and daily, not because it moves the total. The Morgan Stanley Bitcoin Trust is assessed and documented: its product page is a client-side template whose holdings section is filled from an internal JSON endpoint, and no holdings file is served to a plain request, which is the same class as Fidelity and Franklin. The universe file now records it with that reason rather than as pending.
The options term structure. From the Deribit chain already fetched for the skew, the daily job now takes the 50-delta level on every listed expiry (the same construction the skew uses), interpolates in days to expiry to 7, 30, 90 and 180 days without extrapolating, and publishes those levels and the 180-minus-30-day slope as series; the full curve for the day goes to the manifest. The Flows page shows the tenors and the slope in words: upward-sloping is the normal state of a calm surface, inverted marks stress. Percentile ranks unlock as history accrues, like the other second-tier series. The construction was verified on a synthetic chain with a known smile; the first live run should be read once against the exchange’s own display.
The quarterly layer, and a correction to the plan. The intended source had been Form N-PORT, the monthly holdings report. Spot bitcoin ETPs are 1933-Act grantor trusts, not 1940-Act funds, and do not file it; their periodic primary disclosure is the 10-Q and 10-K, in which the coin quantity is tagged in XBRL (iShares’ first 10-Q tags 252,011 bitcoin as of 31 March 2024, for instance). The daily job now reads the 13-name universe, of which 7 currently parse (IBIT, FBTC, GBTC, BTC, ARKB, EZBC, OBTC) from the SEC’s companyfacts API, finds the coin-quantity concept by rule (each issuer uses its own custom tag), keeps one value per period end with the latest filing winning, and publishes etf_quarterly.json as a reconciliation layer: public, keyless, primary preferred, up to 45 days stale by construction, never merged into the daily series. Where a trust also has a daily series the quarter-end figure is compared with the daily file on that date and the difference published, which is the first independent check the daily parsers have had. The Flows page carries the table. The concept-finding rule was tested on a fixture built from the iShares filing, including an amendment superseding an earlier value; the first live run should be read once against a filing before any of its figures are quoted, and the manifest says so.
One composite, an ex-ante companion to the event study, and three research outputs from the pipeline (2 September 2026)
The valuation composite is now computed once. Where Things Stand, the KPI module and the Indicator Autopsy event study had each carried their own implementation of the same rule. The daily job now writes composite.json: the as-of percentiles of MVRV, the Mayer multiple and the expanding-window power-law deviation, ranked against prior days only from 2013 with at least 250 prior observations, averaged without weights and cut at 10, 30, 70 and 90. The event study reads that file and falls back to its own computation only if the file is missing, and says which it used. Where Things Stand still computes its own strip, because its charts need the intermediate series, but it now fetches the pipeline’s value and prints whether the two agree; on the day of writing they do, 38 against 37.8. If they ever disagree the page will say so in the strip rather than hide it.
The event study has its ex-ante companion. A reviewer objected, correctly, that an event study answers “what was visible before known declines” and not “what happened when the rule fired”. The second question is now answered in a panel above the event study, on the Technical Signals protocol: each rule triggered with only the information of the day, the median return that followed at ninety days and one year beside the median after a randomly chosen day, and the difference in points. No rule here has twenty triggers, so none gets an interval, and the panel says why. The result rewrote one of the page’s own verdicts: the 2-Year MA buy band’s median of +71% a year after entry had been described as “useful”; the median after any day in the same history is +96%, so the buy band has been followed by gains but by less than a random day, and the verdict now says that, computed from the two medians rather than written. The 200-week cross below sits ahead of the baseline (+153% against +96%) on seven triggers; the Pi Cycle, a top signal, is followed by negative medians as it should be, on four.
Three research outputs the pages read rather than derive. A null test for the Metcalfe model, asked for by a reviewer: on the 2017 window, ln price regressed on calendar time alone predicts the following year with 60.5 log points of error and an R² of 0.830; on the user stock alone, 58.0 points and 0.845; on both together, 77.9 points, with the time coefficient turning negative. The user stock carries slightly more information than time, and the joint model is worse than either because the two regressors are near-collinear on a series that has grown six orders of magnitude; it is reported because it was asked for, with that caveat printed beside it. An independence matrix: Spearman correlation of the daily levels since 2019 of the ten readings this site publishes as states, now on the dashboard, so that the columns which agree can be seen to be one factor. Seven pairs sit at or above 0.8; MVRV, the power-law deviation and the composite that averages them are, as they should be, largely one measurement. And a change feed, changes.atom, one entry per snapshot listing what moved against the previous row of the history file and the valuation state it implies. No signals; a reader who subscribes gets the same sentences the dashboard’s new “what changed” panel prints. All three are written by the daily job from the same snapshot, in an isolated module, so a failure in any of them is recorded in the KPI file and does not stop the run.
Each page touched was rendered headlessly against the live snapshot files before packaging; the headless run caught one defect in the draft (a window constant scoped inside the fallback branch) that a static check had passed, and every figure above reproduces the independent Python computation.
Historical event study: every indicator before each large decline (2 September 2026)
A reader asked whether any model, indicator or on-chain metric caught the crash of 10 October 2025. The honest answer was no, and the honest way to give it was to replay every indicator the site publishes as it read on that day with no later information. That replay is now a permanent panel on the Indicator Autopsy, extended to every comparable event. It is an event study, not a predictive test: the events are identified from what price did next, and only the indicator readings are point-in-time. The panel says so in its first sentence.
The events are chosen by rule so the list cannot be curated: any day from whose close price fell 30% or more within thirty days, and any all-time-high close followed by a 40% drawdown within six months, clustered at 180 days so one decline counts once, with the last all-time high in a cluster taken as the event. On the current data the rule finds ten since 2013 — five cycle tops (December 2013, December 2017, April and November 2021, October 2025) and four sharp shocks (September 2014, October 2018, February 2020 into the COVID crash, May 2022). For each, the table shows the valuation composite and state, the MVRV percentile, the Mayer multiple, relative strength, the Pi Cycle gap, the two-year-average multiple, Fear and Greed and DVOL where their histories reach, and then the lowest close within thirty and one hundred and eighty days. Today is the last row.
The finding is clean and unflattering in the right way. Valuation read expensive or very expensive on the eve of four of the five cycle tops and none of the four shocks; the shocks began from average or cheap valuations with relative strength near neutral, because they were liquidation cascades rather than exhaustion. The panel also states what a warning is worth in base-rate terms, counted by episode rather than by day (a contiguous stretch in a state is one observation; it counts as followed by a fall if a 30% decline within thirty days began on any day of the stretch): the composite was expensive or very expensive on 32 separate occasions since 2013 and a fall followed 5 of them; very expensive on 12 occasions, a fall followed 5; the Pi Cycle was fired on four occasions, each of which contained the start of such a fall, and it was fired on the eve of two of the five tops and none of the four shocks. For context, a 30% fall within thirty days began on 7% of all days since 2013. On 7 October 2025 specifically, the composite read average at 65, relative strength was 73, the Pi Cycle was 43% short of triggering and DVOL sat near the bottom of its range; what followed was a 50% decline to February 2026.
Two limits are stated on the panel. The site’s price series is a daily average, so an intraday crash that recovered by the close — 10 October 2025 among them, which shows as a 1.3% daily move — registers through the decline that followed rather than on the day. And the family most likely to have shown fragility before a liquidation cascade — funding, open interest, options skew, CME positioning — has been recorded here only since late 2025, so none of the past events carries a leverage reading. That is the “going forward” part: those series now accumulate daily, and the next event will be the first with a record of them on its eve. Whether they would have helped is a question the table will answer in time rather than assume now. Verified headlessly against the live snapshot: the event list, every row, and both base rates reproduce the independent Python computation.
Asked immediately whether the panel had flaws, the answer was yes, and the ones that could be fixed in the panel were. The outcome columns partly restate the selection rule — a shock was chosen because a 30% fall followed within thirty days, so that column proves nothing for shocks, and likewise the six-month column for tops — and the header now says so; the “kind” of event is assigned with hindsight and is labelled “turned out to be”. The base rate is split at 90: the very-expensive band carries 5 of its 12 episodes against 5 of 32 for all expensive episodes, and it is the band most of the flagged tops sat in. A threshold-sensitivity line reports the event count under neighbouring parameter choices — thirteen, ten and ten — so the reader can see that the list moves at the margin while the verdict does not. And the summary states that ten indicators across ten events guarantees some cell will appear to have caught any single event, so the table is to be read by its columns rather than mined for hits. What remains unfixable is stated rather than hidden: ten events and five tops is a small record, April and November 2021 are two ends of one bull market counted twice, and the MVRV history is a current-vintage series that may embed methodology revisions the day itself did not have.
Corrections before the panel was published. A review of the draft found that the base rates were counted by day rather than by episode: an expensive reading on 832 days with a fall following 90 of them, and the Pi Cycle fired on 323 days with a fall following 130, weight each state by how long it persisted and are the overlapping-window error this site refuses elsewhere. The figures above are the corrected episode counts; the day counts are recorded here so the change can be seen. The verdict sentences were computed from the counts rather than written beside them, so a future event that contradicts today's pattern changes the sentence rather than the page. The panel was retitled an event study, with the retrospective selection of events stated in its first sentence and the non-independence of its columns stated in its second; the assertion that the shocks were liquidation cascades was removed, because the leverage series that would support it do not exist before late 2025. Three further defects were repaired in the same pass: the additional snapshot files the panel needs were being awaited before the existing panels rendered, and now load after them; a failed MVRV feed labelled every row "before 2013 window" and now says the feed is unavailable; and forward-filling across gaps in Fear and Greed and DVOL is limited to seven days. Two pre-existing defects on the same page were fixed at the same time: the 2-year MA and 200-week medians took the upper-middle observation on even counts and now use the conventional median, and the stock-to-flow verdict said scarcity "stopped explaining price", which is causal language the data does not support; it now says the published specification lost calibration, with the price-to-model ratio printed beside the log-point figure. An episode-counted Pi Cycle at four of four is not a rate; the panel says so.
Third external review: five corrections and a data-integrity layer (2 September 2026)
A further review of the deployed site found no calculation defect but five things worth changing, each verified against the code before it was touched.
The crowding composite could silently change composition. The rule that averages funding, open interest to market cap and Fear and Greed accepted a day with only two of the three present and averaged what it had, so the series could be a three-component composite on one day and a two-component one on the next with nothing on the page to say so. The pipeline and the Flows page now require all three; a day with fewer is blank rather than averaged, and the KPI file records how many components were present.
The ETF universe sentence had aged. "Every US spot issuer has been checked" was true of the January 2024 cohort and no longer true of the market: the Morgan Stanley Bitcoin Trust has traded since April 2026 and the Osprey trust has been an ETF since December 2025, and neither had been assessed. The panel is now titled for what it is, holdings-derived flow from five issuers (IBIT, ARKB, BITB, HODL, OBTC); the coverage line states that it is not total spot-ETF flow; both new products are recorded as not yet assessed rather than silently absent; and the data file carries the date on which the universe was last compared with what is listed, so the sentence cannot rot unnoticed again.
The decision brief named a course of action. Under a notice that nothing on the page is a recommendation, the brief closed with "the best-supported course today is doing nothing". That is a recommendation with a modest verb. The panel is now the evidence brief, and its closing line states what the tests establish and stops there: on most days, that no tested evidence establishes an advantage for adding, reducing or rotating. This is also the stronger statement; it claims exactly what the intervals support.
Terminology. The intervals on Where Things Stand and Technical Signals are described as ninety per cent moving-block bootstrap intervals, robustness estimates under the stated dependence structure, rather than as confidence intervals, which invites a model-based reading the procedure does not earn. The Relative Value page counts switching events rather than "independent decisions", since consecutive crossings share a trend episode.
Freshness is not the same as a successful fetch. The manifest recorded whether each fetch succeeded and the last date it held; it did not judge whether that date was acceptable. Each source now carries an expected maximum age, its actual age in days, and a freshness state of current or stale, and the manifest lists stale sources beside errors. The KPI file also publishes the 2011 reference calibration under keys named for what it is (value_reference, reference_fit_from); the legacy *_full_history keys are kept for one release, because the name was a misnomer that this document had already retired in prose.
Build status above corrected to twelve pages and thirteen external source families; the panel had not been updated when the Relative Value page and its source were added. Hand-written sentences that describe a live figure ("currently off by nine times", "run near 460 thousand today") now carry the date they were true, on every page where one was found. The Technical Signals banner now leads with the post-2017 baseline median and gives the full-history figure second, with its spread; the table is unchanged and still scores every rule against the full-history baseline, for the reasons the method note gives.
Navigation and the two synthesis pages (2 September 2026)
The research sub-navigation had grown to eleven items and wrapped onto a second line. On screens wider than 1200 pixels it is now a fixed left rail; below that width it remains the horizontal strip, and the mobile menu is unchanged. No item is hidden at any width.
A reader could also reasonably wonder why there are two summary pages. The distinction is now stated at the top of each rather than left to be inferred: the dashboard is the terminal, showing every reading the snapshot publishes with its provenance, while Where Things Stand answers a single question about where price sits against its own record and what has followed from comparable readings. Each page links to the other in those words.
Lost-coin default set to none (1 September 2026, recorded 2 September)
Omitted from the record when it happened, entered now. With the headline calibrated from 2011 for comparability with published Metcalfe figures, which state no supply adjustment, the lost-coin control was set to default to none so that the reference value is directly comparable; the 3.5M front-loaded profile that the redesign had made the default remains one click away and is still the profile the method note describes as most plausible. The validated 2017 calibration is unaffected in its ranking.
Correlation panel corrected (2 September 2026)
A reader asked why the gold line on the correlation panel was so short, and the question exposed something worse than the gap it asked about. The panel’s note said that in 2022 bitcoin traded as a leveraged Nasdaq position, beside a computed 2022 average of 0.11 that contradicted it; the chart never exceeded about 0.35 while the widely reported 2022 figure was above 0.6. The cause was the input. The blockchain.com price used across the site is a daily average, which is the right series for valuation and the wrong one for return correlation: averaging smears each day’s move across its neighbours and biases correlation toward zero. The snapshot now carries a true daily close for bitcoin from Coinbase Exchange, the panel correlates close against close, and it says which basis it is using.
The gold line was short because tokenised gold traded thinly on Coinbase for its first years, leaving runs of unchanged closes on which a correlation is undefined or meaningless. A window is now reported only where the denominator moved on at least sixty of its ninety days, and the note says so. And the narrative sentences in that panel were replaced by computed ones: the peak, the trough and the 2022 average are now read from the series, with their dates, so a sentence can no longer sit beside a number that disproves it.
The same question arrived for the S&P 500 line, which began in 2016 because FRED’s free daily series carries ten years. The long ratio now uses Robert Shiller’s monthly S&P 500 series, public domain and mirrored on GitHub, from 2010 like gold; FRED’s daily closes serve only the correlation panel. A first attempt merged the two, filling the monthly series’ most recent gap from the daily feed, and a test fixture caught what that does: a one- or two-day partial month placed beside full-month averages manufactures a spike at the right edge of the chart. The monthly series is now used alone and lags by at most a month, which is stated.
The gold line on the correlation chart was then found to cover only sixteen months against ten years for equities. The reason was not thin trading, as first assumed, but listing: Coinbase listed tokenised gold in May 2025, and no free primary source carries daily gold before that. Rather than draw a mismatched chart, the panel was rebuilt on two stated time scales. The chart is now the rolling 24-month correlation of monthly returns, with bitcoin, gold and the S&P 500 all as monthly averages from 2012, so both lines run the full history on identical footing; the strip carries the 90-day daily reading for currency. On the current data the two scales disagree — the 90-day window reads as money while the 24-month window reads as equity-like, at 0.47 with the S&P 500 and near zero with gold — and the panel leads with that disagreement rather than with the scale that makes the better headline. An earlier note on this page describing bitcoin as trading like gold “for the first time on this data” rested on the short window alone and is withdrawn in that form.
Decision brief (2 September 2026)
A reader asked, fairly, whether twelve pages of measurements enable a decision or merely surround one. The honest answer was that the inferences a decision needs were all present but scattered, and that nowhere did the site assemble them into the three questions a holder actually asks. Where Things Stand now carries a decision brief that does so: is there evidence to add, to reduce, to hedge, or to rotate — each answered with the evidence on this site and a strength rating.
The ratings are assigned by rule, not by judgement, and the rules are printed under the table. “Strong” requires a bootstrap interval on this site to exclude zero in that direction, which today only the very-expensive valuation state does for reducing and only the cheap state does for adding. “Moderate” is a large historical difference on a small or overlapping sample, such as a hash-ribbon recovery inside its ninety-day window. “Weak” is a direction with a known failure record, such as the drawdown label. “None” means no tested evidence points that way. A closing line names the best-supported course, and because the rules require strong evidence in one direction before naming anything other than doing nothing, doing nothing is what the brief names on most days — including today. That is deliberate: holding is a decision, it can be evaluated like the others, and it is usually the one with the least evidence against it.
The brief states no recommendation and cannot: which question applies depends on horizon, position size, tax and whether a fall of half would force a sale, none of which the data contains. What it does is turn the site’s findings into the form an investment committee would actually use — evidence, direction and strength — and leave the decision with the person whose situation it is. Verified headlessly against the live snapshot: every rating and every sentence in the brief reproduces from the same computations the other panels publish.
Relative Value Monitor (2 September 2026)
New page (/tools/bitcoin-relative-value) and a new snapshot source, relative.json, carrying the denominators: gold and silver as monthly averages from the World Bank Commodity Markets “Pink Sheet” (public domain; gold falls back to the datahub mirror of the same series if the World Bank file is unreachable from the runner), the S&P 500 and Nasdaq daily from FRED, and ether, Solana and tokenised gold daily from Coinbase Exchange. Every leg is isolated so one failure cannot remove the others, and each series is named to its source in the snapshot’s provenance block. The London gold fixing series formerly on FRED was deleted in January 2022 and no free keyless daily replacement exists, which is why the long history is monthly and the daily readings begin in 2020; both sides of every long ratio are like-for-like monthly averages.
The page shows what one bitcoin buys of each denominator since the earliest month both exist, which side won each calendar year, and a rotation test that is the reason the page exists. Two rules — momentum, holding bitcoin when the ratio is above its trailing mean and the denominator otherwise, and its mirror, mean reversion — are run at three lookbacks (6, 12 and 24 months) from two start dates, with monthly rebalancing and 0.2% per switch, against holding bitcoin, holding the denominator, and a monthly-rebalanced 50/50. All three lookbacks are shown because a single one would have been a choice, and the choice decides the result: on the current data the 12-month momentum rule beats holding bitcoin against gold from both start dates while the 6- and 24-month versions lose, and mean reversion trails holding in almost every test, its few wins all against ether and all dependent on the lookback and the start date. Every column of one table starts in the same month (for ether, May 2018, the first month all three lookbacks have history), so the lookbacks are compared over the same period. The page states this as its headline rather than reporting the lookback that worked. The number of independent decisions, the count of times the ratio crossed its trailing mean, is stated beside each table because that, not the number of months, is the sample; it is seventeen for gold at the 12-month rule.
A correlation panel reports the rolling 90-day correlation of bitcoin’s daily returns with the S&P 500 and with tokenised gold, with a reading in words — a tech stock, money, its own thing, or mixed — and the 2022 average as the reference for the tech-beta regime. Verified headlessly: the gold and S&P figures, the calendar-year table and every cell of the rotation tables reproduce the independent Python computation; the ether, Solana and correlation panels were exercised with synthetic fixtures for rendering and will carry real figures once the source has run.
The baseline itself, qualified (2 September 2026)
A reader asked whether the sentence “buying on a random day since 2010 returned about 96%” was itself properly supported. The figure is correct — it is the median one-year forward return across all 5,494 days with a completed window — but the sentence was loose in two ways, and one of them was a version of the error this site criticises elsewhere.
First, “returned” implied a typical outcome from a distribution that is severely skewed: the tenth percentile is −51%, the ninetieth is +943%, the mean is +441%, and 27% of days were followed by a loss. Second, the figure is sensitive to where the history starts. Roughly half of it comes from 2010 to 2012, when Bitcoin moved from cents to dollars; measured only from 2017 the median is about 50%. That sensitivity was not disclosed, which is precisely the specification-sensitivity problem the methodology section cites Leamer on.
The banner now publishes the spread, the share of losing days and the post-2017 figure alongside the headline number, and the method note explains why the full history is retained: it sets the harder benchmark for a signal to beat, and every comparison in the table applies the same baseline to both sides, so the differences the page reports are unaffected by the choice. The correction changes no result on the page; it changes how much confidence the baseline sentence invites.
Closing polish, and a note on where this stops (2 September 2026)
An external review of the deployed site recorded no blocking or substantive issues remaining and advised against delaying publication for the rest. The remaining suggestions were wording, and they have been applied: the technical-signals page speaks of a historical difference from the baseline rather than an edge, since the shorter word implies tradable advantage the page explicitly declines to claim; the Where Things Stand composite is named an equal-weight descriptive composite wherever it appears, so the aggregation assumption cannot be missed; the Metcalfe page describes a Metcalfe-style specification rather than Metcalfe’s Law, because what is implemented is one empirical operationalisation of it; the crowding gauge now states that its three components are not independent of one another; and the miners page describes hashprice in analytical rather than editorial terms.
One substantive item from that review was also addressed. Every page computes its figures in the browser, so a reader without JavaScript — and any crawler or assistive tool that does not execute it — previously saw only the word “Connecting”. Each page now carries a fallback stating what it contains, and pointing to the daily snapshot itself, which is plain JSON that needs no scripts to read, and to its documentation. That does not make the charts accessible without JavaScript, and it is not presented as doing so; it makes the data reachable, which is the part that matters.
The bootstraps rebuilt properly (2 September 2026)
Two objections survived the last round and both were right. On Where Things Stand the interval was described as a moving-block bootstrap while the blocks were drawn from the filtered sequence of days belonging to a state; the defence offered was that those days are 93 to 97 per cent contiguous in practice, which is evidence about the data rather than a description of the algorithm. It is now a moving-block bootstrap in the strict sense: contiguous stretches of days are drawn from the original daily index, the state is applied to the resampled index, and the median is recomputed from whatever qualifying days the draw produced, so the number of observations varies between replicates as it should — how often a state occurs is itself uncertain, and holding it fixed made the interval narrower than the evidence allows. The intervals duly widened: the cheapest tenth of days moved from −37% to +65% under the old method to −46% to +117% under the correct one. The two findings that survived before still survive, which is the only reason they are still reported.
On the technical-signals page the difference was bootstrapped on the trigger side while the baseline median was held fixed, so the interval described uncertainty in one estimate rather than in the difference of two. Both sides are now resampled in each replicate: the baseline as contiguous calendar blocks of the daily forward-return series, which is a moving-block bootstrap in the strict sense, and the trigger side as blocks of the ordered event sequence, which is not one and is described as what it is. Including the baseline’s own uncertainty widened the one-year intervals substantially and changed two verdicts. The downward MACD crossing no longer shows evidence of trailing the baseline. Relative strength above 70 still shows evidence, but only at one month and three months; at one year its interval now includes zero, and the page says so rather than quoting the headline figure unqualified.
Bootstrap naming, and the last of the review items (2 September 2026)
A reviewer objected that the intervals on the technical-signals page were described as a moving-block bootstrap while the blocks were drawn from the ordered sequence of triggers rather than from contiguous calendar days. The objection is right about the naming, and the two pages turn out to differ, so both were checked against the data rather than argued about. On Where Things Stand the states persist for weeks, and between 93 and 97 per cent of consecutive observations within each state are adjacent days on the current data, so those blocks genuinely are contiguous stretches of the calendar and the description stands, now with the measurement attached. On the technical-signals page the triggers sit between 90 and 318 days apart, so the blocks are not calendar blocks and the page no longer claims they are: it describes resampling the ordered sequence of triggers in blocks, and states what that does capture, which is that every consecutive pair of triggers in this sample has overlapping one-year windows and is therefore kept together rather than drawn independently.
Three smaller items completed the list. The realised-value page had kept the old sequential-rank correlation after the flows page was corrected; it now uses the same midrank implementation, so the statistic is computed identically wherever it appears. The dashboard’s thesis-status table now states above it that the rules are independent observations rather than votes, that no score is computed, and that the count of favourable readings has no defined meaning — the table invites tallying, and the sentence declines the invitation. And the dashboard now carries one line of technical context, drawn from readings the pipeline publishes rather than recomputed in the page, so the dashboard and the technical-signals page cannot disagree: relative strength, the fifty against the two-hundred day average, price against the two-hundred day, and realised volatility, followed by a link to the page that tests whether any of it has been worth anything.
Confidence intervals on the technical signals, and a batch of precision fixes (2 September 2026)
The technical-signals verdicts had been decided by a rule of thumb: consistent direction plus one difference of ten percentage points. That is a reading convention, not a test, and it has been replaced. Each signal’s difference from the baseline now carries a ninety per cent confidence interval from a moving-block bootstrap under three independent seeds, and a rule is recorded as evidence only where an interval excludes zero under all three; the five-point rule survives solely to colour small numbers.
The change sharpened the page. Relative strength rising above 70 shows intervals above zero at all three horizons and is recorded as evidence of an edge; the Bollinger squeeze and the downward MACD crossing show evidence of trailing the baseline; the remaining five rules, including both moving-average crosses, show no clear evidence in either direction, which on twelve and thirteen triggers is the honest answer. Where a signal has fewer than twenty completed windows no interval is computed and the verdict says so rather than inferring from a handful of episodes.
Alongside it: the power-law panel now reads “falsification status” and states that it reports only whether the model’s published breakdown conditions have been breached, not that the model is predictively valid; the indicator autopsy’s column head became “current condition”; the flows composite is named for crowding and sentiment rather than leverage and sentiment, and its correlation note no longer implies that a non-zero value indicates a tradable signal; the realised-value page states that realised cap is recovered from Coin Metrics’ market capitalisation and MVRV fields rather than reconstructed from the UTXO set; the miners page describes the fee share in terms of sustaining miner revenue rather than the security budget surviving; the next halving is labelled an illustrative calendar estimate; and the forward-return table counts observations rather than days, because overlapping daily windows are not independent samples.
Four defects found by external review, verified and fixed (2 September 2026)
A reviewer raised a long list; most of it was deferred or already done, but four items were genuine and are corrected here. Each was checked against the running code before being changed.
Look-ahead in the historical classification. This is the serious one. Where Things Stand ranks price on three lenses as of each day, but the power-law deviation was computed against a trend fitted once over the whole sample, so coefficients estimated from later years were deciding how earlier days were classified — and those classifications drive the forward-return table. The fit is now an expanding window: at each day the trend is estimated from the data available up to that day only, with a fit produced once five hundred qualifying observations exist. The correction changed the answer, which is the point of making it. The cheapest tenth of days previously showed a one-year median of +61%; on the honest computation it shows +14%, with a confidence interval running from −37% to +65% that no longer excludes zero. A finding this page had reported as real was an artefact of the contamination, and it has been removed by the arithmetic rather than by editing.
The threshold table answered a different question than it asked. It claimed to give the levels at which each lens would read differently, but it searched past observations for whichever value happened to have been ranked near the thirtieth or seventieth percentile, which is not the same number. It now takes the quantiles of the reference distribution the ranking actually uses, so the printed levels are what today’s reading would have to reach.
Bollinger band width was half the conventional figure. The technical-signals page computed two standard deviations over the middle band and labelled it band width; the conventional measure with two-sigma bands is the distance from the upper band to the lower, which is four. The ranking and every tested result are unaffected, since the series was consistently scaled, but the displayed number did not match what a reader would compute elsewhere. It now does.
Spearman correlation ignored ties. The flows page assigned sequential ranks, which is invalid when values repeat — and several inputs there repeat by construction, sentiment being an integer. Ranks are now midranks, and the correlation is computed from the ranks directly rather than through the tie-free shortcut formula.
Two wording corrections accompany them: the Metcalfe page described its input as active users when the model uses the cumulative stock of addresses ever used, a distinction the method section already drew and the summary contradicted; and the ETF panel described its figures as net creations and redemptions when they are estimated flows derived from holdings changes, which can differ from an issuer’s primary-market cash flows in timing and mechanism.
Technical signals, corrections after a reader could not reconcile the summary (2 September 2026)
The summary above the table said that seven of eight rules did no better than a random day, then quoted a one-year figure in the same breath. The count was taken at the thirty-day horizon using an unstated threshold while the figure beside it came from the one-year column, so the two could not be reconciled against the table beneath. That was a genuine defect in the writing, not the arithmetic, and it has been rewritten. The summary now states the baseline in plain terms — buying on a random day since 2010 returned about 96% over the following year — and reports how many rules fell behind it, how many made no clear difference and how many came out ahead, with the noise floor of five percentage points stated in the line beneath.
The verdict rule itself was also tightened. A signal previously earned “beat holding” if every difference clearing the noise floor pointed the same way, which handed that verdict to the golden cross on a single reading of five points while its other two horizons were flat. A verdict now additionally requires at least one difference of ten points; the golden cross accordingly reads “no clear difference”, which is what twelve triggers of roughly flat performance deserve.
The table was reorganised at the same time. It had repeated each signal across three rows with an ellipsis standing in for the name, printing six numbers per signal; it now gives one line per signal showing the difference from the baseline at one month, three months and one year, with a verdict in words, and the underlying returns for every horizon sit behind a disclosure toggle for anyone who wants them. Two indicators that the table tested but the page never showed live — Bollinger width and realised volatility — now appear in the reading strip with their own percentile against the last two years, so every rule in the table has a current value on the same page.
Technical Signals, Measured (2 September 2026)
New page (/tools/bitcoin-technical-signals). The readings most often quoted — the fourteen-day relative strength index, the fifty and two-hundred day moving-average crosses, and the MACD against its signal line — are shown live and then scored. The scoring is the point. Each signal’s median forward return is placed beside the median forward return from a randomly chosen day over the same history, and the difference between them, in percentage points, is reported as the edge. A signal followed by +100% in a market that returned +96% from any day at all has found nothing, and this is the comparison most published back-tests omit.
The results are unflattering to the conventions. Buying when relative strength crossed above 70, the level that is supposed to signal an overbought market, beat a random day by 56 percentage points at one year across 38 triggers; crossing below 30, the supposed bargain, came in 19.5 points behind. The MACD’s two crossings differ from a random day by 0.8 and 0.5 points at thirty days across more than a hundred triggers each, which is indistinguishable from no information. The golden cross is 4.8 points behind at thirty days, consistent with a rule that only fires after the move that produced it. None of these are presented as tradable: the note states that trigger counts run from twelve upwards, that windows overlap, and that a few points of edge against a volatile baseline is noise.
Fibonacci retracements, trend lines and chart patterns are deliberately absent, and the page explains why in a panel of its own: their levels depend on swing points the analyst chooses, so no rule can be coded, run over the history and scored. The page states that if a reader can specify such a rule precisely enough to program, it will be added and tested like the others. Verified headlessly against the live snapshot: the strip and all eighteen table rows reproduce the independent Python computation exactly.
The page was then restructured after review. It now opens with a table of the four families a technical reading can belong to and what each is for: momentum, which can move before a trend confirms; trend, which confirms only after the move; volatility, which says whether risk is expanding or compressing; and participation, which is measured on the Flows and Positioning page rather than duplicated here. Two volatility rules were added to the tested table, each defined as a compression into the bottom tenth of its own trailing two years judged as of that day: Bollinger width came in 4.7 points behind a random day at thirty days, and realised volatility 8.5 points behind. The coiled-spring reading does not say which way the spring goes, and the page now says so with numbers.
Exchange volume, cumulative volume delta and liquidation data were requested and are absent, from this page and from the site as a whole, because the snapshot has no free keyless primary source for them; on-chain transfer value is not a substitute and is not offered as one. The gap is stated on the page rather than filled with a proxy.
Two further changes followed a reader observation that the page’s conclusion was buried under its data. The finding now sits above everything else in a panel of its own: of the eight rules tested, seven did no better than buying on a randomly chosen day and several did measurably worse, with the single exception running against the textbook. Beneath it, in the same panel, is the sentence the page exists to make possible — that it cannot tell a reader to buy, hold or sell, because that depends on horizon, position size and whether a deep fall would force a sale, none of which are in this data, and that what it can say is that these readings are weaker evidence than they are usually presented to be. The tested table is now grouped into early-warning rules, which can move before a trend turns and fire often when nothing follows, and confirming rules, which only fire after the move that produced them, with each group carrying that caption. The numbers are unchanged.
In the sub-navigation rail, the current page was marked only by a faint tint and kept the same dim text as every other item, which made it hard to see where you were. The active item now carries a gold left border, a gold label and heavier weight.
ETF flow chart, suppressed until it means something (2 September 2026)
The first two days of ETF flow history produced a chart with two points, whose time axis fell back to hour labels that collided with each other and with the legend. Both problems had the same root: a line drawn through two observations one day apart implies a trend that a single day’s change cannot support. The chart is now withheld until seven daily changes have accumulated, the reading above it says so in words rather than leaving a silent gap, and the axis is pinned to whole days with overlapping labels suppressed. The panel’s numbers — issuers measured, coins covered, latest net flow — were always the substance and are unaffected.
Market phase, and the case against acting on it (2 September 2026)
Readers ask whether Bitcoin is in a bull or a bear market. That question is answerable, because it describes what price has already done, and refusing to answer it would be evasion rather than rigour. Where Things Stand now classifies each day into one of three phases and publishes the label’s own failure record beside it.
The definition: a drawdown is declared when price closes more than 25% below its highest close to date, and released only when price recovers to within 10% of that high, with the previous label standing in between; outside a drawdown the phase is an advance when the 200-day trend in log price is rising and sideways when it is not. The gap between the two thresholds is deliberate. A single 20% line produces 109 phase changes with a median episode of six days, because price oscillates across it; the hysteresis gap reduces that to 36 episodes with a median of 47 days. Both counts are recorded here so the choice can be checked, and the thresholds are round numbers fixed once rather than values searched for.
The label is then tested against the only question that matters, and it fails that test in an instructive way. Days classified as a drawdown were followed by a median one-year return of +112% across 4,180 observations; days classified as an advance by +18% across 1,041. On this record the reassuring phase has been the worse one to buy and the frightening one the better, which is the opposite of how such labels are normally used. Three further weaknesses are published alongside: the label is late by construction, since a drawdown cannot be declared until price has already fallen a quarter from its high; it is unstable, differing from its own value thirty days earlier on 13% of days even with hysteresis; and it does not reliably describe the period it names, with six of seventeen advances ending lower than they began. The market has spent 79% of all days in drawdown, because the benchmark is the highest price ever reached.
No buy, hold or sell indication is published, and none will be. Such a label cannot be derived from this data: it depends on the reader’s horizon, position size, tax position and whether a deep drawdown would force a sale, none of which are observable here. The phase classification is offered as a description of where price has been, with evidence that it is close to useless as a guide to where price is going.
The reading strip was revised again in the same spirit. It had shown a bare percentile in the prominent position with a line beneath restating the same figure in words, which put a number with no units where the meaning should be. Each lens now shows a word in that position — very cheap, cheap, typical, dear or very dear, on the same bands the composite uses — and the line beneath carries the measured quantity in its own units together with the percentile that produced the word: market value at 1.48 times what holders paid, price at 1.13 times its 200-day average, price 42% below the trend line. The analyst keeps the numbers, the general reader gets a sentence, and the two are the same statement.
The vocabulary itself was then replaced. The five bands had been named deep discount, discount, neutral, premium and extreme premium, which are terms of art: “neutral” in particular says nothing about price to a reader who has not met the convention, and the middle band is where most readings fall. They are now very cheap, cheap, average, expensive and very expensive — symmetric, unambiguous, and used identically in the strip, the lens table, the forward-return table and the prose, so the page speaks one language throughout. The cut points are unchanged at the tenth, thirtieth, seventieth and ninetieth percentiles, and the band widths are stated: the middle band is deliberately the widest because most days are unremarkable.
The whole scale is now also drawn rather than described. A five-segment bar shows every band in proportion, green through grey to red, with the day’s composite marked on it and the ends labelled as the cheapest and dearest days on record. A reader can see at a glance both what the options are and which one applies, without reading a definition first.
Where Things Stand, information hierarchy (2 September 2026)
A second reviewer observed that the page led with four percentile numbers and left the reader to infer the state from them. The observation was partly an artefact of a reader that does not run the page’s scripts — the live page did state the reading — but the hierarchy point was sound, so the page now leads with the classification itself in the strip, with the composite percentile beneath it rather than above.
A new panel sits directly under the strip: one sentence naming the state, the composite percentile, and whether the three lenses agree, followed by a table giving each lens, what it measures in plain words, its percentile, and how it reads on the same cuts the composite uses. Where the lenses disagree the sentence says so and reports the spread in percentile points, because disagreement between measures of different things is information rather than a defect to be averaged away. On the current data the lenses differ by 34 points, with the power-law deviation reading discount while the other two read neutral.
The forward-return note was also reworded. It previously opened “the one asymmetry worth noting”, which invited the extreme-premium finding to be read as a rule; it now leads with the caveat, describing the sample as small and heavily overlapping and closing with the statement that this is a description of a handful of episodes rather than a rule. No recommendation, score, gauge or signal was added, and none will be.
A further pass asked a blunter question: would a visitor with no background understand the strip at all? The answer was no. A percentile has a direction, and the page never said which end was expensive; “MVRV percentile 37” is jargon on top of an ambiguity. Every reading is now also stated as a share of past days — the composite at 36 reads “cheaper than on 64% of days since 2013” — the three lens labels name what price is being compared against rather than the statistic used, and the five state names are glossed once as bands of the same scale, the cheapest tenth through the dearest tenth. The numbers are unchanged; only their presentation is.
Five corrections following external review (2 September 2026)
An external reviewer proposed a large institutional-governance programme. Most of it was deferred as premature for a site with no readership yet, and two of its recommendations were rejected outright: entity-adjusted on-chain data, which this project declines for the reasons already recorded, and several items that were simply stale, since ETF coverage, options skew, CFTC positioning and point-in-time percentiles were already live when the review was written. Five findings were accepted, verified against the current code rather than the review’s description of it, and implemented.
Specification status at the headline. The Metcalfe monitor already labelled its two calibrations in the reading beneath the value, but the headline itself said only “Metcalfe value”. It now reads “reference specification” on the 2011 calibration and “validated specification” on the 2017 one, so a reader cannot mistake the comparability default for the statistically preferred model.
Confidence intervals on forward returns. The Where Things Stand table previously showed a median and the spread of individual outcomes. It now also shows a ninety per cent confidence interval for the median itself, from a moving-block bootstrap whose block length is the forward horizon, because neighbouring windows share that much price path. The procedure runs under three independent seeds; the interval published is the widest of the three and a state is marked as excluding zero only when all three agree. That caution was not theoretical: at one year the neutral state contains only about seven independent blocks, and its interval moved across seeds, so it is now correctly shown as carrying no reliable directional information where a single-seed run would have marked it significant. Three states survive the test — deep discount, discount and extreme premium — and the extreme-premium interval, roughly −62% to −16%, confirms the one asymmetry the page claims.
Data exception surfaced. The address feed has missing days, and the cumulative user stock has always been built by interpolating across them. That was described in this document but never shown on the page. The Metcalfe data-audit panel now reports the number of interpolated days and the span they cover, computed at run time.
Model status on the power law. The falsifiability panel already evaluated four published breakdown conditions individually. It now also carries a roll-up — active, watch, degraded or failed — derived from those same four conditions, with no new thresholds introduced to manufacture a badge, and states in the panel that the conditions are the model’s own.
Terminology. “Trend today” became “model-implied level” on the power-law page and the dashboard, because a level drawn on a chart and labelled a trend is read as a target however carefully the surrounding text disclaims it.
Where Things Stand (2 September 2026)
New page (/tools/bitcoin-market-context). The site had been asked, reasonably, what a visitor is supposed to do with nine pages of measurements. This page answers that as far as the evidence allows and no further: it places price on three lenses at once — MVRV, the Mayer multiple and the deviation from the power law in time — ranks each as an as-of percentile against its own prior history with at least 250 prior days required, averages the three without weighting, and cuts the result at 10, 30, 70 and 90 into five named states. It then shows, for every state, the full historical distribution of what followed: median with the tenth and ninetieth percentiles, the sample size, and the worst one-year outcome with its date.
The page states no view and issues no recommendation. It carries a regulatory notice at the top, and a panel headed “What this page cannot tell you” which records that the longest unbroken discount spell ran 351 days, that the worst one-year outcome in the sample is −83%, that the columns are historical frequencies over roughly four cycles rather than probabilities, and that nothing in the data knows the reader’s horizon or whether a drawdown would force a sale.
Two results are reported prominently because they cut against what a reader might hope to find. The extreme-premium state is the only one with a negative median at every horizon, and its ninetieth percentile a year out is +8%, meaning even its good outcomes were poor; that asymmetry is the single useful finding on the page. Against that, the deepest-discount state has a median one-year return of +61%, below the ordinary discount state at +85% — buying maximum weakness has not been reliably better, and the page says so rather than burying it. A thresholds table gives the levels at which each lens would read differently, so the reading can be followed without revisiting daily. Verified headlessly against the live snapshot: the strip, all five state rows with their decile ranges and sample counts, and the threshold levels reproduce the independent Python computation exactly.
Node pipeline written, awaiting hardware (2 September 2026)
The coin-age family of metrics — coin days destroyed, dormancy, SOPR, realised capitalisation and the HODL waves — cannot be obtained from any free public feed, because they require UTXO-level data. The pipeline that computes them from a first-party archival node is now written and committed to the data repository under node/, with an operator guide covering hardware, Bitcoin Core configuration, the initial scan and the daily job. It is not yet running: it needs a machine with roughly a terabyte of solid-state storage and several days for the first pass over the chain.
The scanner keeps its own table of unspent outputs and records, for every spend, the value destroyed and the height at which that coin was created; coin days destroyed, dormancy and the age bands follow from that directly, while SOPR and realised capitalisation additionally use this repository’s own daily price series so that the node’s numbers and the site’s numbers share one price convention. Progress is committed continuously, so an interrupted scan resumes rather than restarting. Its arithmetic was verified before any hardware existed, against a synthetic chain small enough to compute by hand: on a three-day test chain the scanner reproduces coin days destroyed of nought, ten and six, SOPR of 2.0 and then 0.25, the exact realised-capitalisation deltas, and correctly excludes an unspendable output from the live set.
What it will not do is stated in the code and in its guide: no entity clustering, no exchange labelling, no change-output heuristics. The published SOPR will therefore be the raw output-level figure, which counts internal transfers and change alongside genuine sales and is not comparable in level to a vendor’s entity-adjusted series; its shape and its crossings of one are the reproducible part. The published file will carry a coverage block stating the height reached and whether any spent output lacked a known creation height, so a partial scan can never be mistaken for a complete one.
CME positioning, leveraged funds (2 September 2026)
The CFTC Traders in Financial Futures file was already read for CME open interest, but only one column was taken and its position had never been verified. The layout is now established and documented: field 7 is open interest, fields 8 to 10 the dealer long, short and spreading legs, 11 to 13 asset managers, 14 to 16 leveraged funds, 17 to 19 other reportables, 20 and 21 total reportable long and short, 22 and 23 non-reportable. The mapping was confirmed by the report’s own arithmetic rather than by assumption: each side’s four category legs plus the spreading columns reconcile exactly to total reportable, and total reportable plus non-reportable reconciles to open interest, all three to the contract.
Those identities are now a test inside the parser. Every row is checked before any figure is taken from it; a row that fails is skipped, and if every candidate row fails the source raises rather than publishing a number read from a column that has moved. Three series are added — leveraged-fund longs, shorts and the net — and the Flows page shows the net position, the week-on-week change and the short leg as a share of open interest. The panel states the interpretation caveat plainly: a persistent net short among leveraged funds on CME is commonly the short leg of a cash-and-carry basis trade against spot or ETF longs, and is positioning information rather than a directional forecast.
Options skew (2 September 2026)
The snapshot now publishes three option-market readings, computed from the Deribit option chain already fetched for the put/call ratio, so no additional request is made: the at-the-money implied volatility of the listed expiry nearest thirty days, the 25-delta risk reversal (the implied volatility of the 25-delta put minus that of the 25-delta call, in volatility points) and the 25-delta butterfly (the average of the two wings minus the at-the-money level).
Deribit publishes a mark implied volatility per instrument but not a delta, so delta is computed here by the Black-Scholes formula with a zero rate on the underlying price the exchange quotes with each instrument, which is the market convention for crypto options; the wings are then located by linear interpolation in delta across the listed strikes. The function returns nothing rather than a number when a chain is too thin to bracket both 25-delta points, when every listed expiry is nearer than seven days, or when the response is malformed — a missing reading is preferable to an extrapolated one. The computation was verified against a synthetic chain built to a known smile: on a surface whose true values are 55 and 61 volatility points at the two wings and 53 at the money, the function returns a risk reversal of 6.00, a butterfly of 5.00 and an at-the-money level of 53.00, and correctly ignores expiries outside the target window. A positive risk reversal means downside protection is bid over upside, which is the usual state; the reading is descriptive of positioning and is not a directional forecast.
The Flows and Positioning page carries these three readings in an “Options: skew and volatility” panel beside the DVOL index, with the risk reversal labelled in words (downside protection bid, roughly balanced, or upside bid) and the note recording that crisis readings have historically run to five or ten points, so that a small number is read as the option market declining to pay up for downside rather than as a signal. The panel omits itself rather than showing a placeholder when the snapshot has no surface for the day.
ETF issuer coverage, rebuilt (2 September 2026)
The ETF holdings pipeline now parses five issuers (IBIT, ARKB, BITB, HODL, OBTC) from their own primary disclosures: iShares (IBIT), ARK 21Shares (ARKB), Bitwise (BITB) and VanEck (HODL). IBIT reads the holdings file the product page links directly, with the “Data Download” SpreadsheetML export as a second route; HODL reads VanEck’s own holdings dataset, which publishes the rounded custody figure the issuer shows in its holdings table rather than the unrounded figure in its statistics panel, and the code records that distinction. Net flow is still the day-over-day change in coins held multiplied by the day’s price, and it accumulates from the first successful run rather than being backfilled.
Five issuers (IBIT, ARKB, BITB, HODL, OBTC) are recorded as having no primary machine-readable daily disclosure this pipeline can read, each with the reason published in the data file rather than left as a silent gap: Grayscale’s two products (script-rendered pages that rate-limit automated requests, with no public data endpoint found), Fidelity’s FBTC (no daily holdings file published) and Invesco’s BTCO (a quarterly PDF fact sheet only). Three remain to be attempted (EZBC, BRRR, BTCW). The snapshot therefore publishes a coverage block stating which issuers are included, the coins they account for, and explicitly that this is not total spot-ETF holdings. Aggregator figures were considered and rejected for the same reason the rest of the site rejects them: they cannot be reconciled against a primary document. The source status is now “ok” because every issuer the pipeline attempts is parsing; coverage, which is a separate question, is stated in the data and on the page.
The survey is now complete: every US spot Bitcoin ETF issuer has been checked against its own website, and each one is either parsed or recorded with the reason it cannot be. Franklin (EZBC) and CoinShares (BRRR) serve their fund pages as client-side applications with no holdings file behind them. WisdomTree (BTCW) publishes weights, net asset value and shares outstanding, but not a coin count; the number could be inferred by dividing assets by the day’s price, and that inference is deliberately not made, because an estimate presented beside four measured disclosures would corrupt the series it sits in. There is accordingly no “pending” category left in the file: five issuers (IBIT, ARKB, BITB, HODL, OBTC) measured, seven documented, nothing vague.
Cycle Monitor (2 September 2026)
New page (/tools/bitcoin-cycle-monitor), price-only, computed live from the snapshot. All four halving cycles indexed from their halving day on one log axis; the cycle table with window peaks and worst post-peak drawdowns (windows run halving to halving, stated in the method, which is why the 2020 row peaks 14 March 2024 rather than at the November 2021 top — both shown); the diminishing multiples named (×91 → ×29 → ×8.3 → ×2.0 so far); a comparison of this cycle against each prior at exactly the current day count; and the drawdown-from-high series with the current underwater spell. The claims note states the efficient-market objection to halving causality and that four windows is a record, not a distribution. The next-halving date is labelled an estimate from block cadence. Verified headlessly against the live snapshot: strip values and both tables reproduce the independent Python computation.
Miners and Security Monitor (2 September 2026)
New page (/tools/bitcoin-miners-monitor), computed live from the snapshot (Blockchain.com hash rate and fees; Coin Metrics issuance and market cap). Hash rate with the 30/60-day ribbons and every capitulation episode of seven days or longer since 2011 shaded on the chart and listed with its recovery signal and forward returns: twenty completed episodes, median +105% at one year, 85% positive, with the three losing recoveries (May 2021, August 2021, July 2025) named in the notes rather than averaged away. Hashprice with its record low ($0.0262 per TH/day, 19 August 2026); the Puell multiple with forward returns by bucket on the 2017 window; the fee share of miner revenue as the security-budget series (0.72% on the 90-day average against a 19.6% peak in January 2018); thermocap multiple in the strip. The seven-day minimum episode length is stated in the method note so the episode count can be checked. Verified headlessly against the live snapshot: strip values, the episode table and the medians reproduce the independent Python computation.
Indicator autopsy page (2 September 2026)
New page (/tools/bitcoin-indicator-autopsy): the popular signals tested on the full daily history, computed live in the browser from the snapshot. Pi Cycle Top (four triggers, each followed by a 50%+ drawdown within a year, but fired twice in 2013, was followed by +219% after the April 2013 signal, and did not fire at the November 2021 top); stock-to-flow (the published 0.4 × S2F³ specification against actual price at each cycle, plus a full-sample refit showing the post-May-2021 structural break); the 2-Year MA Multiplier (buy-band entries and their forward year; the 5× sell band untouched since 2017); and the 200-week moving average (every close below, the forward year, and the share of history spent under it). Each signal carries its trigger table, three-line notes and a one-line verdict that states the sample size; the method note declares that nothing is optimised or excluded and that four-to-seven events is anecdote, not statistics. Verified headlessly against the live snapshot: strip values and every table reproduce the independent Python computation.
Extended metrics panel (2 September 2026)
The dashboard gained a "Cycle, miners and volatility" panel, computed daily by the snapshot job from series already ingested, at daily close, with percentiles over the window from 1 January 2017 unless stated. Definitions, in the order shown:
- Mayer multiple: price over its own 200-day moving average (Mayer, 2017).
- Puell multiple: daily issuance in dollars over its own 365-day average (Puell, 2019); Coin Metrics IssTotUSD.
- NUPL: 1 − 1/MVRV, the network's aggregate unrealised profit share, with the conventional zone names; derived from Coin Metrics CapMVRVCur, which is not entity adjusted.
- Thermocap multiple: market cap over cumulative issuance in dollars (coinbase rewards only, fees excluded — the classic definition).
- NVT: market cap over transaction volume, classic and the 90-day-smoothed signal variant (Woo, 2017; Kalichkin, 2018). The volume series is Blockchain.com's estimated on-chain volume, which is not entity adjusted; its methodology, not only economic throughput, moves this ratio, and the panel says so.
- Hash ribbons: the 30-day versus 60-day moving average of hash rate (Edwards, 2019), reported as state (expansion or capitulation), days in state, and the date of the last recovery signal. The construction here carries no price filter.
- Hashprice: miner revenue (issuance plus fees, USD) per terahash per day, with its 30-day change.
- Fee share: fees as a share of miner revenue, 90-day average — the long-run security-budget series.
- Realized volatility: 30-day standard deviation of daily log returns, annualised.
- Variance risk premium: Deribit DVOL minus realized volatility. Persistently positive is the normal state; negative readings mark stress.
- Cycle position: the price multiple since the last halving at the current day count, beside the same statistic from each prior cycle at the same day.
- Address momentum: 30-day average active addresses and addresses with balance, year over year.
Each of the three bucketed signals (Mayer, Puell, NUPL) is shown with the median 365-day forward return from its current bucket over the statistics window. These are in-sample medians over overlapping windows on a four-cycle sample and are labelled as descriptive, not forecasts, in keeping with the treatment every lens on this site receives.
Second-tier sources added to the same panel as they accumulate history: Federal Reserve net liquidity (WALCL − Treasury General Account − overnight reverse repo, from FRED, units reconciled); Bitcoin dominance (CoinGecko); the Coinbase premium (Coinbase USD spot against an offshore USDT daily close from OKX — Binance's API rejects the US-based fetch runners — so the USDT peg deviation is inside the number and the label says so); the annualised basis of the Deribit dated future nearest 90 days to expiry; and the Deribit options put/call open-interest ratio. Thirty-day changes and percentile ranks for these unlock automatically as daily history accrues.
Not offered, with the reason recorded: the entity-adjusted on-chain family (SOPR, long- and short-term-holder cost basis, exchange netflows, coin days destroyed). These require UTXO-level or clustered-entity data that no free public source provides to a standard this site would publish under. The roadmap for first-party computation from a full node is documented in the data repository; until then the site prefers a stated gap to an approximated metric.
External audit fixes (2 September 2026)
- Full-suite audit applied: the realised-value page's live-API fallback corrected (it requested a metric outside the community tier and omitted the one it needs; the fallback could never have worked); each dashboard panel individually guarded so a missing snapshot section degrades one panel rather than the page; the hub's Metcalfe one-year error figures now come from the snapshot (published as
metcalfe.oos_rmse_pts, computed by the pipeline with the same expanding annual-refit protocol as the tool page) instead of hardcoded text; snapshot-derived strings escaped before insertion into the page; the shareable-link script now captures each page's actual default range; percentiles on the flows page require more than 30 in-window observations and its indicator cards print their through-dates; the ETF source reportspartialwhen some issuers fail rather than a blanket ok; the chart library is one shared cached file (echarts.min.js) instead of being embedded in every page; the Cane Island reference figures moved to a hand-maintaineddata/references.jsonread by the hub and the Metcalfe page.
Toolkit extension, seven items (1 September 2026)
- ETF flows:
fetch/etf.pywith isolated issuer parsers (IBIT, GBTC, BTC, ARKB, BITB; six issuers pending), holdings accumulated inetf_holdings.json, net flow = change in BTC held × price, per-issuer status in the manifest. Flow derivation verified offline; live parsing awaits the first run and will be adjusted from the manifest. Flows page panel consumes the file and states coverage. - Daily history:
kpis_history.json, one row per snapshot date (price, both Metcalfe calibrations, power law, realised, composite); dashboard panel "Readings over time". - Shareable state: control values encoded in the URL on all four tool pages, applied on load, with a "Copy link to this view" button. Verified round-trip.
- Self-test in the daily job: each headline recomputed by an independent route (closed-form k on a plain cumulative sum; normal-equation power law; direct realised division); tolerances 2% / 0.5% / 0.5%; run fails loudly on breach; day-over-day drift above 25% raises a warning; status written to the KPI file and shown on the dashboard.
- Dashboard intro wording corrected for the Metcalfe headline calibration.
- Public methods page (/tools/methods) generated from this document, linked from the sub-navigation of every page.
- Lens-agreement panel on the dashboard: weekly log deviations of price from all three valuation lenses over two years, with today's spread and a labelled mean; presented as a summary of lenses, not a model.
All pages re-verified on the real snapshot; Metcalfe control sweep clean.
Presentation and regime layer (1 September 2026, following external review)
- Metcalfe headline hierarchy: the dashboard card and the tool page's reading strip now show both calibrations with explicit labels ("reference calibration, comparable with published figures" and "validation-preferred calibration, 2017 onward") and the price deviation against each; neither is presented as a target.
- Dashboard restructured into two labelled rows: Valuation (three lenses) and Market state (flows and positioning, thesis status).
- Thesis status panel: seven stated rules evaluated on the day's readings (structural trend within ±2σ of the power law; validated Metcalfe percentile; MVRV percentile; stablecoin and ETF demand; funding and open-interest percentiles; dollar and real-yield direction; price against its 200-day average and 90-day range), each with rule, reading and status, followed by the conditions that would change it. Rules only; no weights, score or probability. Market-structure and macro-change readings added to the KPI file for this purpose.
- Model agreement panel: each valuation lens's percentile on its own window, the spread, and a categorical label (strong agreement under 20 points, divergence under 50, extreme beyond or when one lens is above 90 and another below 30), with divergence described as uncertainty.
- Labels: lost-coin control marked "model assumption"; ETF panel carries a prominent partial-coverage notice.
Not adopted, with reasons recorded: a probabilistic regime model (a composite by another name); causal identification work on adoption versus price (a research paper, not a live panel); additional indicators. Verified on the real snapshot; Metcalfe control sweep clean.
Headline calibration changed to 2011 (1 September 2026)
At the owner's request the Metcalfe monitor and the dashboard now lead with the fit from 1 January 2011, chosen so the headline is comparable with published Metcalfe values: $142,702 on the live snapshot versus Cane Island's $138,557 (3% apart; 1% without the lost-coin adjustment). The reason the 2010 months are excluded is stated on the page (residuals of +350 to +400 log points, fifty times worse than any later year). The 2017 window remains one click away and is labelled as the one recommended by validation (49 versus 167 log points of one-year error); the validation panel and specification comparison are unchanged and highlight whichever window is selected. Re-verified on the real snapshot; 35 control combinations clean.
Dashboard hub (1 September 2026)
The hub is now a live dashboard. A KPI module (fetch/kpis.py) runs inside the daily job and writes data/kpis.json: each tool's headline reading at its validated default specification, its distribution (sorted premiums, residuals, MVRV, composite), and 104-week sparkline series. On the real snapshot the module reproduces the page headlines (Metcalfe $78,072, power law $136,437, realised $53,076, composite 55, funding +8.9% at the 90th percentile). The hub reads the KPI file and re-prices the price-dependent readings against live spot; at the same spot it matches the pages cell for cell (premium −0.7%, 51st; deviation −0.25 dex, 23rd; MVRV 1.46, Z +0.75; positioning Crowded). Panels: a valuation strip placing price against realised price, Metcalfe value and the power-law model level on one log scale with each lens's 10th to 90th percentile band; four cards with sparklines and drill-down statistics; a provenance table from the manifest. Verified in the headless run with no errors.
Suite extension (1 September 2026)
Three further pages built on the same shell and helper module: Realised Value Monitor (realised price, MVRV and Z-score with window-based scale, supply activity bands, deviation distribution, forward returns by MVRV, an as-of percentile out-of-sample test, literature check, audit); Flows and Positioning Monitor (stablecoin supply, Deribit funding and DVOL, OKX and CME open interest, FRED macro, Fear and Greed, composite positioning percentile, lead-lag rank correlations against 90-day forward returns, forward returns by funding regime, audit with per-source provenance; ETF flows panel pending the issuer feed); and a tools hub (/tools/) that reads the snapshot manifest and shows per-source freshness. Both data pages require the daily snapshot (DATA_BASE) since their sources do not allow direct browser access. Verified on synthetic snapshots shaped like the real feeds: no runtime errors, controls swept, audit checks pass. Numerical reconciliation against real Coin Metrics, DefiLlama, Deribit and FRED data is pending the first snapshot run and will be recorded here when the manifest is available.
Reconciliation on the live snapshot (1 September 2026, snapshot 17:09 UTC)
First snapshot run: all eight sources ok, no errors. Realised Value and Flows pages run on the real files with no runtime errors; 16 of 16 reconciliation cells match independent Python (realised price $53,076 recovered as market cap / MVRV; live MVRV 1.46; Z +0.75; percentile 33; as-of rank correlation at 365 days −0.23 over 2,800 days; funding +8.9% annualised at the 90th percentile; stablecoins $308.9B; DVOL 38 at the 12th percentile; Fear and Greed 69; dollar index 118.7; real yield 2.42%). Metcalfe and power law pages reproduce their readings from the snapshot ($78,072 and $136,437).
Addresses with a non-zero balance (Coin Metrics AdrBalCnt) added. On the power law page the decomposition now uses the published adoption series and reproduces the paper: β_A 3.00 (R² 0.974) versus published 3.05 (0.977); β_M 1.83 (R² 0.950) versus 1.84 (0.951); product 5.51 versus 5.60; gap to the direct exponent −1.8%. On the Metcalfe monitor it is offered as a user definition and scored: n² on this series gives $50,421 with 68 points out-of-sample error, weaker than the cumulative stock (49 points), so the default is unchanged and the row is labelled accordingly. Control sweeps on both pages clean. Coin Metrics community tier provides 10 of 25 requested metrics; supply-age bands are absent and the Realised Value page hides that chart rather than showing it empty.
Lost-coin control redesigned (1 September 2026)
Finding 15: the "% per year" lost-coin control assumed coins are still lost today at the early-era rate, which is the least plausible profile and produced most of the adjustment's effect (+8%). Replaced by a control stating the total assumed lost today (none, 2.3M low, 3.5M central, 4.0M high, 5.6M dormant ceiling) and a loss profile (front-loaded default: hazard halving every three years above a 0.3% floor; constant rate for comparison). The per-year hazard is calibrated by bisection so the profile reaches the chosen total; the audit check confirms the recomputation. Effect on the default value: $76,710 with no loss, $78,058 at 3.5M front-loaded (new default), $81,573 at the same total with a constant profile. Rationale recorded in the method note: a uniform lost share is absorbed by k; only the change in lost share across the fit window moves the value. Re-verified on real data; control sweep clean.
Data layer (added 1 September 2026)
A free daily snapshot pipeline (repository btc-data: GitHub Actions runs fetch/fetch_all.py at 06:15 UTC, writes one JSON per source to data/, GitHub Pages serves them with open CORS). Sources: Blockchain.com, Coin Metrics community API, Coinbase, mempool.space, DefiLlama, FRED, Alternative.me, Deribit/OKX/CFTC; ETF issuer flows marked not implemented pending first run. Each source is isolated and the manifest records status per source. Script verified against mocked responses for every parser and for merge idempotence; not yet run against live endpoints. Both tool pages now read the snapshot first when DATA_BASE is set and fall back to the live API otherwise; the Data audit panel reports which source and when. Verified: snapshot path loads with zero live-API calls and reproduces the default value.