Skip to content

chore(license): reconcile residual PMPL prose to canonical MPL-2.0 + CC-BY-SA-4.0#172

Merged
hyperpolymath merged 1 commit into
mainfrom
claude/resolve-pr-167-jeczsh
Jun 27, 2026
Merged

chore(license): reconcile residual PMPL prose to canonical MPL-2.0 + CC-BY-SA-4.0#172
hyperpolymath merged 1 commit into
mainfrom
claude/resolve-pr-167-jeczsh

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Summary

Follow-up to #167 (already merged). #167 flagged a license-classification drift "🚩 for owner (no action taken)": stray PMPL-1.0-or-later strings survived in prose/metadata even though this repo's canonical license is MPL-2.0 (code/config) + CC-BY-SA-4.0 (docs). The estate already normalised to that pair in #138/#156/#161/#163; the #156 pass flipped SPDX header stamps only, leaving the bodies behind. This PR clears the residue.

verisimiser is not a PMPL carve-out repo, and LICENSE, LICENSES/, Cargo.toml and every SPDX header are MPL-2.0 — so the remaining PMPL prose was drift, not intent.

Changes

Reconciled (the repo's own license declarations):

  • .machine_readable/compliance/reuse/dep5 — REUSE/DEP5 default + config stanzas PMPL-1.0-or-laterMPL-2.0; the CC-BY-SA-4.0 docs override (last-match-wins) is kept intact.
  • .well-known/ai.txt — code-license line → MPL-2.0; dropped the Emotional Lineage per PMPL Section 3 clause (no such obligation exists in MPL-2.0).
  • .well-known/humans.txtLicense:MPL-2.0 (code) + CC-BY-SA-4.0 (docs).
  • docs/attribution/CITATION.cfflicense:MPL-2.0.
  • .machine_readable/ai/{.cursorrules,.clinerules,.windsurfrules} — license-policy block → MPL-2.0 canonical pair (kept the Never AGPL-3.0 estate rule).
  • .machine_readable/svc/k9/examples/{project-metadata,setup-repo}.k9.ncl — example license string/recipe → MPL-2.0 (the scaffolding recipe no longer curls a PMPL LICENSE).

Deliberately left untouched (not the repo's own self-declarations — flagged for owner):

  • docs/legal/EXHIBIT-A-ETHICAL-USE.txt, docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt — these are bodies of the Palimpsest-MPL license itself, not a verisimiser license claim. Whether an MPL-2.0 repo should ship them at all is a removal decision for the owner, not a find-replace.
  • contractile.just — the 'SPDX|License|MIT|Apache|PMPL|MPL' grep is a generic multi-license recognizer, not a declaration; PMPL is a valid alternative to keep matching.

RSR Quality Checklist

Required

  • Tests pass — metadata/docs-only change; no code touched, cargo build/test surface unaffected
  • Code is formatted — no code changed
  • Linter is clean — no new warnings or errors
  • No banned language patterns
  • No unsafe blocks without // SAFETY: comments — none added
  • No banned functions (believe_me, unsafeCoerce, Obj.magic, Admitted, sorry)
  • SPDX license headers — all modified files retain their existing MPL-2.0/CC-BY-SA-4.0 headers; no new files
  • No secrets, credentials, or .env files

As Applicable

  • State files — no project-state/architecture change
  • New dependencies reviewed — none added
  • ABI/FFI consistency — unaffected by this change

Testing

Verified by inspection + git grep: after the change, the only remaining PMPL/Palimpsest references are the three deliberately-preserved cases above (the two license exhibits + the generic recognizer). The dep5 CC-BY-SA-4.0 docs override is preserved. Canonical MPL-2.0 source URL used in the k9 example was confirmed reachable (HTTP 200).

Screenshots

n/a (text-only diff)


🤖 Generated with Claude Code


Generated by Claude Code

…CC-BY-SA-4.0

The estate already normalised this repo to the canonical pair — MPL-2.0
(code/config) + CC-BY-SA-4.0 (docs) — in #138/#156/#161/#163. The #156
pass flipped SPDX *header* stamps only, so stray PMPL-1.0-or-later strings
survived in prose/metadata bodies. This is the loose end PR #167 flagged
"for owner" (verisimiser is not a PMPL carve-out repo; LICENSE, LICENSES/,
Cargo.toml and every SPDX header are MPL-2.0).

Reconciled (own license declarations):
- .machine_readable/compliance/reuse/dep5 — REUSE/DEP5 default + config
  stanzas PMPL → MPL-2.0; CC-BY-SA-4.0 docs override (last-match) kept
- .well-known/ai.txt — code-license line → MPL-2.0; dropped the
  "Emotional Lineage per PMPL Section 3" clause (no such obligation in MPL-2.0)
- .well-known/humans.txt — License line → MPL-2.0 (code) + CC-BY-SA-4.0 (docs)
- docs/attribution/CITATION.cff — license → MPL-2.0
- .machine_readable/ai/{.cursorrules,.clinerules,.windsurfrules} — license
  policy block → MPL-2.0 canonical pair (kept "Never AGPL-3.0")
- .machine_readable/svc/k9/examples/{project-metadata,setup-repo}.k9.ncl —
  example license string/recipe → MPL-2.0 (recipe no longer curls a PMPL LICENSE)

Deliberately left (not own self-declarations):
- docs/legal/EXHIBIT-{A,B}-*.txt — bodies of the Palimpsest-MPL license itself
- contractile.just — generic multi-license recognizer ('MIT|Apache|PMPL|MPL')

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JdqVWGSSv36Ph8ZWvizGMp
@hyperpolymath hyperpolymath marked this pull request as ready for review June 27, 2026 19:20
@hyperpolymath hyperpolymath merged commit 5c1c44c into main Jun 27, 2026
31 of 32 checks passed
@hyperpolymath hyperpolymath deleted the claude/resolve-pr-167-jeczsh branch June 27, 2026 19:20
hyperpolymath added a commit that referenced this pull request Jun 27, 2026
…#174)

## Summary

Clears the one pre-existing red on the estate's `governance / Language /
package anti-pattern policy` check. `scripts/abi-ffi-gate.py` was the
repo's **last Python file** (RSR-H4 bans Python — Julia for
scripts/data, Rust for systems), and the whole-tree scanner flags it.
Rather than suppress the scanner, this **ports the gate to Julia** and
removes the `.py`, so the check goes green *and* the ABI↔FFI conformance
gate keeps doing its job.

(Follow-up to #173 — this is the cleanup of the lone pre-existing
failure carried on #172/#173.)

## Changes

- **`scripts/abi-ffi-gate.jl`** (new) — a 1:1 Julia port of the former
Python gate (Julia PCRE maps directly onto Python `re`). Same three
checks, same messages, same exit codes:
  1. the Zig FFI carries no unrendered `{{...}}` template tokens;
2. every `%foreign "C:<name>"` symbol in the ABI `.idr` sources is
`export fn`-ed by the Zig FFI;
3. the Idris `resultToInt` map and the Zig `Result = enum(c_int)` agree
on **names and values** (`Error`/`err` unified).
- **`.github/workflows/abi-ffi-gate.yml`** — the `ABI ↔ FFI structural
conformance` job now installs the pinned **Julia 1.11.5** release
tarball (mirroring the adjacent `zig-build` job's pinned-tarball
pattern) and runs `julia scripts/abi-ffi-gate.jl`.
- **`scripts/abi-ffi-gate.py`** (removed) — the last Python file in the
repo.

## RSR Quality Checklist

### Required

- [x] Tests pass — gate runs clean locally (julia 1.11.5);
`cargo`/Zig/Idris surfaces untouched
- [x] Code is formatted — idiomatic Julia
- [x] Linter is clean
- [x] **No banned language patterns — this PR *removes* the last Python
file** (RSR-H4)
- [x] No `unsafe` blocks without `// SAFETY:` — n/a
- [x] No banned functions
- [x] SPDX license header present on `abi-ffi-gate.jl` (MPL-2.0)
- [x] No secrets, credentials, or `.env` files

### As Applicable

- [x] ABI/FFI changes validated — the conformance gate's behaviour is
preserved (verified below)
- [ ] State files / CHANGELOG — no released-version change

## Testing

Verified locally with **julia 1.11.5** against this tree:

```
# OK path is byte-identical to the Python it replaces:
$ diff <(python3 abi-ffi-gate.py) <(julia abi-ffi-gate.jl)   → identical
  ABI-FFI GATE: OK (verisimiser) — 24 ABI functions exported, 8 result codes match   (exit 0)
```

Adversarial (the gate must **fail** on drift) — each returns exit 1 with
the right diagnosis:

| Injected drift | Result |
|---|---|
| `null_pointer = 4` → `9` in the Zig enum | ❌ "Result-code map differs
(name or value)" |
| remove an `export fn` | ❌ "1 ABI function(s) not exported by the Zig
FFI" |
| add a `{{PROJECT_NAME}}` token to the Zig | ❌ "Zig FFI has unrendered
template tokens" |

So the port is behaviour-equivalent **and** non-vacuous.

## Screenshots

n/a (script + workflow)

---

🤖 Generated with [Claude Code](https://claude.com/claude-code)


---
_Generated by [Claude
Code](https://claude.ai/code/session_01JdqVWGSSv36Ph8ZWvizGMp)_

Co-authored-by: Claude <noreply@anthropic.com>
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.

2 participants