Skip to main content
Rule ID: AE-AUTO-001 · Severity: Medium · Category: Autonomy · Auto-fixable: No

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:
SignalExample
Makefile with a test: or check: targetmake test
justfile / .justfile with a test or check recipejust test
Taskfile.yml / Taskfile.yaml with a test: or check: tasktask test
moon.yml task named test or checkmoon 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 scriptsnpm test
For languages with a well-known conventional test command, no task runner is required:
LanguageConventional commandCondition
Gogo test ./...go.mod present
Rustcargo testCargo.toml present
Pythonpytestpytest config present (pytest.ini, tox.ini, or [tool.pytest.ini_options] in pyproject.toml)
The finding fires when none of these signals exist for an active language.

Examples

A TypeScript project with source files and tests in place, but no test script in package.json and no task runner configured:
package.json
{
  "name": "my-app",
  "scripts": {
    "build": "tsc",
    "lint": "eslint src/"
    // no "test" key
  }
}
An agent reading this repo has no reliable way to invoke the test suite → flagged Medium.

How to fix

Add a task runner target that runs your tests. Charter reads the task runner file — no extra Charter configuration is needed.
1

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.
2

Wire up the test command

The target just needs to invoke your existing test command:
test:
	go test ./...
3

Verify discoverability

Run charter explain AE-AUTO-001 to confirm Charter now recognizes the command.

Score impact

Medium (−4); no hard cap.

Edge cases

Single-language Go and Rust repos are never penalized for lacking a Makefile or other task runner. Their toolchain is the contract.
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.
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.

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.

CLI

charter explain AE-AUTO-001