Teach gpg-ssm to bootstrap shared signing key from SSM #348

Closed
opened 2026-07-09 00:15:25 +00:00 by coilyco-ops · 6 comments
Member

Problem

Kai has stored the shared armored GPG secret key at /coilysiren/gpg-secret-key and the shared passphrase at /coilysiren/gpg-passphrase. The current scripts/gpg-ssm wrapper only supports per-host keys and fetches /coilysiren/gpg-passphrase/<keyid> based on git config --global user.signingkey.

Desired behavior

Update gpg-ssm so a fresh machine can sign commits using the shared SSM-backed key material. The wrapper should:

  • Keep verification and non-signing invocations as passthrough.
  • Gate on AWS credentials before fetching SSM values.
  • Detect whether the configured signing key is locally available.
  • If the shared key is missing locally, fetch /coilysiren/gpg-secret-key with decryption and import it into the local keyring without writing the key to disk.
  • Fetch /coilysiren/gpg-passphrase with decryption for signing.
  • Preserve the Git Bash MSYS_NO_PATHCONV carve-out.
  • Update docs and the tooling-gpg-ssm skill references so the design no longer claims only per-host passphrase params.

Notes

The old per-host path was /coilysiren/gpg-passphrase/<keyid>. The new operator-created params are flat paths. Keep command output public-safe and do not print secret values.

## Problem Kai has stored the shared armored GPG secret key at `/coilysiren/gpg-secret-key` and the shared passphrase at `/coilysiren/gpg-passphrase`. The current `scripts/gpg-ssm` wrapper only supports per-host keys and fetches `/coilysiren/gpg-passphrase/<keyid>` based on `git config --global user.signingkey`. ## Desired behavior Update `gpg-ssm` so a fresh machine can sign commits using the shared SSM-backed key material. The wrapper should: - Keep verification and non-signing invocations as passthrough. - Gate on AWS credentials before fetching SSM values. - Detect whether the configured signing key is locally available. - If the shared key is missing locally, fetch `/coilysiren/gpg-secret-key` with decryption and import it into the local keyring without writing the key to disk. - Fetch `/coilysiren/gpg-passphrase` with decryption for signing. - Preserve the Git Bash `MSYS_NO_PATHCONV` carve-out. - Update docs and the `tooling-gpg-ssm` skill references so the design no longer claims only per-host passphrase params. ## Notes The old per-host path was `/coilysiren/gpg-passphrase/<keyid>`. The new operator-created params are flat paths. Keep command output public-safe and do not print secret values.
Author
Member

🔒 Reserved by ward agent --harness codex — container engineer-codex-agentic-os-348 on host kais-macbook-pro-2.local is carrying this issue (reserved 2026-07-09T00:15:42Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/agentic-os#348 · branch issue-348 · harness codex · workflow pr
  • Run: engineer-codex-agentic-os-348 · ward v0.470.0 · dispatched 2026-07-09T00:15:42Z
  • Comment thread: 0 included in the pre-flight read, 0 stripped (ward's own automated comments).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.470.0).

— Codex, via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --harness codex` — container `engineer-codex-agentic-os-348` on host `kais-macbook-pro-2.local` is carrying this issue (reserved 2026-07-09T00:15:42Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/agentic-os#348` · branch `issue-348` · harness `codex` · workflow `pr` - **Run:** `engineer-codex-agentic-os-348` · ward `v0.470.0` · dispatched `2026-07-09T00:15:42Z` - **Comment thread:** 0 included in the pre-flight read, 0 stripped (ward's own automated comments). Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.470.0). </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: blocked - review summary: blocked: codex: exit status 1

Review panel verdicts:

  • codex: ERROR: codex: exit status 1 (conf 0.00)
  • claude: ERROR: claude: exit status 1 (conf 0.00)
  • goose: ERROR: goose: exit status 1 (conf 0.00)

— Codex, via ward agent

WARD-OUTCOME: blocked - review summary: blocked: codex: exit status 1 Review panel verdicts: - codex: ERROR: codex: exit status 1 (conf 0.00) - claude: ERROR: claude: exit status 1 (conf 0.00) - goose: ERROR: goose: exit status 1 (conf 0.00) <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: blocked - the review gate failed closed before a usable verdict because the reviewer backend returned 401 Unauthorized.
Review summary: blocked: codex: exit status 1
Reviewer verdicts: codex block, claude block, goose block, each due the same 401 transport failure.

WARD-OUTCOME: blocked - the review gate failed closed before a usable verdict because the reviewer backend returned 401 Unauthorized. Review summary: blocked: codex: exit status 1 Reviewer verdicts: codex block, claude block, goose block, each due the same 401 transport failure.
Author
Member

⚠️ Reopened: this run's work did not land on main

An ephemeral ward container (codex mode) dispatched for this issue finished but its work was not merged to main, so the reaper preserved it on a branch before teardown and reopened the issue (a closing reference for #348 never reached main). Recover from the salvage branch below.

  • Repo: coilyco-flight-deck/agentic-os
  • Salvage branch: ward-salvage/agentic-os-10d085d2
  • Pull request: not opened - PR creation failed: forgejo: parse created pull request: unexpected end of JSON input
  • Reason: run workflow does not land on main (--workflow pr/patch-only)
  • Container uptime at reap: 9m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token)

Reap diagnostics

--- reap diagnostics ---
ward version:      v0.470.0
version source:    pinned via WARD_VERSION/--ward-version (v0.470.0)
HEAD:              f85bcd75c347
origin/main:       ae3677c83d75
ancestry:          HEAD is NOT yet on origin/main - residual work remains to land
decision gate:     workflow does not land on main (--workflow pr/patch-only)
reason:            run workflow does not land on main (--workflow pr/patch-only)
provenance:        not read (workflow hold)
run-owned landed:  no
working tree:      clean
container uptime:  9m (baked Forgejo PAT age proxy)
--- end reap diagnostics ---

Recover

git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/agentic-os.git ward-salvage/agentic-os-10d085d2
git checkout -b ward-salvage/agentic-os-10d085d2 FETCH_HEAD

— Codex, via ward agent

## ⚠️ Reopened: this run's work did not land on `main` An ephemeral `ward container` (codex mode) dispatched for this issue finished but its work was **not merged to `main`**, so the reaper preserved it on a branch before teardown and reopened the issue (a closing reference for #348 never reached `main`). Recover from the salvage branch below. - **Repo:** `coilyco-flight-deck/agentic-os` - **Salvage branch:** `ward-salvage/agentic-os-10d085d2` - **Pull request:** not opened - PR creation failed: forgejo: parse created pull request: unexpected end of JSON input - **Reason:** run workflow does not land on main (--workflow pr/patch-only) - **Container uptime at reap:** 9m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token) ## Reap diagnostics ``` --- reap diagnostics --- ward version: v0.470.0 version source: pinned via WARD_VERSION/--ward-version (v0.470.0) HEAD: f85bcd75c347 origin/main: ae3677c83d75 ancestry: HEAD is NOT yet on origin/main - residual work remains to land decision gate: workflow does not land on main (--workflow pr/patch-only) reason: run workflow does not land on main (--workflow pr/patch-only) provenance: not read (workflow hold) run-owned landed: no working tree: clean container uptime: 9m (baked Forgejo PAT age proxy) --- end reap diagnostics --- ``` ## Recover ```bash git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/agentic-os.git ward-salvage/agentic-os-10d085d2 git checkout -b ward-salvage/agentic-os-10d085d2 FETCH_HEAD ``` <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-RESERVATION: held 🔒

reservation details

Holder: container engineer-codex-agentic-os-348 on host kais-macbook-pro-2.local.

Reserved by ward agent --harness codex (reserved 2026-07-09T21:33:35Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h TTL). --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/agentic-os#348 · branch issue-348 · harness codex · workflow direct-to-main
  • Run: engineer-codex-agentic-os-348 · ward v0.493.0 · dispatched 2026-07-09T21:33:35Z
  • Comment thread: 3 included in the pre-flight read, 1 stripped (ward's own automated comments).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.493.0).

— Codex, via ward agent

<!-- ward-agent-reservation --> WARD-RESERVATION: held 🔒 <details><summary>reservation details</summary> Holder: container `engineer-codex-agentic-os-348` on host `kais-macbook-pro-2.local`. Reserved by `ward agent --harness codex` (reserved 2026-07-09T21:33:35Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h TTL). `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh**. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/agentic-os#348` · branch `issue-348` · harness `codex` · workflow `direct-to-main` - **Run:** `engineer-codex-agentic-os-348` · ward `v0.493.0` · dispatched `2026-07-09T21:33:35Z` - **Comment thread:** 3 included in the pre-flight read, 1 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-09T00:25:11Z), @coilyco-ops (2026-07-09T00:25:51Z), @coilyco-ops (2026-07-09T00:26:04Z) - stripped: @coilyco-ops (2026-07-09T00:15:45Z) Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.493.0). </details> </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: done

details

workflow: direct-to-main; review summary: review gate skipped by ~/.ward/config.yaml default
felt: a straightforward recovery, but the container ran tight on disk during validation and commit hooks
confidence: high
surprises: pre-commit cache bootstrap and commit-time hook installs both hit filesystem space limits
follow-ups: none

WARD-OUTCOME: done ✅ <details><summary>details</summary> workflow: direct-to-main; review summary: review gate skipped by ~/.ward/config.yaml default felt: a straightforward recovery, but the container ran tight on disk during validation and commit hooks confidence: high surprises: pre-commit cache bootstrap and commit-time hook installs both hit filesystem space limits follow-ups: none </details>
Sign in to join this conversation.
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/agentic-os#348
No description provided.