This release strengthens how jobs communicate their requirements to applicants, overhauls interview scheduling and tracking, and fixes dozens of stability issues across the platform and mobile app.
Fixed multiple issues that prevented candidates from seeing accurate application requirements and interview status.
give the apply panel's name, email and code fields placeholders
three places disagreed about an invitation, and candidates paid for it
accept either webhook scheme, so a console rename stops being an outage
heal placement rows one at a time, and stop the bulk gate crying wolf
add the webapp-bulk namespace (en + es)
a guest-list claim now needs proof you own the address
draft role editorials nightly, from one queue both callers share
build the component layer — ⌘K, live ToC, anchors, states
composer toggles + career and in-app apply forms honour a job's résumé/LinkedIn requirements
per-job résumé/LinkedIn requirements — schema, views, and the one server gate
add @diiirect/bulk-core, the platform bulk-action contract
registry contract, executor context, verification and kill switch
per-tenant favicon routes and a one-colour "simple" palette mode
consistent "Latest", an admin recovery button, and a real invariant
make the candidate record say what it looked for, and what the job asked
shell-owned admin rails, kit page templates, design guards, design skill, storybook
a conferencing platform per interview type
auto-close/settle seam + the lifecycle migration behind it
booked-on, initiator and invitation on every row; chunked lookups; bounded upcoming list
composer lands on the new invitation; deep-link resolution extracted and tested
invitation lifecycle — awaiting fetcher, workspace resend/cancel/confirm, auto-close on every booking path, honest expiry, dated timeline
richer interview-type card — description, rendered event preview, platform logo, copyable link
section layout with a secondary rail, view vocabulary, error boundary and column skeletons
the composer seeds its provider from the type, like duration
the interview type owns the duration, not the invite
views as path segments, awaiting-candidate list, linked rows with booked-on, deep-link highlight
headcount + hire tracking, so a requisition can say how many and whether it filled
reconcile custom-domain hostnames from the database
name the desktop rail's navigation landmark, and test it
one <main> per page — rail shells nest a <div>; pgTAP for invitation column grants; calendar-less reschedule test
stop painting readable text with --fg-faint on the interviews surface
chunk both saved-search .in() filters — the watermark was a silent 414
anonymous career mount passes the job's requirements; drop a stale ts-expect-error
open the candidate panel instantly and make pipeline cards read as clickable
drop jsdom from the server path so /changelog can regenerate
scope the token gate per app, and fix the 20 references it was blind to
an edit must not reactivate a retired interview type
list every workspace member in the interviewer picker
type-check fallout — lifecycle adapter for the DTO, triage edit on the right fetcher, dead signal copy, fixtures
the public job board was dark for every logged-out visitor
give the apply panel's name, email and code fields placeholders
make JSON-LD parseable and stop emitting two canonicals, closes webapp#type-check
an unmet apply requirement shows a neutral mark, not a document-with-check
three places disagreed about an invitation, and candidates paid for it
accept either webhook scheme, so a console rename stops being an outage
refuse to activate a contract nobody signed
the webhook did not know half the roles we send
send signers to sign.diiirect.com, the custom domain nobody was using
heal placement rows one at a time, and stop the bulk gate crying wolf
add the webapp-bulk namespace (en + es)
wave 1 of the chat rebuild — trust boundary, transcript integrity, blob reads, client resilience, LinkedIn wiring
waves 2–3 of the chat rebuild — understand-then-respond engine, conversation state, events, admin viewer, eval harness
make Turnstile host-aware on every surface, not just the apply door
do not declare webapp-bulk before anything mounts it
give the client settings Privacy row its label, and gate every nav row on both catalogs
one privacy label per catalog after the merge
ratchet the interviews tree, and give CopyableUrl keys that exist
the resume projection deleted the reason it was meant to show
6 security hardening fixes
a guest-list claim now needs proof you own the address
draft role editorials nightly, from one queue both callers share
make taxonomy re-matching a bounded, scheduled, observable sweep
quick-apply widget, inline apply and role page honour a job's résumé/LinkedIn requirements
rebuild /changelog around the release, not the analytics
build the component layer — ⌘K, live ToC, anchors, states
grounded assistant, ⌘K palette, code highlighting, TOC
prev/next, locale switcher, mobile rail, search facets
rebuild all four surfaces at docs density
rebuild the home surface on the brand's editorial system
serve the knowledge center from its own subdomain
repair three lint errors that had staging red
the video CSP source was invalid, so browsers discarded it
track the moved route tree in the path-scoped gates