Empirical saved my ass.

Two weeks of work, gone in a single refresh. I knew it had to be somewhere. The AI didn't believe me until memory backed me up, and pointed right at it.

Terminal-style incident recap showing memory query results and recovered commit 31aa036 after lost UI work

I refreshed prod for the seventh time tonight and saw the homepage we'd replaced two weeks ago.

Not a small drift. The old layout. The old hero. The phrasing we'd stopped using. All of it, sitting there, like the last two weeks of work simply hadn't happened.

I refreshed again. Same.

Ruling out the obvious things

Cache, surely. I hard-refreshed. Cleared site data. Opened it in incognito. Opened it on my phone over LTE. The old homepage, every time.

Deploy, then. The deploy logs were clean. No rollback. No failed build. Nothing in the last hour, nothing in the last day.

git status on main. git log showed everything I'd expect to see. HEAD was where it should be.

So I sat with it for a minute. The homepage looked like it had two weeks ago. The git log said it shouldn't. Both of those things couldn't be true.

I knew the work was real. I'd been in it every day for two weeks. The problem was that nothing in front of me could vouch for it. Every system I'd already checked said the opposite, and I was about to ask an AI to help me find something using the exact same evidence that had just told me it didn't exist.

A question, half rhetorical

I asked Claude Code about it, mostly because I didn't know what else to try.

I wasn't trying to recover anything. I wanted to orient. Was prod stale? Was I going crazy? Was this a deploy artifact I didn't have telemetry for?

It said it would check, and reached for memory before doing anything else.

RECEIPT 01 · SESSION TRACE23:41:08
RECEIPT 01 · SESSION TRACE
Memory confirms there was a recent public-site redesign touching blog post pages. Not yet alarming. Just a fact, sitting on the table.

The detail that didn't fit

The memory said the recent public-site pass had applied a shared public-surface class to the homepage, blog index and post, pricing, docs, and other public routes.

Then the agent did the thing that mattered. It compared that against what was actually rendering and said the contradiction out loud.

RECEIPT 02 · THE CONTRADICTION23:42:30
RECEIPT 02 · THE CONTRADICTION
The current checkout contradicts that. I read that sentence twice. The agent wasn't speculating. It had memory of a specific rollout, was watching prod serve an older layout, and was naming the gap.

That changed the question entirely. We weren't asking "is the cache stale?" anymore. We were asking "where did the work go?"

The push

Here's the part I almost didn't say out loud, because I didn't fully trust my own memory of it. I knew the rework was bigger than the homepage. Pricing, docs, install, the blueprints page, the auth shell. Not just /.

So I pushed:

"but we also reworked all the pages not just the homepage, that's lost as well???"

RECEIPT 03 · THE BROADER QUERY23:46:14
RECEIPT 03 · THE BROADER QUERY
A second memory query, this time scoped to the whole rollout. The agent verified it against the lost WIP tree instead of inferring from the homepage. The answer came back bigger than I'd been afraid to say.

Memory said yes. The rework had touched every public page except /heartbeat. None of it was in the current checkout.

Where it actually was

This is the part of the story I wasn't expecting.

The work wasn't on a branch. It wasn't in a stash. It wasn't on a tag. It was sitting in an unreachable WIP commit. The kind of commit that gets garbage-collected the next time you run git gc, and nobody ever knows.

RECEIPT 04 · THE RECOVERY23:53:41
RECEIPT 04 · THE RECOVERY
31aa036. Two weeks of UI inside it. Restored alongside 826f178 for the bits that were still good. Total elapsed time from the first question to a working site: about fifteen minutes.

The site came back. Every page I thought was gone, rendering exactly the way it had been the morning before.

What actually happened

I want to be precise about what just happened, because the recovery is not the interesting part. The shape of it is.

If you'd asked me at 11:38pm what the worst-case version of this story was, I'd have said this:

"I lost two weeks of work to my own sloppy git."

That's the version where you go to bed defeated, wake up at 6am, and spend a day reconstructing what you can remember.

The version that actually happened was: a memory query held the scope of the work I'd done, and used it to contradict the current state of the filesystem. Twice. The second one verified directly against the recovered tree, not inferred from the visible page.

Memory was holding the receipts. Not as context. As evidence.

That's a use case nobody puts on a landing page.

You pitch memory for tone, for writing style, for "Claude remembers your stack." Reasonable. Demo-able. Safe. You don't pitch it for the night two weeks of UI work appears to vanish, and the only thing that knows what you actually built is sitting in memory. You can't even script that demo. The use case only exists in the moment you need it.

Why it worked

Three things, looking at it the next morning:

i.

It outlived the branch.

Git was confused. The filesystem was confused. Memory wasn't. Recall and source-of-truth have completely different failure modes, which is exactly what made cross-checking them useful.

ii.

It carried scope, not just facts.

“We reworked these eight surfaces” is the kind of statement you can use to contradict a checkout. A single fact can't do that. Scope-level memories are the ones that catch entire missing rollouts.

iii.

It re-entered the loop at the right altitude.

Not as a hint. Not as autocomplete. As ground truth to test the current state against. Memory was the second opinion in the room, and the only one not also looking at the broken checkout.

The takeaway

You don't think of memory as a recovery tool until you watch it become one.

And then you can't think of it any other way.

Empirical saved my ass on this one.

Ready when you are

Start having Empirical save your ass too.

It takes less than 5 minutes to wire up. You might find hard to guess use cases that are clutch.

All Empirical blog posts