
Security Visual Testing
- 92 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
security-visual-testing is a Claude Code skill for testing & qa.
About
security-visual-testing is a Claude Code skill for testing & qa. It helps solo builders move faster with AI-assisted development.
- security-visual-testing
- Testing & QA
- AI-coding skill
Security Visual Testing by the numbers
- 92 all-time installs (skills.sh)
- +3 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,028 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill security-visual-testingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 92 |
|---|---|
| repo stars | ★ 433 |
| Last updated | August 4, 2026 |
| Repository | proffesor-for-testing/agentic-qe ↗ |
How do I helps with testing & qa tasks.?
Helps with testing & qa tasks.
Who is it for?
Best when you're working on testing & qa and need structured help with security visual testing.
Skip if: Teams with no testing & qa needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with testing & qa tasks., or when security-visual-testing is a claude code skill for testing & qa.
What you get
Structured output aligned to security-visual-testing: security-visual-testing, Testing & QA.
Files
Security Visual Testing
Browser engine
Uses the qe-browser fleet skill (.claude/skills/qe-browser/) for all browser automation. The Vibium engine (10MB Go binary, WebDriver BiDi) is installed automatically by aqe init. For security-visual workflows, qe-browser adds two things on top of stock visual testing: check-injection.js (scans page content for prompt-injection patterns before screenshots are stored) and assert.js (16 typed checks including no_failed_requests for detecting data-leak requests).
# Before storing any screenshot, scan the page
vibium go "$TARGET_URL"
vibium wait load
node .claude/skills/qe-browser/scripts/check-injection.js --include-hidden
INJ=$?
if [ $INJ -ne 0 ]; then
echo "Prompt-injection findings — do NOT store screenshot"
exit $INJ
fi
# Safe to proceed with visual-diff
node .claude/skills/qe-browser/scripts/visual-diff.js --name "${PAGE_NAME}"<default_to_action> When performing security-aware visual testing: 1. VALIDATE URLs before navigation (check for malicious patterns) 2. SCAN for PII before saving screenshots (mask sensitive data) 3. CAPTURE parallel viewports (mobile, tablet, desktop) 4. COMPARE against baselines (detect visual regressions) 5. AUDIT accessibility (WCAG 2.1 AA compliance)
Quick Security-Visual Checklist:
- URL validation (no javascript:, data:, file: schemes)
- PII detection (emails, phones, SSN, credit cards, API keys)
- Visual regression (diff threshold < 0.1%)
- Viewport coverage (320px, 768px, 1024px, 1440px)
- Accessibility score (> 90% axe-core pass rate)
Critical Success Factors:
- Always mask PII before storing screenshots
- Test across all target viewports in parallel
- Store baselines in version control
- Run accessibility audits on every visual change
</default_to_action>
Quick Reference Card
When to Use
| Scenario | Use This Skill? | Why |
|---|---|---|
| Testing login pages | Yes | Contains PII (passwords, emails) |
| Visual regression suite | Yes | Parallel viewport + baseline comparison |
| Payment forms | Yes | Credit card data needs masking |
| Public marketing pages | Maybe | Only if sensitive data possible |
| API-only testing | No | Use security-testing skill instead |
Key Capabilities
| Capability | Description | Performance |
|---|---|---|
| URL Validation | Block malicious URLs before navigation | <5ms |
| PII Detection | Find 6+ types of sensitive data | <100ms |
| Parallel Viewports | Test 4 viewports simultaneously | 4x faster |
| Visual Regression | Pixel-diff with configurable threshold | <500ms |
| Accessibility Audit | WCAG 2.1 A/AA/AAA compliance | <2s |
---
Workflows
1. Security Visual Audit (Full Pipeline)
# Run complete security + visual audit
aqe test visual-audit --url https://example.com --security --accessibilitySteps: 1. Validate URL security (block malicious schemes) 2. Scan page for security issues (XSS, injection patterns) 3. Capture screenshots across 4 viewports in parallel 4. Compare against stored baselines 5. Run accessibility audit (axe-core) 6. Generate consolidated report
2. PII-Safe Screenshot
# Capture screenshot with automatic PII masking
aqe screenshot --url https://example.com/profile --pii-safePII Detection Patterns:
- Email addresses:
user@example.com - Phone numbers:
+1-555-123-4567 - Credit cards:
4111-1111-1111-1111 - SSN:
123-45-6789 - API keys:
sk_live_...,AKIA... - Passwords: Form fields with type="password"
Masking Strategy:
- Default: Blur with high intensity
- Options:
redact(black box),pixelate,blur
3. Responsive Visual Audit
# Test visual consistency across viewports
aqe test responsive --url https://example.com --viewports mobile,tablet,desktopDefault Viewports:
| Name | Width | Height | Device |
|---|---|---|---|
| mobile | 320px | 568px | iPhone SE |
| tablet | 768px | 1024px | iPad |
| desktop | 1440px | 900px | MacBook |
| wide | 1920px | 1080px | Full HD |
---
Integration with AQE v3
Using with BrowserSecurityScanner
import { BrowserSecurityScanner } from '@agentic-qe/v3';
const scanner = new BrowserSecurityScanner(memory, {
urlValidation: { enabled: true },
piiDetection: { enabled: true, maskBeforeSave: true },
parallelViewports: { maxConcurrent: 4 }
});
const result = await scanner.scanUrl('https://example.com', {
viewports: ['mobile', 'tablet', 'desktop'],
accessibility: true
});Using with TrajectoryAdapter
import { TrajectoryAdapter } from '@agentic-qe/v3';
const adapter = new TrajectoryAdapter(memory);
// Record testing trajectory for learning
await adapter.startTrajectory('security-visual-test', {
url: 'https://example.com',
testType: 'security-visual'
});
// ... perform tests ...
await adapter.endTrajectory(trajectoryId, {
success: true,
piiFound: 3,
visualRegressions: 0,
accessibilityScore: 95
});---
Agent Coordination
Memory Namespace
aqe/security-visual/
├── baselines/* - Visual regression baselines
├── screenshots/* - Captured screenshots (PII masked)
├── reports/* - Audit reports
└── trajectories/* - Learning trajectoriesFleet Coordination
const fleet = await FleetManager.coordinate({
strategy: 'security-visual-audit',
agents: [
'qe-visual-tester', // Visual regression
'qe-security-scanner', // URL/PII scanning
'qe-accessibility-auditor' // WCAG compliance
],
topology: 'parallel',
maxConcurrent: 4
});---
Error Handling
| Error | Cause | Resolution |
|---|---|---|
URL_BLOCKED | Malicious URL pattern detected | Check URL, remove javascript:/data: |
PII_DETECTED | Sensitive data found in screenshot | Enable masking or redact manually |
BASELINE_MISSING | No baseline for comparison | Run with --update-baseline first |
VIEWPORT_TIMEOUT | Browser didn't respond | Increase timeout or reduce parallel |
ACCESSIBILITY_FAILED | WCAG violations found | Review violations, fix issues |
---
Related Skills
- visual-testing-advanced - Pure visual testing without security
- security-testing - Security testing without visual component
- accessibility-testing - Accessibility-only testing
- qe-visual-accessibility - AQE v3 visual domain skill
---
Performance Targets
| Metric | Target | Measured |
|---|---|---|
| URL validation | <5ms | 2ms |
| PII detection | <100ms | 45ms |
| Single viewport capture | <2s | 1.2s |
| 4-viewport parallel | <3s | 2.1s |
| Visual diff | <500ms | 320ms |
| Accessibility audit | <2s | 1.5s |
| Full pipeline | <10s | 7.2s |
skill: security-visual-testing
version: 1.0.0
description: >
Evaluation suite for security-visual-testing skill.
Tests combined security and visual testing capabilities, ensuring findings
are correctly identified and classified across both domains.
models_to_test:
- claude-opus-4-8 # Capability ceiling (high-stakes skill)
- claude-sonnet-4-6 # Primary (high accuracy expected)
- claude-haiku-4-5 # Fast model (minimum quality floor)
mcp_integration:
enabled: true
namespace: skill-validation
query_patterns: true
track_outcomes: true
store_patterns: true
share_learning: true
update_quality_gate: true
target_agents:
- qe-learning-coordinator
- qe-queen-coordinator
learning:
store_success_patterns: true
store_failure_patterns: true
pattern_ttl_days: 90
min_confidence_to_store: 0.7
cross_model_comparison: true
result_format:
json_output: true
markdown_report: false
include_raw_output: false
include_timing: true
include_token_usage: true
setup:
required_tools:
- jq
environment_variables:
SECURITY_SCAN_DEPTH: "standard"
VISUAL_DIFF_THRESHOLD: "0.05"
fixtures: []
test_cases:
- id: tc001_basic_security_visual_analysis
description: "Skill returns both security findings and visual diffs"
category: basic
priority: critical
input:
url: "https://example.com"
context:
testScope: "full_page"
compareViewports: ["desktop", "mobile"]
expected_output:
must_contain:
- "securityFindings"
- "visualDiffs"
- "combinedScore"
must_not_contain:
- "error"
- "failed to analyze"
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc002_security_findings_structure
description: "Security findings have required fields and valid structure"
category: core
priority: critical
input:
url: "https://example.com/vulnerable"
context:
testScope: "full_page"
expected_output:
must_contain:
- "totalFindings"
- "score"
- "OWASP"
finding_count:
min: 0
max: 50
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc003_visual_diffs_detection
description: "Visual diffs are properly detected and reported"
category: core
priority: high
input:
url: "https://example.com"
baselineUrl: "https://baseline.example.com"
context:
compareViewports: ["desktop", "mobile"]
expected_output:
must_contain:
- "totalComparisons"
- "diffsDetected"
- "passRate"
validation:
schema_check: true
- id: tc004_combined_scoring_accuracy
description: "Combined score correctly weights security and visual scores"
category: core
priority: high
input:
url: "https://example.com"
context:
testScope: "full_page"
expected_output:
must_contain:
- "combinedScore"
- "securityWeight"
- "visualWeight"
validation:
schema_check: true
keyword_match_threshold: 0.7
- id: tc005_cross_domain_issue_detection
description: "Cross-domain issues spanning security and visual are identified"
category: core
priority: high
input:
url: "https://example.com"
context:
detectCrossDomainIssues: true
expected_output:
must_contain:
- "crossDomainIssues"
validation:
schema_check: true
allow_partial: true
success_criteria:
pass_rate: 0.8
critical_pass_rate: 1.0
avg_reasoning_quality: 0.7
max_execution_time_ms: 300000
cross_model_variance: 0.15
metadata:
author: "qe-security-auditor"
created: "2026-02-02"
last_updated: "2026-02-02"
coverage_target: "Security-visual integration, combined scoring, cross-domain detection"
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://agentic-qe.dev/schemas/security-visual-testing-output.json",
"title": "Security Visual Testing Skill Output Schema",
"description": "Schema for combined security and visual testing output with security findings, visual diffs, and unified quality score.",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "security-visual-testing",
"description": "Must be 'security-visual-testing'"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$"
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"status": {
"type": "string",
"enum": ["success", "partial", "failed", "skipped"]
},
"trustTier": {
"type": "integer",
"minimum": 0,
"maximum": 3
},
"output": {
"type": "object",
"required": ["summary", "securityFindings", "visualDiffs"],
"properties": {
"summary": {
"type": "string",
"minLength": 50,
"maxLength": 2000
},
"securityFindings": {
"$ref": "#/$defs/securityFindings"
},
"visualDiffs": {
"$ref": "#/$defs/visualDiffs"
},
"combinedScore": {
"$ref": "#/$defs/combinedScore"
},
"crossDomainIssues": {
"type": "array",
"items": {
"$ref": "#/$defs/crossDomainIssue"
},
"description": "Issues that span both security and visual domains"
},
"findings": {
"type": "array",
"items": {
"$ref": "#/$defs/finding"
},
"maxItems": 200
},
"recommendations": {
"type": "array",
"items": {
"$ref": "#/$defs/recommendation"
},
"maxItems": 100
},
"artifacts": {
"type": "array",
"items": {
"$ref": "#/$defs/artifact"
}
}
}
},
"metadata": {
"$ref": "#/$defs/metadata"
},
"validation": {
"$ref": "#/$defs/validationResult"
},
"learning": {
"$ref": "#/$defs/learningData"
}
},
"$defs": {
"securityFindings": {
"type": "object",
"required": ["totalFindings", "score"],
"properties": {
"totalFindings": {
"type": "integer",
"minimum": 0
},
"criticalCount": {
"type": "integer",
"minimum": 0
},
"highCount": {
"type": "integer",
"minimum": 0
},
"mediumCount": {
"type": "integer",
"minimum": 0
},
"lowCount": {
"type": "integer",
"minimum": 0
},
"score": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Security score (100 = no issues)"
},
"owaspCategories": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"tested": {
"type": "boolean"
},
"findingCount": {
"type": "integer"
},
"score": {
"type": "number"
}
}
}
},
"vulnerabilities": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "title", "severity"],
"properties": {
"id": {
"type": "string",
"pattern": "^SEC-\\d{3,6}$"
},
"title": {
"type": "string"
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low", "info"]
},
"owasp": {
"type": "string"
},
"cwe": {
"type": "string"
},
"location": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"element": {
"type": "string"
}
}
},
"remediation": {
"type": "string"
}
}
}
}
}
},
"visualDiffs": {
"type": "object",
"required": ["totalComparisons", "diffsDetected"],
"properties": {
"totalComparisons": {
"type": "integer",
"minimum": 0
},
"diffsDetected": {
"type": "integer",
"minimum": 0
},
"passRate": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"score": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Visual consistency score"
},
"comparisons": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "status"],
"properties": {
"id": {
"type": "string",
"pattern": "^VIS-\\d{3,6}$"
},
"page": {
"type": "string"
},
"viewport": {
"type": "string"
},
"status": {
"type": "string",
"enum": ["passed", "failed", "warning", "skipped"]
},
"diffPercentage": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"diffPixels": {
"type": "integer",
"minimum": 0
},
"baselineImage": {
"type": "string"
},
"actualImage": {
"type": "string"
},
"diffImage": {
"type": "string"
},
"regions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"x": {
"type": "integer"
},
"y": {
"type": "integer"
},
"width": {
"type": "integer"
},
"height": {
"type": "integer"
},
"type": {
"type": "string",
"enum": ["added", "removed", "changed"]
}
}
}
}
}
}
}
}
},
"combinedScore": {
"type": "object",
"required": ["value", "max"],
"properties": {
"value": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"max": {
"type": "number",
"const": 100
},
"grade": {
"type": "string",
"pattern": "^[A-F][+-]?$"
},
"securityWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"visualWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"breakdown": {
"type": "object",
"properties": {
"securityScore": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"visualScore": {
"type": "number",
"minimum": 0,
"maximum": 100
}
}
}
}
},
"crossDomainIssue": {
"type": "object",
"required": ["id", "title", "domains"],
"properties": {
"id": {
"type": "string",
"pattern": "^SVT-\\d{3,6}$"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"domains": {
"type": "array",
"items": {
"type": "string",
"enum": ["security", "visual"]
},
"minItems": 2
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low", "info"]
},
"examples": {
"type": "array",
"items": {
"type": "string"
},
"description": "e.g., XSS that causes visual injection, CSP blocking images"
},
"remediation": {
"type": "string"
}
}
},
"finding": {
"type": "object",
"required": ["id", "title", "severity", "domain"],
"properties": {
"id": {
"type": "string",
"pattern": "^(SEC|VIS|SVT)-\\d{3,6}$"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low", "info"]
},
"domain": {
"type": "string",
"enum": ["security", "visual", "both"]
},
"remediation": {
"type": "string"
}
}
},
"recommendation": {
"type": "object",
"required": ["id", "title", "priority"],
"properties": {
"id": {
"type": "string",
"pattern": "^REC-\\d{3,6}$"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"priority": {
"type": "string",
"enum": ["critical", "high", "medium", "low"]
},
"effort": {
"type": "string",
"enum": ["trivial", "low", "medium", "high", "major"]
},
"domain": {
"type": "string",
"enum": ["security", "visual", "both"]
}
}
},
"artifact": {
"type": "object",
"required": ["type", "path"],
"properties": {
"type": {
"type": "string",
"enum": ["report", "screenshot", "diff", "sarif", "data"]
},
"path": {
"type": "string"
},
"format": {
"type": "string"
},
"domain": {
"type": "string",
"enum": ["security", "visual", "combined"]
}
}
},
"metadata": {
"type": "object",
"properties": {
"executionTimeMs": {
"type": "integer",
"minimum": 0
},
"toolsUsed": {
"type": "array",
"items": {
"type": "string"
}
},
"agentId": {
"type": "string"
},
"targetUrl": {
"type": "string",
"format": "uri"
},
"viewports": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"validationResult": {
"type": "object",
"properties": {
"schemaValid": {
"type": "boolean"
},
"contentValid": {
"type": "boolean"
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
},
"learningData": {
"type": "object",
"properties": {
"patternsDetected": {
"type": "array",
"items": {
"type": "string"
}
},
"reward": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
}
}
}
{
"skillName": "security-visual-testing",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [
"imagemagick",
"playwright",
"semgrep",
"ajv",
"jsonschema",
"python3"
],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output",
"output.summary",
"output.securityFindings",
"output.visualDiffs"
],
"requiredNonEmptyFields": [
"output.summary"
],
"mustContainTerms": [
"security",
"visual",
"findings"
],
"mustNotContainTerms": [
"TODO",
"placeholder",
"FIXME"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
]
}
}
Related skills
FAQ
What does security-visual-testing do?
security-visual-testing is a Claude Code skill for testing & qa.
When should I use security-visual-testing?
When you need to helps with testing & qa tasks., or when security-visual-testing is a claude code skill for testing & qa.
What are the main capabilities?
security-visual-testing; Testing & QA; AI-coding skill.