---
title: Inform
kind: resource
slug: inform
summary: "Where an update stands and who has taken it in: the summary, who is presenting, and read receipts drawn from who has actually opened it."
---

# Inform

Where an update stands and who has taken it in: the summary, who is presenting, and read receipts drawn from who has actually opened it.

An **inform** is a Droplet wearing the `inform` Type (see the [Topic](/docs/resources/topic) concept). It is the counterpart to a [decision](/docs/resources/signoff), and the difference is what each is FOR:

- a **decision** is durable and gets QUERIED — "has this been decided, and does what I am about to decide conflict with it?";
- an **inform** is temporal and gets CAUGHT UP ON — "what happened this week that I need to know?"

That is why they are separate resources rather than one with a flag. An agent asked whether something conflicts with a past decision should not get back an update somebody circulated once, and an agent asked what happened this week should not have to filter rulings out of the answer.

**An inform blocks nobody.** There is no roster gate, no votes, no verdict, and no acknowledgement step for anyone to complete. Its whole state is the Type's status field plus who has opened it, which is why it needs three operations where sign-off needs nine.

**Read receipts are passive.** They are drawn from visit records — opening the Droplet is what clears the flag. Nobody is asked to confirm anything, and a reader cannot fail to do something.

**Presence is separate from reading.** `set-attendance` records that a person HAS the information without having opened it — the room an inform was presented to, laptops down. It is stored on the Droplet rather than as a view record, so Droplet view counts and admin metrics stay untouched, and the roster keeps presented-to and opened-it distinguishable rather than collapsing them into one number.

**What you can do:**

- **`get`** — the summary, presenters, date, and who has opened it. The `roster` is EDITOR-ONLY: a supplemental access grant can make a non-member of an invite-only Space a reader, so naming the audience to every reader would disclose membership they cannot otherwise see. The `reads` aggregate is always present.
- **`set-phase`** — circulate it (`active`) or mark it presented (`closed`). Editor-gated: there is no separate roster, so the people who can edit the Droplet are the people who can move it. Writes the Type's own declared status value, so it can never land outside the enum.
- **`mark-present`** — record that someone in the audience has the information. Editor-gated, and reversible.

To LIST informs rather than read one, use [`topic.list`](/docs/resources/topic) with `kind: 'inform'` — or `drop informs list` / `drop informs mine`, which pre-set it.

## The Inform object

### Attributes

- **`configured`** `bool` — Whether the Droplet's Type is inform-shaped. When false there is no inform — the tray self-hides and the rest of the object is empty.
- **`phase`** `string` (enum: `draft` / `active` / `closed`) — Lifecycle. `draft` = not out yet, `active` = circulating, `closed` = presented.
- **`status`** `string · nullable` — The raw value of the Type's status field that the phase is derived from.
- **`summary`** `string · nullable` — What the room needs to know. Markdown — the boards flatten it to one line rather than leaking syntax.
- **`presenters`** `json` — Who is presenting it: `{ email, name }`. An inform has presenters where a decision has a RAPID roster; there is no approver role because nobody signs.
- **`due`** `string · nullable` — The date it is wanted by, when the Type declares one.
- **`reads`** `json` — `{ readers, audience }`. `audience` is null when the access mode gives no bounded roster — render a bare count, not a fraction against the whole company.
- **`roster`** `json` — Who has and has not opened it: `{ email, name, readAt, markedPresent }`. EDITOR-ONLY — empty for a viewer without edit access, and empty when the audience is unbounded. `markedPresent` distinguishes "an editor asserted they have this" from "they opened it".
- **`viewer`** `json` — `{ canManage }` — whether the caller can circulate it, mark it presented, or record attendance.
- **`circulatedAt`** `string · nullable · less-common` — When it went out.

### JSON example

```json
{
  "configured": true,
  "phase": "active",
  "status": "in-flight",
  "summary": "Twilio is raising prices ~20% at renewal. Negotiation is open; no decision needed yet.",
  "presenters": [{ "email": "jay@himarley.com", "name": "Jay Patel" }],
  "due": "2026-09-03",
  "reads": { "readers": 4, "audience": 9 },
  "roster": [
    { "email": "neil.murphy@himarley.com", "name": "Neil Murphy", "readAt": "2026-08-28T09:12:00.000Z", "markedPresent": false },
    { "email": "mike.green@himarley.com", "name": "Mike Green", "readAt": null, "markedPresent": true },
    { "email": "kate@himarley.com", "name": "Kate Horning", "readAt": null, "markedPresent": false }
  ],
  "viewer": { "canManage": true },
  "circulatedAt": "2026-08-27T15:00:00.000Z"
}
```

