chore: sync the deployed branch onto upstream tag v1.6.0 - #12
Merged
Conversation
Bumps the dev-dependencies group with 2 updates: [tsx](https://github.com/privatenumber/tsx) and [vue-tsc](https://github.com/vuejs/language-tools/tree/HEAD/packages/tsc). Updates `tsx` from 4.22.4 to 4.23.0 - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](privatenumber/tsx@v4.22.4...v4.23.0) Updates `vue-tsc` from 3.3.5 to 3.3.6 - [Release notes](https://github.com/vuejs/language-tools/releases) - [Changelog](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md) - [Commits](https://github.com/vuejs/language-tools/commits/v3.3.6/packages/tsc) --- updated-dependencies: - dependency-name: tsx dependency-version: 4.23.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: vue-tsc dependency-version: 3.3.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] <support@github.com>
…dependencies-8db76d3e64 chore(dev-deps): bump the dev-dependencies group with 2 updates
- Create `CareerPageView` component and `/career/[slug]` page - Add `/api/career-page` endpoints for configuration - Add asset management for logos and banners - Add public sitemap generation - Update `i18n` with career-related translations
Prevents automated email harvesting by escaping the '@' symbol in example addresses across all locales.
Replaces manual locator calls with a robust helper function that includes a wait condition to ensure the element is available.
Introduce a `fullbleed` layout option to remove default padding and overflow, allowing the career page editor to occupy the full viewport.
- Rotate AI model defaults and registry to latest versions - Add "Settings" link to primary navigation - Implement dynamic menu positioning for the language switcher to prevent off-screen rendering
301 redirect legacy home and pricing pages from app.reqcore.com to the canonical reqcore.com domain to consolidate SEO and content management.
# Conflicts: # app/pages/dashboard/settings/ai/index.vue # app/pages/dashboard/settings/ai/new.vue # server/api/ai-config/index.post.ts # shared/billing.ts # tests/unit/billing-plan-resolution.test.ts
- Allow Bring-Your-Own-Key (BYOK) for AI configurations across all tiers. - Introduce `openrouter` as a supported AI provider. - Implement `platformAiConfig` to manage organization-specific overrides for platform-managed AI models. - Update UI components and billing documentation to reflect these changes.
- Added `platform_ai_config` table to allow per-organization AI model overrides. - Implemented utility functions to manage and resolve platform AI provider configurations. - Added document parsing utility for processing and persisting extracted content.
Introduce `analysisContext` to the job schema to control which candidate data sources (cover letter, screening answers, recruiter notes) the AI reads during scoring. Includes a database migration, updated scoring utility, and UI support.
Move filtering, sorting, search, and pagination logic from the frontend to the database query to improve performance and support large datasets.
- Implement CRUD operations for application notes. - Add a priority+ navigation bar for detail tabs that collapses into an overflow menu when space is constrained. - Refactor application selection logic to improve hydration reliability. - Update permission schema to allow comment updates.
Fetch application counts per status for the pipeline UI and ensure they are returned even when filters return zero results.
Remove the requirement for a paid subscription to access career pages by updating the feature flag configuration. This allows all organizations, including free-tier users, to utilize the career page as an acquisition surface.
Restrict search engine indexing to default-locale job pages to prevent duplicate content issues caused by untranslated localized variants. Updates canonical URLs, JobPosting schema, and robots headers to ensure Google for Jobs deduplicates across locales.
- Strip hreflang tags for localized career/job pages to prevent indexing issues with Google's hreflang clusters. - Set `noindex, nofollow` on localized job and career variants to mirror existing X-Robots-Tag headers. - Move JobPosting JSON-LD to a computed property to ensure it renders correctly during SSR.
Decouple AI analysis from the requirement of a resume. The scoring engine now accepts any combination of resumes, cover letters, screening answers, or recruiter notes, provided at least one source of evidence contains usable content.
- Redesign the career page link component on job pages. - Integrate `sharp` to automatically optimize career page banners to WebP format. - Increase banner upload limit to 15 MB. - Update localized strings and display the organization logo on the job page.
Added a `bannerPosition` field to the career page configuration to allow admins to adjust the vertical focal point of hero banners.
Replace the arbitrary Tailwind grid utility with scoped CSS to ensure the side-by-side layout is applied deterministically on initial page load.
- Persist collapsed state of DemoUpsellBanner across page navigations - Update DemoUpsellBanner styling for light/dark mode consistency - Sync sidebar list scroll position with selected candidate - Add delayed skeleton loading to job detail view to reduce layout shift
feat: add branded career pages, ai config, and models
- Update confirmation page layout with improved visual hierarchy and brand consistency - Add "Back to careers" navigation link for organizations - Update copy across all locales to be more concise - Adjust dev server memory limits and ZED settings for better performance
- Update tab styling to use a pill-based navigation. - Implement compact empty states for sections in the overview tab. - Reduce vertical spacing and improve component density throughout the dashboard view.
Bumps the dev-dependencies group with 4 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [tsx](https://github.com/privatenumber/tsx), [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) and [vue-tsc](https://github.com/vuejs/language-tools/tree/HEAD/packages/tsc). Updates `@types/node` from 25.9.4 to 25.9.5 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `tsx` from 4.23.0 to 4.23.1 - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](privatenumber/tsx@v4.23.0...v4.23.1) Updates `vitest` from 4.1.9 to 4.1.10 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/vitest) Updates `vue-tsc` from 3.3.6 to 3.3.7 - [Release notes](https://github.com/vuejs/language-tools/releases) - [Changelog](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md) - [Commits](https://github.com/vuejs/language-tools/commits/v3.3.7/packages/tsc) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 25.9.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: tsx dependency-version: 4.23.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: vitest dependency-version: 4.1.10 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: vue-tsc dependency-version: 3.3.7 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] <support@github.com>
…dependencies-ad78d71c5a chore(dev-deps): bump the dev-dependencies group with 4 updates
…n-page feat: Redesign application confirmation page
- Replace standard email invitations with integrated candidate conversation threads - Add `RESEND_RECEIVING_API_KEY` and associated environment configuration for inbound email handling - Limit outbound candidate messages for Free plan organizations - Update database schema to track interview personal notes and message history - Add manual fallback link for email delivery failures
Move database URL logic to a shared utility and integrate it into the environment validation schema. This ensures Railway preview environments with malformed `DATABASE_URL` strings are automatically corrected during startup. Additionally, update the auth handler to return JSON errors instead of throwing server errors to prevent masking validation failures.
Update billing logic to track started candidate conversations rather than total outbound messages. This allows unlimited messaging within existing threads for free users while capping the number of distinct conversations.
- Add `candidateMessageAttachment` table for persistent storage - Implement S3 upload/download and cleanup logic - Update frontend components to allow file attachments - Add validation and erasure support for attachments
- Added a security disclaimer to the attachment list for inbound files. - Added a 21 MB limit check for the request content-length to prevent unnecessary memory buffering of oversized multipart requests.
- Move application status transition to interview stage to server-side logic upon interview creation to ensure consistency. - Update the messaging panel layout to move secondary actions like "Open in inbox" and refresh into a more compact footer area.
- Add expand/collapse functionality to the message composer - Refine visual styling for the messaging panel and attachments - Protect against race conditions between email status webhooks and send operations by preventing status updates if a provider status exists
feat: Refactor interview scheduling and add messaging
- Enable required email verification for production sign-ups. - Add denylist for disposable email domains to prevent account spam. - Enforce rolling-hour outbound message rate limits for candidate emails and interview invitations. - Update sign-in/up flows to handle unverified sessions and verification resends.
- Require Content-Length for attachment uploads to prevent unbounded memory buffering. - Use advisory locks and idempotency checks to prevent concurrent submission races for interview responses.
…nd-guard security: Implement email verification and anti-abuse safeguards
Changed email verification from a sign-in gate to an action-gate. Users can now sign in immediately after registration, but must verify their email before performing actions that trigger outbound emails (e.g., invitations or candidate messages). Added `EmailVerificationBanner.vue` to guide users through the verification process post-sign-in.
Move the database URL resolution logic to the test fixtures and automatically verify test account emails during the sign-up flow to bypass email verification requirements.
…tion security: Defer email verification to outbound actions
…in--components--reqcore chore: release v1.6.0
The deployed branch had verify.sh and check-no-workflows.sh but NOT sync-upstream.sh or .sync-upstream.conf — so the one branch that actually has to be resynced was the one with no scripted way to do it, and its workflow deletion had no automatic policy on merge. Taken from origin/main at the post-fix version (byte-identical to claude-code-policy's canonical copy). deploy.sh, release.sh and docs/UPSTREAM-DIVERGENCE.md are deliberately NOT brought over here: publishing and the divergence record belong to main, and this branch deploys by building on the host.
Upstream carries workflows this org cannot run — GitHub Actions is blocked org-wide by a billing condition, so each one reports failure for an account reason and checks nothing. This branch's gate is ./verify.sh, and ./check-no-workflows.sh fails if they come back. This is the DEPLOYED branch, serving jobs.escooterclinic.co.uk and remotecrew.co.uk/jobs from a live ATS holding candidate PII. It was 164 commits and two releases (v1.5.0, v1.6.0) behind the real upstream, which nothing had measured because the fork's upstream remote named a dead mirror until 5a924c5. Target is the TAG v1.6.0, not upstream HEAD: upstream's main has been red since 2026-08-11 (npm ci, EUSAGE / Missing oxc-parser@0.144.0). Three real conflicts, resolved by reading both sides — no --ours/--theirs: app/pages/jobs/index.vue and [slug]/index.vue v1.6.0 moved the public board's SEO strings into i18n while this fork had made them brand-aware. Both intentions kept: the BRANDED board keeps ESC copy, the unbranded one now takes upstream's translations instead of the English literals this fork was carrying. Upstream's new ogUrl/canonical is taken; the OG image stays brand-aware and absolute, because a relative one 404s when the app is served under a different apex (remotecrew.co.uk/jobs). The JSON-LD block was DUPLICATE INTENT: both sides independently replaced a watchEffect-nested useHead, having each found that on the server it ran once before useFetch resolved and never re-ran — so Google for Jobs saw no structured data. Upstream's shape is taken. THE NONCE IS OURS AND IS KEPT: this fork runs a strict nonce-based CSP (server/middleware/csp.ts), and without it the inline JSON-LD script is dropped by script-src 'nonce-…'. Taking upstream's version wholesale would have silently removed the structured data it exists to emit. package-lock.json regenerated, not hand-merged. package.json merged cleanly but needed the same AI-SDK ceilings main just took: the tail of every current AI-SDK major is under advisory, and provider-utils 4.0.41+ pulls undici ^5.29.0 — all of undici 5.x sits inside GHSA-vrm6-8vpv-qv8q, the one HIGH that fails the gate. No fix exists inside these majors; ai 7 / @ai-sdk 4 is a breaking upgrade through the scoring path and is filed as its own row. This branch's own unhead range (>=2.1.13) already resolved to 3.3.1 unaided, so it needed no equivalent of main's fix. Also on this branch: * sync-upstream.sh and .sync-upstream.conf, which it did not have — the one branch that has to be resynced was the one with no scripted way to do it. * overlay/esc/README.md: the 2026-06-27 note claiming upstream had gone closed-source, been replaced by a 2-commit stub and shared NO common ancestor is WRONG and is corrected in place. This merge is the disproof: an ordinary merge onto v1.6.0 across merge-base f154021. The stub it described belongs to hahzterry/reqcore, the frozen copy GitHub records as this fork's parent. The old note is kept, folded, so nobody re-derives it. * the redeploy command there now builds `app` as well. All three surfaces build from this source, and omitting the admin ATS is how ats.fiszu.com ended up running a 2026-07-13 image while both public boards were rebuilt on 2026-08-12. Baseline taken independently at 36a36b2 BEFORE any of this, so a break could be attributed rather than argued about — every step passed: npm ci · lint · typecheck · test (513) · audit · build · npm ci in node:22.22-alpine (npm 10.9.8) all exit 0 After the sync: ./verify.sh exit 0 (574 tests, 44 files) npm audit --audit-level=high exit 0, 0 vulnerabilities npm ci in node:22.22-alpine (npm 10.9.8) exit 0 ./check-no-workflows.sh exit 0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resyncs the deployed branch onto upstream tag
v1.6.0, completing the pair started by #11(which did the same for
main). 56 commits, 197 files.esc-liveservesjobs.escooterclinic.co.uk,remotecrew.co.uk/jobsand — through the sameimage —
ats.fiszu.com, the admin ATS holding candidate PII. It was 164 commits and tworeleases behind the real upstream, and nothing had measured that because the fork's
upstreamremote named a dead mirror (
hahzterry/reqcore) until5a924c5.Why the tag and not upstream HEAD
Upstream
mainhas been red since 2026-08-11 (npm ci, EUSAGE / missingoxc-parser@0.144.0).v1.6.0is the last green point, andesc-liveshares a real merge-base with it (f154021,2026-07-03) — so this is an ordinary merge, not a graft.
Gate — green, run locally
Upstream
v1.6.0carries plain carets on the AI-SDK family and is exposed the moment itslockfile is regenerated: the tail of every current AI-SDK major is under advisory, and
@ai-sdk/provider-utils4.0.41+ pullsundici ^5.29.0— all of undici 5.x sits insideGHSA-vrm6-8vpv-qv8q (HIGH). No fixed release exists inside those majors; the fix is
ai7 /@ai-sdk4 /provider-utils5, a breaking change through the scoring and shortlistingpath. This branch therefore carries dated
<ceilings as a freeze, not a fix, documented inthe
//ai-sdk-ceilingskey inpackage.jsonand filed as its own task. They must not outlivethat upgrade — they also block genuine fixes.
Database
Nine new migrations,
0036–0044. All purely additive —CREATE TABLE,ADD COLUMN,CREATE TYPE,CREATE INDEX; noDROP, noALTER COLUMN, noRENAME. They apply at boot viaserver/plugins/migrations.tsunder a Postgres advisory lock, so the three containers startingtogether cannot race. Because nothing is removed, a container still running the old image keeps
working against the migrated schema.
Also in this branch
overlay/esc/README.md: the "upstream went closed-source" note was wrong and had beensteering every reader for six weeks.
reqcore-inc/reqcoreis actively developed; the 2-commitstub that was read as upstream was a different repository. The false note is kept in a
<details>block so nobody re-derives it, under a correction that names the test:git merge-base --is-ancestordistinguishes a dead mirror from a dead project — a stalepushed_atonly suggests it.app. All three surfaces build from the same source, but thedocumented build list named only
app-publicandapp-esc. That is whyreqcore-appisrunning a 2026-07-13 image while the two public boards were rebuilt on 2026-08-12 — the
admin ATS, the one surface holding candidate PII, was a month stale by documentation.
sync-upstream.sh+.sync-upstream.confcarried onto this branch, so the next sync is acommand rather than a re-derivation.