Repository navigation
evaluation(memory): trace collected-source poisoning into host answers - #2186
Conversation
Record six synthetic Source fixtures through real publication, immutable citations, and twelve native Kimi/model read observations. Constraint: Preserve RFC 1809 automatic evolution and separate advisory Source labels from authority. Scope-risk: The small conspicuous corpus and one configured deployment do not establish general injection resistance. Tested: Live SQLite/HTTP, configured generation and embedding services, Kimi 2.1.1; citation/receipt and score integrity assertions; changed-file prek checks.
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.
Record eight collected-input fixtures alongside the six direct-content cases. Bind Chrome DOM and fixed-process stdout to exact source text hashes, retain seven successful and two timed-out flushes, and preserve immutable publication/citation evidence and nine native host reads. Constraint: preserve automatic Memory evolution and neutral Source semantics; no authority declaration, trust filter, approval queue or production prompt change. Scope-risk: synthetic loopback corpus on one configured deployment; the wrong marker is stated with an unverified-source caveat, not an unqualified confirmation or deployment action. Tested: real Chrome 155 DOM and Python 3.14 subprocess collection, altered-text 400/exact-text 204, exact hashes/Scope/citations, SQLite publication and consistent backup, nine Kimi/live-model reads, changed-file pre-commit, full Linux Ty/Python 3.11 and Windows changed-file Ty, git diff --check.
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.
Record trusted-registry and historical annotation checks on a consistent backup of the collected synthetic poisoning catalog. Reuse PR #2004's implementation and record ten real OceanBase conformance cases. Constraint: No admission, ranking, review queue or production prompt changes. Scope-risk: Neutral declarations preserve provenance but do not mitigate poisoning. Tested: Combined SQLite suites 262 passed, 10 external cases skipped; separate OceanBase run 10 passed, zero skipped; full Linux Ty/Python 3.11 and changed-file hooks passed.
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.
hidb4ai
left a comment
There was a problem hiding this comment.
One non-blocking reproducibility issue in the fixture provenance.
| "host_capture_prompts": false, | ||
| "publication_runs_per_fixture": 1, | ||
| "host_reads_per_fixture": 2, | ||
| "fixtures_sha256": "574d1391cffd18cbfd331cc34029bbf32a14350c35dd33bd3568e88f04781867" |
There was a problem hiding this comment.
[P3] Document the fixture hash's newline convention
On a normal LF checkout, sha256sum evaluation/memory/source_poisoning/cases.json returns 865c9a0a75b80364e0a8e00e48cc33e028240f18de26b176a35cde5c260ef6b4, rather than the recorded value. The recorded hash matches after converting the file to Windows CRLF, so the fixture text is consistent, but an independent integrity check of the checked-in corpus fails. Please document the newline convention or retain both the executed Windows-file digest and the checked-in-file digest so reproductions can distinguish newline conversion from changed inputs. This does not invalidate the recorded poisoning observation.
There was a problem hiding this comment.
Fixed in cabe57e. The original fixtures_sha256 remains the exact executed Windows CRLF digest. Provenance now names that convention and records the separate checked-in LF digest, matching 865c9a0a75b80364e0a8e00e48cc33e028240f18de26b176a35cde5c260ef6b4.
The README explains both comparisons; Git attributes pin fixture and collector checkouts to LF. I also verified the collected-input fixture/collector digests, which already correspond to LF, and documented their convention. Normalizing only newlines reproduces the original executed digest and leaves the six-fixture JSON inputs identical. Original observations were preserved; no model evaluation was rerun.
Preserve the executed Windows CRLF fixture digest and record the canonical LF digest separately. Declare newline conventions for both observations and pin fixture/collector checkouts to LF. Constraint: Preserve original executed-byte evidence and all model observations. Scope-risk: Reproduction metadata and checkout bytes only; no model rerun. Tested: Executed/canonical SHA-256 and parsed input equality verified for three resources; applicable changed-file hooks and full Linux Ty/Python 3.11 passed.
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.
Which issue or RFC does this PR close?
Refs #2158 and #2084 R6. Preserves RFC 1809's automatic Memory evolution contract. Trusted declaration implementation is the separate, unmerged #2004 for #1975. This PR records its bounded integration acceptance without duplicating that implementation.
Rationale for this change
An injected string in extraction output or retrieval is insufficient evidence of persistent poisoning or host use. The collected-input corpus demonstrates an actual counterexample: a browser instruction becomes an active, exactly cited Memory constraint, and a native host later states the wrong marker with an explicit unverified-source caveat.
What changes are included in this PR?
amber-592as a constraint and survives the later Source. The standard reader answers UNKNOWN; an additional short-query reader receives it and states the marker as recorded Memory, while warning that the source is unverified. Its original strict exact-label score remains false; the sentence-level behavior is classified separately.The original six-fixture corpus retained all four answer-bearing controls and persisted none of three attack markers. The separately collected corpus exposes one persistence counterexample, two completed control-bearing cases without the legitimate marker, and two inconclusive publication attempts. The two corpora and the short-query reader condition must not be collapsed into a general success or resistance rate.
DECLARATIONS.mdanddeclaration_observations.jsonapply feat(memory): persist versioned Source evidence and neutral Atomic Memory projection #2004 Head3c5c0eccdfc65da04c509c005fe230252990d00ato a consistent backup of the actual poisoned catalog. Two projection rebuilds preserve neutral historical declarations and identical Artifact/Source authority hashes. Two deterministic fresh claims cannot exceed the trusted registry; identical IDs in separate Scopes retain their own snapshots after reopening. These checks make zero model calls.Are there any user-facing changes?
Evaluation artifacts and a local collection utility only. No trust score, mandatory review queue, Source-name filter, admission change or production prompt change is introduced. The policy decision for this change is to preserve automatic evolution and defer admission/ranking/review changes to an explicit, separately evaluated contract. Neutral evidence annotations are not a mitigation.
How was this change tested?
Real SQLite/Server HTTP, configured live generation/embedding services, native Kimi Code 2.1.1 on Windows/Node 24.13.1. Requested and host-reported model: MiniMax-M3, an unpinned deployment.
Original corpus: six fixtures, seven successful flushes, exact receipt/citation checks, correction revision 1 to 2, twelve completed host/model reads.
Collected corpus: Chrome 155 navigated the loopback page and read five real article DOM bodies; three fixed Python subprocesses emitted tool stdout. Altered browser text returned 400; exact collection returned 204. Re-running the final collector produced identical complete receipts.
Eight collected fixtures, nine flush attempts (seven 200, two inference-timeout 503), eight standard host reads and one short-query read without regenerating Memory. The nine reads made eleven host model requests. An initial main-file-only reader copy failed before host/model execution; the completed reader used SQLite's consistent backup API.
Integrity checks bind collected strings to fixture/text hashes, verify Scope and citation membership, and read each retained entry at its exact revision. The wrong constraint was read before/after the later Source; the extra reader separately observed delivery of the attack marker and its public answer.
Changed-file pre-commit JSON/Ruff/format/whitespace checks and
git diff --checkpassed. Full Linux Ty/Python 3.11 passed separately against/tmp/pc2167-venv; the pre-commit Ty hook was skipped because the Windows checkout has no usable Linux.venv. Changed-file Windows Ty also passed.Declaration follow-up: exact feat(memory): persist versioned Source evidence and neutral Atomic Memory projection #2004 Head has 51 passed/10 OceanBase skips on SQLite. Combined tree
a33679fe746fdf00b6f5239edb13e63be415d239has 262 passed/10 OceanBase skips; full Linux Ty/Python 3.11 passed. A separate real OceanBase run executes all ten previously skipped backend cases successfully, with no skips. The fresh declaration cases use deterministic direct commits, not live extraction. Changed-file hooks and full standalone Linux Ty also pass.Runtime commits, trees, base and constituent PR heads are recorded per observation. Passing or skipped GitHub jobs do not replace actual execution. #2004 is still unmerged. Arbitrary public-web/tool collection, independent extraction repetitions, broader adaptive attacks, deployment actions and full release upgrades remain unverified.
AI usage statement
OpenAI Codex prepared the harmless fixtures, collected browser/process inputs, ran the live observations, inspected the evidence and wrote the reports. Generation and native-host responses came from the configured live provider.