signing-key-rotation
Add a new Fedora signing key and drop the oldest one in coreos-installer
Source facts
- Repository
- coreos/coreos-installer
- Last source activity
- May 15, 2026 at 18:37
- Detected SKILL.md language
- English
- Stars
- 243
- Forks
- 105
Install options
The review-first prompt is selected by default. You can switch to a direct command or download a local copy.
Review the source files
Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.
Showing SKILL.md
SKILL.md
Source instructions · Read-only preview- name
- signing-key-rotation
- description
- Add a new Fedora signing key and drop the oldest one in coreos-installer
# Fedora Signing Key Rotation
## What it does
1. Downloads the new Fedora GPG signing key from src.fedoraproject.org
2. Appends it to `src/signing-keys.asc`
3. Updates `docs/release-notes.md` with the addition
4. Creates a commit: `signing-keys: add Fedora {N} key`
5. Removes the oldest Fedora key (N-3) from `src/signing-keys.asc`
6. Updates `docs/release-notes.md` with the removal
7. Creates a commit: `signing-keys: drop Fedora {N-3} key`
## Prerequisites
- Git repository is `coreos-installer`
- `src/signing-keys.asc` exists with current signing keys
- `docs/release-notes.md` exists with an unreleased section at the top
- Network access to download the key from src.fedoraproject.org
## Usage
```bash
# Rotate keys for a new Fedora version
/signing-key-rotation 46
# Specify a custom old version to drop (default: NEW - 3)
/signing-key-rotation 46 --drop 43
# Include a tracker issue reference for the drop commit
/signing-key-rotation 46 --tracker https://github.com/coreos/fedora-coreos-tracker/issues/XXXX
```
## Workflow
### Step 1: Parse arguments and validate
Extract the new Fedora version number from the user's invocation. If not provided, ask for it.
```
NEW_VERSION = (from user input)
OLD_VERSION = NEW_VERSION - 3 (unless --drop is specified)
TRACKER_URL = (from --tracker, optional)
```
Run these validation checks:
```bash
# Verify signing-keys.asc exists
ls src/signing-keys.asc
# Check what keys are currently present
grep "Comment:" src/signing-keys.asc
# Verify the old key exists
grep "RPM-GPG-KEY-fedora-${OLD_VERSION}-primary" src/signing-keys.asc
# Verify the new key does NOT already exist
grep "RPM-GPG-KEY-fedora-${NEW_VERSION}-primary" src/signing-keys.asc
```
If the new key already exists, STOP and inform the user.
If the old key does not exist, STOP and inform the user.
### Step 2: Download the new GPG key
Fetch the key from Fedora's package sources:
```
URL: https://src.fedoraproject.org/rpms/fedora-repos/blob/rawhide/f/RPM-GPG-KEY-fedora-{NEW_VERSION}-primary
```
Use the WebFetch tool to download the page, then extract the raw PGP key block between `-----BEGIN PGP PUBLIC KEY BLOCK-----` and `-----END PGP PUBLIC KEY BLOCK-----` (inclusive).
If the page is not found or doesn't contain a PGP key block, STOP and inform the user that the key may not exist yet.
### Step 3: Add the new key to `src/signing-keys.asc`
Using the Edit tool, append to the end of `src/signing-keys.asc`:
1. A blank line after the last `-----END PGP PUBLIC KEY BLOCK-----`
2. The complete PGP key block (from `-----BEGIN PGP PUBLIC KEY BLOCK-----` through `-----END PGP PUBLIC KEY BLOCK-----`)
Make sure the file ends with a newline.
### Step 4: Update release notes for the addition
Using the Edit tool on `docs/release-notes.md`, find the first "Major changes:" section (the unreleased version at the top) and add:
```
- Add Fedora {NEW_VERSION} signing key
```
The entry goes right after the "Major changes:" line. If there are already entries there, add it as the first bullet point. If the section is empty (just blank lines between "Major changes:" and the next heading), add it on the blank line.
### Step 5: Create the "add" commit
Do NOT commit unless the user has asked you to commit. If they have, create the commit:
```bash
git add src/signing-keys.asc docs/release-notes.md
git commit -m "signing-keys: add Fedora {NEW_VERSION} key
Fedora {NEW_VERSION - 1} branched from rawhide, so rawhide is now F{NEW_VERSION}.
Ref: https://src.fedoraproject.org/rpms/fedora-repos/blob/rawhide/f/RPM-GPG-KEY-fedora-{NEW_VERSION}-primary"
```
### Step 6: Remove the old key from `src/signing-keys.asc`
Using the Edit tool, find and remove the entire PGP key block that contains:
```
Comment: RPM-GPG-KEY-fedora-{OLD_VERSION}-primary
```
Remove from the blank line before `-----BEGIN PGP PUBLIC KEY BLOCK-----` through the `-----END PGP PUBLIC KEY BLOCK-----` line (inclusive). Also remove any trailing blank line that was part of the separator between key blocks.
### Step 7: Update release notes for the removal
Using the Edit tool on `docs/release-notes.md`, change:
```
- Add Fedora {NEW_VERSION} signing key
```
to:
```
- Add Fedora {NEW_VERSION} signing key; drop Fedora {OLD_VERSION} signing key
```
### Step 8: Create the "drop" commit
Do NOT commit unless the user has asked you to commit. If they have:
If a tracker URL was provided:
```bash
git add src/signing-keys.asc docs/release-notes.md
git commit -m "signing-keys: drop Fedora {OLD_VERSION} key
Ref: {TRACKER_URL}"
```
If no tracker URL:
```bash
git add src/signing-keys.asc docs/release-notes.md
git commit -m "signing-keys: drop Fedora {OLD_VERSION} key"
```
### Step 9: Verify
Run verification checks:
```bash
# Confirm exactly 4 key blocks (1 RHEL + 3 Fedora)
grep "Comment:" src/signing-keys.asc
# Verify the new key is present
grep "RPM-GPG-KEY-fedora-${NEW_VERSION}-primary" src/signing-keys.asc
# Verify the old key is gone
grep "RPM-GPG-KEY-fedora-${OLD_VERSION}-primary" src/signing-keys.asc
# (should return no match)
# Show the git log
git log --oneline -2
```
Optionally run `cargo check` to verify the build still works.
### Step 10: Report results
Present the user with a summary:
```
Signing key rotation complete:
Added: Fedora {NEW_VERSION} signing key
Dropped: Fedora {OLD_VERSION} signing key
Current keys in src/signing-keys.asc:
- RPM-GPG-KEY-redhat-release
- RPM-GPG-KEY-fedora-{OLD_VERSION + 1}-primary
- RPM-GPG-KEY-fedora-{OLD_VERSION + 2}-primary
- RPM-GPG-KEY-fedora-{NEW_VERSION}-primary
Commits created:
1. signing-keys: add Fedora {NEW_VERSION} key
2. signing-keys: drop Fedora {OLD_VERSION} key
Files modified:
- src/signing-keys.asc
- docs/release-notes.md
Next steps:
1. Push to a branch and open a PR
2. Get review and merge
```
## Checklist Coverage
This skill automates the following from the manual process:
- [x] Download new Fedora GPG key
- [x] Append key to `src/signing-keys.asc`
- [x] Remove old key from `src/signing-keys.asc`
- [x] Update `docs/release-notes.md`
- [x] Create properly formatted commits
- [x] Verify key count and correctness
## What's NOT covered
- [ ] Creating the PR on GitHub (user can do this manually or ask)
- [ ] Determining the tracker issue URL (user must provide if desired)
- [ ] Running full CI (`cargo test`) - only `cargo check` is optionally run
- [ ] Pushing to a remote branch
## Example Output
```
$ /signing-key-rotation 46
Validating inputs...
NEW_VERSION: 46
OLD_VERSION: 43 (46 - 3)
Current keys: redhat-release, fedora-43, fedora-44, fedora-45
Downloading Fedora 46 key from src.fedoraproject.org...
Found PGP key block (31 lines)
Adding Fedora 46 key to src/signing-keys.asc...
Appended key block to end of file
Updating docs/release-notes.md...
Added "Add Fedora 46 signing key" to Major changes
Created commit: signing-keys: add Fedora 46 key
Removing Fedora 43 key from src/signing-keys.asc...
Removed key block with Comment: RPM-GPG-KEY-fedora-43-primary
Updating docs/release-notes.md...
Updated to "Add Fedora 46 signing key; drop Fedora 43 signing key"
Created commit: signing-keys: drop Fedora 43 key
Verification:
Keys present: redhat-release, fedora-44, fedora-45, fedora-46
Key count: 4 (correct)
cargo check: passed
Signing key rotation complete!
```
## References
- Design doc: `.opencode/skills/signing-key-rotation/DESIGN.md`
- Example 1 (F45/F42): `.opencode/skills/signing-key-rotation/examples/example-1-add-f45-drop-f42.md`
- Example 2 (F43/F40): `.opencode/skills/signing-key-rotation/examples/example-2-add-f43-drop-f40.md`
- Key source: `https://src.fedoraproject.org/rpms/fedora-repos/blob/rawhide/f/RPM-GPG-KEY-fedora-{N}-primary`
- Tracker: `https://github.com/coreos/fedora-coreos-tracker/issues`
View on GitHub