The Filtered section (what Omniscio kept out of your inbox)
**Filtered** is the one place to see everything Omniscio kept out of your inbox instead of deleting it: messages the spam filter caught, and conversations an automation rule archived. It sits collapsed in the sidebar of the text or Gmail conversation it belongs to, shows who sent each one and why, and puts any of them back with one click.
What it is
Two different parts of Omniscio can quietly take a message out of your inbox. The spam filter catches messages from strangers that look like junk, and a filtering automation — one of your own rules — can archive a conversation that matches it. Both are designed not to delete anything; a mistake should always be recoverable.
The Filtered section is where that promise becomes visible. It is a single audit list, newest first, of everything either part has taken out — with the sender, the first line of what they said, which of the two took it, how sure it was, and a button that puts it back.
It is deliberately not a place you are pushed toward. The section is collapsed by default and drawn dimmed, and a caught message is one you are already protected from, so it waits quietly until you go looking rather than competing with the rows that want your attention. It also appears only where it could have something to show — inside the sidebar of the text or Gmail conversation whose channel has a filter actually running.
Where to find it
Open a text or Gmail conversation in the sidebar. Underneath the session list, above the docs section, a divider is followed by a row reading Filtered (N) with a shield icon and a chevron. Click it to expand the list; click again to collapse it. The row itself only appears when that conversation's channel has something filtering it and at least one item has been filtered — an empty section is not shown at all.
The section is also what the Spam tab in Settings → Inbox lists from, though that view asks for caught messages only — see Related.
How it behaves
What a row shows
Each item is up to five lines, no more, kept that tight so a long list stays scannable:
- A small channel icon (a text bubble, an envelope, a calendar, an @ sign) and who it came from.
- What they said, truncated to one line — click the row to expand it, and the whole message is readable right there without leaving the list. A row with no message text is just a row: it is not clickable and opens nothing.
- A coloured method badge — how it was taken out of your inbox — plus, when there was one, the rule type, and the filter's own confidence as a percentage:
- AI — the automated spam check judged it junk.
- Rule — one of your automation rules matched it.
- Manual — you marked that sender as spam yourself.
- The name of the rule that caught it, when there was one, and how long ago it happened.
- For a spam catch only, a short plain-words reason — the kind of junk it was judged to be (a scam, a sales pitch, bulk mail), or simply that it matched a spam rule.
Putting something back
The Restore button on the right of a row puts that one item back where it would have gone. What "back" means depends on who filtered it and on which channel it came through:
- An item an automation took out is undone on its channel: a text is un-archived and made visible in the inbox again and flagged as needing your attention, and any spam mark the automation also set is cleared.
- A catch is released the way its own channel expects: a text's block is lifted, and a Gmail message has the spam label removed. A caught email to your agent is the exception — releasing one is a person-only action, which is why the Restore here works but an agent on the command line cannot release one.
Items are restored one at a time, and each restore is attempted independently, so one that cannot be found — because it was already restored somewhere else — does not stop the rest.
Loading, and how many it shows
The list arrives in pages of 50, newest first, and can be grown up to 1,000 items. A failed load is shown as a retry state rather than as an empty list, because "nothing was filtered" and "we could not ask" are very different things. When the list changes anywhere in the app, this section refreshes on its own.
What it takes to appear
Two things must both be true for a channel, and that is what the section's visibility keys on:
- A filter is actually running there — either spam rules are active, or at least one filtering automation is, or both.
- At least one item is waiting.
Filtering automations work on texts and Gmail only. A calendar or agent-email item can never come from a rule, so a rule is never the reason those channels show the section.
For agents
Under the hood (for agents with repo access)
- One service, two adapters.
src/main/services/filtered-items-service.tsmerges aspamadapter and anautomationadapter, sorts the union byfilteredAtdescending, and slices one window;list()catches a failure and returns[]after logging, so a broken source degrades to an empty list rather than an error. The row shape isFilteredIteminsrc/shared/types/filtered-items.ts, withFILTERED_ITEMS_PAGE_SIZE = 50,FILTERED_ITEMS_MAX_LIMIT = 1000,source: 'spam' | 'automation', andFILTERED_ITEM_CHANNELS = ['sms', 'gmail', 'calendar', 'agent-email']. The automation adapter returns[]forcalendarandagent-emailon purpose — the accessorsgetFilteringRuns/hasActiveFilteringAutomationsare typed'sms' | 'gmail'. - Visibility gate.
activeChannels()returns{ sms, gmail }fromhasActiveSpamRules(ch) || hasActiveFilteringAutomations(ch)— the same predicate the sidebar section keys on insrc/renderer/src/features/dashboard/SessionsSidebar.tsx(isSms && activeFilterChannels.sms, plusfilteredItems.length > 0). - Renderer.
src/renderer/src/stores/filtered-items-store.tsholds the list, the per-projectexpandedByProjectmap,activeChannels, and a module-level latest-winsseqso a channel switch and a push-driven reload cannot land out of order;src/renderer/src/features/dashboard/FilteredItemRow.tsxrenders the five lines and takesrestoreLabel('Restore'in the sidebar;'Not spam'in the Spam view) and an optionalonDismiss. The separatespam-view-store.tsasks forsource: 'spam'only and powersSpamListon the Settings → Inbox → Spam tab. - Command line:
GET /filtered-items[?channel=sms|gmail|calendar|agent-email](read-budgeted, registered byregisterFilteredItemsRoutes()at startup) returns exactly the rowsfilteredItemsService.list()builds for the in-app list. Restore/dismiss are the spam surface's routes:POST /inbox/filtered/:source/:id/restoreandPOST /inbox/filtered/:source/:id/dismiss. The read route exists as the parity counterpart of theFILTERED_ITEMS_CHANGEDpush. - Contract:
.claude/memory/contracts/spam-filter-contract.mdandsession-event-log-style push parity aside, the list's own invariants are thefiltered-itemsIPC surface (src/shared/ipc-schemas/filtered-items.ts,src/shared/ipc-response-map/filtered-items.ts).
Related
- spam-filter.md — the AI check that fills most of this list, and the Spam tab that lists the caught half with Not spam and Delete.
- inbox-rules.md — the rules that decide what reaches your attention, including the filtering automations whose work appears here.
- inbox-overview.md — the Inbox itself, and how its sections fit together.
Last verified 2026-10-06