Skip to content

DRAFT: Reform copyright headers → single canonical header + NOTICE (for discussion)#1863

Draft
bmander wants to merge 1 commit into
mainfrom
copyright-header-reform
Draft

DRAFT: Reform copyright headers → single canonical header + NOTICE (for discussion)#1863
bmander wants to merge 1 commit into
mainfrom
copyright-header-reform

Conversation

@bmander

@bmander bmander commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Purpose — open for discussion, not ready to merge

This is a draft to start a project conversation about modernizing our copyright headers. It lands the tooling, a NOTICE file, and a small safe first slice of the migration, but deliberately does not cut over the whole tree. Please weigh in on the approach before we proceed.

The problem

Over ~15 years the per-file headers have fragmented into 40+ inconsistent variants across 624 files — differing years, name spellings, and holder lists (Paul Watts, USF/Sean Barbeau, Microsoft, Brian Ferris, Cambridge Systematics, OTSF, AOSP, …). They're a maintenance burden and frequently inaccurate.

Proposed direction

Adopt the convention used by the Apache Software Foundation, Kubernetes, and recommended by the Linux Foundation: one identical Apache-2.0 header on every file, naming no individual holder and no year —

Copyright The OneBusAway Authors.

— with all historical copyright notices preserved verbatim in a top-level NOTICE file (carried forward by redistributors under Apache-2.0 §4(d)).

Legal basis for relocating notices

Apache-2.0 §4 and the ASF source-header policy both let a copyright owner move their own notice into NOTICE. So relocation is gated on each holder's authorization — it does not transfer or waive any copyright. Code we did not receive from its owner (the three AOSP-derived files) keeps its notice in-file, untouched, per that same policy.

What's in this PR

  • NOTICE — consolidated holder list + a verbatim appendix of all 57 distinct historical notices (nothing lost), and the AOSP third-party carve-out.
  • tools/copyright-reform/apply-headers.py — idempotent migrator + CI --check mode. Migration is gated per holder via an EXCLUDED_HOLDERS list: a file is restamped only once every holder it names has signed off. Three AOSP files are path-exempt.
  • tools/copyright-reform/CONSENT-REQUEST.md + consents/ — holder-outreach template and durable sign-off audit trail.

Migration actually applied here

Run once with every holder still excluded, so it touches only the 21 currently header-less files (they name no holder — no consent implicated). Purely additive: every diff is a header prepend, zero deletions.

Rollout plan (gradual, after discussion)

Step Effect
Now (this PR) 21 header-less files stamped; tooling + NOTICE in place
Lift Open Transit Software Foundation (self-authorizing steward) migrates ~520 OTSF-only files
Each external consent recorded under consents/, entry removed, re-run unblocks that holder's files

Current per-holder blocked counts (apply-headers.py --dry-run): OTSF 520, USF 88, Barbeau 65, Watts 50, Microsoft 25, then small tails.

Questions for the project

  1. Is "The OneBusAway Authors" the holder string we want (vs. e.g. naming OTSF)? It's a one-line constant.
  2. OK to lift OTSF first and migrate the ~520 OTSF-only files in a follow-up?
  3. Who owns outreach to the corporate/institutional holders (Microsoft, Cambridge Systematics, USF)?
  4. Wire apply-headers.py --check into CI now, or once more of the tree is migrated?

🤖 Generated with Claude Code

…n tooling

Reform the project's copyright headers toward a single canonical Apache-2.0
header per file (the ASF / Kubernetes / Linux-Foundation convention: "Copyright
The OneBusAway Authors.", no per-file names or years), with historical
attribution consolidated verbatim in a top-level NOTICE file.

This is deliberately a DRAFT to open project discussion, not a finished cutover.

What's here:
- NOTICE: consolidated holder list plus a verbatim appendix of all 57 distinct
  historical copyright notices, so no attribution is lost. Three AOSP-derived
  files are called out as third-party notices that stay in-file.
- tools/copyright-reform/apply-headers.py: idempotent migrator with a CI --check
  mode. Migration is gated per copyright holder via an EXCLUDED_HOLDERS list; a
  file is only restamped once every holder it names has authorized relocation
  (Apache-2.0 s4 / ASF source-header policy permit a holder to move their own
  notice to NOTICE). Three AOSP files are path-exempt.
- tools/copyright-reform/CONSENT-REQUEST.md + consents/: the holder outreach
  template and the durable sign-off audit trail.

This commit runs the migration once with every holder still excluded, which
touches only the 21 currently header-less source files (they name no holder, so
no consent is implicated) -- purely additive. The ~520 OTSF-only files and all
externally-held files remain on their original headers, pending the discussion
and the respective authorizations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 734f95df-d270-439c-8dba-6b7da0215450

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch copyright-header-reform

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@bmander

bmander commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

💬 Discussion for this proposal is happening in #1864 — please comment there rather than here.

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