# Recall topic veto, what it costs and what it buys, 2026-08-03 Vikunja #496. The task asked for a cross-language fix. Skip the topic veto in `memory.RecallAllowed` when the question and the hit are in different scripts. An English question would then stop losing a Russian note. No such case exists. No fixture case puts the question and its wanted note in different scripts. The case the task named is not one either. en-hard-024 query "what fixed the screen problem" note "the flicker went away once i swapped the display cable" Both are English. It is a paraphrase failure, not a language failure. A script test would not have changed a single case, and neither would a bilingual stem map. ## What the veto is worth today Measured with the real embedder, multilingual-e5-small int8, gate 0.55, margin 0.008. The first row is the veto as it ships. The second is `RecallAllowed` forced to true. | | cases passing | answered | false recall | silenced by gate | |---|---|---|---|---| | veto on | 22/32 | 17/27 | 0/5 | 2 | | veto off | 22/32 | 18/27 | 1/5 | 1 | The pass count does not move. The veto trades one true recall for one false one. It costs `en-hard-024` and it buys `ru-silent-029`: ru-silent-029 query "во сколько отходит поезд" note "погулял вдоль реки" 0.835, margin 0.019 The second case counted as silenced by the gate is `ru-home-026` at margin 0.001, which the margin gate stops. The veto has nothing to do with it. ## Why no lexical rule separates the two `en-hard-024` and `ru-silent-029` are in the same lexical class. Both questions share zero content words with their hit, and neither carries a first-person marker. The scores sit on top of each other, 0.826 against 0.835, and so do the margins, 0.023 against 0.019. Only one thing separates them. A screen problem and a swapped display cable are the same event. A train and a river walk are not. The embedder scores that difference at nine thousandths. So the signal is semantic and the gate is lexical. Any rule cheap enough to sit in `RecallAllowed` and strong enough to recover `en-hard-024` also re-admits `ru-silent-029`, which puts false recall back to 1/5. One near-miss rule was tried on paper and rejected: let the veto pass when the hit itself is first person. It works on these two, because the English note says "i swapped" and the Russian note says only "погулял". It is backwards as a principle. A first-person note is exactly the personal note the veto keeps away from a world question. The rule would weaken the veto where it was designed to bite. It survives here only because Russian drops the pronoun. ## Decision Accept the loss. `en-hard-024` stays silenced and false recall stays 0/5. The way out is a reranker, not a longer word list. Recall@3 is 85.2% against recall@1 at 70.4%, so the right note is usually in the returned set and ranked wrong. That is where the remaining points are, and it is not this task.