Repository navigation
Frozen-corpus registry, drift-refusing reuse, and the AUC on the path runs actually take - #183
Merged
Merged
Conversation
4.2's AUC was wired into the plain `longmemeval` verb only. That verb cold-builds the graph: ~684 extraction calls and 7-9 hours wall clock for 50 questions. Every real measurement therefore goes through --prepared-pair, which builds once and then evaluates arms against a frozen volume in about five minutes. So the instrument reported only on the path nobody runs. That is the same dead-option defect this branch already found twice -- IncludeQuestionTypes with no caller, and a read-only filter that removed nothing -- arriving in my own work. The prepared-pair path already sets EvidenceIndex and GraphProbe, so both halves the AUC needs are collected there: the per-section diagnostics and the answer-presence verdict. Only the reporting line was missing. 4158 unit + 348 LongMemEval green. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01PgDgctPpbTziBNE2RT8VdE
There was a problem hiding this comment.
Pull request overview
This PR ensures the LongMemEval prepared-pair execution path (the one used for real 50-question measurements) also emits the sufficiency AUC metric, aligning instrumentation with actual run workflows.
Changes:
- Adds
sufficiencyAuc = LongMemEvalSufficiencyReport.From(arm.Telemetry)to the prepared-pair arm projection output. - Documents why the metric must be emitted on the prepared-pair path (cold-build path is not used for routine measurement).
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
A cold build is ~684 extraction calls and 7-9 hours for 50 questions, so every real measurement reuses a frozen one. Reuse read the sealed manifest, printed its fingerprint and proceeded. VerifyIntegrity only checks the manifest against ITSELF -- that its recorded fingerprint matches its recorded contents. Nothing compared it to the run adopting it. That allowed the worst kind of wrong number. A corpus on this machine was ingested with AssistantContent=Utterance under AgentEval 0.16; today's default is Ignore. Evaluating it now would produce a report whose fingerprint block describes THIS run while every fact in the graph came from the other configuration -- internally consistent, reproducible, and wrong. Three changes: Manifest schema 5 -> 6. It now records what it was ingested with: assistant content mode, predicate-vocabulary flag, the extraction-vocabulary and query-lexicon hashes, extraction provenance mode, question seed, memory types, preparation date and a description. The first five join the fingerprint, so two materially different corpora stop hashing identically. The description does not: two corpora differing only in a note are the same corpus, and making a note change the identity would force needless rebuilds. Drift comparison on reuse. It refuses unless --allow-stale-prepared, naming every drifted field and the override. What counts as drift is deliberately narrow: only what changed the stored graph. The answer model, judge, recall budget and evidence mode are applied at evaluation time, so a corpus is legitimately reusable across them -- that reusability is the entire point, and flagging them would make every reuse "stale" and train the operator to pass the override. A field an older manifest never recorded reports as drift, not agreement: "we do not know how this was built" must never read as "it matches". A machine-local registry at artifacts/evaluation/prepared-corpora.json, written on retained preparations, listed by --list-prepared-corpora with age and a schema-too-old note. It is a convenience, never the guarantee -- the authority is the manifest sealed inside each corpus, which travels with the data and cannot drift from it. Deleting the registry makes no reuse unsafe. Also: --memory-types now reaches PREPARATION, not only evaluation. An episodic-only sample selects different questions, whose histories have to be ingested for the corpus to answer them, which is precisely why 8.3b needs its own cold build and cannot reuse the stratified one. The drift check asserts that. 4158 unit + 362 LongMemEval green. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01PgDgctPpbTziBNE2RT8VdE
This was referenced Aug 27, 2026
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two independent problems, both about a measurement quietly describing something other than what it measured.
1. Reuse could not refuse
A cold build is ~684 extraction calls and 7–9 hours for 50 questions, so every real measurement reuses a frozen corpus. Reuse read the sealed manifest, printed its fingerprint, and proceeded — and
VerifyIntegrityonly checks the manifest against itself. Nothing compared it to the run adopting it.A corpus on this machine was ingested with
AssistantContent=Utteranceunder AgentEval 0.16. Today's default isIgnore. Evaluating it now produces a report whose fingerprint describes this run while every fact came from the other configuration — internally consistent, reproducible, and wrong.--allow-stale-prepared, naming every drifted field. Drift is deliberately narrow: only what changed the stored graph. Answer model, judge, recall budget and evidence mode are evaluation-time, so a corpus stays legitimately reusable across them — flagging those would make every reuse "stale" and train the operator to pass the override.2. A registry, so this doesn't live in notes
artifacts/evaluation/prepared-corpora.json, written on retained preparations, listed by--list-prepared-corporawith age and a schema-too-old warning. Machine-local, because the corpora are local Docker volumes.It is a convenience, never the guarantee — the authority is the manifest sealed inside each corpus, which travels with the data and cannot drift from it. Deleting the registry makes no reuse unsafe.
3.
--memory-typesnow reaches preparationAn episodic-only sample selects different questions, whose histories must be ingested for the corpus to answer them. That is exactly why 8.3b needs its own cold build and cannot reuse the stratified one — asserted in the drift tests rather than assumed.
4. The AUC on the path runs actually take
4.2's instrument was wired into the plain verb only — the one that cold-builds for 7–9 hours. Every real measurement goes through
--prepared-pair, so the instrument reported only on the path nobody runs. Same dead-option shape this branch already found twice, this time in my own work.Verification: 4,158 unit + 362 LongMemEval green, Release 0 warnings.
🤖 Generated with Claude Code
https://claude.ai/code/session_01PgDgctPpbTziBNE2RT8VdE