Summary
With an absolute SessionStatePath and a custom SessionFsProvider, the native edit tool reports success for the canonical plan.md path but writes an operating-system file instead of updating the provider. SDK Plan readback remains stale.
Versions
- GitHub.Copilot.SDK:
1.0.17-preview.7
- Bundled Copilot CLI:
1.0.93-1
- OS: Windows
- Target framework:
net10.0
Minimal standalone reproduction
Run:
The repro:
- Configures an absolute
SessionStatePath with a custom provider.
- Writes
# Host plan through Plan.UpdateAsync.
- Calls the native
edit tool on the exact path returned by Plan.ReadAsync.
- Reads the Plan again through the SDK and checks both the provider write count and operating-system path.
Expected
The native edit goes through the configured provider:
- SDK readback returns
# Native update.
- The provider records a second Plan write.
- No operating-system file is created at the virtual session-state path.
Actual
The native tool reports success, but state splits:
| Observation |
Value |
| SDK content before edit |
# Host plan |
| SDK content after edit |
# Host plan |
| Provider Plan writes before edit |
1 |
| Provider Plan writes after edit |
1 |
| Operating-system file created |
Yes |
| Operating-system file content |
# Native update |
A scripted real agent turn reproduces the same behavior. Native create reaches the provider, while the subsequent native edit claims success, bypasses SessionFs, and leaves SDK/provider state unchanged.
This is related to, but distinct from, #2698. The failure is not only permission evaluation: the successful write itself bypasses the registered provider.
Summary
With an absolute
SessionStatePathand a customSessionFsProvider, the nativeedittool reports success for the canonicalplan.mdpath but writes an operating-system file instead of updating the provider. SDK Plan readback remains stale.Versions
1.0.17-preview.71.0.93-1net10.0Minimal standalone reproduction
Run:
The repro:
SessionStatePathwith a custom provider.# Host planthroughPlan.UpdateAsync.edittool on the exact path returned byPlan.ReadAsync.Expected
The native edit goes through the configured provider:
# Native update.Actual
The native tool reports
success, but state splits:# Host plan# Host plan# Native updateA scripted real agent turn reproduces the same behavior. Native
createreaches the provider, while the subsequent nativeeditclaims success, bypasses SessionFs, and leaves SDK/provider state unchanged.This is related to, but distinct from, #2698. The failure is not only permission evaluation: the successful write itself bypasses the registered provider.