Relationships
#2689 Windows compat CI red on main since #2644: extension_reload_test compares a raw path to the catalog's canonical path
Opened by stack72 · 9/29/2026· Shipped 9/29/2026
Description
The Windows Compatibility workflow has failed on every main commit since 64ae614f (fix(serve): stop re-importing every pulled bundle on reload and hot-reload synced extensions, swamp-club#2355, PR #2644). The last green Windows run on main was 9eac3f05 (2026-09-26). Every failing run has the same single failure (e.g. run 36503325714 on 55e2ef29: 14627 passed, 1 failed):
reloadPulledExtensions: catalogues an uncatalogued pulled extension and hot-reloads its next version (src/serve/extension_reload_test.ts, added in #2644) AssertionError: Values are not equal: the changed source is rebundled by the catalog pass. Actual 0, expected 1.
Likely cause (test-only)
- The test counts mocked deno bundle calls whose args include sourcePath, built with join(modelsDir, fileBase + .ts), e.g. D:\a\swamp...\noop.ts on Windows.
- The catalog stores source_path in canonical form. On Windows canonicalizePath (src/infrastructure/persistence/canonicalize_path.ts) lowercases the path and turns backslashes into forward slashes.
- reloadPulledExtensions (src/serve/extension_reload.ts) calls bundleExtension(row.source_path, ...) with that canonical path, and bundleExtension passes it straight through as the entry argument (src/domain/models/bundle.ts).
- So on Windows the rebundle can happen but its args hold d:/a/swamp/.../noop.ts, which never equals the raw join path, and the filter counts 0. On macOS and Linux canonicalizePath is the identity, so the test passes there.
- A sibling test in the same file already canonicalizes (sourcePath = canonicalizePath(join(pulledRoot, ext, file)) around line 674).
Suggested fix
Compare against the canonical form in the assertion: calls.filter((c) => c.args.includes(canonicalizePath(sourcePath))). Then confirm on Windows CI that the second assertion (the registered definition is noop v2) also passes, which shows the rebundle and reload really happen on Windows rather than only the count being fixed.
Not verified on a Windows machine: the cause is from reading the code and the CI logs. If the fixed assertion still reports 0 calls, the catalog pass is not rebundling on Windows at all and this becomes a product bug in the hot-reload path.
Shipped
Click a lifecycle step above to view its details.
Sign in to post a ripple.