.claude/skills/test-release/SKILL.md
# test-release: Smoke Test a Fazm Release Smoke test a Fazm release. Use when the user says "test the release", "smoke test", or "verify the build works". **This skill does NOT build anything.** It tests the shipped product via Sparkle auto-update. ## Channel → Machine Mapping Both the local production app (`/Applications/Fazm.app`) and the MacStadium remote are on the `staging` channel. Staging releases get tested on **both** machines; the primary test is the **local** machine (more reliabl
npx skillsauth add m13v/fazm .claude/skills/test-releaseInstall 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.
Smoke test a Fazm release. Use when the user says "test the release", "smoke test", or "verify the build works".
This skill does NOT build anything. It tests the shipped product via Sparkle auto-update.
Both the local production app (/Applications/Fazm.app) and the MacStadium remote are on the staging channel. Staging releases get tested on both machines; the primary test is the local machine (more reliable, no rate limits), with the remote as secondary.
| Channel | Test machines | update_channel | Sparkle sees |
|---------|-------------|-------------------|-------------|
| staging | Local + MacStadium remote | staging | staging + beta |
| beta | Local + MacStadium remote | staging (sees beta too) | beta |
| stable | Both | — | all |
NEVER change either machine's update_channel. Both must stay staging.
NEVER promote to the next channel yourself. Each promotion (staging→beta→stable) requires explicit user approval. Only test the channel that was just promoted.
/Applications/Fazm.app./scripts/macstadium/ssh.sh)Send each query via distributed notification. Wait 15 seconds between queries. After each, check logs for errors.
# Query 1: Basic chat
xcrun swift -e 'import Foundation; DistributedNotificationCenter.default().postNotificationName(.init("com.fazm.testQuery"), object: nil, userInfo: ["text": "What is 2+2?"], deliverImmediately: true); RunLoop.current.run(until: Date(timeIntervalSinceNow: 1.0))'
# Query 2: Memory recall
xcrun swift -e 'import Foundation; DistributedNotificationCenter.default().postNotificationName(.init("com.fazm.testQuery"), object: nil, userInfo: ["text": "What do you remember about me?"], deliverImmediately: true); RunLoop.current.run(until: Date(timeIntervalSinceNow: 1.0))'
# Query 3: Tool use / Google Workspace
xcrun swift -e 'import Foundation; DistributedNotificationCenter.default().postNotificationName(.init("com.fazm.testQuery"), object: nil, userInfo: ["text": "What events do I have on my calendar today?"], deliverImmediately: true); RunLoop.current.run(until: Date(timeIntervalSinceNow: 1.0))'
# Query 4: File system
xcrun swift -e 'import Foundation; DistributedNotificationCenter.default().postNotificationName(.init("com.fazm.testQuery"), object: nil, userInfo: ["text": "List the files on my Desktop"], deliverImmediately: true); RunLoop.current.run(until: Date(timeIntervalSinceNow: 1.0))'
For remote queries, wrap in: ./scripts/macstadium/ssh.sh "xcrun swift -e '...'" (escape inner quotes).
After each query:
grep -i "error\|fail\|crash\|unauthorized\|401" /private/tmp/fazm.log | tail -5grep -i "Prompt completed\|Chat response complete" /private/tmp/fazm.log | tail -5defaults read com.fazm.app update_channel — must be stagingpgrep -la Fazm (launch with open -a "Fazm" if needed)defaults delete com.fazm.app SULastCheckTimemacos-use MCP to open Fazm, navigate to Settings > About, click "Check for Updates"pkill -x Fazm (Sparkle needs the process gone to replace the binary)defaults read /Applications/Fazm.app/Contents/Info.plist CFBundleShortVersionStringopen -a "Fazm"/private/tmp/fazm.log after each./scripts/sentry-release.sh --version X.Y.ZThe remote uses SSH + Sparkle's silent auto-install (no GUI clicks needed). The remote machine's Claude account frequently hits rate limits — if queries fail with "You've hit your limit", note as blocked (rate limit) and move on; it's not an app bug.
./scripts/macstadium/ssh.sh "defaults read com.fazm.app update_channel" — must be staging./scripts/macstadium/ssh.sh "defaults delete com.fazm.app SULastCheckTime 2>/dev/null; echo done"./scripts/macstadium/ssh.sh "pkill -x Fazm; sleep 3; open /Applications/Fazm.app"Sparkle: Found update vX.Y.Z and Sparkle: Installer launched: ./scripts/macstadium/ssh.sh "grep -i 'Sparkle' /private/tmp/fazm.log | tail -10"./scripts/macstadium/ssh.sh "pkill -x Fazm"./scripts/macstadium/ssh.sh "defaults read /Applications/Fazm.app/Contents/Info.plist CFBundleShortVersionString"./scripts/macstadium/ssh.sh "open /Applications/Fazm.app; sleep 5; pgrep -la Fazm"| Test | Machine | Result | |------|---------|--------| | App updated to vX.Y.Z | local/remote | pass/fail | | Basic chat ("2+2") | local/remote | pass/fail | | Memory recall | local/remote | pass/fail | | Tool use (calendar) | local/remote | pass/fail | | File system (Desktop) | local/remote | pass/fail | | Sentry errors | — | 0 new / N new |
pass = AI responded without errors in logs fail = no response, error in logs, or crash
__pycache__ files written inside the app bundle.error, crash, unauthorized, 401, or failed during the querydevelopment
# FAZM Inbox Agent Read ~/fazm/inbox/skill/AGENT-VOICE.md first — it has your persona, tone rules, examples, and investigation workflow. **Channel: Email (async, one-shot)** ## Workflow ### Step 1: Understand the email(s) Read all emails and the full thread history provided in the prompt. You may receive multiple unprocessed emails from the same user (e.g., they sent a bug report, then a follow-up, then a correction). Treat them as one batch: read all of them, then categorize the combined i
devops
Release a new version of OMI Desktop. Analyzes changes since last release, generates changelog, and runs the full release pipeline.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.