id and exactly one check kind: state, trace, judge, or one of the process checks revealed, knows, told, decided, message, never, before and within. Scene files write checks in YAML under checks:. The hosted console and playground task files write the same objects as a JSON list. For how checks are evaluated, see Checks.
scene.yaml
Task checks (console and playgrounds)
Where each kind works
A playground task holds at most 20 checks.
Common fields
pass is a scene-level list of required check IDs. It defaults to every check.
Trace checks
Set at least one. With both, both must hold.
A pattern is
"<METHOD> <PATH>", or "*" for any call. The method ignores case, and * as the method accepts any method. The path is exact, relative to the tool’s base URL, without the query string. * in the path matches any run of characters, including /. Only the agent’s own calls count.
called with a list does not check order. For order, use a before check with called milestones.
State checks
Slack message
slack.message counts the messages in a channel that match every condition given and passes when there are at least count_gte.
GitHub
|
github.permission | { repo, user }, then is | The user’s effective access to the repository is is: read, write, admin or none. |
revision is a branch name, a commit ref, default (the default branch) or production.
github.issue fields:
Datadog
PagerDuty
pagerduty.incident selects one incident and checks at least one property.
Fault resolved
fault_resolved: <fault ref> passes when a living-world fault declared in world_rules.faults is resolved. See Test file.
Okta
okta.user: <login or ref> with status, status_in or exists: false passes when the user has that status, has one of the statuses in status_in, or no longer exists.
Other tools
The other tools have no state checks. Check what the agent did with trace checks.Process checks
Process checks read what happened between the agent and the people in the world: who learned which fact, who decided what, which messages reached whom, and in what order. The world’s engine records these as the attempt runs. A check reads the records, never the text a model wrote, and nothing a person writes can end an attempt.
Facts and decisions are written
<person>.<id>, for example laura.beta_on. A person is written as their bare ref (laura), $laura or $person.laura.
Message selectors
message, never and message milestones select Slack messages and GitHub issues and comments written during the attempt. The seed never counts. Give at least one field; every field given must hold.
A failed
message check names the closest miss, for example a reply in the thread of the wrong question.
Milestones
before and within compare the times of milestones. A milestone is one of:
A milestone that never happened fails both
before and within, so an attempt that did nothing cannot pass them. { issue_labeled: { repo, labels } } covers labels given when an issue is created as well as labels added later, which a called milestone cannot.
Judge checks
- Needs
OPENROUTER_API_KEYin the environment ofancha runorancha check. Setjudge.modelinancha.yamlto choose the OpenRouter model. - The model sees the agent’s API calls to Slack, GitHub, Datadog and PagerDuty and the final Slack messages, never credentials, the seed or other checks.
- Without a key, the check is skipped. A skipped check never passes. Keep advisory rubrics out of
pass. - A failed model call makes the trial invalid, not failed.
Refs
Fields that point at records take refs:$name, or $kind.name to also check the record’s kind. Kinds are user, channel, message, repo, commit, pull, issue, fault, monitor, service, escalation_policy, schedule, incident, dashboard, event, log and person. A ref must exist in the world: validation rejects a check that names an unknown ref.
Durations
Durations are strings such as500ms, 30s, 5m, 1h or 1m30s.
Results
Each trial’s
checks.json holds every result. ancha explain prints the failed ones, and ancha check --json prints them all for a live world.