npx --yes web-app-security-skill audit . --fail-on never
--fail-on never lets the first report finish without turning a suspected lead into a failing CI
claim. This command reads local project files, does not contact a deployment and does not edit code.
For each actionable result, the report gives you:
- the security term, a plain-language explanation and a realistic consequence;
- what the evidence proves and what still needs human or runtime confirmation;
- a reviewable change, likely product side effects, rollback conditions, and separate security and normal-behavior retests.
See the result
Audit an intentionally unsafe local source file, inspect the explanation and proposed change, then run both the security retest and the fixture's normal behavior test. Nothing reaches the network and no project dependency is installed.
| Input | Finding | Evidence | Reviewable change | Retest |
|---|---|---|---|---|
src/export-report.mjs |
OS command injection lead (CWE-78), HIGH | suspected; input flow and reachability are not proven |
replace shell parsing with execFile and separate arguments; quoting/platform behavior may change |
security fixed; functional passed |
git clone https://github.com/parousia8888/web-app-security-skill.git
cd web-app-security-skill
npm run demo -- --out ./demo-output
Read the generated before / proposed change / retest evidence, then inspect
demo-output/demo-result.json, summary.md, before.json, hardening.patch, after.json, and
functional-retest.txt. Every public demo fact is derived from demo-result.json; the repository
check reruns the fixture and fails if any surface disagrees.
For the complete install-to-uninstall path, follow the tested first project tutorial.
What's new in v0.5.4
v0.5.4 corrects how detector evidence is named and adds executable guards for failures seen during real project review. It does not increase the stable detector count:
- Accurate evidence name: the author-maintained planted suite is now rule-contract conformance, with 22 positive/negative/state contracts. It no longer uses TP/FP language that could be quoted as production accuracy.
- Observed failures become gates: four historical correctness failures and one numeric-SVG DOM
sink review case now execute against product code. The fifth remains a visible
expected_benign_match; no blanket suppression is added. - Try-now command follows npm latest: the main-branch first trial omits a version pin. Reusable CI, signed releases and verified installation remain fixed to a version or full commit.
- No detector-count inflation: stable detection remains 20 built-in risk rules, 2 evidence-integrity rules and 8 opt-in external-adapter rules.
The v0.5.0 explanation contract remains: every v3 source finding includes the professional term, ordinary-language meaning, realistic consequence, evidence boundary, reviewable proposal, alternatives, likely side effects, owner decisions, separate security/functional retests and rollback. The CLI does not edit the project. Stable detection remains 20 built-in risk rules, 2 evidence-integrity rules and 8 opt-in external-adapter rules, with built-in depth concentrated on JavaScript/TypeScript and Python Web code.
Exact support and limits are in the compatibility matrix, stable rule
corpus, rule-contract conformance,
historical real-world regressions and
ordinary-project review. MCP and additional stable
rules are deferred behind the documented architecture gates.
The signed v0.5.3 GitHub assets and provenance, verified installer, public npm package and signed
v1 Action alias have passed their public checks. The installer below defaults to v0.5.3.
Install
Zero-install CLI trial
Try the CLI without keeping an installation:
npx --yes web-app-security-skill audit . --fail-on never
Claude Code plugin
Install the Claude Code plugin from this repository marketplace in one shell line:
claude plugin marketplace add parousia8888/web-app-security-skill --scope user && claude plugin install web-app-security-skill@web-app-security --scope user
Inside an existing Claude Code session, the equivalent commands are:
/plugin marketplace add parousia8888/web-app-security-skill
/plugin install web-app-security-skill@web-app-security
Verified multi-surface installation
For a signature- and checksum-verified multi-surface installation, the command below installs the
skill for Claude Code and Codex, plus the ordinary CLI under
~/.local/bin. Existing installs are refused unless you explicitly pass --force, which creates
timestamped backups before replacement. It downloads an immutable bootstrap, verifies its SHA-256
before execution, then verifies the selected release manifest, checksums, SBOM, source commit and
archive before installation.
( set -eu; p="$(mktemp "${TMPDIR:-/tmp}/web-app-security-bootstrap.XXXXXX")"; trap 'rm -f "$p"' EXIT HUP INT TERM; curl --proto '=https' --proto-redir '=https' --tlsv1.2 --fail --silent --show-error --location --output "$p" 'https://raw.githubusercontent.com/parousia8888/web-app-security-skill/cf6bca040dc1d78587f04ded2ace10a08312f0c5/scripts/bootstrap-install.sh?immutable=cf6bca040dc1d78587f04ded2ace10a08312f0c5'; node -e 'const c=require("node:crypto"),f=require("node:fs"),p=process.argv[1],e=process.argv[2],a=c.createHash("sha256").update(f.readFileSync(p)).digest("hex");if(a!==e){console.error(`bootstrap SHA-256 mismatch: ${a}`);process.exit(1)}' "$p" '0f203b986f75f1359fee0c0c5251ba0dbeec08a857b67415702d5f05f73f2faf'; sh "$p" )
Select a surface when needed:
sh bootstrap-install.sh --target claude
sh bootstrap-install.sh --target codex
sh bootstrap-install.sh --target cli
sh bootstrap-install.sh --target both # Claude Code + Codex
The shortened examples assume you already downloaded and verified bootstrap-install.sh using the
command above. Explicit-version, offline/manual, attestation and trust-anchor details are in
verified installation. Supported environments and current limits
are recorded in the compatibility matrix.
Check, upgrade, or remove an installation:
webapp-security version
# Run the verified bootstrap with --mode upgrade for a recognized installation.
sh bootstrap-install.sh --mode upgrade
webapp-security uninstall
upgrade replaces only installations carrying a recognized Web App Security Skill marker (or the
documented legacy Skill identity), and keeps timestamped backups. uninstall removes recognized
current installs but preserves those backups. Unknown directories and launchers are refused even
with install --force.
Run the first project
Open the target repository in Claude Code or Codex and send this prompt:
webapp-security start .
This creates a private project identity plus .webapp-security/runs/<run-id>/security-scope.yml,
records detected framework, package manager, lockfile and deployment/config paths, and performs no
network access. Review the scope, then send:
Use $web-app-security on this repository. Start with source and local checks only. Record scope and assumptions. Classify every result as confirmed, suspected, unknown, or not_applicable. Prepare the smallest reviewable hardening patch, do not apply risky or production changes without approval, retest every applied fix, and finish with fixed, remaining, and unreached risks.
The deterministic source path can then run as:
webapp-security audit .webapp-security/runs/<run-id> --fail-on high
webapp-security explain <finding-id> --report .webapp-security/runs/<run-id>/report.json
webapp-security repair-plan <finding-id> \
--report .webapp-security/runs/<run-id>/report.json --out ./repair-review
webapp-security start . --run-id <retest-run-id>
webapp-security retest .webapp-security/runs/<retest-run-id> \
--baseline .webapp-security/runs/<run-id>/report.json
# Review-noise filters for the built-in adapter only
webapp-security audit . --since HEAD~1 --fail-on never
webapp-security audit . --staged --fail-on never
--since excludes untracked files. --staged reads the Git index, not unstaged working-tree
content. Neither mode can be combined with external adapters or baseline/retest comparison.
The default is the bundled, network-free source adapter. Optional external adapters are explicit:
webapp-security doctor . --adapter all --json
webapp-security audit . --adapter checkov --adapter gitleaks --adapter opengrep --adapter osv --fail-on never
Tested versions are Checkov 3.3.9, Gitleaks 8.30.1, Opengrep 1.27.0 and OSV-Scanner 2.5.0.
The CLI and Action do not download them. Checkov runs only three fixed root Dockerfile/GitHub
Actions rules with --skip-download; it may query PyPI for version metadata but does not upload
project source. Opengrep uses only the bundled, digest-pinned two-rule local ruleset and makes no
network request; OSV-Scanner may query the public OSV database. Project dependencies are not
executed. Compose, Terraform, Kubernetes and the rest of Checkov are not stable coverage. A
blocking external-adapter run additionally requires --acknowledge-alert-policy after the consuming repository accepts the responsibilities in
docs/alert-policy.md. See the
adapter protocol for failure, redaction and version semantics.
Each source audit writes v3 JSON, Markdown, HTML, SARIF, JUnit, a SHA-256 sidecar and
proposed.patch. Every source finding keeps the professional term and adds plain-language meaning,
consequence, evidence limits, a reviewable proposal, side effects, separate security and functional
retests, rollback criteria and user decisions. A direct project audit is allowed for one-off review
but has ephemeral identity and cannot be a retest baseline. fixed requires the same persisted
subject and scope, a compatible rule, completed current coverage and affirmative absence of the
condition. The patch is never applied by this command. None of these commands grants permission to
probe a deployment.
Reports summarize by risk domain, then evidence state, then severity. The default CI policy gates
confirmed HIGH security_exposure and supply_chain findings only. Existing --fail-on behavior
continues to set those two domains; opt into another domain explicitly, for example:
webapp-security crawl --site https://example.com --out ./security-report \
--fail-on high --fail-on-domain search_discoverability=high
Multiple --fail-on-domain <domain=threshold> options may be combined. Effective thresholds are
recorded in the report. The generated rule taxonomy separates source rule
kind, family, language, domain, severity, default evidence state and standards. Exact stable source
counts and complete explanation metadata come from the machine-readable
stable-source-rules.json: 20 built-in risk rules, 2 built-in
evidence-integrity rules and 8 external adapter risk rules on main, for 30 stable source and
deployment-policy rules. Eight JavaScript/TypeScript
and eight Python rules are bounded lexical leads for execution, unsafe browser or framework
configuration, transport, authentication secrets and deserialization. Their exact detection and
false-positive boundaries are recorded in the JS/TS and
Python decisions. They do not prove input flow or runtime
reachability and remain suspected until independently reproduced.
Capability boundary
Capabilities use two independent dimensions so support tooling is not counted as vulnerability coverage:
- Category: Detection; Evidence and reporting; Lifecycle and distribution; or Agent-guided methodology.
- Maturity:
stable,experimental,agent_guided, orplanned.
The current stable Detection families are the narrow built-in source audit, opt-in Checkov, Gitleaks, Opengrep and OSV-Scanner adapters, crawl-boundary audit, crawler identity verification, edge verification, and the read-only AWS inventory helper. Project discovery, the demo, report renderers, retest infrastructure, installer, and GitHub Action are tested product capabilities, but are not additional detector families. API authorization, business logic, LLM/OAuth, data-layer and broader AWS reviews remain Agent-guided methodology until a named adapter earns regression evidence.
The generated capability matrix links every category and maturity statement
to evidence. Results
are confirmed, suspected, unknown, or not_applicable; a check that could not run is never a
pass. Installing the Skill does not prove a project secure.
Current detector and workflow constraints are listed in KNOWN_LIMITATIONS.md.
The MCP and stable-rule expansion decision is a future
gate, not shipped behavior.
Deterministic tools
Ask Claude Code or Codex to use web-app-security, or run the same deterministic tools
directly:
# Network-free project discovery and versioned scope
webapp-security start .
# Source-only audit, explain and required-baseline retest
webapp-security audit .webapp-security/runs/<run-id> --fail-on high
webapp-security audit . --since HEAD~1 --fail-on never
webapp-security audit . --staged --fail-on never
webapp-security doctor . --adapter all
webapp-security audit . --adapter checkov --adapter gitleaks --adapter opengrep --adapter osv --fail-on never
webapp-security explain <finding-id> --report <report.json>
webapp-security start . --run-id <retest-run-id>
webapp-security retest .webapp-security/runs/<retest-run-id> \
--baseline <report.json> --fail-on high
# Historical v1 reports stay non-comparable; moved/cloned projects require explicit binding
webapp-security migrate-report <v1-report.json> --scope <security-scope.yml> \
--acknowledge-subject <subject-id> --out <new-directory>
webapp-security rebind <moved-project> --scope <security-scope.yml> \
--acknowledge-subject <subject-id>
# Passive crawl-boundary and crawler accessibility audit
webapp-security crawl --site https://example.com --out ./security-report
# Active sensitive-path probes require both ownership/written authorization and an explicit gate
webapp-security crawl --site https://example.com --out ./security-report \
--active-probe --acknowledge-authorization
# Crawler identity: exact product ranges or FCrDNS, never a user-agent string alone
webapp-security verify-crawler --ip 66.249.66.1 --ua Googlebot --ranges
# Passive headers, redirect, certificate and TLS policy verification
webapp-security verify-edge --site https://example.com
# Read-only AWS posture inventory
webapp-security aws --profile default --region us-east-1 --out ./security-report
Active rate-limit verification also requires --acknowledge-authorization. Network or evidence
failure is unknown and exits non-zero; it is never rendered as safe.
Source conclusions use finding/report v3, including the before/after source reports inside the new
demo. Crawl, crawler identity, edge and AWS remain on v2; the demo's small demo-result.json fact
schema is separate from either report schema. Both report versions preserve the same coverage,
evidence-state, policy and exit-code semantics. Report
bundles and their tool-specific observations are sanitized in memory, staged as private files in the
target directory, and committed together without overwriting prior evidence. A renderer or handled
write failure is rolled back without leaving a partial new bundle. Historical v1 reports remain
readable only for display, release verification and explicit non-comparable migration; they are
never accepted as a comparable baseline. Compatible persisted v2 source baselines remain readable
and are upgraded in memory for v3 comparison without rewriting their bytes.
GitHub Action
The composite Action keeps the v0.3 crawl inputs and outputs. Crawl mode is passive by default and requires deployment authorization acknowledgement:
- name: Audit public crawl boundary
uses: parousia8888/web-app-security-skill@621e0bc2ad044f9390fa9d567bf4b9fca138a959
with:
site: https://example.com
acknowledge-authorization: true
active-probe: false
fail-on: high
For repeatable CI, use the immutable v0.5.3 commit above. The signed stable major-version alias now resolves to the same v0.5.3 source after its public passive and authorization consumer passed:
uses: parousia8888/web-app-security-skill@v1
Source mode defaults to the bundled adapter. The immutable v0.5.3 Action runs the v3 source contract, the stable v0.5.0 rule corpus, the v0.5.1/v0.5.2 correctness fixes and the v0.5.3 distribution, diff-scope and benchmark surfaces. External binaries must be installed and pinned by the caller; the Action never downloads them:
- name: Audit source
uses: parousia8888/web-app-security-skill@621e0bc2ad044f9390fa9d567bf4b9fca138a959
with:
mode: source
project: .
adapters: builtin
fail-on: high
The moving v1 tag is promoted with a guarded lease only after the versioned source and installation
gates pass, then the public consumer must pass before promotion is recorded complete. Review release
notes before accepting a future update; use the full commit above when the workflow must not move.
Trust and release evidence
- CI runs Ubuntu/macOS x Node 22/24, deterministic HTTP/HTTPS fixtures and Bash 3.2 smoke tests.
- Third-party Actions in release and CodeQL workflows are pinned to full commit SHAs.
- Tagged releases require matching
VERSION, changelog and a versioned evidence note. The tag is signed and the release records its source commit. - Release assets contain a reproducible source archive, SPDX 2.3 SBOM,
SHA256SUMSand GitHub build-provenance attestation. CI builds the archive twice, compares every byte, then runs the lifecycle from the extracted archive in an isolated home with network access denied. SECURITY.md, threat model, false-positive policy and compatibility matrix make the trust boundary reviewable.
Verify downloaded release assets:
sha256sum -c SHA256SUMS
gh attestation verify web-app-security-skill-*.tar.gz \
--repo parousia8888/web-app-security-skill
git -c gpg.ssh.allowedSignersFile=.github/release-signers verify-tag v0.5.3
5 ordinary project journeys
The original v0.4.0 journeys preserve the complete v2 built-in/Gitleaks/OSV evidence. The separate v0.5.0 built-in review reruns the same fixed commits through the broader v3 JavaScript/TypeScript and Python rules and manually classifies every finding. No hosted instance or project dependency was executed in either pass.
| Project | Evidence outcome | Manual outcome |
|---|---|---|
| Linkwarden | v3: 6 suspected | 6 expected benign matches after JSDOM, DOMPurify and constant-content review |
| Healthchecks | v3: 5 suspected | 4 useful response-encoding leads; 1 expected benign opt-in shell match |
| Open WebUI | v3: 6 suspected; 1 unknown | 3 useful leads; 3 expected benign; tokenizer failure stays unknown |
| Uptime Kuma | v3: 4 confirmed facts; 21 suspected | 4 useful leads; 17 expected benign; confirmed items are lockfile hygiene, not four app vulnerabilities |
| Mealie | v3: 0 findings | No configured pattern matched; this does not establish security |
Read the structured v0.5.0 classification and the historical journey method. Confirmed source facts, scanner leads and false-positive outcomes are kept visible; this is not a precision score. Uptime Kuma and Mealie overlap with the methodology corpus below at the same commits, so these are two evidence views rather than ten distinct projects.
The 5 earlier source methodology studies remain as a separate corpus: three intentionally vulnerable benchmarks and two production projects.
| Project | Evidence outcome |
|---|---|
| OWASP Juice Shop | Confirmed intentional SQL injection plus upstream prepared-statement repair |
| OWASP NodeGoat | Confirmed intentional server-side eval, IDOR and open redirect |
| DVWA | Confirmed low/impossible SQLi, XSS and command-injection control pairs |
| Uptime Kuma | SSRF-shaped outbound sinks closed as product behavior; no vulnerability counted |
| Mealie | URL-fetch lead traced to auth and private-IP guard; no vulnerability counted |
Read the method and corpus limits. These are evidence for the methodology, not a fabricated precision score for a CLI that is not yet a general SAST engine.
Program map
| Phase | Focus | Active? |
|---|---|---|
| 0 | Scope, ownership and authorization anchor | gate |
| 1 | Frontend exposure | no |
| 2 | API: IDOR/BOLA, auth, limits, races, SSRF | yes |
| 3 | LLM abuse and OAuth/OIDC | yes |
| 4 | Server-side source audit | source access |
| 5 | Database and tenant isolation | yes |
| 6 | Supply chain, SBOM, SCA and SRI | partial |
| 7 | Blue-team detection | no |
| 8 | Report, patch evidence and retest | no |
Cross-cutting references cover crawl boundaries, verified crawler identity, source-map/dotfile
exposure, enforcement placement, AWS hardening, overlooked surfaces, regression gates and safe
deployment. Start from SKILL.md.
Contributing
The roadmap separates correctness work from adoption work. New contributors can start
from bounded good-first issues, the issue forms, and
CONTRIBUTING.md. False-positive reports need a sanitized minimal fixture and
expected classification; sensitive details go through private vulnerability reporting.
The generated launch evidence collects only reproducible capability, demo, project-journey, methodology-study and release facts. The publication kit provides evidence-linked drafts and a reusable public/private case-study workflow without claiming that external publication has occurred.
MIT licensed.
No comments yet
Be the first to share your take.