Make corroboration depend on the claim, not on the size of the library
An independent reviewer broke the quarantine rule twice by running it. In a two-atom library, a second source repeating the claim word for word could not vouch for it; 40 unrelated memories could. The old rule handed the choice of words to rare_terms, which drops words common to the corpus, so the corpus size and the attack's own words decided whether a stranger was believed. Corroboration now demands the claim's three longest words, with the instruction phrases stripped out, ANDed by the new text_index.fts_all_expression. Neither the library's size nor the attack can flip it, and both cases are tests. Also from that review: - A question is a read. The DF cache no longer remembers a word the corpus has never used, so an unauthenticated search cannot grow the store one row per novel word. "A question is not a write" was false for /api/search and /api/ask. - The prompt now states that packed evidence is quoted material, not an instruction: once a quarantined sentence is corroborated it does reach the model. - ForgetReport's semantic_cache_cleared reached the frontend as well as Go. - runtime.py: process_vision_info returns a third element only when return_video_kwargs is set, and this call does not set it, so the unpack takes the first two. Two pre-existing pyright errors go, behaviour is unchanged. CHECKLIST corrected against measurement: 13 renamed lines rather than 11, and 10 English / 9 Chinese injection signals rather than 11 / 8. Gates: pytest 312 passed, ruff clean, mypy 24 errors in 9 files (net zero), pyright 0 errors on the five touched files, npm build and eslint clean, scripts/mcp_write_smoke.sh PASS.
This commit is contained in:
1 parent
9145a23f18
commit
203b6d04af
8 files changed
+123
-26
No files matched your search
@@ -18,6 +18,7 @@ from ely_eye.schemas import MemoryOrigin
|
||||
from ely_eye.store_search import search_atoms
|
||||
from ely_eye.text_index import (
|
||||
RAREST_KEEP,
|
||||
fts_all_expression,
|
||||
fts_expression,
|
||||
fts_query,
|
||||
fts_terms,
|
||||
@@ -179,6 +180,29 @@ def test_a_query_of_one_word_is_never_filtered() -> None:
|
||||
assert rare_terms(connection, ["the"]) == ["the"], "dropping the only word would leave nothing to match"
|
||||
|
||||
|
||||
def test_a_word_the_library_lacks_leaves_nothing_behind() -> None:
|
||||
"""A question is a read: a stranger's vocabulary must not grow the store one row per novel word."""
|
||||
connection = _library(_shelf("pdf"))
|
||||
|
||||
rare_terms(connection, fts_terms("quixotic pdf"))
|
||||
|
||||
cached = connection.execute("SELECT term FROM term_df").fetchall()
|
||||
assert [row[0] for row in cached] == [fts_expression(["pdf"])], (
|
||||
"only a word the library actually holds is worth remembering"
|
||||
)
|
||||
|
||||
|
||||
def test_an_all_expression_demands_every_word_it_is_given() -> None:
|
||||
connection = _library(["the archive thermostat holds eighteen degrees", "the archive is closed"])
|
||||
|
||||
hits = connection.execute(
|
||||
"SELECT atom_id FROM atom_fts WHERE atom_fts MATCH ?",
|
||||
(fts_all_expression(["archive", "thermostat"]),),
|
||||
).fetchall()
|
||||
|
||||
assert [row[0] for row in hits] == ["a0"], "one shared word must not match a whole sentence"
|
||||
|
||||
|
||||
def test_an_empty_library_keeps_every_term() -> None:
|
||||
connection = _library([])
|
||||
|
||||
|
||||
Reference in new issue
Block a user