---
name: imessage
description: On-demand, read-only read of the owner's local iMessage/SMS (the macOS Messages history). Use when the owner asks "what did X text me", "any texts I haven't replied to", "catch me up on my thread with …", "read my messages since yesterday", or "did anyone text me about …". The owner asks in plain language — never make them run a command. The agent runs the reader as plumbing and answers with a synthesized read (grouped by person, newest first, flagging what needs a reply), then offers to open any thread in full. Read-only: it never sends, replies, or writes to the vault. Runs on the local machine where Messages is signed in, not an automation host, and needs macOS Full Disk Access. NOT for email/chat triage (that's attention-digest), NOT for sending texts, NOT the daily digest. Requires the imessage module.
served: false
---

# iMessage — read my texts (on-demand, read-only)

The **inbound, texts** counterpart to the digest. The owner asks in plain language;
this skill reads their local Messages history and hands back a **useful synthesis** —
never a raw command for the owner to run, and never a wall of raw transcript unless
they ask for one. The full procedure is canonical in **[[iMessage]]**
(`Agent/docs/iMessage.md`); this is the trigger.

## When this skill fires
The owner says, in chat, some form of *"what did X text me / any texts I owe a reply /
catch me up on my thread with Y / read my messages since yesterday / did anyone text me
about Z."* On-demand and owner-only — never scheduled, never sent anywhere.

## What to do
1. **Read [[iMessage]]** (`Agent/docs/iMessage.md`) — it wins over anything remembered here.
2. **Scope the ask, then run the reader as plumbing** — `"${ALEXANDRIA_PYTHON:-python3}" -m alexandria_vault.engine.imessage_read --vault .`
   (prefer `--json`). Default to the last 24h across all conversations; narrow with
   `--from <person>`, `--thread <id>`, or `--since 7d|today|<date>` when the owner names one.
   The owner never sees or types this command.
3. **Sanity-check the coverage line before synthesizing.** Every run prints one stderr
   line — `window <start> → N msgs / T threads · oldest <time>`; the `oldest` stamp must
   reach back to the window start. A `TRUNCATED` warning means a cap dropped older
   messages — re-run with `--limit 0` before answering.
4. **Answer with a synthesis, not a transcript.** Group by person, newest first, and
   **lead with anything that needs the owner** — a direct question to them, an unanswered
   inbound, a request or deadline — then one tight line per conversation (*who · gist · are
   they waiting on you*), linking people to their `People/` home. Offer to open any thread in
   full; show a raw transcript only when asked.

## Rules (detailed in [[iMessage]])
- **Prerequisite: Full Disk Access.** macOS blocks `chat.db` until the app running the
  assistant (Claude, or its terminal) has Full Disk Access. Symptom: `authorization denied`.
  It's a one-time System Settings grant, not a credential.
- **Runs locally**, on the machine signed into Messages — never on an automation host.
- **Read-only, full stop.** It never sends, replies, or writes (to Messages or the vault).
  Sending is a separate, unbuilt capability — don't improvise one.
- **Trust blue, not green.** SMS is labeled `[SMS]`; treat green-bubble senders as forgeable.
- **Contacts are PII, off-repo** (`contacts.json`, gitignored). Without it, raw handles show.
