Skip to content

test(evals): add behavioral evals for memory manager subagent#23149

Open
SandyTao520 wants to merge 1 commit intomainfrom
st/evals/memory-manager-agent
Open

test(evals): add behavioral evals for memory manager subagent#23149
SandyTao520 wants to merge 1 commit intomainfrom
st/evals/memory-manager-agent

Conversation

@SandyTao520
Copy link
Contributor

Summary

Add behavioral evals for the experimental memory manager subagent introduced in #22726. These validate that the save_memory subagent correctly handles memory operations when experimental.memoryManager is enabled.

Details

6 new USUALLY_PASSES evals covering the subagent's key behaviors:

Test Behavior
Saves global preference Subagent writes to ~/.gemini/GEMINI.md with file content verification
Saves personal fact Subagent invoked for "my dog's name is Buddy"
Ignores transient conversation Subagent NOT called for "I'm going to grab lunch"
Proactive workflow save Subagent called for implicit workflow ("always run tests before committing")
Saves command alias Subagent called for "when I say 'deploy', run..."
Ignores transient file paths Subagent NOT called for workspace-specific file location info

All tests use experimental: { memoryManager: true } in settings to exercise the subagent path. Existing save_memory.eval.ts tests are untouched and continue to test the default (memoryManager: false) path.

Related Issues

Related to #18007

How to Validate

  1. Build and bundle:
    npm run build && npm run bundle
  2. Run the new evals:
    RUN_EVALS=1 npx vitest run evals/memory_manager.eval.ts --config evals/vitest.config.ts --reporter=verbose
  3. Verify existing memory evals still pass:
    npx vitest run evals/save_memory.eval.ts --config evals/vitest.config.ts --reporter=verbose

Pre-Merge Checklist

  • Updated relevant documentation and README (if needed)
  • Added/updated tests (if needed)
  • Noted breaking changes (if any)
  • Validated on required platforms/methods:
    • MacOS
      • npm run

@SandyTao520 SandyTao520 requested a review from a team as a code owner March 19, 2026 20:08
@gemini-cli
Copy link
Contributor

gemini-cli bot commented Mar 19, 2026

Hi @SandyTao520, thank you so much for your contribution to Gemini CLI! We really appreciate the time and effort you've put into this.

We're making some updates to our contribution process to improve how we track and review changes. Please take a moment to review our recent discussion post: Improving Our Contribution Process & Introducing New Guidelines.

Key Update: Starting January 26, 2026, the Gemini CLI project will require all pull requests to be associated with an existing issue. Any pull requests not linked to an issue by that date will be automatically closed.

Thank you for your understanding and for being a part of our community!

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a comprehensive set of behavioral evaluations for the experimental memory manager subagent. The primary goal is to ensure that this subagent, which enhances how the system handles memory operations, functions as expected under various scenarios. This includes correctly saving user preferences and command aliases, while also appropriately disregarding temporary or workspace-specific information, thereby improving the reliability and intelligence of the memory management system.

Highlights

  • New Behavioral Evaluations: Introduced a suite of 6 new behavioral evaluations for the experimental memory manager subagent, ensuring its robust functionality.
  • Memory Manager Validation: These evaluations specifically validate that the save_memory subagent correctly handles diverse memory operations when the experimental.memoryManager setting is enabled.
  • Comprehensive Test Coverage: The new tests cover key behaviors such as saving global preferences, personal facts, proactive workflow saves, command aliases, and correctly ignoring transient conversation and workspace-specific file paths.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

The pull request introduces new behavioral evaluations for the experimental memory manager subagent. These tests validate the save_memory subagent's functionality when experimental.memoryManager is enabled, covering various scenarios like saving preferences, personal facts, command aliases, and correctly ignoring transient information or workspace-specific file paths. The new tests are a valuable addition to ensure the subagent behaves as expected.

Comment on lines +55 to +61

