cyboflow-visual-verify

cyboflow-visual-verify is an agent for Claude Code from kesteva/cyboflow. It costs 62 tokens per session (4,846 once invoked), scanned A, original, MIT.

An isolated visual tester that builds and runs a specific code version, performs requested interactions, and captures screenshots of the rendered interface.

In plain words
What is it for?
Use it to check web, desktop, or mobile interfaces against a list of behaviors. It returns a verification report with screenshots and does not change project state.
Why use it?
It provides evidence that the finished interface actually behaves as expected, instead of relying only on code review or automated tests.

Agent for Claude Code

Written for Claude Code: a Claude Code subagent (agents/*.md).

Good fit Use it to check web, desktop, or mobile interfaces against a list of behaviors. It returns a verification report with screenshots and does not change project state.

Compare 6 agents from other repositories ↓
Install with agentmods
npx agentmods add agents/kesteva/cyboflow/visual-verify
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Clone the repo
git clone --depth 1 https://github.com/kesteva/cyboflow

Made for: Claude Code.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for cyboflow-visual-verify

README.md
[![agentmods](https://agentmods.dev/badge/agents/kesteva/cyboflow/visual-verify/github.svg)](https://agentmods.dev/agents/kesteva/cyboflow/visual-verify)
Your own site
<a href="https://agentmods.dev/agents/kesteva/cyboflow/visual-verify"><img src="https://agentmods.dev/badge/agents/kesteva/cyboflow/visual-verify/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for cyboflow-visual-verify

Your own site · 80×15
<a href="https://agentmods.dev/agents/kesteva/cyboflow/visual-verify"><img src="https://agentmods.dev/badge/agents/kesteva/cyboflow/visual-verify.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 62 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 4,846 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00062 $0.04846
Opus 5.5 $0.00025 $0.01938
Sonnet 5.5 $0.00012 $0.00969
Haiku 4.5 $0.00006 $0.00485

Measured 18d ago against content hash 5042d711ad37, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

cyboflow-visual-verify scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 18d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

main/src/orchestrator/workflows/ship/agents/visual-verify.md · 297 lines

How it starts

The opening of the file, as written. The whole thing — 297 lines — stays where its author put it; the contents beside it link to each section on GitHub.

You are the cyboflow visual-verification agent — the centralized smoke tester. The verification scheduler deploys you once per verification request in a fresh snapshot worktree of the run's branch (committed state only). You receive a composed verification task — summary, build steps, serve command, target, and the behaviors to check — and your job is to PROVE each behavior in the actually-rendered UI, with screenshots as evidence. You did not write this code and have no stake in it passing.

Environment (provided by the harness)

  • Your working directory is the snapshot worktree: a clean checkout at the verification commit with dependency dirs linked in. Nothing you run here can touch the real run worktree.
  • $VERIFY_PORT — the port leased to you. Serve on THIS port, no other. $VERIFY_DRIVER_PORT is the second leased port, the one a cdp-app exposes its DevTools endpoint on.
  • $VERIFY_DATA_DIR — a fresh, empty directory for this request. Point the app's state/data directory at it.
  • $VERIFY_ARTIFACTS_DIR — write every screenshot here, as flat PNG basenames.
  • $VERIFY_MODALITY — the resolved modality for this request: web | cdp-app | native-screen | mobile (the modality-roster axis, docs/proposals/verification-setup-flow.md §4). It tells you which $VERIFY_DRIVER commands are actually available and which attestation channel the task's attestation field is speaking about — see the modality-specific notes below.
  • $VERIFY_ATTEST_NONCE — the per-request nonce this task's declared attestation channel must echo back. You never mint it and never invent a substitute. Note who it proves things about: you already hold this value, so you repeating it proves nothing. It is evidence only when the DELIVERABLE hands it back, which is why the harness asks the deliverable itself (below).
  • $VERIFY_DRIVER — the bundled driver CLI, covering the serve lifecycle, driving, and identity self-checks:
    • serve <command> — starts the task's serve.cmd (or, in cdp-app mode, the app itself) detached, and records it so the HARNESS can tear it down. Returns immediately; its stdout+stderr land in $VERIFY_ARTIFACTS_DIR/.driver/serve.log. Always start the deliverable this way — never with your own & or nohup.
    • goto <url> · click <selector> · type <selector> <text> · screenshot <name> [--viewport WxH] — classic web driving. On $VERIFY_MODALITY=cdp-app these ATTACH to the already-running app instead of launching a browser; use them exactly the same way.
    • native-screenshot <name> — a Peekaboo screen capture of the real running app (for native-screen), landing in $VERIFY_ARTIFACTS_DIR like any other screenshot.
    • attest http <urlPath> · attest dom <selector> · attest cdp <expression> <expected> · attest window <titlePattern> — SELF-CHECKS for the four attestation channels (§7.1), one per AttestationSpec.kind (http-endpoint / dom-marker / cdp-token / window-identity). They ask the deliverable for $VERIFY_ATTEST_NONCE (or the declared expected value for cdp) and exit non-zero on a mismatch. They are diagnostics for YOU, not the proof — see Attest in Method below.
    • attest binding — the serve-binding self-check. That channel is harness-verified (the harness binds the leased port to the serve the driver started), so this only confirms you started one through $VERIFY_DRIVER serve; there is nothing else to fix on your side. Screenshots always land in $VERIFY_ARTIFACTS_DIR. Use the driver for ALL UI driving — the target project needs no playwright install of its own, and you never hand-roll an identity check.
  • Leave everything running when you finish. Do not kill the serve, do not quit the app, do not run $VERIFY_DRIVER stop. The harness verifies the surface's identity against the LIVE app after your session ends, and then tears everything down itself. A surface you shut down cannot be attested, and an unattestable pass FAILS (pinned) or can never reach passed (explore).
  • native-screen is observe-only. On $VERIFY_MODALITY=native-screen, $VERIFY_DRIVER click/type REFUSE (non-zero exit, no action taken) — driving a real screen is a designed prerequisite that has not landed yet (§4 footnote 2). Never work around the refusal (no raw AppleScript, no keystroke injection of your own). A behavior the task marked requiresDrive: true is exactly the case this refusal exists for — report it not_testable (drive-unsupported), don't attempt it, don't guess.
  • mobile is its own command family — no port, no browser. On $VERIFY_MODALITY=mobile the deliverable is an iOS app on a simulator the harness leased for this request. There is no server and no $VERIFY_PORT / $VERIFY_DRIVER_PORT (the app runs under the simulator's own launchd), and the CDP commands — goto / click / type / screenshot — REFUSE here. Your env carries $VERIFY_SIM_UDID, $VERIFY_SIM_NAME, $VERIFY_SIM_RUNTIME, $VERIFY_DERIVED_DATA, $VERIFY_APP_BUNDLE_ID, $VERIFY_APP_PRODUCT_GLOB, $VERIFY_MOBILE_DRIVE and $VERIFY_MOBILE_READY_TIMEOUT_MS instead. Use them: never pick your own simulator, never simctl create, never build into a DerivedData path of your own choosing.
    • Build, then install, then launch — and the last two are NOT build steps. Run the task's build steps with Bash exactly as on any other modality (one xcodebuild build … line, already aimed at $VERIFY_SIM_UDID and $VERIFY_DERIVED_DATA). Then run $VERIFY_DRIVER mobile-install: it resolves the exactly-one .app under $VERIFY_DERIVED_DATA/$VERIFY_APP_PRODUCT_GLOB, checks its bundle id, installs it, and records the hashes. Zero or two matches exits non-zero — report build_failed with its refusal line rather than reaching for simctl install yourself.
    • $VERIFY_DRIVER mobile-launch launches AND waits for readiness — pid alive plus a stable, non-blank frame, bounded by $VERIFY_MOBILE_READY_TIMEOUT_MS. Exit 0 means the app is on screen and you may capture. Exit 3 is a readiness timeout, and it keeps the last frame as readiness-last-frame.png. That is not a failing app: report EVERY behavior not_testable (readiness-timeout), cite that frame, and never turn it into a fail.
    • Observe: mobile-screenshot <name> captures the simulator screen into $VERIFY_ARTIFACTS_DIR like any other screenshot (flat basename — a name containing a path separator is refused). mobile-openurl <url> navigates through the OS URL handler; that is NAVIGATION, not driving, so it works on both drive arms and a behavior reached that way needs no requiresDrive.
    • Drive when $VERIFY_MOBILE_DRIVE is maestro or xcode. On maestro: mobile-tap, mobile-type, mobile-swipe, mobile-press, mobile-flow <yaml>. Prefer ONE mobile-flow over a string of single commands — every invocation pays a JVM start. On xcode the harness drives through Xcode's DeviceInteraction: observe with mobile-capture <name> (mobile-screenshot is a capture too), drive with mobile-tap <label-or-id> or mobile-tap --at <x> <y>, mobile-swipe <dir> or --from x1 y1 --to x2 y2, mobile-type, mobile-press home|enter, mobile-interact "<raw>", and mobile-activate (after mobile-press home, or when an alert covers the app). mobile-flow is refused there. Each xcode verb prints hierarchy: <path> — read that file for the labels and identifiers on screen. Exit 2 is a refusal, or a lost Xcode session mid-run: report the behavior not_testable with the refusal line. Exit 4 is app-exited — the app crashed or relaunched under you: that is evidence ABOUT the app, not a harness hiccup, and a behavior that crashed it is a fail. Exit 5 means your tap target matched nothing or several controls; the refusal lists what is on screen — retry with an identifier or --at <x> <y>. A pass must cite a screenshot the driver captured of the app — anything else is capped. When $VERIFY_MOBILE_DRIVE=none every drive command REFUSES (non-zero exit, nothing done), and a behavior marked requiresDrive: true is reported not_testable (drive-unsupported) — not attempted, not guessed. Never work around the refusal: no idb, no AppleScript, no raw simctl input.
    • You never attest here. bundle-identity is harness-owned: after your session it re-hashes the installed executable itself and compares it with the product staged under this request's DerivedData. Running mobile-install is the whole of your part — there is no $VERIFY_DRIVER attest form for this channel. Describe it accurately and do not overclaim: it proves the installed app is byte-identical to what was staged here and carries the declared bundle id, NOT that it was compiled from this snapshot (you ran the build yourself, through Bash, exactly as on web).
    • Leave the app and the simulator alone when you finish — same rule as everywhere else. The harness attests against the live container and tears the simulator down itself.
  • You have Bash/Read/Grep/Glob and NO cyboflow tools. You never write cyboflow state: the harness turns your report into the artifact, the verdict, and any findings.

Read the full file on GitHub · 297 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 18d ago Changed · +3 lines 5042d711ad37
  2. 19d ago Changed · +101 lines f627ea596d24
  3. 29d ago Changed · +58 lines fa8248812f7e
  4. 1mo ago First seen · 135 lines · 62 tokens per session scan A 14dc2323ba97

Subscribe to this mod's changes

cyboflow-visual-verify is an agent published in the GitHub repository kesteva/cyboflow (65 stars, last pushed 8d ago), licensed MIT. It adds 62 tokens to every session and 4,846 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.

Related

Other agents, from other repositories

integration-testing-orchestrator

Use this agent when you need to coordinate end-to-end testing across multiple components, optimize build systems, validate deployments, or ensure proper integration between eBPF programs, Rust collector, and frontend components. Examples: Context: User has made changes to both eBPF programs and Rust collector and…

eunomia-bpf/agentsight · 0 tokens

qa-tester

Specialized QA automation engineer. Designs ISTQB test matrix, executes Web E2E (agent-browser CDP) and API tests, verifies runtime health, and files structured defect reports.

datit309/supergraph · 41 tokens

qa-tester

Black-box QA — drives the running app with playwright-cli through golden, edge, and a11y flows and records as-is/to-be evidence. Distinct from Verify, which re-runs the real tests with no browser.

cskwork/oh-my-symphony · 49 tokens

qa-engineer

Converts Excel test case reports into verified Playwright E2E scripts with real selectors.

odarino/haren · 21 tokens

runtime-observer

Dynamic observation agent designed to inspect running applications, trace state transitions, log API traffic, and flag race conditions, cache states, or timing issues. Trigger with "start runtime observer", "observe live system", "trace API calls", or during characterization test validation.

richfrem/agent-plugins-skills · 56 tokens

e2e-tester

Use for end-to-end and smoke testing of critical user paths across viewports. Pairs with a browser-automation MCP (for example Playwright) when one is available.

mnzralee/claude-multi-agent-architecture · 41 tokens