Заголовки лицензии
Каждый комментируемый исходный файл в DispatchAtlas несёт однострочный заголовок
SPDX-License-Identifier: MIT; всё остальное покрыто блоками аннотаций в REUSE.toml
и проектным LICENSE. Эта страница — ратифицированная политика; машинная проекция,
которую потребляет gate, — tools/license_header.toml, а tools/license_header.py
обеспечивает её соблюдение (check проваливается в закрытую сторону в pre-commit и CI,
inject добавляет отсутствующий заголовок в правильной позиции идемпотентно).
Формы inline-заголовка
| Класс файла | Строка заголовка | Позиция |
|---|---|---|
.py .toml .yml .yaml .sh .ps1 .cff .editorconfig .gitattributes .gitignore CODEOWNERS | # SPDX-License-Identifier: MIT | Первая строка; после shebang, когда он есть |
.ts .tsx .mjs | // SPDX-License-Identifier: MIT | Первая строка |
.js | // SPDX-License-Identifier: MIT (блочная форма /* SPDX-License-Identifier: MIT */ также принимается) | Первая строка |
.css | /* SPDX-License-Identifier: MIT */ | Первая строка |
.md | <!-- SPDX-License-Identifier: MIT --> | Первая строка, или первая непустая строка после закрывающего забора YAML frontmatter |
.mdx | {/* SPDX-License-Identifier: MIT */} | Первая непустая строка после закрывающего забора frontmatter (HTML-комментарии недопустимы в телах MDX) |
.xml | <!-- SPDX-License-Identifier: MIT --> | Первая строка, или непосредственно после декларации <?xml …?> |
Классы под общим покрытием
Некомментируемые, данные, активы, lockfile, и маркерные классы не несут inline-заголовка;
REUSE.toml централизованно утверждает их лицензию и копирайт:
.json .svg .csv .gz .whl .ttf .woff2 .pdf .png .ico
.log .hash .map .tsbuildinfo .txt .html .lock .typed и классы индекса
pagefind, плюс базовые имена LICENSE, CNAME, .nojekyll, py.typed, и
.gitkeep.
Деревья сгенерированного вывода
Каждый файл под деревом сгенерированного вывода — это машинно-эмитированное
доказательство или вывод сборки и покрывается общим покрытием независимо от расширения:
site/out/ и dist/ каждого пакета, плюс локальные слои рабочего пространства
экспериментов. Gate там никогда не требует и не внедряет inline-заголовков.
Исключения и область действия
Тексты лицензий под LICENSES/ — это сами лицензии и не несут заголовка. Деревья
зависимостей и кэша (.venv/, node_modules/, кэши байт-кода и инструментов)
находятся вне политики: это не файлы DispatchAtlas. Класс файла, отсутствующий в этом
реестре, сообщается gate как незарегистрированный и проваливает проверку — новые
классы ратифицируются здесь до отгрузки.
Запуск gate
uv run python tools/license_header.py check
uv run python tools/license_header.py injectcheck обходит каждое дерево — отслеживаемое, частное, и сгенерированное — и выходит
не-ноль при любой отсутствующей или незарегистрированной находке. inject пишет
канонический заголовок для класса файла в правильной позиции и ничего не меняет при
втором прогоне.