Skip to content

ci: license-consistency check + finish AGPLv3 relicense on stale surfaces#152

Merged
SUaDtL merged 2 commits into
mainfrom
feat/license-consistency-check
Jun 27, 2026
Merged

ci: license-consistency check + finish AGPLv3 relicense on stale surfaces#152
SUaDtL merged 2 commits into
mainfrom
feat/license-consistency-check

Conversation

@SUaDtL

@SUaDtL SUaDtL commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator

Adds the license-consistency CI guard you asked for, and fixes the two more stale-relicense surfaces it surfaced. Built test-first through /ca:feature (spec → tdd). Two commits.

fix(license) — finish the AGPLv3 relicense (4326cf0)

The v2.6.0 relicense left two declarations beyond #151's still on MIT:

  • plugins/ca-sandbox/.claude-plugin/plugin.json declared "license": "MIT"AGPL-3.0-only (the repo LICENSE is AGPLv3; ADR-0009 carves out no exception). 0.1.1 is untagged, so no version bump.
  • .codearbiter/coding-standards.md still said "License is MIT; copyright holder 'codeArbiter contributors'" → corrected to AGPL-3.0-only / SUaDtL.

ci — license-consistency check (762376c)

.github/scripts/check_license_consistency.py asserts every project license-declaration surface agrees with the canonical SPDX (ca's plugin.json):

  • both plugin manifests' license fields,
  • the LICENSE-file family header,
  • the README license badge,
  • the README notice names the canonical license,
  • plus a fixed forbidden-phrase guard for retired commercial-offering prose (available separately, offers the same code).

Robust by design: reads only the enumerated surfaces (never a repo-wide grep), so package-lock and historical CHANGELOG/ADR "MIT" mentions can't false-positive; pure stdlib helpers that degrade to a finding rather than raise; license-agnostic via a LICENSE_FAMILIES map (a future relicense adds an entry, not a rewrite). Wired as a repo-wide, always-on ci.yml job in the required-checks aggregation.

Verification

  • 23 new unit tests (test_license_consistency.py) cover AC-1..10 of the approved spec (.codearbiter/specs/license-consistency-check.md); full .github/scripts/test_*.py suite green; py_compile clean; ci.yml valid YAML.
  • security-reviewer: PASS on the CI change — no untrusted-input/secret/privilege concerns (2 LOW items are pre-existing repo-wide conventions: floating python-version and tag-pinned actions).
  • The live repo passes the check (exit 0) after the ca-sandbox fix.

Deliberately out of scope

  • The check covers public/shipped surfaces; coding-standards.md (internal doc) is corrected here but not added to the check's scope (reading internal docs widens false-positive risk). Flagging in case you want it guarded later.
  • Unrelated untracked docs-site-product-redesign.* files were left untouched.

https://claude.ai/code/session_015tNUy37dx7DJGDzmVUB8Wf

SUaDtL added 2 commits June 27, 2026 12:45
The v2.6.0 relicense (ADR-0009) left two more declarations on the old MIT terms,
beyond the ca manifest + README callout fixed in #151:

- plugins/ca-sandbox/.claude-plugin/plugin.json declared "license": "MIT" -- the
  sibling plugin's machine-readable field. Now AGPL-3.0-only (the repo LICENSE is
  AGPLv3 and ADR-0009 carves out no exception for ca-sandbox). 0.1.1 is untagged,
  so no version bump is required.
- .codearbiter/coding-standards.md still stated "License is MIT; copyright holder
  codeArbiter contributors". Corrected to AGPL-3.0-only / SUaDtL per ADR-0009.

CHANGELOG: ca-sandbox's plugin manifest now declares AGPL-3.0-only (was a stale MIT).

Claude-Session: https://claude.ai/code/session_015tNUy37dx7DJGDzmVUB8Wf
A relicense must update several surfaces (both plugin manifests, LICENSE, the
README badge + notice) and human review keeps missing some -- the v2.6.0 AGPLv3
relicense left three stale (the ca manifest + README callout fixed in #151, the
ca-sandbox manifest fixed in the preceding commit). This adds a mechanical CI
guard so a partial relicense fails the build instead of shipping.

check_license_consistency.py is stdlib-only with pure functions that degrade to a
finding rather than raise. It reads ONLY the enumerated surfaces -- never a
repo-wide grep -- so third-party (package-lock) and historical (CHANGELOG/ADR)
license mentions can't false-positive. ca's plugin.json `license` is the
canonical SPDX; a LICENSE_FAMILIES table maps it to each surface's identifying
markers, so the check is license-agnostic (a future relicense adds an entry, not
a rewrite). A fixed forbidden-phrase set guards retired commercial-offering prose.

Wired as a repo-wide, always-on ci.yml job in the required-checks aggregation.
security-reviewer PASS (no untrusted-input / secret / privilege concerns). Spec:
.codearbiter/specs/license-consistency-check.md. 23 unit tests cover AC-1..10.

Claude-Session: https://claude.ai/code/session_015tNUy37dx7DJGDzmVUB8Wf
@SUaDtL
SUaDtL merged commit 433d091 into main Jun 27, 2026
20 checks passed
@SUaDtL
SUaDtL deleted the feat/license-consistency-check branch June 27, 2026 16:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant