Every email gets one label.

One model call sorts each email into one of 12 labels. Job-related email continues into the Job Apps pipeline.

12 labels · 1 per email7 job-app sublabels1 LLM call per email0 replies sent by machine

01The sorter

Triager label fan-outThe Triager sorts each inbound email into exactly one of 12 labels, with ribbon width proportional to each label's share of email and a flagged overlay added only when action is required.TriagerONE CALL PER EMAILGMAIL · PUB/SUB · SONNETGmail labelsNotifications22%News → briefs18%Marketing16%Job Apps → pipeline11%Finance8%Purchases7%People6%Security4%Networking3%Medical2%Home2%Returns1%⚠ FLAGGED · ADDITIVE OVERLAYONLY WHEN ACTION IS REQUIRED

02Job Apps pipeline

langgraph · opus · fired by dispatch

Dispatch → Notion

5 stages
DispatchBEARER POST FROM TRIAGER
ClassifyONE OF 7 SUBLABELS
SublabelAPPLIED IN GMAIL
MatchCASCADE → NOTION ROW
Status ↑NEVER BACKWARD
OfferInterview SchedulingAssessmentRecruiter OutreachStatus UpdateApplication ConfirmationRejection

The match cascade

never guesses
Posting URLEXACT MATCH
no match ↓
Company + roleVERIFIED AGAINST THE ROW
still ambiguous ↓
⚠ Human reviewNEVER WRITES TO A GUESSED ROW

03The one-way line

status is monotonic · terminal stations are read-only
Job application status lineApplication status moves one way from Saved through Applied, Screen, and Interview to Offer, with Rejected, Withdrawn, and Archived on a read-only terminal siding.SavedAppliedScreenInterviewOfferONE WAY: AN EMAIL NEVER MOVES A ROW LEFTREJECTEDWITHDRAWNARCHIVEDTERMINAL · READ-ONLY

Nothing here sends email.

The pipeline labels and matches. Every reply is written by hand.

briefs →