Core Resources
View as Markdown

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 concept). It is the counterpart to a decision, 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 with kind: 'inform' — or drop informs list / drop informs mine, which pre-set it.

The Inform object

Every Inform carries these attributes.

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
draftactiveclosed
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.
More attributes+ Show 1
circulatedAt
string· nullable
When it went out.
THE INFORM OBJECT
{
  "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

Endpoints to operate on a Inform. The example switches between curl, drop CLI, and MCP via the dropdown — your choice persists across the page.

GET

Get inform state

/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.

GET/api/apps/{slug}/inform
drop inform get ops-inform-infra
Response200
{
  "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"
}
POST

Move an inform through its lifecycle

/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.

POST/api/apps/{slug}/inform
drop inform set-phase ops-inform-infra --phase active
Response200
{
  "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"
}
POST

Mark someone present on an inform

/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).

POST/api/apps/{slug}/inform/attendance
drop inform mark-present ops-inform-infra --email neil.murphy@himarley.com --present
Response200
{
  "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"
}