agentleFS
coreyhaines31coreyhaines31/spare/.claude/skills/verify/SKILL.md

verify

Skill11 starsChanged 19 days agoMITView on GitHub

Drive a dev build of Spare (macOS menu bar app + `spare` CLI) the way a user does and capture proof. Use before claiming a Spare change works, to reproduce a bug, or when asked to verify/test Spare end to end.

We split this skill into the rules it gives an agent

6 rules. 0 are common, 0 are distinctive, and 6 are very specific to this project.

  • 0

    Common

    Most of the 168 edited versions we read keep these.

  • 0

    Distinctive

    This author's own choices. Worth a look.

  • 6

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Only one Spare can run at a time.

    line 24
  2. Very specific:

    Every line must read ok:

    line 47
  3. Very specific:

    no other Spare instance is running

    line 49
  4. Very specific:

    Use $V cli ... for every CLI action so evidence is recorded.

    line 56
  5. Very specific:

    Never approve a request against the person's real apps.

    line 60
  6. Very specific:

    Verify side effects with a second read: after a declined or timed-out quit, list --projects --json still lists the fixture port and curl …

    line 70

“Common” is measured: kept by at least 6 in 10 of the 168 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Verify Spare

Spare is a macOS menu bar app (no Dock icon, LSUIElement) plus a spare command-line tool bundled inside it at Spare.app/Contents/MacOS/spare-cli. The CLI is the scripted surface: most commands read the Mac directly, and idle, quit, and leftovers --close talk to the running app over distributed notifications. The panel is SwiftUI in an NSPopover.

Everything goes through one helper. Run it from anywhere in the repo:

V=.claude/skills/verify/scripts/spare-verify
$V build            # make app -> dist/Spare.app (release build, ad-hoc signed)
$V launch           # park the installed Spare, start the dev build, wait until ready
$V doctor           # read-only health check; run first and after anything surprising
$V cli <args...>    # run the dev build's `spare`, recording evidence
$V fixture-server <name>   # throwaway python http.server Spare lists as a project; prints its port
$V teardown         # stop what launch started, restore the installed Spare and its data

Isolation (read this first)

