Give the typedmemeval verb a real stage-1 dry run - #211
Merged
Conversation
The three-stage run protocol is a maintainer directive covering every paid run, and the verb that runs most of them had no stage 1. This adds one: it loads the corpus through TypedMemEvalCorpus.Load using the same option mapping the real run uses -- so it proves the corpus the run will actually read, not a simulation of it -- and reports the vertical, the arm token, the seed, the selected question count and the shape distribution. It also carries the containment precondition: an empty selection ABORTS, because a run that selects nothing measures nothing, and a window holding none of the phenomenon has already cost this project a paid run. The first version of this sat inside RunVerticalAsync, which meant it booted a Neo4j container and read Azure credentials before printing "nothing spent". A dry run that spends anything -- money or two minutes of container start -- is not the thing the directive asked for. It now runs before any client, container or credential read, and completes in under three seconds. Verified on the row 53 configuration: arithmetic, seed 20260821, arm default, 50 questions selected, shapes count 14 / sum 14 / duration 12 / delta 10, no container created. The drift guard now names --dry-run, so an advertised option that stops being carried fails the suite. Release 0-warn; LongMemEval 730/730. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RM9gMsvo3SpYqEBENbaefo
There was a problem hiding this comment.
🟡 Changes recommended
XML documentation comments around the new DryRun block contain duplicate/misattached <summary> tags that should be corrected to avoid misleading docs and potential XML-doc warnings.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds a real “stage 1” dry-run path to the typedmemeval tool so operators can validate corpus loading and question selection (including shape distribution) before any paid calls, Neo4j container startup, or credential reads.
Changes:
- Introduces a
--dry-runoption that exits early after loading the corpus via the same option-mapping path as the real run. - Implements
DryRun(...)output including vertical, arm token, seed, selected question count, and shape distribution; aborts if selection is empty. - Extends the option drift-guard unit test to ensure
--dry-runis carried on the options record.
File summaries
| File | Description |
|---|---|
| tools/AgentMemory.LongMemEval/TypedMemEvalProgram.cs | Adds --dry-run, early-exit stage-1 execution, and the DryRun implementation for corpus/selection verification. |
| tests/AgentMemory.Tests.Unit.LongMemEval/TypedMemEvalCommandLineTests.cs | Updates the “advertised options are carried” drift guard to include --dry-run. |
| tests/AgentMemory.Tests.Unit.LongMemEval/TypedMemEvalArmProvenanceTests.cs | Updates construction of TypedMemEvalRunOptions to include the new DryRun field. |
Review details
Suppressed comments (1)
tools/AgentMemory.LongMemEval/TypedMemEvalProgram.cs:546
- The summary that describes PrintSupersessionStore was moved above DryRun, leaving PrintSupersessionStore undocumented and DryRun partially mis-documented. Reattach the summary to PrintSupersessionStore.
private static void PrintSupersessionStore(LongMemEvalSupersessionStore? store)
{
- Files reviewed: 3/3 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Copilot's review of #211 found consecutive <summary> tags above DryRun. Same cause as the one it found on #210: inserting a method between an existing doc comment and its body leaves the comment attached to the newcomer, so one method carries two summaries and another carries none. Twice in one session is a pattern rather than a slip, so this fixes both sites and then SWEEPS the repository for the shape instead of waiting to be told about the next one. The sweep found a third, pre-existing and unrelated to this branch: LeadingToken's summary had been stranded above LeadingTokenAfterLabel in LongMemEvalPostRunDiagnostics, leaving the parser it describes undocumented. Reattached. Repo-wide sites remaining: none. Release build 0-warn. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RM9gMsvo3SpYqEBENbaefo
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.
The three-stage run protocol covers every paid run, and the verb that runs most of them had no
stage 1.
What it does: loads the corpus through
TypedMemEvalCorpus.Loadwith the same option mapping thereal run uses — so it proves the corpus the run will actually read rather than a simulation — and
reports vertical, arm token, seed, selected question count and shape distribution. An empty selection
aborts: a run that selects nothing measures nothing, and a window holding none of the phenomenon
has already cost a paid run once.
One thing worth noting. The first version sat inside
RunVerticalAsync, so it booted a Neo4jcontainer and read Azure credentials before printing "nothing spent". A dry run that spends
anything — money, or two minutes of container start — isn't what the directive asked for. It now runs
before any client, container or credential read: 2.9s, no container.
Verified on the row 53 configuration — arithmetic, seed 20260821, arm
default, 50 questions, shapescount 14 / sum 14 / duration 12 / delta 10.
The drift guard now names
--dry-run, so an advertised option that stops being carried fails thesuite. Release 0-warn; 730/730.