What happened
Two observe() calls on the same store, same session (engine 1.5.0, NLI via nli-http):
- Text about the Aug–Sep 2026 gap being caused by subscription cost. Nearest memory "Figure out what autonomous Idapixl can actually do",
max_similarity 0.72. Adjudicated genuine at 0.92. Correct — the older memory assumed autonomy was the limiting factor.
- Text describing the Ricochet Mine game's rule model (Three.js,
on -> if -> do JSON rules). Nearest memory "Animation stack decision for fozikio ecosystem: Framer Motion", max_similarity 0.51. Adjudicated genuine at 0.87, and that memory's confidence was penalised by 0.13.
The second pair does not contradict; the texts are simply about different things. An NLI cross-encoder asked "does A contradict B" about two unrelated statements will often say contradiction, because they are not entailed and not neutral in its training distribution.
Where
src/tools/observe.ts:84:
if (checkConflict && ctx.nli && gate.nearest_id && gate.decision !== 'novel') {
Adjudication runs for every non-novel observation. The only similarity floor is whatever makes the gate decision link rather than novel, which admits neighbours at ~0.5.
Why it matters
The penalty is applied to a memory that had nothing to do with the observation. Over time, ordinary fact-recording erodes the confidence of whatever happens to be the nearest unrelated concept. This is the same shape as the dream salience-inflation bug (#37): a maintenance path quietly rewriting a signal the rest of the system trusts.
Proposed fix
Add a similarity floor for adjudication, separate from the link threshold — e.g. conflict_min_similarity defaulting to the namespace's similarity_merge (or 0.65), and skip adjudication below it with adjudication: { skipped: 'low_similarity' } in the result so callers can see it was considered. Optionally require the NLI neutral score to be below a bound before accepting contradiction.
Repro
Any store with an NLI provider: observe a statement about topic X where the nearest memory (≈0.5) is about unrelated topic Y. Expect no penalty; observe a genuine verdict.
Found during Idapixl's 2026-09-13 audit session.
What happened
Two
observe()calls on the same store, same session (engine 1.5.0, NLI via nli-http):max_similarity0.72. Adjudicatedgenuineat 0.92. Correct — the older memory assumed autonomy was the limiting factor.on -> if -> doJSON rules). Nearest memory "Animation stack decision for fozikio ecosystem: Framer Motion",max_similarity0.51. Adjudicatedgenuineat 0.87, and that memory's confidence was penalised by 0.13.The second pair does not contradict; the texts are simply about different things. An NLI cross-encoder asked "does A contradict B" about two unrelated statements will often say contradiction, because they are not entailed and not neutral in its training distribution.
Where
src/tools/observe.ts:84:Adjudication runs for every non-novel observation. The only similarity floor is whatever makes the gate decision
linkrather thannovel, which admits neighbours at ~0.5.Why it matters
The penalty is applied to a memory that had nothing to do with the observation. Over time, ordinary fact-recording erodes the confidence of whatever happens to be the nearest unrelated concept. This is the same shape as the dream salience-inflation bug (#37): a maintenance path quietly rewriting a signal the rest of the system trusts.
Proposed fix
Add a similarity floor for adjudication, separate from the link threshold — e.g.
conflict_min_similaritydefaulting to the namespace'ssimilarity_merge(or 0.65), and skip adjudication below it withadjudication: { skipped: 'low_similarity' }in the result so callers can see it was considered. Optionally require the NLIneutralscore to be below a bound before acceptingcontradiction.Repro
Any store with an NLI provider: observe a statement about topic X where the nearest memory (≈0.5) is about unrelated topic Y. Expect no penalty; observe a
genuineverdict.Found during Idapixl's 2026-09-13 audit session.