How to use GitHub Copilot to fix JSON thread safety
A .NET maintainer used Copilot to investigate JsonObject.GetPath failures, add atomic dictionary publication and regression coverage, then review the fix.
Original prompt
Shared by the source author. See source notes for context.
Please validate or dispute my hypothesis in the issue, then come up with a fix.
Reach people exploring AI agents
See placements →What happened
A .NET maintainer used Copilot to investigate JsonObject.GetPath failures, add atomic dictionary publication and regression coverage, then review the fix; the pull request merged into dotnet/runtime main.
Reported by Copilot (on behalf of stephentoub) on GitHubHow the agent did it
- Validated concurrent dictionary-publication hypothesis.
- Used Interlocked.CompareExchange and added parallel regression test.
- Removed redundant memory barrier after review.
Where a person stepped in
stephentoub and eiriktsarpalis reviewed/approved; author supplied hypothesis.
A .NET maintainer delegated a JsonObject thread-safety report to GitHub Copilot. Concurrent GetPath calls on a child node could throw because lazy initialization might publish separate dictionaries containing different node objects. Stephen Toub supplied that hypothesis and asked the agent to validate or dispute it before proposing a fix.
Copilot investigated dictionary initialization and reference-based lookup, then used Interlocked.CompareExchange to publish a single dictionary instance. A thread that lost the publication race would use the shared instance rather than its own local copy. The agent also added a regression test exercising concurrent GetPath calls.
Review continued after the initial implementation. The work log records removal of an unnecessary Interlocked.MemoryBarrier because CompareExchange already provides the required barrier. Toub and another maintainer reviewed and approved the changes, and the pull request merged on October 13, 2025.
The PR reports passing library tests, but its visible merge summary does not show every repository check passing. The specific result is a reviewed, merged race fix with targeted coverage, rather than proof of all concurrency behavior.
Prompt
Original prompt
Source: GitHub · Copilot (on behalf of stephentoub)
Frequently asked questions
What triggered the failure?
Parallel GetPath calls could encounter different JsonNode objects from competing lazy-initialized dictionaries, breaking reference-based lookup.
What did Copilot change?
It used Interlocked.CompareExchange to publish one dictionary instance and added concurrent GetPath regression coverage.
What happened during human review?
The agent removed a redundant memory barrier; Stephen Toub and another maintainer approved the changes before the PR merged.
More details
About this account
GitHub Copilot investigated or implemented the scoped repository task and produced a pull request, with work and checks recorded for maintainer review.
Primary pull request and public API timeline opened and checked on 2026-10-14. PR creation date is the original publication date; merge dates are separate result evidence. Agent reported tests; page shows 84 of 86 checks passed, so do not claim every check passed. Outcomes and test claims are attributed to the source and were not independently reproduced. Original prompt excerpt: reproduced verbatim from the public PR prompt; the full task contains additional context.
Credit: Copilot (on behalf of stephentoub) on GitHub
Source published 11 Oct 2025
Source checked 14 Oct 2026
Tools and topics
GitHub Copilot · System.Text.Json · Interlocked · GitHub
Thread safety · Regression tests · System.Text.Json
Editorial completeness: 100/100. Measures documented fields, not agent performance or verified outcomes.