This release strengthens the application and hiring process with better candidate tracking, bilingual assessment instruments, and enhanced security. We've fixed critical issues in job posting, contract management, and data handling to ensure a smoother experience for both talent and clients.
Security hardening across authentication, data storage, and session management to protect candidate and client information
Bright Data adapter (async snapshot, auto-skips until keyed)
reveal checks global graph before charging vendor (Phase 2)
bilingual i18n migration + bilingual Big Five keystone + 36 authored instrument seeds (English, pre-revision) + pgTAP
3-option offer builder with live pricing (Track B B4)
commercial-engine fee charging (Track B B5)
gate banned users + bilingual /account-banned page
Role pages are now more discoverable in search results with improved content layout and structured data
drop ftp: scheme + block malformed URLs in embedded browser
harden signature verification + replay across providers
migrate Reddit Pixel + Google Ads conversions from GTM to first-party code
Task 9 — gate/notice/context/locale (4 sub-features)
Task 9 follow-up — structured signup-context + viewer-resolved client notice
honest meeting-connection state + real provider icons & row actions
render boolean flags as a toggle switch + clearer filter label
searchable, multi-column feature-flags panel
runtime kill-switch for notification emails
SenderResolver tiers 1+2 + brand the candidate email; remove dead career-branding
public reviews + double-blind reveal + reminders (Track C)
add client dashboard command center flag
add unified-apply-routing + notification-context-resolvers (default off)
user lifecycle attribution + deletion-request columns (migrations)
hide posting company by default (flip jobs.confidential_default)
admin syndicate action (modality A) with confidential guard
admin syndicate panel (modality A) + bilingual copy
Bluesky direct transport + adapter (facets, external image embed)
branded job-card asset generation via next/og → R2
durable Inngest posting worker (Task 10)
flag, channel/social.requested event, widened channelKind, cookie attribution fields
Mastodon direct transport + adapter
P2D — clicks→apply + engagement rollup report (admin surface)
Phase 2B — compose-&-approve data layer (drafts, edit, schedule)
Phase 2C compose-&-approve SocialComposer UI
stamp click→apply attribution on job applications
tracked-link generation + per-platform draft composition
transport resolver + tests for Phase 1 platforms
10x the LinkedIn prefill — proper casing, flat reveal, one button
catalog-aware skills in the LinkedIn review (matched vs custom)
failure-isolated buildResumeCandidate (degrade to LinkedIn-only)
failure-isolated buildResumeCandidate (degrade to LinkedIn-only)
forward resumeKey through the prefill hook + scan card
forward resumeKey through the prefill hook + scan card
let the user choose the photo instead of silently overwriting
P2b — combined résumé+LinkedIn analyze (flag-gated, off by default)
P2b — combined résumé+LinkedIn analyze (flag-gated, off by default)
persist the LinkedIn profile photo to R2 on apply
polish the LinkedIn scan loading state
restore the LinkedIn scan across a refresh (no re-scan)
résumé → IntermediateProfile merge-candidate adapter
résumé → IntermediateProfile merge-candidate adapter
runMergeChain accepts seedCandidates (résumé as a merge source)
runMergeChain accepts seedCandidates (résumé as a merge source)
seed the résumé as a candidate in the combined extraction merge
seed the résumé as a candidate in the combined extraction merge
show role + education dates in the LinkedIn review
startLinkedInPrefill threads resumeKey (skips cache when fusing)
startLinkedInPrefill threads resumeKey (skips cache when fusing)
step 5 as two equal paths — upload CV | scan LinkedIn
tag work-history rows with their source (LinkedIn vs AI)
talent onboarding fast-track (prefill-first short path)
consolidate route tree under Vercel's 2048 Build-Output cap, closes hi#cardinality
correct Reddit Pixel ID to a2_hbaapdt0410v
guard empty post_id in getApplyHref + correct stale branding doc
signup-context channel stores src (traffic source) per migration DDL
validate openExternal scheme (desktop) + gate cleartext to dev (mobile)
normalize imported-candidate columns (vendor-agnostic)
address adversarial review findings
reconcile feedback domain with post-rebuild schema
stamp account_type=talent at the DB level (drift catch-all)
remove redundant as-string casts, deepen route test, share admin client
scope admin review writes to the reviewed session
serve talent KYC/resume docs via auth-gated presigned route
store talent KYC/resume under private R2 keys (1.4 write-site)
narrow EXECUTE on admin governance functions
graceful formatCurrency, UUID Nango ids, drop talent_db alias
guard missing asset URL, clear stale error on retry, tighten test cast
Phase 2 review fixes — B1/B2/M1/M2/M4/M5
harden Phase 1 syndication — idempotent worker, /j rate-limit, caption/link fixes
Mastodon transport review findings — restore fetch, assert media_ids, header casing
Phase 2 review fixes — idempotent upserts, atomicity, type safety
Task 6 review — wordmark D+iii+rect, title wrap, test height assert
never default the R2 bucket folder to the production namespace
stop R2 logo/avatar uploads landing at a double-folder path
verify session via getUser() in channel route gate
guard asset-insert failure + review minor fixes
stop task-file R2 keys double-prefixing the env folder
case cached prefill results + keep résumé reachable mid-scan
de-AI the LinkedIn scan panel (button, copy, avatar)
drop revalidatePath from onboarding data-key writer (crashed v2)
isolate résumé extraction failure — degrade to LinkedIn-only
isolate résumé extraction failure — degrade to LinkedIn-only
make onboarding city optional (unblocks the location step)
stop mangling extracted skills + drop the work-history AI sparkle
whitelist webapp-linkedin-prefill as a client i18n namespace
Bright Data adapter (async snapshot, auto-skips until keyed)
canonical LinkedIn URL normalization
fallback orchestrator with soft/hard failure detection
flag-gate the browser-unverified UX (option B)
Inngest job + event for background enrichment
M0 DS floor + surface usedLlm/status for trust cues, closes #0A66C2
M1 multi-source merge + FieldProvenance spine
M1 wire merge chain into the Inngest job
M2 AI-derive skills from descriptions (span-verified)
M3 realtime streaming reveal (broadcast + progress)
M3 review trust cues + visible skill chips
M3 rich editable review (curate skills, drop roles/edu)
M3 wizard-collapse — skip the steps the import filled
M4 quality feedback signal (flywheel foundation)
M5 verified-from-LinkedIn trust signal at review
M6 self-tuning provider trust (safe design)
M7 enrichment-graph persistence (self-enrichment)
migration — attempt ledger + provider registry rows
normalize provider data into ResumeDataSchema
offer 'Scan your LinkedIn' on the résumé-upload step
onboarding consent + pre-fill + editable review UI
PeopleDataLabs adapter (live, dataset floor)
Piloterr adapter (live primary, auto-skips until keyed)
profile re-import surface
provider interface + usable-result predicate
provider registry, monthly quota, per-user rate limit
server actions (start / status / apply)
references, talent-discovery report, skills matching & onboarding polish
v2 Phase 6 — resurrect tax forms + talent Documents surface
localize role-snapshot duration & experience labels
correct Piloterr adapter to the live response schema
align account-deletion self-service to real schema
verify session via getUser() on talent page gates
reveal checks global graph before charging vendor (Phase 2)
vendor-agnostic ingest + global contact cache (Phase 1)
write source_records provenance from edge-fn + linkedin-prefill (Phase 3)
capture identityMe at sign-up/sign-in, not just Connect
capture identityMe snapshot in OAuth callback
captureLinkedInIdentity — R2 photo + service-role snapshot upsert
commit the connect/return-path/dev-recovery infrastructure
Connect-with-LinkedIn button on onboarding step (manual linking)
connection-only onboarding step + 10x redesign
identity read (snapshot + IDENTITY-verified) + on-read validation comparator
imported-identity card on onboarding connect step
parse identityMe headline, memberId, lastRefreshedAt, picture expiry
probe /identityMe for profileUrl on OAuth connect
Verified-via-LinkedIn badge on candidate record (client/admin)
phase 2 — live pacing engine + multi-channel + LinkedIn/WhatsApp
phase 3 — HITL console, dashboards, unified inbox
phase 4 — bilingual client surface + WhatsApp templates
phase-1 foundation — schema, contract, pure engine modules
phase-1 stage 2 — durable engine, stores, actions, webhook
phase-1 stage 3 — flag-gated admin operating UI
restore talent-api batch ingest as direct enrichment upserts
bump migration timestamp +1s to resolve merge collision
harden engine — adversarial-review fixes (12 confirmed bugs)
harden phases 2-4 — adversarial-review fixes (5 confirmed bugs)
bilingual i18n migration + bilingual Big Five keystone + 36 authored instrument seeds (English, pre-revision) + pgTAP
bilingualize 18 instrument seeds (EN+ES) + pgTAP i18n assertions
bilingualize the final 18 instrument seeds (EN+ES) — full catalog now bilingual
client library subtype tabs (skills tests vs personality profiles)
engine migrations — dimensions, results.profile_data, satisfied_by gating
G1 — response capture persistence (video/file/text)
G2 — analytics computation core (funnel, rates, distribution, item difficulty)
Likert taker renderer (bilingual scale) — profile instruments now takeable
profile DB-row adapter (buildProfileInputs/extractLikertValue) + tests (23 green)
profile result end-to-end — issue on submit + trait-bar report
profile-aggregation core (14 tests green) + instrument_type/source_refs migration
render assessments in the candidate's locale (EN/ES)
survey kind + Big Five keystone seed + engine/seed pgTAP + catalog index
Wave 2B — analytics dashboard (G2), client builder (G4), live_phone conduct (G3)
wire profile scoring path — issueProfileResult + instrument_type dispatch in submit action
local DB apply — scoring_strategy constraint + stale pgTAP counts
lock start_attempt RPC to service_role
validate invitation token in recording presign
3-option offer builder with live pricing (Track B B4)
admin-defined packages + offer snapshot (Phase 2)
compliance gate before send-for-signature (Phase 3)
Deel EOR cost quote with manual fallback (Track B B3)
engagement-type schema + pricing engine (Track B B1+B2)
HubSpot deal + line-item + stage sync (Phase 4)
talent license, addons, 90-day guarantee (Phase 5)
reconcile contract enums + admin create/edit with post-rebuild schema
gate completeWalletDeposit to platform admin
commercial-engine fee charging (Track B B5)
gate banned users + bilingual /account-banned page
localize every transactional email (EN+ES) + Auth hook runbook
notifyCandidateApplicationSubmitted durable helper
pass brandResolver in durable consumer when notification-context-resolvers is on
resolve brand at dispatch seam for branded email events (opt-in)
AnalyzeStep — fused résumé+LinkedIn or résumé-only
consolidate in-progress analyze→review + LinkedIn work
consolidate Upload→Analyze split into staging
defer the pre-workspace photo step for talent
overhaul analyze→review — match cues, inline edit, avatar upload, a11y
ResumeUploadStep — required, stage-only upload
split step 5 into Upload(5) + Analyze(6); renumber to 24
useResumeExtraction hook for résumé-only analyze
enforce a state machine on withdrawal decisions
require admin-eligible email to impersonate
require owner/admin role in requireAdmin
verify JWT for OAuth consent + gate admin-account creation
flush logger in notifyCandidateApplicationSubmitted
drop stale 'keep current' avatar choice after an upload
preserve acronyms + keep C#/F# distinct in prefill data
recover avatar on src change + stop secondary buttons hovering lime
résumé-extraction hard timeout + unmount cleanup; real-data title-case regression
shorten agency disabled-state badge so it fits on one line
stop infinite autosave loop on LinkedIn step
re-derive role from DB, not forgeable cookies, in write gates
10 security hardening fixes
AI editorial drafter for evergreen role pages (suggest-only)
close the AI loop — accept role → profile + auto editorial draft
IndexNow ping when a role page is published
add /future-of-work to sitemap
add www-future-of-work i18n namespace (en+es)
app-like "role console" hero with the split fork as centerpiece
app-like "role console" hero with the split fork as centerpiece
future-of-work — source favicons + share bar
future-of-work launch banner + flag
future-of-work page
future-of-work page data assembly
future-of-work presentational components
future-of-work route layout + page-scoped css
future-of-work SEO — JSON-LD, OG/Twitter meta, dynamic OG image
Go-To-Market Summit NYC — event page + ledger broadsheet
GTM Night NYC editorial event page
homepage copy refresh + hide confidential company label
Phase 0 — CTA instrumentation on the role console
Phase 1 — comp-by-seniority ladder + clean region/seniority split
Phase 1 — role page becomes the sidebar console
Phase 2 — comp seniority toggle (full distribution per level)
Phase 2 — find-your-percentile salary calculator
Phase 2 — interactive demand chart (hover crosshair + read-out)
Phase 3 — talent→role crosswalk (vetted supply moat)
research-back the future-of-work report + widen the gutter
restore the split-fork dual CTA (Proposal C) on the role page
restore the split-fork dual CTA (Proposal C) on the role page
salary range-bar on the merged role page
smooth + animate the demand chart (Catmull-Rom curve, draw-on + fade-in)
swap Manifesto for Future of work in navbar
two-product pricing — Platform + Talent managed-hiring routes
retry IndexNow pings on transient (429/5xx) statuses
retry IndexNow pings on transient (429/5xx) statuses
align footer labels, banner on homepage, nav clears the ribbon
credit the diiirect Talent Index, not 'marketplace data'
de-dupe FOW page title + localize reused widgets on /es
demand chart + flatten FIG.01 stat block
drive the demand chart's fill/area/animation inline (host-CSS-agnostic)
force-dynamic the two job role pages to stop prod 500
future-of-work — load reused /jobs component styles + hero spacing
label comp provenance on the future-of-work report
lead the role page with content, tighten the hero
lead the role page with content, tighten the hero
make evergreen role pages indexable + emit them in the sitemap
make the role hero intentional on thin market data
make the role hero intentional on thin market data
Phase 0 — WCAG-AA trend signals + truthful assessment CTA, closes #176b3a
Phase 1 SEO — clean Occupation structured data
resolve future-of-work banner flag server-side (keep flags/next out of the client bundle)
role pages 500 — use flag decideStatic() in ISR render
drop ftp: scheme + block malformed URLs in embedded browser
harden signature verification + replay across providers
make DocuSeal webhook idempotent on retry