.claude/skills/release-smoke/SKILL.md
Post-release smoke checklist across the 3-OS matrix (macOS arm64+x64, Linux, Windows). Covers artifact download, Gatekeeper/SmartScreen/AppImage launch checks, auto-update test, notarization verification, and Trivy+Cosign container verification. Run against a draft GitHub Release BEFORE promoting to published. Must be invoked manually by the user — not auto-triggerable.
npx skillsauth add jrmatherly/1dev release-smokeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Run this skill against a draft GitHub Release before promoting to published. The release workflow at .github/workflows/release.yml produces 17 artifacts across 3 OSes + a signed container image; this checklist verifies they actually work on end-user machines before the release goes public.
Canonical reference: docs/operations/release.md.
v0.0.80 was deleted after Windows postinstall + macOS Codex 403 failures; v0.0.83 was deleted after container-build Trivy SHA-tag mismatch + transient Windows NSIS 502. Both would have been caught by a disciplined pre-publish smoke. This skill codifies the smoke so regressions don't slip through.
https://github.com/jrmatherly/1dev/releases/tag/v0.0.XXgh CLI authenticateddocker + cosign + trivy available locally for the container verification stepgh run list --workflow="🚀 Release" --limit 5
gh run view <release-run-id> --log | grep -E "(fail|error|Error)" | head -20
All 3 build jobs (macOS, Linux, Windows) must be green. If any failed, stop here and investigate — do NOT proceed to smoke.
Expected artifact count: 17 (per v0.0.85 baseline).
| OS | Artifacts | Count |
|---|---|---|
| macOS arm64 | .dmg, .zip, .dmg.blockmap, -mac.yml | 4 |
| macOS x64 | .dmg, .zip, .dmg.blockmap | 3 |
| Linux | .AppImage, .deb, .AppImage.blockmap, latest-linux.yml | 4 |
| Windows | .exe (NSIS), -portable.exe, .exe.blockmap, latest.yml | 4 |
| Container | multi-arch image ghcr.io/jrmatherly/1code-api:v0.0.XX signed | 1 + 1 sig |
Download inventory:
gh release download v0.0.XX --dir /tmp/release-v0.0.XX
ls -la /tmp/release-v0.0.XX | wc -l
If count < 17, a job silently dropped an artifact. Investigate.
On an Apple Silicon Mac:
# Download → drag to Applications → first-run attempt
xattr -l /Applications/1Code.app # should show com.apple.quarantine initially
codesign -dv --verbose=4 /Applications/1Code.app 2>&1 | head -10
spctl -a -vv /Applications/1Code.app
Expected:
codesign shows Apple Developer ID with notarization ticket stapledspctl prints accepted + Notarized Developer IDFirst-launch test: double-click the DMG, drag app to Applications, launch. Gatekeeper should NOT show "cannot be opened because it is from an unidentified developer." If it does, notarization failed and the release must be deleted.
Repeat on an Intel Mac for the x64 artifact.
On a Linux host (Ubuntu 22.04 or similar):
# AppImage
chmod +x /tmp/release-v0.0.XX/1Code-v0.0.XX.AppImage
/tmp/release-v0.0.XX/1Code-v0.0.XX.AppImage --appimage-help
./1Code-v0.0.XX.AppImage # should launch cleanly
# .deb
sudo apt install ./1Code-v0.0.XX.deb
1code # or whatever the binary name is
Verify auth-bypass dev flag works for initial smoke (login infrastructure is out-of-scope for a release smoke — use MAIN_VITE_DEV_BYPASS_AUTH=true).
On Windows 10/11:
.exe — SmartScreen should allow it (code-signed). If SmartScreen warns "publisher unknown", the Windows signing step failed silently. Delete release.-portable.exe — should also boot cleanly from any location.Known gotcha: v0.0.80 Windows postinstall failed because electron-builder didn't include a native dep. Verify the app reaches the main window, not a crash dialog.
Install the prior version (v0.0.84) first if possible, then:
If the updater doesn't find the new version, check latest.yml / latest-mac.yml / latest-linux.yml in the artifacts — they must reference the release assets correctly.
# Pull
docker pull ghcr.io/jrmatherly/1code-api:v0.0.XX
# Verify Cosign signature (keyless, GitHub OIDC)
cosign verify \
--certificate-identity-regexp "^https://github.com/jrmatherly/1dev" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
ghcr.io/jrmatherly/1code-api:v0.0.XX
# Verify Trivy scan ran clean (or had only .trivyignore'd CVEs)
trivy image --severity HIGH,CRITICAL ghcr.io/jrmatherly/1code-api:v0.0.XX
Cosign must succeed (non-zero = unsigned = delete release). Trivy should show no unaccepted HIGH/CRITICAL CVEs; check .trivyignore for exemptions.
On each OS, run a round-trip chat to verify the embedded binaries work:
This catches issues like the v0.0.80 macOS Codex 403 regression (API contract change in the pinned 0.118.0 binary's download URL).
stapler validate /Applications/1Code.app
# Expected: "The validate action worked!"
If staple validation fails, the DMG shipped without the stapled notarization ticket — users with stale Gatekeeper caches will get the "cannot verify" dialog. Delete and re-release.
Only after all steps above pass:
gh release edit v0.0.XX --draft=false --latest
This makes the release visible at https://github.com/jrmatherly/1dev/releases/latest and triggers the auto-updater across all deployed clients.
DELETE the release before it auto-promotes:
gh release delete v0.0.XX --yes
git tag -d v0.0.XX
git push --delete origin v0.0.XX
Then fix the root cause and re-release. Do not ship a patch over a broken release — users who downloaded the broken version will be stuck on it until they manually re-download.
After a successful smoke, capture the log:
v0.0.XX smoke — 2026-MM-DD
✅ Step 1 CI green (run <id>)
✅ Step 2 Artifact inventory (17/17)
✅ Step 3 macOS arm64 Gatekeeper + first launch
✅ Step 3 macOS x64 Gatekeeper + first launch
✅ Step 4 Linux AppImage + .deb launch
✅ Step 5 Windows SmartScreen + NSIS install
✅ Step 6 Auto-update from v0.0.(X-1)
✅ Step 7 Container Cosign + Trivy verification
✅ Step 8 Codex + Claude CLI round-trip (3 OS)
✅ Step 9 macOS notarization staple
✅ Step 10 Promoted
Append to docs/operations/release.md → "Release history" section if that section exists, otherwise reference from the roadmap "Recently Completed" table.
docs/operations/release.md — canonical release runbook.claude/skills/release/SKILL.md — the release initiation skill (this smoke skill is the post-build companion).github/workflows/release.yml — the 3-OS matrix workflow.github/workflows/container-build.yml — the container + Cosign workflowdevelopment
Background knowledge for AI agents before editing any file that handles authentication tokens or spawn environment variables in the 1Code enterprise fork. Triggers when touching src/main/lib/trpc/routers/claude.ts, claude-code.ts, claude/env.ts, feature-flags.ts, or claude-token.ts. Reminds the agent to consult the frozen Envoy Gateway strategy doc (auth-strategy-envoy-gateway.md v2.1) sections that impose hard rules on credential handling.
tools
Background knowledge for safely bumping the pinned versions of Claude CLI binary, Codex CLI binary, Electron, Vite, Tailwind, or Shiki in this repo. Each pin is load-bearing for a different reason — this skill encodes the per-pin rationale and the regression test that must pass before the bump can land. Use proactively whenever editing package.json, scripts/download-claude-binary.mjs, scripts/download-codex-binary.mjs, or any file that mentions these versions. Claude-only (background knowledge, not user-invocable).
development
Use when reading or writing any file under src/renderer/ that calls remoteTrpc.* or fetch(${apiUrl}/...). Verifies the call site is documented in docs/enterprise/upstream-features.md and warns if a new upstream-backend dependency is being introduced without a corresponding F-entry. This skill enforces the enterprise-fork posture documented in CLAUDE.md.
development
End-of-task sync — update CLAUDE.md, rebuild code graph, sync Serena memories, check roadmap drift, and commit. Run after completing any significant work to ensure all drift surfaces are current.