Close the review's gaps round the agent account (hq ADR 0266)
mesh/merge-gate pass: builds claude-code, claude-licence-manager, restic, sudo → ace, g14, novox, shanks; no bus step; every machine composes with the chan…
mesh/repo-check pass: THE CHANGE ALTERS ITS OWN CHECK (merge-check.sh): main's version judged it; the change's judges the pull requests after it merges; it…
mesh/delivery delivered

The managed settings apply to every account's claude, so a key-helper script under the
agent's home would run as the operator, and through sudo as root: the command is now
carried whole in the root-owned managed settings and reads the key only as the agent.
The helper reads only a regular file, bounded, without blocking, and a request it does
not answer fails in time instead of holding every later one; a directory entry it
answers that is not a name is refused. The guard's record is matched on its binary in
the query, a half-named agent account is not taken as the operator's, the kept API key
stays until the agent's home holds one, restic refuses to restore beside a directory
others may write, and the agent-home check cleans a path before judging it.
This commit is contained in:
jochen
2026-10-09 23:48:15 +02:00
parent b382045721
commit b240085e0a
11 changed files with 295 additions and 33 deletions
@@ -80,6 +80,10 @@ func RetireOperatorHome(p Paths) []string {
}
for _, name := range []string{"api-key", "api-key-helper"} {
old := filepath.Join(p.State, name)
if name == "api-key" && !holdsApplied(p, "api-key") {
// Kept, like the token above, until the agent's own home holds the key.
continue
}
if _, err := os.Stat(old); err == nil {
if err := os.Remove(old); err == nil {
out = append(out, "removed "+old+": the key and its helper are kept where "+p.Agent+" reads them")