Skip to content

fix(core): simplify plan mode write policy to support relative paths#28398

Merged
DavidAPierce merged 3 commits into
mainfrom
fix/plan-mode-path-regex
Jul 13, 2026
Merged

fix(core): simplify plan mode write policy to support relative paths#28398
DavidAPierce merged 3 commits into
mainfrom
fix/plan-mode-path-regex

Conversation

@DavidAPierce

Copy link
Copy Markdown
Contributor

Summary

This PR simplifies the Plan Mode file-writing policy rule in plan.toml to match any .md file path. This resolves nightly build failures in plan-mode.test.ts where the LLM generated a relative path or paths with unexpected characters that failed to match the overly restrictive subdirectory regex.

Details

  • Problem: The previous policy regex required an absolute path structure with specific nested temporary subdirectories (e.g., .../.gemini/tmp/<session-id>/plans/...). When the live LLM generated a relative path (e.g. plan.md) or when temporary paths used in the environment contained different characters, the policy engine blocked the tool call, causing the integration tests to fail.
  • Solution: We simplified the argsPattern for the allow rule of write_file/replace in plan.toml to match any .md file path: \0"file_path":"[^\"]+\.md"\0.
  • Security & Safety: In Plan Mode, the WriteFile and Edit tools themselves strictly validate and restrict any write operation to the designated plans directory (resolveAndValidatePlanPath throws an error for any path outside the boundary). Therefore, delegating the subdirectory boundary check to the tool itself and having the policy engine strictly verify the .md file extension is completely secure, robust, and highly reliable.

Related Issues

Fixes the plan-mode.test.ts > Plan Mode > should allow write_file to the plans directory in plan mode nightly build failure.

How to Validate

  1. Run the Plan Mode integration tests:
    npm run test:integration:sandbox:none -- -t "Plan Mode"
  2. Verify all 5 tests under "Plan Mode" pass successfully.

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
      • npx
      • Docker
      • Podman
      • Seatbelt
    • Windows
      • npm run
      • npx
      • Docker
    • Linux
      • npm run
      • npx
      • Docker

@DavidAPierce DavidAPierce requested a review from a team as a code owner July 13, 2026 19:14
@github-actions github-actions Bot added the size/s A small PR label Jul 13, 2026
@github-actions

github-actions Bot commented Jul 13, 2026

Copy link
Copy Markdown

📊 PR Size: size/M

  • Lines changed: 79
  • Additions: +73
  • Deletions: -6
  • Files changed: 1

@gemini-code-assist

Copy link
Copy Markdown
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 updates the Plan Mode file-writing policy to resolve nightly build failures caused by strict path matching. By simplifying the regex pattern to focus on the file extension rather than specific directory structures, the system becomes more resilient to relative paths and varied environment configurations while maintaining security through existing tool-level validation.

Highlights

  • Policy Simplification: Simplified the argsPattern in plan.toml to match any .md file path, replacing overly restrictive regex rules that were causing integration test failures.
  • Improved Robustness: Delegated path validation to the WriteFile and Edit tools, which already enforce strict boundaries, ensuring the policy engine remains secure while handling varied file path formats.
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 the 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 counterproductive. 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.

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request simplifies the file path matching pattern for the write_file and replace tools in plan.toml to allow any .md file. The reviewer identified a high-severity security risk, noting that this change removes a critical defense-in-depth boundary and could allow path traversal or arbitrary markdown file overwrites. A consolidated regex pattern was suggested to safely restrict paths while maintaining policy enforcement.

Note: Security Review has been skipped due to the limited scope of the PR.

Comment thread packages/core/src/policy/policies/plan.toml Outdated
@github-actions

github-actions Bot commented Jul 13, 2026

Copy link
Copy Markdown

Size Change: -4 B (0%)

Total Size: 35.2 MB

Filename Size Change
./bundle/chunk-2RVXQIYY.js 0 B -49.2 kB (removed) 🏆
./bundle/chunk-5GIPUMH2.js 0 B -16.2 MB (removed) 🏆
./bundle/chunk-HCLJDFKZ.js 0 B -13 kB (removed) 🏆
./bundle/chunk-KDID4O62.js 0 B -3.77 kB (removed) 🏆
./bundle/chunk-KJ5LFK2I.js 0 B -19.5 kB (removed) 🏆
./bundle/chunk-M4LV25LE.js 0 B -3.43 kB (removed) 🏆
./bundle/chunk-T422D3GE.js 0 B -3.65 MB (removed) 🏆
./bundle/chunk-VJRESFJY.js 0 B -661 kB (removed) 🏆
./bundle/core-NX5LIUGC.js 0 B -50 kB (removed) 🏆
./bundle/devtoolsService-SCXSDZZ5.js 0 B -147 kB (removed) 🏆
./bundle/gemini-HH7SLML6.js 0 B -1.04 MB (removed) 🏆
./bundle/interactiveCli-26IL5SUB.js 0 B -1.3 MB (removed) 🏆
./bundle/liteRtServerManager-4YIHC2JL.js 0 B -2.08 kB (removed) 🏆
./bundle/oauth2-provider-DQXYYYRP.js 0 B -9.12 kB (removed) 🏆
./bundle/chunk-AVU6YTS6.js 16.2 MB +16.2 MB (new file) 🆕
./bundle/chunk-I5B23XVY.js 13 kB +13 kB (new file) 🆕
./bundle/chunk-JFGY67A6.js 3.43 kB +3.43 kB (new file) 🆕
./bundle/chunk-JZXUOOI2.js 19.5 kB +19.5 kB (new file) 🆕
./bundle/chunk-OBJEMW2C.js 3.65 MB +3.65 MB (new file) 🆕
./bundle/chunk-OU7F2IDC.js 3.77 kB +3.77 kB (new file) 🆕
./bundle/chunk-RTV6OZFF.js 661 kB +661 kB (new file) 🆕
./bundle/chunk-YNJPRHYF.js 49.2 kB +49.2 kB (new file) 🆕
./bundle/core-LVF7VCJA.js 50 kB +50 kB (new file) 🆕
./bundle/devtoolsService-NLQGGIX2.js 147 kB +147 kB (new file) 🆕
./bundle/gemini-7GJD3XHG.js 1.04 MB +1.04 MB (new file) 🆕
./bundle/interactiveCli-CZRXQEO2.js 1.3 MB +1.3 MB (new file) 🆕
./bundle/liteRtServerManager-COE7HJ6P.js 2.08 kB +2.08 kB (new file) 🆕
./bundle/oauth2-provider-ZB3JNV7D.js 9.12 kB +9.12 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
./bundle/bundled/third_party/index.js 8 MB 0 B
./bundle/chunk-34MYV7JD.js 2.45 kB 0 B
./bundle/chunk-5AUYMPVF.js 858 B 0 B
./bundle/chunk-5PS3AYFU.js 1.18 kB 0 B
./bundle/chunk-664ZODQF.js 124 kB 0 B
./bundle/chunk-DAHVX5MI.js 206 kB 0 B
./bundle/chunk-IUUIT4SU.js 56.5 kB 0 B
./bundle/chunk-TUDYL3X4.js 40.3 kB 0 B
./bundle/cleanup-GIXC3UVJ.js 0 B -902 B (removed) 🏆
./bundle/devtools-TYCPOPV3.js 683 kB 0 B
./bundle/events-XB7DADIJ.js 418 B 0 B
./bundle/examples/hooks/scripts/on-start.js 188 B 0 B
./bundle/examples/mcp-server/example.js 1.43 kB 0 B
./bundle/gemini.js 5.38 kB 0 B
./bundle/getMachineId-bsd-TXG52NKR.js 1.55 kB 0 B
./bundle/getMachineId-darwin-7OE4DDZ6.js 1.55 kB 0 B
./bundle/getMachineId-linux-SHIFKOOX.js 1.34 kB 0 B
./bundle/getMachineId-unsupported-5U5DOEYY.js 1.06 kB 0 B
./bundle/getMachineId-win-6KLLGOI4.js 1.72 kB 0 B
./bundle/https-proxy-agent-AVGR4LHR.js 490 B 0 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB 0 B
./bundle/sandbox-macos-permissive-open.sb 827 B 0 B
./bundle/sandbox-macos-permissive-proxied.sb 1.25 kB 0 B
./bundle/sandbox-macos-restrictive-open.sb 3.3 kB 0 B
./bundle/sandbox-macos-restrictive-proxied.sb 3.5 kB 0 B
./bundle/sandbox-macos-strict-open.sb 4.75 kB 0 B
./bundle/sandbox-macos-strict-proxied.sb 4.96 kB 0 B
./bundle/src-QVCVGIUX.js 47 kB 0 B
./bundle/src-XZYPU6PJ.js 352 kB 0 B
./bundle/start-IQRPWZMJ.js 0 B -622 B (removed) 🏆
./bundle/tree-sitter-7U6MW5PS.js 274 kB 0 B
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB 0 B
./bundle/worker/worker-entry.js 363 kB 0 B
./bundle/cleanup-ND3VH5P7.js 902 B +902 B (new file) 🆕
./bundle/start-CSJNJHOA.js 622 B +622 B (new file) 🆕

compressed-size-action

@gemini-cli gemini-cli Bot added the status/need-issue Pull requests that need to have an associated issue. label Jul 13, 2026
@github-actions github-actions Bot added the size/m A medium sized PR label Jul 13, 2026
@DavidAPierce DavidAPierce added this pull request to the merge queue Jul 13, 2026
Merged via the queue into main with commit a345621 Jul 13, 2026
33 checks passed
@DavidAPierce DavidAPierce deleted the fix/plan-mode-path-regex branch July 13, 2026 20:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m A medium sized PR size/s A small PR status/need-issue Pull requests that need to have an associated issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants