jig init writes .ai/config.yaml with sensible values, and any
setting that is missing takes the default built into Jig. This page lists every setting, so you can
tell your agent what to change — or change it yourself.
The file uses a flat subset of YAML: section.key: value, lists written inline, no nesting.
Where project knowledge, task workspaces and runtime files live is fixed and cannot be configured.
Project settings — .ai/config.yaml
The project’s file is committed: everyone who clones the project gets the same settings.
Runtimes and stacks
After changing either list, run
jig upgrade (or ask your agent to): it installs what is newly
selected.
Git and branches
Housekeeping
Knowledge
Verification
verify.full_run: ci
Set it only when your CI runs every check on every pull request. Jig takes your word for it; it
does not check.
With ci, a plain jig verify — the one the agent runs before declaring work done — checks only
what changed since the branch left git.base_branch: committed, staged, unstaged and untracked
changes. It prints why:
- in CI — whenever the
CIenvironment variable is set, which every CI service does, so the same command runs everything there; - on request —
jig verify --full.
Personal settings — .ai/config.local.yaml
Some settings are a matter of personal taste rather than project policy. Put them in
.ai/config.local.yaml — the same format, one file per clone, ignored by Git (jig init adds it to
.gitignore). It overrides the project’s file only for:
housekeeping.cadence,housekeeping.fetch,housekeeping.trash_ttl,housekeeping.abandoned_ttl,housekeeping.stale_after;git.worktree_root.
jig status shows what your local file changes, and warns if Git
does not ignore it.
Verification profiles
A profile knows how to check one stack. Jig runs the tools your project already uses, from the project’s own environment —vendor/bin, node_modules/.bin, .venv, bundle exec — never a global
copy with another version. The stack’s own toolchain (go, cargo, dotnet, composer, your
package manager) comes from PATH. Jig installs nothing: a missing tool is reported as a skip, and a
skip is never a pass.
When only part of a project changed, every profile except
generic and swift narrows its checks:
a linter gets the changed files, and tests are narrowed where the stack ties a source file to its
tests (foo.py → test_foo.py, a Go package and its importers, a Rust crate). Anything it cannot
narrow runs in full, with the reason printed.
Checks of your own belong in the project’s installed profile under .ai/profiles/; jig upgrade
keeps a profile you edited.
A verification map for your project
A profile only knows rules that are true for every project of its stack. When your project has its own — “changes underdocs/ affect no test”, “anything in src/Billing/ runs the billing
tests” — write them into .ai/verify/<profile>.map. The file is yours: jig init and
jig upgrade never create or touch it.
- (affects no check), ALL (run everything), or a
filter the profile understands — a test file for PHP, Python, Ruby, Dart and Node, a package for Go,
a crate for Rust, a test project for .NET, a module for Gradle and Maven, a test-name filter for
shell. The first matching line wins; a path no line matches is left to the profile’s own rules. A
broken line fails that profile with the file and line named, rather than narrowing the wrong way.
When housekeeping runs
Housekeeping — noticing merged tasks and cleaning up workspaces — needs a trigger. Jig does not run a scheduler of its own. Pick one, or both; running it twice is harmless.- Claude Code session hook. At the start of each session it starts housekeeping in the
background, only when the last run is older than
housekeeping.cadence.jig init --session-hookcreates.claude/settings.jsonwith the hook when the file does not exist yet; an existing file is never edited —jig initprints the lines to add by hand. The Windows installer turns the hook on unless you pass-NoSessionHook. - A scheduler. Codex has no session hook. Examples for cron, macOS launchd and Linux systemd are
in
.ai/templates/scheduler/; use the project’s absolute path in them.
jig status reports whether the session hook is installed.