build: unpin the dependencies and move to a current vcpkg baseline - #22
Merged
Merged
Conversation
ResurrectedTrader
force-pushed
the
deps-baseline
branch
from
September 15, 2026 16:18
6c13921 to
b5239dd
Compare
The root manifest carried an `overrides` block pinning nine packages, the test manifest carried none, and both pinned the same `builtin-baseline`. So the two disagreed about anything the overrides held back: `utils.cpp` is compiled into both the DLL and the test binary, and got spdlog 1.15.3 in one and 1.16.0 in the other. Five of the nine overrides were pinning a package to the version the baseline already offered, doing nothing at all. The overrides go. With one baseline and no overrides, every shared dependency resolves to the same version in both manifests by construction, and there is no second place for a version to drift. Reproducibility is unchanged - the baseline is a pinned vcpkg commit, so a bump is still deliberate, it just happens once. The baseline moves to a current vcpkg. That carries spdlog to 1.17.0, fmt to 12.2.0, sqlite3 to 3.53.4, imgui to 1.92.9, ixwebsocket to 12.0.1, detours to its 2025-06-20 snapshot, doctest to 2.5.3, zlib to 1.3.2 and magic-enum to 0.9.8. `VCPKG_REF` in both workflows moves with it, since it has to match the manifests' baseline for CI's binary cache to be keyed on the right thing. One thing broke: vcpkg's zlib port renamed its static library, so the glue project's explicit `zlib.lib` / `zlibd.lib` are now `zs.lib` / `zsd.lib`. Nothing else needed touching - notably the ImGui 1.92 font/texture rework and the ixwebsocket major bump both compile against our code unchanged. One hack goes the other way. ixwebsocket 12.0.1 carries the fix we sent upstream for `ix::HttpServer` comparing the `Upgrade` header value case-sensitively, which is why the inspector had its own `DualModeServer` reimplementing that dispatch on `ix::WebSocketServer`. The subclass is gone and the inspector uses `ix::HttpServer` directly. The first CI run after this merges rebuilds every package from source and repopulates the binary cache; later runs hit it again. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ResurrectedTrader
force-pushed
the
deps-baseline
branch
from
September 15, 2026 16:19
b5239dd to
60c3aea
Compare
The DevTools window opened on an empty Elements panel. The session was attached and answering the whole time - `Runtime.evaluate` round-tripped, `Debugger.enable` streamed `scriptParsed` for every file - but the frontend was drawing the page inspector for a target that has no DOM, so it looked broken. The Sources panel was there, collapsed behind the overflow chevron. `type` is what decides whether DevTools believes there is a DOM, not the frontend URL, and the two only work together. A `"page"` target lands on Elements, and `v8only=true` does not undo it because `inspector.html` ignores the flag. `js_app.html` is the V8-only frontend and does read it, but only a `"node"` target is routed there - a `"page"` target goes through the browser proxy to Chrome's own frontend whatever URL we advertise. So changing either half alone gets you an empty Elements panel or a window that never attaches, which is how this was landed on twice before. Both halves now match Node's own combination. Rebinding is no longer all-or-nothing. `Start` probes with SO_EXCLUSIVEADDRUSE so a second multi-boxed instance cannot silently split the port, but it gave up on the first refusal - and a restart from the Settings toggle binds again immediately, while the old listener's sockets can outlive stop() by a moment. The probe now retries for two seconds. A port another instance really holds stays busy for the whole window and still fails. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
Two problems, one fix.
The manifests disagreed with each other. The root one pinned nine packages through an
overridesblock;tests/frontends/js/vcpkg.jsonhad no overrides at all. Both pin the samebuiltin-baseline, so anything the overrides held back resolved differently in the two. That matters becausesrc/utils/utils.cppis compiled into both the DLL and the test binary: it was getting spdlog 1.15.3 in one and 1.16.0 in the other. Five of the nine overrides were pinning a package to the version the baseline already offered, so they were doing nothing.The baseline was old. Every dependency was held a version or more behind what vcpkg ships.
The
overridesblock is deleted rather than duplicated into the test manifest. With one baseline and no overrides, every shared dependency resolves identically in both by construction, and there is no second place a version can drift. Reproducibility is unchanged: the baseline is a pinned vcpkg commit, so bumping a version is still deliberate, it just happens in one place.What moves
VCPKG_REFin both workflows moves with the baseline. The two have to agree, or CI keys its binary cache on one vcpkg and resolves versions against another.What broke
One thing. vcpkg's zlib port renamed its static library, so the glue project's explicit
zlib.lib/zlibd.libbecamezs.lib/zsd.lib.Nothing else needed touching, which is the surprising part. I expected trouble from two of these: ImGui 1.92 reworked the font and texture API, and ixwebsocket went up a major version. Both compile against our code unchanged.
What the bump lets us delete
ix::HttpServerused to compare theUpgradeheader value case-sensitively against"websocket". The browser-side proxy thatchrome://inspect's inspect link attaches through sendsUpgrade: WebSocket, so every click-inspect upgrade fell through to the HTTP handler and 404'd.ix::HttpServerisfinal, so the inspector carriedDualModeServer, a reimplementation of that whole dispatch onix::WebSocketServerwith a case-insensitive check.We sent the fix upstream and it is in 12.0.1, citing the same Chrome proxy behaviour. The subclass is gone and
InspectorServerusesix::HttpServerdirectly, which removes about sixty lines and one place where we were shadowing a library's connection handling.Inspector, verified live
The ixwebsocket bump and the
DualModeServerremoval are now exercised against a running game rather than only compiled. A dependency-free CDP client confirmed the discovery endpoints, that bothUpgrade: websocketandUpgrade: WebSocketreturn101(the upstream fix we relied on), a full DevTools-style bootstrap answered 12 of 12 with unimplemented domains erroring rather than hanging, andRuntime.evaluateround-tripping. Seven hostile disconnect patterns - reset mid-session, rapid attach cycles, backpressure, half-close, all targets at once, malformed frames, request flood - left the listener serving.That surfaced two real problems, fixed here.
DevTools opened on an empty Elements panel. The session was attached and answering the whole time; the frontend was drawing the page inspector for a target with no DOM.
typedecides whether DevTools believes there is a DOM, not the frontend URL, and the two only work together: a"page"target lands on Elements and ignoresv8only=true, whilejs_app.htmlreads that flag but only receives"node"targets. Changing either half alone yields an empty panel or a window that never attaches. Both halves now match Node's combination.Rebinding was all-or-nothing.
Startprobes withSO_EXCLUSIVEADDRUSEso a second multi-boxed instance cannot silently split the port, but it gave up on the first refusal, and a restart from the Settings toggle binds again while the old listener's sockets can still outlivestop(). The probe now retries for two seconds; a port another instance really holds still fails.docs/inspector.mdis updated for both.Verification
Built from a clean vcpkg tree at the new baseline, with every package rebuilt from source:
build.ps1 Releasebuild.ps1 Release -Platform x64build.ps1 testbuild.ps1 check-formatbuild.ps1 lintThe first CI run after this merges will miss the binary cache for everything and rebuild from source, then repopulate it. Later runs hit it again.