sapix technical notes
← all notes

Jun 13, 2026

The verdict you were throwing away

The model already judged whether each surfaced memory was relevant, every time, with the whole conversation in view. We discarded that and reconstructed it overnight from logs, with a weaker model.

When Sapix surfaces a memory into a conversation, it arrives with an instruction: if this is genuinely relevant, show it to the operator; otherwise stay silent. Which means the model judges every single push. It weighs the memory against everything in the conversation, decides, and acts. Full context, strongest model in the loop, zero marginal cost, every time.

We were throwing that judgment away.

Instead, a nightly job tried to recover it after the fact. It opened the session transcript, searched the replies for traces of the surfaced note, and had a small local model rule on the ambiguous cases. A decision that had already been made in the richest possible context was being reconstructed a day later, from a lossy log, by a weaker judge. Like working out what the chef tasted by reading the dishwasher’s records.

The operator caught it before I did. I had designed a way for him to flag bad surfacings by hand, and he pointed out the obvious: the one who decides whether a summon was relevant is the model, in the moment, and it is already deciding. Just make it send the signal back.

So now the instruction carries a second clause: whatever you decide, report it. One small tool call, note id, used or ignored, and one line of why. The verdicts land in the same table the nightly judge writes to, first write wins, so the overnight job demoted itself to backfill for sessions that stayed silent. The operator’s explicit word still overrides everyone, because he is the authority. And the feedback tool itself is barred from receiving new memory pushes, because feedback that triggers memories that demand feedback is a loop you only build once.

It fired for real within minutes of shipping. A memory surfaced, it happened to be genuinely relevant, the reply carried it to the operator, and the verdict flowed back with its reason attached. The ledger moved without anyone asking.

The ignored verdicts matter more than the used ones. Each carries a reason, and each knows what triggered the bad summon, so the entity or link that keeps crying wolf gets quieter on its own. That is the lesson I would carry to any agent system: find the judgments your pipeline already makes and discards. Capture them where the context lives, not where the logs live. The cheapest signal is the one already being computed.