---
title: "live.agent-stream-schedule@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/live.agent-stream-schedule"
updated: null
---

# live.agent-stream-schedule@1 · OpenVibe.Services

HTML: [live.agent-stream-schedule@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/live.agent-stream-schedule)

# LiveAgentStreamSchedule `live.agent-stream-schedule@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: live
- Visibility: public
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/live/agent-stream-schedule.v1.json`](/docs/contracts/live.agent-stream-schedule.json)

live.agent-stream-schedule@1 (Agent Streams S7): an owner's schedule for a public agent stream. A schedule names a time, the task template the desk will run and the mode; Live starts it when the owner's desk is online, and when the desk is not it says 'didn't start: the desk was offline' and runs nothing. A chatplays schedule never starts on its own: it waits for the owner's Go (the S6 rule). The schedule shows on the channel's Agents tab and in Today 24 hours before its time. The id is scd\_<ULID>; the started stream (if any) is named by agent\_stream\_id.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `id` | string | yes | The schedule's id (ULID, Crockford base32). | - `pattern ^scd_[0-9A-HJKMNP-TV-Z]{26}$` |
| `owner` | string | yes | The person whose desk runs the scheduled task. | - `pattern ^usr_[0-9A-HJKMNP-TV-Z]{26}$` |
| `channel` | string | yes | The owner's Live channel username. | - `minLength 1`<br>- `maxLength 64` |
| `title` | string | yes |  | - `minLength 1`<br>- `maxLength 200` |
| `task` | `https://openvibe.network/contracts/live/agent-stream.v1.json#/$defs/task` | yes |  |  |
| `mode` | enum | yes | How the stream is played. Watch, Narrated and Co-pilot may start on schedule; chatplays waits for the owner's Go. | - `one of "watch", "narrated", "copilot", "chatplays"` |
| `visibility` | enum | yes | Who may watch the stream the schedule starts. Today shows public schedules only. | - `one of "private", "unlisted", "public"` |
| `starts_at` | string | yes |  | - `format date-time` |
| `state` | enum | yes | Where the schedule stands: scheduled, live (with agent\_stream\_id), ended, missed ('didn't start: the desk was offline') or cancelled by its owner. | - `one of "scheduled", "live", "ended", "missed", "cancelled"` |
| `agent_stream_id` | string \| null |  | The stream the schedule started, once it did. | - `pattern ^ags_[0-9A-HJKMNP-TV-Z]{26}$` |
| `missed_reason` | enum |  | Why a scheduled start did not happen. 'waits\_for\_go' is a chatplays schedule keeping its time until the owner presses Go; 'desk\_offline' is the design's 'didn't start: the desk was offline'. | - `one of "desk_offline", "task_not_ready", "waits_for_go", null` |
| `waits_for_go` | boolean |  | True for a chatplays schedule: the time has come but nothing runs until the owner presses Go. |  |
| `started_at` | string \| null |  |  | - `format date-time` |
| `ended_at` | string \| null |  |  | - `format date-time` |
| `reminders` | integer |  | How many followers opted in to a reminder; neighbours never see who they are. | - `minimum 0` |
| `reminded` | boolean |  | For the caller's own view: whether this caller opted in to a reminder. Absent when there is no caller. |  |
| `page_url` | string |  | The channel's Agents tab, where the schedule shows 24 hours before its time. | - `pattern ^https://openvibe\.live/`<br>- `format uri` |
| `created_at` | string | yes |  | - `format date-time` |

## Examples

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

 Valid: missed-desk-offline

~~~~
{
  "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNPX",
  "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
  "channel": "mira",
  "title": "Nightly dependency update",
  "task": {
    "source": "actor",
    "ref": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPY",
    "title": "Update the dependencies"
  },
  "mode": "watch",
  "visibility": "public",
  "starts_at": "2026-11-08T03:00:00.000Z",
  "state": "missed",
  "agent_stream_id": null,
  "missed_reason": "desk_offline",
  "waits_for_go": false,
  "started_at": null,
  "ended_at": null,
  "reminders": 0,
  "page_url": "https://openvibe.live/@mira/agents",
  "created_at": "2026-11-07T03:00:00.000Z"
}
~~~~

Valid: scheduled

~~~~
{
  "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
  "channel": "mira",
  "title": "Fix the login page, on a schedule",
  "task": {
    "source": "codes",
    "ref": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPW",
    "title": "Fix the login page",
    "url": "https://openvibe.codes/t/tsk_01JAB2C3D4E5F6G7H8J9K0MNPW"
  },
  "mode": "narrated",
  "visibility": "public",
  "starts_at": "2026-11-08T19:00:00.000Z",
  "state": "scheduled",
  "agent_stream_id": null,
  "missed_reason": null,
  "waits_for_go": false,
  "started_at": null,
  "ended_at": null,
  "reminders": 3,
  "reminded": true,
  "page_url": "https://openvibe.live/@mira/agents",
  "created_at": "2026-11-07T02:00:00.000Z"
}
~~~~

Valid: waits-for-go

~~~~
{
  "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNPZ",
  "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
  "channel": "mira",
  "title": "Chat plays: build a tiny game",
  "task": {
    "source": "codes",
    "ref": "tsk_01JAB2C3D4E5F6G7H8J9K0MNQ1",
    "title": "Build a tiny game"
  },
  "mode": "chatplays",
  "visibility": "public",
  "starts_at": "2026-11-08T20:00:00.000Z",
  "state": "scheduled",
  "agent_stream_id": null,
  "missed_reason": "waits_for_go",
  "waits_for_go": true,
  "started_at": null,
  "ended_at": null,
  "reminders": 1,
  "page_url": "https://openvibe.live/@mira/agents",
  "created_at": "2026-11-07T04:00:00.000Z"
}
~~~~

Rejected: missing-task

~~~~
{
  "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNP1",
  "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
  "channel": "mira",
  "title": "No task",
  "mode": "watch",
  "visibility": "public",
  "starts_at": "2026-11-08T19:00:00.000Z",
  "state": "scheduled",
  "created_at": "2026-11-07T02:00:00.000Z"
}
~~~~

Rejected: unknown-state

~~~~
{
  "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNP2",
  "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
  "channel": "mira",
  "title": "Confusing state",
  "task": {
    "source": "codes",
    "ref": "tsk_01JAB2C3D4E5F6G7H8J9K0MNQ2",
    "title": "A task"
  },
  "mode": "watch",
  "visibility": "public",
  "starts_at": "2026-11-08T19:00:00.000Z",
  "state": "postponed",
  "created_at": "2026-11-07T02:00:00.000Z"
}
~~~~

## Validate

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