著作者ヘッダー — ファイルごとの SPDX ライセンス行
各ファイルタイプに適したコメント構文で、規範的な単一行ヘッダーを用いて、ファイルごとの SPDX ライセンス識別子マーカーを定義し、強制します。
下流のコントリビューター向けの、規範的かつ規約上の参照。 本ドキュメントは、プロジェクト仕様の著作者およびファイルヘッダーのセクション(仕様 §0.5 + §4.6)を反映したものであり、公開リポジトリに同梱される独立した参照です。アーキテクチャ上の根拠は ADR-0002 に記録されています。
1. 規範的なヘッダー行
エコシステム内の適用対象となるすべてのファイルは、そのファイルタイプ族のコメント構文で、単一の規範的な SPDX ライセンス識別子行から始まらなければなりません。この行はファイルの機械可読なライセンスマーカーであり、非免除ファイルにとってその存在は交渉の余地がなく、その内容はファイルごとに即興されるのではなく、単一の信頼できる情報源によって統治されます。完全な著作権法的文書はリポジトリルートの LICENSE ファイルに一度だけ存在し——各ソースファイルに複製されることはありません。
1.1 情報内容(不変量)
規範的な内容は、ちょうど 1 行です。
SPDX-License-Identifier: MIT— FSFE が維持する REUSE 仕様による機械可読なライセンスマーカー。SPDX ツールチェーン(reuse lint、scancode)、Linux カーネルのツール、および下流のライセンススキャナーによって曖昧さなく解析されます。視覚的な枠線も、ファイルごとの著作権・ウェブサイト・メール・GitHub 行も持ちません——ファイルごとの来歴は設計上この単一の SPDX 行です(§4 を参照)。
1.2 参照形式(# コメント族)
規範的なテキスト——ここでは # コメント構文形式で記載——は、src/apothem/schemas/authorship-header.txt における信頼できる情報源です。
# SPDX-License-Identifier: MITこのテキストが唯一の権威ある情報源です。file-header バリデーター(§7)は、このバイト単位で正確なフィクスチャに対して実行されます。ファイルのヘッダー行とこのフィクスチャとの間の(§2 による構文置換のもとでの)いかなる乖離も、CI の失敗となります。
2. ファイルタイプごとのバリアント(バイト単位で正確)
行の情報内容は不変です。ファイルタイプによって変わるのはそのコメント構文だけです。ファイルタイプごとのバリアントの完全な表は次のとおりです。
| ファイルタイプ族 | コメント構文 | バリアントのレンダリング |
|---|---|---|
# 族 — .sh、.bash、.zsh、.py、.rb、.pl、.ps1、.yml、.yaml、.toml、.cff、.gitignore、.gitattributes、.editorconfig、.shellcheckrc、.env.example、Makefile、Dockerfile、Procfile、CODEOWNERS、PKGBUILD、scripts/apothem のような拡張子なしのシェルエントリーポイント | # 行コメント | # SPDX-License-Identifier: MIT |
// 族 — .js、.jsx、.mjs、.cjs、.ts、.tsx、.go、.rs、.java、.kt、.swift、.c、.cc、.cpp、.h、.hpp、.cs、.scala、.dart、.jsonc | // 行コメント | // SPDX-License-Identifier: MIT |
ブロックコメント族 — .html、.htm、.md、.markdown、.xml、.vue(テンプレート領域)、.php(テンプレート領域) | <!-- ... --> | <!-- SPDX-License-Identifier: MIT --> |
MDX(.mdx) | {/* ... */}(JSX 式コメント) | {/* SPDX-License-Identifier: MIT */} |
C ブロック族 — .css、.scss、.less、.sql(/* */) | /* ... */ | /* SPDX-License-Identifier: MIT */ |
; 族 — .ini、.cfg、一部の .lisp/.scm | ; 行コメント | ; SPDX-License-Identifier: MIT |
-- 族 — .sql、.lua、.hs、.elm、.ada | -- 行コメント | -- SPDX-License-Identifier: MIT |
| ロックファイル / 生成物 / JSON | なし / 該当なし | 免除。 §3 例外リストを参照。 |
Markdown バリアント(規範的なレンダリング):
<!-- SPDX-License-Identifier: MIT -->HTML コメント(または MDX {/* */})のラッパーは不可視にレンダリングされるため、レンダリングされた表面はクリーンなまま保たれ、ソース内のライセンスマーカーはすべてのファイルタイプにわたって機械可読のまま維持されます。
3. 例外リスト(カテゴリーとして免除)
以下のクラスは SPDX ヘッダー行から免除されます。file-header バリデーターの適用可能性チェックは、これらに対して not-applicable を返します。
LICENSE— それ自体が法的文書であり、license-author-consistencyバリデーターがその存在を確認する権威ある著作権行を持ちます。*.svgアセット — XML コメントは行コメントマーカーにとって脆弱なため、SVG の来歴はアセットの README と生成されたラスター出力によって担われます。CHANGELOG.md— フォーマットに束縛されたリリースノート文書。SPDX 行は、フォーマットに織り込まれるのではなく、changelog の見出しの上に単一の HTML コメントとして現れます。- JSON ファイル(
.json) — JSON にはコメント構文がありません。JSON 構成に帰属表示が必要な場合は、兄弟の<file>.NOTICE.mdを配置します。 - ロックファイル —
package-lock.json、yarn.lock、pnpm-lock.yaml、Cargo.lock、Pipfile.lock、poetry.lock、go.sumなど(機械管理)。 - 生成ファイル —
# Generated by ...または// Generated by ...マーカーを持つもの、あるいは.gitattributesのlinguist-generated=trueに一致するもの。 - ベンダー化されたサードパーティコンテンツ —
vendor/、third_party/、node_modules/配下のファイル。これらは上流自身のライセンス/通知を持ちます。上流の帰属表示の上に我々のマーカーを注入することはライセンス違反です。 .audit/ファイル — git 無視される一時的なもの。公開ツリーの範囲外です。- プランファイル(
<project-root>/.apothem/plans/**、および従来の<project-root>/.plans/**) — git 無視される一時的なもの。来歴はプランの frontmatter です(plans-discipline.md§3 を参照)。 - 空マーカー —
.keep、.gitkeepなど(意味的にゼロバイト)。 - あらゆる種類のバイナリファイル。
例外リストそれ自体は src/apothem/schemas/header-exceptions.txt に正規表現/glob のリストとしてエンコードされており、バリデーターの適用可能性チェックの入力となります。修正には構造化照会と新しい ADR が必要です。
4. ライセンスの相互作用
SPDX 行はプロジェクトのライセンスを機械可読に宣言し、LICENSE ファイルはそれを権威的に宣言します。
SPDX-License-Identifier: MIT— REUSE 仕様および SPDX 標準による機械可読なライセンスマーカー。自動ライセンススキャナーはこの行を直接解析します。SPDX 式構文は、reuse lint、scancode-toolkit、FOSSology、および Linux カーネルのライセンスツールと相互互換です。
- リポジトリルートの
LICENSE— 完全な MIT 条項と著作権保有者を担う、権威ある法的文書。著作権表記の唯一の住まいです。ファイルごとのヘッダーは、各ファイルで著作権を再記述するのではなく、共有された SPDX 識別子を通じて暗黙的にそれを参照します。
単一行形式。 ファイルごとの来歴はこの単一の SPDX 行です。著作権文書はルートの LICENSE に一度だけ存在します。枠線付きの複数行バナーボックス(罫線で囲まれた著作権・ウェブサイト・メール・連絡先の行)はバリデーターによって拒否されます。それらは各ファイルに連絡先と著作権のメタデータを複製しますが、機械可読なライセンスマーカーが REUSE/SPDX/SBOM ツールにすでに提供しているもの以上のものを何も追加しません。src/apothem/schemas/authorship-header.txt のバイト単位で正確なフィクスチャは単一行形式を担い、バリデーターはこのフィクスチャに対して実行されます。
相互参照。 LICENSE ファイル(MIT)——競合がある場合は法的文書が優先します。ADR-0006 はバナー縮小化の批准の根拠を記録しています。
5. 挿入位置
- SPDX 行はファイルの最初の内容であり、ただ 1 つの例外があります。shebang 行(
#!/usr/bin/env bash、#!/usr/bin/env python3など)は常に 1 行目に残り、SPDX 行は 2 行目から始まります。 - YAML frontmatter を持つ Markdown / MDX ファイルでは、SPDX コメントが最上部に置かれ、YAML frontmatter が続き、その後に H1 と本文が来ます。レンダリングされた出力は不可視のコメントで始まり、次に frontmatter がツールによって解析され、その後に可視の内容が流れます。
- 単一の空行が SPDX 行を次の内容(frontmatter の
---、shebang の後続行、H1 など)から分離します。
6. ヘッダー可視性ポリシー
特に Markdown ファイルでは、SPDX 行は既定で不可視です——<!-- ... -->(または MDX では {/* */})で包まれ、ソース内でのみ可視です。これは README、CONTRIBUTING、CLAUDE.md、サポートされるハーネスの指示ファイル、スキルの SKILL.md、コマンド本文、output-styles、ドキュメントページにとって正しいポリシーです。可視のレンダリング(出力の先頭にプレーンテキストまたはフェンスドブロックとしての SPDX 行)は、即座に読める来歴から恩恵を受ける独立した参照ドキュメントに対して許可されます。このポリシーは src/apothem/schemas/header-visibility.yaml でファイルクラスごとに設定され(既定は不可視)、その行の直後にファイルスコープのオーバーライドマーカー <!-- header-visibility: visible --> が許可されます。
7. インジェクター — scripts/inject-header.{sh,py}
次のことを行う決定論的な CLI です。
- 1 つ以上のファイルパス(または glob)を受け取ります。
- 例外リスト(§3)を通じて適用可能性を判定します。
- 既存のヘッダーの状態(規範的 / 不正 / 不在)を検出し、見つかった非規範的なバナーブロックを取り除いて再実行を冪等にします。
- ファイルタイプごとに正しい SPDX バリアント(§2)をレンダリングします。
- shebang と frontmatter を尊重しつつ、正しい位置(§5)に挿入します。
- 3 つのモードで動作します。
fix-in-place(書き込み)、emit-patch(統合 diff を出力)、check(いかなる乖離でも非ゼロ終了——CI が使用)。 - 冪等。2 回実行しても no-op です。
インジェクターは、SPDX 行を事前挿入して新しいファイルを足場づくりする Make ターゲット(make headers-fix と make new-* の足場)、および --fix モードの pre-commit フックによって呼び出されます。
8. バリデーター — file-header(CI)
src/apothem/conformity/file_header_grep.py にあります。作業ツリー内のすべてのファイルについて、バリデーターはその適用可能性を(§3 に従って)調べ、適用される場合は、規範的な SPDX 行がファイルの先頭——他のすべての内容よりも前、許可される唯一の前置内容は shebang(§5)——に存在することをアサートします。
src/apothem/schemas/authorship-header.txt のバイト単位で正確なフィクスチャによって支えられています。CI サマリーにファイルごとの diff と集計カバレッジ % を報告します。いかなる乖離でもビルドを失敗させます。
9. 自己強制メカニズム
このディシプリンは、あらゆる将来のセッションとあらゆる将来のコントリビューターにわたって存続しなければなりません。必須の強制表面は次のとおりです。
src/apothem/schemas/authorship-header.txt— バイト単位で正確な規範的フィクスチャ。唯一の信頼できる情報源。scripts/inject-header.{sh,py}— 機械的なインジェクター(§7)。file-headerCI バリデーター(§8)——いかなる乖離でもビルドを失敗させます。- pre-commit フック — ステージされたファイルに対して
--fixでバリデーターを実行し、インジェクターに接続されています。 CLAUDE.mdの必須動作ブロック — 適用対象ファイルを作成するたびに規範的な SPDX 行を注入するようアシスタントに指示します。- 規範的な
.github/パスにあるサポートされるハーネスの指示ファイル — ファイル生成時に同じことを行うようハーネスに指示します。 src/apothem/hooks/messages/pretooluse-{write,edit}-header-guard.mdにある PreToolUse フック — 適用対象パスへの Write/Edit ツール呼び出しを傍受し、SPDX 行が後で CI の失敗として発見されるのではなく、ファイル作成時に注入されるようにします。- PR テンプレートのチェックボックス — すべての新しいファイルが規範的な SPDX 行を持つという、コントリビューター向けのアサーション。
- 本ドキュメント(
site/content/docs/reference/authorship-header.mdx)——規範的かつ規約上の説明文。
関連項目
- ADR-0002 — アーキテクチャ上の根拠、検討された代替案。
- ADR-0006 — バナー縮小化の批准。
src/apothem/schemas/authorship-header.txt— バイト単位で正確な規範的フィクスチャ。src/apothem/schemas/header-exceptions.txt— 例外リスト(正規表現/glob 形式)。scripts/inject-header.pyおよびscripts/inject-header.sh— インジェクター。src/apothem/conformity/file_header_grep.py— バリデーター。- プロジェクト仕様 §0.5 + §4.6 — ここで反映した規範的テキスト。