## Methods

### Get inform state

`GET /api/apps/{slug}/inform`

Read a Droplet's inform state — summary, presenters, date, and who has opened it. Read receipts are passive (drawn from view records); there is no acknowledgement step for anyone to complete. The audience is the Droplet's share list: the AppAccess grants (groups expanded) for SPECIFIC, those plus the Space roster for SPACE, and none for EVERYONE or PRIVATE — where the readers are still named but no denominator is.

**CLI**

```bash
drop inform get ops-inform-infra
```

**MCP**

```json
{
  "tool": "drop_inform_get",
  "arguments": {
    "slug": "ops-inform-infra"
  }
}
```

**HTTP**

```bash
curl -X GET 'https://drop.himarley.ai/api/apps/ops-inform-infra/inform' \
  -H "Authorization: Bearer $DROP_TOKEN"
```

**Response** (200)

```json
{
  "configured": false,
  "phase": "draft",
  "status": "example",
  "summary": "example",
  "presenters": [],
  "due": "example",
  "reads": {
    "readers": 0,
    "audience": 0
  },
  "roster": [],
  "audienceKind": "private",
  "currentVersion": 0,
  "viewer": {
    "canManage": false
  },
  "circulatedAt": "example"
}
```

### Move an inform through its lifecycle

`POST /api/apps/{slug}/inform`

Circulate an inform (`active`) or mark it presented (`closed`). Editor-gated (canManageApp) — there is no separate roster, so the people who can edit the Droplet are the people who can move it. Writes the Type's own declared status value, so it can never land outside the enum.

**CLI**

```bash
drop inform set-phase ops-inform-infra --phase active
```

**MCP**

```json
{
  "tool": "drop_inform_set_phase",
  "arguments": {
    "slug": "ops-inform-infra",
    "phase": "active"
  }
}
```

**HTTP**

```bash
curl -X POST 'https://drop.himarley.ai/api/apps/ops-inform-infra/inform' \
  -H "Authorization: Bearer $DROP_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"phase":"active"}'
```

**Response** (200)

```json
{
  "configured": false,
  "phase": "draft",
  "status": "example",
  "summary": "example",
  "presenters": [],
  "due": "example",
  "reads": {
    "readers": 0,
    "audience": 0
  },
  "roster": [],
  "audienceKind": "private",
  "currentVersion": 0,
  "viewer": {
    "canManage": false
  },
  "circulatedAt": "example"
}
```

### Mark someone present on an inform

`POST /api/apps/{slug}/inform/attendance`

Record that a person has the information even though they never opened the Droplet — the room an inform was presented to, laptops down. Editor-gated. Counts toward the read total alongside passive opens, and the roster keeps the two distinguishable. Stored on the Droplet, NOT as a view record, so Droplet view counts and admin metrics stay untouched. When the Droplet has a bounded audience only people in it can be marked (`NOT_IN_AUDIENCE`); when it does not — a public inform, or one shared with nobody yet — anyone with a Hi Marley account can be (`NOT_IN_DIRECTORY`).

**CLI**

```bash
drop inform mark-present ops-inform-infra --email neil.murphy@himarley.com --present
```

**MCP**

```json
{
  "tool": "drop_inform_set_attendance",
  "arguments": {
    "slug": "ops-inform-infra",
    "email": "neil.murphy@himarley.com",
    "present": true
  }
}
```

**HTTP**

```bash
curl -X POST 'https://drop.himarley.ai/api/apps/ops-inform-infra/inform/attendance' \
  -H "Authorization: Bearer $DROP_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"email":"neil.murphy@himarley.com","present":true}'
```

**Response** (200)

```json
{
  "configured": false,
  "phase": "draft",
  "status": "example",
  "summary": "example",
  "presenters": [],
  "due": "example",
  "reads": {
    "readers": 0,
    "audience": 0
  },
  "roster": [],
  "audienceKind": "private",
  "currentVersion": 0,
  "viewer": {
    "canManage": false
  },
  "circulatedAt": "example"
}
```
