Sessions in the archive pipeline get sorted by classification confidence. Above 0.9 they auto-stamp. From 0.6 to 0.89 the classification is applied but flagged for review. Below 0.6 they go straight to a reconciliation queue. Low-confidence classification, a parser that choked on an odd export, a session tagged to the wrong epic: every one of those needs a human eyeball at some point. Our first instinct was the obvious one: build the queue, route the uncertain items there, and don’t consider anything done until it hits zero.

That instinct is wrong. We only found out because we asked a second model to design the reconciliation layer before we built it, and it talked us out of our own plan.

The design that looked responsible

Queue-zero sounds like discipline. You don’t let unresolved things pile up, you clear them, and the system stays honest. We were already picturing the file: Reconciliation_Queue.md in the archive, every ambiguous classification landing there, and a rule that said the pipeline isn’t trustworthy until that file is empty.

The problem is that we run the archive pipeline, the classification layer, and the actual business on the same clock, with nobody else free to own any one of them. A queue that has to hit zero before you trust the system competes with everything else you’re supposed to be doing. It doesn’t stay small. It becomes a second inbox, and unlike email, nobody else is going to triage it for you.

What the second model said instead

We asked for a review of the whole conversation-archive architecture: seven decisions, five open questions. Buried in there was the reconciliation queue question, framed as a binary. Either gate on queue-zero, or let queues self-decay on inactivity.

The answer was blunt. In a single-user system, if you haven’t reviewed a low-confidence classification or a minor parser failure within seven days, it probably doesn’t matter. Gating work behind queue-zero will paralyze you. Accepting entries as compost means the queue grows forever and becomes cognitive drag. Self-decay keeps the queue showing only what’s recent and potentially relevant, and lets the rest fall into the archive.

That reframes what the queue is for. It’s a spotlight on what’s unresolved and recent, not a ledger of everything unresolved. Once something ages out, it stops being a task and becomes history. Nobody has to close it, because closing was never the point.

What no decay would have done to the tiers

We had built the same trap once before without naming it. Without decay, every session that ever scored under 0.6 sits in that bottom tier forever, waiting on us. Across weeks of running several provider archives through the pipeline, that number does not stay small.

Self-decay changes the shape of the failure mode. Instead of an ever-growing list you’re supposed to feel guilty about, you get a rolling window. A classification that has sat for seven days without anyone touching it wasn’t important enough to touch. It ages into the archive, un-triaged, and that’s fine. The record still exists. We just stopped being the bottleneck it was waiting on.

The same logic showed up in memory

The review didn’t stop at the reconciliation queue. It hit the same tension in agent memory: patterns should graduate into archive docs when they solidify, and anything untouched for 90 days should expire into cold storage rather than sit there rotting in the active file. Same shape, different layer. A system that never lets anything decay accumulates weight until you can’t move.

Every queue eventually asks you to define “done,” and if “done” means empty, you’ve built something you can’t sustain. Decay is what lets the system keep working without turning into a second job of clearing its own backlog.

We still haven’t hit queue-zero on the reconciliation file. We’re not supposed to. Our rule now is that a low-confidence item gets seven days of attention and then ages into the archive, so what we look at is what is recent and still relevant.