fix(supply-chain): separate MIT and bundled-font licenses - #270
fix(supply-chain): separate MIT and bundled-font licenses#270seonghobae wants to merge 12 commits into
Conversation
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Exact-current-head read-only review request for Direct exact-head gates are complete: CI @coderabbitai review Review only. Do not mutate the branch, dispatch repair writers, reuse predecessor/stale/synthetic evidence, or synthesize author approval. Bind findings and verdicts to this exact unchanged head. |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
head='b2c6b6eb7b9638051688939b722a1094c97da013'
base='a430b1c153702de3b6439def801732d7453b4940'
echo '== Revision identities =='
git rev-parse HEAD
git cat-file -t "$head"
git cat-file -t "$base"
git merge-base --is-ancestor "$base" "$head" && echo 'base-is-ancestor=yes' || echo 'base-is-ancestor=no'
echo '== Changed paths and diff summary =='
git diff --name-status "$base" "$head"
git diff --stat "$base" "$head"
git diff --check "$base" "$head"
git diff -- "$base" "$head" -- LICENSE package.json src/fonts/NOTICE src/fonts/OFL.txt 2>/dev/null || true
echo '== Root LICENSE canonical MIT comparison =='
expected="$(mktemp)"
cat > "$expected" <<'EOF'
MIT License
Copyright (c) 2026 Inkspan Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
EOF
if diff -u "$expected" LICENSE; then
echo 'root-license-canonical-mit=yes'
else
echo 'root-license-canonical-mit=no'
fi
rm -f "$expected"
echo '== Font-license evidence =='
printf 'NOTICE Noto occurrences: '
rg -n -i 'Noto(\s+Sans)?' src/fonts/NOTICE || true
printf 'OFL reserved-font-name occurrences: '
rg -n 'Reserved Font Name|Noto Sans' src/fonts/OFL.txt || true
printf 'OFL version markers: '
rg -n 'SIL OPEN FONT LICENSE|Version 1\.1|PREAMBLE|TERMS AND CONDITIONS' src/fonts/OFL.txt || true
wc -l src/fonts/NOTICE src/fonts/OFL.txt
echo '== npm manifest evidence =='
jq '{license, files, version, dependencies, devDependencies, exports, main, module, types}' package.json
echo '== Package-related changed manifest fields =='
git diff -U0 "$base" "$head" -- package.json
echo '== Non-scope changes excluding license evidence =='
git diff --name-only "$base" "$head" -- . ':!LICENSE' ':!package.json' ':!src/fonts/NOTICE' ':!src/fonts/OFL.txt'Length of output: 8196 🏁 Script executed: #!/bin/bash
set -euo pipefail
head='b2c6b6eb7b9638051688939b722a1094c97da013'
base='a430b1c153702de3b6439def801732d7453b4940'
echo '== Test structure =='
ast-grep outline src/licenseBoundary.test.ts --items all
echo '== Added test content =='
cat -n src/licenseBoundary.test.ts
echo '== License content at base and head =='
echo '-- base LICENSE --'
git show "${base}:LICENSE" | cat -n
echo '-- head LICENSE --'
git show "${head}:LICENSE" | cat -n
echo '== Corrected canonical MIT comparison =='
expected="$(mktemp)"
cat > "$expected" <<'EOF'
MIT License
Copyright (c) 2026 ContextualWisdomLab
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
EOF
diff -u "$expected" LICENSE && echo 'root-license-canonical-mit=yes'
rm -f "$expected"
echo '== Exact package contract comparison =='
for key in version license dependencies devDependencies peerDependencies optionalDependencies exports main module types files; do
before="$(git show "${base}:package.json" | jq -c --arg key "$key" '.[$key]')"
after="$(git show "${head}:package.json" | jq -c --arg key "$key" '.[$key]')"
if [ "$before" = "$after" ]; then
printf '%s=unchanged\n' "$key"
else
printf '%s=CHANGED\n' "$key"
fi
done
echo '== Test references to requested evidence =='
rg -n -C 2 'LICENSE|MIT|NOTICE|OFL|Noto|package\.json|license|files|src/fonts' src/licenseBoundary.test.tsLength of output: 10800 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/inkspan'
head='b2c6b6eb7b9638051688939b722a1094c97da013'
echo '== Exact-head GitHub Actions runs =='
for run_id in 31590591645 31590591555 31590591516; do
gh api "repos/${repo}/actions/runs/${run_id}" \
--jq '[.id, .name, .head_sha, .status, .conclusion] | `@tsv`'
done
echo '== Retained OFL text has no changes from the protected base =='
git diff --quiet a430b1c153702de3b6439def801732d7453b4940 "$head" -- src/fonts/OFL.txt \
&& echo 'ofl-unchanged-from-base=yes' \
|| echo 'ofl-unchanged-from-base=no'Length of output: 1082 🤖 web_search executed:
Length of output: 10588 🏁 Script executed: #!/bin/bash
set -euo pipefail
reference="$(mktemp)"
repository_terms="$(mktemp)"
reference_terms="$(mktemp)"
trap 'rm -f "$reference" "$repository_terms" "$reference_terms"' EXIT
curl --fail --silent --show-error --location \
'https://openfontlicense.org/open-font-license-official-text/OFL.txt' \
-o "$reference"
echo '== Official reference identity =='
sed -n '1,20p' "$reference"
echo '== Compare standard OFL-1.1 terms =='
sed -n '/^SIL OPEN FONT LICENSE Version 1\.1 - 26 February 2007$/,$p' \
src/fonts/OFL.txt > "$repository_terms"
sed -n '/^SIL OPEN FONT LICENSE Version 1\.1 - 26 February 2007$/,$p' \
"$reference" > "$reference_terms"
if diff -u "$reference_terms" "$repository_terms"; then
echo 'ofl-standard-terms-exact=yes'
else
echo 'ofl-standard-terms-exact=no'
fiLength of output: 1154 🏁 Script executed: #!/bin/bash
set -euo pipefail
page="$(mktemp)"
trap 'rm -f "$page"' EXIT
curl --fail --silent --show-error --location \
--user-agent 'Mozilla/5.0 (compatible; CodeRabbit review)' \
'https://openfontlicense.org/open-font-license-official-text/' \
-o "$page"
echo '== Official OFL page title and text-download candidates =='
rg -n -i -C 1 '<title>|OFL\.txt|plaintext|plain text|download' "$page" | head -n 120Length of output: 6977 🏁 Script executed: #!/bin/bash
set -euo pipefail
reference="$(mktemp)"
repository_terms="$(mktemp)"
reference_terms="$(mktemp)"
trap 'rm -f "$reference" "$repository_terms" "$reference_terms"' EXIT
curl --fail --silent --show-error --location \
--user-agent 'Mozilla/5.0 (compatible; CodeRabbit review)' \
'https://openfontlicense.org/documents/OFL.txt' \
-o "$reference"
sed -n '/^SIL OPEN FONT LICENSE Version 1\.1 - 26 February 2007$/,$p' \
src/fonts/OFL.txt > "$repository_terms"
sed -n '/^SIL OPEN FONT LICENSE Version 1\.1 - 26 February 2007$/,$p' \
"$reference" > "$reference_terms"
echo '== Official reference header =='
sed -n '1,16p' "$reference"
echo '== Exact standard-terms comparison =='
if diff -u "$reference_terms" "$repository_terms"; then
echo 'ofl-standard-terms-exact=yes'
else
echo 'ofl-standard-terms-exact=no'
fiLength of output: 2344 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '== Trailing whitespace in bundled OFL text =='
rg -n '[ \t]+$' src/fonts/OFL.txt || trueLength of output: 379
I reviewed
I kept this review distinct from protected-main verification and approval authority, as required by the repository guidance. 🧠 Learnings used
|
Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
|
Restacked onto current protected Validation at
The real emitted npm tarball contains canonical root MIT text plus separate bundled-font NOTICE and OFL evidence; no license terms or runtime behavior changed. @codex review |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Remove the duplicated Python support contract changes from this license branch. PR #405 remains the single writer while this branch keeps its repository license correction. Signed-off-by: Seongho Bae <seonghobae@users.noreply.github.com> Commit-Message-Assisted-by: Claude (via Claude Code)
Closes #269.
Product boundary
This Draft separates the root Inkspan software license from bundled-font license evidence without changing either license. Root
LICENSEis canonical MIT text for Inkspan software. Noto Sans attribution and complete OFL-1.1 terms remain insrc/fonts/NOTICEandsrc/fonts/OFL.txt. The npm manifest remainslicense: MITand packages both rootLICENSEandsrc/fonts.Current authority and exact source identity
Protected shipped truth is independently resolved
main@a40b9489665bed7d95af619a6079b9c51cab299a. Current exact Draft head is210284bb30661294a86f413581c26731c25d4b8aonfix/license-detection-269.The branch remains based on the protected tip without a competing writer. The effective product delta against protected main is still exactly two paths: modified root
LICENSEand addedsrc/licenseBoundary.test.ts. No force-push or destructive rebase was used.Test-first / evidence lineage
961597fe6431452a8ba89d513b6ae236abcc2e9frequired exact canonical root MIT text while separately requiring Noto/OFL evidence.31589849372failed at the intended root-license assertion because the then-protected root file contained canonical MIT text plus an appended bundled-font section; the font attribution/OFL assertions passed.c3ce70a527e19c06e41b7d82d369ee8fd5fa402dremoved only the appended bundled-font section from rootLICENSE.b2c6b6eb7b9638051688939b722a1094c97da013strengthened source/package evidence to require manifestlicense: MITplusLICENSEandsrc/fontsin the npmfilescontract.79c0ca643c012b6666dcbc37cefe16dc3d5575bfadded a packlist assertion, but later verification found that this usednpm pack --dry-run; that proves npm's proposed packlist, not the bytes/entries of an emitted tarball.63b9e626ac9efac0610f9d6b555b9b465bb88147,765c194b7a8fa3a1c7f48ff7aa7b7a27bee4e95b, and0a3cf2f3ec3dc0113e1bd891769a2b3bce350b60synchronized the two-file lane with successive protected-main truth.7b6688971a4846201dbf97f21acee99d49dd2564closed the artifact-evidence contradiction: the test emits a real tarball withnpm pack --json --ignore-scripts --pack-destination <isolated temp dir>, lists that archive withtar -tzf, requirespackage/LICENSE,package/src/fonts/NOTICE, andpackage/src/fonts/OFL.txt, and removes the temporary artifact infinally.210284bb30661294a86f413581c26731c25d4b8aremoves duplicated Office support-contract edits and leaves PR test(office): align Python support contract with PR matrix #405 as their single writer; the effective license delta remains two paths.Exact-current-head evidence
For exact head
210284bb30661294a86f413581c26731c25d4b8aagainst protectedmain@a40b9489665bat the latest refetch:33921412404, SAST Semgrep33921412519, Security Scan33921412385, and CodeQL PR33921412398had ended cancelled before substantive exact-head evidence was produced;Pending, queued, in-progress, skipped, cancelled, absent, neutral, failed, stale/predecessor, status-only, synthetic-source, wrong-checkout, or model-only evidence is non-passing. Refetch all owner paths and then-live governance before any lifecycle action; do not grandfather the prior false-green or predecessor runs.
Invariants preserved
This is machine-readable supply-chain evidence and license-file separation, not a license change or legal advice.
Integration boundary
Keep Draft and unmerged while #118 owns protected
v0.6.0publication/provenance/digest operational acceptance and current live governance remains unsatisfied. Before any Ready/merge transition, refetch the then-live protected tip, unchanged exact head, ancestry/mergeability, organization ruleset, central required workflows, formal reviews and threads; require qualifying independent approval and all applicable exact-head gates. After protected integration, operational acceptance must verify GitHub identifies the repository software license as MIT and that the packed/published npm artifact retains both MIT and OFL evidence.