Repository navigation
[campaign] PMPL-1.0 → MPL-2.0 SPDX licence header sweep (~12,000 files) #308
Description
Finding
A 2026-05-30 estate-wide grep shows 12,223 files still carry `SPDX-License-Identifier: PMPL-1.0-or-later` (predecessor estate licence) vs 55,245 files on the target `SPDX-License-Identifier: MPL-2.0`. `MPL-1.0` is already at zero — that conversion completed.
Per estate language policy
Per [[feedback_estate_lang_policy_2026_05_25]] memory:
MPL-1.0/PMPL-1.0 → MPL-2.0
PMPL-1.0 is the predecessor estate licence; MPL-2.0 is the target.
Top hotspots by repo
| Repo | PMPL-1.0 files | Notes |
|---|---|---|
| iser-tools | 1,517 | Likely all estate-authored |
| .claude (worktrees?) | 1,310 | Probably ephemeral worktree shadows |
| v-ecosystem | 1,159 | Vendored upstream V-lang — exempt |
| rescript-ecosystem | 882 | Vendored upstream ReScript — exempt |
| .github (workflows) | 845 | Mostly workflow files |
| asdf-augmenters | 820 | Estate-authored |
| asdf-plugin-collection | 706 | Estate-authored |
| docs (various) | 495 | Documentation |
| verification-ecosystem | 453 | Estate-authored |
| a2ml | 325 | Estate-authored |
| k9-svc | 293 | Estate-authored |
| affinescript-ecosystem | 272 | Estate-authored |
| ... | ... | ... |
Standards repo itself: 2,382 PMPL-1.0 vs 350 MPL-2.0 — the canonical-policy repo is itself ~87% on the predecessor licence.
Scope considerations
- Vendored exclusions:
v-ecosystem,rescript-ecosystem,hyperpolymath-archive/*,linguist,repos-monorepo— these are upstream forks and should keep their original headers per upstream-fidelity policy. - Realistic remaining scope: ~8,000 files across ~40 estate-authored repos.
- Bulk-replace tractability: Mechanical
sedsubstitution; per-PR scope = per-repo would be ~40 PRs.
Recommended approach
Phase 1 — standards itself
Convert standards' own files (2,032 estimated after carve-outs). Single large PR or 3-4 smaller PRs split by directory (workflows/, docs/, scripts/, lib/). Establishes the pattern.
Phase 2 — top-10 hotspots
Per-repo PRs for iser-tools, asdf-augmenters, asdf-plugin-collection, verification-ecosystem, a2ml, k9-svc, affinescript-ecosystem, container-stack, etc. Mechanical sed -i 's|PMPL-1.0-or-later|MPL-2.0|' plus header-only MPL-1.0 variants.
Phase 3 — long-tail
Subagent fan-out across remaining repos, paced for rate-limit. ~6-8 hours total.
Out of scope
- Code-level licence changes (just SPDX headers)
- Upstream-vendored content
- Files where PMPL is INTENTIONAL (none currently identified)
Owner decision needed
- (a) Approve Phase 1 (standards itself) now
- (b) Defer — PMPL-1.0-or-later is contractually equivalent to MPL-2.0 in practice; cosmetic
- (c) Trigger full sweep — would consume ~6-8 hours of CI/Actions budget
Refs [[feedback_estate_lang_policy_2026_05_25]] (policy source)
Activity
hyperpolymath commentedon May 30, 2026
Status sweep 2026-05-30 — refresh + reality check.
Count refresh
Re-ran inventory against current estate:
The PMPL-1.0 count grew, not shrank — likely from the in-flight
CLAUDE.mddocs flip (65-PR background script per memory) propagating fresh PMPL-1.0 stamps before this sweep approves. The MPL-1.0 conversion claim in the body remains accurate (only matches arelicense/PMPL-1.0.txtfilename hits, not estate-authored content).Progress since filing
The "Phase 1 — standards itself" candidate (2,032 files at filing → ~3,822 now) has had only the 25-file workflow precursor merged. Owner decision (a/b/c) still pending.
Owner-decision options (re-stated for clarity)
This is a genuinely-open campaign awaiting owner decision, not a stale-claim closure candidate. Keeping open. No per-phase sub-issues exist yet — they'd be filed once option (a) or (c) is approved.
Cross-ref: also note
[[feedback_echidna_license_docs_mpl_intentional.md]]memory — echidna's CLAUDE.md+FAQ.md AGPL reconciliation PR #149 was reverted 2026-05-30, so echidna docs intentionally stay MPL-2.0 despite AGPL LICENSE; do not sweep that repo's SPDX headers unprompted.hyperpolymath commentedon Jun 2, 2026
Status update — 2026-06-02 sweep complete
This campaign is largely complete. Sweep executed across 28 repos with category-aware targets (sole-owner → MPL-2.0, son-shared → AGPL-3.0-or-later, palimpsest carve-out kept PMPL, third-party/fork excluded).
Total swept: ~14,000 files across 28 repos
Per-repo PR table
Audit correction vs original framing
Original (2026-05-30) audit's "vendored exclusions" assumption was wrong for
v-ecosystemandrescript-ecosystem— both are owner-authored ecosystem subdirs, not upstream vendored.Actual correct exclusions discovered during execution:
.gitmodules) — e.g.,v-ecosystem/v-{graphql,grpc,rest}/,satellites/*,julia-ecosystem/,scaffoldia/rescript-tea/,affinescript-vite/(precautionary skip pending fork-vs-local classification)idaptik-rescript13-staging/(son-shared idaptik content)cadre-router/,cadre-tea-router/,rescript-evangeliser/,rattlescript/under dev-ecosystemconsent-aware-http/(special hybrid; see standards#350)Newly-confirmed AGPL category-3 repos (son-shared)
standards(this repo)rattlescriptvcl-utThese join previously-confirmed
idaptik,burble. All carryAGPL-3.0-or-later, not MPL-2.0.New deliverables
docs/LICENSE-POLICY.md(standards#349) — canonical estate policy referencerecipe-fix-pmpl-drift.json+fix-pmpl-drift.sh(hypatia#423) — auto-classifier for future driftMEMORY.md(estate-license-policy-umbrella + per-repo AGPL confirmations + consent-aware-http hybrid)consent-aware-http special handling (standards#350)
Per owner directive 2026-06-02, consent-aware-http uses a hybrid licensing model:
MPL-2.0CC-BY-4.0(IETF-compatible)PMPL-2.0-or-laterfor cultural/ethical/post-quantum framing (NOT applied as SPDX)Known deferred work
reposystemPhase 2 — 7 sub-projects (scaffoldia, recon-silly-ation, bitfuckit, gui, git-morph, contractiles, stateful-artefacts) need standalone-vs-local classificationpanll— owner-managed per memory, never sweep without explicit per-touch greenlightllm-grace#2— owner-manual file-by-file (199 files) per its own issue bodyechidnabot#83— owner-manual (2 trivial edits) per its own issue bodySuggested next state
Once the ~50 draft PRs above land, this campaign is closeable. Suggest one of:
🤖 Generated with Claude Code
hyperpolymath commentedon Jun 2, 2026
Campaign CLOSED — 2026-06-02 19:50Z
All 30 PRs across this campaign are now MERGED to main. Final tally:
Newly-confirmed category-3 (AGPL-3.0-or-later, son-shared) repos
Added to memory + estate-license-policy-umbrella table:
standards(this repo)rattlescriptvcl-utJoin previously-confirmed:
idaptik,burble.Suggested closure
Close this issue as SUPERSEDED-BY hypatia#423 (going-forward automation now in place; any new drift gets auto-routed via the recipe + script).
🤖 Generated with Claude Code
hyperpolymath commentedon Aug 24, 2026
Closing as completed/superseded after stale-open audit. The 2026-06-02 close-out records all 30 campaign PRs merged, approximately 14,000 source headers reconciled with category-aware licensing, and the going-forward detector/recipe handed to hyperpolymath/hypatia#423 (with gitbot-fleet#256 wiring). The issue’s own final recommendation was to close as superseded by that automation.