Structure, not grep
Sink discovery and caller tracing run on tree-sitter parses, so a match is a call node with a resolved callee, not a string that happened to appear inside a comment, a test fixture, or a vendored copy.
Autonomous vulnerability research
locac audits a codebase the way a researcher does: map the surface, trace a source to a sink, then try to break its own conclusion. Nothing reaches High or Critical without a real execution artifact and a 2-of-3 independent verifier quorum, enforced by the harness rather than by the model's confidence.
curl -fsSL https://locac.dev/install.sh | shThe proof gate
The gate is code, not instructions. A model that is certain, persuasive, and wrong still fails it, because every clause resolves through one function, so the reporting path and the scoring path cannot drift apart.
A tool hit is a candidate, never a finding. The sink scanners surface where dangerous calls live; the tracers decide whether an untrusted source actually reaches one and whether an attacker controls the value when it lands.
The finding must cite an artifact minted in this same session whose kind proves exploitability: exec, dast_run, replay, or crash_oracle. A coverage artifact is rejected here on purpose: reaching a line is not crashing it.
cross_verify fans out exactly three verifiers on fixed, diverse lenses: reproduce, refute, boundary. A vote counts only if that verifier reproduced the bug itself during this round and cites its own new artifact; re-citing the candidate's evidence, or one another lens already used, counts for nothing.
score_finding computes CVSS rather than asking for it, and only High and Critical survive. report_findings re-checks both clauses at render time, so a finding cannot be printed by asserting it already passed.
Why the gate is not just "the run passed"
A proof-of-concept that genuinely crashes its target exits non-zero. Gating every artifact on a clean exit would therefore throw away the strongest evidence in the system, so only crash_oracle, the one kind that records a real triggered / not-triggered verdict, is checked for its own outcome. The others are judged by kind and session, and coverage never proves anything at all.
Non-negotiable
Every one of them removes findings. That is the point: the expensive failure mode of an automated auditor is not missing a bug, it is handing a team a hundred reports and making them prove the negative on each.
What it actually does
None of this is a scanner wrapped in a chat box. Each capability exists to close a specific way an automated auditor lies to you.
Sink discovery and caller tracing run on tree-sitter parses, so a match is a call node with a resolved callee, not a string that happened to appear inside a comment, a test fixture, or a vendored copy.
Everything the target runs goes through an OS sandbox: bubblewrap on Linux, a seatbelt profile on macOS, a broker process on Windows. --require-sandbox refuses to start at all rather than quietly running a repo unconfined.
A subagent spawns as a typed role: its own task and report schema, its own tool allow-list, its own model. A verifier that cannot call the tool that produced the original artifact cannot accidentally re-cite it.
Findings, artifacts, and the scratchpad live in SQLite under ~/.locac/projects, never inside the repo under audit. Resume a session, or fork it at any point in the transcript and take the other branch.
Context shrinking is deterministic elision, not summarization: it never calls a model, it never reorders the transcript, and it holds an evidence floor so the artifact a finding depends on is not what gets dropped to make room.
A change to the system prompt is an experiment, so it gets an experiment's tooling: A/B two prompts across labeled fixtures for a single run score, or diagnose the current harness on those fixtures instead of guessing at a regression.
Install
A single self-contained executable, with every runtime asset compiled into it, so what you copy around afterwards is one file. The installers below verify the download against the release's SHA256SUMS and refuse to unpack an archive it does not vouch for. Neither one edits your shell profile or your PATH: they print the line and stop. Building from source stays fully supported, and is the right call if you would rather not take a binary from anyone.
What the machine still needs
On the sandbox
The broker runs the target as a different user, which is what makes the confinement real. Until it is installed the run degrades to direct mode: cwd pinned, nothing else.
Install
irm https://locac.dev/install.ps1 | iex Pulls locac-windows-x64.zip from the latest release into ~/.locac/bin. Set LOCAC_VERSION to pin a tag and LOCAC_INSTALL_DIR to choose somewhere else.
First run
locac config init
locac run "audit the HTTP request pipeline" --require-sandboxconfig init writes ~/.locac/config.json. The API key is read from the provider's own environment variable: ANTHROPIC_API_KEY, OPENAI_API_KEY, and the rest, and never has to be typed on a command line.
Or build it yourself
git clone https://github.com/Losec-io/locac
cd locac
bun install
bun run build:exe
dist\locac.exe selftest Needs Bun>= 1.3, and nothing else.
locac selftest is not a formality: it verifies that the assets embedded in the binary actually materialize on this host, and reports which sandbox mode you get and why.
Threat model
A tool that reads attacker-authored source and then runs it is itself an attack surface. These are the assumptions the harness makes so that pointing it at a repo you do not trust is a normal thing to do.
Authorized testing only