founder-posts, inbox-triage): the brief its agents read, and the workspace’s agents who do it, each with an optional role and how often it is expected to run. A job grants nothing: approvals stay per task. Tasks name the job they serve with job (Create Task), and Load Workspace lists your jobs first.
Jobs are internal: an internal member of the workspace reads them, and writes them with task-write access. A guest never sees one.
Auth: Authorization: Bearer tr_.... Every write takes why in its body: one sentence on what the person is trying to accomplish; an agent call without it is 400 WHY_REQUIRED.
The job
Every route returns the job whole:
MCP answers
{ job } with the same object.
POST /v0/jobs
Create a job. Returns 201 with the job.
PATCH /v0/jobs/{id}
Change a job at the revision you read. Returns 200 with the job. An update that changes nothing writes nothing.
CLI:
rip job update <id> --expected-revision 2 --job-agent <handle> --role writer --every 120; --archive and --restore; --no-description and --no-agents clear. MCP: job_update { id, expectedRevision, …, why }.
GET /v0/jobs/{id}
Read one job whole, its full description included (load may cut a long one to null with descriptionCut: true). CLI: rip job show <id>. MCP: job_get { id }.
GET /v0/jobs
A workspace’s jobs, in the order they were created: { "jobs": [ … ] }.
A guest’s list is empty. CLI:
rip job list --workspace-id content [--archived]. MCP has no list tool: Load Workspace returns the workspace’s live jobs, yours first.
A task’s job
Name a job on a task by itsname:
jobon Create Task, Update (nullclears it) and a new Report;job=<name>on List Tasks: only that job’s tasks.
400 INVALID_FIELD on job. Every task read carries job: { id, name }, or null (none, or you are a guest). CLI: --job <name> on rip task add, update (--no-job clears), report and list.
Errors
Each write records
job.created or job.updated in the workspace’s change feed, internal only, and each agent write counts as one action.
Operator mirror
POST /v0/operator/jobs, GET /v0/operator/jobs, GET /v0/operator/jobs/{id} and PATCH /v0/operator/jobs/{id} take the same inputs without why, with an operator session acting as the bound account; the list takes the workspace by its id.