Reference
Changelog
Every change to how a published number is computed, and every correction to one. Dated by the day the change reached production. If a figure you quoted from this index has moved, this is where you find out why.
· Correction
Stopped publishing a manufactured sale date
What was wrong. Many contributing sources — most state-forestry price lists among them — publish a price without ever stating when the wood sold. The public views filled that gap with
coalesce(date_sale, current_date), and then republished the result aslatest_sale. The effect was that a price with no known sale date was published as having sold today, and it re-dated itself to today on every refresh. On the day this was found, 24 of the index’s 30-day cells were stamped with the current date and the home page showed sixty cells all claiming to be “today”.What the underlying intent was. The
coalescewas deliberate and half right: it kept undated rows inside the rolling window instead of discarding them, which is correct — an undated price list is still evidence. The defect was reusing that same expression as the date the index then published. Window membership and reporting are two different questions and were sharing one expression.What changed. They are now separate.
latest_saleis null exactly when no source states a sale date, and a newlatest_observationcarries the day the price was recorded. Freshness everywhere is measured from the observation. The public-index contract now rejects any published view that lackslatest_observationor that reintroduces the old expression, so this specific mistake cannot come back silently.What it did to the numbers. No price changed. Dates did: the 30-day window went from 24 published cells to 14, because ten of them only qualified on a date that was never real. Cells whose sources state no sale date now show an honest age instead of “today” — in some cases over a year. Nothing on the site got fresher; the site stopped claiming it was.
Migration:
20260930110000_tpi_honest_observation_dates· Coverage
Index published
The index went public with 11 sources scraping successfully. The minimum-evidence gate at launch was five normalized observations per cell, from at least one public source; the original two-source rule was relaxed to one before launch and that relaxation is documented in the methodology. Everything before this date is pre-publication and is not logged here.
Why this page starts where it does
This log begins at the observation-date correction because that is the first change recorded as it happened. Earlier changes to the computation are real and are readable in the schema history — the market-tier dimension, the prev_median comparison, the relaxation of the two-source rule — but they were not logged at the time.
They are not being back-dated now. Migration identifiers in this project are version numbers rather than calendar dates and run ahead of the day a change actually shipped; reconstructing dates from them would put invented dates on a page whose entire purpose is that we do not do that. The full history is in the repository.
If you republish our numbers
Date the figure from latest_observation, which is always present, and never from latest_sale, which is null for any cell whose sources state no sale date. Do not describe an observation date as a sale date. The API reference spells out both fields, and the normalization page documents the arithmetic behind every figure.