Skip to main content
← Back to list
01Issue
BugShippedSwamp CLIPublic
Assigneeszack

Relationships

#3385 bundle freshness ignores local modules outside the kind directory

Opened by skunk-ape · 10/13/2026· Shipped 10/14/2026

Found while working on swamp-club#3376.

Problem

computeSourceFingerprint (src/domain/extensions/bundle_freshness.ts) resolves an entry point's local imports with resolveLocalImports bounded at the kind directory. A model in extensions/models that imports ../lib/x.ts gets a fingerprint that leaves x.ts out, so editing x.ts does not mark the bundle stale and the old bundle keeps running. The same regex resolver also misses side-effect imports.

Expected

Editing any local module in an entry point's graph marks its bundle stale. #3376 moves push to Deno's module graph; freshness should use the same source of truth.

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

Shipped

10/14/2026, 10:33:46 PM

Click a lifecycle step above to view its details.

03Sludge Pulse
zack assigned zack10/14/2026, 9:28:04 PM
Editable. Press Enter to edit.

skunk-ape commented 10/14/2026, 10:29:04 PM

Notes from swamp-club#3384 (shipped in v20261014.200600.0, swamp PR 3120), in case they are still useful here:

  • Pull now installs archive-root shared sources (lib/, _lib/, a bare file, _shared/) at .swamp/pulled-extensions//, so a pulled models/x.ts that imports ../lib/cmp.ts resolves and rebundles. Bundle freshness therefore matters for pulled code as well as local code.
  • computeSourceFingerprint (src/domain/models/bundle_freshness.ts, via local_import_resolver.ts) still treats the kind directory as its boundary, so an edit to an installed or local ../lib file never marks the bundle stale.
  • validateSourceCompleteness in src/libswamp/extensions/pull.ts uses the models dir as its boundary too, so pull never checks that root imports are present. It could reuse the shared-source plan (planArchiveRootSources in src/domain/extensions/archive_root_sources.ts).
  • The reserved top-level names push and pull share are isReservedArchiveRootName in src/domain/extensions/source_archive_plan.ts. Shared sources are every non-reserved name plus _shared/.

Sign in to post a ripple.