| name | spacecraft-standard-constitution |
|---|---|
| description | The authoritative compliance reference for ALL work on Spacecraft Software-umbrella projects and subprojects (Zamak, Bravais, Ferrocast, Craton, Ironway, Caliper, Mawaqit, and any future projects). ALWAYS load this skill before writing code, documentation, specifications, architecture decisions, UI designs, naming choices, or any other artifact for a 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.33 (§18 accessibility; §17 progress reporting; §3.2 compiler flags; concurrency; §3.3 security-by-design; §8 Texinfo; §7 Shell Environment) 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 <Mohamed.Hammad@SpacecraftSoftware.org> |
| website | https://Construct.SpacecraftSoftware.org/ |
Version: 1.33 | Date: 2026-07-24 | Author: Mohamed Hammad Maintainer: Mohamed Hammad | Contact: Mohamed.Hammad@SpacecraftSoftware.org Copyright: Copyright (C) 2026 Mohamed Hammad & Spacecraft Software | License: GPL-3.0-or-later Website: https://Construct.SpacecraftSoftware.org/
This skill encodes The Steelbore Standard in full. Apply every applicable section to any artifact you produce under the standard. The 15-point compliance checklist in §16 is your audit gate — run through it mentally before finalising any output.
License note: This skill is
GPL-3.0-or-later(skills are software-class, §4.1.1). The published Standard document it encodes is licensedCC-BY-SA-4.0.
Changelog: see references/CHANGELOG.md for the full version history.
The Steelbore Standard defines the engineering principles, compliance requirements, and design conventions that govern all software produced under Spacecraft Software. The umbrella encompasses two categories of work: Steelbore OS — the operating system and all OS-specific artifacts (configurations, themes, OS tooling) — and independent Spacecraft Software projects such as Zamak, Ironway, Ferrocast, and Caliper, which are designed to work with Steelbore OS but are not OS-specific and may run on any compliant platform. Both categories are full citizens of Spacecraft Software and subject to this standard in full. Where a project-specific specification conflicts with this standard, the stricter of the two requirements shall prevail.
Precedence over guidance skills. This Standard is the supreme authority for every Spacecraft Software project. The convention- and language-guidance skills — gnu-coding-standards, the *-guidelines language skills, and the like — are subordinate: they supply idiom, craft, and (for gnu-coding-standards) GNU interoperability conventions where this Standard is silent, and where any of them conflicts with this Standard, this Standard prevails. The one deliberate exception is an artifact whose goal is to be GNU-compliant — an official GNU package, upstreamed to GNU/FSF, or hosted on Savannah — whose GNU/FSF requirements flatly oppose this Standard's identity clauses (§2 naming, §11–§12 branding, §15 attribution, GitHub hosting). Such an artifact MAY adopt the free-software/GNU posture (the self-sufficient gnu-free-software skill); under it those identity clauses yield, while this Standard's GNU-silent clauses — §6.3 signed commits, §14 UTC dates, §3.3 security-by-design — still apply and stack. Absent that posture (the default for every Spacecraft project), this Standard governs in full and GNU conventions are adopted only where they aid interoperability (the GNU-compatible posture; see gnu-coding-standards).
Standard name vs. project naming. "The Steelbore Standard" is the canonical, stable name of this standard. It is independent of the projects it governs and of the umbrella organization name — the standard retains this name regardless of any future renames. The v1.7 umbrella rename (Steelbore → Spacecraft Software) and the v1.8 reinstatement of this standard's name are recorded in the changelog. Versioning of project codenames (see §2) and versioning of the standard are separate concerns.
All new project codenames, module identifiers, and public-facing component names must draw from one of the following domains:
-
Real aerospace and astronomy — orbital mechanics terms, propulsion concepts, named missions/programs, stellar objects and phenomena, observatories.
-
Science-fiction franchises with space / AI / cybernetic themes — naming is meant to be enjoyable as well as fitting. The following are explicitly endorsed canonical sources:
- 2001: A Space Odyssey, The Matrix, Terminator — the original canonical trio
- The Hitchhiker's Guide to the Galaxy — also a rich vein for in-jokes (Vogon, Marvin, 42, Babel fish, Heart of Gold)
- Hackers (1995)
- Spielberg films (Close Encounters of the Third Kind, E.T. the Extra-Terrestrial, A.I. Artificial Intelligence, Minority Report, Ready Player One, etc.)
- Ghost in the Shell
- Equilibrium
- Dune
- Æon Flux
- Super 8
- LOST (TV series)
- Cloverfield films
- Robot / android names from any sci-fi film or franchise (e.g., HAL, Data, Bishop, T-800, GERTY, TARS, Marvin)
Other franchises (e.g., Alien, Blade Runner, Ex Machina) remain acceptable if they fit the space-machine-AI register.
-
Generic sci-fi / AI vocabulary — hyperspace, neural, cybernetic, synthetic, sentinel, oracle, daemon, vector, lattice (the lowercase common noun), etc.
| Category | Examples | Domain |
|---|---|---|
| Projects | Apollo, Discovery, Skynet, Trinity | Missions / Ships / AI Machines |
| Modules | Apogee, HAL, Cortex, Sentinel | Subsystems / AI Cores |
| Utilities | Boost, Throttle, Trace, Telemetry | Operational Verbs / Telemetry |
| Releases | Vega, Pulsar, Quasar, Nebula | Stellar Phenomena |
Names must be fitting for space-related and futuristic AI machines — the test is whether the name would feel at home on the hull of a spacecraft or in the boot banner of an AI machine. Reject proposed names that don't pass this test.
Projects named before the v1.2 convention drew from metallurgy, materials science, and industrial forging. These names are preserved as-is unless explicitly renamed by the maintainer. The v1.2 convention applies prospectively — no forced back-rename.
| Codename | Status | Description |
|---|---|---|
Steelbore |
Renamed to Spacecraft Software (umbrella, v1.7) | Former umbrella organization name. Renamed 2026-05-15 under the v1.7 brand consolidation. The OS line (Steelbore OS, Steelbore OS Bravais, Steelbore OS Lattice) retains the Steelbore name. |
Aetheric |
Deprecated | Next-generation extensible text editor (Pulsar + Quasar + Nebula IPC). Superseded by another project. |
Zamak |
Active | Rust bootloader (Limine rewrite) |
Bravais |
Completed (renamed) | NixOS flake configuration. Renamed from Lattice due to collision with Lattice OS. Bravais is still a metallurgical-era name (Bravais lattice) and predates the v1.2 convention. |
Ferrocast |
Deprecated | Rust PowerShell rewrite (16-crate workspace). Superseded by another project. |
Craton |
Reserved | Rust universal package manager — codename registered; no work started yet. |
Ironway |
Active | Rust OpenTTD rewrite |
Caliper |
Active | Rust raster-to-vector tracing engine (CLI+TUI) |
Mawaqit |
Planning (Pending rename) | Islamic prayer times app (Flutter + Rust CLI + libmawaqit). To be renamed under the v1.2 aerospace/sci-fi/AI convention. |
Anvil |
Completed | Rust workspace; benches and CHANGELOG; legacy forging-tool name. |
Flux |
Completed | Rust workspace; CHANGELOG and deny.toml; legacy metallurgical-flux name. |
Pearlite |
Active | Rust workspace; audit.toml, clippy.toml, CHANGELOG; steel microstructure name. |
Ferrite_OS |
Active | Custom OS / DOS-emulation experiments; ferrite (iron-based material) name. |
Forge |
Active | Production flavor tooling (forge-cli, forge-build, forge-activate); forging-tool name. |
Existing legacy-named projects MAY be renamed under the v1.2 convention at the maintainer's discretion — renames are optional. When a rename happens, update this table and §15.1's subdomain table in the same commit.
Skill directory names and SKILL.md name fields are functional identifiers
(e.g., spacecraft-standard-constitution, spacecraft-document-format) and are not subject to
the §2 codename convention. §2 reserves codenames for projects/modules/utilities/releases,
not for skill identifiers.
A higher-numbered priority may never compromise a lower-numbered one.
Software must behave predictably and remain correct under sustained and adverse conditions. Stability is the foremost priority. Memory safety is the single most important contributor to stability and the primary means of achieving it — but it is not the whole of Priority 1.
Memory safety (primary lever):
- Preferred language: Rust — governed by the Spacecraft Software Rust Guidelines.
→ Always load the
microsoft-rust-guidelinesskill before writing any Rust code. - When Rust is not viable (Flutter/Dart, Zig, etc.), mandatory mitigations:
- ASLR (Address Space Layout Randomization) on all compiled binaries
- CFI (Control-Flow Integrity) wherever the toolchain supports it
- Memory-Safe Languages (MSLs) are always preferred. If an MSL alternative exists, it must be chosen unless a documented technical exemption is filed.
Beyond memory safety, stability also requires:
- Robust error handling — failures must be surfaced and handled, never silently
swallowed; no panics /
unwrap/expecton untrusted or fallible input in production paths. - Fault tolerance and graceful degradation — components must survive partial failure, degrade gracefully under load or dependency loss, and recover rather than crash.
- Verified by testing — stability properties must be backed by tests (unit, integration, and fuzz/property where applicable) gating CI, not asserted by inspection alone.
Performance is the foremost priority after stability. Modern hardware universally provides multi-core, multi-thread capability; harnessing that concurrency is the primary means of achieving performance. Concurrency is not an afterthought — it must be considered from the ground up, throughout architecture design: data ownership, thread boundaries, synchronization points, and parallelism opportunities must be identified during design, not discovered during optimization.
Concurrency is adopted where it genuinely advances performance. It is abandoned where it degrades performance (synchronization overhead, lock contention, or inherently serial / small workloads) or where it would compromise Priority 1 (Stability). When a serial or simpler approach outperforms or is safer, it must be chosen and the trade-off documented.
- Release builds should use CPU-optimized flags —
-march=native, LTO, PGO — where the toolchain and target support them reliably. Every applied flag must be explicitly noted (e.g., a comment in the build file or a build-time message); every disabled flag and the reason for disabling must be equally noted. Visible flag state at compile time makes errors traceable to a specific flag. Any flag known to break or destabilize a build on a given platform/toolchain/linker (e.g., LTO under certain NixOS, cross-compilation, or static-linking setups) MUST be disabled. Stability (P1) outranks Performance (P2) — never ship a broken build for the sake of a flag. - Benchmarking is mandatory before and after any optimization work; regressions must be documented and justified — and it is the evidence by which the concurrency-vs-serial trade-off above is decided.
Compiler and linker optimization flags are not universally portable across operating systems and distributions. Just as systemd-specific settings do not apply to non-systemd distros (e.g., GNU Guix System, Void Linux, Gentoo with OpenRC), linker and LTO flags must be adapted to the target platform's toolchain layout.
NixOS / Steelbore OS Bravais: Because NixOS isolates packages in the /nix/store,
GCC's LTO plugin is not on the standard linker search path. When using -flto (Link Time
Optimization) on NixOS, you must explicitly point GCC's linker to the GCC LTO plugin
via -fuse-ld=mold (preferred) or -fuse-ld=bfd (fallback). Without this, LTO-enabled
builds will fail to link.
Rule: Whenever recommending or applying compiler/linker flags — especially
-flto,-march=native, or PGO — verify whether the target OS requires supplementary flags or alternative linker selection. Document the OS-specific requirements alongside the flags.
- Kernel hardening (XanMod, grsecurity profiles) where applicable.
- Sandboxing and privilege separation for all network-facing components.
- Post-Quantum Cryptography (PQC) readiness: all crypto subsystems must support
PQC migration paths. Use hybrid schemes (classical + PQC candidate) where library
support exists. Adopt NIST-finalized PQC standards within one major release cycle.
- Current targets: ML-KEM-768, ML-DSA-65 (as used in Ferrocast)
- Dependency auditing:
cargo-auditor equivalent before any third-party crate inclusion.
Cardinal Rule: Any optimization that weakens stability (including memory safety) or security hardening must be rejected, no exceptions.
- License: strong copyleft — each project chooses
GPL-3.0-or-laterorAGPL-3.0-or-later, whichever fits the project better:- Use
AGPL-3.0-or-laterwhen the software is network-facing — anything users interact with primarily over a network (servers, web services, SaaS, hosted APIs, multiplayer/network daemons). AGPL closes the "SaaS loophole." - Use
GPL-3.0-or-laterfor everything else (local CLIs, libraries, desktop/TUI apps, OS components, bootloaders). - GPLv3 and AGPLv3 are mutually compatible by design — an umbrella mixing both is fine.
- Use
- No proprietary, closed-source, or permissive-only license for core project code.
- Review & migrate (existing projects). Not merely prospective: existing projects are
to be reviewed and relicensed to whichever of
GPL-3.0-or-later/AGPL-3.0-or-laterbest fits them (AGPL for network-facing). Migration is the maintainer's per-project decision on that project's own signed commit; a deliberately retained non-best-fit license must be documented.
The GPL/AGPL choice above governs software. License by artifact class:
| Artifact class | Default license |
|---|---|
| Software — code, manifests, build tooling, and skills | GPL-3.0-or-later (or AGPL-3.0-or-later if network-facing, §4.1) |
Documents — specifications, prose guides, books, and document deliverables (per spacecraft-document-format), incl. the published Standard |
CC-BY-SA-4.0 by default (CC-BY-4.0 when intended for maximal reuse) |
| Third-party-derived artifacts | Preserve the upstream license per §4.2 (e.g., MIT, GFDL-1.3-or-later) — never relicensed to the project default |
Skills are software-class → GPL-3.0-or-later (no skill is network-facing → no AGPL).
Deliberate split for the Standard: the published Standard document is CC-BY-SA-4.0,
while this spacecraft-standard-constitution skill encoding is GPL-3.0-or-later.
When a project incorporates, adapts, or links third-party code, it MUST satisfy that upstream's license in full — independent of the project's own GPL/AGPL choice:
- Preserve verbatim all upstream copyright notices, license texts,
NOTICE/AUTHORSfiles, and in-file license headers — never strip, rewrite, or relicense them. - Ship each distinct upstream license text in the project's
LICENSES/directory (§4.3). - Verify compatibility of the upstream license with the project's GPL/AGPL license before inclusion.
- This is the legal/mechanical obligation; §15.3's
CREDITS.mdis the human-readable narrative counterpart. When both are triggered, both apply.
Spacecraft Software follows the REUSE specification for
unambiguous, machine-readable license and copyright metadata. Every project MUST be
reuse lint-clean.
Every file carries two SPDX tags — copyright and license:
// SPDX-FileCopyrightText: 2026 Mohamed Hammad <Mohamed.Hammad@SpacecraftSoftware.org>
// SPDX-License-Identifier: GPL-3.0-or-later
(Substitute the project's actual license — GPL-3.0-or-later or AGPL-3.0-or-later —
and the correct comment syntax for the file type.)
- Software source files (
.rs,.ts,.js,.py,.sh,.ps1,.go, etc.) and project manifests (Cargo.toml,package.json,flake.nix, etc.) carry both tags as an inline header. - Files that cannot carry an inline header — documents (
.odt,.docx,.pdf, …), images, binary assets, generated files — are covered by a.licensesidecar file or an entry in the repo-rootREUSE.toml. No file is left uncovered (this replaces the former blanket "documents are exempt" rule). LICENSES/directory: verbatim text of every license used lives inLICENSES/<SPDX-id>.txt(e.g.,LICENSES/GPL-3.0-or-later.txt,LICENSES/AGPL-3.0-or-later.txt, plus any upstream licenses per §4.2). A rootLICENSEfile MAY remain as a pointer for GitHub's license detection.- CI gate:
reuse lintMUST pass before shipping.
When writing or reviewing any file, confirm REUSE coverage; when generating a new file,
add the two-tag header (or the .license sidecar / REUSE.toml entry for files that
can't carry one).
Spacecraft Software is a personal hobby project. This posture is the default for every project under the umbrella and is non-negotiable. Individual projects may adopt a more open posture (see §5.3) but never a more closed one.
§4 defines the formal license; this section defines the stated stance that sits alongside it. License says what the user may do; posture says what they should expect from the maintainer.
| Aspect | Default |
|---|---|
| Audience | Maintainer's own use case |
| Pace | Hobby pace; no service-level commitments |
| Warranty | None — provided AS IS |
| Liability | None — see project NOTICE.md |
| Contributions | Welcome but not guaranteed to be accepted |
| Forking | Encouraged |
| License | GPL-3.0-or-later or AGPL-3.0-or-later, per §4.1 (formal terms govern in any conflict) |
Every Spacecraft Software project repository must ship the following files at its root, derived from the canonical Spacecraft Software templates:
| File | Purpose |
|---|---|
README.md |
Includes a "Project Posture" section linking to the two below |
NOTICE.md |
Full no-warranty / no-liability statement; defers to the project's GPL/AGPL license (§4.1) for binding terms |
CONTRIBUTING.md |
Contribution scope, PR-acceptance discretion, sign-off, security reporting, license-of-contributions |
LICENSES/ |
REUSE license directory (§4.3): verbatim text of every license used (GPL-3.0-or-later or AGPL-3.0-or-later, plus any upstream licenses per §4.2). A root LICENSE MAY remain as a GitHub-detection pointer. |
Customize only the project name, scope, and any project-specific carve-outs.
A project may declare itself intended for general use. When it does:
- The declaration MUST appear in that project's
README.mdposture section. - The no-warranty / no-liability stance from §5.1 still applies in full — general-use status changes audience and intent, not legal terms.
- General-use projects must hold a higher release-quality bar:
semantic versioning, maintained
CHANGELOG.md, deprecation policy, and a documented support window for the current major version.
General-use registry (keep in sync with §15.1 subdomain table):
| Project | Posture |
|---|---|
| Anvil-SSH | General-use |
| (all others) | Personal |
PR acceptance, feature scope, naming, architecture, and roadmap are at the maintainer's sole discretion. This is stated openly so contributors can calibrate effort accordingly. Rejection reflects fit, not quality.
Every released package must ship first-party package definitions for the following package managers, committed alongside the release:
| File | Package manager / format |
|---|---|
packaging/guix.scm |
GNU Guix — Scheme package definition |
packaging/default.nix |
Nix — Nix flake / derivation |
packaging/PKGBUILD |
Arch Linux — makepkg-compatible |
Rules:
- All three files MUST be present and buildable before a release tag is pushed.
- Each file must reference the exact release version and source archive SHA-256 checksum so that the package can be built reproducibly from the tagged release. Use the format native to each package manager:
- Guix (
guix.scm):(sha256 (base32 "<nix-base32-hash>"))inside theoriginstanza. - Nix (
default.nix):sha256 = "<sri-or-hex-hash>";inside thefetchurlorfetchFromGitHubcall. - Arch (
PKGBUILD):sha256sums=('<hex-hash>')array variable alongsidesource=().
- Guix (
- The
packaging/directory is tracked in the project's version-control repository alongside the source code. - These files are software-class artifacts and inherit the project's GPL/AGPL license (§4.1); each file must carry the standard SPDX two-tag header (§4.3).
- If a package manager's ecosystem imposes a stricter naming scheme or directory layout, comply with that scheme while still meeting the above requirements.
All CLI tools, daemons, and system utilities must be POSIX-compliant. Platform-specific extensions go behind feature flags and must not be required for core functionality.
Crypto subsystems must have migration paths to post-quantum algorithms. Current implementations should use hybrid schemes where library support exists.
Every commit pushed to a Spacecraft Software-controlled Git remote must be cryptographically signed and show "Verified" on the hosting platform's commit/PR view (GitHub today; Gitway or any future Spacecraft Software host inherits the same rule).
Mandatory rules — violation blocks shipping:
| Rule | Detail |
|---|---|
| All commits signed | commit.gpgsign=true configured globally. SSH signing (gpg.format=ssh) is the current default; GPG is acceptable. The signing key MUST be registered as a Signing key on the hosting platform — Authentication-only keys do not validate signatures. |
| Authorized signing identity | All commits from v1.12 onwards must be signed with the Mohamed.Hammad@SpacecraftSoftware.org key. The committer email and the signing key identity must both resolve to Mohamed.Hammad@SpacecraftSoftware.org. Commits predating v1.12 are exempt from this requirement. |
| Hosting-platform "Verified" required | Every commit on a Spacecraft Software remote must show "Verified" on the platform's commit/PR view. Unsigned or "Unverified" commits MUST be remediated (re-signed via rebase or amend by the original author) before merge to a default branch. |
| Programmatic commits signed too | Bots, CI pipelines, scripted commits, and assistant-driven commits inherit the same rule — no --no-gpg-sign, no signing-disabled subshells. The signing pipeline runs unattended. |
| Rewrites preserve signatures | Rebase, amend, cherry-pick, and squash MUST re-sign each resulting commit. Don't push history that lost signatures through rewriting. |
| Local verification is best-effort | git log --show-signature may report "No signature" on a given host when ~/.ssh/allowed_signers is not populated — this is a local-verifier gap, not a signing failure. The hosting platform's "Verified" badge is authoritative. |
Algorithm note: Ed25519 SSH signing is the current default. §6.2 calls for PQC readiness across the cryptographic surface; commit-signing algorithm migration is gated on hosting-platform support for post-quantum key formats. When GitHub (or Spacecraft Software's own Gitway) accepts PQC signing keys, Spacecraft Software commits migrate accordingly.
Spacecraft Software tooling, documentation, and CI pipelines target four first-class shell environments: Nushell, Ion, Brush, and Bash. All four are equally supported; none is deprecated or downgraded.
| Rule | Detail |
|---|---|
| Default: POSIX-compatible | Shell scripts in source trees, CI pipelines, Makefile targets, and documentation examples must be written to the POSIX sh subset unless a shell-native feature is required. POSIX scripts run correctly in Bash and Brush without modification. |
| Nushell / Ion native variants when needed | When a task cannot be expressed cleanly in POSIX sh (structured data pipelines, typed parameters, Nushell modules), provide a Nushell (.nu) and/or Ion-native variant alongside the POSIX version. Do not force POSIX-only idioms that degrade the Nushell or Ion experience. |
| No Bashisms in shared scripts | Bash-only extensions ([[ ]], (( )), process substitution <(...), ${var^^}, indexed arrays) are prohibited in files intended for all four shells. Bash-specific scripts are permitted only when explicitly scoped (e.g., #!/usr/bin/env bash shebang, clearly labeled). |
| Graceful shell detection | Tools that need runtime shell detection must inform the user or degrade gracefully rather than silently failing in non-Bash environments. |
Spacecraft Software user-facing projects should ship a Texinfo manual as the canonical technical reference. Texinfo is the preferred format for reference documentation that accompanies distributed software, following GNU project conventions.
| Project type | Requirement |
|---|---|
| CLI / TUI / GUI application with substantive user-facing functionality | MUST ship a Texinfo manual covering invocation, options, concepts, and examples |
| Library with a public API | SHOULD ship a Texinfo reference manual covering all public interfaces |
| Simple script / internal tooling | MAY skip; a well-structured README.md suffices |
- Source files use the
.texiextension (Texinfo 7.x+). - Manuals live at
doc/<project>.texiin the project root. - The project's top-level
Makefilemust expose three targets:make info,make html,make pdf.
Every Texinfo manual must include the following elements:
| Element | Purpose |
|---|---|
@dircategory / @direntry |
Registers the manual in the Info directory |
@copying block |
License statement and copyright notice |
@titlepage |
Title, version, author, and copyright |
@node Top + @top |
Required top-level node for Info readers |
@menu per chapter |
Navigation structure |
Build and ship all three output formats:
| Format | Tool | Purpose |
|---|---|---|
.info |
makeinfo / texi2any |
Info readers (Emacs, standalone info) |
.html |
makeinfo --html |
Project documentation website |
.pdf |
texi2pdf |
Printable reference |
Install .info files using install-info at package install time so they appear in the system Info directory.
Texinfo manuals are document-class artifacts (§4.1.1) and default to CC-BY-SA-4.0. GFDL-1.3-or-later is a permitted alternative when the manual is distributed alongside GPL-licensed software and compatibility with GNU documentation collections is desired. Include the chosen license in LICENSES/ per §4.3.
Package manifests must install the .info file and register it with install-info:
| Package manager | Requirements |
|---|---|
Guix (packaging/guix.scm) |
Add texinfo as a native input; run install-info in the install phase |
Nix (packaging/default.nix) |
Add texinfo to nativeBuildInputs; standard Autoconf/Make installPhase handles install-info automatically |
PKGBUILD (packaging/PKGBUILD) |
Add texinfo to makedepends; install -Dm644 for .info files; call install-info in post_install |
Every Spacecraft Software application must satisfy all three PFA requirements:
| Requirement | Rule |
|---|---|
| No Tracking/No Ads | Zero advertising, tracking, analytics SDKs, or telemetry beacons |
| Minimal Permissions | Only essential permissions; requested lazily at point of use, never eagerly |
| Local Storage | User data stored locally by default; sync is strictly opt-in, E2E encrypted |
When reviewing or designing any feature that touches data handling, permissions, or networking, verify all three PFA requirements are met.
All interactive applications must support both:
Scope. This chapter does not apply to projects registered as games under §18.5 — games are exempt from §10 in full, including the CUA and Vim rows below. Modal editing and text-editor chords are a poor fit for real-time play; a game's control scheme is entirely at the maintainer's discretion. §18.5 restates the useful parts as recommendations a game may decline.
| Scheme | Requirement |
|---|---|
| CUA | Standard bindings (Ctrl+C/X/V/Z/S) must work in all text input contexts |
| Vim | Modal editing layer (Normal / Insert / Visual mode) as opt-in feature. Minimum: hjkl navigation where full Vim layer is impractical |
Remappability (mandatory). Every binding must be user-remappable through the project's configuration layer — a fixed, non-configurable keymap is non-compliant.
Reserved assistive-technology chords. These are claimed by screen readers and must not be captured by a Spacecraft Software application:
| Chord | Claimed by |
|---|---|
Insert / CapsLock |
NVDA (Windows) — the NVDA modifier key |
Insert / KP_Insert |
Orca (GNOME/Linux) — the screen reader's own modifier |
Ctrl+Option |
VoiceOver (macOS) — the "VO" modifier |
Every action reachable by pointer must also be reachable by keyboard; focus order must be linear and the focused element visibly indicated. See §18.
The only permitted colors for Spacecraft Software interfaces and documents:
| Token | Hex | RGB | Role |
|---|---|---|---|
| Void Navy | #000027 |
RGB(0, 0, 39) | Background / Canvas |
| Molten Amber | #D98E32 |
RGB(217, 142, 50) | Primary Text / Active Readout |
| Steel Blue | #4B7EB0 |
RGB(75, 126, 176) | Primary Accent / Structural |
| Radium Green | #50FA7B |
RGB(80, 250, 123) | Success / Safe Status |
| Red Oxide | #FF5C5C |
RGB(255, 92, 92) | Warning / Error Status |
| Liquid Coolant | #8BE9FD |
RGB(139, 233, 253) | Info / Links |
#000027 (Void Navy) is the mandatory background for ALL Spacecraft Software surfaces.
No alternative background is permitted. This is non-negotiable.
Scope of the contrast guarantee. Every foreground token above passes WCAG AA against Void Navy (Molten Amber 7.64:1, Steel Blue 4.77:1, Radium Green 14.87:1, Red Oxide 6.74:1, Liquid Coolant 14.74:1). That covers foreground-on-background pairings only. Palette tokens paired with each other are mostly far below the 3:1 floor — Molten Amber on Red Oxide is 1.13:1; Radium Green on Liquid Coolant is 1.01:1 (indistinguishable). Therefore:
- Rendering palette-colored text on a palette-colored fill (chip, badge, filled button, selected row) is forbidden unless that specific pair is measured at ≥4.5:1 for text, or ≥3:1 for non-text UI boundaries.
- Color may never be the sole carrier of meaning — every colored status also carries a text tag or symbol (§18.2).
For document/file generation → load the spacecraft-document-format skill.
For IDE/terminal themes → load the spacecraft-theme-factory skill.
When building a new Spacecraft Software application (GUI, TUI, or web), all palette
references must be accessed through a named theme called Steelbore rather than
referenced as bare hex literals. The Steelbore theme is the canonical color contract:
| Theme token | Maps to palette token | Hex |
|---|---|---|
background |
Void Navy | #000027 |
foreground |
Molten Amber | #D98E32 |
accent |
Steel Blue | #4B7EB0 |
success |
Radium Green | #50FA7B |
error |
Red Oxide | #FF5C5C |
info |
Liquid Coolant | #8BE9FD |
Rationale: isolating palette references behind the Steelbore theme name makes it
trivial for end users to substitute a custom theme without touching application logic —
swap the theme, not every hex literal.
- The theme file/module must be named
steelbore(snake_case) in the project's theme registry, configuration layer, or equivalent (e.g.,themes/steelbore.json,steelbore.toml, a RustTheme::Steelborevariant). - Hard-coding palette hex values directly in UI logic is forbidden for new apps. Use theme tokens exclusively.
- Existing apps are encouraged but not required to migrate; new apps are required.
steelbore is and remains the sole default theme. The variants below are
additive siblings in the same registry, selected only by explicit user action
or by the §18.1 accessible-mode toggle. They never alter, replace, or take
precedence over steelbore, and the §11 canonical palette is unchanged.
| Variant | Selected by | Behavior |
|---|---|---|
steelbore |
Default — always, unless overridden | Canonical §11 palette, unchanged |
steelbore-high-contrast |
§18.1 accessible mode, or explicit selection | Every role token lifted to ≥7:1 (WCAG AAA) on Void Navy |
steelbore-mono |
Explicit selection, or NO_COLOR |
4-bit ANSI only — defers to the user's terminal palette |
steelbore-high-contrast lifts only the two tokens that need it; tokens
already ≥7:1 carry over untouched:
| Theme token | Base token | Variant hex | Contrast |
|---|---|---|---|
background |
Void Navy | #000027 |
(canvas) |
foreground |
Molten Amber | #D98E32 |
7.64:1 |
accent |
Steel Blue | #7FAEDC |
8.73:1 |
success |
Radium Green | #50FA7B |
14.87:1 |
error |
Red Oxide | #FF8080 |
8.41:1 |
info |
Liquid Coolant | #8BE9FD |
14.74:1 |
Only accent (#4B7EB0 → #7FAEDC) and error (#FF5C5C → #FF8080) shift;
the other four are §11 values verbatim. Void Navy remains the background in every
variant — high contrast comes from lifting foregrounds, never from abandoning the
canvas. These two hexes are accessibility-derived lifts of existing role tokens,
not new brand colors, and may not be used outside the variant.
Acceptable font licenses: OFL, Apache 2.0, Ubuntu Font License, CC0-1.0
| Context | Font | License |
|---|---|---|
| Headings | Share Tech Mono | OFL |
| Body / Code | Inconsolata | OFL |
| Fallback | monospace (system) | N/A |
Never use proprietary fonts. When suggesting or using fonts in any Spacecraft Software artifact, verify they are available on Google Fonts or another FOSS-licensed repository.
- Material Design is the required component system for all graphical applications. Theme Material components with the §11 color palette.
- WCAG 2.2 Level AA contrast is the minimum for all color pairings. Any new color additions must be WCAG-verified before adoption, and the verification must state which pairing was measured (§11).
- Accessibility is governed by §18, which applies to CLI, TUI, and GUI alike. §13 is the graphical design system; §18 is the accessibility contract. Where the two overlap, §18 governs.
| Concern | Rule | Example |
|---|---|---|
| Date format | ISO 8601 only: YYYY-MM-DD |
2026-03-08 |
| Time format | 24-hour only: HH:MM:SS — AM/PM is never permitted |
14:30:00 |
| Timestamp | Combined ISO 8601 UTC: YYYY-MM-DDTHH:MM:SSZ |
2026-03-08T14:30:00Z |
| Timezone | UTC Z is the default and preferred primary for general-purpose, cross-system, and machine-readable timestamps. A project whose core domain is inherently local-time-bound (e.g., solar/prayer-time calculations) may declare local time as its primary record instead — a documented exception, not a free choice. See §14.2 and §14.2.1 | Z not +00:00 |
| Duration | ISO 8601 duration format only | PT1H30M not "1h 30m" |
| Units | Metric (SI) primary; imperial in parentheses only if locale requires | 100 km (62 mi) |
Apply these conventions to all generated code, documentation, comments, and any user-facing strings. Never output AM/PM time, non-ISO dates, or imperial-primary units.
UTC Z is the default and preferred timezone for stored, transmitted, logged,
and committed timestamps across Spacecraft Software projects. It is the
convention every project should reach for first — it keeps cross-project tooling,
sorting, and interchange simple and unambiguous. Under this default, the Z
suffix is required on primary timestamps, and local time expressed as a UTC
offset (e.g., 2026-05-24T13:34:55+03:00) may optionally accompany a UTC Z value
as a secondary, human-convenience field — but UTC Z remains the authoritative
record.
This is a strong default, not a universal mandate forced onto every domain regardless of fit — §14.2.1 documents the exception that lets a project whose domain is genuinely local-time-bound use local time as its primary record instead.
Rules for projects under the UTC Z default — apply unless a project has filed the §14.2.1 exception:
| Rule | Detail |
|---|---|
Z suffix required |
Every primary stored/transmitted timestamp MUST end with Z. 2026-03-08T14:30:00Z ✓. A companion local-time field with UTC offset is permitted alongside it. |
| No offset notation as replacement | Offset notation (+03:00, -05:00, etc.) is forbidden as a replacement for UTC Z. It is permitted only as an optional companion field alongside a Z-suffixed primary. |
| No bare local time in data | Local-time timestamps without timezone info are forbidden in files, databases, logs, API responses, and commits. |
Log entries use UTC + Z |
Every log line timestamp must be YYYY-MM-DDTHH:MM:SS.sssZ (millisecond precision encouraged). |
| Commit timestamps use UTC | GIT_COMMITTER_DATE and GIT_AUTHOR_DATE must be UTC when set programmatically. |
| File metadata written by Spacecraft Software tools | mtime/ctime written by Spacecraft Software tools must be UTC-sourced. |
A project whose core domain is fundamentally defined by local civil or solar
time — not by a moment in absolute (UTC) time — may declare local time as the
primary representation for that domain's data. Examples: prayer-time
calculations (Mawaqit), sunrise/sunset tables, local event or business-hours
scheduling. For data like this, the meaningful value is "06:14 local, at this
place" — collapsing it to a UTC instant first and treating that as authoritative
would misrepresent what the data actually is.
Conditions for the exception:
- Document it. The project's README or spec must state explicitly which data uses local time as primary, and the domain reason why — not developer or user convenience.
- Keep the default everywhere else. General-purpose machinery within the same project — logs, commit timestamps, internal cross-system APIs, telemetry — still follows the §14.2 UTC Z default. The exception covers the domain data itself, not the whole project.
- Preserve UTC derivability. Store or compute the IANA timezone (e.g.,
Africa/Cairo) alongside the local value, so a UTC instant remains derivable for interchange, comparison, and storage portability. - This is an exception, not an escape hatch. "Local time is more convenient" or "our users are mostly in one timezone" do not qualify — the domain itself must be inherently local-time-bound.
For projects under the UTC Z default (§14.2), local time expressed as a UTC offset is permitted as an optional companion to the UTC Z primary value — in human-facing display, in API responses (as an additional field, never replacing the UTC Z field), and in stored records where timezone context aids human readers. The UTC Z value is always present and always authoritative; the local-time companion is supplemental only. (A project operating under the §14.2.1 domain exception inverts these roles for its domain data — local time is primary there, with UTC kept derivable rather than displayed as authoritative.)
- The
--absolute-timeflag (defined inspacecraft-cli-standard§3) disables relative-time rendering but always renders as UTC, not local time. - If a future CLI wants to show local time in human mode, it MUST:
- Accept a
--tz <IANA-zone>flag (e.g.,--tz Africa/Cairo). - Render local time only to stdout in human mode — never in
--jsonoutput. - Always include the UTC value alongside the local rendering.
- Never persist or transmit the local-time rendering.
- Accept a
- JSON/machine output (
--format json/jsonl/yaml/csv) MUST always use UTC +Z.
Durations follow ISO 8601 duration notation:
| Format | Example | Meaning |
|---|---|---|
PTnHnMnS |
PT1H30M |
1 hour 30 minutes |
PnD |
P7D |
7 days |
PnYnM |
P1Y6M |
1 year 6 months |
Prose forms like "1h 30m", "90 minutes", "1.5 hours" are forbidden in
machine-readable output. They are acceptable in --help text only.
When writing Rust code that handles time:
| Concern | Rule |
|---|---|
| Crate choice | Use jiff (preferred) or chrono — never time 0.1.x |
| UTC type | jiff::Timestamp or chrono::DateTime<chrono::Utc> for all stored values |
| Local type | chrono::Local and jiff::Zoned (with non-UTC zone) are forbidden in serialized output |
| Serialization | Always serialize as "2026-03-08T14:30:00Z" (string, ISO 8601, Z suffix) |
serde |
Use #[serde(with = "...")] or a newtype that enforces UTC on deserialization |
SystemTime |
Acceptable for internal durations; convert to UTC ISO 8601 string before any output |
No NaiveDateTime in output |
chrono::NaiveDateTime has no timezone — forbidden in any serialized or logged value |
Maintainer: Mohamed Hammad Contact: Mohamed.Hammad@SpacecraftSoftware.org Copyright: Copyright (C) 2026 Mohamed Hammad & Spacecraft Software | License: GPL-3.0-or-later Website: https://SpacecraftSoftware.org/
Each Spacecraft Software project has a dedicated subdomain following the pattern
https://<ProjectName>.SpacecraftSoftware.org/. Use the project-specific URL in all
project-level outputs; use https://SpacecraftSoftware.org/ only for umbrella references.
When a new project is created, add its subdomain to this table immediately.
Every Spacecraft Software product must surface the following attribution in at least one
of: --help output, --version output, README, or About/Info screen.
Required attribution block:
Maintained by Mohamed Hammad <Mohamed.Hammad@SpacecraftSoftware.org>
Copyright (C) 2026 Mohamed Hammad & Spacecraft Software | License: GPL-3.0-or-later
https://<ProjectName>.SpacecraftSoftware.org/
(The License line shows the project's own license — GPL-3.0-or-later or AGPL-3.0-or-later per §4.1.)
Per-surface rules:
| Surface | Required content |
|---|---|
--version |
Maintainer name, project URL, copyright year |
--help |
Project URL and maintainer name (at footer) |
| README | "Maintainer" section: name, Mohamed.Hammad@SpacecraftSoftware.org, project URL |
| About / Info (GUI/TUI) | Maintainer name, project URL, copyright year |
| SPDX header | REUSE two-tag header (§4.3): SPDX-FileCopyrightText + SPDX-License-Identifier (GPL-3.0-or-later or AGPL-3.0-or-later) |
Specific rules:
- The contact email is always
Mohamed.Hammad@SpacecraftSoftware.org— never a personal domain, GitHub handle, or other address. - The copyright year reflects the year of first release or current year, or a range
(e.g.,
2025-2026) when a project spans multiple years. - Link text for project pages must use the full URL as the display text or a clear
label (e.g.,
[Gitway](https://Gitway.SpacecraftSoftware.org/)), never an opaque label. - For CLI
--versionoutput in human mode, the footer line format is:Maintained by Mohamed Hammad <Mohamed.Hammad@SpacecraftSoftware.org> https://<ProjectName>.SpacecraftSoftware.org/ - For CLI
--versionoutput in JSON/machine mode, include inmetadata:"maintainer": "Mohamed Hammad <Mohamed.Hammad@SpacecraftSoftware.org>", "website": "https://<ProjectName>.SpacecraftSoftware.org/"
- Email obfuscation in plain-text prose. In plain-text prose contexts (README body,
CONTRIBUTING.md, human-readable documentation) where the address is not a clickable
link,
Mohamed.Hammad [at] SpacecraftSoftware.orgis permitted as a scraper-resistant form.# Maintainer:lines in PKGBUILDs andSPDX-FileCopyrightTextheaders must always use the full address — those formats are parsed bymakepkg/pkgcheckandreuse lintrespectively, and obfuscation breaks them.
Spacecraft Software artifacts must give credit where credit is due. When a project
or skill substantially builds on third-party work, that credit appears
in a CREDITS.md at the artifact's root — <project-root>/CREDITS.md for
projects, <skill-name>/CREDITS.md for skills.
CREDITS.md is the inbound counterpart to §15.2's outbound attribution:
§15.2 tells consumers who maintains Spacecraft Software; §15.3 tells consumers whose
work Spacecraft Software stands on.
Triggers (any one obligates a CREDITS.md):
- Content adapted, derived, or copied verbatim from an external source under any license (permissive or copyleft).
- A library, framework, or specification whose ideas or implementation form a substantial conceptual basis for the artifact, beyond routine dependency use.
- Named prior art, research, or design work whose insights were borrowed.
Not triggered by (license metadata alone suffices):
- Routine package-manager dependencies whose
LICENSEfiles are surfaced mechanically via Cargo, npm, pip, Nix, etc. - Well-known standards and specifications (POSIX, RFC, ISO, GFM, ODF, OOXML) that the artifact conforms to but does not redistribute.
- Public-domain conventions and common idioms.
Required content per credited work:
| Field | Required | Example |
|---|---|---|
| Name | Yes | Microsoft Pragmatic Rust Guidelines |
| Author(s) | Yes | Microsoft Corporation |
| License | Yes | MIT License |
| Source URL | Yes | https://github.com/microsoft/rust-guidelines |
| Scope | Yes | One-line description of what was adapted/used |
A skill MAY keep a deeper, scope-limited attribution file inside its
references/ directory (typically references/ATTRIBUTION.md) when the
credit applies specifically to adapted reference content. The root
CREDITS.md remains canonical and should link down to any such deeper
file.
SPDX headers (§4) cover license compliance mechanically; CREDITS.md is
the human-readable narrative — who, what, and how the upstream work
shaped the Spacecraft Software artifact.
When implementing features or writing code based on a Product Requirements Document (PRD) or project plan, coding assistants and developers must continuously track and report progress. This reporting ensures transparency, early detection of drift, and alignment on the implementation status of key milestones.
Every progress report must include the percentage of completion for individual milestones, the overall progress of the Minimum Viable Product (MVP), and the total progress of the PRD.
Format template:
[Progress: ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▱▱▱▱▱▱] 70%
Milestones: M0: 100% | M1: 100% | M2: 70% | M3: 0% | M4: 0%
Product Status: MVP: 90% | PRD: 70%
The progress bar must use high-visibility Unicode block characters (e.g., ▰ for filled and ▱ for empty) to form a clean, static, 20-character visual representation of total PRD completion. Do not use legacy ASCII characters like # or - for the progress bar.
Progress must be reported:
- At the start of a coding task (initial estimate/baseline)
- At the completion of each logical component or milestone task
- When summarizing the work done at the end of a turn/message
Spacecraft Software applications must be usable by people who navigate by screen reader, by keyboard alone, or with low vision. This chapter is the accessibility contract for all application classes — CLI, TUI, and GUI — and supersedes §13's design-system framing wherever the two overlap.
Two-sided rule. Accessibility support is mandatory for the developer to implement and optional for the user to activate:
- Every Spacecraft Software application other than a project registered as a game (§18.5) MUST ship a working accessible mode. This applies to new and existing projects alike — no new-projects-only phase-in.
- Accessible mode is off by default. The default experience is the
Steelboretheme and standard rendering, entirely unchanged. Enabling accessibility never becomes a precondition for normal use, and shipping it never degrades the default.
Normative targets. WCAG 2.2 Level AA where the success criteria apply, and EN 301 549 clause 11 (non-web software) as the anchor for CLI and TUI, which WCAG addresses only indirectly. Clause 11 is the only normative text that speaks to terminal software; the European Accessibility Act has been enforceable since 2025-06-28.
Resolved once at startup from four sources. Precedence, highest first:
| Source | Form |
|---|---|
| 1. Command-line flag | --accessible / --no-accessible |
| 2. Environment | SPACECRAFT_A11Y=1 / SPACECRAFT_A11Y=0 |
| 3. Configuration | [accessibility] enabled = true in the project config |
| 4. Auto-detect hints | TERM=dumb, NO_COLOR, or GTK_MODULES containing gail:atk |
- A hint (source 4) may enable accessible mode, but never from an ambiguous
signal. An explicit
--no-accessible/SPACECRAFT_A11Y=0always wins. - Unset at every source ⇒ standard
Steelborerendering, unchanged. Silence is never read as consent to change the default presentation. - The resolved state and the source that decided it must be reported under
--verbose. - The toggle is a single switch governing §18.2 and §18.3 together. Per-feature accessibility flags fragment the contract and are not a substitute.
The constraint that shapes everything here: a terminal has no accessibility tree. No ARIA, no roles, no live regions. A screen reader reads the emulator's character grid, so a redraw-based interface produces re-reads and speech loops rather than useful speech. No terminal UI library provides accessibility — the application must supply a linear fallback itself.
Not gated behind the toggle; correctness requirements for all output, always:
- Color is never the sole carrier of meaning. Every colored status carries a
text tag:
[OK],[ERROR],[WARN],[INFO]. A red line reading only "failed to connect" is non-compliant;[ERROR] failed to connectis compliant. - No text on colored fills unless that pair is verified per §11.
- Diagnostics to
stderr, results tostdout— never interleaved into one visual block. NO_COLOR,FORCE_COLOR,CLICOLOR,TERM=dumbhonored with the precedence defined byspacecraft-cli-standard.
| Requirement | Rule |
|---|---|
| No animation | Spinners, marquees, blinking text, and progress animations become a single static line with monotonic progress (Working… 40%), rewritten at most once per second |
| No decorative art | ASCII art, banners, box-drawing decoration, figlet headers suppressed. Where art is informational, emit an equivalent text description — do not simply drop it |
| Linear output | Append-only, reads correctly top-to-bottom; blank lines separate logical sections for paragraph navigation |
| Tabular fallback | Every table offers a non-columnar rendering — one field: value per line — since alignment conveys nothing through speech |
| Prompt legibility | Prompts state question, choices, and default in plain text before awaiting input. Prompts relying on cursor positioning or redraw are non-compliant |
Any full-screen TUI MUST additionally provide a non-redraw, append-only stream mode reachable through the same §18.1 toggle: new state written as new lines rather than repainted regions, without taking over the alternate screen buffer.
Where a TUI would otherwise be the only way to perform an operation, an equivalent
non-interactive CLI path must exist — flags plus --json — so the operation
stays scriptable and reachable without navigating a visual grid. Per §8, document
it in the project's Texinfo manual alongside the interactive path.
| UI stack | Required bridge |
|---|---|
| Rust, custom-drawn UI | AccessKit (Apache-2.0) — one API over UI Automation (Windows), NSAccessibility (macOS), AT-SPI (Linux). Integrated in egui, Slint, Bevy, Freya, Xilem, winit |
| GTK 4 | GtkAccessible — WAI-ARIA roles and states over AT-SPI |
| Flutter | Semantics widgets and SemanticsRole |
| Qt | QAccessible |
Custom-drawn widgets are the failure case: a canvas-rendered control is invisible to assistive technology unless the application publishes its role and state explicitly. That is the gap AccessKit closes — hence required, not suggested, for Rust GUI work (§3.1 already makes Rust the preferred language).
- Every interactive element carries an explicit accessible name and role. Decorative elements are explicitly marked decorative so they are skipped.
- State changes that matter to the user are announced, not merely repainted.
- System reduced motion and high contrast preferences are honored independently of the §18.1 toggle — the user already expressed them system-wide.
- Keyboard reachability and focus visibility follow §10.
Verification — an accessibility claim is not satisfied by inspection:
- CLI/TUI: pipe accessible-mode output through a speech synthesizer (e.g.
espeak-ng) and confirm it is comprehensible heard rather than seen. Confirm the non-interactive path completes the same operations as the interactive one. - GUI: exercise with a real screen reader — Orca (Linux), NVDA (Windows), VoiceOver (macOS) — confirming every interactive element announces name and role.
- Contrast: measure the actual pairings used, not just foreground-on-background, and record the ratios (§11).
- Keyboard: complete every primary task without a pointing device.
Remediation for existing projects. §18 applies to every project immediately on
adoption of v1.33, so projects predating it are non-compliant until retrofitted.
Until a project conforms it MUST carry a dated remediation entry in
PROJECTS.md recording its accessibility state and intended remediation. An absent
entry is itself a compliance failure — a project may be unfinished, but it may not
be silently unfinished. Projects registered as games (§18.5) are excluded —
they owe no remediation entry, because they owe no conformance.
Projects registered as games are exempt from §18 in full and from §10 in full. Accessibility features in a game are optional: none is required, nothing is enforced, and their absence is never a compliance failure. A game may ship an elaborate accessibility suite, a single option, or nothing at all — entirely at the maintainer's discretion (§5.4).
Rationale: §18 is built on CLI, TUI, and GUI assumptions — a character grid, or a widget tree with roles and names. Games satisfy neither. They are real-time simulations rendering custom, non-widget interfaces where play itself is the purpose, and the accessibility techniques that suit them (remappable controls, colorblind-safe signalling, subtitles, difficulty options) are a different discipline from the one §18 codifies.
This is the only carve-out in §18, and it is narrow: it applies to registered projects, not to any project that merely has a playful or game-like interface.
A project is a game for the purposes of this Standard when both hold — the same declaration-plus-registry pattern as the §5.3 general-use carve-out:
- The declaration appears in the project's
README.md, alongside the §5.2 posture section. - The project is listed in the registry below.
Games registry (keep in sync with PROJECTS.md and the §2.1 registry):
| Project | Class |
|---|---|
| Ironway | Game — exempt from §18 and §10 |
| (all other projects) | Standard — §18 and §10 apply in full |
Suggestions, offered because they are low-cost and widely expected in games. A game may adopt any, all, or none; declining is not a compliance failure and needs no justification:
- Remappable controls — already standard practice in games, independent of accessibility.
- Leave screen-reader chords alone —
Insert,CapsLock,KP_Insert, andCtrl+Optionare claimed by NVDA, Orca, and VoiceOver. Capturing them collides with a screen reader the player may be running. - Colorblind-safe signalling — pair hue with shape, icon, or text.
- Subtitles and captions for spoken or plot-critical audio.
- Honor the system reduced-motion preference where the engine exposes it.
If a game chooses to ship an accessibility toggle, it should use the §18.1
names (--accessible, SPACECRAFT_A11Y) and the §11.1.1 theme-variant names
rather than inventing its own. This constrains only the naming of features the
game already decided to build — it requires no feature to exist.
Before finalising any Spacecraft Software artifact, mentally verify:
- §2 Aerospace/Sci-Fi/AI naming convention applied to all new identifiers; legacy (pre-v1.2) names preserved unless explicitly renamed
- §3.1 Stability: memory safety (Rust, or ASLR+CFI documented); robust error handling, fault tolerance, and test-verified
- §3.2 Performance: concurrency considered throughout architecture design; adopted where it advances performance, abandoned where it degrades performance or compromises Stability; serial trade-off documented; compiler optimization flags applied/disabled with explicit notation; benchmarking before/after
- §3.3 Hardened security; PQC readiness addressed
- §4.1 License is
GPL-3.0-or-laterorAGPL-3.0-or-later(AGPL for network-facing; per §4.1) - §4.2 Upstream copyright notices, license texts, and
NOTICE/AUTHORSpreserved verbatim; upstream licenses shipped inLICENSES/ - §4.3 REUSE-compliant: two-tag SPDX header (
SPDX-FileCopyrightText+SPDX-License-Identifier) on every file (or.licensesidecar /REUSE.tomlentry);LICENSES/directory present;reuse lintpasses - §5 Project Posture: README/NOTICE/CONTRIBUTING present; default personal-hobby stance applied; general-use carve-outs declared in project README
- §5.5 Package distribution:
packaging/guix.scm,packaging/default.nix, andpackaging/PKGBUILDpresent, buildable, and carrying correct version + SHA-256 checksum (in each package manager's native format) before any release tag is pushed - §6.1 POSIX-compliant CLI/system tools
- §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/<project>.texi); builds to.info,.html, and.pdf;install-infohook present in all three package manifests (§5.5) — N/A for scripts and internal tooling - §9 PFA: no tracking, minimal permissions, local storage default
- §10 CUA + Vim-like key bindings planned/implemented; bindings user-remappable; assistive-technology modifier chords (NVDA/Orca/VoiceOver) not captured — N/A for projects registered as games (§18.5)
- §11 Spacecraft Software color palette used; Void Navy background mandatory; new apps expose colors via a named
Steelboretheme (§11.1) — no bare hex literals in UI logic - §12 FOSS-licensed fonts only (Share Tech Mono / Inconsolata)
- §13 Material Design UI/UX; WCAG 2.2 AA verified, stating which pairing was measured
- §14 ISO 8601 dates; 24h time; UTC Z is the default primary timestamp (companion local time with UTC offset permitted, never a replacement) — unless the project filed the §14.2.1 domain exception for inherently local-time-bound data; ISO 8601 durations; metric units
- §15 Attribution present: maintainer name (
Mohamed Hammad), contact (Mohamed.Hammad@SpacecraftSoftware.org), and project URL in--version/ README / About - §15.3 Third-party work credited in
CREDITS.mdat project/skill root when triggers apply; deeperreferences/ATTRIBUTION.mdpresent where reference content is adapted from external sources - §17 Development progress tracked and reported continuously with milestone percentages, MVP, total PRD completion, and a Unicode progress bar
- §18 Accessible mode implemented and off by default; §18.1 toggle honored with correct precedence; status never color-only; no animation or decorative art in accessible mode; TUI ships a linear mode and a non-interactive CLI path; GUI publishes accessible names and roles (AccessKit for Rust); verified with a real screen reader; existing projects carry a dated remediation entry in
PROJECTS.mduntil they conform — N/A for projects registered as games (§18.5), which are exempt in full - §6.3 All commits to Spacecraft Software Git remotes cryptographically signed with the
Mohamed.Hammad@SpacecraftSoftware.orgkey and showing "Verified" on the hosting platform; rewrites preserve signatures; programmatic and assistant-driven commits signed too
If any item is not applicable to the current artifact type (e.g., color palette for a pure Rust library), note it as N/A rather than silently skipping it.
| Task | Load this skill |
|---|---|
| Writing any Rust code | microsoft-rust-guidelines |
| Writing or reviewing shell scripts | spacecraft-cli-shell + spacecraft-cli-preference |
| Generating DOCX / ODT / PDF on demand | spacecraft-document-format |
| Authoring or building a Texinfo manual | spacecraft-texinfo-document |
| Creating IDE / terminal themes | spacecraft-theme-factory |
| Implementing or auditing accessibility (§18) | spacecraft-accessibility-support |
| All other Spacecraft Software work | spacecraft-standard-constitution |
— Built by Spacecraft Software —