When a text leaves your inbox
An incoming text puts its conversation in your Inbox and marks it unread. Opening that conversation now clears it from the Inbox at the same moment — reading a text is the same act as dealing with it. The app only ever removes a thread you actually opened: the automatic selections it makes for you leave the Inbox untouched.
What it is
A new text does two things at once: it puts that conversation in your Inbox, and it gives it an unread dot in the SMS list. Opening the conversation now clears both — the thread leaves the Inbox and the dot goes away, in the same moment you open it.
Put simply: reading a text is dealing with it. You no longer have to open a thread and then separately dismiss it to get it out of the Inbox.
Where to find it
Nowhere to switch on — this is simply what opening an SMS conversation does. It applies
everywhere you can open one: the SMS panel, the Inbox, a notification or search result, the
phone/web view, and the CLI's /sms/.../read route.
How it behaves
What removes a thread from the Inbox
- Opening it — in the SMS panel, from the Inbox, from a notification, or from search.
- Replying to it inside Omniscio (unchanged).
- Archiving it (unchanged).
- Replying from your phone — picked up on the next sync (unchanged).
- "Mark as read" — from the Inbox row's menu, the batch Mark-as-read, or the button in a conversation (unchanged).
What does NOT remove a thread
The app moves the cursor on its own, and none of those moves clear anything — otherwise a text you never looked at could quietly vanish from your Inbox:
- the cursor moving to the next row after you dismiss, archive or snooze something, and after a bulk version of the same;
- the automatic eject — when a session changes status in the background and the app moves you off its row onto the next one;
- the idle auto-select that opens the first Inbox row when you're sitting on an empty pane;
- a brand-new text auto-opening into an empty Inbox;
- the background refresh when your phone syncs.
The line the app draws is who moved: your own click, key, swipe or notification tap opens a thread and clears it; anything the app did by itself leaves it alone. That distinction is checked by a test that scans every place the app can move the Inbox cursor, so a new one can't quietly start clearing things.
A text that arrives while you have the conversation open
It still lands in the Inbox and still counts as unread-worthy. Opening the conversation again (or Mark-as-read) clears it. Omniscio deliberately does not treat "a thread happens to be open" as "you read this" — the conversation stays selected while you're off in another project, so trusting that would swallow a text you never saw.
The trade, stated plainly
A text you read but never replied to leaves your Inbox — and it also leaves the daily digest, which keys on the same "needs your attention" flag. Nothing is lost: the whole conversation is always in the SMS list, and the next text from that number puts it straight back in the Inbox.
For agents
Where it lives in code
- src/main/db/queries-sms/conversations.ts
—
markConversationHandled(...), the ONE "dispose from the inbox" write (clearsneeds_attentionandunread_counttogether). - src/main/ipc/sms-handlers.ts — the
sms:mark-readhandler (fired when a thread is opened) and itssms:conversation-updatedpush. - src/main/services/cli/cli-server-sms-routes.ts
—
POST /sms/conversations/:phoneNumber/read, the CLI twin. - src/renderer/src/stores/sms-store.ts
—
selectConversation(phone, { markHandled })(defaulttrue= a user open = dispose), the idempotentmarkAsRead, and the three app-driven call sites that passmarkHandled: false. - src/renderer/src/lib/inbox-open-source.ts
—
isUserInboxOpen(source): the ONE classification of "a person opened this row" vs "the app moved the cursor onto it", with a scan test over everyactivateUnifiedItemcall site. - src/renderer/src/stores/inbox-source-behaviors.ts
· src/renderer/src/stores/inbox-advance-side-effects.ts
— the SMS behavior's
openDetail(which consults that classifier) and the idle auto-select / post-dismiss advance loaders.
The full engineering contract (the invariant, every writer of the flag, and the safe-change checklist) is .claude/memory/contracts/sms-inbox-attention-contract.md.
Related
- inbox-overview.md — the unified triage view these rows appear in.
- set-up-sms-integration.md — how the SMS integration works.
- sms-inbox-preload.md — why the tap on a phone is instant.
- cli-sms.md — the same behaviour from an agent.
Last verified 2026-09-29