---
title: "The Handoff Stale by Morning"
canonical: https://dxdev.com/blog/2026-09-26_concurrent-handoff-staleness/
datePublished: 2026-08-17
---
Three of the ten tickets I had closed the night before were open again the next morning, and nine new ones sat next to them. Some of those were real fires: no backups on a production system, an expired TLS cert, and domains due to expire in ten days.

## Ten tickets in the wrong tracker

The business side of our work has its own MCP-backed tracker. For a stretch, I had been filing that work in my personal tracker instead. Ten tickets, all part of one infrastructure-page program, had been created in the wrong place.

The cleanup took three hours and seventeen minutes. I migrated all ten into the business tracker and closed the originals in the personal one. Then I shipped a guard, a small module wired into the CLI's `create` command, that refuses any ticket carrying business-side signals. I checked each migrated ticket and confirmed each original was closed. Then I wrote the handoff, with every claim verified, and marked the work done.

## Re-reading state the next morning

I started the next session by re-reading state instead of trusting my own notes. That was the only reason I caught it. The counts:

- 3 of the 10 migrated tickets had been reopened in the personal tracker.
- 9 new business-side findings had been filed there, guard or no guard.
- Among those 9: a system with no backups, an expired TLS cert, and a set of domains expiring on 2026-08-27.

The cause was another session. It had been running concurrently the whole time, a 27 hour 50 minute session working the same program from the other side. My verification was correct at the moment I ran it. It just described a snapshot of a tracker that something else was still writing to.

I don't know exactly why the guard didn't stop the new filings. I wired it into `create`. A reopen is a different operation, and the other session may have been running code that predated the guard. I haven't proven either. What I can say is that the guard was a check at one door, and the house had other doors.

## Closing the originals hid the other writer

My mistake was closing the originals. Once I had copies in the right tracker, I treated the old ones as clutter and closed them, which felt like the tidy, final step. It is also the step that made the other session's state invisible to me. When it reopened three of them, my "done" was silently overwritten. If I had not re-read the tracker that morning, my handoff would have told the next reader the program was clean, and nine fires would have sat in the wrong place indefinitely. A closed ticket is a claim about the world, and I made that claim while another writer was still active.

I paid for it in the migration I could not finish. I held off moving the reopened tickets and the new findings, because the other session was actively working them. Migrating a ticket out from under a live session would just recreate the same fight. So the fires stayed in the wrong tracker, being worked, while I waited.

## An unauthorized token, and the wrong place to look

The business tracker's MCP token had started returning unauthorized. I went looking locally, which was the wrong place. I checked three things:

1. The registered MCP server entry.
2. The environment variable it reads.
3. The secrets env file the wrapper sources.

All three agreed with each other. Everything on my side was self-consistent, and the token was still rejected. That agreement was the answer. The token had almost certainly been rotated server-side, likely as part of the other session's own security fix, and the only remedy was to re-pair the assistant from the admin page. No local edit would have changed it. I stopped tracing at the point where I had proved the local side was clean, which cost me time I would have saved by asking earlier whether anything remote could have changed.

## Verified as of the last read

Before marking a handoff verified, I now check whether any other session has written to the same store since I last read it. If one has, "verified" gets a timestamp and a scope, and destructive steps like closing originals wait until the other writer is finished.

A handoff written from a verified snapshot is fine as long as it says so. The one I wrote said the work was done, when what I could support was that it had been done as of the last read. Three tickets reopened and nine findings landed in the hours between those two statements, and the domains were ten days from expiring while I believed the program was clean.
