diff --git a/spacecraft-steelbore-standard.skill b/spacecraft-steelbore-standard.skill index 9011df2..540c10f 100644 Binary files a/spacecraft-steelbore-standard.skill and b/spacecraft-steelbore-standard.skill differ diff --git a/spacecraft-steelbore-standard.zip b/spacecraft-steelbore-standard.zip index 4f42496..ff1ac35 100644 Binary files a/spacecraft-steelbore-standard.zip and b/spacecraft-steelbore-standard.zip differ diff --git a/spacecraft-steelbore-standard/SKILL.md b/spacecraft-steelbore-standard/SKILL.md index 7f86543..398fe2e 100644 --- a/spacecraft-steelbore-standard/SKILL.md +++ b/spacecraft-steelbore-standard/SKILL.md @@ -8,7 +8,7 @@ description: > Spacecraft Software-umbrella project — even if the user doesn't explicitly mention the Standard. If the user mentions "Spacecraft Software", a Spacecraft Software subproject name, or asks you to work on anything in the Spacecraft Software ecosystem, consult this skill immediately. It encodes - The Steelbore Standard v1.50 (§13 design systems; §3.1.1 TypeScript; §5.7 AGENTS.md; §6.4 contribution targets; §5.6 skill packaging; §11 palettes + §11.6 system theme; §18 accessibility; §17 progress reporting; §3.2 compiler flags; concurrency; §3.3 security-by-design) so + The Steelbore Standard v1.51 (§13 design systems; §3.1.1 TypeScript; §5.7 AGENTS.md; §6.4 contribution targets; §5.6 skill packaging; §11 palettes + §11.6 system theme; §18 accessibility; §17 progress reporting; §3.2 compiler flags; concurrency; §3.3 security-by-design) so you never need to ask for it or have it attached to a prompt again. license: GPL-3.0-or-later maintainer: Mohamed Hammad @@ -17,7 +17,7 @@ website: https://Construct.SpacecraftSoftware.org/ # The Steelbore Standard — Compliance Reference -**Version:** 1.50 | **Date:** 2026-08-22 | **Author:** Mohamed Hammad +**Version:** 1.51 | **Date:** 2026-08-29 | **Author:** Mohamed Hammad **Maintainer:** Mohamed Hammad | **Contact:** [Mohamed.Hammad@SpacecraftSoftware.org](mailto:Mohamed.Hammad@SpacecraftSoftware.org) **Copyright:** Copyright (C) 2026 Mohamed Hammad & Spacecraft Software | **License:** GPL-3.0-or-later **Website:** [https://Construct.SpacecraftSoftware.org/](https://Construct.SpacecraftSoftware.org/) @@ -604,6 +604,36 @@ anywhere else. | GNU posture does not exempt | An artifact under the free-software/GNU posture (§1) still requires explicit maintainer authorization before anything is sent to GNU, the FSF, or Savannah. That posture yields this standard's identity clauses (§2, §11–§12, §15); it does not yield this one. | | Withdraw mistakes promptly | An outbound submission made without authorization MUST be closed or withdrawn as soon as it is discovered, and the incident recorded. | +### §6.5 — Text File Format (LF, UTF-8, final newline) + +Every text file in a Spacecraft Software source tree is a **POSIX text file**: +UTF-8 encoded, LF-terminated, and ending with a newline. §6.1 requires POSIX +compliance of the tools; this section requires it of the files those tools are +written in. + +**Mandatory rules — violation blocks shipping:** + +| Rule | Detail | +|------|--------| +| LF line endings | Lines terminate with **LF** (U+000A). CRLF and a lone CR are prohibited — in source, configuration, scripts, documentation, and CI definitions alike. | +| Final newline | Every text file ends with a newline. A file whose last line is unterminated is not a POSIX text file, and it makes every diff that touches the last line carry a spurious `\ No newline at end of file`. | +| UTF-8, no BOM | Text files are encoded UTF-8. A byte-order mark is prohibited: it breaks shebang lines, `#`-comment parsing, and every config reader that expects the first byte of the file to be content. | +| `.gitattributes` required | Every repository MUST ship `.gitattributes` at its root containing `* text=auto eol=lf`. This is the only mechanism that holds regardless of a contributor's `core.autocrlf` setting — which defaults to `true` on Windows and rewrites the working tree on checkout. Relying on per-clone Git configuration is not compliance. | +| `.editorconfig` required | Every repository MUST ship `.editorconfig` at its root with `root = true` and, under `[*]`, at minimum `charset = utf-8`, `end_of_line = lf`, and `insert_final_newline = true`. It carries the rule to editors that never consult Git. | +| CI gate | CI MUST fail when a tracked text file contains a CR byte. Both config files are advisory to the tools that read them; the gate is what makes the rule binding. `git grep -Il` needs no exclusion list — it skips binaries and honors `.gitattributes`, so a pinned exception is invisible to it. | +| Exceptions | Vendored upstream files keep their upstream line endings (§4.2 — preserve what you build on). Windows-native scripts invoked by `cmd.exe` (`.bat`, `.cmd`) MAY use CRLF where the interpreter requires it. A format whose specification mandates CRLF keeps it. Every such exception is pinned explicitly in `.gitattributes` (`*.bat text eol=crlf`) rather than left to chance. Binary files are unaffected — `text=auto` never touches them. | + +**Scope note.** This section governs *files on disk*, not *bytes on a socket*. +The CRLF that HTTP, SMTP, and the other line-oriented wire protocols require in +their framing is unaffected — a protocol implementation emits what its +specification demands. + +This is codification of existing practice rather than a new constraint: `anvil` +and `bravais` already carry `* text=auto eol=lf`, and `loran` and `caliper` +already carry the three `.editorconfig` keys. What §6.5 adds is that the +convention is now uniform and enforced rather than rediscovered one repository +at a time. + --- ## §7 — Shell Environment @@ -1763,6 +1793,7 @@ Before finalising **any** Spacecraft Software artifact, mentally verify: - [ ] **§5.6** Skill packaging: every `SKILL.md` `description` measures ≤ 1000 rendered characters (folded scalars counted as the loader sees them, not as raw lines); the cap is enforced by CI *and* by the command that produces the bundle, not only by a local git hook; every skill directory carries a `LICENSE` (§4.3 naming, byte-identical to the repo root, a regular file) and every bundle ships it — N/A for projects that ship no skills - [ ] **§5.7** Agent context files: `AGENTS.md` and `CLAUDE.md` both present at the repository root and version-controlled; `CLAUDE.md` is an `@AGENTS.md` import plus Claude-only content and restates nothing; neither file is gitignored; no credentials, private hostnames, or personal filesystem paths in either; managed blocks rendered into `AGENTS.md` only - [ ] **§6.1** POSIX-compliant CLI/system tools +- [ ] **§6.5** Text files are LF-terminated, UTF-8 without BOM, and end with a newline; `.gitattributes` (`* text=auto eol=lf`) and `.editorconfig` (`charset`, `end_of_line`, `insert_final_newline`) present at the repository root; CI fails on a CR byte in a tracked text file; CRLF exceptions (vendored upstream, `cmd.exe` scripts) pinned explicitly in `.gitattributes` - [ ] **§7** Shell scripts are POSIX-compatible; Nushell/Ion native variants provided where shell-native idioms are required; no Bashisms in shared scripts - [ ] **§8** Texinfo manual present for user-facing programs (`doc/.texi`); builds to `.info`, `.html`, and `.pdf`; `install-info` hook present in all three package manifests (§5.5) — N/A for scripts and internal tooling - [ ] **§9** PFA: no tracking, minimal permissions, local storage default diff --git a/spacecraft-steelbore-standard/references/CHANGELOG.md b/spacecraft-steelbore-standard/references/CHANGELOG.md index 839401b..365db1e 100644 --- a/spacecraft-steelbore-standard/references/CHANGELOG.md +++ b/spacecraft-steelbore-standard/references/CHANGELOG.md @@ -12,6 +12,8 @@ activation. The canonical record is the published Standard's own `standard/CHANGELOG.md` (extracted from §1 of the document itself in v1.37); this file mirrors it and must be synced to the same version and date. +- **v1.51 (2026-08-29):** **§6.5 added — Text File Format (LF, UTF-8, final newline).** The Standard has fixed the *content* conventions of a Spacecraft Software file for a long time — §8 makes Texinfo the canonical prose source, §14 fixes ISO 8601 and UTC for every timestamp, §4.3 fixes the SPDX header every file carries — and had never said how a text file is *terminated*. The only encoding statement anywhere in the document was `@documentencoding UTF-8` in its own masthead, governing exactly one file. The convention nevertheless existed, unwritten: a survey of the umbrella found four repositories that had each arrived at it independently — `anvil` and `bravais` shipping `.gitattributes` with `* text=auto eol=lf`, `loran` and `caliper` shipping `.editorconfig` with `charset = utf-8`, `end_of_line = lf`, and `insert_final_newline = true`. Four out of roughly ninety-nine, with nothing making the remaining ninety-five follow, so the convention was being rediscovered one repository at a time by whichever contributor happened to hit the failure. **The failure is silent where it originates and expensive where it lands.** Git's `core.autocrlf` defaults to `true` on Windows, so a contributor cloning a repository without `.gitattributes` gets a working tree rewritten to CRLF on checkout; their editor shows nothing unusual, their change looks like the change they made, and the commit that leaves their machine rewrites every line of every file they touched. The reviewer receives a whole-file diff with the actual edit buried in it, and the cost is paid entirely on the review side. **§6.5 states three rules about the file itself.** Lines terminate with **LF** (U+000A), CRLF and a lone CR prohibited across source, configuration, scripts, documentation, and CI definitions alike. Every text file **ends with a newline** — a file whose last line is unterminated is not a POSIX text file and makes every diff that touches the last line carry a spurious `\ No newline at end of file`. Files are **UTF-8 without a BOM**, prohibited rather than merely discouraged because the mark breaks shebang lines, `#`-comment parsing, and every config reader written to expect the first byte to be content. The three are stated together because they are the three keys the same two config files set. **Both config files are mandatory, and the asymmetry is deliberate.** `.gitattributes` carrying `* text=auto eol=lf` is the only mechanism that holds *regardless of a contributor's Git configuration* — it travels with the repository, so it governs the Windows clone whose `core.autocrlf` nobody will ever inspect; documenting a required `git config` in a CONTRIBUTING file is not compliance, it is a request. `.editorconfig` is required alongside it because it reaches the other half of the problem: editors that never consult Git at all, where the file is created wrong before Git ever sees it. **The CI gate is what makes the section binding** — both config files are advisory to the tools that read them, so CI MUST fail when a tracked text file contains a CR byte; `git grep -Il` suffices and needs no exclusion list, since it skips binaries and honors `.gitattributes`, making a pinned exception invisible to it. **Exceptions are pinned, never implicit**: vendored upstream files keep their upstream line endings (§4.2, which already governed every other aspect of a carried file), `cmd.exe` scripts (`.bat`, `.cmd`) may use CRLF where the interpreter requires it, and a format whose specification mandates CRLF keeps it — each written into `.gitattributes` as its own line rather than left to whatever the tree happens to contain, because an unpinned exception is indistinguishable from a violation and the gate cannot tell them apart either. **Two things are out of scope.** The section governs files on disk, not bytes on a socket: the CRLF that HTTP, SMTP, and the other line-oriented wire protocols require in their framing is untouched. And it is codification rather than a new constraint — the four repositories above are already compliant, and what §6.5 adds is that the convention is uniform and enforced instead of independently rediscovered. §6 is its home because §6.1 already lives there and POSIX defines a text line as one ending in a single newline, which makes LF the POSIX rule rather than a house preference. §14's checklist gains a §6.5 row. This is the skill-side sync of Standard PR #31; the Standard repository self-applied in that same PR, and this repository's own `.gitattributes`/`.editorconfig`/CI gate lands with the umbrella-wide rollout — one PR per repository, on the v1.50 precedent. This skill's own frontmatter `description` measures 987 characters under the §5.6 cap, unchanged — only the version number moved. + - **v1.50 (2026-08-22):** **§4.3 names the license file; §5.6 requires every bundle to carry it.** §4.3 already demanded a canonical, unmodified root license text but never named the file, and this repo had drifted into three spellings at once — `LICENSE`, `LICENSE.md`, `LICENSE-GPL` — one of which (`spacecraft-texinfo-document/LICENSE.md`) is a hand-written prose page containing no license text at all. The canonical name is now **`LICENSE`, with no extension**: GitHub's detector ranks an extensionless `LICENSE` above every extended form, and a canonical plain-text copy matches on its exact matcher rather than falling through to a fuzzy one — the Markdown-converted GPL currently in-tree drops to a fuzzy 99.24% and is, being reformatted, 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, and never inside a distributable sub-unit: archivers dereference symlinks by default, so a linked `COPYING` in a bundle ships the text twice. Where more than one license applies, each gets its own **`LICENSE.`** file (`LICENSE.GPL`, `LICENSE.MIT`) after GNU's `COPYING.LESSER` / `COPYING.RUNTIME` convention; texts are never concatenated, and the SPDX expression rather than 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 this 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 MUST carry a `LICENSE`, byte-identical to the repo root and verified by an automated gate (enforced equality is what keeps the copies one maintained text rather than the two independent copies §4.3 forbids), and it MUST be a regular file — a `../LICENSE` symlink dangles the moment a directory is packaged alone, which is exactly what bundling and the flake's per-skill `cp -r` do. REUSE is deliberately not invoked: `reuse lint` ignores files it recognizes as licenses by name and governs only `LICENSES/.`, so the rule rests on license verbatimness and GitHub detection instead. §14 checklist rows for §4.3 and §5.6 extended to match. This is the skill-side sync of Standard PR #29; the repo's own migration — renaming the in-directory license files, giving all 44 skills a `LICENSE`, repacking every bundle, and adding the equality gate — lands as its own PR. - **v1.49 (2026-08-16):** **Skill renamed: `spacecraft-standard-constitution` → `spacecraft-steelbore-standard`.** The skill now carries the document's own canonical name — "The Steelbore Standard" has been the document's stable name since the v1.8 reinstatement, and the skill id now says so instead of the generic "constitution". Skill ids are §2.2 functional identifiers, so no codename rule is engaged. The rename touches the directory, the frontmatter `name:`, both bundles (rebuilt under the new filename; the old-name `.zip`/`.skill` are removed), the `README.md` §2 catalogue row and `nix build` example (the flake derives outputs from `readDir`, so no flake change), `AGENTS.md`, `CONTRIBUTING.md`, `REUSE.toml`, the CI cross-reference checker's version-pin exemption list (`check-skill-refs.py` — load-bearing: without it the renamed skill loses its exemption and CI fails), and every sibling skill that cross-references this one (fifteen skills plus the grok- and android-catalogue READMEs). Historical changelog entries keep the name that was current when they were written. The Standard-side rename (four in-document references, changelog header pointer, `AGENTS.md`) lands as its own PR at this same version and date — as v1.44 recorded, a cross-reference is normative content and renaming a skill is a two-repo edit. Same-day bump with different content, so it increments past v1.48 rather than sharing it. No rule changes. This skill's own frontmatter `description` measures 988 characters under the §5.6 cap, unchanged — only the version number moved.