github-trusted-tag
Makes tags in a GitHub organization creatable only on a trusted SHA (the HEAD of the default branch).
Skill by suzuki-shunsuke
Chalk Labs
Need help deploying github-trusted-tag?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/suzuki-shunsuke-github-trusted-tag
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: cloud, productivity
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/github-trusted-tag
What's inside
- Skill name
github-trusted-tag- Description
- Makes tags in a GitHub organization creatable only on a trusted SHA (the HEAD of the default branch). Sets up a dedicated GitHub App and reusable workflow that push tags, and Organization Tag Rulesets that forbid anyone but that GitHub App from creating, updating, or deleting tags. The GitHub App private key lives in AWS KMS, guarded by an IAM role pinned on the job_workflow_ref sub claim. Use when preventing tags from being pushed to feature branches or other untrusted commits, when designing, rolling out, or reviewing tag rulesets or a tag-creating reusable workflow, or when the tag-creating workflow fails to assume its IAM role.
- License
- MIT
- Instructions
- 147 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Create tags only on trusted SHAs
## Background
- This assumes development within an organization. Personal projects are out of scope.
- On GitHub, anyone with push access can basically push any tag.
- Pushing a tag can trigger a release workflow.
- For some things the release is complete the moment the tag is pushed, without any release workflow:
- GitHub Actions
- Go modules
- Terraform modules
- etc.
## Goal
Tags can be created only on a trusted SHA — basically the HEAD of the default branch.
## How it works
1. Create a dedicated GitHub App for pushing tags, and a dedicated reusable workflow that pushes tags with it.
1. Forbid tag creation with an Organization Tag Ruleset, and add only the dedicated GitHub App to its bypass list.
1. Add a workflow to each repository that calls the reusable workflow to push tags.
1. Keep the private key in AWS KMS and guard it with AWS IAM, so the GitHub App cannot be abused or used for anything else.
## Trade-offs
- Developers can no longer create tags locally or from the GitHub web UI.
- A tag created by mistake can no longer be deleted.
- Existing tag-creating mechanisms stop working.
- Inventory them (tagpr, release-please, goreleaser, `gh release create`, etc.) before rolling this out.
- Floating major tags such as `v1`, common in GitHub Actions repositories, can no longer be updated.
## Steps
1. [Protect the default branch with an Organization Branch Ruleset](#1-protect-the-default-branch-with-an-organization-branch-ruleset)
1. [Create a dedicated GitHub App for pushing tags](#2-create-a-dedicated-github-app-for-pushing-tags)
1. [Import the private key into AWS KMS and create the IAM role](#3-import-the-private-key-into-aws-kms-and-create-the-iam-role)
1. [Create the reusable workflow that pushes tags](#4-create-the-reusable-workflow-that-pushes-tags)
1. [Add job_workflow_ref to each repository's subject claim](#5-add-job_workflow_ref-to-each-repositorys-subject-claim)
1. [Add a workflow calling the reusable workflow to each repository](#6-add-a-workflow-calling-the-reusable-workflow-to-each-repository)
1. [Restrict tag creation and changes with Organization Tag Rulesets](#7-restrict-tag-creation-and-changes-with-organization-tag-rulesets)
### 1. Protect the default branch with an Organization Branch Ruleset
"Trusted SHA = HEAD of the default branch" holds only with this protection in place. Skip this step if the default branch is already protected.
- Bypass list: none
- Target repositories: All repositories
- Target branches: Default branch
- Rules
- Restrict deletions
- Require a pull request before merging
- Required approvals: 1 or more
- Dismiss stale pull request approvals when new commits are pushed
- (optional) Require review from Code Owners
- Require approval of the most recent reviewable push
- Block force pushes
### 2. Create a dedicated GitHub App for pushing tags
- Repository access: All repositories
- Permissions: `contents:write`
- Webhook: disabled
### 3. Import the private key into AWS KMS and create the IAM role
Generate the private key and import it into KMS by following [aws-setup.md](https://github.com/suzuki-shunsuke/agent-skills/blob/main/skills/github-app-private-key-aws-kms/references/aws-setup.md) of the github-app-private-key-aws-kms skill.
The IAM role's trust policy is the exception: instead of listing repositories, restrict it by job_workflow_ref as below.
An example with [terraform-aws-github-app-kms](https://github.com/suzuki-shunsuke/terraform-aws-github-app-kms):
```hcl
module "kms" {
source = "github.com/suzuki-shunsuke/terraform-aws-github-app-kms?ref=v0.0.1"
app_slug = "<app-slug>"
imported = true
conditions = [
{
test = "StringLike"
variable = "token.actions.githubusercontent.com:sub"
values = [
"repo:<org>/*:job_workflow_ref:<org>/<shared-repo>/.github/workflows/<file>.yaml@refs/heads/<default-branch>"
]
},
]
}
```
- Point job_workflow_ref at the default branch. Don't pin it to a SHA.
- Pinning would force a trust policy update every time the reusable workflow changes.
- The default branch is protected by the Branch Ruleset from [step 1](#1-protect-the-default-branch-with-an-organization-branch-ruleset).
- Don't restrict anything other than job_workflow_ref.
- As long as no input of the reusable workflow can change where the tag goes, running it from a malicious branch only creates a tag on the HEAD of the default branch.
### 4. Create the reusable workflow that pushes tags
- inputs
- `tag` (required)
- `tag_message` (optional)
- Never accept the target repository or ref (branch, tag, SHA) as an input. Doing so would let anyone push a tag to a malicious SHA.
- outputs
- The default branch name
- The SHA
- Get an installation access token for the dedicated GitHub App with [create-github-app-token-aws-kms](https://github.com/suzuki-shunsuke/create-github-app-token-aws-kms).
- repositories: `GITHUB_REPOSITORY`
- permissions: `contents:write`
- Get the default branch and its HEAD SHA from the GitHub API.
- Create an annotated tag with the GitHub API.
- Fail if the tag already exists.
### 5. Add job_workflow_ref to each repository's subject claim
https://docs.github.com/en/actions/how-tos/secure-your-work/security-harden-deployments/oidc-with-reusable-workflows
```json
{
"use_default": false,
"include_claim_keys": ["repo", "context", "job_workflow_ref"]
}From suzuki-shunsuke/agent-skills, MIT.
More from suzuki-shunsuke/agent-skills
- 0.529score
github-auto-approve
suzuki-shunsuke
Sets up and audits secure auto approve for pull requests across a GitHub organization, so that only pull requests genuinely meeting the intended conditions…
SkillBFreshness: BClaude Code +9 - 0.529score
github-app-private-key-aws-kms
suzuki-shunsuke
Rewrites GitHub Actions workflows so that GitHub App installation access tokens are generated by delegating JWT signing to AWS KMS instead of storing the…
SkillBFreshness: BClaude Code +9 - 0.524score
github-required-status-check
suzuki-shunsuke
Designs and manages GitHub Branch Rulesets' "Require status checks to pass" so the ruleset never needs updating when a job is added, removed, or renamed, by…
SkillBFreshness: BClaude Code +9 - 0.474score
go
suzuki-shunsuke
Conventions and commands for Go projects — testing, linting, JSON Schema generation, and error handling.
SkillCFreshness: CClaude Code +9 - 0.474score
create-skill
suzuki-shunsuke
Creates agent skills from an OSS project's documentation.
SkillCFreshness: CClaude Code +9 - 0.469score
pr
suzuki-shunsuke
Creates a branch, commits the changes, and opens a pull request whose description summarizes the full diff between base and head.
SkillCFreshness: CClaude Code +9 - 0.467score
manner
suzuki-shunsuke
Baseline rules for this repository — use English, never commit to default branches, never rewrite commit history.
SkillCFreshness: CClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 1
- Last commit (this folder)
- Oct 23, 2026 (7 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/suzuki-shunsuke/agent-skills
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from suzuki-shunsuke
- 0.529score
github-auto-approve
suzuki-shunsuke
Sets up and audits secure auto approve for pull requests across a GitHub organization, so that only pull requests genuinely meeting the intended conditions…
SkillBFreshness: BClaude Code +9 - 0.529score
github-app-private-key-aws-kms
suzuki-shunsuke
Rewrites GitHub Actions workflows so that GitHub App installation access tokens are generated by delegating JWT signing to AWS KMS instead of storing the…
SkillBFreshness: BClaude Code +9 - 0.524score
github-required-status-check
suzuki-shunsuke
Designs and manages GitHub Branch Rulesets' "Require status checks to pass" so the ruleset never needs updating when a job is added, removed, or renamed, by…
SkillBFreshness: BClaude Code +9 - 0.474score
go
suzuki-shunsuke
Conventions and commands for Go projects — testing, linting, JSON Schema generation, and error handling.
SkillCFreshness: CClaude Code +9 - 0.474score
create-skill
suzuki-shunsuke
Creates agent skills from an OSS project's documentation.
SkillCFreshness: CClaude Code +9 - 0.469score
pr
suzuki-shunsuke
Creates a branch, commits the changes, and opens a pull request whose description summarizes the full diff between base and head.
SkillCFreshness: CClaude Code +9
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get github-trusted-tag running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
github-trusted-tag skill. Agent Mart. https://agentmart.dev/skills/suzuki-shunsuke-github-trusted-tag (last updated 2026-10-24)