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

Relationships

#1676 swamp access grant create installs an unrelated extension from the registry

Opened by skunk-ape · 8/16/2026· Shipped 8/17/2026

swamp access grant create installs an extension from the registry that the repository never asked for. It is a network fetch plus 30 files written into .swamp/pulled-extensions/, with no prompt and no mention in the command's purpose. I hit it while probing grant conditions, noticed an unexplained @swamp/gcp/migrationcenter in my working tree, and traced it back.

Reproduce

$ swamp extension list
@swamp/software-factory  v2026.06.24.1

$ swamp access grant create --subject user:probe9 --allow run --on model:zzz-nonexistent
  Installed   @swamp/gcp/migrationcenter@2026.08.12.2 (13 models registered)
  Completed   create on grant-f2c1ff23 succeeded in 9ms

$ swamp extension list
@swamp/gcp/migrationcenter  v2026.08.12.2  (pulled 2026-08-16T22:09:29.868Z)
@swamp/software-factory     v2026.06.24.1

It repeats: swamp extension rm @swamp/gcp/migrationcenter --yes, then any swamp access grant create, and the extension is back.

What I ruled out

  • Not other commands. With the extension removed, swamp model list, swamp model type search gcp, swamp model method run <m> validate, swamp access grant list, and swamp access token list all leave it absent. swamp model create @swamp/software-factory <name> also leaves it absent, so this is not ordinary model creation.
  • Not repo config. .swamp.yaml holds only swampVersion, initializedAt, repoId, tools, gitignoreManaged. swamp extension source list reports none.
  • Not a local reference. Nothing in the repository names @swamp/gcp/migrationcenter except upstream_extensions.json, which is the record of the install itself.
  • Not another operator. The repo's command audit log shows one session for the day and no swamp extension pull|install|search at any point.

Expected

swamp access grant create writes a grant. It does not reach the registry, and it does not install extensions. If some code path genuinely needs an extension installed, it should say which one and why, and ask first.

Why it matters

The install path runs unprompted from a command with no stated relationship to extensions, which is a supply-chain surface: a local, unrelated operation fetches and registers third-party model code. It also breaks sandboxed and air-gapped use, where an unexpected egress attempt is a failure rather than a convenience. And it dirties the working tree — upstream_extensions.json is tracked, so the install shows up as an unexplained diff.

Once installed, the extension fails to load, and every later swamp access command prints:

Error   @swamp/gcp/migrationcenter already installed at
        .../pulled-extensions/@swamp/gcp/migrationcenter but failed to load
        Local edits may be preventing it from registering

There are no local edits — the tree came straight from the install. Meanwhile .swamp/_extension_catalog.db records all 13 of its bundle_types with state = Indexed and an empty last_error, so the catalog and the loader disagree about the same extension.

Environment

swamp 20260815.023608.0-sha.a648c130, macOS 25.6.0 (darwin arm64).

02Bog Flow
OPENTRIAGEDIN PROGRESSSHIPPED+ 1 MOREASSIGNED+ 6 MOREREVIEW+ 4 MOREPR_MERGED+ 2 MORESESSION_SUMMARIZED

Shipped

8/17/2026, 12:04:33 AM

Click a lifecycle step above to view its details.

03Sludge Pulse
stack72 assigned stack728/16/2026, 10:28:04 PM
Editable. Press Enter to edit.

stack72 commented 8/17/2026, 12:04:43 AM

Thanks @skunk-ape for reporting this! The fix has been merged and a release is on its way. We appreciate your contribution to swamp.

stack72 commented 8/17/2026, 12:13:05 AM

Great catch @skunk-ape — this was a supply-chain issue hiding in plain sight. Every swamp access grant create was silently fetching and installing an unrelated extension from the registry, with no prompt and no connection to what the command actually does. The root cause was a key mismatch in how we look up built-in model types: the lookup missed the built-in, fell through to a registry search, and installed the first thing that came back. The fix ensures built-in types are always resolved locally — no network call, no surprise installs. Shipped in #2164. Reports like this are really important to us. Keeping the supply chain solid is something we take seriously, and we can only do that when people take the time to dig in and document what they're seeing the way you did here. Thanks for flagging it.

skunk-ape commented 8/17/2026, 2:51:13 PM

Follow-up: the registry install this issue reported is gone, but the underlying path is still there. swamp access grant create continues to create a @swamp/grant model instance (the Completed create on grant-f2c1ff23 succeeded line in the repro above) rather than registering an authorization grant, so the grant never reaches grant list, access check, or the policy snapshot. Filed as #1682 — the sharp end is that a --deny grant created this way reports success and does not apply, which fails open.

Sign in to post a ripple.