Methodology version 1.0.0 · snapshot 2026-10-06
How this screen works, and what it refuses to do
This page is the contract. Nothing on this site may state a rule that is not here, and nothing here may omit a limit that applies.
What we refuse to do
No composite score. Markets are never ranked, scored, or ordered against each other, and no layer is combined into an index. A single number claiming to summarise a country is the most common way work like this becomes dishonest, so it is excluded architecturally rather than discouraged editorially.
No instrument-level view. Listed vehicles appear as market context. No buy, sell, hold, target price, or valuation opinion on any security, and no redistribution of exchange quotes.
No brokerage. We do not find, arrange, introduce, or broker property.
No implied freshness. Every value carries its observation date and its retrieval date, and a market past its review date labels itself stale rather than sitting quietly.
The layers
A layer is present for a market or absent from it. Absent layers are shown as absent. They are never imputed, interpolated from a neighbour, or filled in from a secondary summary.
| # | Layer | What it reads | State |
|---|---|---|---|
| 1 | Currency and entry window | How much the entry price has moved for a foreign buyer through exchange rates alone. | Published on 27 of 58 markets |
| 2 | Valuation against own history | Where price sits against income and against rent, relative to that market's own past. | Published on 47 of 58 markets |
| 3 | Foreign-buyer friction | What the law and the tax code actually do to a non-resident buyer. | Published on 58 of 58 markets |
| 4 | Financing conditions | The cost of money against asking prices. | Published on 56 of 58 markets |
| 5 | Supply against absorption | New supply against the capital and demand arriving. | Published on 2 of 58 markets |
| 6 | Listed against private | The same exposure priced publicly and privately. | Blocked on market-data licensing |
| 7 | Replacement cost | Build cost against secondary-market pricing. | Not started |
| 8 | Developer credit | A developer's cost of debt against the pricing of its projects. | Blocked on market-data licensing |
Currency is a modifier, not a thesis
A currency move only means something together with entry and exit friction, financing cost, and the local price trend. A market whose currency has fallen ten per cent is not therefore ten per cent cheaper: the discount can be erased by a purchase tax, trapped by an exit restriction, or already priced into local asking levels.
The denominator is the reader’s. Each market page expresses the same twelve months against several base currencies, because a market is cheap or dear relative to the capital entering it and not relative to an assumed dollar. Cross rates are derived from published reference rates quoted per euro, so the euro cancels and no third source is involved.
The twelve-month window uses monthly averages rather than two spot fixings, so a single volatile day cannot move a headline. The latest daily fixing is shown separately, because that is what a reader sees if they go and look.
Coverage
| Rung | What it means |
|---|---|
| INDEXED | Macro and currency context only. The honest default for most of the world. |
| OBSERVED | At least two layers computed from primary sources under recorded licences. |
| VERIFIED | An authored dossier with per-fact provenance, a counter-thesis, invalidators, and a named approver. |
| ACTIONABLE | A scoped research engagement can be delivered here. |
| TRANSACTABLE | A licensed partner can transact. No territory holds this rung. |
Two conditions sit beside the ladder rather than on it. rights blocked means a required licence is missing, expired, or ambiguous, and every dependent output is suppressed. stale means the market is past its recorded review date. A market can be verified and stale at once, and folding that into one rung would lose the part a reader needs.
How a signal becomes public
OBSERVE → WATCH → CONFIRMED | REJECTED → STALE. An automated process may author only the draft states. Advancing a signal and publishing it requires a named human approver recorded with it.
Signals are derived from layer values by published rules rather than written independently of them, so a signal can never be fresher than the data beneath it.
Rejected is published. A widely repeated thesis that fails its own test is the most useful thing this screen produces. The Singapore page exists because of one.
Revision and retrospective reading
Statistical agencies revise. Where a series is revised, today’s reading and the reading available at an earlier date differ, and only one of them reproduces a past decision. Our store keeps the date a figure was released separately from the date we first held it, and visibility is decided by the second.
A consequence follows that is easy to get wrong: history loaded today carries today’s knowledge date, so it cannot be used to reconstruct what was knowable a year ago. Retrospective reading is therefore restricted to series that are not revised — published exchange-rate fixings and policy rates — or labelled explicitly as hindsight over revised data. A backtest built on revised series is never presented as forewarning.
Where two published answers disagree
Some questions have more than one published answer, and the answers do not always agree. Housing measured against household income and the same housing measured against rent are both indices of a market against its own past, and on the current archive 4 of the 23 markets that publish both have them on opposite sides of their own 2015 — cheaper by one measure and dearer by the other, in the same window.
Those are set out on the disagreements page, side by side and never averaged. There is no combined figure and no page on this site will produce one: a mean of two contradictory readings describes a market that does not exist, and it would read as the most confident number on the screen.
Corrections
Errors are corrected in place, with the correction and its date recorded on the page. Corrections are not silently overwritten. Every one is listed here, newest first, with what the page said before it. The wrong sentence is the useful half: a list that recorded only the fix would tell you what is true now and leave you unable to work out whether anything you acted on was affected.
It said: CYP-FR-001 said a non-resident EU citizen needed a Council of Ministers permit for a secondary residence in Cyprus, but not for a primary home.
It says: The permit turns on nationality, not the home's use. A non-EU/EEA individual needs prior permission to acquire immovable property other than by inheritance; EU/EEA citizens and EU/EEA-established companies are outside the alien category for either home use.
The cited English consolidation predates Law 161(I)/2011. That law replaced the alien-definition limbs and deleted the secondary-residence definition in Cap. 109 s. 2; it was published in Official Gazette Supplement I(I) No. 4311 on 16 December 2011, p. 1361. Publication is the presumed commencement date because no separate clause was found. The old English source URL now returns 404. The status of a further 2026 bill remains unestablished and the rule is due for review by 15 November 2026.
It said: The United Kingdom's annual charge on an enveloped dwelling was published as an annual tax on companies owning residential property above GBP 500,000, banded from GBP 4,600 to GBP 303,450, with no mention that any relief exists. A company letting a dwelling commercially read a recurring five- or six-figure cost that it may not owe at all.
It says: Seven reliefs are published by HMRC on a separate guidance page linked from the one this entry was read from, and every one of them turns on what the property is doing: commercially let to an unconnected third party, open to the public for at least 28 days a year, developer stock, property-trader stock, employee accommodation provided by a trading business, a farmhouse occupied by a farm worker, and social housing. They are recorded as their own entry, and the charge now points at them. None of them is automatic — a relief that reduces the charge to nil still requires a Relief Declaration Return through the ATED online service — so the entry is filed as a procedure with a monetary consequence rather than as a statement that no restriction applies.
The omission was invisible until the ledger grew a field for what a property is used for. Every one of these reliefs turns on use, the entry had no way to express use, and the reading stopped at the page it started on. The gap had been recorded honestly in docs/DATA-GOVERNANCE.md the same day — that our statement did not carry the reliefs and an income mandate would therefore get a stricter answer than the instrument supports — and recording a gap is not the same as closing one, so the source was read. The reliefs guidance is dated 2 May 2025 and the basics guidance it is linked from is dated 4 March 2026: ten months apart, which is a fact about HMRC's guidance rather than about the law, and is why the entry names both dates.
It said: Each market card on the home page ended with a count of foreign-buyer rules and the words "each cited to the authority". Where no rule had been read, the card rendered "0 rules for a foreign buyer, each cited to the authority. No dossier written yet." — a statement that zero rules had each been cited, standing on 37 of the 53 cards.
It says: A market with no rule read for it now says so in the site's own vocabulary: "No foreign-buyer rule has been read and cited here yet — absent rather than unrestricted." The count and the citation claim are made only where there is something to count.
The distinction is one this site already draws at length and had never applied here. /friction/ gives three paragraphs to absence against a published statement that no restriction applies — "Absence of a rule and a rule saying there is no rule look identical on a screen that cannot tell them apart, and only one of them is evidence" — and NO_RESTRICTION exists in the constraint vocabulary precisely to keep them apart. The correct branch also already existed in the code: apps/site/components/request-form.tsx renders "no foreign-buyer rules published yet" for the same zero. It never reached apps/site/app/page.tsx, and no test read the sentence in either place. On a coverage screen the defect is worse than a wrong number, because a flat zero beside a claim of citation reads as a finding about the market rather than as a gap in the ledger, and 43 of 58 markets have no rule read at all. Found by reading the rendered output during a sweep for exactly this shape, after the same failure had shipped green on /friction/ earlier the same day.
It said: Gate P listed "WCAG AA" among the conditions the public surface had met before cutover, and docs/design/UX-MASTER-SPEC.md named WCAG 2.2 AA as the release target. Both read as statements that the standard was being met.
It says: Neither was ever measured. When an automated check was finally run on 2026-08-27 it found 59 colour-contrast failures on /friction/ alone, plus failures on /markets/, /sources/, /methodology/ and the new /divergences/; a world map whose per-market links were announced as part of an image and could not be reached by assistive technology; and two scrollable tables a keyboard user could not scroll. All are fixed and the check now runs over every public route on every build.
The palette is chosen against the white canvas, where every token clears AA comfortably. Status badges do not sit on the canvas — each sits on a ten-per-cent wash of its own colour, which costs roughly half a point of contrast ratio and takes conflict, verified and warning to 4.11, 4.02 and 3.52 against a 4.5 requirement. That is invisible to inspection and obvious to a measurement, and no measurement existed: there was no axe, no contrast assertion and no automated accessibility check of any kind in either browser suite, while two governing documents named the standard as met. The map defect has the same shape: role="img" on an element containing links is correct-looking markup that makes the links unreachable, and only a checker would say so. This is the fifth time in two days that a claim recorded in a document had nothing enforcing it, and the first where the gap was on the live surface rather than in a stale number.
It said: Every published rule was classified as biting at entry, while holding, or at exit, and the page reported the split of the ledger across those three as the whole after-purchase picture.
It says: There is a fourth phase. A charge that falls when the property passes on — inheritance or estate tax on an asset by where it sits rather than by who inherits it — is none of the three, and the ledger now carries succession beside them.
The vocabulary was complete for the rules that had been read and incomplete for the rules that had not. Japan taxes property situated in Japan on inheritance at rates reaching 55% whatever the heir's address; that rule was always there and there was nowhere to file it. A reader who took the holding and exit counts for the whole cost of owning across a border was misled by the shape of the vocabulary rather than by a wrong entry — which is the harder kind to notice, because every individual entry was right.
It said: The layer table gave layer 2, valuation against own history, the state "Withheld — licence not read", and layers 4 and 5 the state "In build".
It says: Layer 2 is published on 47 of 58 markets, layer 4 on 56, and layer 5 on 2. The OECD grant that gates layer 2 was confirmed for PUBLIC_DERIVED on 2026-08-16 and every market page has been rendering valuation cells since.
The states in that table are hand-written constants and the layers they describe are data. When the OECD licence was read, one field in data/grants/oecd-house-prices.json changed and thirty-four markets started answering — which is the design working. The methodology page did not change, because nothing made it. It is the page that says "nothing on this site may state a rule that is not here", so a stale state there is not a cosmetic error: it told a reader the screen could not show them something the screen was showing them.
It said: The valuation cell printed both ratios — "87.8 to income, 109.5 to rent" — and then wrote one sentence about the market, decided by the price-to-income figure alone. Where that figure sat below 100 the sentence read "affordability has improved against the local salary", whatever the rent figure said.
It says: Where the two ratios sit on opposite sides of a market's own 2015, the cell now says so: cheaper by one measure and dearer by the other, in the same window, with no third number that resolves it. Every market with both readings is also set out on /divergences/.
The sentence was generated from one of two numbers printed inches apart, and the other was left to the reader to notice and reconcile. On the current archive that affects four of the twenty-three markets carrying both ratios — Korea at 47.8 against income and 106.2 against rent, and Colombia, Germany and Japan the same shape. Nothing was inaccurate: both figures were correct, current, and sourced. The defect was that the prose answered a question the data had answered two ways, and picked the half the code happened to test. The comment above the Valuation type had recorded since the layer shipped that the two ratios "routinely point opposite ways, and a market where they do is more interesting than one where they agree" — the understanding was in the repository and never reached the page.