A CV goes through four steps before it is usable: the intake classifier
decides it is an application, the PDF text is extracted, an agent matches it
against job posts, and only then is an ATS score written. A PDF with no
readable text stops at step two. It is never matched and never scored.
The list said nothing about any of this. The parse badge existed only in the
detail pane, so a dead row looked exactly like a good one until you clicked
it. Across eleven hundred applications that is not discoverable, and the
candidate whose file happened not to open is simply lost.
The row now carries the badge, with two deliberate limits:
- Exceptions only. Parsing, Failed and Pending show; Parsed shows nothing.
A green chip on the overwhelming majority of rows is decoration that
buries the two states worth spotting, and no badge already reads as fine.
The detail pane still shows every state, Parsed included, because there
the row is the whole subject.
- Email only. Sheet Form applicants have no mailbox attachment to parse.
The guard is redundant against today's mapFormRow, which sets no
resumeStatus at all, and is kept as a tripwire rather than a load-bearing
check — the comment says so rather than overclaiming.
"Failed" on its own tells a recruiter nothing to do next, so each state got a
plain-language tooltip saying what happened and that the attachment is still
there to open by hand. That needed Badge to forward `title`, which it did not.
The colour rule was duplicated inline in the detail pane; it is now one
helper both halves call, so the same state cannot paint two colours.
Four assertions added to inbox-loading.test.mjs. Three are proven sensitive
by reverting the change: removing the badge fails the label and tooltip
checks, and badging every state fails the exceptions-only check. The fourth,
that form rows stay unlabelled, passes even without the guard and is marked
in the test as a tripwire, not proof.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>