discard_assertion (the Dismiss button's handler) only mutates the assertion row in the database. It never writes a conversation turn. The classifier and responder read recent_turns as their only context. A dismissed "Want me to save it?" offer therefore stays conversationally live indefinitely — nothing in the conversation history ever reflects that the Operator said no.
Confirmed live: an Operator dismissed a held item, then repeated the same utterance. The classifier read the stale, unanswered-looking offer in recent_turns and classified the repeat as general_conversation, and the responder replied "Still waiting on your okay from earlier..." — referencing an item that no longer exists. Confirmed via database: the same pattern recurred across three separate dismissed items in one session (44, 52, 58), each still referenced as if live. No new held item is ever created from the repeated utterance; the content is effectively lost.
The seed's Memory principle is "corrections preserved, not smoothed." A dismissal is a correction — the Operator explicitly said no to a proposed save. Today that correction is not recorded anywhere the conversation can see, so the system behaves as if the correction never happened.
When a held item is dismissed, record that as conversation context the classifier/responder can read — most directly, a conversation turn noting the dismissal, mirroring how other state changes (commit, discard-via-voice-flow) already produce a turn. This ensures a repeated utterance after a dismissal is correctly treated as new content, not as a still-pending offer.
No conflict. Directly required by "corrections preserved, not smoothed" — a dismissal is a correction that must be walkable in the record the system itself relies on.
No change to discard_assertion's data-layer behavior (already correct — properly excludes discarded items from correction-matching, per confirmed engine-side logic). No change to CR-2026-145's correction-recognition matching itself, which works correctly when it runs — the gap is upstream, in the classifier seeing stale context before that matching logic is ever reached.