Skip to content

Commit 2ad1eff

Browse files
UnbreakableMJclaude
andcommitted
chore: rename Steelbore → Spacecraft Software + test-kernel TSC instrumentation
Rebrands the umbrella organization across docs and code from "Steelbore" to "Spacecraft Software" and rolls every SFRS / PRD identifier from the `SB-` prefix to `SS-`. Touches: - Top-level context docs: AGENTS, CLAUDE, CONTRIBUTING, SKILL, TODO, CHANGELOG, and the PRD mirror. - In-source string references in zamak-cli (json/error/output/meta module headers + agent docs_url), zamak-core (gfx palette comment + tui menu title), zamak-bios (entry / trampoline module headers), zamak-stage1, zamak-theme. Folds in two adjacent changes that share the same touched files: - `zamak-test-kernel::main` now emits `KERNEL_ENTRY tsc=<u64>` before the existing `ZAMAK` / `LIMINE_PROTOCOL_OK` sentinels via a new `rdtsc()` helper. Lets M6-3 Part 2 compute bootloader-overhead deltas by capturing the same kernel under ZAMAK vs Limine v10.x and subtracting the absolute TSC values. Additive output — existing boot-smoke / linux-bzimage sentinel asserts are unaffected. CHANGELOG `[Unreleased]` entry added. - `.gitignore`: `/dist/` (M6-3 Part 2 baseline staging) and `tmp.txt`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6f2838b commit 2ad1eff

23 files changed

Lines changed: 215 additions & 72 deletions

File tree

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@ target/
1010
*.obj
1111
*.o
1212

13+
# M6-3 Part 2 baseline staging (local-only, scp'd to test boxes)
14+
/dist/
15+
1316
# Antigravity/Internal
1417
.gemini/
1518

1619
# Claude Code session state + exported transcripts
1720
.claude/
1821
Chat.txt
22+
tmp.txt
1923
2026-*-this-session-is-being-continued-from-a-previous-c.txt
2024

2125
# IDEs

AGENTS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ OpenAI Codex CLI, Cursor, Aider, and similar tools.
1515
- **Type:** Rust bootloader (BIOS + UEFI, x86-64 / AArch64 /
1616
RISC-V 64 / LoongArch64)
1717
- **Status:** active development; reference PRD v1.3.0
18-
- **Organisation:** Steelbore
18+
- **Organisation:** Spacecraft Software
1919
- **License:** GPL-3.0-or-later on every source file
2020

2121
## Coding conventions
@@ -63,7 +63,7 @@ OpenAI Codex CLI, Cursor, Aider, and similar tools.
6363
## CLI conformance
6464

6565
Every host CLI binary (`zamak-cli` today, future ones the same)
66-
must conform to `SB-SFRS-STEELBORE-CLI v1.0.0`:
66+
must conform to `SS-SFRS-SPACECRAFT-SOFTWARE-CLI v1.0.0`:
6767

6868
- `--json` / `--format` / structured JSON error envelope on stderr
6969
- `schema` and `describe` sub-commands
@@ -84,7 +84,7 @@ Zamak/
8484
├── CHANGELOG.md # Keep-a-Changelog + ISO 8601 dates
8585
├── CLAUDE.md # Claude-Code-specific context
8686
├── AGENTS.md # (this file)
87-
├── SKILL.md # Steelbore skill manifest
87+
├── SKILL.md # Spacecraft Software skill manifest
8888
├── CONTRIBUTING.md # human-contributor guide
8989
├── zamak-core/ # shared no-std library
9090
├── zamak-cli/ # host CLI (dual-mode)

CHANGELOG.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,16 @@ All dates use ISO 8601 format (YYYY-MM-DD).
1212

1313
## [Unreleased]
1414

15+
### Changed
16+
17+
- `zamak-test-kernel` emits a `KERNEL_ENTRY tsc=<u64>` line on
18+
the Limine-Protocol entry point, before the existing
19+
`ZAMAK` / `LIMINE_PROTOCOL_OK` sentinels. Lets M6-3 Part 2
20+
compute bootloader-overhead deltas by capturing the same
21+
kernel under ZAMAK vs Limine v10.x and subtracting the two
22+
absolute TSC values. Additive output — existing
23+
`boot-smoke` / `linux-bzimage` sentinel asserts unaffected.
24+
1525
## [0.9.0] - 2026-04-28
1626

1727
Closes M1-16: end-to-end BIOS Limine-Protocol kernel boot under
@@ -390,7 +400,7 @@ bare-metal perf validation.
390400
- `zamak-uefi::paging` — arch-dispatching `build(boot_services, kernel) -> u64` that returns the per-arch root-table physical address (PML4 on x86, L0 on AArch64, Sv48 root on RISC-V, PGDH on LoongArch)
391401
- `zamak-uefi::main` refactored: deleted `stub_entry` and all `#[cfg(target_arch = "x86_64")]` gates on the shared boot path. Single arch-neutral entry point now dispatches through `paging::build` and `handoff::jump_to_kernel`. `cargo check --target aarch64-unknown-uefi` and `riscv64gc-unknown-none-elf` both clean.
392402
- `Permissions::KERNEL_LOAD_AREA` — RWX coarse preset for kernel-image mapping parity across arches until per-PHDR splitting is implemented
393-
- **SFRS dual-mode CLI**`zamak-cli` now conforms to `SB-SFRS-STEELBORE-CLI v1.0.0`:
403+
- **SFRS dual-mode CLI**`zamak-cli` now conforms to `SS-SFRS-SPACECRAFT-SOFTWARE-CLI v1.0.0`:
394404
- Global flags: `--json`, `--format <human|json|jsonl|yaml|csv|explore>`, `--fields`, `--dry-run`, `--verbose`, `--quiet`, `--color`, `--no-color`, `--yes`, `--force`, `--print0`
395405
- JSON envelope `{metadata:{tool,version,command,timestamp}, data:...}` via `OutputPolicy::emit`
396406
- Structured error envelope on stderr (`error.code/exit_code/message/hint/timestamp/command/docs_url/io_kind`) with stable `UPPER_SNAKE_CASE` codes
@@ -408,7 +418,7 @@ bare-metal perf validation.
408418
- Context files at `Zamak/` repo root: `CLAUDE.md`, `AGENTS.md`, `SKILL.md`, `CONTRIBUTING.md`
409419
- Integration test matrix in `zamak-cli/tests/sfrs_conformance.rs` covering exit codes, TTY/non-TTY, `AI_AGENT=1`, `--dry-run`, control-char rejection, UTF-8 encoding, ANSI suppression, JSON Schema shape, `describe` enumeration
410420
- Crate rename: `libzamak` -> `zamak-core`, `zamak-loader` -> `zamak-uefi` (PRD §4.1)
411-
- Converted all `.asm` files to `global_asm!` in Rust source files (Steelbore §3.2)
421+
- Converted all `.asm` files to `global_asm!` in Rust source files (Spacecraft Software Standard §3.2)
412422
- Added `rustfmt.toml` project formatting configuration
413423
- Added `deny.toml` for `cargo-deny` license and CVE auditing
414424
- Added `CHANGELOG.md` (Keep a Changelog format)

CLAUDE.md

Lines changed: 97 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ needs to avoid re-discovering them from scratch.
1313

1414
**ZAMAK** is a Rust rewrite of the Limine bootloader targeting BIOS
1515
and UEFI on x86-64, AArch64, RISC-V 64, and LoongArch64. It is the
16-
second project of the **Steelbore** ecosystem. The canonical spec is
17-
`../ZAMAK_Bootloader_PRD_v1.3.docx.md` (SB-PRD-ZAMAK-001 v1.3.0).
16+
second project of the **Spacecraft Software** ecosystem. The canonical spec is
17+
`../ZAMAK_Bootloader_PRD_v1.3.docx.md` (SS-PRD-ZAMAK-001 v1.3.0).
1818
Implementation status lives in `../TODO.md`.
1919

2020
## Workspace layout
@@ -32,22 +32,72 @@ Multi-crate Cargo workspace rooted at `Zamak/Cargo.toml`:
3232
| `zamak-cli` | Host CLI (install, enroll-config, sbom, schema, describe, completions) |
3333
| `zamak-theme` | TOML theme parser |
3434
| `zamak-test` | QEMU integration-test harness |
35-
| `zamak-test-kernel` | Minimal Limine-Protocol test kernel |
3635
| `zamak-macros` | Proc-macros (`#[zamak_unsafe]`) |
3736

38-
## Build / test commands
37+
`zamak-test-kernel` and `zamak-linux-stub-kernel` are *excluded*
38+
from the workspace (`Cargo.toml:22`) so their nightly +
39+
`build-std` configs apply cleanly. Build explicitly with
40+
`cargo +nightly build --manifest-path <crate>/Cargo.toml --release`.
3941

40-
- `RUSTFLAGS='' cargo build` — default workspace build. `RUSTFLAGS=''`
41-
prefix is required because the shell env may carry
42-
`-C target-cpu=x86-64-v3`, which breaks RISC-V / LoongArch cross builds.
43-
- `RUSTFLAGS='' cargo test -p zamak-core -p zamak-theme -p zamak-cli` — unit tests
44-
- `RUSTFLAGS='' cargo test --workspace` — full workspace
45-
- `RUSTFLAGS='' cargo clippy --lib -- -D warnings` — lint
46-
- `cargo +nightly miri test -p zamak-core --lib` — Miri (nightly component required)
47-
- `./zamak-test/build-images.sh && RUSTFLAGS='' cargo run -p zamak-test -- --suite boot-smoke` — QEMU smoke
48-
- `cargo build --features tui -p zamak-cli` — CLI with TUI explore mode
42+
## Build / test commands
4943

50-
## Steelbore Standard invariants
44+
Mirror of what CI runs (`.github/workflows/ci.yml`):
45+
46+
```sh
47+
cargo fmt --all -- --check # fmt
48+
cargo clippy -p zamak-core -p zamak-proto -p zamak-theme \
49+
-p zamak-cli -p zamak-macros -p zamak-test \
50+
--all-targets -- -D warnings # host-runnable crates only
51+
cargo test -p zamak-core --lib -p zamak-theme -p zamak-cli # unit
52+
cargo test -p zamak-core --test proptests # property
53+
cargo miri-test # alias → +nightly miri test -p zamak-core --lib
54+
cargo deny check # licenses + advisories
55+
cargo build -p zamak-uefi --target <T> \
56+
-Z build-std=core,alloc,compiler_builtins \
57+
-Z build-std-features=compiler-builtins-mem # cross, T ∈ {x86_64-unknown-uefi,
58+
# aarch64-unknown-uefi,
59+
# riscv64gc-unknown-none-elf,
60+
# loongarch64-unknown-none}
61+
./zamak-test/build-images.sh && \
62+
cargo run -p zamak-test -- --suite <S> --timeout 60 # S ∈ {boot-smoke, linux-bzimage, asm-verification}
63+
cargo build --features tui -p zamak-cli # CLI with TUI explore mode
64+
```
65+
66+
Freestanding crates (`zamak-uefi`, `zamak-bios`, `zamak-stage1`,
67+
`zamak-decompressor`) are not in the clippy / unit-test sets; they
68+
build under `cross` against their real targets.
69+
70+
### Local build prerequisites
71+
72+
- **`RUSTFLAGS=''` prefix** is required if your shell exports flags
73+
incompatible with the cross targets — `-C target-cpu=x86-64-v3`
74+
is the common culprit, and `-Clink-arg=-z -Clink-arg=pack-relative-relocs`
75+
also breaks the UEFI link step (`rust-lld` in PE-COFF mode mis-parses
76+
`-z` as an unknown PE option). CI sets `RUSTFLAGS: -D warnings`
77+
globally in the workflow env (`ci.yml:25`).
78+
- **`cc` / `objcopy` / `ld` not on PATH** (e.g. plain login shell
79+
on NixOS, no `nix develop` / `nix-shell` active): wrap cargo
80+
invocations with
81+
`nix shell nixpkgs#gcc nixpkgs#binutils -c <cmd>`. The error
82+
surfaces as `error: linker 'cc' not found` from the
83+
`compiler_builtins` build script and blocks every `-Zbuild-std`
84+
build.
85+
- **`mtools` + `sfdisk` + `objcopy`** are required by
86+
`zamak-test/build-images.sh` (BIOS disk image assembly). CI
87+
installs them via `apt-get install -y qemu-system-x86 ovmf mtools`;
88+
locally on NixOS they're already on the system PATH except for
89+
`objcopy` (`binutils`).
90+
91+
### CI jobs
92+
93+
`fmt`, `clippy`, `test` (3-target matrix: Linux x86-64, Linux
94+
AArch64, macOS AArch64), `freebsd` (14.x via
95+
`vmactions/freebsd-vm`), `miri`, `deny`, `cross` (4 UEFI/none
96+
targets), `size-gate` (≤ 120 % of Limine v10.x baseline, §6.1),
97+
`qemu-smoke` (`boot-smoke` + `linux-bzimage`), `asm-verification`,
98+
and `sbom` (main-only, SPDX 2.3 via `zamak-cli sbom`).
99+
100+
## Spacecraft Software Standard invariants
51101

52102
These are **non-negotiable**. Violating any one of them is a blocking
53103
defect.
@@ -69,10 +119,14 @@ defect.
69119
- **Newtype address wrappers** (`PhysAddr`, `VirtAddr`, `Cr3Value`,
70120
`MairValue`, `SatpValue`) and `checked_add`/`checked_sub`/`div_ceil`
71121
on all address arithmetic.
122+
- **Binary-size budget.** Each bootloader artifact (`BOOTX64.EFI`,
123+
`BOOTAA64.EFI`, `BOOTRISCV64.EFI`, `zamak-bios.sys`) must stay
124+
≤ 120 % of the Limine v10.x baseline. CI `size-gate` enforces
125+
this; baselines live inline in `.github/workflows/ci.yml`.
72126

73127
## CLI: SFRS dual-mode contract
74128

75-
`zamak-cli` conforms to `SB-SFRS-STEELBORE-CLI v1.0.0`:
129+
`zamak-cli` conforms to `SS-SFRS-SPACECRAFT-SOFTWARE-CLI v1.0.0`:
76130

77131
- **Global flags** (every sub-command): `--json`, `--format <fmt>`,
78132
`--fields`, `--dry-run`, `--verbose`, `--quiet`, `--color`,
@@ -101,10 +155,34 @@ defect.
101155
(use `zamak-test` harness for those).
102156
- Keep commits small and scoped — one SFRS-N or M-N item per commit
103157
when possible.
158+
- Every user-facing change updates `CHANGELOG.md` and `TODO.md` in
159+
the *same* commit (per `CONTRIBUTING.md`). Releases roll
160+
`[Unreleased]``## [vX.Y.Z] - YYYY-MM-DD`.
161+
162+
## Companion docs
163+
164+
- `AGENTS.md` — safety-critical crates (`arch`, `entry`, `mbr`,
165+
`trampoline`, `handoff`, `protocol`) and the
166+
`zamak describe --json` live capability manifest.
167+
- `SKILL.md` — agent-facing CLI patterns (`--dry-run --json`
168+
preview, non-TTY → `--yes` / `--force`, `--format explore` TUI
169+
fallback).
170+
- `CONTRIBUTING.md` — PR checklist, unsafe-block contract format,
171+
and the `CHANGELOG.md` + `TODO.md` co-update rule above.
104172

105173
## Current milestone
106174

107-
See `../TODO.md` for the authoritative live status. At time of
108-
writing ZAMAK is past M0–M5 milestone scope; remaining work is
109-
gated on tagged release, FreeBSD CI runner, bare-metal perf
110-
validation, and the SFRS dual-mode CLI follow-ons.
175+
See `../TODO.md` for the authoritative live status. v0.9.0 closed
176+
M1-16 (BIOS Path B → end-to-end Limine boot) and the FreeBSD CI
177+
runner (now via `vmactions/freebsd-vm@v1``ci.yml:89`). The two
178+
known partials gating v1.0 are:
179+
180+
- **M6-1 LoongArch UEFI** — blocked on rustc upstream
181+
(`loongarch64-unknown-uefi` target not yet stable).
182+
- **M6-3 Part 2** — bare-metal perf baseline against Limine v10.x.
183+
Part 1 (TSC instrumentation) shipped in v0.8.5; the hardware
184+
capture is the open work. Staging tree lives at
185+
`dist/perf-baseline/` (gitignored). The
186+
`zamak-test-kernel` emits a `KERNEL_ENTRY tsc=<u64>` line on
187+
every Limine-Protocol entry so ZAMAK and Limine can be compared
188+
with the same kernel, same physical TSC.

CONTRIBUTING.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ SPDX-FileCopyrightText: 2026 Mohamed Hammad
55

66
# Contributing to ZAMAK
77

8-
Thanks for your interest in ZAMAK — the Steelbore-ecosystem Rust
8+
Thanks for your interest in ZAMAK — the Spacecraft Software ecosystem Rust
99
rewrite of the Limine bootloader. This document is the human
1010
contributor on-ramp; `CLAUDE.md`, `AGENTS.md`, and `SKILL.md` cover
1111
the machine / agent side.
@@ -29,7 +29,7 @@ the machine / agent side.
2929
## Development setup
3030

3131
```
32-
git clone https://codeberg.org/steelbore/zamak
32+
git clone https://codeberg.org/spacecraft-software/zamak
3333
cd zamak/Zamak
3434
RUSTFLAGS='' cargo build
3535
RUSTFLAGS='' cargo test --workspace
@@ -83,7 +83,7 @@ Before opening a PR:
8383

8484
## CLI-specific expectations
8585

86-
`zamak-cli` conforms to `SB-SFRS-STEELBORE-CLI v1.0.0`. New sub-
86+
`zamak-cli` conforms to `SS-SFRS-SPACECRAFT-SOFTWARE-CLI v1.0.0`. New sub-
8787
commands must:
8888

8989
1. Register a `CommandSpec` in `src/schema.rs`.
@@ -100,6 +100,6 @@ command appears in the manifest.
100100

101101
## Code of Conduct
102102

103-
Be kind. Assume good faith. The Steelbore project values rigour
103+
Be kind. Assume good faith. Spacecraft Software values rigour
104104
over speed and correctness over cleverness; feedback in that spirit
105105
is always welcome.

SKILL.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
22
name: zamak
3-
description: ZAMAK bootloader host CLI — install stage1 MBR + stage2, enroll config BLAKE2B hashes into UEFI binaries, generate SPDX 2.3 SBOMs. Dual-mode (human + agent) per SB-SFRS-STEELBORE-CLI v1.0.0.
3+
description: ZAMAK bootloader host CLI — install stage1 MBR + stage2, enroll config BLAKE2B hashes into UEFI binaries, generate SPDX 2.3 SBOMs. Dual-mode (human + agent) per SS-SFRS-SPACECRAFT-SOFTWARE-CLI v1.0.0.
44
license: GPL-3.0-or-later
5-
project: Steelbore
5+
project: Spacecraft Software
66
component: Zamak
77
version: 0.1.0
88
entry_points:
@@ -135,6 +135,6 @@ zamak schema install --json | jq .
135135

136136
- `../ZAMAK_Bootloader_PRD_v1.3.docx.md` — full product spec
137137
- `../TODO.md` — live implementation status
138-
- `../steelbore-dual-mode-cli-sfrs.docx` — CLI framework SFRS v1.0.0
138+
- `../spacecraft-software-dual-mode-cli-sfrs.docx` — CLI framework SFRS v1.0.0
139139
- `zamak describe --json` — live capability manifest (authoritative
140140
at runtime)

TODO.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ SPDX-FileCopyrightText: 2026 Mohamed Hammad
55

66
# ZAMAK Implementation Status — TODO
77

8-
**Reference:** `ZAMAK_Bootloader_PRD_v1.3.docx.md` (SB-PRD-ZAMAK-001 v1.3.0)
8+
**Reference:** `ZAMAK_Bootloader_PRD_v1.3.docx.md` (SS-PRD-ZAMAK-001 v1.3.0)
99
**Generated:** 2026-04-21 (updated)
1010
**Current milestone target:** M6 — LoongArch64 + Polish (due 2027-06-01). M1–M5 functionally complete; remaining gates are release-tagging, CI artifact confirmation, and rustc upstream LoongArch-UEFI support.
1111

@@ -33,7 +33,7 @@ SPDX-FileCopyrightText: 2026 Mohamed Hammad
3333
| M0-8 | `[✓]` | Create `zamak-stage1` as a proper Cargo crate (512-byte MBR, pure `global_asm!`, own linker script + target JSON) |
3434
| M0-9 | `[✓]` | Create `zamak-decompressor` crate (stage2 decompressor using `miniz_oxide`, loaded at 0x70000) |
3535
| M0-10 | `[✓]` | Create `zamak-cli` crate (host-side tool skeleton with subcommand stubs) |
36-
| M0-11 | `[✓]` | Create `zamak-theme` crate (theme parser with Steelbore palette defaults) |
36+
| M0-11 | `[✓]` | Create `zamak-theme` crate (theme parser with Spacecraft Software palette defaults) |
3737
| M0-12 | `[✓]` | Create `zamak-test` crate (QEMU integration test harness with serial capture) |
3838
| M0-13 | `[✓]` | Add `rustfmt.toml` project configuration |
3939
| M0-14 | `[✓]` | Add `deny.toml` for `cargo-deny` (license + CVE checks) |
@@ -43,7 +43,7 @@ SPDX-FileCopyrightText: 2026 Mohamed Hammad
4343

4444
---
4545

46-
## Steelbore Standard Compliance — §3
46+
## Spacecraft Software Standard Compliance — §3
4747

4848
### §3.2 Inline Assembly — No Separate `.asm` Files (RESOLVED)
4949

@@ -216,7 +216,7 @@ SPDX-FileCopyrightText: 2026 Mohamed Hammad
216216

217217
---
218218

219-
## SFRS — Dual-Mode CLI (SB-SFRS-STEELBORE-CLI v1.0.0) — zamak-cli
219+
## SFRS — Dual-Mode CLI (SS-SFRS-SPACECRAFT-SOFTWARE-CLI v1.0.0) — zamak-cli
220220

221221
| # | Status | Task |
222222
|---|--------|------|
@@ -228,10 +228,10 @@ SPDX-FileCopyrightText: 2026 Mohamed Hammad
228228
| SFRS-6 | `[✓]` | §3.5 / §4.3: structured JSON error envelope on stderr (`error.code`/`exit_code`/`message`/`hint`/`timestamp`/`command`/`docs_url`/`io_kind`) with stable `UPPER_SNAKE_CASE` codes via `error::emit` |
229229
| SFRS-7 | `[✓]` | §3.6: stdout=data / stderr=diagnostics split; `--fields a,b,c` projection via `Value::project`; `--format jsonl` streams each data row as one line |
230230
| SFRS-8 | `[✓]` | §3.7: noun-verb hierarchy with shared globals (`--json`, `--format`, `--fields`, `--dry-run`, `--verbose`, `--quiet`, `--color`, `--no-color`, `--yes`, `--force`, `--print0`); aliases hidden from `describe` / `schema` output |
231-
| SFRS-9 | `[✓]` | §4.2 / §4.4: Steelbore six-token palette via 24-bit ANSI (`output::Palette`); NO_COLOR / FORCE_COLOR / CLICOLOR / `--color={auto,always,never}` precedence; ANSI suppressed in every machine mode |
231+
| SFRS-9 | `[✓]` | §4.2 / §4.4: Spacecraft Software six-token palette via 24-bit ANSI (`output::Palette`); NO_COLOR / FORCE_COLOR / CLICOLOR / `--color={auto,always,never}` precedence; ANSI suppressed in every machine mode |
232232
| SFRS-10 | `[✓]` | §4.3: top-level JSON envelope `{metadata:{tool,version,command,timestamp}, data:...}` produced by `OutputPolicy::emit`; snake_case canonical; ISO 8601 strings; JSON null for missing values |
233233
| SFRS-11 | `[✓]` | §5: `--format explore` TUI via `ratatui` 0.29 + `crossterm` 0.28 behind Cargo feature `tui`; alt-screen; CUA + Vim keybinds (`↑↓`/`jk`, `/` filter, `s` sort, Enter detail, `e` export); TTY + non-agent guard with JSON fallback. Feature build verified clean (`cargo check --features tui`); all 95 zamak-cli tests still pass with the feature enabled |
234-
| SFRS-12 | `[✓]` | §6.3: `CLAUDE.md`, `AGENTS.md`, `SKILL.md`, `CONTRIBUTING.md` at `Zamak/` repo root per Steelbore context-file format |
234+
| SFRS-12 | `[✓]` | §6.3: `CLAUDE.md`, `AGENTS.md`, `SKILL.md`, `CONTRIBUTING.md` at `Zamak/` repo root per Spacecraft Software context-file format |
235235
| SFRS-13 | `[✓]` | §7.2: `validate` module — path canonicalization + allow-list (`safe_path`), control-byte rejection (`reject_control_chars`), numeric bounds (`check_bounds`), `--yes`/`--force` required for destructive ops in non-TTY (`confirm_destructive`) |
236236
| SFRS-14 | `[✓]` | §8.1 / §8.4: POSIX text records; `--print0` / `-0` global flag wired; `zamak completions <shell>` sub-command emits bash / zsh / fish / nushell scripts |
237237
| SFRS-15 | `[✓]` | §8.3: PowerShell-friendly JSON — single document (not NDJSON unless explicit), single-line stderr errors (`to_compact`), UTF-8 without BOM, Windows startup sets console CP 65001 via `SetConsoleOutputCP` |

0 commit comments

Comments
 (0)