Skip to content

feat(signing): wire the production loran-pages publisher key#2

Open
UnbreakableMJ wants to merge 4 commits into
mainfrom
feat/production-publisher-key
Open

feat(signing): wire the production loran-pages publisher key#2
UnbreakableMJ wants to merge 4 commits into
mainfrom
feat/production-publisher-key

Conversation

@UnbreakableMJ

Copy link
Copy Markdown
Contributor

Summary

Completes the first-launch publisher-key swap and folds in the remaining
working-tree changes on this branch.

  • Production publisher key. loran-core::pipeline::PUBLISHER_PUBLIC_KEY
    moves from the development placeholder (which aliased
    signing::tests::TEST_PUBLIC_KEY) to the real loran-pages publisher
    key. The new trust root is intentionally distinct from the test
    key. pipeline.rs and OPERATIONS.md are rewritten to describe the
    production key and mark the §2.4 first-launch swap done — any future
    change to the constant is a key rotation, not a placeholder edit.
  • Secret handling. The secret half is not in the repo; it belongs
    in the release vault / the loran-pages repo's MINISIGN_SECRET_KEY
    Actions secret. loran-pages.key / loran-pages.pub are now
    .gitignored so the secret cannot be committed by accident.
  • New page categories. audio (PipeWire/PulseAudio) and bluetooth
    (BlueZ); the categories snapshot is regenerated (both list with 0 pages
    for now).
  • flake.nix. A Nix flake that builds -p loran via
    rustPlatform.buildRustPackage, with REUSE SPDX headers.
  • Rename follow-through. AMBIGUOUS_REVIEW.md / .cargo/audit.toml
    finish the Steelbore → Spacecraft Software cleanup (resolved checklist
    items; stale rename-prompt path / cache-format comment fixed).

Verification

Full pre-commit gate (cold build) passes locally:

  • cargo fmt --check — clean
  • cargo clippy --workspace --all-targets -- -D warnings — clean
  • cargo test --workspace — all green
  • cargo xtask check-spdx — ok (100 files)

Follow-up (out of band, not in this PR)

  • Store the loran-pages secret key in the vault and set
    MINISIGN_SECRET_KEY / MINISIGN_PASSWORD in the loran-pages repo
    before the next signed release.
  • The new audio / bluetooth categories have no pages yet.

🤖 Generated with Claude Code

UnbreakableMJ and others added 4 commits June 25, 2026 18:36
Swap PUBLISHER_PUBLIC_KEY in loran-core::pipeline from the development
placeholder (which aliased signing::tests::TEST_PUBLIC_KEY) to the real
loran-pages publisher key, completing the first-launch key swap. The new
trust root is intentionally distinct from the test key. The secret half
lives in the release vault / the loran-pages repo's MINISIGN_SECRET_KEY
Actions secret and is never committed — gitignore the local keypair
(loran-pages.key / loran-pages.pub) to keep it that way.

Bundled working-tree changes:

- pipeline.rs / OPERATIONS.md: rewrite the publisher-trust-root docs to
  describe the production key and mark the §2.4 first-launch swap done;
  any future change to the constant is now a key rotation, not a
  placeholder edit.
- categories.toml: add the `audio` (PipeWire/PulseAudio) and `bluetooth`
  (BlueZ) page categories; regenerate the categories snapshot (both list
  with 0 pages for now).
- flake.nix: add a Nix flake that builds `-p loran` via
  rustPlatform.buildRustPackage, with REUSE SPDX headers.
- AMBIGUOUS_REVIEW.md / .cargo/audit.toml: finish the
  Steelbore -> Spacecraft Software rename follow-through — mark resolved
  checklist items and fix the stale rename-prompt path / cache-format
  comment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: UnbreakableMJ <Mohamed.Hammad@SpacecraftSoftware.org>
The previous commit declared the `audio` and `bluetooth` categories with
no pages. Add four curated pages so they are no longer empty:

- audio/wpctl            — WirePlumber/PipeWire native control
- audio/pactl            — PulseAudio control-protocol client
                           (PulseAudio / pipewire-pulse)
- bluetooth/bluetoothctl — BlueZ interactive D-Bus client
- bluetooth/btmgmt       — BlueZ management-API client (non-interactive)

Regenerate the categories snapshot (audio/bluetooth now list 2 each) and
the default list snapshot (four new entries). build.rs validates every
bundled page at compile time, so the gate already exercises these.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: UnbreakableMJ <Mohamed.Hammad@SpacecraftSoftware.org>
Add a format check for the optional `tldr_page` frontmatter field to the
shared parse pipeline. When set to a non-empty value it must be a
lowercase tldr-pages identifier: no whitespace, no uppercase, no path
separator, and no `.md` suffix (legitimate names with `+`, `.`, or digits
— `g++`, `7z`, `2to3` — still pass). An empty string stays valid: it is
the documented "no tldr page" sentinel that disables the lookup.

The check is hermetic — it does not verify the page exists in the tldr
corpus (that would need the archive). It flows through `Page::parse`,
`OverlayPage::parse` / `merge_overlay`, `build.rs` compile-time bundled-
page validation, and `loran validate` (new `INVALID_TLDR_PAGE` code).

Adds the `PageError::InvalidTldrPage` variant and unit tests on both the
page and overlay paths.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: UnbreakableMJ <Mohamed.Hammad@SpacecraftSoftware.org>
btmgmt has no tldr-pages entry (verified: pages/linux/btmgmt.md and
pages/common/btmgmt.md both 404). Set `tldr_page = ""`, the documented
"no tldr page" sentinel, so `loran show btmgmt` skips the tldr lookup
instead of attempting a `btmgmt` key that always misses. Exercises the
empty-sentinel path of the new tldr_page validation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: UnbreakableMJ <Mohamed.Hammad@SpacecraftSoftware.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant