Skip to main content
← Back to list
01Issue
FeatureShippedSwamp ClubPublic
Assigneesskunk-ape

Relationships

#3326 Registry: validate, record and score the declared license (optional; remove the swamp-club license setting)

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

Part 4 of 6 of the extension license requirement (#3323–#3328). Plan: Extension license proposal (https://claude.ai/code/artifact/8c256b86-ce33-4898-8b70-223ec3b827f2). Depends on #3324 being released and #3 merged.

Change (swamp-club registry)

  • Confirm: validate license with the same rules as the CLI, and require a LICENSE file in the archive for public versions. Store it on the version. Refuse a new public version without it, with an error that says to add license: and upgrade the CLI if needed. Private versions may omit it.
  • Private to public: the website toggle and POST /api/v1/extensions/<name>/public are refused unless the latest version declares a license.
  • Rubric: has-license comes from the version's declared field. has-license needs both the declared field and a LICENSE file. The registry setting no longer counts.
  • Remove the registry license setting. Remove the license input from the Scorecard owner panel (islands/ScorecardOwnerPanel.tsx), and stop PATCH /api/v1/extensions/<name> from setting license: refuse it, with an error that points to the manifest field. The extension-level license in API responses becomes the latest version's declared license, derived rather than stored, so the CLI's info keeps working. Clear the stored settings in a migration. Only 2 extensions use the setting today.
  • Display: the extension page, /api/v1/extensions/<name> and the version history show the declared license per version.
  • A UAT item covers: confirm refusal, the public toggle refusal and the scorecard.

Decided (Seth, 2026-10-13)

Older CLIs are refused at publish once this ships. The refusal tells them to upgrade first (see below).

Refusal for older clients (Seth, 2026-10-13)

Clients that predate #3324 never send license (they drop unknown manifest keys), so they only ever see the registry's refusal. A new CLI refuses locally first.

  • Where: refuse at the start of the push request, before the archive uploads, not at confirm. No upload, and no half-published version left behind.

  • Status: 422, with the whole message in error. Released CLIs print error (plus reason) exactly as written for 403, 409 and 422. Any other status gets wrapped as Extension API error (HTTP n): … [url].

  • Message. Upgrading comes first, because adding license: alone won't help an old CLI:

    This version can't be published: public extensions must declare a license. Upgrade swamp (swamp update; version <first release with #3324> or later is required), then add license: <SPDX id> to your manifest and include a LICENSE file with the license text. Private extensions don't need a license. See <manual page from #3328>

    Fill in the version once #3324 releases, and the address once #3328 writes the page.

Acceptance (added)

  • A public push without license is refused with 422 at push start, with the message above. Nothing is uploaded and no version record is created.
  • UAT: a released swamp from before #3324 pushing a public extension prints exactly that message. Use the pinned old release the license UAT already uses.

Re-scoped 2026-10-13 (Seth and the team): the license is OPTIONAL

This section overrides anything above that conflicts with it.

  • Drop every refusal: no 422 at push, no gate on the private-to-public switch, no refusal at publish or promote. The old-client refusal text above is withdrawn.
  • Keep: validate the declared expression (invalid warns, earns no points; only SPDX ids count), store it per version, show it on the extension page and in the API, derive the extension-level license from the latest version.
  • Remove the swamp-club license setting (the Scorecard owner panel box and PATCH license), as before.
  • Scorecard: two items, one point each: (1) a valid SPDX license declared in the manifest; (2) a LICENSE file in the archive. Same as the CLI (#3324).
  • Hiding is gone (#3397), so there are no hiding-rule changes here.
  • UAT: change the refusal scenarios to 'publishes, scorecard shows the factor missing'.
02Bog Flow
✓OPEN✓TRIAGED✓IN PROGRESS✓SHIPPED+ 1 MOREASSIGNED+ 5 MOREREVIEW+ 5 MOREPR_MERGED+ 2 MORESESSION_SUMMARIZED

Shipped

10/14/2026, 12:39:28 AM

Click a lifecycle step above to view its details.

03Sludge Pulse
skunk-ape assigned skunk-ape10/13/2026, 4:39:58 PM
Editable. Press Enter to edit.

system commented 10/12/2026, 10:11:16 PM

Classified automatically when this issue was filed.

  • Source: Swamp Club

If you feel this classification is incorrect, add a ripple to tell us so.

skunk-ape commented 10/13/2026, 12:48:24 PM

Contract the swamp CLI (#3324) relies on, so please include it when building this:

  1. Every entry in the versions list (GET /api/v1/extensions//versions) carries license: the SPDX expression that version declared, or null when it declared none.
  2. The latest-version detail (GET /api/v1/extensions//latest, inside latestVersionDetail) carries the same license field. extension info shows it, falling back to the extension-level license setting when the version reports null.
  3. The promote endpoint refuses to promote a public extension's version that declares no license, as confirm refuses to publish one. The CLI checks this itself from item 1, but older CLIs don't, so the registry has to enforce it.

The CLI treats a missing license key (as opposed to null) as 'this registry does not report licenses' and skips its own promote check, so the field is safe to add at any time.

skunk-ape commented 10/13/2026, 8:51:27 PM

Update to my earlier comment, after the 2026-10-13 re-scope (license optional): drop item 3. The CLI no longer refuses to promote an unlicensed version, so the registry's promote endpoint needs no license check. The CLI also no longer reads license from the versions list, so item 1 is not needed for #3324. Item 2 stands: extension info shows latestVersionDetail.license from GET /api/v1/extensions//latest (string or null), falling back to the extension-level setting. The CLI rubric rows match yours: has-license 'License declared' for a valid SPDX license:, license-file 'LICENSE file included', RUBRIC_VERSION 3.

Sign in to post a ripple.