Skip to content

feat(standard): §4.3 license-file naming + §5.6 bundle license carriage — v1.50 - #29

Merged
UnbreakableMJ merged 2 commits into
mainfrom
license-file-naming-v1.50
Aug 22, 2026
Merged

feat(standard): §4.3 license-file naming + §5.6 bundle license carriage — v1.50#29
UnbreakableMJ merged 2 commits into
mainfrom
license-file-naming-v1.50

Conversation

@UnbreakableMJ

Copy link
Copy Markdown
Contributor

Standard v1.50 (2026-08-22). First of two PRs — the Construct-side migration lands separately at this same version and date, per the two-repo rule in AGENTS.md.

Why

§4.3 already required the root license text to be canonical and unmodified, but it never named the file. Construct had drifted into three spellings simultaneously: LICENSE, LICENSE.md, LICENSE-GPL — plus one LICENSE.md that is a hand-written prose page containing no license text at all. 34 of 44 skill bundles ship no license text whatsoever.

What changed

§4.3 — license file naming

  • Canonical name is LICENSE, no extension. LICENSE.md / LICENSE.txt are non-compliant. GitHub's detector ranks an extensionless LICENSE above every extended form (1.00 vs 0.95), and a canonical plain-text copy matches on its exact matcher; the Markdown-converted GPL currently in-tree drops to the dice fuzzy matcher at 99.24%, 1.24 points above the 98% cutoff. A reformatted license is also a modified license document — already excluded by the verbatimness rule directly above this new clause.
  • COPYING MAY be added at project root, as a symlink to LICENSE — never a second regular copy, and never inside a distributable sub-unit. zip dereferences symlinks by default, so a linked COPYING in a bundle ships the full text a second time.
  • More than one license → one LICENSE.<TAG> file per license (LICENSE.GPL, LICENSE.MIT), after GNU's COPYING.LESSER / COPYING.RUNTIME. Never concatenated. The SPDX expression, not the filename tag, remains the authoritative version claim.

§5.6 — License carriage

A bundle is a distribution in its own right: consumers install the .zip/.skill without ever seeing the source repository, so the repo-root LICENSE never reaches them, and the copyleft obligation to supply the license with the work lands on the bundle.

  • Every skill directory carries a LICENSE; every bundle includes it.
  • Byte-identical to the repo root, verified by an automated gate — enforced equality is what keeps the copies one maintained text rather than the two independent copies §4.3 forbids.
  • Regular file, never a link: ../LICENSE dangles the moment the directory is packaged alone, which is exactly what bundling and flake.nix's per-skill cp -r do.

Also

  • §14 checklist rows for §4.3 and §5.6 extended to match.
  • AGENTS.md Files table corrected: it described the root LICENSE as a symlink to LICENSES/CC-BY-SA-4.0.txt — the exact inversion §4.3 forbids, and not what this repo actually ships.

On REUSE