Only one Spare can run at a time. Every copy shares the bundle id com.spareformac.Spare, the defaults domain, ~/Library/Application Support/Spare/recaps.json, and the request notification channel, so a spare quit would reach two instances at once. So launch:

  1. records any running Spare (normally ~/Applications/Spare.app, the person's own) in .build/verify-state/parked,
  2. exports the defaults domain and copies recaps.json into the state dir,
  3. quits the installed copy (Apple Event, then SIGTERM by PID, never by name),
  4. starts dist/Spare.app with open -n -g.

teardown reverses all of it. Never leave a run without teardown: until then the person's own Spare is not running. If a run dies midway, run teardown; it works from whatever state exists.

Launch

$V build && $V launch

Ready means spare idle --json succeeds, which needs the CLI to find the running app by bundle id. Launch prints ready: pid <pid>, evidence in <dir>. There is no data dir to seed; Spare reads live processes. On launch the app opens its panel and activates itself, so the person sees it appear. That is expected.

Doctor

$V doctor

Every line must read ok:

  • the recorded PID runs this checkout's dist/Spare.app
  • no other Spare instance is running
  • the build is newer than every file in Sources/ (otherwise build, teardown, launch)
  • the CLI reaches the running app
  • status --json parses

Drive

Use $V cli ... for every CLI action so evidence is recorded. Address things by port or id from --json output, not by display name: names like Claude · coreyhaines change with the person's workload.

For anything that could close something (quit, leftovers --close), target only what this run started. fixture-server creates a folder outside the repo (under $TMPDIR/spare-verify-fixtures/) running python3 -m http.server, which Spare lists as a Project with that port. Started inside the checkout, Spare would group it with the whole repo, and stopping it would stop everything running there.

Never approve a request against the person's real apps. Prove the request path with --timeout N: the app answers waiting, the CLI times out, withdraws the request, and exits 4.

The panel itself can only be driven or captured when the terminal has Accessibility and Screen Recording permission (System Settings > Privacy & Security). Without them, osascript UI scripting fails with -1719 and screencapture fails with "could not create image from display". Check before planning a panel proof: see features/panel.md.

Evidence

Each $V cli call writes NN.cmd, NN.stdout, NN.stderr, NN.exit into artifacts/verify/<run-id>/ (gitignored). Proof standards:

  • Exercise the real CLI or panel path, never internal functions or test-only flags. Spare --snapshot is a debug sampler, not a user path.
  • Capture the action and the resulting state: for a request, the waiting note on stderr (Waiting for approval in Spare's panel) plus the final JSON outcome and exit code.
  • Verify side effects with a second read: after a declined or timed-out quit, list --projects --json still lists the fixture port and curl against it still answers.
  • Readings are live and vary between calls; assert shapes, kinds, and exit codes, not exact numbers.

Cleanup

$V teardown

It kills fixture servers and the dev Spare by the PIDs it recorded, re-imports the saved defaults, restores recaps.json, relaunches every parked app, and removes .build/verify-state/. It never touches artifacts/verify/. Afterwards, confirm the person's Spare is back: pgrep -lf 'Spare.app/Contents/MacOS/Spare$' shows ~/Applications/Spare.app (or /Applications/Spare.app).

Feature map

features/README.md lists every mapped feature with its recipe. A proof through one entry point does not cover the others the map lists.

Gotchas

  • status exits 2 under Warning and 3 under Critical memory pressure. That is a successful reading, not an error.
  • Release Info.plist is reused, so the dev build has Sparkle pointed at the real appcast. If the checkout's version is behind the latest release, Sparkle may offer an update in the dev build; dismiss it, never install.
  • Anything the person's Spare would have recorded while parked is not recorded; the restored recaps.json drops what the dev build wrote.
  • idle only knows about apps used since this Spare launched, so it is empty right after launch.

Download now (ZIP)

  • Other versions188 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 188

    1. react/react★ 252ksame name
    2. facebook/react★ 252ksame name
    3. garrytan/gstack★ 139ksame name
    4. oven-sh/bun★ 96ksame name
    5. anthropics/financial-services★ 41ksame name
    6. anthropics/financial-services-plugins★ 41ksame name
    7. Yeachan-Heo/oh-my-claude-sisyphus★ 40ksame name
    8. Yeachan-Heo/oh-my-claudecode★ 40ksame name
    9. anthropics/claude-quickstarts★ 19ksame name
    10. NVIDIA-NeMo/Speech★ 19ksame name

    178 more not listed

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • Used alongsideProjects with it also use external-context, instinct-export and 10 more.

    Other files people use alongside this one.

    Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
    • Jurel89Skill

      external-context

      Invoke parallel document-specialist agents for external web searches and documentation lookup

      Also in 3 projects that use this

    • TheKREATORSSkill

      instinct-export

      Export instincts from project/global scope to a file

      Also in 3 projects that use this

    • TheKREATORSSkill

      instinct-import

      Import instincts from file or URL into project/global scope

      Also in 3 projects that use this

    • diego-tobalinaSkill

      build-fix

      Fix build and compilation errors systematically. Run when build fails.

      Also in 5 projects that use this

    • AviadPSkill

      risk-assess

      Assess the risk and blast radius of a proposed code change before implementing it. Evaluates CI impact, framework-wide vs localized scope, rollback path, and identifies blindspots. Use when user says "what's the risk", "is this safe", "assess the impact", "risk assess", "blast radius", or before applying framework-wide or CI-affecting changes. Do NOT use for code quality review (use code-quality) or plan validation (use design-validator).

      Also in 3 projects that use this

    • AaravChadhaSkill

      secure

      Security review with a confidence gate - a finding exists only with a concrete exploit scenario and a high/medium/low confidence rating; everything else goes to a worth-hardening list, never inflated. Sweeps five surfaces: auth gates, secrets hygiene, injection and unsafe sinks, unsafe deserialization/crypto/transport, and LLM tool-use trust boundaries. Reports only, never fixes. Use when the user asks for a security review or to check vulnerabilities, secrets, or auth.

      Also in 3 projects that use this

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.