Self Verify Prowl logo

Self Verify Prowl

Community
onevcat
self-verify-prowl

Explicitly verify Prowl changes end to end in a separate Prowl Debug instance with a dedicated PROWL_CLI_SOCKET. Use only when the user explicitly requests self-verify-prowl or asks to run end-to-end verification against Prowl Debug. Do not invoke automatically after ordinary implementation work, and do not use it as a replacement for tests, make check, or make build-app.

Overview

Publisheronevcat
RepositoryProwl
Skill nameself-verify-prowl
Stars
647
Forks
66
Bundled files
3
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 3 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by onevcat on GitHub. Read the source before you install it.

Installation

Install the Self Verify Prowl AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/onevcat/Prowl/tree/main/.claude/skills/self-verify-prowl
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/onevcat/Prowl.git /tmp/Prowl
mkdir -p .claude/skills
cp -r /tmp/Prowl/.claude/skills/self-verify-prowl .claude/skills/self-verify-prowl
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Self Verify Prowl in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Self Verify Prowl on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Self Verify Prowl is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Self Verify Prowl

Invocation Contract

Run this skill only after an explicit user request. A request to implement, fix, test, or build Prowl does not by itself authorize this workflow.

This skill is an opt-in end-to-end layer on top of focused tests, make check, and make build-app. It launches a real GUI app, reads shared user data, and is slower and less deterministic than those checks.

Use one of these final outcomes for every scenario:

  • PASS — every stated assertion has direct evidence.
  • FAIL — the observed result contradicts an assertion.
  • SKIPPED — a declared capability or permission is unavailable, so no action was attempted.
  • INCONCLUSIVE — the action ran, but the available evidence cannot prove or disprove the assertion.

Never turn missing evidence into PASS.

Define the Scenario First

Before building or launching, write a small verification contract:

  1. Setup — the worktree, initial tab or window, and required state.
  2. Action — the exact CLI command or UI interaction.
  3. Assertions — observable terminal text, JSON fields, accessibility state, or pixel-level result.
  4. Evidence source — prowl, an accessibility-capable desktop tool, a PID-scoped screenshot, or a targeted log marker.
  5. Cleanup — temporary tabs, panes, processes, sockets, and artifacts.

Keep scenarios narrow. “The app launched” or “the UI looks correct” is not a sufficient assertion.

Choose the Control Surface

Use the smallest surface that can prove the assertion:

  1. Use prowl for worktrees, tabs, panes, terminal contents, command routing, task state, and agent sessions.
  2. Use the repository's prowl-ui skill for native UI labels, roles, enabled or selected state, navigation, sheets, menus, popovers, and buttons, but only after its deterministic preflight returns READY.
  3. Use a PID-scoped screenshot only for geometry, clipping, visual hierarchy, or other pixel-level assertions.
  4. Use targeted ProwlLogger markers only when neither public CLI state nor accessibility state exposes the behavior.

A screenshot alone does not prove that a control is enabled, selected, actionable, or wired to the intended behavior. AppleScript coordinate loops are not an acceptable fallback. If no suitable control surface exists, report SKIPPED or INCONCLUSIVE instead of retrying blindly.

Before writing any prowl command, load and read the prowl-cli skill. It is authoritative for JSON fields, selectors, quoting, argument semantics, and error codes.

For a native UI scenario, run the cheap dependency gate before loading the full prowl-ui skill:

bash
ui_status=0
ui_preflight="$(.claude/skills/prowl-ui/scripts/preflight.sh)" || ui_status=$?
printf '%s\n' "$ui_preflight"

Exit 0 means READY: load .claude/skills/prowl-ui/SKILL.md and continue. Exit 2 means SKIPPED: record its JSON reason and stop that UI scenario without entering an LLM-driven interaction loop. Do not install or authorize a dependency during self-verification.

Preconditions

  • Work from the Prowl repository root.
  • Preserve unrelated user changes and never stop the user's installed Prowl app.
  • Use the repo CLI (./CLI/.build/debug/prowl) when CLI code or protocol behavior changed.
  • Treat the debug app as sharing the installed app's ~/Library data. Do not mutate real settings unless the scenario explicitly requires it and restores the previous value.
  • Limit read-only recovery to two short retries after a transient error. Never retry an action whose delivery is uncertain; observe the resulting state first.

Launch the Separate Debug App

Use the dedicated socket /tmp/prowl-self-verify.sock. Clean stale artifacts, then keep make run-app alive in a persistent shell or PTY for the whole run:

bash
rm -f /tmp/prowl-self-verify.sock /tmp/prowl-self-verify.sock.lock
mkdir -p /tmp/prowl-self-verify
PROWL_CLI_SOCKET=/tmp/prowl-self-verify.sock make run-app >/tmp/prowl-self-verify/run-app.log 2>&1

Do not launch the ProwlApp executable directly from a short-lived background shell. When PROWL_CLI_SOCKET is set, CLI auto-launch is disabled; every CLI call must use the same socket.

If the socket exists but the CLI returns APP_NOT_RUNNING, remove the stale socket and lock only after confirming no debug ProwlApp process remains, then relaunch. If it returns SOCKET_PERMISSION_DENIED, report the sandbox limitation instead of repeatedly reconnecting.

Load the Helpers and Check Health

Source the bundled helpers after launch and before each later shell command:

bash
. .claude/skills/self-verify-prowl/scripts/helpers.sh
wait_for_prowl_debug

