Getting it into your agent
This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.
/plugin marketplace add navapbc/digital-service-orchestra/plugin install dsoWrote 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.
[](https://agentmods.dev/skills/navapbc/digital-service-orchestra/visual-evaluator)<a href="https://agentmods.dev/skills/navapbc/digital-service-orchestra/visual-evaluator"><img src="https://agentmods.dev/badge/skills/navapbc/digital-service-orchestra/visual-evaluator/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.
<a href="https://agentmods.dev/skills/navapbc/digital-service-orchestra/visual-evaluator"><img src="https://agentmods.dev/badge/skills/navapbc/digital-service-orchestra/visual-evaluator.svg" alt="Reviewed on agentmods" width="80" height="20"></a>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.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00042 | $0.01842 |
| Opus 5.5 | $0.00017 | $0.00737 |
| Sonnet 5.5 | $0.00008 | $0.00368 |
| Haiku 4.5 | $0.00004 | $0.00184 |
Grade A, and why
visual-evaluator 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 2mo 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.
How it starts
The opening of the file, as written. The whole thing — 140 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Visual Evaluator Skill
Captures Playwright screenshots at discovered routes and invokes the visual-evaluator agent, producing structured JSON findings with pixel-observable spatial quality scores.
Parameters
Read from ${CLAUDE_PLUGIN_ROOT}/config/visual-evaluator-params.yaml at dispatch time.
Preconditions
Before running, check all four preconditions in order. On any failure, write visual_eval_inapplicable:<reason> to the ticket (via .claude/scripts/dso ticket tag <id> visual_eval_inapplicable:<reason>) AND surface to the integration gate via a non-zero exit or explicit annotation. Never soft-pass — emit the reason explicitly.
Gate 1: project_type=web
PROJECT_TYPE=$(bash "$PLUGIN_SCRIPTS/read-config.sh" project.type 2>/dev/null || echo "")
if [[ "$PROJECT_TYPE" != "web" ]]; then
echo "visual_eval_inapplicable:not_web_project — project.type is '$PROJECT_TYPE', not 'web'"
.claude/scripts/dso ticket tag "$STORY_ID" visual_eval_inapplicable:not_web_project 2>/dev/null || true
exit 1
fi
Gate 2: playwright_available
if ! command -v npx >/dev/null 2>&1 || ! npx playwright --version >/dev/null 2>&1; then
echo "visual_eval_inapplicable:playwright_unavailable — Playwright not found via npx"
.claude/scripts/dso ticket tag "$STORY_ID" visual_eval_inapplicable:playwright_unavailable 2>/dev/null || true
exit 1
fi
Gate 3: check-local-env.sh exit 0
if ! bash "$PLUGIN_SCRIPTS/check-local-env.sh" >/dev/null 2>&1; then
echo "visual_eval_inapplicable:local_env_check_failed — check-local-env.sh returned non-zero"
.claude/scripts/dso ticket tag "$STORY_ID" visual_eval_inapplicable:local_env_check_failed 2>/dev/null || true
exit 1
fi
Gate 4: route_map_fresh<24h
ROUTE_MAP=".ui-discovery-cache/route-map.json"
if [[ ! -f "$ROUTE_MAP" ]]; then
echo "visual_eval_inapplicable:route_map_missing — .ui-discovery-cache/route-map.json not found. Run /dso:ui-discover first."
.claude/scripts/dso ticket tag "$STORY_ID" visual_eval_inapplicable:route_map_missing 2>/dev/null || true
exit 1
fi
_ROUTE_MAP_MTIME=$(stat -f %m "$ROUTE_MAP" 2>/dev/null || stat -c %Y "$ROUTE_MAP" 2>/dev/null || echo "")
if [[ -z "$_ROUTE_MAP_MTIME" ]]; then
echo "visual_eval_inapplicable:route_map_missing — could not stat .ui-discovery-cache/route-map.json"
.claude/scripts/dso ticket tag "$STORY_ID" visual_eval_inapplicable:route_map_missing 2>/dev/null || true
exit 1
fi
ROUTE_MAP_AGE=$(( $(date +%s) - _ROUTE_MAP_MTIME ))
ROUTE_MAP_MAX_AGE=${visual_evaluator_route_map_max_age_hours:-24}
ROUTE_MAP_MAX_AGE_SECS=$(( ROUTE_MAP_MAX_AGE * 3600 ))
if (( ROUTE_MAP_AGE > ROUTE_MAP_MAX_AGE_SECS )); then
echo "visual_eval_inapplicable:route_map_stale — .ui-discovery-cache/route-map.json is older than ${ROUTE_MAP_MAX_AGE}h. **Re-run /dso:ui-discover to refresh the route map.** (age: ${ROUTE_MAP_AGE}s, max: ${ROUTE_MAP_MAX_AGE_SECS}s)"
.claude/scripts/dso ticket tag "$STORY_ID" visual_eval_inapplicable:route_map_stale 2>/dev/null || true
exit 1
fi
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.
- 2mo ago First seen · 140 lines · 42 tokens per session scan A 123b8937f8a6
visual-evaluator is a skill published in the GitHub repository navapbc/digital-service-orchestra (6 stars, last pushed yesterday), licensed Apache-2.0. It adds 42 tokens to every session and 1,842 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-09-03.
visual-evaluator compared with skills from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| visual-evaluatornavapbc/digital-service-orchestra | Skill | 6 | yesterday | Apache-2.0 | A | 42 | Claude Code |
| webgl-holographic-foilnexu-io/open-design | Skill | 107k | today | Apache-2.0 | A | 41 | Claude Code, Codex |
| html-ppt-hermes-cyber-terminalnexu-io/open-design | Skill | 107k | today | Apache-2.0 | A | 53 | Claude Code, Codex |
| html-ppt-taste-brutalistnexu-io/open-design | Skill | 107k | today | Apache-2.0 | A | 78 | Claude Code, Codex |
| visual-ralphYeachan-Heo/oh-my-codex | Skill | 34k | yesterday | MIT | A | 52 | Codex |
| glance-canonical-layoutsandroid/skills | Skill | 10k | yesterday | Apache-2.0 | A | 56 | Claude Code |
| accessibilitymicrosoft/hve-core | Skill | 1.6k | today | MIT | A | 47 | Claude Code |