Configuration
harness init (or the app’s Settings) writes config.json for you. Start from
config.example.json; every value there is a default or a placeholder.
Profiles describe model servers; roles say which profile does what:
"profiles": { "default": { "baseUrl": "http://127.0.0.1:8080/v1", "model": "auto", // "auto" uses the first model the server lists "apiKeyEnv": null, // the NAME of an env var holding a key, or null "contextTokens": "probe", // or a number "maxOutputTokens": 4000, "thinking": { "control": "probe", "effort": "low", "budgetTokens": null }, "structuredOutput": "probe", // json_schema | json_object | prompt "toolCalls": "probe", // native | none "timeoutSec": 900 }},"roles": { "planner": "default", "implementer": "default", "fixer": "default", "reviewer": "default", "verifier": "default", "summarizer": "default" }Use two profiles to plan and review with a larger model and implement with a faster one. HARNESS_<PROFILE>_BASE_URL
and HARNESS_<PROFILE>_MODEL override a profile from the environment.
Stacks say how to check a project. The Astro stack in the example:
| Gate | Command | When | Blocking |
|---|---|---|---|
format |
npx prettier --check {files} |
each task, touched files | no |
lint |
npx eslint {files} |
each task, touched files | yes |
typecheck |
npx astro check |
each task | yes |
unit |
npx vitest run {tests} |
tasks with tests | yes |
build |
npx astro build |
integration | yes |
e2e |
npx playwright test {tests} |
integration | yes |
Gates are argv arrays, never shell strings. A gate whose tool is missing is reported as skipped, never as passed.
Gates may not install packages, run git or gh, or use npx --yes. Other stack keys: detect (files that
identify the stack), alwaysGates, protectedPaths (globs the model may never touch; .git, .husky and
node_modules are always protected), dependencyDirs, and docs.local (a local checkout of the framework’s docs,
used by the review; without it, framework claims abstain instead of being confirmed).
Limits (defaults): maxFilesPerTask 3, maxFixRounds 3, maxReplanRounds 2, maxDiagnostics 20,
maxLookups 6, maxReviewFixTasks 2, wholeFileRewriteMaxBytes 4096, maxGateOutputBytes 204800.
gateEnvAllow lists extra environment variables your gates need; everything that looks like a secret is removed
from the gates’ environment otherwise.
Built by V and Bruno LLC: Astro sites & AI tooling. Work with us →