Why this rule
Even with tests present, an agent needs to know how to run them. A discoverable command closes the agent’s work loop — run, observe, fix, repeat — without guessing. When a test command is missing, the agent either skips verification entirely or attempts to infer the command, risking a wrong invocation. Neither outcome is acceptable for an agent that is supposed to be self-correcting.AE-AUTO-001 only applies when at least one code language is active in the repo. A docs-only or config-only repo is not evaluated.
What triggers it
Charter checks whether a test or verification command is discoverable from the repo’s tracked files. A command is considered discoverable if any of the following signals exist:| Signal | Example |
|---|---|
Makefile with a test: or check: target | make test |
justfile / .justfile with a test or check recipe | just test |
Taskfile.yml / Taskfile.yaml with a test: or check: task | task test |
moon.yml task named test or check | moon run :test |
mise.toml / .mise.toml with [tasks.test] or [tasks.check] | mise run test |
package.json with a test key (or test:* variant) under scripts | npm test |
| Language | Conventional command | Condition |
|---|---|---|
| Go | go test ./... | go.mod present |
| Rust | cargo test | Cargo.toml present |
| Python | pytest | pytest config present (pytest.ini, tox.ini, or [tool.pytest.ini_options] in pyproject.toml) |
Examples
- Failing
- Passing
A TypeScript project with source files and tests in place, but no An agent reading this repo has no reliable way to invoke the test suite → flagged Medium.
test script in package.json and no task runner configured:package.json
How to fix
Add a task runner target that runs your tests. Charter reads the task runner file — no extra Charter configuration is needed.Choose a task runner
If you already have a
Makefile, package.json, or moon.yml, add a test target there. If you have none, mise.toml tasks are the lowest-friction option for multi-language repos.Score impact
Medium (−4); no hard cap.
Edge cases
Go and Rust — no task runner required
Go and Rust — no task runner required
Single-language Go and Rust repos are never penalized for lacking a
Makefile or other task runner. Their toolchain is the contract.Python — pytest config required
Python — pytest config required
Conventional Python detection requires a pytest config file (
pytest.ini, tox.ini, or [tool.pytest.ini_options] in pyproject.toml). The mere presence of .py files is not enough, because python alone is not a zero-config test command.No active language
No active language
When no language is active (docs/config/tooling-only repos), AE-AUTO-001 does not fire. See AE-TEST-001 for how active language detection works.
Related rules
AE-TEST-001
Checks that test files actually exist — a prerequisite for this rule to be meaningful.
AE-ENV-001
Reproducible toolchain — required for the discoverable test command to work reliably.