Skip to content

chore: sync the deployed branch onto upstream tag v1.6.0 - #12

Merged
escooterclinic merged 56 commits into
esc-livefrom
chore/sync-esc-live-v1.6.0
Aug 12, 2026
Merged

chore: sync the deployed branch onto upstream tag v1.6.0#12
escooterclinic merged 56 commits into
esc-livefrom
chore/sync-esc-live-v1.6.0

Conversation

@escooterclinic

Copy link
Copy Markdown

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-live serves jobs.escooterclinic.co.uk, remotecrew.co.uk/jobs and — through the same
image — ats.fiszu.com, the admin ATS holding candidate PII. It was 164 commits and two
releases behind
the real upstream, and nothing had measured that because the fork's upstream
remote named a dead mirror (hahzterry/reqcore) until 5a924c5.

Why the tag and not upstream HEAD

Upstream main has been red since 2026-08-11 (npm ci, EUSAGE / missing oxc-parser@0.144.0).
v1.6.0 is the last green point, and esc-live shares a real merge-base with it (f154021,
2026-07-03) — so this is an ordinary merge, not a graft.

Gate — green, run locally

== no-workflows ==            pass
== install ==                 npm ci, found 0 vulnerabilities
== lint ==                    pass
== typecheck ==               pass
== tests ==                   44 files, 574 tests, all passed
== dependency audit ==        found 0 vulnerabilities
== build ==                   pass
verify: all push gates passed.

Upstream v1.6.0 carries plain carets on the AI-SDK family and is exposed the moment its
lockfile is regenerated: the tail of every current AI-SDK major is under advisory, and
@ai-sdk/provider-utils 4.0.41+ pulls undici ^5.29.0 — all of undici 5.x sits inside
GHSA-vrm6-8vpv-qv8q (HIGH). No fixed release exists inside those majors; the fix is
ai 7 / @ai-sdk 4 / provider-utils 5, a breaking change through the scoring and shortlisting
path. This branch therefore carries dated < ceilings as a freeze, not a fix, documented in
the //ai-sdk-ceilings key in package.json and filed as its own task. They must not outlive
that upgrade — they also block genuine fixes.

Database

Nine new migrations, 00360044. All purely additiveCREATE TABLE, ADD COLUMN,
CREATE TYPE, CREATE INDEX; no DROP, no ALTER COLUMN, no RENAME. They apply at boot via
server/plugins/migrations.ts under a Postgres advisory lock, so the three containers starting
together 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 been
    steering every reader for six weeks. reqcore-inc/reqcore is actively developed; the 2-commit
    stub 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-ancestor distinguishes a dead mirror from a dead project — a stale
    pushed_at only suggests it.
  • The redeploy command omitted app. All three surfaces build from the same source, but the
    documented build list named only app-public and app-esc. That is why reqcore-app is
    running 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.conf carried onto this branch, so the next sync is a
    command rather than a re-derivation.

dependabot Bot and others added 30 commits July 6, 2026 04:15
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.
JoachimLK and others added 26 commits July 12, 2026 11:13
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
@escooterclinic
escooterclinic merged commit a6b92a2 into esc-live Aug 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants