From 46b0466b743995ee9a7d0b71a105938df0baf732 Mon Sep 17 00:00:00 2001 From: Konrad Karauda Date: Mon, 9 Nov 2026 23:39:32 +0000 Subject: [PATCH 1/4] feat: refuse a signed start whose account can change the roster Under the signed authority the plane now refuses to start when its own account can write trust.roster or a directory on its path, as it already does for the configuration, the root key, the pause file, the route, the stop list and the run records. A test classifies every file key the signed authority reads as checked or plane-writable, so a new one cannot be missed. The operator commands that judge with --roster say on standard error which roster they judged, its serial and its expiry, before they sign or list. Doctor's signed route and stop list reads get a test, and stops init --carry runs as a command in a test. Signed-off-by: Konrad Karauda --- CHANGELOG.md | 16 ++ cmd/guardana-control/pause.go | 40 +++- cmd/guardana-control/react.go | 5 +- cmd/guardana-control/roster_judged_test.go | 164 +++++++++++++++ cmd/guardana-control/runs.go | 46 +++-- cmd/guardana-control/runs_read.go | 4 +- cmd/guardana-control/runs_read_test.go | 3 +- cmd/guardana-control/runs_signed.go | 9 +- cmd/guardana-control/runssigned_test.go | 2 +- cmd/guardana-control/stops.go | 12 +- .../stops_carry_command_test.go | 59 ++++++ cmd/guardana-control/stops_signed.go | 14 +- cmd/guardana-control/stops_signed_test.go | 4 +- cmd/guardana-control/supervise.go | 1 + cmd/guardana-gateway/authority.go | 11 +- cmd/guardana-gateway/doctor_runs.go | 5 +- .../doctor_signed_unix_test.go | 117 +++++++++++ cmd/guardana-gateway/reaction_signed.go | 8 +- .../signed_placement_unix_test.go | 192 ++++++++++++++++++ ...-operators-are-named-by-a-signed-roster.md | 4 +- ...oval-counts-only-as-the-plane-judges-it.md | 11 +- ...-a-run-only-from-an-operators-signature.md | 5 + docs/concepts/glossary.md | 2 +- docs/concepts/threat-model.md | 8 +- docs/guides/run-the-gateway.md | 4 +- docs/status.md | 2 +- ...perators-are-named-by-a-signed-roster.html | 6 +- ...al-counts-only-as-the-plane-judges-it.html | 10 +- ...-run-only-from-an-operators-signature.html | 4 + site/docs/changelog.html | 45 ++-- site/docs/concepts/glossary.html | 2 +- site/docs/concepts/threat-model.html | 8 +- site/docs/guides/run-the-gateway.html | 4 +- site/docs/status.html | 2 +- 34 files changed, 734 insertions(+), 95 deletions(-) create mode 100644 cmd/guardana-control/roster_judged_test.go create mode 100644 cmd/guardana-control/stops_carry_command_test.go create mode 100644 cmd/guardana-gateway/doctor_signed_unix_test.go create mode 100644 cmd/guardana-gateway/signed_placement_unix_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index eee9fb1d..27403c8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,22 @@ verify one. ## [Unreleased] +### Changed + +- **Breaking:** under `approvals.authority: signed` a plane whose own account + may write the `trust.roster` file, or a directory on its path, refuses to + start, and `doctor` fails its `trust` check: that account could put an + older roster back. Place the roster where only its signer's account + writes, as `/etc/guardana` is. +- Every operator command that judges with `--roster` and `--root-key` + (`pause`, `stops`, `runs open` and `runs close`, `supervise`, `react`) + says on standard error, before it signs or lists, `judged with roster + serial , expires