feat(cla): gate web/ PRs on a signed Contributor License Agreement#1387
Merged
Conversation
Set up the dual-licensing infrastructure for the web panel so the maintainer can offer it under both CC BY-SA (community / hobby use) and a separate commercial license (production / hosting providers) without having to contact every contributor individually for every future relicensing decision. New files: - CLA.md — 10-section agreement, web/-scoped, contributor keeps copyright (§2), maintainer gets a perpetual, irrevocable, worldwide, royalty-free, sublicensable licence with the explicit right to relicense under any terms including proprietary / commercial (§3(b)). Same legal shape as GitLab / Discourse / Plex. - .github/workflows/cla.yml — contributor-assistant/github-action @v2.6.1 gated on pull_request_target paths web/** + issue_comment (for the sign flow). Allowlist: rumblefrog + *[bot]. Signatures land on an orphan branch cla-signatures created on first run. - CONTRIBUTING.md — pointers to AGENTS.md / ARCHITECTURE.md plus the rationale and how-to-sign for the CLA. Also fixes the dangling reference from .github/PULL_REQUEST_TEMPLATE.md. Updates: - README.md — Contributing section links CONTRIBUTING.md + mentions the CLA. The new Sponsors block and the License section's commercial-license callout (in-progress copy from before the CLA work) ship in the same commit since they document the model the CLA enables. - .github/PULL_REQUEST_TEMPLATE.md — CONTRIBUTING checkbox links to the new file; bottom-of-template note about the CLA bot's sign flow. - AGENTS.md — row in "Keep the docs in sync", row in "Where to find what", and a new "Contributor License Agreement gate (web/**)" subsection in Conventions documenting the paths-filter scope, allowlist source-of-truth, signatures branch, and the load-bearing rule that the sign phrase stays byte-identical across CLA.md §10, the workflow's job-level if:, and custom-pr-sign-comment. Scope is web/** only — plugins under game/addons/sourcemod/** stay GPLv3 (strong copyleft already blocks quiet relicensing). Mixed PRs trigger the gate via the web/** half; one signature unblocks both. Known follow-up: historical contributors haven't signed. Their pre-CLA web-panel contributions aren't covered by the new grant. Retroactive sign-off is opt-in follow-up, not blocked by the workflow being in place.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Set up dual-licensing infrastructure for the web panel so the maintainer
can keep offering it under CC BY-SA (community / hobby use) while also
offering a separate commercial license (production / hosting providers)
without having to track down every contributor for every future
relicensing decision.
The CLA is the standard mechanism for this — same legal shape GitLab,
Discourse, and Plex use. Contributors keep copyright in their work
(§2); the maintainer gets a perpetual, irrevocable, worldwide,
royalty-free, sublicensable licence with the explicit right to
relicense under any terms, including proprietary or commercial (§3(b)).
Scope
web/**only. Plugin contributions undergame/addons/sourcemod/**stay pure GPLv3 — strong copyleft already blocks quiet relicensing,
so layering a CLA on top would only add friction without unlocking
anything.
rumblefrog) plusall GitHub App bots (
*[bot], which covers Dependabot today and anyfuture GitHub App).
signature unblocks both.
What's in this PR
CLA.md(new) — 10-section agreement, ~1 page. The load-bearingclauses are §3 (licence grant with sublicense + relicense rights),
§4 (Apache-2.0-shape patent grant with the standard litigation
termination), §8 (scope-limited to
web/**)..github/workflows/cla.yml(new) — usescontributor-assistant/github-action@v2.6.1.Triggers on
pull_request_targetwithpaths: ['web/**', 'CLA.md', '.github/workflows/cla.yml']plus
issue_commentfor the sign flow. Job-levelif:filter sounrelated comments don't burn action minutes. Signatures land on an
auto-created orphan branch
cla-signaturesundersignatures/cla.json.CONTRIBUTING.md(new) — pointers toAGENTS.md/ARCHITECTURE.mdplus the rationale and how-to-sign for contributors. Also fixes the
long-dangling reference from
.github/PULL_REQUEST_TEMPLATE.mdline 29 (which already mentioned "the CONTRIBUTING document"
even though it didn't exist).
README.md— Contributing section links the newCONTRIBUTING.mdand notes the CLA. Also bundles in-progress edits from before
this work (Sponsors section + License commercial-license callout)
since they document the model the CLA actually enables — splitting
them would create dangling references from the new
CONTRIBUTING.md..github/PULL_REQUEST_TEMPLATE.md— CONTRIBUTING checkbox nowlinks to the new file; bottom-of-template note about the CLA bot's
sign flow. No new checkbox (bot enforces via status check, a
self-checked box would be redundant + falsifiable).
AGENTS.md— three additions: new row in "Keep the docs in sync"table, new row in "Where to find what" table, and a new Conventions
subsection "Contributor License Agreement gate (
web/**)" with theload-bearing rule that the sign phrase is byte-identical in three
places (CLA.md §10 / workflow
if:/custom-pr-sign-comment).What happens on merge
web/**from a non-allowlistedcontributor:
cla-signaturesorphan branch with anempty
signatures/cla.json.license/clastatus check (red until signed).and flips status check to green within seconds.
Known follow-ups (deliberately out of scope)
contributions aren't covered by the new grant, so strictly speaking
the relicense applies "from this point forward". GitLab / Discourse
/ Plex either (a) get retroactive sign-off from material historical
contributors, or (b) note the relicense applies from version X.Y
onward. Separate piece of work, not blocked by this PR.
contributes. Adding a second document is easy then.
Test plan
branch since I'm in the allowlist; other gates should be
unaffected — the workflow is path-filtered to
web/**and thisPR touches it via paired docs only).
web/**, verify the bot comments with sign instructions, sign,verify status check flips green. Close the draft PR.
cla-signaturesorphan branch was auto-created with thetest signature.
game/addons/sourcemod/**change)does not trigger the CLA workflow.