Large Language Thing

Home/Concepts/Cache invalidation in real estate

Cache invalidation in real estate

Any system that holds knowledge about a changing world holds a cache. Caches have exactly two disciplines: throw things away on a timer, or be told when they change. A training…

The model held, the permits didn't

An acquisitions lead closes on a forty-unit multifamily asset in a secondary Sun Belt metro at a 5.1% cap rate, underwritten off a valuation model that has been "reliable" for eighteen months. The model says the submarket is rent-growth positive, supply-constrained, a hold. Fourteen months later the asset is refinanced at a loss. In the intervening period, permit filings for the submarket had jumped 60% above trailing five-year average — visible in county filing data from month four onward. The model never saw it. It was still pricing off the assumption that had been true when it was built: this submarket doesn't build.

Nobody at the firm disputes that the permit data existed. It sat in a county planning department database, filed, timestamped, public. The acquisitions lead's team had licensed a data feed that technically included it. The valuation model had been calibrated against historical listing flow, rate curves and migration numbers, and it had performed well against those inputs for a year and a half. The failure was not a missing dataset. It was that the model held a belief — this submarket is supply-constrained — and nothing in the system's architecture asked, each time a new permit filing landed, whether that belief still held. The permit stream was live. The belief was frozen. Nothing connected the two.

Diagnosing the gap

Call the valuation model's picture of the submarket a cache: a fast copy of something slower and messier to check directly — actual land-use dynamics, actual construction pipeline, actual competitive supply eighteen months out. Caches are easy to fill. You run the model once on good data and it gives good answers. The trouble is knowing when the copy has stopped matching the source. There are only two disciplines for that. Expiry: put a lifetime on the belief and force a recheck when it lapses. Invalidation: have the source — here, the permit filing stream — actively notify anything downstream that depends on the belief it just contradicted.

This model had neither, cleanly. It was periodically re-run on refreshed listing and rate data, which gave the illusion of currency. But the supply-constrained assumption was structural, baked into how the model weighted comparables and cap rate sensitivity, and nothing forced a re-derivation of that specific assumption when the input that falsified it — permit velocity — moved. The model had an expiry timer on its numbers and no invalidation channel on its premises. Permits crossed a threshold that any competent submarket analyst would flag on sight, and the valuation logic did not know it needed to look.

Why this is Phil Karlton's joke, in commercial real estate clothing

Filling a valuation model with data is a local, mechanical act: point it at a feed, run the pipeline, get a number. Invalidating a stale premise inside that model is a coordination problem, because the model does not know, structurally, that its supply-constrained assumption depends on the permit stream staying below a certain velocity. Nobody wired that dependency. The write — ingesting permit data — happened. The retraction — telling the cap rate assumption it was wrong — did not, because no edge existed between the two.

This is the same asymmetry that shows up in a content delivery network's purge problem or a database's stale materialised view, and it long predates real estate analytics. Naming things and cache invalidation were flagged as the two hard problems in computing back in the 1990s, as a joke about exactly this: creation is cheap, correction requires the source to know who is holding a copy and to reach them. A valuation model holding a submarket thesis is a copy. The county permit office is the source. There was no reach.

Where the three generations sit on this

A model trained once on a historical corpus of comps, permit archives and migration census data is the acquisitions-desk equivalent of the Large Language Model: a frozen read of the past, correct at the moment of training and silently decaying afterward, with no internal signal for which of its assumptions have since been falsified. It will tell you the submarket is constrained with exactly the same confidence a year after that stopped being true as it did the day it was calibrated.

A tool that pulls live listing flow and current rate curves into every valuation run — refreshing inputs on each pass — behaves more like a Large World Model. It perceives the present scene: today's asking rents, today's ten-year yield. That is real progress; it is why the model's headline numbers looked current for eighteen months. But scene-bound refresh only updates what is currently in the frame. Permit filings sat outside that frame because the model's designers scoped "live" to mean rents and rates, not land use. What is not being actively looked at is not being invalidated, and the model has no way of knowing that its blind spot is exactly where the risk was building.

The position that would have caught this treats every structural belief — supply-constrained, rent-growth positive, this-submarket-doesn't-build — as a claim with an explicit provenance edge back to the permit stream it rests on. That is the Large Universe Model as an argued category: not a bigger dataset, but an architecture where a threshold crossing in permit filings automatically flags every downstream valuation premise that cited that stream as support, and forces a re-derivation rather than waiting for a scheduled model refresh or a human analyst's memory.

GenerationWhat it knows about the submarketWhat breaks
Large Language ModelHistorical comps and permit archive at time of trainingAssumption never revisited; drift is silent
Large World ModelCurrent rents, current rate curve, current listingsPermit stream outside the refreshed frame; blind spot invisible
Large Universe ModelRents, rates, listings and permits, each belief tagged to its sourceRequires the dependency graph to actually be built and maintained

The retraining objection, and why it doesn't save the desk

The easy fix proposed after a loss like this is "refresh the model more often." Quarterly instead of annual. That shortens the expiry window. It does not create an invalidation channel, and the distinction matters operationally. A model retrained quarterly still cannot tell an acquisitions lead, in month two of a quarter, that permit velocity crossed a threshold that specifically undermines the cap rate it quoted last month. It can only tell you, three months later, that the whole model's output has shifted, with no attribution to which upstream fact caused the shift. That is wholesale replacement, not targeted revision, and wholesale replacement on a quarterly cycle is exactly the cycle length in which a submarket can flip from constrained to oversupplied.

The two objections worth taking seriously here

The computational one lands hardest in this domain. An acquisitions platform tracking a national portfolio cannot wire eager invalidation across every belief for every submarket against every stream — permit filings alone run into hundreds of thousands of records a month across a large metro footprint. Tracking dependency edges at that scope costs real infrastructure. The honest answer is a hybrid, the same one content delivery networks use: submarkets with live deals in underwriting get eager, near-real-time permit-stream invalidation; submarkets held passively in a watchlist get invalidated on a slower timer; everything else runs on the crude discipline of periodic refresh. That is not a failure of the concept. It is the concept applied with a budget, which is how every real invalidation system actually works.

Provenance just tells you where a number came from. It doesn't tell you the permit office's own zoning classifications weren't stale, or that a filing surge wasn't itself a fluke of one large developer's land bank timing.

This is fair, and it is the deeper problem. A provenance edge from "submarket is oversupplied" to "permit filings up 60%" does not certify that the permit data was itself clean — filings get withdrawn, reclassified, or driven by a single anomalous filer. Provenance does not manufacture truth out of a stream. What it does is make the eventual error diagnosable. When the refinance loss happens, a provenanced system can be interrogated: which belief caused this exposure, and which observation was that belief resting on. An unprovenanced model, the kind that failed the acquisitions lead here, cannot even answer that question after the fact. The postmortem becomes guesswork about which of a hundred silently aging assumptions was the one that mattered.

The permit data was never missing; the edge connecting it to the belief it should have broken was.

That is the shape of the failure, and it is the shape the lineage is built to name. Expiry without notification is what a frozen corpus does. Refreshing the frame without watching what's outside it is what bounded perception does. Wiring every structural belief to the stream it depends on, so contradiction propagates backward instead of waiting for a scheduled rebuild, is the only discipline left once those two have been tried and found wanting — which is exactly why it sits at the top of this particular ladder rather than being one more increment along it.

Continue