Skip to content

feat(actions): signed-push composite action (verified commits via GitHub App)#509

Merged
hyperpolymath merged 1 commit into
mainfrom
feat/signed-push-app-action
Jul 20, 2026
Merged

feat(actions): signed-push composite action (verified commits via GitHub App)#509
hyperpolymath merged 1 commit into
mainfrom
feat/signed-push-app-action

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

What

Adds .github/actions/signed-push — an estate composite action that pushes a branch's local commits as GitHub Verified commits, using a GitHub App installation token + createCommitOnBranch (via Asana/push-signed-commits).

Why (Arm B1)

Automation commits made with a PAT or GITHUB_TOKEN are Unverified. Any branch whose ruleset enforces required_signatures then cannot merge — this is exactly why IDApTIK #28 is BLOCKED right now (all 4 commits verified=false / unknown_key). A GitHub App authoring commits via createCommitOnBranch produces Verified commits GitHub signs itself, satisfying the rule.

The same App also unlocks .github/workflows edits (Workflows: write) and delete_repo (Administration: write), retiring several "GitHub API won't let AI tools operate" blockers at once.

Details

  • SHA-pinned: create-github-app-token v3.2.0 (bcd2ba4…), push-signed-commits v1 (6e073ae…).
  • README documents the one-time App setup and the caveat that PR-only / merge-queue rules are separate from required_signatures — the App may need adding to those rulesets' bypass list.

⛔ Blocked / not yet verifiable

Requires the org to register the GitHub App and set APP_ID + APP_PRIVATE_KEY secrets before it can run. Draft until then. YAML validated (parses as a valid composite action); not runnable in CI without the App.

Related

  • Immediate estate-wide unblock for required_signatures: register the SSH Signing Key so existing commits flip to Verified.
  • Sibling work: hyperpolymath/scripts#90 (wiki-seed adapter), and the community feature request for a wiki API.

🤖 Generated with Claude Code

… GitHub App)

Estate primitive for the "AI tools can't operate GitHub" problem: automation
commits made with a PAT/GITHUB_TOKEN are Unverified, so any branch requiring
signed commits (`required_signatures`) is BLOCKED from merging (e.g. IDApTIK #28).

signed-push mints a GitHub App installation token (actions/create-github-app-token)
and delegates to Asana/push-signed-commits, which replays local commits through the
createCommitOnBranch GraphQL mutation — GitHub signs those itself, so they land as
Verified and satisfy the ruleset.

- SHA-pinned: create-github-app-token v3.2.0, push-signed-commits v1.
- README documents App setup + the ruleset bypass caveat for PR-only/merge-queue.

BLOCKED (draft): requires the org to register the App and set APP_ID /
APP_PRIVATE_KEY secrets before it can run/verify.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath marked this pull request as ready for review July 20, 2026 17:24
@hyperpolymath
hyperpolymath merged commit 5359863 into main Jul 20, 2026
17 of 19 checks passed
@hyperpolymath
hyperpolymath deleted the feat/signed-push-app-action branch July 20, 2026 17:24
hyperpolymath added a commit that referenced this pull request Jul 20, 2026
#510)

Follow-up to #509 (which merged the `signed-push` action). Adds a
**manual** (`workflow_dispatch`) smoke test that proves the action
produces GitHub-**Verified** commits end-to-end.

## What it does
1. Creates a throwaway branch `ci/signed-push-smoke-<run>`.
2. Commits a trivial change locally.
3. Pushes it via `./.github/actions/signed-push` (App token →
`createCommitOnBranch`).
4. **Asserts** the resulting commit is `verified=true` (fails loudly if
not — the classic "App not installed / wrong secret" case).
5. Deletes the throwaway branch.

## Before running
Set on this repo (Settings → Secrets and variables → Actions):
- Variable **`APP_ID`**, Secret **`APP_PRIVATE_KEY`** — the estate
GitHub App.

Then: Actions → "signed-push smoke test" → Run workflow (on this
branch). Green = Arm B1 works.

Validated: `actionlint` clean, YAML parses, checkout SHA-pinned.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant