Skip to main content
← Back to list
01Issue
BugShippedSwamp CLI
Assigneesstack72

#284 Manifest version bumps silently ignored for existing local extension aggregates

Opened by stack72 · 5/7/2026· Shipped 5/7/2026

Summary

Filed as follow-up from swamp-club#273 adversarial review (second pass, medium finding #2).

When ReconcileFromDiskService.reconcileLocalAndSourceMounted finds an existing aggregate by name match, it uses the existing aggregate as-is (ext = existing), preserving the OLD version. The manifest version (localVersion) is only used when creating a new aggregate from scratch (the fallback path when no existing aggregate is found).

If a user bumps the manifest version (e.g. 2026.04.21.1 to 2026.04.22.1), the reconciler keeps the stale version indefinitely. Subsequent loadAll() reads back the persisted old version, and no future reconcile fixes it because the name match always finds the old aggregate.

Impact

swamp doctor extensions and other version-displaying surfaces show the old version permanently. The only recovery is a full catalog wipe (invalidateAll + restart).

Steps to reproduce

  1. Create a repo with extensions/manifest.yaml declaring name: @scope/foo, version: 2026.04.21.1
  2. Run any swamp command (triggers reconcile, writes version 2026.04.21.1 to catalog)
  3. Bump manifest version to 2026.04.22.1
  4. Run any swamp command again
  5. Observe: catalog still shows version 2026.04.21.1

Suggested fix

When existing is found but existing.version !== localVersion, treat it as an identity migration: tombstone the old-version aggregate and create a new one with localVersion, same as the name-migration path.

02Bog Flow
OPENTRIAGEDIN PROGRESSSHIPPED+ 1 MOREASSIGNED+ 7 MOREREVIEW+ 3 MOREPR_MERGEDSHIPPED

Shipped

5/7/2026, 10:02:33 PM

Click a lifecycle step above to view its details.

03Sludge Pulse
stack72 assigned stack725/7/2026, 8:07:19 PM

Sign in to post a ripple.