WIP: feat(manifest): git-gate.signing opt-in (PRD chunk 2) #485

Draft
didericis-claude wants to merge 1 commits from signed-commits-manifest into prd-forge-subroles
Collaborator

Stacked on #480 (base branch prd-forge-subroles). First implementation chunk of the signed-commits & audit-attribution PRD.

What this lands (PRD chunk 2 — manifest surface)

A bottle opts into per-activation commit signing:

git-gate:
  signing:
    enabled: true
  • New ManifestGitSigning value type (frozen; enabled: bool = False), parsed under git-gate.signing. Unknown sub-keys and a non-bool enabled die with targeted errors. parse_git_gate_config now returns (repos, user, signing).
  • ManifestBottle gains git_signing; defaults to off, so bottles that omit the block are byte-for-byte unchanged.
  • Bottle-only. git-gate.signing on an agent is rejected by the existing agent-level non-user guard (same as git-gate.repos).
  • extends/runtime merges thread git_signing with an enable-wins overlay (a child enabling signing wins; omitting inherits the parent), mirroring the git_user non-empty-wins overlay.
  • Facade exports ManifestGitSigning.

Tests

tests/unit/test_manifest_git_signing.py — parse (default off, enabled true/false, coexists with user+repos), validation (unknown sub-key, non-bool, non-mapping, allowed-key error names signing), agent-level rejection, and extends overlay (inherit + enable-over-parent). Full unit suite green locally (pyright/pylint are CI dev-deps, not run here).

Scope / what's next

This is the first stacked chunk. Deliberately just the manifest surface — nothing consumes git_signing yet, so it is inert until the following chunks land (each as a further stacked PR per the PRD's ordered/mergeable steps):

  • chunk 3 — signing pipeline: sidecar ssh-agent, forward SSH_AUTH_SOCK, emit commit.gpgsign/gpg.format=ssh/user.signingkey across the four backends.
  • chunk 4 — gate pre-forward signature check (data plane).
  • chunk 5 — control-plane independent verification + bottled_agent_activation / attributed_commit audit tables.
  • chunk 6 — docs/glossary/ADR note.

Happy to continue straight into chunk 3, or hold for review of this surface first.

🤖 Generated with Claude Code

Stacked on #480 (base branch `prd-forge-subroles`). First implementation chunk of the signed-commits & audit-attribution PRD. ## What this lands (PRD chunk 2 — manifest surface) A bottle opts into per-activation commit signing: ```yaml git-gate: signing: enabled: true ``` - New `ManifestGitSigning` value type (frozen; `enabled: bool = False`), parsed under `git-gate.signing`. Unknown sub-keys and a non-bool `enabled` die with targeted errors. `parse_git_gate_config` now returns `(repos, user, signing)`. - `ManifestBottle` gains `git_signing`; **defaults to off**, so bottles that omit the block are byte-for-byte unchanged. - **Bottle-only.** `git-gate.signing` on an agent is rejected by the existing agent-level non-`user` guard (same as `git-gate.repos`). - `extends`/runtime merges thread `git_signing` with an enable-wins overlay (a child enabling signing wins; omitting inherits the parent), mirroring the `git_user` non-empty-wins overlay. - Facade exports `ManifestGitSigning`. ## Tests `tests/unit/test_manifest_git_signing.py` — parse (default off, enabled true/false, coexists with user+repos), validation (unknown sub-key, non-bool, non-mapping, allowed-key error names `signing`), agent-level rejection, and extends overlay (inherit + enable-over-parent). Full unit suite green locally (pyright/pylint are CI dev-deps, not run here). ## Scope / what's next This is the **first stacked chunk**. Deliberately just the manifest surface — nothing consumes `git_signing` yet, so it is inert until the following chunks land (each as a further stacked PR per the PRD's ordered/mergeable steps): - **chunk 3** — signing pipeline: sidecar ssh-agent, forward `SSH_AUTH_SOCK`, emit `commit.gpgsign`/`gpg.format=ssh`/`user.signingkey` across the four backends. - **chunk 4** — gate pre-forward signature check (data plane). - **chunk 5** — control-plane independent verification + `bottled_agent_activation` / `attributed_commit` audit tables. - **chunk 6** — docs/glossary/ADR note. Happy to continue straight into chunk 3, or hold for review of this surface first. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
didericis-claude added 1 commit 2026-07-25 22:53:13 -04:00
feat(manifest): git-gate.signing opt-in (PRD chunk 2)
test / integration-docker (pull_request) Successful in 38s
lint / lint (push) Successful in 56s
test / unit (pull_request) Successful in 52s
test / integration-firecracker (pull_request) Successful in 3m48s
test / coverage (pull_request) Successful in 15s
test / publish-infra (pull_request) Has been skipped
tracker-policy-pr / check-pr (pull_request) Failing after 24s
e16efc86ad
Implements the manifest surface for the signed-commits & audit-attribution
PRD (#423, PR #480): a bottle opts into per-activation commit signing with

    git-gate:
      signing:
        enabled: true

- New ManifestGitSigning value type (frozen, enabled: bool = False) parsed
  under git-gate.signing; unknown sub-keys and non-bool `enabled` die with
  targeted errors. parse_git_gate_config now returns (repos, user, signing).
- ManifestBottle gains git_signing; defaults to off, so bottles that omit
  the block are unchanged.
- Bottle-only: git-gate.signing on an agent is rejected by the existing
  agent-level non-`user` guard (like git-gate.repos).
- extends/runtime merges thread git_signing with an enable-wins overlay
  (a child enabling signing wins; omitting inherits the parent), mirroring
  the git_user non-empty-wins overlay.
- Facade exports ManifestGitSigning.

Tests: tests/unit/test_manifest_git_signing.py (parse, validation,
agent-level rejection, extends overlay). Full unit suite green.

This is the first stacked chunk; signing pipeline, gate signature check,
and control-plane verification + audit tables follow per the PRD.

Issue: #423

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Owner

@didericis-claude pause on this until the host controller and the audit event log gets implemented

@didericis-claude pause on this until the host controller and the audit event log gets implemented
didericis-claude marked the pull request as work in progress 2026-07-26 01:44:00 -04:00
Author
Collaborator

Paused. Marked this WIP so it won't merge ahead of its dependencies.

Parking it rather than closing: the manifest surface here (git-gate.signing) is inert and shouldn't drift, but it may want to shift to line up with whatever shape the host controller and audit event log land with — so I'll rebase/adjust it once those exist rather than lock it in now.

Blocked on:

  • host controller (control plane) — chunk 5's independent verification and the bottled_agent_activation / attributed_commit writes are its responsibility.
  • audit event log — the durable store those attribution rows are written to.

I'll hold all remaining chunks (3 signing pipeline, 4 gate signature check, 5 control-plane verification + audit, 6 docs) until both are in, then pick this back up. Ping me when they're ready.

Paused. Marked this WIP so it won't merge ahead of its dependencies. Parking it rather than closing: the manifest surface here (`git-gate.signing`) is inert and shouldn't drift, but it may want to shift to line up with whatever shape the host controller and audit event log land with — so I'll rebase/adjust it once those exist rather than lock it in now. Blocked on: - **host controller** (control plane) — chunk 5's independent verification and the `bottled_agent_activation` / `attributed_commit` writes are its responsibility. - **audit event log** — the durable store those attribution rows are written to. I'll hold all remaining chunks (3 signing pipeline, 4 gate signature check, 5 control-plane verification + audit, 6 docs) until both are in, then pick this back up. Ping me when they're ready.
Some checks are pending
test / integration-docker (pull_request) Successful in 38s
lint / lint (push) Successful in 56s
test / unit (pull_request) Successful in 52s
test / integration-firecracker (pull_request) Successful in 3m48s
test / coverage (pull_request) Successful in 15s
test / publish-infra (pull_request) Has been skipped
tracker-policy-pr / check-pr (pull_request) Failing after 24s
This pull request is marked as a work in progress.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin signed-commits-manifest:signed-commits-manifest
git checkout signed-commits-manifest
Sign in to join this conversation.