Skip to content

chore(release): promote v0.16.4 - #234

Merged
scttbnsn merged 13 commits into
mainfrom
dev/v0.16
Aug 27, 2026
Merged

chore(release): promote v0.16.4#234
scttbnsn merged 13 commits into
mainfrom
dev/v0.16

Conversation

@scttbnsn

@scttbnsn scttbnsn commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Promotes the reviewed v0.16.4 candidate from the protected development line to main.

Feature PR: #233
Ancestry sync: #232

All required checks, two independent approvals, CodeQL, 3,856 repository tests, 761 web tests, Windows install smoke, Electron smoke, and release reviews passed on the candidate. Vercel preview was rate-limited at the account level; the repository website production build passed.

Changelog

✨ Added

  • Added native macOS updates with pinned electron-updater 6.8.9.
  • Added download progress, explicit Restart and install, persisted update state, and shutdown-aware installation.
  • Added atomic macOS release feeds with DMG, versioned updater ZIP, and latest-mac.yml.
  • Added feed integrity checks for version, filename, size, and SHA-512.
  • Added native N-to-N+1 update acceptance tests.
  • Added deep-ingest source retry and removal flows.
  • Added maximum office-day preferences from profile schema through search and eligibility checks.
  • Added validated embedded application URL extraction while preserving sourceUrl.
  • Added structured, user-facing error recovery actions.
  • Added a one-time GitHub star prompt after eligible searches.

🔧 Changed

  • Updated release workflows to require complete macOS updater feeds before publication.
  • Updated documentation for signed macOS updates and Windows self-update limitations.
  • Updated location-policy handling to normalize relocation: false to [].
  • Updated search and onboarding copy with clearer recovery instructions.
  • Updated desktop update state from release notifications to phase-based native updater state.

🐛 Fixed

  • Prevented misleading remote labels from bypassing body-based on-site and hybrid filtering.
  • Prevented roles that exceed max_commute_days_per_week from passing eligibility checks.
  • Improved deep-ingest recovery without re-drafting failed chunks.
  • Improved dedupe-only completion reporting.
  • Recognized onboarding questions followed by examples as unanswered turns.

🗑️ Removed

  • Removed GitHub Releases API polling and notify-only desktop update behavior.
  • Removed manual release-page download flow from the desktop update bridge.

⚠️ Breaking

  • Replaced the desktop preload openRelease bridge method with restartAndInstall.
  • Replaced the desktop update state contract with phase-based fields and actions.
  • Removed legacy update helper exports and release-notification fields.

🔒 Security

  • Decode embedded application links only once.
  • Reject malformed, credentialed, private, or untrusted application URLs.
  • Verify signed native update requests with Ed25519.
  • Verify updater ZIP bytes against latest-mac.yml SHA-512 and size metadata.
  • Keep Windows self-update disabled until the signing chain is complete.

Concerns

  • Vercel preview validation was rate-limited at the account level.
  • Windows self-update remains unavailable until signed executable and installer artifacts exist.
  • All consumers of the changed desktop update bridge contract must use restartAndInstall and the new phase fields.

Zero-duration sessions and empty PostHog page tables, same root cause
already fixed in portwing (CodesWhat/portwing#214): capture_pageleave was
false, so a session's last recorded timestamp is its last pageview and a
long read of one page scores as a bounce. PostHog's Web analytics Page,
Entry page, and Exit page tables key off $pathname, which the contract
never sent, so those tables return zero rows.

Flipping capture_pageleave alone fixes nothing. posthog-js only emits
$pageleave when the option is an explicit true (or "if_capture_pageview"
combined with capture_pageview enabled); both apps set capture_pageview
false and capture pageviews by hand, so it has to be true. Once posthog-js
emits $pageleave itself, it reaches before_send carrying PostHog's own raw
properties, and sanitizeEvent previously fell through to its final
`return null` for anything outside the pageview/CTA/web-vitals allowlist,
silently dropping every one.

This widens sanitizeEvent in both apps/website/src/lib/posthog-privacy.ts
and apps/docs/src/lib/posthog-privacy.ts to rebuild $pageleave the same
way as $pageview, and adds $pathname to both events' properties, bound to
the already-sanitized `path` value rather than the raw pathname. No
privacy option changes: cookieless_mode, person_profiles, persistence,
disable_persistence, respect_dnt, save_referrer, and save_campaign_params
are untouched.

No CHANGELOG entry: the closest precedent on this branch,
16800a7 "fix(website): permit analytics loader in csp", is the same size
and subsystem and didn't add one either; this repo's CHANGELOG entries
track shippable feature/release commits, not instrumentation fixes.

Part of X16 in the ops execution plan. The same change is still to come
for drydock, sockguard, and codeswhat.com.
Replace the bespoke inline footer in page.tsx with the CodesWhat house
pattern: a brand-peer band with product identity (name, blurb, product
links) on the left and the CodesWhat pill (coin, "A CodesWhat project",
arrow) on the right, followed by a license/copyright line. The pattern
comes from codeswhat-components/templates/web-shell's footer.tsx; this
site has no Tailwind, so it's recreated in careerrat's own plain-CSS/BEM
idiom instead of ported verbatim.

The footer is now its own component (src/components/Footer.tsx) instead
of inline markup, split into a Product column (Docs, Code signing
policy) and a Project column (GitHub, Releases, License), matching the
house Product/Project split.

Kept from the old footer: all five links (Docs, GitHub, Releases, Code
signing policy, License), the copyright line, and the CodesWhat pill
with the coin logo. Changed to match the house pattern: the pill now
links to https://github.com/CodesWhat (the template's canonical target)
instead of https://codeswhat.com, and the copyright line now names the
MIT License and links to it, matching the template's "released under
the X License" convention.

CTA tracking in the footer is deferred. The footer links are plain
links for now because ALLOWED_PLACEMENTS in posthog-privacy.ts doesn't
have a "footer" entry yet, and that file is owned by an in-flight PR
adding pageleave instrumentation. Once that placement lands, the footer
links can move to TrackedLink like the other CodesWhat sites.

Updated tests/website-copy.test.mjs's footer assertions to read the new
Footer.tsx component instead of page.tsx.
feat(analytics): capture $pageleave and send $pathname
Completes the v0.16.3 first-run, search relevance and locality, provider/runtime, chat, demographic-default privacy, supervised browser-apply, desktop UI, website, documentation, and QA work.
Marks v0.16.3 as the current public release across README, install docs, roadmap, and the tested copy contract while preserving historical release evidence.
@vercel

vercel Bot commented Aug 27, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
careerrat-website Ready Ready Preview Aug 27, 2026 3:31am

@biggest-littlest biggest-littlest left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the promotion ancestry and verified it matches the approved v0.16.4 candidate.

@ALARGECOMPANY ALARGECOMPANY left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified the promotion contains the reviewed v0.16.4 candidate with no independent changes.

@coderabbitai

coderabbitai Bot commented Aug 27, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: fe3da02f-05d8-4eb8-bdfe-cabf75cf785e

📥 Commits

Reviewing files that changed from the base of the PR and between 646c665 and 530c839.

⛔ Files ignored due to path filters (2)
  • CHANGELOG.md is excluded by !CHANGELOG.md
  • package-lock.json is excluded by !**/package-lock.json, !**/package-lock.json
📒 Files selected for processing (83)
  • .github/workflows/desktop-release.yml
  • .github/workflows/publish.yml
  • .github/workflows/release-assets.yml
  • README.md
  • apps/desktop/README.md
  • apps/desktop/electron-builder.yml
  • apps/desktop/main.mjs
  • apps/desktop/native-update-acceptance.mjs
  • apps/desktop/package.json
  • apps/desktop/preload/update-check-preload.cjs
  • apps/desktop/release-verification.mjs
  • apps/desktop/scripts/release-upload.mjs
  • apps/desktop/scripts/verify-native-update.mjs
  • apps/desktop/scripts/verify-release.mjs
  • apps/desktop/update-check.mjs
  • apps/docs/content/docs/advanced/privacy.mdx
  • apps/docs/content/docs/getting-started/install.mdx
  • apps/docs/content/docs/getting-started/keeping-current.mdx
  • apps/web/src/chat-first/ChatFirstApp.jsx
  • apps/web/src/chat-first/ChatFirstApp.test.jsx
  • apps/web/src/chat-first/FirstRunController.jsx
  • apps/web/src/chat-first/FirstRunController.test.jsx
  • apps/web/src/chat-first/GithubStarPrompt.jsx
  • apps/web/src/chat-first/GithubStarPrompt.test.jsx
  • apps/web/src/chat-first/ProfileSettings.jsx
  • apps/web/src/chat-first/ProfileSettings.test.jsx
  • apps/web/src/chat-first/ProfileSettingsController.jsx
  • apps/web/src/chat-first/ProfileSettingsController.test.jsx
  • apps/web/src/chat-first/WorkspaceBrowser.jsx
  • apps/web/src/chat-first/WorkspaceBrowser.test.jsx
  • apps/web/src/chat-first/api.js
  • apps/web/src/chat-first/chat-first-icons.jsx
  • apps/web/src/chat-first/chat-first.css
  • apps/web/src/chat-first/conversation-surfaces.jsx
  • apps/web/src/chat-first/conversation-surfaces.test.jsx
  • apps/web/src/chat-first/dashboard-context.test.jsx
  • apps/web/src/chat-first/deep-ingest-controller.js
  • apps/web/src/chat-first/deep-ingest-controller.test.js
  • apps/web/src/chat-first/desktop-update.js
  • apps/web/src/chat-first/desktop-update.test.jsx
  • apps/web/src/chat-first/profile-settings-controller.js
  • apps/web/src/chat-first/profile-settings-controller.test.js
  • apps/web/src/chat-first/workspace-shell.jsx
  • apps/web/src/chat-first/workspace-shell.test.jsx
  • apps/web/src/jobs/jobsSearch.js
  • apps/web/src/jobs/jobsSearch.test.js
  • apps/web/src/lib/api.js
  • apps/web/src/lib/api.test.js
  • apps/web/src/lib/errorCopy.js
  • apps/web/src/lib/errorCopy.test.js
  • apps/website/src/app/page.tsx
  • config/profile.schema.json
  • docs/ARCHITECTURE.md
  • docs/RELEASE.md
  • docs/ROADMAP.md
  • docs/WINDOWS.md
  • package.json
  • src/cli/deep-ingest-route.mjs
  • src/core/ai/skill-runtime.mjs
  • src/core/db/verbs/candidate.mjs
  • src/core/db/verbs/chat-first.mjs
  • src/core/intake/resolve.mjs
  • src/core/onboarding/transcript-cleanup.mjs
  • src/core/profile/candidate-defaults.mjs
  • src/core/scoring/sourced-scanner.mjs
  • src/core/search/search-prompts.mjs
  • tests/chat-runtime.test.mjs
  • tests/db-verbs.test.mjs
  • tests/deep-ingest-route.test.mjs
  • tests/desktop-docs-release.test.mjs
  • tests/desktop-native-update-acceptance.test.mjs
  • tests/desktop-native-update-runner.test.mjs
  • tests/desktop-package-resources.test.mjs
  • tests/desktop-runtime.test.mjs
  • tests/desktop-update-check.test.mjs
  • tests/intake-resolve.test.mjs
  • tests/location-policy-regression.test.mjs
  • tests/onboarding-chat-draft.test.mjs
  • tests/provider-docs-copy.test.mjs
  • tests/readme-chat-first.test.mjs
  • tests/release-workflow-chain.test.mjs
  • tests/search-prompts.test.mjs
  • tests/windows-desktop-release.test.mjs

📝 Walkthrough

Walkthrough

The update changes macOS releases to an atomic DMG, updater ZIP, and latest-mac.yml bundle. Native update acceptance verifies signed N-to-N+1 transitions before upload. The desktop app uses typed updater phases and installs only after explicit restart and shutdown. Web recovery flows now provide structured errors, retry actions, source recovery, and a GitHub star prompt. Profile location data supports maximum office days. Search uses job-body workplace requirements. Intake resolution validates embedded application URLs. Version and release documentation now describe the v0.16.4 candidate.

Suggested labels: second-opinion

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev/v0.16

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@scttbnsn
scttbnsn merged commit f4f8529 into main Aug 27, 2026
28 of 29 checks passed
scttbnsn added a commit that referenced this pull request Aug 27, 2026
#241)

Four of careerrat's six CI failures since 08-20 are one cause. `npm ci`
died with a misleading `EUSAGE: can only install with an existing
package-lock.json` on #206 and #208 while the lockfile was plainly
committed. The real error only appears when you run what Renovate runs:

    npm error code EOVERRIDE
    npm error Override for sharp@0.35.3 conflicts with direct dependency

`overrides.sharp` was a literal `^0.35.0` while `sharp` is also a root
devDependency. Pinning the direct dep made the two specs diverge, npm
refused to regenerate the lockfile, `renovate/artifacts` went red, and
Renovate pushed the package.json change anyway. CI then met a package.json
and a lockfile that disagree, which npm 11 reports as a *missing* lockfile
rather than a stale one.

- fix(deps): point `overrides.sharp` at `$sharp` so the override follows
  the direct dependency instead of being a second copy of it. Resolves to
  `^0.35.0` today, so the lockfile is byte-identical and nothing moves.
  Verified by replaying #206's pin on top: lockfile regenerates and
  `npm ci` accepts it, where before it was EOVERRIDE then EUSAGE.
- chore(config): set `baseBranchPatterns` to the active dev line. All four
  open dependency PRs target `main`, which the release flow forbids as an
  independent commit target; sockguard and portwing already pin theirs.
- ci(greptile): skip the summon when the PR is already closed. A label can
  land after close and the frozen reusable workflow fails loudly rather
  than no-opping ("Pull request #234 is closed"). Staying strict is right
  for the shared workflow, so the guard belongs in the caller.

#208 is a separate cause and is not fixed here: `@vitejs/plugin-react@6`
peer-requires `vite@^8` against a pinned `vite@6.4.3`, and no vite major
PR exists, so it cannot resolve alone. That wants an ecosystem group in
the shared preset.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants