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

Relationships

#2476 swamp serve does not register webhook schemes from pulled extensions; boot fails with misleading 'already installed but failed to load'

Opened by magistr · 9/24/2026· Shipped 9/24/2026

Summary

swamp serve does not register a webhook extension (Lab #2204 webhook kind) when it comes from a pulled package. It only finds webhook schemes under the repo's local extensions/webhooks/. If a serve.yaml route uses a scheme that only a pulled package provides, serve fails at boot. The error it prints blames the package's model, which is misleading.

Reproduce (clean repo)

swamp repo init
swamp extension trust add magistr
# @magistr/telegram-send 2026.09.24.1 ships a model AND a webhook:
#   manifest: webhooks: [extensions/webhooks/telegram_webhook.ts]
#   webhook export type: "@magistr/telegram-webhook"
swamp extension pull @magistr/telegram-send@2026.09.24.1
cat > .swamp/serve.yaml <<'Y'
webhooks:
  - route: /hooks/telegram
    workflow: telegram-callback
    secret: dummysecret
    scheme: "@magistr/telegram-webhook"
Y
swamp serve --port 9199 --host 127.0.0.1 --auth-mode none

The pull extracts the webhook correctly:

.swamp/pulled-extensions/@magistr/telegram-send/webhooks/extensions/webhooks/telegram_webhook.ts
.swamp/webhook-bundles/ddf3350d/extensions/webhooks/telegram_webhook.js

Actual

Resolving   @magistr/telegram-webhook not found locally, searching registry...
    Error   @magistr/telegram-send already installed at .../.swamp/pulled-extensions/@magistr/telegram-send but failed to load
            Local edits may be preventing it from registering — inspect the source and fix errors.
            To reset: swamp extension pull "@magistr/telegram-send" --force
Error: Webhook /hooks/telegram uses scheme '@magistr/telegram-webhook', but no webhook extension of that type is installed. Install it with 'swamp extension pull @magistr/telegram-webhook'.

serve exits. swamp model type describe @magistr/telegram/send works in the same repo, so the package's model loads fine. The "failed to load / local edits" message is wrong. --force re-pulling does not help.

Copying the same telegram_webhook.ts into the repo's local extensions/webhooks/ makes serve boot and register the route (Webhook registered: "/hooks/telegram" ... (scheme: "@magistr/telegram-webhook")).

Expected

  • Webhook extensions from pulled packages register at serve boot, the same way pulled models do.
  • If a scheme really is missing, the error names the missing webhook scheme. It should not claim the package "failed to load" or suggest a destructive --force re-pull (compare #1638).

Impact

  • A published package cannot ship a serve webhook scheme. Every consumer has to vendor the file into their repo.
  • In our deployment, a binary upgrade triggered the auto-resolver, which pulled a registry package next to the in-repo copies. serve then crash-looped at boot, because any unresolved webhook scheme is fatal. During the crash loop serve also re-pulled the package by itself on each restart.
  • Related: after moving an in-repo model out, .swamp/_extension_catalog.db kept mapping the type to the missing local file (readfile '/workspace/extensions/models/telegram_send.ts') until the catalog was rebuilt.

Versions

Reproduced on 20260917.032111.0 (macOS) and 20260923.231117.0 (Linux container). First seen after an upgrade to 20260924.073627.0.

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

Shipped

9/24/2026, 9:49:08 PM

Click a lifecycle step above to view its details.

03Sludge Pulse
skunk-ape assigned skunk-ape9/24/2026, 6:25:10 PM
Editable. Press Enter to edit.

skunk-ape commented 9/24/2026, 9:49:15 PM

Thanks @magistr for reporting this! We shipped: Stop auto-resolution from blaming local edits when an installed extension simply does not provide the requested type (typically an older version), and stop serve from suggesting a pull of the webhook scheme name. The intact inspection gains installedVersion and loadFailures (path-prefix match on the canonical pulled root); the resolver emits a new installedWithoutType event with a hedged upgrade hint (swamp extension update) when the registry has a newer version, keeping the existing local-edits/--force message only when the extension's sources actually failed to load or failure state is unknown.. The fix has been merged and a release is on its way. We appreciate your contribution to swamp.

Sign in to post a ripple.