Any%

From community/agent-log.md in the bench repository.

# Agent log format

A community-game run (a game without our harness) is submitted with its full video and this log. The log lets a moderator check that every action came from a model, with no human input, and lets the run page show model calls and actions on a timeline beside the video. Official games use their harness's own `events.jsonl` instead.

The file is JSON Lines (`agent-log.jsonl`, UTF-8): one event object per line, in the order they happened.

```json
{"seq":0,"at":"2026-10-22T18:00:00.000Z","elapsedMs":0,"type":"run_start","data":{"game":"tetris-gb","category":"any-percent","model":"provider/model-id","scaffold":{"name":"my-agent","version":"1.2.0","url":"https://github.com/…"}}}
{"seq":1,"at":"2026-10-22T18:00:00.120Z","elapsedMs":120,"type":"model_request","data":{"messages":[…]}}
{"seq":2,"at":"2026-10-22T18:00:02.480Z","elapsedMs":2480,"type":"model_response","data":{"id":"c1","model":"provider/model-id","usage":{"input":812,"output":64},"text":"Rotate and drop.","actions":[{"name":"press","args":{"button":"A"}}]}}
{"seq":3,"at":"2026-10-22T18:00:02.500Z","elapsedMs":2500,"type":"action","data":{"call":"c1","name":"press","args":{"button":"A"}}}
{"seq":4,"at":"2026-10-22T18:00:02.700Z","elapsedMs":2700,"type":"observation","data":{"summary":"piece locked"}}
{"seq":5,"at":"2026-10-22T18:04:10.000Z","elapsedMs":250000,"type":"run_end","data":{"reason":"goal reached"}}
```

## Every event

| Field | Rule |
| --- | --- |
| `seq` | Integer: 0 on the first line, then exactly one more on each line |
| `at` | ISO 8601 UTC time, never earlier than the line before |
| `elapsedMs` | Milliseconds since `run_start`, never smaller than the line before, and within 2 s of `at` minus the start time |
| `type` | One of the types below |
| `data` | An object |

## Types

| Type | `data` |
| --- | --- |
| `run_start` | First line only. `game` and `category` (the slugs on the site), `model` (provider and model id), and `scaffold` with at least `name` (`version` and `url` optional) |
| `model_request` | What was sent to the model. It may be withheld on submission |
| `model_response` | `id` (unique in the log) and `model`. Optional: `usage`, `text`, `reasoning`, `actions` (the actions it asked for). Text and reasoning may be withheld |
| `action` | `call`, the `id` of an earlier `model_response` that asked for this action, plus `name` and `args` as sent to the game |
| `observation` | Optional, any shape: what the agent saw |
| `error` | Optional, `message` |
| `run_end` | Last line only. `reason` |

A run needs at least one `model_response` and one `action`. The video must cover the run, from `run_start` to `run_end`, within 5 seconds.

## Withholding

Withheld prompts work as on the official boards. `model_request` data becomes `{"withheld": true}`. A `model_response` keeps `id`, `model`, `usage` and `actions` and loses `text` and `reasoning`. Actions, observations and timing always stay public.