## §OIP SYSTEM ARTICLE — Phone / iMessage (10 operations)
A generated article for one OIP shelf. It lists every operation in this API/CLI/MCP/device/model/core subsystem, links each leaf article, and gives the ledger path for proof.

### Read Order
- scan operations
- open a leaf doc
- run via run_now or POST /api/dispatch
- open receipt
- repair/replay if needed

### Operations
- **PHONE_NOTIFY** — send a push to Cyrus's phone via iMessage.
  when: an agent finished a task, hit a milestone, or needs eyes on something.
  args: title|body. Multi-line body OK.
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_NOTIFY&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_NOTIFY&body=%3Ctitle%3E%7C%3Cbody%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_NOTIFY
- **PHONE_APPROVAL_CREATE** — insert a row into `approvals` (status=pending) and notify Cyrus's phone.
  when: about to do something destructive (deploy, send outreach, delete, pay) — pause first.
  args: action|summary|resume_key|resume_body. resume_key + body are dispatched on approve.
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_APPROVAL_CREATE&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_APPROVAL_CREATE&body=%3Caction%3E%7C%3Csummary%3E%7C%3Cresume_key%3E%7C%3Cresume_body%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_APPROVAL_CREATE
- **PHONE_APPROVAL_RESOLVE** — update approvals.status to approved/denied and, on approve, dispatch the stored resume_key.
  when: phone tap, /admin/approvals click, or natural-language "approve 12".
  args: approval_id|decision (approve|deny).
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_APPROVAL_RESOLVE&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_APPROVAL_RESOLVE&body=%3Capproval_id%3E%7C%3Cdecision%20(approve%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_APPROVAL_RESOLVE
- **PHONE_VOICE_NOTE_HANDLE** — transcribe a phone voice memo and route the transcript through ROUTER like an iMessage.
  when: /api/phone/in receives action=voice_note from an iOS Shortcut.
  args: voice_url.
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_VOICE_NOTE_HANDLE&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_VOICE_NOTE_HANDLE&body=%3Cvoice_url%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_VOICE_NOTE_HANDLE
- **PHONE_SHARE_URL_HANDLE** — phone shared a URL via the Share Sheet — fetch its markdown and route to ROUTER as a normal turn.
  when: /api/phone/in receives action=share_url.
  args: text|url.
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_SHARE_URL_HANDLE&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_SHARE_URL_HANDLE&body=%3Ctext%3E%7C%3Curl%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_SHARE_URL_HANDLE
- **PHONE_SHARE_TEXT_HANDLE** — phone shared selected text — route straight to ROUTER as if Cyrus had typed it.
  when: /api/phone/in action=share_text.
  args: text.
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_SHARE_TEXT_HANDLE&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_SHARE_TEXT_HANDLE&body=%3Ctext%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_SHARE_TEXT_HANDLE
- **PHONE_SHARE_IMAGE_HANDLE** — phone shared an image — store as reference + route image URL through ROUTER (ARCADS picks it up).
  when: /api/phone/in action=share_image or action=photo.
  args: image_url|caption.
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_SHARE_IMAGE_HANDLE&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_SHARE_IMAGE_HANDLE&body=%3Cimage_url%3E%7C%3Ccaption%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_SHARE_IMAGE_HANDLE
- **PHONE_CLIPBOARD_HANDLE** — phone clipboard contents → ROUTER. Same shape as share_text but explicitly tagged.
  when: /api/phone/in action=clipboard.
  args: clipboard_text.
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_CLIPBOARD_HANDLE&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_CLIPBOARD_HANDLE&body=%3Cclipboard_text%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_CLIPBOARD_HANDLE
- **PHONE_LOCATION_HANDLE** — phone location event → ROUTER. ARGS: location_label (e.g. "arrived: home").
  when: /api/phone/in action=location, NFC tap, geofence trigger.
  args: location_label.
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_LOCATION_HANDLE&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_LOCATION_HANDLE&body=%3Clocation_label%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_LOCATION_HANDLE
- **PHONE_EVENTS_TAIL** — tail the phone_events table. ARGS: limit (default 20).
  when: "what did my phone send today".
  doc: https://miscsubjects.com/api/dispatch?key=PHONE_EVENTS_TAIL&format=markdown
  run: https://miscsubjects.com/api/dispatch?invoke=PHONE_EVENTS_TAIL&body=%3Carg1%3E&share=<TOKEN>
  history: https://miscsubjects.com/api/invocations?object_id=PHONE_EVENTS_TAIL

### Troubleshooting
- If a row's example has placeholders, replace only the placeholder values and preserve separators.
- If a call fails, open its receipt and repair it with POST /api/dispatch {key, body, repairs:'inv_ID'}.
- If token scope denies this system, ask the owner for a row:/rows:/pfx: token scoped to the exact operation set.

Back to the tree: https://miscsubjects.com/api/dispatch?map=1&format=markdown