---
title: "report.session@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/report.session"
updated: null
---

# report.session@1 · OpenVibe.Services

HTML: [report.session@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/report.session)

# ReportSession `report.session@1`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

- Version: 1.0.0
- Owner: report
- Visibility: public
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/report/session.v1.json`](/docs/contracts/report.session.json)

report.session@1 (the Agent Streams plan, S3): the report of one agent session, whatever ran it - a Codes task, an Actor task, a desk session or a session on a person's own machine. OWNER is the person it belongs to, SOURCE where the work ran and TASK the task it is about, with a link back to it. TIMELINE holds the steps as they happened (the same shape as live.agent-stream-step@1). OUTPUTS are what came out (a pull request, files, pages, a deploy, a clip, the VOD). PROOF is Codes' finished-task proof: the tests, the screenshots and the review. COST\_USD and MODELS say what it cost and which models ran. HIGHLIGHTS are up to five one-line moments. STREAM is the agent stream it streamed on, when it did. VISIBILITY is who may see it: private (the default), unlisted (anyone with the link) or public. NEVER IN A REPORT: the raw transcript (the source service keeps it for the owner, privately), secrets (the house redactor runs over every text field before anything is stored) and code or diffs (a link to the pull request is fine; its content shows only when the repository is public).

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `id` | string | yes | The report's id (ULID, Crockford base32). | - `pattern ^rps_[0-9A-HJKMNP-TV-Z]{26}$` |
| `owner` | string | yes | The person the session was theirs. | - `pattern ^usr_[0-9A-HJKMNP-TV-Z]{26}$` |
| `source` | enum | yes | Where the session ran. | - `one of "codes", "actor", "desk", "node"` |
| `task` | `https://openvibe.network/contracts/report/session.v1.json#/$defs/task` | yes |  |  |
| `started_at` | string | yes |  | - `format date-time` |
| `ended_at` | string | yes |  | - `format date-time` |
| `worked_seconds` | integer | yes | How long the agent worked (the page's 'worked 42 min'). | - `minimum 0` |
| `outcome` | enum | yes | How the session ended. A session that did not finish says why in stopped\_because. | - `one of "done", "stopped", "failed"` |
| `stopped_because` | string |  | Why it stopped, in plain words. Present when the outcome is not done. | - `minLength 1`<br>- `maxLength 300` |
| `summary` | string | yes | What was asked and what happened, in plain words. | - `minLength 1`<br>- `maxLength 600` |
| `timeline` | `https://openvibe.network/contracts/report/session.v1.json#/$defs/step` | yes | The steps, in the order they happened. |  |
| `outputs` | `https://openvibe.network/contracts/report/session.v1.json#/$defs/output` | yes |  |  |
| `proof` | `https://openvibe.network/contracts/report/session.v1.json#/$defs/proof` | yes |  |  |
| `cost_usd` | number \| null | yes | What the session cost, in dollars. | - `minimum 0` |
| `models` | array of string | yes | Which models ran. | - `items: minLength 1`<br>- `items: maxLength 120` |
| `highlights` | array of string | yes | Up to five one-line moments. | - `maxItems 5`<br>- `items: minLength 1`<br>- `items: maxLength 200` |
| `stream` | object \| null | yes | The agent stream the session streamed on, when it did. |  |
| `visibility` | enum | yes |  | - `one of "private", "unlisted", "public"` |

## Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

 Valid: session

~~~~
{
  "id": "rps_01JAN2C3D4E5F6G7H8J9K0MNPS",
  "owner": "usr_01JAN2C3D4E5F6G7H8J9K0MNPS",
  "source": "codes",
  "task": {
    "title": "Ship the checkout page",
    "ref": "tsk_01JAN2C3D4E5F6G7H8J9K0MNPS",
    "url": "https://openvibe.codes/t/tsk_01JAN2C3D4E5F6G7H8J9K0MNPS"
  },
  "started_at": "2026-11-06T18:00:00.000Z",
  "ended_at": "2026-11-06T18:42:00.000Z",
  "worked_seconds": 2520,
  "outcome": "done",
  "summary": "Asked for a checkout page; the agent built it, ran the tests and opened a pull request.",
  "timeline": [
    {
      "at": "2026-11-06T18:01:00.000Z",
      "title": "Read the checkout code",
      "status": "passed"
    },
    {
      "at": "2026-11-06T18:20:00.000Z",
      "title": "Run the checkout tests",
      "status": "passed",
      "tests": {
        "passed": 12,
        "failed": 0
      }
    }
  ],
  "outputs": [
    {
      "kind": "pr",
      "url": "https://forgejo.example/openvibe/site/pulls/7",
      "title": "Checkout page",
      "state": "open"
    }
  ],
  "proof": {
    "tests": {
      "passed": 12,
      "failed": 0
    },
    "screenshots": [
      "med_01JAN2C3D4E5F6G7H8J9K0MNPS"
    ],
    "review": {
      "verdict": "Looks good",
      "notes": "The mobile layout needs a wider gutter."
    }
  },
  "cost_usd": 0.31,
  "models": [
    "claude-sonnet-4"
  ],
  "highlights": [
    "Found the coupon bug on the first read"
  ],
  "stream": {
    "ags_id": "ags_01JAN2C3D4E5F6G7H8J9K0MNPS",
    "vod_id": "vod_01JAN2C3D4E5F6G7H8J9K0MNPS"
  },
  "visibility": "unlisted"
}
~~~~

Rejected: id-not-rps

~~~~
{
  "id": "session_01JAN2C3D4E5F6G7H8J9K0MNPS",
  "owner": "usr_01JAN2C3D4E5F6G7H8J9K0MNPS",
  "source": "codes",
  "task": {
    "title": "Ship the checkout page",
    "ref": "tsk_1"
  },
  "started_at": "2026-11-06T18:00:00.000Z",
  "ended_at": "2026-11-06T18:42:00.000Z",
  "worked_seconds": 2520,
  "outcome": "done",
  "summary": "Asked for a checkout page.",
  "timeline": [],
  "outputs": [],
  "proof": {
    "tests": {
      "passed": 1,
      "failed": 0
    },
    "screenshots": [],
    "review": null
  },
  "cost_usd": 0.31,
  "models": [],
  "highlights": [],
  "stream": null,
  "visibility": "unlisted"
}
~~~~

Rejected: outcome-unknown

~~~~
{
  "id": "rps_01JAN2C3D4E5F6G7H8J9K0MNPS",
  "owner": "usr_01JAN2C3D4E5F6G7H8J9K0MNPS",
  "source": "codes",
  "task": {
    "title": "Ship the checkout page",
    "ref": "tsk_1"
  },
  "started_at": "2026-11-06T18:00:00.000Z",
  "ended_at": "2026-11-06T18:42:00.000Z",
  "worked_seconds": 2520,
  "outcome": "finished",
  "summary": "Asked for a checkout page.",
  "timeline": [],
  "outputs": [],
  "proof": {
    "tests": {
      "passed": 1,
      "failed": 0
    },
    "screenshots": [],
    "review": null
  },
  "cost_usd": 0.31,
  "models": [],
  "highlights": [],
  "stream": null,
  "visibility": "unlisted"
}
~~~~

## Validate

~~~~
const contracts = require('openvibe-contracts');
contracts.validate('report.session@1', value);   // { valid, errors: [{ path, message }] }
~~~~
