feat(shell): converge git signing and the ssm-get wrapper #960

Merged
coilyco-ops merged 1 commit from aos/claude/pp94-gpgsign into main 2026-08-27 04:26:23 +00:00
Owner

The fleet-rollout half of agentic-os#1137, plus the decisions on agentic-os#1307 and agentic-os#1308. The authoring half landed in agentic-os#1306 and agentic-os#1314.

Why the role should own these settings

gpg.program was unmanaged, so it was wired by hand, and hands wired it from inside native agent sessions. $HOME there is a temporary root that mirrors the real home, so the path recorded is purged while the setting outlives it. On kais-macbook-pro the value named a session root from 2026-08-06. Signing was dead for months and silent about it, because commit.gpgsign was off so nothing ever invoked the missing program.

The role now spells the value from ansible_facts['env'].HOME, which is the durable host home, so convergence cannot reproduce the defect the way a hand-run git config --global from a session does.

Nice confirmation of the diagnosis: just ansible-sync already refuses to run inside a session shadow, and its refusal names this exact failure mode. This change puts the same reasoning behind the setting the shadow guard could not reach.

What changed

  • gpg.program at ~/.local/bin/gpg-ssm, or gpg-ssm.cmd off Windows, via community.general.git_config.
  • commit.gpgsign true off hostclass_server, so workstations sign and the server class does not (agentic-os#1307, Kai's call). Container and CI seats see neither setting and stay unsigned by design.
  • ssm-get joins the symlinked wrappers, now that agentic-os ships it as scripts/ssm-get rather than a shell function (agentic-os#1308).
  • docs/ansible-guardrails.md gains a git signing section carrying the reasoning and the per-host verification. docs/ansible-host-roles.md and docs/FEATURES.md point at it.

Verification

  • just ansible-lint - 0 failures, 0 warnings, production profile
  • uv run pre-commit run --all-files - clean
  • ansible-doc community.general.git_config confirms the name/scope/value spelling

Not verified here, and worth naming: just ansible-sync check tags=shell refuses to run from a session shadow, so the converge itself has not been exercised. Running it from a terminal outside an agent session is the remaining step, and the per-host check is git log -1 --format='%G? %GK' on a fresh commit returning G plus the shared keyid.

kais-macbook-pro is already in the target state by hand, and the commits in this PR are signed through that path.

The fleet-rollout half of `agentic-os#1137`, plus the decisions on `agentic-os#1307` and `agentic-os#1308`. The authoring half landed in `agentic-os#1306` and `agentic-os#1314`. ## Why the role should own these settings `gpg.program` was unmanaged, so it was wired by hand, and hands wired it from inside native agent sessions. `$HOME` there is a temporary root that mirrors the real home, so the path recorded is purged while the setting outlives it. On kais-macbook-pro the value named a session root from 2026-08-06. Signing was dead for months and silent about it, because `commit.gpgsign` was off so nothing ever invoked the missing program. The role now spells the value from `ansible_facts['env'].HOME`, which is the durable host home, so convergence cannot reproduce the defect the way a hand-run `git config --global` from a session does. Nice confirmation of the diagnosis: `just ansible-sync` already refuses to run inside a session shadow, and its refusal names this exact failure mode. This change puts the same reasoning behind the setting the shadow guard could not reach. ## What changed * `gpg.program` at `~/.local/bin/gpg-ssm`, or `gpg-ssm.cmd` off Windows, via `community.general.git_config`. * `commit.gpgsign` true off `hostclass_server`, so workstations sign and the server class does not (`agentic-os#1307`, Kai's call). Container and CI seats see neither setting and stay unsigned by design. * `ssm-get` joins the symlinked wrappers, now that agentic-os ships it as `scripts/ssm-get` rather than a shell function (`agentic-os#1308`). * `docs/ansible-guardrails.md` gains a `git signing` section carrying the reasoning and the per-host verification. `docs/ansible-host-roles.md` and `docs/FEATURES.md` point at it. ## Verification * `just ansible-lint` - 0 failures, 0 warnings, production profile * `uv run pre-commit run --all-files` - clean * `ansible-doc community.general.git_config` confirms the `name`/`scope`/`value` spelling **Not verified here, and worth naming:** `just ansible-sync check tags=shell` refuses to run from a session shadow, so the converge itself has not been exercised. Running it from a terminal outside an agent session is the remaining step, and the per-host check is `git log -1 --format='%G? %GK'` on a fresh commit returning `G` plus the shared keyid. kais-macbook-pro is already in the target state by hand, and the commits in this PR are signed through that path.
feat(shell): converge git signing and the ssm-get wrapper
All checks were successful
TruffleHog / Scan for secrets (pull_request) Successful in 5s
CI / lint (pull_request) Successful in 42s
a9bc1016d1
`gpg.program` was unmanaged, so it was wired by hand, and hands wired it from
inside native agent sessions. The path recorded there is purged with the
session while the setting outlives it, which left signing dead fleet-wide
since 2026-08-06 and silent because commit.gpgsign was off, so nothing ever
invoked the missing program (agentic-os#1137).

The role now owns both git settings naming the wrappers it symlinks.
`gpg.program` is spelled from ansible_facts env HOME, which is the durable
host home rather than a session's temporary one. `commit.gpgsign` is true off
hostclass_server, so workstations sign and the server class does not
(agentic-os#1307). Container and CI seats see neither and stay unsigned.

`ssm-get` joins the symlinked wrappers now that agentic-os ships it as a
script rather than a shell function (agentic-os#1308).

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
coilyco-ops deleted branch aos/claude/pp94-gpgsign 2026-08-27 04:26:23 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/infrastructure!960
No description provided.