join.allowed
A person let a harness or a device in by a join request, with what they allowed it to do.
Direction: Chips → the log
Sent by: Chips only; refused from a client
Requires a run: no
Schema: join.allowed.json
Fields
Section titled “Fields”Every event also carries the envelope.
| Field | Required | Type | Description |
|---|---|---|---|
v |
yes | 1 |
Protocol major version. |
type |
yes | "join.allowed" |
|
id |
yes | string |
The event’s own id. Stable across a retry of the same event. |
ts |
yes | string |
When it happened, by Chips’ clock. Stamped on the way in; a value the sender writes is replaced. |
workspace_id |
yes | string |
A workspace identifier: ws_ followed by a ULID. |
space_id |
no | string |
The space, when the event belongs to one. |
run_id |
no | string |
The run, when the event belongs to one. |
seq |
no | number |
Assigned by the server on append, monotonic per workspace. Absent on the way in. |
idempotency_key |
no | string |
Required on every client-originated write. Sending the same key twice is a no-op. |
actor |
yes | object | The participant an event is attributed to. |
actor.kind |
yes | "person" | "harness" | "agent" | "system" |
Whether a person, a harness, one of a harness’s agents or Chips itself acted. |
actor.id |
yes | string |
The participant id, or system for Chips. |
actor.harness_id |
no | string |
For an agent: the harness it speaks through, whose budget and runs are the agent’s (ADR 0087). Filled in by Chips. |
request_id |
yes | string |
The request. |
kind |
yes | "harness" | "device" | "invite" | "pairing" |
A harness asking for a key; a device asking to be paired; a person joining by an invite, or a device pairing by a code, that waits for whoever handed it out (ADR 0232). |
started_by |
yes | "requester" | "person" |
Who started it: the requester, with a code to compare, or a person, with a link that is allowed already. |
name |
no | string |
What the requester called itself. |
software |
no | string |
Its software, as it said. |
machine |
no | string |
Its machine, as it said. |
from_addr |
no | string |
The address it asked from. |
by |
yes | string |
Who decided: allowed it, refused it, or made the link. |
capabilities |
yes | string[] |
What the harness may do: what was granted, which may be less than it asked. |
harness_id |
no | string |
The harness made, when a link was redeemed. A code allowed makes it at its poll. |
device_id |
no | string |
The device paired, when it was a link’s. |
pair_as |
no | string |
Whom a device is paired as, when an owner chose somebody already here whose phone is new (ADR 0206). |
Example
Section titled “Example”{ "v": 1, "type": "join.allowed", "id": "evt_01K4ZQPX0000000000000000J2", "ts": "2026-10-05T21:05:12.000Z", "workspace_id": "ws_01K4ZQPX000000000000000001", "actor": { "kind": "person", "id": "usr_01K4ZQPX000000000000000003" }, "request_id": "jrq_01K4ZQPX0000000000000000J1", "kind": "harness", "started_by": "requester", "name": "Tide", "software": "tide 0.4.1", "machine": "vps-fra-1", "from_addr": "100.88.4.12", "by": "usr_01K4ZQPX000000000000000003", "capabilities": ["autonomy", "new_spaces"]}