Accept the daemon's canonical reply for the shell's own folder open - #633
Merged
Merged
Conversation
The native folder picker returns a backslash path such as C:\a. The production daemon canonicalizes it and answers the openProject request with C:/a, echoing the request ID in uppercase. The shell compared both the path and the request ID byte-for-byte, so it discarded the reply and kept the pending open forever: the project registered in the daemon but never appeared in the shell (beta7 ProductionCoreProjectVisibility). The same uppercase echo meant v2 open rejections were never correlated either. Adopt the daemon's canonical path when the reply is provably for the shell's own in-flight open (case-insensitive request ID on v2, separator/case path equivalence on v1), compare request IDs case-insensitively, assert the daemon contract in the real-daemon round trip, and run that round trip in Windows shell validation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Signed-off-by: Colin Neilens <coneilen@microsoft.com>
coneilen
added a commit
that referenced
this pull request
Oct 5, 2026
Record the immutable, unpublished 0.1.78-windows.beta8 candidate built from 1bd0398 with #633's canonical folder-open reply fix. Beta7 is failed and superseded by the Dev Box ProductionCoreProjectVisibility result and kept unchanged. Exact artifact stays complete; the other six gates and the 98/62/36 parity ledger are unchanged. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Signed-off-by: Colin Neilens <coneilen@microsoft.com>
2 of 5 tasks
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.
Summary
Beta7 failed the attended Dev Box
ProductionCoreProjectVisibilitygate. NativeCtrl+O registered
Coreexactly once in the production daemon (the CLI listsCore C:/GraphCode-Fixtures/Core), but the shell never showed the project row.Root cause: the shell discarded the daemon's own reply to its open request.
C:\GraphCode-Fixtures\Core. Theproduction daemon canonicalizes it to
C:/GraphCode-Fixtures/Coreandanswers the
openProjectrequest with that spelling.onFrameWithEffectschecks the incoming graph path against the pending open byte-for-byte
(
Wire.isCurrentGraphPath). So it dropped the reply and left the backslashpending open in place, and every later graph frame for that project was
dropped too.
UUID.uuidString), while the shell generates lowercase IDs. The App-levelv2 correlation compared them byte-for-byte, so real open rejections were
never correlated either.
DaemonClient.completeRequestalready comparedthem case-insensitively.
Why earlier gates passed: every fixture echoed the shell's own path spelling
and lowercase request ID, and the scrubbed
registered-projectcase registeredthrough the CLI, which restores the daemon's canonical spelling. The real-daemon
round trip, the only test that speaks the production wire format, was not run
by
validate.ps1or CI.Changes
App.adoptCanonicalOpenPath: when agraphChangedreply is provably forthe shell's own in-flight open, it adopts the daemon's canonical path before
the stale-frame filter runs. On v2, "provably" means the case-insensitive
request ID matches. On v1, which has no IDs, it means the paths are equivalent
apart from separator and ASCII case (
Wire.sameLocalProjectPath).Uncorrelated publications are still filtered.
case-insensitively.
DaemonRoundTripTestsasserts the production contract the fix relies on:openProjectpath is answered by agraphChangedresponsewith the same request ID (ignoring case);
validate.ps1now runsDaemonRoundTrip.Live.Tests.ps1against the builtproduction daemon in Windows shell integration, and a
WindowsShell.Tests.ps1contract keeps it there.
Test plan
RED: zig test src\App.zig ... --test-filter "graph publication" with pinned Zig 0.15.2 -> 8 passed, 2 failed; canonical-path reply dropped (current graph stayed B), uppercase rejection left pending open set (expected 0, found 1)
GREEN: zig test src\App.zig ... --test-filter "graph publication" with pinned Zig 0.15.2 -> All 10 tests passed
REGRESSION: zig test src\App.zig full suite -> All 744 tests passed; zig test src\Wire.zig -> All 153 tests passed; DaemonRoundTrip.Live.Tests.ps1 with the beta7 graphcoded.exe -> REAL_DAEMON_ROUNDTRIP: PASS
Additional evidence:
against the real beta7 daemon. It expected
00000000-0000-4000-8000-c5cc31d533d1and found00000000-0000-4000-8000-C5CC31D533D1; that is how the case defect wasfound. After the fix it printed
DAEMON_OPEN_CANONICALin all three phases.-Dworktrees-deferred=true, run against the beta7 daemon and CLI, gaveSCRUBBED_SHELL_STARTUP: PASS; executed=5.validate.ps1 -Task windows-shell -SkipTrayLive -ShellValidationRoot C:\v7-> unit 53/53 sections, App 744/744, scrubbed startup 5/5, and the new Real daemon wire round trip PASS. The run then failed in the local UIA gate: the attribution added in Make UIA gate popup activation deterministic and attribute wait timeouts #631 shows WinDirStat, an unrelated operator app, holding foreground at "project-row New Loop". This is recorded as a local desktop failure, not a pass.
37389038155passed Windows shell integration, including the new round-trip step (3DAEMON_OPEN_CANONICALassertions andREAL_DAEMON_ROUNDTRIP: PASS), scrubbed startup 5/5 and the live UIA gate, along with unit shards and packaging.Limits and honesty:
deterministically on this shared desktop. A UIA-pattern probe closed the
dialog without returning a folder in all four attempts. No local live picker
run is claimed. The attended Dev Box rerun on a new candidate is still
required.
that contained no
ListItemat all, not even theDefaultworkspace itemevery shell exposes. It is inconclusive about project rows. Locally, a fresh
beta7 shell restores a daemon-registered
Corerow in about 0.5 s.registered a scratch fixture in the operator's real
~\.graphcode, becausethe Swift daemon ignores a
USERPROFILEoverride. Those two files wereremoved. No such probe is part of this change.
make testandmake checkwere not run. The change is limited tothe Windows Zig shell and Windows validation scripts.
Checklist
git commit -s) per the DCOmake test)make check)