Documentation

How Vigil works

Vigil is a white-hat security agent. It finds vulnerabilities in code, explains them and proposes fixes. It never produces exploit code or payloads.

Two ways to use it

  • Read-only public scan: paste the URL of a public GitHub repository. Everyone sees the number of findings per severity; only the maintainers see the details.
  • GitHub App: install it on your repositories to receive fixes as pull requests. Pull requests are never merged automatically.

Pipeline

CLONE → DETECT_STACK → RUN_SCANNERS → NORMALIZE (SARIF) → DEDUPE → LLM_TRIAGE → LLM_PATCH → VERIFY_PATCH → OPEN_PR → REPORT

  • Scanners: Psalm (taint analysis), PHPStan, Semgrep (p/php, p/javascript), composer audit, npm audit, osv-scanner, gitleaks.
  • Every scan runs in an ephemeral Docker container: read-only file system, no Linux capabilities, non-root user, no network while the code is analyzed, 10 minutes maximum, container destroyed afterwards.
  • The dependency audit queries the official advisory databases. It runs in a separate container that only receives composer.json/lock and package.json/package-lock.json, never the code.
  • Triage and fixes use the Claude API. Only the code surrounding each finding is sent; lines containing a potential secret are masked before sending.
  • A fix is only proposed if it passes verification: a rescan without the vulnerability and without any new one, then the project's tests (dependencies installed without running any script, tests run without network).

Responsible disclosure

  • A scan started by someone who is not a maintainer only shows aggregated statistics publicly.
  • Details are only visible to maintainers (admin or maintain permission), verified by signing in with GitHub, or once the vulnerability is fixed.
  • The value of a detected secret is never displayed or stored, not even partially.
  • The “Report to maintainer” button opens a generic issue, with no exploitable detail, inviting the owner to sign in.
  • On a public repository, the description of a fix pull request stays generic: details live on the maintainer-only report.

GitHub App permissions

  • contents: write: create a branch containing the fix.
  • pull_requests: write: open the pull request.
  • metadata: read: required for every GitHub App.

Installation tokens are scoped to the single repository being scanned and expire after one hour.

Data policy

  • Code is not kept: the clone is deleted at the end of every scan, including when it fails.
  • We keep the repository name, the commit SHA, and for each finding its rule, file, line, severity and explanation.
  • IP addresses are only stored as hashes, for usage limits.
  • Every action taken by the agent is written to an audit log.

Wallet and $VIGIL

Connecting a wallet only asks for a message signature, to prove you own it. No transaction, no transfer and no token approval is ever requested. Your balance is read on-chain to determine your tier: see the $VIGIL page.