Skip to content

feat(email): Triage Dashboard — daily-driver surface (umbrella) #1007

@itomek

Description

@itomek

Why this matters

Today the Email Triage Agent's user-facing surface in the Agent UI is a chat. A user types "Run a pre-scan", the agent calls the tool, returns a typed envelope, and the chat surface renders an inline triage card. That card carries the right information and the right action affordances — but the frame is wrong for the actual user we're targeting.

The target user receives 100–500 emails per day at a director / VP / senior-IC level. Their question every morning is "what needs me right now?" — not "let me have a conversation with my email." A chat-with-agent surface forces them to drive the agent verbally for every action; that's barely better than driving Gmail directly. The right frame is a task-tracker dashboard that the agent populates with surfaced items, drafted replies, learned preferences, and overnight summaries — items the user reviews and approves, not items they have to ask for.

This umbrella tracks the build of that dashboard surface, sized so a v0 is dogfoodable in a few sprints and the full vision lands as memory + multi-model + event-trigger work matures.

Scope change based on feedback

This issue captures a deliberate scope shift for the Email Triage Agent's user-facing surface. PR #995 shipped the engine (typed pre-scan envelope, inline action buttons, deterministic structured-render hook) inside the existing chat surface. Live-driving the chat surface against a real inbox surfaced the limitation: it's a power-user tool, not a daily-driver. The dashboard surface is the new direction; the chat surface is preserved as a verbal-drive entry point for power users. Engine code is reusable as-is.

POC flow this dashboard fulfills

A 5-step product flow informs the build order:

  1. Context sources — inbox + calendar; messages later.
  2. Event triggers — meeting ends, new email arrives, scheduled cadence.
  3. Agent reasoning on local hardware — local LLM via Lemonade; eventually NPU-accelerated.
  4. Outputs in task tracker — items have explicit state (in progress / drafted / summarized) and live somewhere persistent the user can browse without re-running the agent.
  5. Human approval / execution — approve drafted reply, accept invite, copy summary.

What's shipped today only partially covers steps 3 and 5. The dashboard delivers step 4 and the surface around step 5; steps 1 and 2 land progressively.

Build order — fastest dashboard visibility first

Sub-issues are intentionally ordered so a visible dashboard surface lands as early as possible, even if its data is sparse, so we can dogfood the frame and let real-use friction drive the rest. Per direction received in the scope change, event triggers and local NPU acceleration are sequenced last — both are high-leverage but neither blocks the dashboard from being usable.

# Issue What lands Visible?
1 #1008 Dashboard route + 3-column skeleton ✅ Yes — empty surface, but visible immediately
2 #1009 Wire pre_scan_inbox + Refresh button ✅ Real triage data populates the Surfaced column
3 #1010 In-session task store + state machine ✅ Items move through columns as user acts
4 #1011 Drafted column with Send/Edit/Discard ✅ "Agent does work, human approves" loop
5 #1012 Calendar items column with RSVP ✅ Calendar decisions in same surface
6 #1013 "Learned this session" preferences strip ✅ Trust-arc visibility loop
7 #1014 Migrate task store to persistent memory Dashboard upgrades to "real" daily-driver
8 #1015 Streaming progress UI for long jobs Dominant friction reduction
9 #1016 Background watcher / event triggers (deferred) Always-on assistant
10 #1017 Local NPU acceleration for classifier (deferred) Sub-second inference

Sub-issues 1–6 together produce a dogfoodable dashboard. Sub-issue 7 makes it honest as a daily driver. Sub-issues 8–10 take it from "manually-triggered snapshot" to "always-on assistant" without changing the user-facing surface.

Dependencies

  • Memory subsystem — required for #1014 and everything after; the in-session store works as a stand-in until then but a daily-driver dashboard needs persistence to claim "Drafted overnight" honestly.
  • Multi-model parallelism (#1000) — required to bring tier-1 classification down to sub-second so a background poll cadence is viable. The dashboard works without it; it just won't refresh autonomously at low cost.
  • Connectors framework / Google OAuth (already merged: #915, #926).

Acceptance for the umbrella

  • Dashboard surface is selectable when the Email Triage agent is active (route or tab inside the Agent UI).
  • A user can land on the dashboard, click Refresh, and see categorized email items with action buttons within one minute of opening it.
  • Drafted replies, calendar items, and learned preferences each have their own surface; none require chat-driving.
  • All approval flows (send draft / archive / RSVP / etc.) reuse existing TOOLS_REQUIRING_CONFIRMATION gating.
  • All email body content remains processed locally — no cloud calls for body inference, consistent with the parent agent's local-only architecture.
  • Dashboard surface is the default landing surface for the Email Triage agent once items 1–6 land; chat surface remains accessible.

Refs

  • Parent agent umbrella: #645
  • Engine PR: #995
  • Dependency: #1000 (multi-model parallelism)
  • Provider track: #963 (Outlook/Exchange)

Metadata

Metadata

Assignees

No one assigned

    Labels

    agentdomain:automationScheduler, autonomy, RAG, web search, watchers, researchenhancementNew feature or requestp0high prioritytrack:consumer-appHermes-competitor consumer product — mobile-first, voice + messaging + memory + skills

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions