Skip to main content

Emails

schema.org/Message — email messages the agent tracks as knowledge entities.

Emails have a subject, body, and manageable volume — they get markdown notes + Postgres. The markdown body preserves the full email content for context and annotation, while Postgres enables search and threading queries.

Chat messages (Slack, Discord, etc.) are not entities — they're high-volume activity data stored in integration-specific tables in the Activity Logs.

Email Example

---
type: schema.org/Message
id: f6a7b8c9-0123-45ab-cdef-678901234ef0
permalink: messages/2026-03-05-aurora-migration-timeline
title: "Re: Aurora Migration Timeline"
sender: sarah.chen@acme.com
recipient:
- cedric@spantree.net
- ops-team@acme.com
date_sent: "2026-03-05T14:22:00Z"
subject: "Re: Aurora Migration Timeline"
source: gmail
in_reply_to: msg-abc123
tags:
- aurora
- migration
---

Sarah confirmed the March 15 cutover date works for the
ops team. She flagged two concerns about the rollback
window being too tight during peak hours.

## Observations

- [decision] Cutover date confirmed: March 15 #migration
- [issue] Rollback window may be too tight during peak hours
- [action] Propose extended maintenance window to Sarah

## Relations

- related_to [[projects/aurora]]
- related_to [[people/sarah-chen]]

Fields

FieldTypeDescription
senderstringSender identifier (required)
recipientstring[]Recipient identifiers
date_sentdatetimeWhen sent (required)
subjectstringMessage subject
message_idstringSource-specific message ID
sourcestringOrigin system (gmail, slack, etc.)
in_reply_tostringParent message ID (threading)
Zod schema
export const MessageSchema = z.object({
type: z.literal("schema.org/Message"),
sender: z.string(),
recipient: z.array(z.string()).default([]),
date_sent: z.string().datetime(),
subject: z.string().optional(),
message_id: z.string().optional(),
source: z.string().optional(),
in_reply_to: z.string().optional(),
});