Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/modules/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ credentials and different capabilities.

| Surface | What it does | Guide |
|---|---|---|
| **Typed events** | The engine records eight kinds of domain event (a new conversation, inbound mail, a status change, a resolved draft, …) reliably, in the same transaction as the change they describe. | [webhooks.md](./webhooks.md) |
| **Typed events** | The engine records eight kinds of domain event (a new conversation, inbound mail, a status change, a resolved draft, …) reliably β€” each written in the same database transaction as the state change it describes, so a rolled-back change never emits and a committed one never silently drops its event. (The synthetic `test.ping` is the one exception: it exercises the delivery path directly and never touches the outbox.) | [webhooks.md](./webhooks.md) |
| **Webhook delivery** | Registered HTTPS endpoints receive signed, at-least-once notifications of those events. | [webhooks.md](./webhooks.md) |
| **Assistant actors** | AI principals that authenticate with a bearer token, read conversations through the same read API Agents use, and post draft replies that a human Agent must approve before anything is sent. | [assistants-and-drafts.md](./assistants-and-drafts.md) |

Expand Down
7 changes: 5 additions & 2 deletions docs/modules/webhooks.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,11 @@ delivered as a non-test event:
**Events are thin by design.** `data` carries only identifiers and small
typed facts β€” never a message body, subject line, or address. Fetch full
content through the read API (`GET /api/v1/conversations/{id}`) with your
own credentials once an event tells you something changed. This keeps every
webhook payload free of customer content and PII by construction.
own credentials once an event tells you something changed. Message content
therefore never transits a webhook β€” but treat payloads as sensitive
anyway: some fields are operator-authored free text (`conversation.tags_changed`
carries the tag strings themselves), and identifiers still reveal that a
given conversation exists and is active.
Comment on lines +125 to +129

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟑 Minor | ⚑ Quick win

Avoid implying every identified conversation is active.

A webhook can reference conversations in closed, pending, or spam states, so the identifier alone establishes existence, not that the conversation is active.

Proposed wording
- and identifiers still reveal that a
- given conversation exists and is active.
+ and identifiers still reveal that a given conversation exists; some event
+ types may also expose its current status.
πŸ“ Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
own credentials once an event tells you something changed. Message content
therefore never transits a webhook β€” but treat payloads as sensitive
anyway: some fields are operator-authored free text (`conversation.tags_changed`
carries the tag strings themselves), and identifiers still reveal that a
given conversation exists and is active.
own credentials once an event tells you something changed. Message content
therefore never transits a webhook β€” but treat payloads as sensitive
anyway: some fields are operator-authored free text (`conversation.tags_changed`
carries the tag strings themselves), and identifiers still reveal that a given conversation exists; some event
types may also expose its current status.
πŸ€– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/modules/webhooks.md` around lines 125 - 129, Update the webhook
sensitivity guidance in the surrounding documentation to state that identifiers
reveal a conversation exists, without implying it is active. Preserve the
warning about sensitive payloads and operator-authored free text, and account
for conversations in closed, pending, or spam states.


**Soft-deleted conversations fire nothing.** Deletion is invisible on every
other endpoint (a `404`, indistinguishable from never having existed) and
Expand Down
Loading