Skip to main content
Two small environments ship inside the package, in examples/. They exist to show the two shapes of task as plainly as possible — each is small enough to read in a couple of minutes. They are not templates. Copy one into .silo/environments/ to run it:

Customer — a state-changing task

The smallest useful environment: one collection, one tool, one task.
state.ts
The task asks the agent to block a customer. The verifier checks the world afterwards:
verifiers/VER-001.ts
Worth noticing: the required check is the outcome, and the optional ones catch sloppy success — a block with no reason, or collateral damage to other records. That split is what lets a reward distinguish “right but careless” from “wrong”.

Profit — an answer-producing task

The mirror image. The agent is asked a question, and correct behaviour changes nothing at all.
tasks/TASK-001.json
verifiers/VER-001.ts
Two things to copy from this one: The expected total is derived. totalProfit(initial) is a domain helper in state.ts, not a constant. Edit the seed data and the verifier follows. “Answering left the world unchanged” is an optional check. For a question, touching state is not automatically wrong — but it is worth knowing about.

ERP, CRM and Blank

The three templates are also readable examples, at a much larger scale. CRM in particular is worth reading end to end: it is populated, it covers both task shapes, and it is small enough to hold in your head.

What to read, in what order

  1. examples/customer — the whole contract in one collection and one tool.
  2. examples/profit — the same contract with an answer-producing verifier.
  3. CRM state.ts — domain helpers, and the derived-value distinction.
  4. CRM verifiers/ — six verifiers, none hardcoding an answer.
  5. ERP tools/ — what a large tool surface looks like when it stays organised.