The small stuff — flaky tests, Sentry bugs, copy tweaks, broken CSV exports — handled while you work on what matters.
Yak watches Slack, Linear, Sentry, and our CI. When something small breaks, it opens a branch, writes the fix, verifies it in CI, and hands you a pull request with screenshots and a video walkthrough. Got a question about the codebase instead? You'll get an answer back, not a PR.
Yak plugs into the tools the team already lives in. Tag a Slack thread, assign a Linear issue, let a Sentry alert fire — the routing layer takes it from there.
Ambiguity-aware. If the ask could be read two ways, Yak replies with grounded options before writing a single line of code.
Assign-driven. Assign any issue to the Yak agent — fix or question, Yak classifies it upfront. A research label is optional, just a shortcut past the classifier.
Filters the noise. CSP violations, redis blips, and one-off user errors get dropped — only real, actionable issues with enough signal get a task.
Yak watches Sentry and CI in the background. It wakes up when an actionable issue crosses the threshold or when a test starts failing on main. Then it reads the stacktrace, forms a hypothesis, and writes a fix plus a regression test.
7 endpoints still read accuracy_type directly. Two customer-facing, five internal. Estimated migration: 2 PRs, ~180 LOC. No blocking callers.
"When is the welcome email triggered?" "How bad would this refactor be?" Just ask. A lightweight classifier decides up front whether your request is a fix or a research question, so there are no magic prefixes to remember.
Flip a switch on a repo and Yak reviews every non-draft PR. Findings land as GitHub line-level comments with category and severity labels; one-to-ten-line fixes come through as native suggestion blocks you can commit with a click.
app/Services/GeocodeClient.php:87
Performance should_fix
Retry loop re-creates the Http::withHeaders call on each attempt, losing connection reuse.
```suggestion
$client = Http::withHeaders($headers);
foreach (range(1, 3) as $attempt) {
$response = $client->get($url);
}
```
Branch, commit, local tests — every run in a fresh sandbox. Never pushes to main.
Full test suite runs on real CI. If it fails, Yak retries once. If that fails, a human takes over.
Screenshots, video, summary, cost, session id. Large diffs get a yak-large-change label.
Push follow-up commits, request changes, or take over entirely. Yak's branch is just a starting point.
Always. The Yak GitHub App has no merge authority and is never on your bypass list by design.
The Yak GitHub App can push branches and open PRs — nothing more. Branch protection stays on.
Every run lives in its own Incus container, cloned from a ZFS snapshot. Firewalled off from Yak itself, its database, and every other task.
At most one retry on CI failure. Two strikes and a human picks up — no endless flailing.
Every run is capped. The daily routing budget is enforced by job middleware before a single token is spent.
When Yak touches the frontend, it spins up the dev server, logs in as a seeded test user, drives the affected page through the exact flow it just changed, and attaches the recordings to the PR.
Paste the clone URL. Yak dispatches a one-time setup task inside a fresh Incus container — docker-compose up, dependencies, migrations, test suite — then freezes the result as a ZFS copy-on-write snapshot. Every future task on this repo clones that snapshot in about two seconds.
Papercuts, handled. Sign in to watch tasks in flight, read Claude sessions, inspect sandbox artifacts, and tweak the prompts Yak runs on your behalf.