Changelog page now displays accurate release counts
We fixed the changelog page on our website to correctly label and display the number of changes for each release and the overall totals.
We fixed the changelog page on our website to correctly label and display the number of changes for each release and the overall totals.
This release brings line-item pricing with seat types so you can bill clients for exactly what they use, fixes critical automation workflows that were looping or failing silently, and improves stability across the platform with hundreds of bug fixes and refinements.
bilingual job board and install page polish from visual review
HubSpot jobs app — link a portal to a workspace and render its job board anywhere
mark platform-only and read-only-mirror objects across the shared surfaces
reveals, prefill and every pipeline from the one consumption view
the review workbench, rebuilt to the approved design
wire the manual upload into the meetings hub — resumable recording, transcript, speaker map
a taken name is a refusal the user can fix, not a failure
copy names avoid slug collisions and cut by grapheme
duplicate, restore, plan cap, and no archiving the default
editor lives at settings/pipelines/<id> via the catch-all
list helpers and usage queries
localized copy names that fit the name limit, and list copy
per-workspace pipeline cap entitlement and three platform templates, closes Hi#volume
platform templates as flat cards with Use template
settings nav entry and the list/create/templates copy (en + es)
settings/pipelines is the list, not the default's editor
the inline new-pipeline form, opened by ?new=1
the list reads each pipeline's stage kinds, so rows can draw them
the pipelines list with row menus and the archived toggle
extract-linkedin runs on trace = attemptId; planned_chain, ledger flush, job_crashed
one ledger row per provider attempt; fail-open quota; bills-every-call accounting
planned_chain, subject_key and error_code vocabulary on prefill attempts
trace scopes at every prefill entry point; enqueue_failed; subject_key at insert; public-apply lookup limit; chat onboarding reads normalized_result
timers console subtotals + filters, editable work memos, contract-first timer, richer client entries
alert engine through real channels, 15-minute cron, spend-watch routing
alert tables, snapshot, ledger health and the one consumption view
cache board data across requests, invalidate on disconnect
bound the editor's per-stage counts like the list bounds its usage reads
createStage derives key and order from one read, not two
gate on the role the context already returned
reads take the client the caller already holds
a catalyst Table that scrolls sideways is a keyboard tab stop
declare the check level per route so client and server cannot disagree
name the D25 follow-up for census-only kind columns; record the P0b proof run
board rows link to the apply bridge when the career page is not launched
fit the embed snippets and localize three page titles
page header, empty state and translated disconnect errors
two tenant-domain links that dead-ended, and a guard for the class
signal the audit-action bound instead of capping silently; isolate pgTAP rollup fixture
U01 review — SQL/TS subject-key parity, free precheck/count, redacted breaker history, safe trace ids
deliver buffered lines where traced work ends; print untraced errors synchronously
let check-quota-meter-parity skip where its sibling skips
pin the vendor-platform migration set and narrow declared exceptions to their site
the subject-link invariant must not quote the RPC name
a caller's glyph size replaces size-full instead of losing to it
exempt the ChannelGlyph test fixture label from the i18n ratchet
clear the review flag on sign-off and the sign-off on re-analysis
persist Daniela's human-review flag and keep the AI score out of client workspaces
a short media duration no longer pushes later lines off the timeline
request the MP4 rendition when a manual upload stores a recording
uploaded recordings actually play — signed MP4 link, and the rendition is requested once Stream is ready
never report NOT PROTECTED when classic protection was unreadable
404 a pipelines settings URL we do not serve, and drop an inert segment config
a failed read is null, not an empty list, and usage reads are bounded
a failed usage count is logged and reported as unknown, not zero
archiveStage only moves candidates to a live stage of the same pipeline
archiving or restoring a row lands focus on the notice
checked rollbacks, refusal codes with copy, and an unknown count is not zero
count the jobs the default actually runs, and close three action seams
drop PageContainer from the editor, tighten the uuid matcher
free copy names, no double submits, focus kept, regions mounted
isolate the list page's streamed sections; give the list its own skeleton
slug the Unicode spaces Postgres folds, and never re-offer the source name
stop double-printing the pipeline name, hide the redundant create action
the create form's buttons are aria-disabled, like every other control
the platform's seeded ids are valid ids again
only displayed_source feedback is attributed credit
count résumé-only real runs as origins; never reuse a caller's temp table
narrow the readiness key check to registered vendor codes; type the waterfall money suite against the funnel's Settlement
demo applications name their candidate, so a fresh DB seeds cleanly
one candidate per talent per workspace in the demo client seed
ellipsize the sidebar search placeholder instead of cutting it mid-word
the whole create-task form is bilingual; one admin create flow
accept the spend-watch margin step's read-result shape
type the rule write and the alert test doubles so tsc passes on the integrated tree
vendor-failure prefill rate, stale-probe gate, phone scrub, inactive Piloterr key
P2 SQL polish — boolean breaker reset, per-source refund caps, key-only prefill backfill, keyed seed fixture
P2 TS polish — evidence-gated vendor alerts, admin-gated consumption, bounded inserts, one breaker read per request
feedback credits the shown source; trust moves inside guardrails with history
make Bright Data work and switch it back on
merge decides by agreement, guarded trust, then priority; prefill breaker
per-vendor attribution, attempt pointer and vendor-only is_verified in the graph persist
server-only reader for the cache-copy remediation log
your-data shows the linked record and where each detail came from (U16)
a refused graph persist is not persisted; say what the kill switch really does
Alerts & routing and Workspace controls console, governance ops (U14)
console read RPCs for lookups, lookup trace, payload viewer and coverage
console readers and core ops (U12)
LinkedIn prefill operations console + cache-copy review (U20)
lookup trace subject-link panel, unlinkSubjectOp, partial money marks (U16)
Lookups, Lookup trace, payload viewer and Coverage console screens (U13)
overview and vendor-detail read RPCs for the console (U12)
Overview, Vendors and Vendor detail screens, wired into the admin shell (U12)
Quality screen and inline learning settings (U15)
Retention screen with inline windows form, sweep log and erasure activity (U17)
carry the sourcing trace through the reveal and search actions (vendor-platform U06)
daily retention cron, retention settings and account-deletion vendor footprint (U17)
detect duplicate profiles and merge them in SQL
exact admin audit-action vocabulary and prefill feedback rollup in SQL
flag-gated subject link writer + prefill persist seam (U16)
link vendor calls to their raw record and negative-cache misses (vendor-platform U06)
read admin audit actions and trust feedback as SQL aggregates
rebuild talent sourcing — honest paid search, saved-graph answers, privacy fixes, legacy cleanup, docs
record every sourcing adapter call and cache reveal misses (vendor-platform U06)
record field-level provenance from the graph ingest
recordVendorCall ledger recorder, vocabulary, billing policy, redaction, subject key
routing everywhere, opt-in reveal waterfall, company funnel, unauthenticated breaker
structured trace-aware logger with URL and email redaction
subject link SQL — link_subject/unlink_subject + lookup_trace subject_link, capped payloads (U16)
the talent self record lists per-field provenance
trust history, feedback attribution columns and the vendor_quality read
vendor-call ledger, subject key, rollups and vendor state history (SQL)
vendor-platform invariants in check-enrichment-invariants + program-wide grants test
vendor-platform retention sweep and subject/user erasure in SQL (U17)
deterministic auto-reply and agent-loop guard (P0b.5)
person-level contactability union gates every agent send
talent agent ceilings in engine + DB, and a fail-closed platform spend ceiling
bound lookup_list's scan by the keyset cursor
20260928001500 replays on a fresh database
every ledger outcome lands in one overview bucket; index the batch reads
focus follows the batch panel; probe and overlap counts no longer hover-only
label alerts on deactivated vendors, stored routing order, real workspace overrides
land focus on the review stamp after Mark reviewed; show the whole-set active link count
lookup_list p_before defaults to NULL so the first page can omit it
make the alerts tabs rail items instead of a second tab strip under the shell rail
one missed rule for prefill outcomes; link_subject says whether it created the link
polish console readers — true refusal reasons, per-scope inactive alerts, unsupported not called, one subject-link audit per link
Quality and Prefill screens — accurate labels, announced status, focus order
stop console tables and stat bands from scrolling the page sideways
the window filter hugs its pills instead of stretching across the column
type the prefill review error fallback; catalog the vendor-data retention cron (253 registered)
audit fixes — screened provenance, negative cache on withheld contact, merge_history grants, one LinkedIn mask
make Merge ask first and keep merged subjects reachable
negative-cache clear needs all: true; no .in() on facets (vendor-platform U06)
spell the mask's Unicode classes as ASCII \u escapes
U10 review — abort a facet re-insert after a failed delete; isolate the self-view provenance read
agent-loop cap never counts the current reply; list-relayed opt-outs still suppress
egress veto, fenced reply history and forced approval on reply turns
explicit agent caps override the workspace daily default; spend gate is replay-safe
keep the stuck-run sweep off live approval waits, send the approved text
record HITL verdicts before waking the run, and recover lost approvals
reflected agent stamps escalate at once; per-reason unsigned warnings; worker header parity
spend-read failures never escalate; clamp notice reaches the kept talent agent
stop the experience range crushing its selects; align the filter rail and flatten the results region
apply-gate review mode — no automated refusal on a score
persist pending-review must-haves truthfully; lazy review-mode flag
line-item pricing — HubSpot-style seats, discounts, quotes, billed through Stripe
seat TYPES — sell more than one kind of seat, each with its own access and price
the customer's side of commercial billing
mount the seat block on the client team page too
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.
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
This release includes maintenance and reliability improvements to keep the platform running smoothly.
This release fixes critical issues with contract signing and document tracking, improves how talent profiles display, and strengthens security across the platform. We've also launched a new knowledge center and made the talent discovery experience more reliable.
the nightly job failed 27/27 in silence — make it report, verify and answer for itself
let clients and recruiters ask a candidate for something
make the channels layer tenant-safe, threaded and enforceable
the a11y pass, the phone layout, and a lint gate that was inert
the deferred four, and the bug a browser found
"N open roles for you" — the payoff card gets its data path
"N open roles for you" — the payoff card gets its data path
close the open questions — the Q3 audit, and the two levers named
the host gets a voice, the reminder gets an audience, and four dead paths get a reader
tenant auth handoff, the privacy centre, and observability scrubbing
require a name at the apply door, and never render an anonymous card
the candidate decision log has never accepted a single row
show the applicant's email, and find their CV wherever it lives
show the applicant's email, and find their CV wherever it lives
land the review pass that was left uncommitted in the working tree
commit the generated types for vendor_health and vendor_balance
the tasks function wrote a path into bucket_folder, 404ing every attachment in the webapp
one stale belief about seven columns caused four defects
the candidate video-interview recorder was entirely in English
stop promising a scheduled-report email nothing sends
resolve two post-merge collisions the merge itself could not see
the SNS topic allowlist has never been switched on — make that visible
reject a key that already carries the environment folder
reject a key that already carries the environment folder
skills never loaded — the embed crosses a schema boundary
the four collisions the consolidation itself created
send what the vendor documents, not what we invented
the CSP, the font tracing and the CORS list were all a step from breaking
render the preview in the browser, and remove the extraction scaffolding
the availability line never rendered, and 'fluent' was printed as 'Native'
the jobs table advertised every non-hourly role as a yearly salary
degrade to the graph when no vendor can serve, and a probe script, closes webapp#type-check
track what is LEFT at each vendor, not just cost and spend, closes webapp#type-check
vendor failover, a circuit breaker, and the outage it found, closes webapp#type-check
delete the WhatsApp template fiction and resolve LinkedIn ids properly
record which key signed what, so a void document is knowable
record which key signed what, so a void document is knowable
regenerate types for the attribution column, and catch the Sensitive PLACEHOLDER trap
regenerate types for the attribution column, and catch the Sensitive PLACEHOLDER trap
bound the reminder sweep, and stop post-send edits to signed terms
bound the reminder sweep, and stop post-send edits to signed terms
the admin talent picker could never return a result
the signature-reminder idempotency key was only ever logged
the signature-to-activation path lost contracts silently
the signature-to-activation path lost contracts silently
a failed decline must not tell both parties the contract is dead
a failed decline must not tell both parties the contract is dead
close what the completed audit found in this branch's own work
close what the completed audit found in this branch's own work
prove the key is in production mode, and stop losing signatures
prove the key is in production mode, and stop losing signatures
the mode gate misread DocuSeal's own refusal and would have blocked a good key
the mode gate misread DocuSeal's own refusal and would have blocked a good key
the remediation sweep called every void signature "indeterminate"
the remediation sweep called every void signature "indeterminate"
make "billed for it" and "can reach it" the same question
checkIsAdmin granted platform-admin on bare admin-workspace membership
3 security hardening fixes
the public pages can finally be read by the public
console shell — URL contract, chrome, palette, live hoist
dataset query core, seven descriptors, and the sharePct fix
metric registry, the ACL/sampling migration, and -6 route entries
the console — three surfaces, entity drill, ten pages retired
/boston-2026 — the trip page where you circle a date
the résumé funnel, rebuilt on the shared studio, closes base64-throu#a-Server-Action
five unauthenticated public forms billed HubSpot with no rate limit
the last role-less admin check gated a service-role magic-link minter
the résumé generator was dead in production on every path
media uploads, the freeze-gated maintenance jobs, and the proxy guard
microfrontend boundary, SEO routes, and retiring the old KB
Sentry, the dev-CLI service, and the reader/admin client guard
the authoring console — roles, optimistic locking, review queue
the content API — machine-written drafts that cannot self-publish
bootstrap the first editor without failing empty environments
dev seed — 34 articles across every tier, verified
expose the schema, document it, and gate its access model
search, the public-route view, and the maintenance split
generateStaticParams cannot use a cookie-carrying client
surface PostgREST errors, and record what is actually proven
add the health endpoint the deploy checks actually need
build without a database instead of failing the promote
repoint every internal link the rename could not anchor
sections had no localized title