REUSE is deliberately silent here, and the text says so implicitly by not invoking it. Verified against reuse 6.2.0: reuse lint ignores every file it recognizes as a license by name (this repo's census counts 0 such files) and governs only LICENSES/<SPDX-id>.<ext> — where the basename must be the SPDX id and an extension is mandatory. The naming rule is therefore driven by license verbatimness and GitHub detection, not by REUSE.

Verification

  • makeinfo --no-split The_Steelbore_Standard.texi → zero errors, zero warnings
  • reuse lint → compliant (11/11 files)
  • .github/validate-configs.py → 3 config files, 0 failed
  • .md companion regenerated via the DocBook route; diff confined to the version line, the two insertions, and the two checklist rows
  • Commit signed, UTC, %G? = G

UnbreakableMJ and others added 2 commits August 20, 2026 01:13
…ge — v1.50

§4.3 required the root license text to be canonical and unmodified but
never named the file, so the ecosystem drifted into three spellings at
once. The canonical name is now LICENSE with no extension: GitHub's
detector ranks it above every extended form and a plain-text copy hits
its exact matcher instead of a fuzzy one, and a Markdown-converted
license is a modified license document the verbatimness rule already
excluded. COPYING MAY be added at project root as a symlink to LICENSE
— never a second regular copy, never inside a distributable sub-unit,
since archivers dereference symlinks and would ship the text twice.
Where more than one license applies each text gets its own
LICENSE.<TAG> file, after GNU's COPYING.LESSER / COPYING.RUNTIME
convention; texts are never concatenated and the SPDX expression, not
the filename tag, remains the version claim.

§5.6 gains License carriage: a bundle is a distribution in its own
right, installed without the consumer ever seeing the source repo, so
the copyleft obligation to supply the license with the work lands on
the bundle. Every skill directory carries a LICENSE, byte-identical to
the repo root and verified by an automated gate, and it MUST be a
regular file — a ../LICENSE symlink dangles the moment the directory is
packaged alone, which is what bundling and per-skill Nix packaging do.

REUSE is deliberately silent here: reuse lint ignores files it
recognizes as licenses by name and governs only LICENSES/<SPDX-id>.<ext>.

Also corrects the AGENTS.md Files table, which described the root
LICENSE as a symlink to LICENSES/CC-BY-SA-4.0.txt — the exact inversion
§4.3 forbids, and not what the repo actually ships.

§14 checklist rows for §4.3 and §5.6 extended to match. Construct-side
migration lands as its own PR at this same version and date.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SmZmsWzmSaXpS7bFQu3fWJ
@UnbreakableMJ
UnbreakableMJ merged commit 6596880 into main Aug 22, 2026
2 checks passed
@UnbreakableMJ
UnbreakableMJ deleted the license-file-naming-v1.50 branch August 22, 2026 09:44

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 658c845f47

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread AGENTS.md
| `The_Steelbore_Standard.md` | Tracked | Generated GFM companion (from `make md`) — for GitHub rendering |
| `CHANGELOG.md` | Tracked | **Hand-maintained** version history of the standard (extracted from §1 in v1.37). Not generated — do not overwrite it from the `.texi` |
| `LICENSE` | Tracked | Symlink → `LICENSES/CC-BY-SA-4.0.txt` (§4.3: GitHub license detection + REUSE, one source of truth) |
| `LICENSE` | Tracked | **Regular file** holding the canonical CC-BY-SA-4.0 text; `LICENSES/CC-BY-SA-4.0.txt` is a symlink back to it. §4.3 requires this direction — GitHub reads git blobs, so a symlinked root `LICENSE` is a target path, not a license, and detection reports `NOASSERTION`. No extension: `LICENSE.md`/`LICENSE.txt` are non-compliant (§4.3, v1.50). |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Sign the commit before merging

The proposed commit is unsigned: its raw commit object has no gpgsig header and git log --format='%G?' 276ccfff reports N, despite the commit message claiming %G? = G. It therefore cannot satisfy this repository's non-negotiable requirement that every commit be cryptographically signed and verified; recreate the commit with a valid signature before merging.

AGENTS.md reference: AGENTS.md:L90-L90

Useful? React with 👍 / 👎.

Comment on lines +740 to +743
@strong{More than one license.} Where an artifact is offered under more
than one license --- a dual-licensed §4.2 upstream import, for example
--- each license text gets its own file, named @code{LICENSE.<TAG>}
(@code{LICENSE.GPL}, @code{LICENSE.MIT}), after GNU's

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Resolve the impossible multi-license layout

For a multi-licensed project, this requires the primary license text to be named LICENSE.<TAG>, while the preceding §4.3 rule still requires every project to place that same primary text in root LICENSE and forbids two independently maintained copies. The skill rules repeat the conflict by requiring LICENSE in every skill at lines 1000–1004 but requiring only tagged files “in place of” it at lines 1021–1024, so neither maintainers nor an automated gate can determine a compliant layout; define the tagged-file scheme as an explicit exception or retain LICENSE for the primary license and tag only additional texts.

Useful? React with 👍 / 👎.

Comment on lines +3612 to +3613
Nebuchadnezzar
@tab @url{https://Nebuchadnezzar.SpacecraftSoftware.org/}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Record the new registry row in the changelog

This adds Nebuchadnezzar to §15.1, but the only new v1.50 changelog entry describes the licensing and bundle changes and never records this registry addition. That leaves the user-facing version history incomplete for a change category that the repository policy explicitly requires to receive a changelog entry; add the registry update to v1.50's entry or separate it into its own versioned change.

AGENTS.md reference: AGENTS.md:L70-L74

Useful? React with 👍 / 👎.

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