macOS · Linux
SupportedThe complete treatment: taskpolicy / nice priority demotion, PSI or kern.memorystatus memory pressure, load-average admission.
Guignet needs Bun ≥ 1.3 and git. No npm, node or pnpm. Every command accepts --json and prints exactly one JSON object on stdout.
Platforms
The complete treatment: taskpolicy / nice priority demotion, PSI or kern.memorystatus memory pressure, load-average admission.
The recommended route on Windows. Gets the full POSIX treatment, identical to native Linux.
Shell, tree-kill, priority demotion and the memory gate all have native paths, but the CPU load gate is unavailable by construction — os.loadavg() is zero on Windows. guignet doctor says so before you start.
Quickstart
Create .guignet/config.json in the target repository. Each stage is idempotent and resumable, so you can stop and re-enter the pipeline anywhere.
{
"testCmd": "bun test",
"setupCmd": "bun install",
"repoVisibility": "public"
}$ guignet doctor # validate the repo + suite discovery handshake$ guignet mine # reconstruct tasks from git history$ guignet gate # replay validity → the admitted suite$ guignet run --config run.json # execute attempts$ guignet score # verdicts + metrics + contamination$ guignet report # → .guignet/reports/<ts>/guignet-report.htmlExit codes
Run config
{
"runId": "2026-08-01-sonnet",
"adapter": "claude-code",
"model": "sonnet",
"nAttempts": 3,
"maxTotalDollars": 10
}maxTotalDollars
Once the summed cost of completed attempts reaches the cap, no further attempt starts. In-flight attempts finish, so the overshoot is bounded by one pool width.
Capped attempts write nothing — resume with a raised cap to run exactly the remainder. It is resume-aware: attempts already on disk count against it, except under --force, where every attempt is being replaced and the cap budgets the fresh re-run alone.
Config reference
| Key | Meaning |
|---|---|
| testCmd | how the repository runs its tests (verifier commands scope to it) |
| setupCmd | one-time environment setup, e.g. bun install |
| subdir | package root inside a monorepo |
| repoVisibility | public / private / mixed / unknown — frames the cutoff split (contamination vs knowledge freshness) |
| cutoffs | per-model training-cutoff overrides (ISO dates) |
| preservePaths | extra worktree paths preserved across replay resets, beside the always-kept node_modules (e.g. .venv, a vendored dir a test needs) |
| gateReplays | validity replay count k (default 2) |
| testCwd | where setup/verifier/agent run: subdir (default) or repo — use repo for workspace test runners (vitest projects, pnpm/nx) that must execute at the repository root |
| host.priority | scheduling priority for all spawned work: low (default — yields to your foreground) / normal |
| host.maxLoadPerCore | run-pool admission threshold: add concurrency only while load1 ≤ this × cores (default 1.5) |
| spine | suite event emission: auto (default, only if .suite/ exists) / on / off |
Development
bun run check runs the typecheck, the import-boundary firewall that keeps ground truth out of the mining path, and the test suite. The boundary check is CI-enforced — a leak fails the build, not a review.
$ bun install$ bun run check # typecheck + import-boundary firewall + testsLicensed MIT. The harness has to be inspectable, or nobody runs it on private code.