Skip to content

feat: read older job emails to fill in past applications, and never take a job alert for one - #77

Merged
coderback merged 4 commits into
feat/status-historyfrom
feat/gmail-backfill
Nov 3, 2026
Merged

coderback merged 4 commits into
feat/status-historyfrom
feat/gmail-backfill

Conversation

@coderback

Copy link
Copy Markdown
Owner

Why

Windrush has only read job emails since Gmail was connected, so earlier applications are missing. Application-style subjects also catch job alerts: "Junior Application Software Engineer at X: up to £45K/year" matches only because of its title. With past applications added automatically, an alert must never become one.

What changed

  • Backfill: the Inbox can read 6 months, 1 year or 2 years back. It shows the count first, runs in the background with progress and a Stop button, and carries on where it stopped. Gmail quota errors make it wait; if the model can't be reached it stops and leaves that email unread.
  • Adding applications: one is added automatically only when an email shows it was made, marked as from email, with its path rebuilt from its emails. Being received or turned down is enough. An interview, test or offer also needs an applicant tracking system, the employer's own address, or a company another email already showed.
  • Older emails on tracked applications: they fill in history without moving the application back, and ask nothing of the user. Anything too unclear to add goes under Other.
  • Job alerts: recognised by sender and subject and never sent to the model, in the regular sync too. Real confirmations from the same senders ("your application was sent to X") still count, because what the subject says is checked first. The model's prompt also says only applications actually made count.
  • Names: a job board is no longer taken for the employer. A board's confirmation naming only the role goes under "Employer not named (via Indeed)", and an email naming no role adds "Role not stated" unless another of its emails names it.

The backfill search leaves out tracked company names, which mostly matched mail that isn't about jobs: 311 emails for 6 months, against 1,231 with them.

Results

A read-only trial on real mail ran the alert filter over the 156 unread emails from the last 6 months and the reader on a random 60 of the rest. No alert would be added: the filter caught 6, and the model rejected 14 more unrelated emails. The trial found the name problems fixed above, and the re-run showed them fixed.

The real-model eval, now 20 emails including new alert cases, scored 20/20 and then 19/20 after the final prompt change. The miss read a "your application was sent to" sample as unrelated; the real ones in the trial were read correctly.

Testing

  • Backend: 1169 passed, 8 skipped, 46 browser tests deselected, run with the whole stack applied. An earlier run on the same code had 57 errors that didn't come back on re-run; they weren't captured, so the cause is unknown.
  • Frontend: type check, lint, build and all 20 browser tests pass.
  • Not run: the real backfill, which saves applications. It's started from the Inbox.

Merge order

Second of three. Based on feat/status-history.

…ake a job alert for one

The Inbox can read 6 months, 1 year or 2 years back. It shows the count first, runs in the background with progress and
a stop button, and carries on where it stopped. An application is added only when an email shows it was made, marked
as from email, with its path rebuilt from its emails: being received or turned down is enough, while an interview, test
or offer also needs an applicant tracking system or a company already shown. Old emails fill in an application's history
without moving it back, and ask nothing of the user.

Job alerts and recommendations are now recognised by sender and subject, in the regular sync too, and never reach the
model: "Junior Application Software Engineer at X: up to £45K/year" matched only on its title. Real confirmations from the
same senders ("your application was sent to X") still count.
…wn interview invitation counts

The model took Indeed for the employer, or filled blanks with "Unknown". A job board's confirmation naming only the role
now goes under "Employer not named (via Indeed)", and an email naming no role adds the application as "Role not stated"
unless another of its emails names it. An interview from the employer's own address shows they applied, as a recruitment
agency's first approach doesn't.
The Applications page gains a third view, How they went: from Applied through Responded and Interview to Offer, Rejected,
No reply (nothing for 4 weeks), Still waiting or Closed by you, over 3 months to 2 years. It takes each application's path
from its status history, and it shows how many heard back. Hovering or focusing a flow gives its count, and the figures
are also there as a table. It says what it can't know: applications with no confirmation email, and steps by phone.
feat: a Sankey chart of how applications went
@coderback
coderback merged commit 07a91a5 into feat/status-history Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant