Testing & Proof
Manifest integrates testing into the feature lifecycle. Agents write tests
before implementation, record evidence with prove_feature, and
cannot complete a feature without a passing proof. This ensures every
implemented feature has verified test coverage.
TDD workflow
When an agent calls start_feature, the response includes
testing guidance. The agent follows the red-green cycle:
- Write failing tests: based on the acceptance criteria in the feature spec
- Record red proof: call
prove_featurewith test results showing failures - Implement: write code to make the tests pass
- Record green proof: call
prove_featureagain with passing results - Complete: call
complete_feature(requires exit code 0 from latest proof)
prove_feature
The prove_feature tool records test evidence for a feature. It
accepts structured test results so Manifest can display pass/fail statistics
and individual test outcomes.
prove_feature(
feature_id: "...",
exit_code: 0,
results: [
{ name: "creates a user", suite: "UserSpec", state: "passed",
file: "tests/user_spec.rs", line: 42, duration_ms: 12 },
{ name: "rejects duplicate email", suite: "UserSpec", state: "passed",
file: "tests/user_spec.rs", line: 58, duration_ms: 8 }
]
) Structured results
Each test result includes:
| Field | Required | Description |
|---|---|---|
name | Yes | Test name |
suite | No | Test suite or module |
state | Yes | passed, failed, errored, or skipped |
file | No | Source file path |
line | No | Line number in source |
duration_ms | No | Execution time in milliseconds |
message | No | Error message (for failures) |
The agent is the universal adapter: it runs whatever test framework the project uses, parses the output, and provides results in this structured format.
Test adapters
Manifest auto-detects common test frameworks and knows how to parse their output:
| Adapter | Framework | Detected commands |
|---|---|---|
| cargo-test | Rust | cargo test, cargo nextest |
| pytest | Python | pytest, python -m pytest |
| jest | JavaScript / TypeScript | jest, vitest, npx jest, pnpm test, npm test, bun test |
| go-test | Go | go test |
| dotnet-test | .NET (xUnit, NUnit, MSTest) | dotnet test |
| rspec | Ruby | rspec, bundle exec rspec, bin/rspec |
| junit | Java (Maven, Gradle) | mvn test, gradle test, ./gradlew test |
| phpunit | PHP | phpunit, php artisan test, ./vendor/bin/phpunit |
| swift-test | Swift | swift test |
| elixir-test | Elixir | mix test |
| dart-test | Dart / Flutter | dart test, flutter test |
Custom adapters
For unsupported frameworks, create a Lua adapter in .manifest/adapters/. The adapter receives raw test output and
returns structured results. See the prove_feature tool reference for the full interface.
Evidence panel
The web UI displays proof evidence in a collapsible sidebar panel on the feature detail view. The panel shows:
- Proof stats: Total tests, passed, failed, skipped counts
- Test results: Individual test outcomes with names, durations, and error messages
- History: Previous proof recordings showing the red-green progression
- Exit code: Whether the latest run passed (exit code 0) or failed
The panel appears when a feature has at least one proof recording. Click the test tube icon or the proof stats badge to expand it.
Completion gate
complete_feature enforces a passing proof:
- The feature must have at least one
prove_featurerecording - The latest proof must have
exit_code: 0 - If the latest proof has failures, the agent must fix and re-prove before completing
This gate ensures that every implemented feature has verified, passing tests.
Next step
Continue to Product versions.