if (fileExists) {
const content = fs.readFileSync(globalGeminiMd, 'utf-8');
expect(content.toLowerCase()).toContain('dark mode');
}
},
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Using fs.existsSync and fs.readFileSync directly in tests that utilize a TestRig can bypass the rig's intended file system management. If the TestRig provides its own methods for file system operations (e.g., rig.fileExists or rig.readFile), it's recommended to use those for consistency, proper test isolation, and reliable cleanup of temporary files. This ensures that tests interact with the controlled test environment rather than the real file system, which can prevent unexpected side effects or flakiness.

      const globalGeminiMd = path.join(rig.homeDir!, '.gemini', 'GEMINI.md');
      const fileExists = await rig.fileExists(globalGeminiMd);
      expect(fileExists, 'Expected global GEMINI.md to be created').toBe(true);

      if (fileExists) {
        const content = await rig.readFile(globalGeminiMd, 'utf-8');
        expect(content.toLowerCase()).toContain('dark mode');
References
  1. Use asynchronous file system operations (e.g., fs.promises.readFile) instead of synchronous ones (e.g., fs.readFileSync) to avoid blocking the event loop.

@github-actions
Copy link

Size Change: -4 B (0%)

Total Size: 26.3 MB

Filename Size Change
./bundle/chunk-7IV4MAZ5.js 0 B -3.63 MB (removed) 🏆
./bundle/chunk-RW2EWNT3.js 0 B -13.5 MB (removed) 🏆
./bundle/core-TBERIG4S.js 0 B -41.6 kB (removed) 🏆
./bundle/devtoolsService-BXL3PPPY.js 0 B -27.7 kB (removed) 🏆
./bundle/interactiveCli-PKHNTHJB.js 0 B -1.61 MB (removed) 🏆
./bundle/oauth2-provider-FHRBHVA3.js 0 B -9.19 kB (removed) 🏆
./bundle/chunk-A5POIH6Y.js 3.63 MB +3.63 MB (new file) 🆕
./bundle/chunk-CKAW2XXT.js 13.5 MB +13.5 MB (new file) 🆕
./bundle/core-2DIYX5XY.js 41.6 kB +41.6 kB (new file) 🆕
./bundle/devtoolsService-LN36T4RR.js 27.7 kB +27.7 kB (new file) 🆕
./bundle/interactiveCli-KSICGUIN.js 1.61 MB +1.61 MB (new file) 🆕
./bundle/oauth2-provider-ADWNHZI4.js 9.19 kB +9.19 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size
./bundle/chunk-34MYV7JD.js 2.45 kB
./bundle/chunk-37ZTTFQF.js 966 kB
./bundle/chunk-5AUYMPVF.js 858 B
./bundle/chunk-664ZODQF.js 124 kB
./bundle/chunk-DAHVX5MI.js 206 kB
./bundle/chunk-IUUIT4SU.js 56.5 kB
./bundle/chunk-RJTRUG2J.js 39.8 kB
./bundle/chunk-TCYGHW2X.js 1.95 MB
./bundle/devtools-36NN55EP.js 696 kB
./bundle/dist-T73EYRDX.js 356 B
./bundle/gemini.js 697 kB
./bundle/getMachineId-bsd-TXG52NKR.js 1.55 kB
./bundle/getMachineId-darwin-7OE4DDZ6.js 1.55 kB
./bundle/getMachineId-linux-SHIFKOOX.js 1.34 kB
./bundle/getMachineId-unsupported-5U5DOEYY.js 1.06 kB
./bundle/getMachineId-win-6KLLGOI4.js 1.72 kB
./bundle/memoryDiscovery-C47CWCMG.js 922 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB
./bundle/node_modules/@google/gemini-cli-devtools/dist/client/main.js 221 kB
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js 227 kB
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js 11.5 kB
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/types.js 132 B
./bundle/sandbox-macos-permissive-open.sb 890 B
./bundle/sandbox-macos-permissive-proxied.sb 1.31 kB
./bundle/sandbox-macos-restrictive-open.sb 3.36 kB
./bundle/sandbox-macos-restrictive-proxied.sb 3.56 kB
./bundle/sandbox-macos-strict-open.sb 4.82 kB
./bundle/sandbox-macos-strict-proxied.sb 5.02 kB
./bundle/src-QVCVGIUX.js 47 kB
./bundle/tree-sitter-7U6MW5PS.js 274 kB
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB
./bundle/undici-4X2YZID5.js 360 B

compressed-size-action

@gemini-cli gemini-cli bot added area/agent Issues related to Core Agent, Tools, Memory, Sub-Agents, Hooks, Agent Quality 🔒 maintainer only ⛔ Do not contribute. Internal roadmap item. labels Mar 19, 2026
* operations — adding, removing, de-duplicating, and organizing — across
* both global (~/.gemini/GEMINI.md) and project-level (./GEMINI.md) files.
*/
describe('memory_manager', () => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given the emphasis on this being quick, should we assert turn count and check only specific tools were used for each of these?

describe('memory_manager', () => {
const MEMORY_MANAGER_SETTINGS = {
experimental: { memoryManager: true },
tools: { core: ['save_memory'] },
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this disabling other tools?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/agent Issues related to Core Agent, Tools, Memory, Sub-Agents, Hooks, Agent Quality 🔒 maintainer only ⛔ Do not contribute. Internal roadmap item.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants