Skip to main content
A check is an object with an 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_KEY in the environment of ancha run or ancha check. Set judge.model in ancha.yaml to 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 as 500ms, 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.