Worked productHealthcare · one hiring process, seven stages

One process, and every clock derived from it.

A recruitment desk for a 4,100-person health group: nine destinations over one application record, where the stepper is the same component on the queue, the board and the record. What it settles is whether a hiring product can hold a gate without inventing a status for it.

Preview interactive design
The operatorNadia Ferreira, recruiterowns 9 of the 15 waiting
The clockThree to ten daysper stage, and derived
StatusSix fields, thirty-one valuesone enums file
The fixture24 applications, 6 requisitionsone array per entity
The day starts on what is owed. · 15 applications wait on the desk, 9 of them Nadia’s — and 5 sit over their stage’s own service level, which is three days at applied and ten at checks.the screen the day starts on
The screensIn the order the work happens

Nine destinations over one record.

Twenty-three registered routes: nine sidebar destinations, twelve off the nav, two for auth. Neither an interview nor an offer has a record route — an interview is a row and a dialog, and an offer is a field on the application it belongs to.

02The status set →
Screen 01

What is waiting, and whose it is

The queue promises a number the sidebar badge also shows, so both call one act-ability predicate over one array. The order is how far over its own stage’s allowance a row is, and the date it arrived only breaks ties.

  • “Every application on the desk. 15 of them waiting on us right now.”
  • Waiting on us 15 · Waiting on others 4 · Settled 5 · Everything 24
  • Ordered by how far over its own stage’s allowance a row is, never by arrival
/applicationsqueue · filtered table
Screen 02

The application, and what the next move waits on

One record for one person, reached from the desk, the queue, the ladder and the board alike. The stepper is the spine: a completed step cites the sub-record that completed it, and a step with nothing to cite says what it is for.

  • “2 scorecards of 2 · 4.38 average · 2 recommending yes” — Priya Raghunathan
  • Checks: “0 of 2 references back · right to work verified · DBS with the service”
  • Seven steps on the strip of nine declared values — declined and withdrawn are ends
/applications/:idrecord · stepper-led
Screen 03

What runs out first

Two offers, ordered by expiry rather than by value. Each row says where the salary sits in the band it came from, and names what the candidate asked for where the offer came in under it. It will not record a hire nobody has accepted.

  • £36,796 to Freya Lindsay — 85% up £31,049 – £37,796, 3 days left
  • “Asked for £37,000” sits under the row where the offer came in under it
  • Accepted 2 of 3 · 67% of every offer this desk has sent
/offersqueue · expiry-ordered
Screen 04

The three things that must be true before anybody starts

One row per live application, three checks each, urgent first — a blocker at offer stops something, the same blocker at applied stops nothing yet. Urgency is the stage, never the count, and the row with the live action on it is never greyed out.

  • 16 with something outstanding, 3 with nothing, 1 close enough to a start date to matter
  • “renews 14 Sept · 17 days left” against Elias Nordahl, the one row at checks with a gap
  • Callum Beattie’s register cell: “No NMC number · This seat asks for one”
/compliancechecklist · gated
Screen 05

One seat, its pipeline and the advert that filled it

A requisition is seats, not a hire: three nurse seats, nine live applications, none accepted. It holds which register the seat requires, and the advert tab counts what each channel actually produced rather than quietly folding in the rest.

  • LH-1042 — 3 seats, 9 live, 59 days open, aging past 45, NMC registration required
  • 4,546 views, 7 applications, 0.2% — best channel Careers event at 1.0%
  • 3 more arrived another way — a referral, the pool, an event
/requisitions/:idboard · per seat
StatusA closed set, and the states deliberately outside it

Nine values, and four clocks that are not among them.

The value everybody looks for here is stalled, and it is not in the set. Lateness is days in the current stage against that stage’s own allowance, computed at render — as are unread, offer expiring and registration outstanding. A record carries one stage and any number of derived flags.

03The awkward cases →
appliedscreeningassessmentpanelchecksofferhireddeclinedwithdrawn
Nine values, three terminal, and seven of them the stepper draws. The four the desk owns are info; checks and offer are warning, out of our hands but on the clock; hired is success. Declined and withdrawn are neutral rather than danger, because a settled application is not a failure and nothing is owed on it. Six status fields, thirty-one values, one file — and the four values with no fixture row are named in the coverage note at the bottom of enums.js rather than covered by invented records.
The dataThree fixtures that break a screen

Where the gate has to hold.

Each of these is a record in the fixture, reachable in the running template.

04The audit →
Case 01A panel decided by one scorecard
NaivelyThe record is at panel, so “Move to checks” renders live — or disabled with nothing beside it, leaving the reviewer to work out which of five preconditions is in the way.
HereThe action is offered, disabled, and states the count: “2 scorecards are needed before checks start — 1 in so far.” The note beside it says whose card will decide it.
Case 02A ward clerk with no NMC number
NaivelyThe gate looks like three symmetrical checks, so registration is read off the application and everybody owes one. An accepted ward-clerk offer then sits on compliance as a blocked hire.
HereWhether a register is owed is a property of the seat. One row reads “Not required · This seat asks for no register” and is not counted against the badge; another, on a seat that does ask, reads “No NMC number”.
Case 03An offer already answered, beside one still out
NaivelyThe accepted offer is counted as a hire, the seat shows nothing left, and the requisition claims a fill that no hire record supports.
HereAcceptance is a field on the offer, not a stage. One candidate accepted £24,071 and is still at offer, with “Record acceptance” live; another’s is disabled — “nothing to record until the candidate accepts”.
The auditWhat the audit found

Two predicates where there should have been one.

Recession was keyed on “clear to start” while urgency was keyed on “has a blocker”, and one record satisfied both: a registration in date today, renewing in seventeen days. The only row the badge counted was styled as work nobody can act on. Clear to start is now the plain negation of the three outstanding flags.

05Back to the top →
Recession, the count and the badge now agree. · 16 outstanding, 3 with nothing, 1 close enough to a start date to matter — and the row that carries the action is the one at the top, not greyed out.checkable

Reckon

The process is one.
The seats are not.

One hiring process from ward clerk to systems engineer, with the gate in the same place on every one. What differs is the register, the band and who sits on the panel.

Built for Claude Design · plain markdown · nothing to run