Skip to content

Improve viewing/tracking license exceptions#1294

Open
jeefy wants to merge 18 commits intocncf:mainfrom
jeefy:feat/license-exceptions-modernization
Open

Improve viewing/tracking license exceptions#1294
jeefy wants to merge 18 commits intocncf:mainfrom
jeefy:feat/license-exceptions-modernization

Conversation

@jeefy
Copy link
Member

@jeefy jeefy commented Feb 4, 2026

  1. Centralize our license exceptions into a single JSON file
  2. Automate populating the JSON file
  3. Update docs
  4. Make a "reasonable" front end for searching (anything was better than before)
  5. Allow folks to download that or a CSV
  6. Once merged, there will be a site at https://cncf.github.io/foundation/license-exceptions/ and I'll add a DNS alias for exceptions.cncf.io

Any progress here is good progress IMO.

jeefy added 11 commits February 4, 2026 13:32
- Create JSON Schema (draft 2020-12) defining the structure for all exception data
- Add initial empty exceptions.json as the new source of truth
- Schema supports blanket exceptions (e.g., eBPF/GPL) and individual package exceptions
- Includes metadata like requesting project, approval date, issue URL

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
- Add migration script that consolidates CSV and JSON data sources
- Migrate 467 unique exception entries from legacy files
- Add blanket eBPF/GPL exception to blanketExceptions array
- Extract approval dates from comments and determine status
- Deduplicate entries by package name
- Sort by date (newest first), then by package name

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
- Add generate-csv.js for CSV format with proper field escaping
- Add generate-spdx.js for SPDX 2.1 tag-value format
- Add generate-all.js to run both generators
- Regenerate CSV (467 entries) and SPDX files from exceptions.json

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
- Create index.html with filters, table, and blanket exceptions display
- Create styles.css with CNCF branding and responsive design
- Create app.js with client-side filtering, sorting, and CSV export
- Support filtering by package name, license, status, and year
- Support sorting by date, package name, or license
- Auto-link github.com packages to their URLs
- Display blanket exceptions (eBPF/GPL) as cards

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
- Deploy on push to main when license-exceptions/ changes
- Generate CSV/SPDX before deployment
- Copy site files and data files to _site
- Use GitHub's official pages actions (v3/v4)

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
- Add link to searchable exceptions database
- Document data files and their purposes
- Add maintainer instructions for updating data
- Document JSON schema and status values
- Keep blanket eBPF/GPL exception info

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
- Parse issue body to extract project name and components
- Check for duplicate packages against exceptions.json
- Add needs-review label to all new issues
- Add possible-duplicate label when components already have exceptions
- Post triage comment with summary and links

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
- Trigger on 'approved' label added to issue
- Parse issue body to extract components and project
- Generate unique IDs for each exception
- Update exceptions.json and regenerate CSV/SPDX
- Create PR with branch license-exception-{issue_number}
- Comment on issue with PR link

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
- Validate JSON against schema using ajv-cli
- Check for duplicate exception IDs
- Verify CSV and SPDX files are in sync with JSON
- Validate required fields and status enum values

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
Add a section directing users to check the searchable exceptions
database before submitting a new request to reduce duplicates.

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
- Add Playwright E2E testing with 30 tests covering:
  - Page loading and data display
  - Search and filter functionality
  - Column sorting (clickable headers)
  - Download functionality (CSV/JSON)
  - Navigation between pages
  - Footer metadata

- Add blanket exceptions as separate page with card layout
- Add navigation bar to switch between package and blanket exceptions
- Add scope and results fields to exception schema
- Enhance search to query all fields
- Add clickable column headers for sorting

- Add GitHub Actions workflow for E2E tests on PRs
- Integrate E2E tests into deploy workflow (tests must pass before deploy)
- Update deploy to serve site at /license-exceptions/ path

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
@jeefy jeefy force-pushed the feat/license-exceptions-modernization branch from cbcb09f to c194889 Compare February 4, 2026 19:33
The Created timestamp was using current time, causing CI validation
to fail because regenerated files always differed. Now uses noon UTC
on the lastUpdated date for reproducible output.

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR centralizes CNCF license exception data into a single exceptions.json, adds generators/validators for derived formats, and introduces a small static site (plus Playwright E2E tests) to browse/search/filter and download exception data.

Changes:

  • Add a static browsing UI for package + blanket exceptions with search/filter/sort and downloads.
  • Add Node scripts to migrate legacy sources and generate CSV/SPDX outputs from exceptions.json, plus schema validation.
  • Add GitHub Actions workflows for validation, triage/approval automation, E2E testing, and GitHub Pages deployment.

Reviewed changes

Copilot reviewed 23 out of 26 changed files in this pull request and generated 17 comments.

Show a summary per file
File Description
license-exceptions/tests/package-exceptions.spec.js Adds Playwright E2E coverage for the package exceptions UI.
license-exceptions/tests/blanket-exceptions.spec.js Adds Playwright E2E coverage for the blanket exceptions UI.
license-exceptions/site/styles.css Adds styling for the new static UI.
license-exceptions/site/index.html New package exceptions page markup (filters/table/download links).
license-exceptions/site/blanket-exceptions.html New blanket exceptions page markup (cards/download link).
license-exceptions/site/app.js Client-side filtering/sorting/rendering + CSV download for package exceptions.
license-exceptions/site/blanket-app.js Client-side rendering for blanket exceptions.
license-exceptions/scripts/migrate-data.js Migration script to consolidate legacy CSV/JSON sources into exceptions.json.
license-exceptions/scripts/generate-spdx.js Generates SPDX tag-value output from exceptions.json.
license-exceptions/scripts/generate-csv.js Generates CSV output from exceptions.json.
license-exceptions/scripts/generate-all.js Convenience wrapper to generate CSV + SPDX together.
license-exceptions/schema/exception.schema.json JSON Schema for exceptions.json.
license-exceptions/playwright.config.js Playwright configuration + local web server setup.
license-exceptions/package.json Adds Playwright/serve tooling and scripts for tests/generation.
license-exceptions/package-lock.json Locks Node dependencies for the new tooling.
license-exceptions/README.md Updates documentation for the new source-of-truth and browsing UI.
license-exceptions/CNCF-licensing-exceptions.csv Regenerated CSV output from the unified data source.
license-exceptions/.gitignore Ignores Node/Playwright artifacts.
.github/workflows/validate-exceptions.yml Validates schema + generated-file sync on PRs touching exceptions/schema.
.github/workflows/license-exception-triage.yml Automates issue triage/duplicate detection for licensing-labeled issues.
.github/workflows/license-exception-approved.yml Automates PR creation when an issue is labeled “approved”.
.github/workflows/e2e-license-site.yml Runs Playwright E2E tests on relevant PR changes.
.github/workflows/deploy-license-site.yml Builds and deploys the site + data artifacts to GitHub Pages on main.
.github/ISSUE_TEMPLATE/license-exception-request.yaml Adds a “check existing exceptions” prompt linking to the new UI.
Files not reviewed (1)
  • license-exceptions/package-lock.json: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

jeefy and others added 4 commits February 4, 2026 13:39
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Jeffrey Sica <jeef111x@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Jeffrey Sica <jeef111x@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Jeffrey Sica <jeef111x@gmail.com>
Fixed typo '20212-04-12' -> '2022-04-12' in 5 exception comments.

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
@jeefy
Copy link
Member Author

jeefy commented Feb 4, 2026

HOLD for more revving :)

…fill data

- Add Project column to site UI with filter and sorting support
- Add 'denied' status for rejected exception requests (e.g., Liquibase FSL)
- Move blanket exceptions to main table with project='All CNCF Projects'
- Backfill ~20 exception entries from GitHub issues with scope/results/project
- Update GHA workflow to capture scope field and handle denied labels
- Update CSV/SPDX generators with new columns (Project, Scope, Status)
- Remove top-level nav from main page (blanket exceptions now in main table)
- Update README with new field documentation and blanket exception details
- Fix tests for removed navigation and improve data loading reliability
- Add pretest/posttest hooks to copy exceptions.json for test server

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
@jeefy jeefy force-pushed the feat/license-exceptions-modernization branch from 4c8b973 to 358aa8a Compare February 5, 2026 02:51
Signed-off-by: Jeffrey Sica <me@jeefy.dev>
@jeefy
Copy link
Member Author

jeefy commented Feb 5, 2026

Quick preview screenshot:
image

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