Skip to content

Commit a56786d

Browse files
Tranche A remediation + GNPL design documents (#6)
## What this is `gnpl` was reserved as Lithoglyph's **narration/projection** language, then filled by a squash-import of the GQLdt *query* language from the `nextgen-databases/lithoglyph/` monorepo. The import was not a mistake — it faithfully executed a migration plan that defined GNPL narrowly, as a rename of "Glyph query language". That reading is superseded. **Narration/projection is the primary purpose**; practical value to Lithoglyph-as-a-database is second. This PR encodes that, and fixes the remediation backlog that had accumulated behind a CI job which had never actually run. **Structure: two layers, one repo.** Nothing is extracted, nothing discarded. ``` GNPL ──lowers to──▶ GQLdt ──FFI──▶ Lithoglyph (what account) (what is) (the data store) ``` No `src/Gnpl/` code in this pass, by design — the skeleton is a follow-up. --- ## Measured findings Everything below was run, not inferred. ### `lake build` succeeds Status was previously **unknown**, because CI died before reaching it. Run locally with the full-mathlib cost budgeted: - exit 0, 34/35 targets, `Build completed successfully` - **zero `sorry` warnings from Lean's own checker**, zero errors This unblocks the deferred skeleton. ### CI was building the wrong Zig tree `bridge/` builds clean on Zig 0.16 and emits `zig-out/lib/liblith_bridge.a` — exactly the artifact `lakefile.lean` links (`-Lbridge/zig-out/lib -llith_bridge`). `bridge/zig/` **fails to compile its own build script**: it uses `addStaticLibrary` and `linkLibC`, removed from the Zig Build API after 0.14. CI had been pointed at it. There are three distinct skeletons in this repo — `bridge/`, `bridge/zig/`, `ffi/zig/` — and only the first is real. ### The build gate was never real `actions/cache@0c45773b…` is deprecated and **hard-fails**, aborting the job *before* `lake build`. So a red ❌ on `Build and Test Lean 4` has never meant "the Lean code is broken" — it meant the cache action refused to start. ### The naming gate could only ever pass ```bash grep -i "gql-dt" STATE.scm ECOSYSTEM.scm 2>/dev/null && echo "Found old naming (gql-dt instead of gql-dt)" ``` It compares a string to itself, over two files that do not exist, with `2>/dev/null` swallowing the miss. Deleted rather than repaired. ### The link checker was suppressing its own findings `.github/markdown-link-check-config.json` carried an ignorePattern for `^https://github.com/hyperpolymath/lith` — which silently exempted **every** dead `lith*` link in the repo. Verified via `gh`: `gql-dt`, `lith`, `lithoglyph`, `lithoglyph-studio`, `lithoglyph-debugger` **do not exist**. Narrowed to `^http://localhost`. ### Licence clobber, with chronology `git log -- LICENSE` shows only two commits ever touched it: | Commit | Effect | |---|---| | `a144d9f` (2026-06-24) | "normalise to MPL-2.0 (code) + CC-BY-SA-4.0 (docs)" — verbatim MPL-2.0 | | `102c79e` (the import) | **overwrote** it with PALIMPSEST-MPL 1.0, carried in from the monorepo | The result was an `SPDX-License-Identifier: MPL-2.0` header sitting above a PMPL body — the same header/body inversion previously found in `idaptik-ums`. All 50 code files already declared MPL-2.0; only the docs and the vscode manifest dissented. **And the clobber had a regeneration mechanism.** `.machine_readable/6a2/AGENTIC.a2ml:22` instructed agents: *"Never use AGPL license (use PMPL-1.0-or-later)"*. Fixing `LICENSE` alone would have been undone by the next agent pass. That directive is now corrected. PMPL is a real licence (`hyperpolymath/palimpsest-license`) — it is simply not this repo's. `LICENSE` restored verbatim from `a144d9f`. --- ## Changes ### Proof gate — `scripts/check-lean-proofs.sh` (new) The old gate was `! grep -r "sorry\|admit" src/`. It fires on five legitimate constructs in this repo, none of which are incomplete proofs: | Location | What it actually is | |---|---| | `TypeInference.lean:162` | `\| admit : ProofStrategy` — a **constructor** | | `TypeInference.lean:171` | `.admit` — a reference to it | | `TypeInference.lean:179` | the string literal `"sorry"` | | `TypeSafeQueries.lean:90` | a **commented-out** `:= by sorry` | | `Lexer.lean:230` | `("sorry", .kwSorry)` — a keyword table entry | Two modes: - **`--build-log FILE` (authoritative)** — reads Lean's own diagnostics (`uses '?sorry'?`, `sorryAx`, `declaration uses`). **Exits 1 if the log is missing**; a gate must never report success from a file that does not exist. - **default (textual pre-check)** — strips `/- -/` blocks, `"strings"` and `--` comments before matching, and exempts constructor declarations. **Canary-tested five ways, all correct:** current `src/` passes → seeded `theorem canary_one : True := by sorry` fails → seeded `example : 1 = 1 := by admit` fails → real build log passes → seeded warning log fails → missing log fails. A gate that has never gone red is not evidence of anything. ### CI — `.github/workflows/lean-build.yml` - `actions/cache` → live v4 SHA (`5a3ec84e…`) - `goto-bus-stop/setup-zig@2a9625d…` → `mlugg/setup-zig@d1434d08…`; the old SHA does not exist and that action has **no v2 tag at all** - `zig-ffi` repointed at `bridge/`, asserts `zig-out/lib/liblith_bridge.a` exists, runs `zig build test` (dropped a nonexistent `test-integration` step) - build step now `set -o pipefail; lake build 2>&1 | tee lake-build.log`, feeds the log to the proof gate, and uploads it as an artifact - spec filenames corrected to the real `spec/GQL-DT-Lexical.md` / `GQL-DT-Railroad-Diagrams.md` (a naming mismatch, not a missing spec) and now collect all misses rather than exiting on the first - tautological naming gate deleted ### Identity - **`README.adoc`** was the unmodified RSR template — *"This is your repo - don't forget to rename me!"*. Rewritten to lead with the two-layer story, so a visitor immediately understands why a repo named `gnpl` contains code namespaced `GqlDt`. - **`MOVED.md`** removed. It claimed this content moved *to* `hyperpolymath/lith` — a repo that does not exist, and the reverse of what happened. - `gqldt.ipkg`, `0-AI-MANIFEST.a2ml`, `META.a2ml` repointed at `github.com/hyperpolymath/gnpl`. ### Toolchains — `mise.toml` (new) Declares what this repo actually uses: `zig = "0.16.0"`, `idris2`, per the estate ABI (Idris2) / FFI (Zig) standard. Lean is **deliberately not pinned here** — `lean-toolchain` (`leanprover/lean4:v4.15.0`) is the single source of truth and elan reads it; a second pin would be a second thing to drift. --- ## Design documents ### `docs/THEORY.adoc` — the untethered case What a narration/projection language is and what gap it fills. It credits each neighbour and says precisely where it stops: | Neighbour | Where it stops | |---|---| | Bitemporal DBs (SQL:2011, Datomic, XTDB) | one consistent world *per coordinate*; two irreconcilable witnesses remain a data-quality defect | | Provenance semirings (Green/Tannen; Buneman) | annotates *a result* — "where did this tuple come from", not an account *of the matter* | | Argumentation (Dung, ASPIC+, Dempster–Shafer) | reasoning formalisms, not database languages; no narrative arrangement | | AGM belief revision | belief *sets*, not accounts; silent on where entrenchment comes from | | Event / situation calculus | reasons about what follows from events *taken as known*; no contested evidence, no perspective | | Computational narratology | commitment is aesthetic, not evidential — it may invent | | Narratology (Genette) | descriptive literary theory; nothing mechanised | The claim is scoped, and **six novelty claims are explicitly disclaimed**. The document says outright: *GNPL is a synthesis, not a discovery.* Its value stands or falls on whether the synthesis is usable. Governing invariant, mirroring GQLdt's existing rule at the data layer: > **No narration without warrant.** The type system forbids constructing an `Account` > containing an assertion not derivable from its `Fabula` under the stated `Focalization`. Ends with seven open questions, so the deferred work starts from an agenda rather than a blank page. ### `docs/LITHOGLYPH.adoc` — the tethered case Grounded in three facts verifiable in code, not asserted: 1. `Form.Blocks` maintains an append-only journal, with journal entries written **before** block mutations (`lithoglyph/ARCHITECTURE.adoc`). 2. `Provenance/Rationale.lean` — *"you cannot construct a `Tracked` value without providing a non-empty rationale"*, enforced at the type level. 3. `bridge/lith_types.zig` already marshals `ActorIdC`, `RationaleC`, `ProvenanceC`, `TrackedValueC` across the C ABI. **Three of six GNPL constructs already exist** — including the two hardest to retrofit. The argument from sunk cost: mandatory rationale is currently a *tax* consumed by nothing, and features like that get quietly filled with boilerplate. GNPL is the consumer that makes it pay. It also flags a live hazard: `PromptScoresC.computeOverall` and `Confidence.avg` are **unweighted means**. Neither is probabilistically principled, and both would be load-bearing if used as an AGM entrenchment ordering. Must be resolved before any retraction result reaches a user. --- ## Out of scope — flagged, not fixed - **Stale Zig skeletons.** `bridge/zig/` and `ffi/zig/` are near-duplicates on the removed pre-0.15 Build API; nothing links against either. Deleting them is a separate call. - **`RSR_OUTLINE.adoc`** still says "AGPL + Palimpsest dual license" (lines 72, 160). That is RSR *template* scaffolding describing the template standard, not this repo's declaration. - **Sibling extractions.** This clobber rode in on a routine squash-import. Worth checking whether `glyphbase` and the pending `lithoglyphdb` carry the same PMPL-over-MPL overwrite. - **Estate-shared CI.** `Governance` (scorecard-SARIF policy; trusted-base "no `docs/proof-debt.md` but 19 escape hatches") and `Hypatia` (`ImageOS` `ubuntu24` unmappable) are `hyperpolymath/standards` reusable-workflow issues. Fixing them from inside `gnpl` would be papering over an upstream fault. ## Companion PR A second PR against `hyperpolymath/nextgen-databases` corrects `lithoglyph/MOVED.md`, which claims `core-factor/gql/` was migrated here. It was not — that is 5 Factor files, and this repo contains zero `.factor` files. The Factor half is being treated as legacy and superseded by a typed narration layer lowering to GQLdt, rather than migrated. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- # Update — corrections after verifying against the estate checkers Two claims in the body above were wrong, and correcting them turned up the most significant finding in this PR. Recorded here rather than silently edited. ## Correction 1: the Governance failures were **not** estate-shared I listed Governance under "out of scope — upstream". I then cloned `hyperpolymath/standards` and ran its checkers locally against this repo. **Both Governance failures are repo-local and fixable here.** Only Hypatia is genuinely upstream. Filed upstream, with evidence: - **hyperpolymath/standards#516** — Hypatia: the pinned `erlef/setup-beam` SHA cannot map `ImageOS=ubuntu24`, so the scanner never runs *for any caller*. SHA-pinning holding callers at a pre-fix revision. - **hyperpolymath/standards#517** — `check-trusted-base.sh`: Lean `\bsorry\b` matches string literals and keyword tables (low severity; no false *passes*). ## Correction 2: "no incomplete proofs" was true but **materially incomplete** The body above says Lean reports zero `sorry`. That is accurate and I verified it in CI. It is **not** the same as "the proofs are done", and I should not have let it stand alone. **Lean's `sorry` warning does not fire on `axiom`.** Running the estate trusted-base checker found **19 escape hatches — 16 real `axiom` declarations** (plus the 3 detector false positives in #517). **None of the 16 is a necessary axiom.** Every one is a stub. Two consequences: **Five sit in executable position.** `parseToIR`, `deserializeIR`, `many`, `many1`, `sepBy` are declared `axiom`, so they have **no implementation at all**. Code calling them typechecks and cannot run. *"34/35 targets build" is a statement about typechecking, not about a working parser.* **One is a vacuous soundness theorem.** `TypeSafe.lean:194`: ```lean -- Proof that execution preserves type safety -- Stubbed due to satisfiesConstraints signature issue axiom executePreservesTypes {schema : Schema} (stmt : InsertStmt schema) : ∀ i, i < stmt.values.length → let ⟨_t, _v⟩ := stmt.values.get! i True -- Placeholder ``` It reduces to `… → True`. It reads as a type-safety soundness theorem and discharges nothing. Marked **D1, close first** — the only item that *actively misinforms*. And the sharpest one: the `TypeSafeQueries.lean` worked examples — the ones commented `✓ Type-safe INSERT with valid score`, demonstrating that an out-of-range score gives `-- Type error: failed to prove 150 ≤ 100` — **are themselves axioms**. They assert the existence of the well-typed value rather than constructing it, demonstrating the opposite of what the comments claim. None of this is a regression introduced here. It is the inherited state of the imported GQLdt sources, recorded honestly for the first time. ### `docs/proof-debt.md` (new) All 19 enumerated with `file:line` under the policy schema — §(a) discharged, §(b) budgeted, §(c) necessary, §(d) debt, and an §(e) section for the detector false positives so the count reconciles (19 = 16 + 3). Grouped into four work items with plans: D1 the vacuous theorem, D2 the unimplemented combinators, D3 the asserted examples (lowest effort, highest credibility gain — do first after D1), D4 the one item with a reasoned justification. **§(b) is deliberately empty and must stay empty until a test driver exists.** Without a refutation budget, "covered by tests" is unfalsifiable — the policy's own point. Checker now passes honestly: `All 19 escape hatch(es) are documented.` ### Scorecard SARIF — a real local violation `Check Workflow Staleness` asserted: *"OSSF Scorecard must not upload SARIF to GitHub Code Scanning unless it runs for every PR head commit."* True here: `scorecard.yml` triggers on push-to-main/schedule/dispatch — **never `pull_request`** — yet ran `github/codeql-action/upload-sarif`. Code Scanning would show findings corresponding to no PR head commit. Scan retained, upload switched to a build artifact, `security-events: write` dropped. Verified locally: *"All workflow staleness checks passed."* ## Also fixed: a third gate that could not fail The first CI run went green — and the log showed why that was not entirely earned: ``` Run Lean tests error: gqldt: no test driver configured conclusion: success ``` The step was `lake test || echo "No tests configured yet"`. `lake test` exits non-zero both when tests **fail** and when no driver is configured; `|| echo` swallowed both, so a real test failure could never have turned the job red. Same shape as the naming gate deleted earlier in this PR. Now a genuine failure exits 1, and only `no test driver configured` is tolerated — surfaced as a `::warning::` recording that **this repository has no executable test coverage**, rather than passing silently. Verified in CI: the `elif` branch is taken and the annotation is emitted. ## README The status table said the core *"builds"*; it now says *"typechecks"*, with added rows for the 16 outstanding axioms and the absence of tests, and the proof-gate section carries: > A green proof gate here means "nothing is admitted mid-proof". It does **not** mean > "nothing is assumed." `README.md` still opened with the pre-re-scope, query-first title, contradicting `README.adoc`. Confirmed via `gh api repos/hyperpolymath/gnpl/readme` that GitHub renders **`README.adoc`**, and `casket-pages.yml` prefers it too — so the landing page was already correct. `README.md` is reframed as the GQLdt-layer document with a banner pointing at `README.adoc`. --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 2cb0d36 commit a56786d

34 files changed

Lines changed: 1435 additions & 354 deletions
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
{
22
"ignorePatterns": [
3-
{
4-
"pattern": "^https://github.com/hyperpolymath/lith"
5-
},
63
{
74
"pattern": "^http://localhost"
85
}
@@ -11,5 +8,8 @@
118
"retryOn429": true,
129
"retryCount": 3,
1310
"fallbackRetryDelay": "30s",
14-
"aliveStatusCodes": [200, 206]
11+
"aliveStatusCodes": [
12+
200,
13+
206
14+
]
1515
}

.github/workflows/lean-build.yml

Lines changed: 70 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,11 @@ jobs:
3131
lean --version
3232
lake --version
3333
34+
# Was actions/cache@0c45773b… — a deprecated version that GitHub hard-fails.
35+
# That failure aborted this job BEFORE `lake build` ever ran, which is why
36+
# CI never once reported whether this project compiles.
3437
- name: Cache Lean dependencies
35-
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
38+
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
3639
with:
3740
path: |
3841
.lake
@@ -41,19 +44,44 @@ jobs:
4144
restore-keys: |
4245
${{ runner.os }}-lean-
4346
47+
# Tee the build so the proof gate can read Lean's own diagnostics.
48+
# pipefail so a build failure is not masked by the pipe into tee.
4449
- name: Build Lean 4 project
45-
run: lake build
46-
50+
run: |
51+
set -o pipefail
52+
lake build 2>&1 | tee lake-build.log
53+
54+
# `lake test` exits non-zero BOTH when tests fail and when no test driver
55+
# is configured. The previous step was `lake test || echo "..."`, which
56+
# swallowed both — so a genuine test failure could never turn this job red.
57+
# Tolerate only the "no test driver" case, and surface it as a warning
58+
# rather than a silent pass: no driver means no executable test coverage.
4759
- name: Run Lean tests
48-
run: lake test || echo "No tests configured yet"
49-
50-
- name: Check for proof errors
5160
run: |
52-
echo "Checking for sorry/admit in proofs..."
53-
! grep -r "sorry\|admit" src/ || {
54-
echo "❌ Found incomplete proofs (sorry/admit)"
61+
set -o pipefail
62+
if lake test 2>&1 | tee lake-test.log; then
63+
echo "✅ lake test passed"
64+
elif grep -q "no test driver configured" lake-test.log; then
65+
echo "::warning::No Lean test driver is configured, so this repository has NO executable test coverage. Add a @[test_driver] to lakefile.lean."
66+
else
67+
echo "::error::lake test failed"
5568
exit 1
56-
}
69+
fi
70+
71+
# Authoritative proof gate. Lean itself emits "declaration uses 'sorry'";
72+
# the previous gate was `! grep -r "sorry\|admit" src/`, which fired on a
73+
# lexer keyword table, a string literal, a comment and two constructor
74+
# references — and could not see a sorry reached through a tactic block.
75+
- name: Check for incomplete proofs (authoritative)
76+
run: ./scripts/check-lean-proofs.sh --build-log lake-build.log
77+
78+
- name: Upload build log
79+
if: always()
80+
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4
81+
with:
82+
name: lake-build-log
83+
path: lake-build.log
84+
retention-days: 30
5785

5886
zig-ffi:
5987
name: Build Zig FFI Bridge
@@ -63,23 +91,34 @@ jobs:
6391
- name: Checkout repository
6492
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
6593

94+
# Was goto-bus-stop/setup-zig@2a9625d… — that SHA does not exist and the
95+
# action is unmaintained (it has no v2 tag at all), so this job could
96+
# never start. mlugg/setup-zig is the maintained successor.
6697
- name: Setup Zig
67-
uses: goto-bus-stop/setup-zig@2a9625d550eefc3a8b5fe73f3f4ca4cf9b74d84c # v2
98+
uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2
6899
with:
69-
version: 0.13.0
100+
version: 0.16.0
70101

102+
# Was `working-directory: bridge/zig`. That is a stale skeleton on the
103+
# pre-0.15 Build API (`addStaticLibrary`, `linkLibC`) which no longer
104+
# compiles, and nothing links against it. The real bridge is `bridge/`:
105+
# `lakefile.lean` links `-Lbridge/zig-out/lib -llith_bridge`, and
106+
# `bridge/build.zig` is what produces `liblith_bridge.a` at that path.
71107
- name: Build Zig bridge
72-
working-directory: bridge/zig
108+
working-directory: bridge
73109
run: zig build
74110

111+
- name: Verify the artifact Lean links against exists
112+
working-directory: bridge
113+
run: test -f zig-out/lib/liblith_bridge.a
114+
115+
# bridge/build.zig declares exactly two steps: "shared" and "test".
116+
# The old workflow also ran `zig build test-integration`, which is not a
117+
# step in any build.zig here and would always have failed.
75118
- name: Run Zig tests
76-
working-directory: bridge/zig
119+
working-directory: bridge
77120
run: zig build test
78121

79-
- name: Run integration tests
80-
working-directory: bridge/zig
81-
run: zig build test-integration
82-
83122
spec-validation:
84123
name: Validate Specifications
85124
runs-on: ubuntu-latest
@@ -91,36 +130,36 @@ jobs:
91130
- name: Check EBNF grammar syntax
92131
run: |
93132
echo "Validating EBNF grammar..."
94-
# Basic validation - check for balanced brackets
95133
if ! grep -E '::=' spec/GQLdt-Grammar.ebnf > /dev/null; then
96134
echo "❌ No production rules found in grammar"
97135
exit 1
98136
fi
99137
echo "✅ Grammar file appears valid"
100138
139+
# Filenames corrected: these are GQL-DT-*, not GQLdt-*. The old list made
140+
# this job fail on a spelling mismatch and report it as a MISSING SPEC.
101141
- name: Verify specification files
102142
run: |
143+
missing=0
103144
for file in spec/GQL_Dependent_Types_Complete_Specification.md \
104145
spec/normalization-types.md \
105146
spec/GQLdt-Grammar.ebnf \
106-
spec/GQLdt-Lexical.md \
107-
spec/GQLdt-Railroad-Diagrams.md; do
147+
spec/GQL-DT-Lexical.md \
148+
spec/GQL-DT-Railroad-Diagrams.md; do
108149
if [ ! -f "$file" ]; then
109150
echo "❌ Missing required spec file: $file"
110-
exit 1
151+
missing=1
111152
fi
112153
done
154+
[ "$missing" -eq 0 ] || exit 1
113155
echo "✅ All specification files present"
114156
115-
- name: Check for naming consistency
116-
run: |
117-
echo "Checking for naming inconsistencies..."
118-
# Check STATE.scm and ECOSYSTEM.scm use gql-dt not gql-dt
119-
if grep -i "gql-dt" STATE.scm ECOSYSTEM.scm 2>/dev/null; then
120-
echo "❌ Found old naming (gql-dt instead of gql-dt)"
121-
exit 1
122-
fi
123-
echo "✅ Naming is consistent"
157+
# REMOVED: a "naming consistency" step that ran
158+
# grep -i "gql-dt" STATE.scm ECOSYSTEM.scm 2>/dev/null
159+
# -> echo "Found old naming (gql-dt instead of gql-dt)"
160+
# It compared a string to itself, over two files that do not exist in this
161+
# repo (2>/dev/null swallowed the error), so it could only ever pass.
162+
# Deleted rather than repaired: there is no naming rule for it to enforce.
124163

125164
documentation:
126165
name: Build Documentation

.github/workflows/scorecard.yml

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,19 @@ on:
99

1010
permissions: read-all
1111

12+
# Estate policy (standards/docs/TRUSTED-BASE-REDUCTION-POLICY.adoc and the workflow
13+
# staleness check): OSSF Scorecard MUST NOT upload SARIF to GitHub Code Scanning unless
14+
# it runs for every PR head commit. This workflow runs on push-to-main and on a schedule,
15+
# NOT on pull_request — so Code Scanning would show findings that correspond to no PR
16+
# head commit, and PR checks would appear to carry security results they do not.
17+
#
18+
# Resolution: keep the scan, drop the Code Scanning upload. The SARIF is retained as a
19+
# build artifact instead, which is inspectable without polluting Code Scanning.
20+
1221
jobs:
1322
analysis:
1423
runs-on: ubuntu-latest
1524
permissions:
16-
security-events: write
1725
id-token: write
1826
steps:
1927
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
@@ -26,7 +34,10 @@ jobs:
2634
results_file: results.sarif
2735
results_format: sarif
2836

29-
- name: Upload results
30-
uses: github/codeql-action/upload-sarif@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v3.31.8
37+
# NOT github/codeql-action/upload-sarif — see the policy note above.
38+
- name: Upload results as artifact
39+
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4
3140
with:
32-
sarif_file: results.sarif
41+
name: scorecard-results
42+
path: results.sarif
43+
retention-days: 30

.machine_readable/6a2/AGENTIC.a2ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ can-create-files = true
1919
# - Never commit secrets or credentials
2020
# - Never use banned languages (TypeScript, Python, Go, etc.)
2121
# - Never place state files in repository root (must be in .machine_readable/)
22-
# - Never use AGPL license (use PMPL-1.0-or-later)
22+
# - Never use AGPL license. Code = MPL-2.0, documentation (.md/.adoc) = CC-BY-SA-4.0
2323

2424
[maintenance-integrity]
2525
fail-closed = true

.machine_readable/6a2/META.a2ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ version = "1.0.0"
77
last-updated = "2026-04-11"
88

99
[project-info]
10-
license = "PMPL-1.0-or-later"
10+
license = "MPL-2.0"
1111
author = "Jonathan D.A. Jewell (hyperpolymath)"
1212

1313
[architecture-decisions]

0-AI-MANIFEST.a2ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
(name "GQL-DT")
1010
(full-name "Dependently-Typed Glyph Query Language")
1111
(version "0.2.0")
12-
(repo "https://github.com/hyperpolymath/gql-dt")
13-
(license "PMPL-1.0-or-later")
12+
(repo "https://github.com/hyperpolymath/gnpl")
13+
(license "MPL-2.0")
1414
(author "Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>")
1515
(parent-project "lithoglyph")
1616
(monorepo-parent "nextgen-databases"))

ABI-FFI-README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ When modifying the ABI/FFI:
374374

375375
## License
376376

377-
PMPL-1.0-or-later
377+
CC-BY-SA-4.0
378378

379379
## See Also
380380

Containerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ FROM ubuntu:24.04
99
LABEL org.opencontainers.image.title="GQLdt Development Environment"
1010
LABEL org.opencontainers.image.description="Lean 4 + Zig for dependently-typed Lith queries"
1111
LABEL org.opencontainers.image.authors="Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>"
12-
LABEL org.opencontainers.image.licenses="PMPL-1.0-or-later"
12+
LABEL org.opencontainers.image.licenses="MPL-2.0"
1313

1414
# Install system dependencies
1515
RUN apt-get update && apt-get install -y \

GQL-DT-COMPLETION-2026-02-07.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ deno run --allow-net --allow-read cli/lsp-server.ts
169169
"description": "Language support for GQL-DT queries with dependent type checking",
170170
"version": "1.0.0",
171171
"publisher": "hyperpolymath",
172-
"license": "PMPL-1.0-or-later",
172+
"license": "MPL-2.0",
173173
"engines": { "vscode": "^1.80.0" }
174174
}
175175
```
@@ -557,4 +557,4 @@ All standard tooling is built, tested, and functional:
557557

558558
**Report Generated:** 2026-02-07
559559
**Author:** Claude Sonnet 4.5 (Hyperpolymath Standards)
560-
**License:** PMPL-1.0-or-later
560+
**License:** CC-BY-SA-4.0

0 commit comments

Comments
 (0)