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
licensewith 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 addlicense:and upgrade the CLI if needed. Private versions may omit it. - Private to public: the website toggle and
POST /api/v1/extensions/<name>/publicare 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 stopPATCH /api/v1/extensions/<name>from settinglicense: refuse it, with an error that points to the manifest field. The extension-levellicensein API responses becomes the latest version's declared license, derived rather than stored, so the CLI'sinfokeeps 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 printerror(plusreason) exactly as written for 403, 409 and 422. Any other status gets wrapped asExtension 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 addlicense: <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
licenseis 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
licensefrom 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'.
Shipped
Click a lifecycle step above to view its details.
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:
- 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.
- 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.
- 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.