Skip to main content
← Back to list
01Issue
BugShippedSwamp CLIPublic
Assigneesskunk-ape

Relationships

#3654 Since #3569: Datastore UAT's extension install row and 17 Windows extension unit tests fail on every release

Opened by skunk-ape · 10/20/2026· Shipped 10/20/2026

Two failures started at the swamp-club#3569 merge (swamp 6dbc53eb, 2026-10-19 21:40 UTC) and have been red on every release since. Neither blocks a release, so stable kept shipping.

1. Datastore UAT: extension install no longer restores a missing bundle (managed config)

tests/cli/datastore/every_mutation_syncs/extension_install_test.ts fails on filesystem, filesystem-v3, s3-v3 and gcs-v3 (row in src/cli/helpers/mutation_sync.ts, extension install):

  • extension pull a registry extension, delete .swamp/bundles (as after a fresh checkout), then extension install --json.
  • Expected installed > 0; got 0: AssertionError: install must restore the extension.

#3569 dropped bundle-cache paths from the lockfile's files, so install's missing-files check no longer sees a missing bundle. Settle which side is wrong first: on a fresh managed-config checkout with no .swamp/bundles, does the extension still load and run (bundle rebuilt on first use)? If yes, the UAT row's expectation is stale and the swamp-uat test changes. If no, this is a product regression and install must restore missing bundles.

Run: https://github.com/swamp-club/swamp-uat/actions/runs/39343459540

2. Windows Compatibility: 17 extension unit tests fail on main

Every Windows Compatibility run on main since 6dbc53eb. Failing:

  • integration/extension_pull_shared_sources_test.ts (archive-root shared sources rebundle)
  • src/libswamp/extensions/install_rollback_test.ts (2 tests)
  • src/libswamp/extensions/pull_test.ts (11 tests: skill dir roots, merges, orphan prune, upgrade parity, shared sources)
  • src/libswamp/extensions/remove_extension_service_test.ts (3 tests)

They look like tests still comparing native-separator paths to the now-canonical / lockfile entries; confirm against the log.

Run: https://github.com/swamp-club/swamp/actions/runs/39329293343

Out of scope: src/domain/models/data_writer_test.ts "a vary suffix outside the verbatim form is hashed…" also fails on Windows (data name contains "), from separate vault work.

Done when

Datastore UAT and Windows Compatibility are green on main, with the fix for (1) in whichever repo the investigation points to (UAT PR first if both change).

02Bog Flow
✓OPEN✓TRIAGED✓IN PROGRESS✓SHIPPED+ 1 MOREASSIGNED+ 5 MOREREVIEW+ 7 MOREPR_MERGED+ 2 MORESESSION_SUMMARIZED

Shipped

10/20/2026, 2:50:17 AM

Click a lifecycle step above to view its details.

03Sludge Pulse
skunk-ape assigned skunk-ape10/20/2026, 1:31:21 AM
Editable. Press Enter to edit.

skunk-ape commented 10/20/2026, 1:42:49 AM

Verdict on part 1: the UAT row is stale; the product is correct

A pulled extension still loads and runs with no .swamp/bundles: the bundle is a local cache, and the loader rebuilds it on first use. What a fresh managed-config checkout lacks is the extension's sources, and extension install restores those.

Evidence (binary built from main at d446291b, which includes the #3569 change; filesystem datastore, datastore config migrate, extension pull @stack72/system-extensions@2026.03.03.1):

  1. Clone A, .swamp/bundles deleted (the row's setup): model create @stack72/disk-usage du1 rebuilt .swamp/bundles/4a5f1f62, and model method run du1 run succeeded. extension install then reports up_to_date (installed 0). That is correct: no source file is missing.
  2. Clone A, .swamp/bundles and _extension_catalog.db deleted:* method run succeeded and the bundle was rebuilt.
  3. Clone B, a fresh repo joined to the same datastore: the lockfile arrives through the datastore (extension list shows the extension, files under .swamp/config/pulled-extensions/...), but the sources do not, and method run fails with Unknown model type. extension install reports installed: 1, and method run then succeeds.

In managed config the lockfile lists only the source files, e.g. .swamp/config/pulled-extensions/@stack72/system-extensions/manifest.yaml and models/*.ts. Before #3569 it also listed the bundle .js files, which is the only reason the row's bundles-only delete used to trigger an install.

Agreed fix for the UAT row (swamp-uat, merges first)

In src/cli/helpers/mutation_sync.ts, row extension install (MANAGED_ONLY): after the pull, read the extension's files from extension list --json and delete them, along with .swamp/bundles, to mirror a fresh checkout. Join each listed path (repo-relative, / separated) to the repo dir with @std/path, so the setup also works on Windows UAT. Keep run (installed > 0) and verifyOnB as they are, and update the row note: a missing bundle is a cache the loader rebuilds; a fresh checkout lacks the pulled sources, which install restores. Seth chose this over moving install to a fresh third clone.

Part 2 (swamp)

Test-only. Expected paths in pull_test, install_rollback_test, remove_extension_service_test and extension_pull_shared_sources_test go through canonicalLockfilePath. The PR waits for the UAT tests. Separator mixing in the reports on Windows is filed as swamp-club#3655.

Sign in to post a ripple.