rig/commands
claude-hdb d4ab362964 fix(runner): install refuses a box registered to another repo
`rig runner install --repo <B>` on a box already registered to repo A
treated the mere existence of .runner as "already registered", skipped
configure, restarted the service still pointed at A, and reported success.
--repo was accepted, validated, and then ignored — leaving B with zero
runners and its `runs-on` jobs queued against one that will never come.

This is the natural next command after a partial `repoint`, and the failure
is worse than a no-op: moving a runner between repos is a trust-boundary
act, so quietly putting it back on the old one defeats the point of the move.

Gate install on the repo .runner actually names. Convergence — the property
worth keeping — is untouched: re-running against the repo the box is already
on still skips registration, never prompts for a token, and exits 0.
Skipping when the repo *differs* was never convergence, only a silently
ignored argument, so it now fails and names both repos, pointing at
`runner repoint` (move) or `runner remove` (start over). An unreadable
.runner is refused too — it is no licence to assume a match.

The .runner reader that `status` and `repoint` each carried is lifted into
commands/lib/runner-config.sh, which now also holds the guard. Its json_field
no longer dies bare under `set -o pipefail` when a key is missing, which is
what `status`'s own ${REPO_URL:-unknown} fallback always assumed.

Tests: the guard is exercised against a fixture .runner (refuses another repo
naming both, points at repoint, no-ops on the same repo, passes an
unregistered box, refuses an unreadable one) plus an ordering assertion that
it precedes svc.sh start — reaching it through the CLI would need root and a
really-registered runner, which the dependency-free harness cannot fabricate.
All three mutants (guard deleted, guard comparing nothing, guard moved below
the service start) go red.

Closes #13
2026-07-13 14:57:28 +00:00
..
lib fix(runner): install refuses a box registered to another repo 2026-07-13 14:57:28 +00:00
bootstrap.sh fix(bootstrap): converge the tailnet hostname on an already-joined box 2026-07-12 15:47:38 +00:00
coolify-backup-install.sh fix(coolify): validate the dump bindings, and stop printing $EDITOR 2026-07-12 19:55:39 +00:00
coolify-install.sh feat(coolify): install the control-plane dump as a systemd timer 2026-07-12 19:14:07 +00:00
runner-install.sh fix(runner): install refuses a box registered to another repo 2026-07-13 14:57:28 +00:00
runner-remove.sh feat(runner): status, remove, and repoint — the runner lifecycle verbs 2026-07-13 13:25:27 +00:00
runner-repoint.sh fix(runner): install refuses a box registered to another repo 2026-07-13 14:57:28 +00:00
runner-status.sh fix(runner): install refuses a box registered to another repo 2026-07-13 14:57:28 +00:00