Заголовок авторства — построчная SPDX-строка лицензии
Определение и принудительное применение пофайловых маркеров SPDX-идентификатора лицензии с помощью канонических однострочных заголовков в подходящем синтаксисе комментариев для каждого типа файла.
Каноническая нормативная ссылка для нижестоящих участников. Этот документ зеркалирует разделы Authorship & File-Header спецификации проекта (Spec §0.5 + §4.6); это автономная ссылка, поставляемая с опубликованным репозиторием. Архитектурное обоснование зафиксировано в ADR-0002.
1. Каноническая строка заголовка
Каждый применимый файл в экосистеме ДОЛЖЕН начинаться с одной канонической строки SPDX-идентификатора лицензии в синтаксисе комментариев своего семейства типов файлов. Эта строка — машиночитаемый маркер лицензии файла; её наличие непреложно для неосвобождённых файлов, а её содержимое управляется единым источником истины, а не импровизируется для каждого файла. Полный авторский документ о правах живёт один раз в корневом файле LICENSE репозитория — он не дублируется в каждый исходный файл.
1.1 Информационное содержимое (инвариант)
Каноническое содержимое — это ровно одна строка:
SPDX-License-Identifier: MIT— машиночитаемый маркер лицензии согласно спецификации REUSE, поддерживаемой FSFE; парсится без неоднозначности SPDX-инструментарием (reuse lint,scancode), инструментами ядра Linux и нижестоящими сканерами лицензий. Он не несёт визуальной рамки и не содержит пофайловых строк копирайта, веб-сайта, e-mail или 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, безрасширительные shell-точки входа вроде 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 |
| Lock-файлы / сгенерированные / 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 появляется как одиночный HTML-комментарий над заголовком changelog, а не вплетается в формат.- JSON-файлы (
.json) — у JSON нет синтаксиса комментариев. Где для JSON-конфига требуется атрибуция, размещайте соседний<file>.NOTICE.md. - Lock-файлы —
package-lock.json,yarn.lock,pnpm-lock.yaml,Cargo.lock,Pipfile.lock,poetry.lock,go.sumи т. д. (управляемые машиной). - Сгенерированные файлы — всё с маркером
# Generated by ...или// Generated by ..., либо всё, соответствующее.gitattributeslinguist-generated=true. - Вендорённое стороннее содержимое — файлы под
vendor/,third_party/,node_modules/. Они несут собственную лицензию/уведомление вышестоящего источника; внедрение нашего маркера поверх вышестоящей атрибуции — это нарушение лицензии. - Файлы
.audit/— gitignore-эфемера; вне области опубликованного дерева. - Файлы планов (
<project-root>/.apothem/plans/**и устаревший<project-root>/.plans/**) — gitignore-эфемера; происхождение — это фронтматтер плана (см.plans-discipline.md§3). - Пустые маркеры —
.keep,.gitkeepи т. д. (семантически нулевого размера). - Бинарные файлы любого рода.
Сам список исключений закодирован как список regex/glob в src/apothem/schemas/header-exceptions.txt и служит входом для проверки применимости валидатора. Поправки требуют структурированного запроса и нового ADR.
4. Взаимодействие лицензий
Строка SPDX объявляет лицензию проекта машиночитаемо; файл LICENSE объявляет её авторитетно:
SPDX-License-Identifier: MIT— машиночитаемый маркер лицензии согласно спецификации REUSE и стандарту SPDX. Автоматические сканеры лицензий парсят эту строку напрямую; синтаксис SPDX-выражений кросс-совместим сreuse lint, scancode-toolkit, FOSSology и инструментарием лицензий ядра Linux.
- Корневой
LICENSEрепозитория — авторитетный юридический инструмент, несущий полные условия MIT и правообладателя. Это единственный дом для заявления о копирайте; пофайловые заголовки ссылаются на него неявно через общий SPDX-идентификатор, а не переизлагают копирайт в каждом файле.
Однострочная форма. Пофайловое происхождение — это единственная строка SPDX; авторский документ о правах живёт один раз в корневом LICENSE. Рамочные многострочные баннер-боксы (копирайт, веб-сайт, e-mail, контактные строки, обёрнутые в линованную рамку) отвергаются валидатором: они дублируют контактные метаданные и метаданные копирайта в каждом файле, не добавляя ничего, чего машиночитаемый маркер лицензии уже не предоставляет инструментарию REUSE/SPDX/SBOM. Байт-точная фикстура в src/apothem/schemas/authorship-header.txt несёт однострочную форму; валидатор работает против этой фикстуры.
Перекрёстные ссылки. Файл LICENSE (MIT) — юридический инструмент имеет приоритет в случае конфликта. ADR-0006 документирует обоснование ратификации сужения баннера.
5. Позиция вставки
- Строка SPDX — это первое содержимое файла, с одним-единственным исключением: строка shebang (
#!/usr/bin/env bash,#!/usr/bin/env python3и т. д.), которая всегда остаётся строкой 1; строка SPDX начинается со строки 2. - Для файлов Markdown / MDX с YAML-фронтматтером комментарий SPDX располагается в самом верху, затем следует YAML-фронтматтер, затем H1 и тело. Отображаемый вывод начинается с невидимого комментария, затем фронтматтер парсится инструментарием, затем течёт видимое содержимое.
- Одна пустая строка отделяет строку SPDX от следующего содержимого (
---фронтматтера, преемника shebang, H1 и т. д.).
6. Политика видимости заголовка
Конкретно для файлов Markdown строка SPDX по умолчанию невидима — обёрнута в <!-- ... --> (или {/* */} для MDX), видима только в исходнике. Это правильная политика для README, CONTRIBUTING, CLAUDE.md, поддерживаемых файлов инструкций для harness, SKILL.md навыка, тел команд, стилей вывода и страниц документации. Видимый рендеринг (строка SPDX как обычный текст или огороженный блок в верхней части вывода) разрешён для автономных справочных документов, которым выгодно сразу читаемое происхождение; политика задаётся по классу файла в src/apothem/schemas/header-visibility.yaml (по умолчанию invisible), с разрешённым маркером переопределения на уровне файла <!-- header-visibility: visible --> сразу после строки.
7. Инжектор — scripts/inject-header.{sh,py}
Детерминированный CLI, который:
- Принимает один или несколько путей к файлам (или glob'ов).
- Определяет применимость через список исключений (§3).
- Обнаруживает существующее состояние заголовка (канонический / неправильный / отсутствующий), снимая любой неканонический баннер-блок, который находит, чтобы повторные запуски были идемпотентны.
- Рендерит корректный вариант SPDX по типу файла (§2).
- Вставляет в корректную позицию (§5), уважая shebang и фронтматтер.
- Работает в трёх режимах:
fix-in-place(записывает),emit-patch(печатает унифицированный diff),check(exit-non-zero при любом расхождении — используется CI). - Идемпотентен: двойной запуск — это no-op.
Инжектор вызывается Make-таргетами, которые формируют новые файлы с предвставленной строкой SPDX (make headers-fix и каркасы make new-*), и pre-commit-хуком в режиме --fix.
8. Валидатор — file-header (CI)
Живёт в src/apothem/conformity/file_header_grep.py. Для каждого файла в рабочем дереве валидатор просматривает его применимость (по §3) и, если применимо, утверждает, что каноническая строка SPDX присутствует в голове файла — впереди всего прочего содержимого, и единственное разрешённое предшествующее содержимое — это shebang (§5).
Подкреплён байт-точной фикстурой в src/apothem/schemas/authorship-header.txt. Сообщает пофайловый diff и агрегированный % покрытия в сводке CI. Проваливает сборку при любом расхождении.
9. Механизмы самоприменения
Эта дисциплина должна пережить каждую будущую сессию и каждого будущего участника. Обязательные поверхности применения:
src/apothem/schemas/authorship-header.txt— байт-точная каноническая фикстура; единый источник истины.scripts/inject-header.{sh,py}— механический инжектор (§7).- Валидатор CI
file-header(§8) — проваливает сборку при любом расхождении. - Pre-commit-хук — запускает валидатор с
--fixна застейдженных файлах, подключён к инжектору. - Блок обязательного поведения
CLAUDE.md— инструктирует помощника внедрять каноническую строку SPDX всякий раз при создании применимого файла. - Файл инструкций для поддерживаемого harness по каноническому пути
.github/— инструктирует среду выполнения harness делать то же при генерации файла. - PreToolUse-хуки в
src/apothem/hooks/messages/pretooluse-{write,edit}-header-guard.md— перехватывают вызовы инструментов 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— список исключений (форма regex/glob).scripts/inject-header.pyиscripts/inject-header.sh— инжектор.src/apothem/conformity/file_header_grep.py— валидатор.- Спецификация проекта §0.5 + §4.6 — канонический текст, зеркалируемый здесь.
Соглашения для многоповерхностных окружений
Каноническая нормативная справка по конфигурации и согласованности многоповерхностных ассистентов по написанию кода в чат-консолях, IDE-автодополнении и средах проверки PR.
Манифест закрепления зависимостей
Политика объявления зависимостей, охватывающая диапазоны среды выполнения Python, инструменты разработки, lock-файлы инструментов выпуска и утверждённые нижние границы версий для каждой поверхности сборки.