The helpers provide:

  • prowl_debug — runs the configured CLI against the dedicated socket.
  • debug_pids — returns only Prowl executables inside a DerivedData Debug product.
  • debug_pid_with_window and debug_window_id — select the visible debug window by PID.

If the helper test changed, run it directly:

bash
bash .claude/skills/self-verify-prowl/scripts/helpers_test.sh

Parse JSON with direct pipes, files, or printf '%s\n' "$json" | jq. Do not use echo "$json" | jq; zsh may reinterpret escape sequences. Invalid control characters in direct CLI output are a CLI regression, not a reason to weaken parsing.

Drive Terminal Scenarios with Prowl CLI

Build the repo CLI when required:

bash
make build-cli
cli="./CLI/.build/debug/prowl"

Seed the debug app and create a disposable tab:

bash
opened="$(prowl_debug open . --json)"
worktree="$(printf '%s\n' "$opened" | jq -r '.data.target.worktree.id')"
created="$(prowl_debug tab create --worktree "$worktree" --json)"
pane="$(printf '%s\n' "$created" | jq -r '.data.target.pane.id')"
tab="$(printf '%s\n' "$created" | jq -r '.data.target.tab.id')"

prowl_debug send --pane "$pane" 'printf "SELF_VERIFY:%s\n" "$PWD"' \
  --capture --timeout 30 --json | jq -r '.data.capture.text'
prowl_debug read --pane "$pane" --last 80 --wait-stable --json | jq -r '.data.text'

Prefer pane and tab UUIDs returned by JSON over titles. A fresh debug app may be windowless, so call open . before expecting list to contain panes.

Important JSON fields:

  • read --json: .data.text
  • send --capture --json: .data.capture.text and .data.wait.exit_code
  • list --json: .data.items[], including .pane.id, .tab.id, .worktree.id, and .task.status

For command routing, assert a unique marker, cwd, or environment value. For tab, pane, focus, or worktree behavior, compare the targeted JSON state before and after the action. Use agents --json only when the changed behavior concerns Active Agents.

Verify UI Semantics

After the prowl-ui preflight is READY, follow that skill's Prowl-specific workflow. At minimum:

  1. Resolve the debug PID with debug_pid_with_window, then pin the AX session to that PID.
  2. Start with a compact accessibility snapshot and drill into the relevant region.
  3. Act once through a fresh semantic element reference.
  4. Re-snapshot the affected region or surface and assert the resulting label, value, role, state, window, or matching prowl JSON.
  5. Close the AX session and restore any UI state changed by the scenario.

Do not identify the debug app by appearance: it shares data with the installed app and may look identical. If a tool cannot pin reads and actions to the debug PID or exact window, do not use it while both instances are running.

Use headed or physical input only when the semantic action is unavailable and the scenario explicitly needs physical delivery. If an action returns an uncertain-delivery or app-unresponsive result, inspect the new UI state before deciding whether it failed; never repeat the action blindly.

Use Screenshots Only for Visual Assertions

Capture only the debug app's window:

bash
. .claude/skills/self-verify-prowl/scripts/helpers.sh
wid="$(debug_window_id)"
test -n "$wid"
screencapture -o -l"$wid" /tmp/prowl-self-verify/prowl-debug-window.png

Review that image only for the visual assertion declared in the scenario. A screenshot path or successful capture is not itself a verification result.

Use Targeted Logs Sparingly

The run log is /tmp/prowl-self-verify/run-app.log. Record its line count before the scenario and inspect only appended lines after the action. Filter for a marker specific to the changed behavior; do not scan the entire log or treat generic warnings as proof.

Logs can arrive asynchronously. One short wait and a second read is acceptable. After that, report the log assertion as failed or inconclusive.

Cleanup

Close every temporary tab or pane by UUID:

bash
prowl_debug tab close --tab "$tab" --force --json

Stop only the DerivedData debug process:

bash
for pid in $(debug_pids); do kill "$pid"; done
sleep 2
alive="$(debug_pids | tr '\n' ' ')"
[ -n "$alive" ] && printf 'debug still alive:%s\n' "$alive" || printf 'debug app stopped\n'

After the process stops, remove the dedicated socket, lock, and scratch directory. Never use pkill -f, and never target /Applications/Prowl.app.

Report

Report:

  • The outcome (PASS, FAIL, SKIPPED, or INCONCLUSIVE) for each scenario.
  • The CLI binary and UI control surface used.
  • Each assertion and its direct evidence.
  • Any retry, permission, or targeting limitation that affected confidence.
  • Cleanup status.

Keep build, lint, and unit-test results separate from end-to-end scenario outcomes.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Self Verify Prowl AI skill do?

Explicitly verify Prowl changes end to end in a separate Prowl Debug instance with a dedicated PROWL_CLI_SOCKET. Use only when the user explicitly requests self-verify-prowl or asks to run end-to-end verification against Prowl Debug. Do not invoke automatically after ordinary implementation work, and do not use it as a replacement for tests, make check, or make build-app.

Why use Self Verify Prowl on TypingMind?

Because you install it once and use it with any model. Self Verify Prowl is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Self Verify Prowl in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/onevcat/Prowl/tree/main/.claude/skills/self-verify-prowl. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Self Verify Prowl?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Self Verify Prowl?

As many as you like. As long as a model supports skills, you can use Self Verify Prowl with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Self Verify Prowl AI skill free?

It is published on GitHub by onevcat. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