Skip to content

feat(license-exceptions): rework the exceptions site around decisions, not approvals - #1514

Merged
jeefy merged 1 commit into
cncf:mainfrom
jeefy:lx/site
Sep 7, 2026
Merged

feat(license-exceptions): rework the exceptions site around decisions, not approvals#1514
jeefy merged 1 commit into
cncf:mainfrom
jeefy:lx/site

Conversation

@jeefy

@jeefy jeefy commented Sep 7, 2026

Copy link
Copy Markdown
Member

Summary

UI/UX rework of https://exceptions.cncf.io. The site was built when every row was an approval; it now records denied and not-eligible decisions too, and the framing, columns, and copy hadn't caught up. exceptions.json and the schema are untouched. Vanilla HTML/CSS/JS, no build step, no dependencies.

The headline fix

Approved DateDecision Date everywhere (table, CSV export, year filter), subtitle → "License exception decisions for CNCF projects", and denied/not-eligible rows show "—" for scope instead of "Not Applicable (Denied)".

Status is now first-class

  • One STATUS_META map drives badges, filter options, legend, CSV export, and sort order. Badges show a label + glyph (✓ ✕ ⊘) instead of the raw enum.
  • Status moves to column 2. A legend under the filters explains all five statuses — previously nowhere on the site said what "allowlisted" or "apache-2.0" meant.

Data the site had but never showed

  • comment (present on all 494 rows, including denial rationale) — per-row toggle, keyboard operable. It was already searchable, so users got matches with no visible cause.
  • "Results" → "Issue", reads results ?? issueUrl so workflow-created rows link to their request.
  • packageUrl is used when present; auto-linking is restricted to clean github.com/owner/repo names (fixes a row that 404'd with a URL-encoded space).
  • Rows have id anchors → #exc-2026-05-08-001 deep-links and highlights.

Behaviour

  • Filters/search/sort mirrored to the query string — shareable and survives reload.
  • Selecting a project also includes "All CNCF Projects" rows (with a note). Filtering "Cilium" used to hide ~480 blanket rows that apply to Cilium.
  • License filter tokenises compound SPDX expressions (46 tokens instead of 66 raw strings); "MPL-2.0" now matches "MPL-2.0 AND BSD-3-Clause".
  • Empty state answers the actual question: not listed ⇒ allowlisted license (no exception needed) or none exists → links to the policy and request template.
  • Downloads labelled "(all)" vs "(current view)"; SPDX link added. Filenames unchanged.
  • 2019-11-01 bulk-import rows show "Allowlist policy" rather than a fake date (raw date in title).

Layout / accessibility

  • <768px: stacked card layout (Status/Date/Issue were off-screen with no scroll hint). Selects no longer force the page to 1257px wide.
  • Sticky header actually sticks (the wrapper was the scroll container).
  • Contrast fixes (all badge pairs ≥ 6.5:1, muted text 6.25:1), :focus-visible outlines, real <button>s in sortable headers with aria-sort, live-region result count, table caption, <main>, reduced-motion, favicon.

Removed

/blanket-exceptions.html, blanket-app.js, and its spec. blanketExceptions is [] so the page rendered only "No blanket exceptions found." while blanket rows already live in the main table as project: "All CNCF Projects". It also had the only nav on the site (one-way door). netlify.toml 301s the old URL to /.

Test plan

  • Playwright 21/21 (3 assertions updated for required wording: subtitle, badge text Approved, CSV button label; blanket spec deleted with its page)
  • Visual review at 1440px and 390px
  • Netlify deploy preview — also serves as the check that the GitHub-App webhook is healed after the Netlify repo-access fix

…, not approvals

The site was written when every row was an approval. It now records
denied and not-eligible decisions too, so the framing, columns, and
copy needed to change. Schema and data are untouched.

Wording
- 'Approved Date' -> 'Decision Date' (table, CSV export, year filter)
- subtitle -> 'License exception decisions for CNCF projects'
- scope renders as an em dash for denied / not-eligible rows
- 'Results' -> 'Issue'; reads results ?? issueUrl so workflow-created
  rows link back to their request

Status
- single STATUS_META map drives badges, filter options, legend, CSV,
  and sort order; badges show label + glyph, Status moves to column 2
- legend under the filters explains all five statuses

Hidden data
- per-row toggle reveals the comment field (present on every row,
  including denial rationale) and is keyboard operable
- package links use packageUrl when present, otherwise only clean
  github.com/owner/repo names are auto-linked (fixes a 404)
- rows carry id anchors so decisions are deep-linkable

Behaviour
- filters, search, and sort are mirrored to the query string
- selecting a project also includes 'All CNCF Projects' rows
- license filter tokenises compound SPDX expressions
- date excluded from free-text search
- empty state explains what 'not listed' means and links to the
  allowlist policy and the request template
- downloads labelled (all) / (current view); SPDX link added
- 2019-11-01 allowlist-import rows show 'Allowlist policy' as the date

Layout / a11y
- stacked card layout below 768px; selects no longer overflow
- sticky header actually sticks; fixed column widths
- contrast fixes, focus-visible outlines, aria-sort on sortable
  headers with real buttons, live-region result count, table caption,
  main landmark, reduced-motion support, favicon

Removed
- blanket-exceptions page, its script and spec: it rendered only an
  empty state (blanketExceptions is empty) while blanket rows already
  appear in the main table. /blanket-exceptions.html now 301s to /.

Signed-off-by: Jeffrey Sica <me@jeefy.dev>
@netlify

netlify Bot commented Sep 7, 2026

Copy link
Copy Markdown

Deploy Preview for cncf-license-exceptions ready!

Name Link
🔨 Latest commit e553989
🔍 Latest deploy log https://app.netlify.com/projects/cncf-license-exceptions/deploys/6a9e586e47d24e000822503e
😎 Deploy Preview https://deploy-preview-1514--cncf-license-exceptions.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@jeefy
jeefy merged commit 49684b8 into cncf:main Sep 7, 2026
7 checks passed
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.

1 participant