Encabezados de licencia
Cada archivo de fuente comentable en DispatchAtlas lleva un encabezado de una línea
SPDX-License-Identifier: MIT; todo lo demás está cubierto por los bloques de
anotación en REUSE.toml y el LICENSE del proyecto. Esta página es la política
ratificada; la proyección de máquina que el gate consume es
tools/license_header.toml, y tools/license_header.py la hace cumplir (check
falla en cerrado en pre-commit y CI, inject añade un encabezado faltante en la
posición correcta de forma idempotente).
Formas de encabezado inline
| Clase de archivo | Línea de encabezado | Posición |
|---|---|---|
.py .toml .yml .yaml .sh .ps1 .cff .editorconfig .gitattributes .gitignore CODEOWNERS | # SPDX-License-Identifier: MIT | Primera línea; después del shebang cuando hay uno |
.ts .tsx .mjs | // SPDX-License-Identifier: MIT | Primera línea |
.js | // SPDX-License-Identifier: MIT (la forma de bloque /* SPDX-License-Identifier: MIT */ también se acepta) | Primera línea |
.css | /* SPDX-License-Identifier: MIT */ | Primera línea |
.md | <!-- SPDX-License-Identifier: MIT --> | Primera línea, o primera línea no en blanco tras la cerca de frontmatter YAML de cierre |
.mdx | {/* SPDX-License-Identifier: MIT */} | Primera línea no en blanco tras la cerca de frontmatter de cierre (los comentarios HTML son inválidos en cuerpos MDX) |
.xml | <!-- SPDX-License-Identifier: MIT --> | Primera línea, o directamente tras la declaración <?xml …?> |
Clases cubiertas por cobertura general
Las clases no comentables, de datos, activos, lockfile, y marcador no llevan
encabezado inline; REUSE.toml afirma su licencia y copyright de forma centralizada:
.json .svg .csv .gz .whl .ttf .woff2 .pdf .png .ico
.log .hash .map .tsbuildinfo .txt .html .lock .typed y las clases del
índice pagefind, más los nombres base LICENSE, CNAME, .nojekyll, py.typed, y
.gitkeep.
Árboles de salida generada
Cada archivo bajo un árbol de salida generada es evidencia emitida por máquina o salida
de compilación y está cubierto por cobertura general independientemente de la
extensión: site/out/ y el dist/ de cada paquete, más las capas locales del espacio
de trabajo de experimentos. El gate nunca requiere ni inyecta encabezados inline allí.
Exenciones y alcance
Los textos de licencia bajo LICENSES/ son las licencias mismas y no llevan
encabezado. Los árboles de dependencias y caché (.venv/, node_modules/, caché de
byte-code y de herramientas) están fuera de la política: no son archivos de
DispatchAtlas. Una clase de archivo ausente de este registro es reportada por el gate
como no registrada y falla la comprobación — las clases nuevas se ratifican aquí antes
de que se envíen.
Ejecutar el gate
uv run python tools/license_header.py check
uv run python tools/license_header.py injectcheck recorre cada árbol — rastreado, privado, y generado — y sale no-cero ante
cualquier hallazgo faltante o no registrado. inject escribe el encabezado canónico
para la clase del archivo en la posición correcta y no cambia nada en una segunda
ejecución.