sc-verifier
False positive elimination and confidence scoring for all security findings
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
False positive elimination and confidence scoring for all security findings
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
Market and demand research procedures. Niche discovery, demand sizing, competitor/gap analysis, opportunity scoring, and pricing/positioning signals BEFORE building. Triggers on: market research, demand, niche, opportunity sizing, competitor analysis, TAM, positioning, pricing, go-to-market, validate idea, is there demand.
Choosing between app.json vs app.config.ts vs app.config.js, environment variables, variants, extra fields, plugin chain, and slug/scheme/bundle/version discipline. Triggers on app.json, app.config.ts, app.config.js, expo config, environment variable, .env, eas secret, variant, extra field, slug, scheme, bundle identifier, package name, version, build number, version code.
Writing Expo config plugins, withInfoPlist, withAndroidManifest, withDangerousMod, mod compose, plugin testing, and registration in app.config.ts. Triggers on config plugin, with-plugin, withInfoPlist, withAndroidManifest, withDangerousMod, withEntitlementsPlist, withGradleProperties, mod, native config, expo plugin, plugin test, app.config plugin.
Custom development builds with expo-dev-client, build profiles, a custom dev menu, runtime-version compatibility, and EAS Update integration. Triggers on expo-dev-client, dev client, custom dev build, development build, dev menu, expo go, runtime version, debug build, dev launcher, scan qr, dev server.
iOS and Android build profiles with EAS Build, credentials management, build cache, secrets, and monorepo support. Triggers on eas build, eas.json, build profile, credentials, provisioning profile, keystore, push certificate, service account, build cache, eas secret, monorepo, development build, preview build, production build.
App Store Connect and Google Play Console upload flow with EAS Submit, metadata, build-artifact selection, review notes, and phased release. Triggers on eas submit, app store connect, google play, asc api key, service account, metadata, screenshot, phased release, review notes, testflight, internal testing, production submit, release management.
| name | sc-verifier |
| description | False positive elimination and confidence scoring for all security findings |
| license | MIT |
| metadata | {"category":"security","version":"1.1.0"} |
The verifier skill processes all raw findings from Phase 2 vulnerability skills, eliminates false positives through multi-criteria analysis, assigns confidence scores, merges duplicate findings, and produces a curated list of verified security issues. This is the quality gate that ensures the final report contains actionable, high-signal findings.
Runs in Phase 3 of the pipeline, after all Phase 2 vulnerability skills have completed.
All files matching security-report/*-results.md
security-report/verified-findings.md — full verified-findings report (format below)TRIAGE.json + TRIAGE.md at the project root (v1.34+) — harness-compatible
triage verdicts, see Step 10*-results.md files from security-report/For each finding, determine if the vulnerable code is actually reachable:
Check if code is in an executable path:
Reachability scoring:
For each finding involving user input, check if input is sanitized:
Sanitization indicators:
Sanitization scoring:
Check if the framework provides automatic protection against the reported vulnerability:
| Vulnerability | Framework Protection |
|---|---|
| XSS | React JSX auto-escaping, Angular sanitization, Django template auto-escaping, Blade {{ }} escaping |
| SQL Injection | ORM parameterized queries (Prisma, GORM, Hibernate, EF), prepared statement wrappers |
| CSRF | Django CSRF middleware, Spring Security CSRF, Laravel VerifyCsrfToken, Express csurf |
| SSTI | Jinja2 sandbox mode, restricted template engines |
| Path Traversal | Framework static file servers with built-in path validation |
| Header Injection | Modern HTTP libraries that reject newlines in headers |
Framework protection scoring:
Check if configuration-level protections mitigate the finding:
Configuration scoring:
Determine the context of the vulnerable code:
Test code:
test/, tests/, __tests__/, spec/, *_test.go, *_test.py, *.test.tstest, spec, mock, fixtureDead code:
Example/Documentation code:
examples/, docs/, demo/, sample/Generated code:
generated/, gen/, __generated__/// Code generated or @Generated annotationVendor/third-party code:
vendor/, node_modules/, third_party/Identify and merge findings that share the same root cause:
Duplicate criteria:
Merge rules:
Calculate final confidence score for each finding:
Base confidence from the reporting skill: 0-100 Apply modifiers from steps 2-6:
final_confidence = base_confidence
+ reachability_modifier (-40 to +30)
+ sanitization_modifier (-40 to +0)
+ framework_modifier (-30 to +0)
+ configuration_modifier (-20 to +0)
+ context_modifier (-50 to +0)
Clamp to 0-100 range.
Confidence classification:
After confidence scoring, recalculate severity:
Alongside verified-findings.md, write TRIAGE.json and TRIAGE.md to the
project root. These use the artifact naming of
Anthropic's defending-code-reference-harness
so badi's triage output is structurally familiar to harness-side tooling. Note the
intentional value-level deltas: confidence is on a 0-10 scale (one decimal) and
duplicates use the duplicate_of field rather than a dedicated duplicate verdict.
TRIAGE.json structure:
{
"source": "VULN-FINDINGS.json",
"triaged_at": "<ISO 8601 timestamp>",
"findings": [
{
"id": "F-001",
"verdict": "TRUE_POSITIVE",
"verify_verdict": "exploitable",
"confidence": 8.7,
"severity": "HIGH",
"duplicate_of": null,
"verification_notes": "..."
}
],
"summary": { "true_positive": 0, "false_positive": 0, "cannot_verify": 0, "duplicates": 0 }
}
Field mapping from the verification pipeline above:
id — the finding's F-NNN id from VULN-FINDINGS.json (fall back to VULN-NNN
order when no upstream artifact exists)verdict — TRUE_POSITIVE (final confidence ≥ 50); CANNOT_VERIFY (confidence
30-49: needs manual review); FALSE_POSITIVE (categorically eliminated as a false
positive, or final confidence < 30 — the Step 8 "Low Confidence" / Step 9 "Info"
band, treated as non-actionable for triage purposes). The three buckets partition
the full 0-100 range: ≥ 50, 30-49, < 30verify_verdict — exploitable (directly reachable + no sanitization),
mitigated (framework/configuration protection active), needs_manual_test (otherwise)confidence — the Step 8 final score converted to a 0-10 scale, one decimal (87 → 8.7)severity — uppercase HIGH | MEDIUM | LOW after Step 9 recalculation, using the
canonical 5→3 collapse shared with sc-orchestrator: Critical → HIGH, High → HIGH,
Medium → MEDIUM, Low → LOW, Info → LOWduplicate_of — the canonical finding's id for entries merged in Step 7, else nullTRIAGE.md mirrors the same content as a human-readable table sorted by
verdict, then confidence descending.
# Verified Security Findings
## Summary
- Total raw findings from Phase 2: {N}
- After duplicate merging: {N}
- After false positive elimination: {N}
- Final verified findings: {N}
## Confidence Distribution
- Confirmed (90-100): {N}
- High Probability (70-89): {N}
- Probable (50-69): {N}
- Possible (30-49): {N}
- Low Confidence (0-29): {N}
## Verified Findings
### VULN-001: {Title}
- **Severity:** Critical | High | Medium | Low | Info
- **Confidence:** {score}/100 ({classification})
- **Original Skill:** {skill-name}
- **Vulnerability Type:** CWE-XXX
- **File:** file/path:line
- **Reachability:** Direct | Indirect | Unknown
- **Sanitization:** None | Partial | Full
- **Framework Protection:** None | Partial | Active
- **Description:** Verified description
- **Verification Notes:** What was checked, why this is/isn't a false positive
- **Remediation:** How to fix
## Eliminated Findings (False Positives)
Brief list of eliminated findings with reason for elimination.
raw() or RawSQL methods are risky{{ }}, Blade {{ }} auto-escape by defaultos.Getenv("SECRET") reads at runtime, not hardcoded