Originally created by: Akarsh-Hegde
Promotes pre-main (staging, verified end-to-end on the staging DMG channel) to main (production). 24 commits across 5 merged feature/fix PRs plus the two standalone hotfixes that landed after the last one, spanning auth, integrations, worklog routing, tray reliability, capture stability, and the CI/release pipeline itself.
git merge-tree against the current tips shows real conflicts in 3 files, all CI/release-pipeline config: .github/workflows/ci.yml, .github/workflows/release-prepare.yml, .releaserc.json. Everything else (Cargo.lock, Cargo.toml, tray/src-tauri/Cargo.toml, tray/src-tauri/src/commands/integrations.rs, ui/lib/integrations.ts) auto-merges cleanly.
Root cause: main picked up its own direct CI hotfixes after the last two release PRs (#517, [#522] — the squash-merge incident described in release-prepare.yml) that were never backported to pre-main. Both branches then independently rebuilt large chunks of ci.yml (the Silicon-only single-Rust-job redesign) in near-identical but not textually identical ways, so the same regions collide.
Please resolve manually (merge commit, not squash — see the note in commit afb5e631 and release-prepare.yml's own guard) and preserve pre-main's side on:
ci.yml: cache save-if should target pre-main (not main) and keep add-job-id-key: false / shared-key: ci-macos-silicon — that's a deliberate change from pre-main (perf(ci) [#514]/#515 follow-up) so PRs go warm without waiting for a release. Also keep the bumped screenpipe MIT-pin hash (064c44cc…, from [#524]) over main's older 825b038d….release-prepare.yml: main independently added a loud-failure guard ("no releasable commits on main" / squash-merge warning, from the [#517]/#522 incident fix) that pre-main never received — make sure conflict resolution keeps that guard, it's a real regression risk if dropped..releaserc.json: main deliberately dropped the [skip ci] marker from the release commit message (see release-prepare.yml's comment on why); keep that removal.RequireSignIn now gates the whole dashboard behind a live Clerk session, re-locking immediately on sign-out; the vanilla-JS tray popover mirrors the lock via get_account_email (re-checked on window focus) and routes its CTA to the dashboard's sign-in screen, since it can't host Clerk directly. README and dashboard metadata copy refreshed to match.389f1996, 36d2baba, a7160764) — reworked device-flow and PAT connect UX in IntegrationConnect.tsx/integrations.ts: copy button flips to "✓ Copied" for 1.5s, three-numbered-step code entry, a guided device-flow checklist, project-picker continuity across reconnects, and a fix for a latched discovery error. Includes an em-dash → plain-hyphen fix in the PAT reload warning (user-facing text rule).f3ebc02c, e36e605e) — proposed worklog tickets no longer always land on config.pm_providers.first() (previously always Jira when both Jira and GitHub were connected); the task card's provider corner-icon now reflects the actual choice. Added test coverage for the toolbar's multi-provider "Connected" pill.daemon_quiet notice on tray restart (#519 — ac8c073d, 1e1ad198) — fixes a field-reported bug where the "Meridian went quiet" banner could get stuck forever with no way to clear it short of a manual DB delete; adds an end-to-end DB-backed regression test.daily_usage to dashboard stats, make sends retry-safe (#505 — 7cd3f720) — daily_usage now computes focus_hours/coding_hours/logged_hours/drafts_count identically to the dashboard's Today card (previously focus_hours read a different field and coding_hours didn't exist); sends only advance on a confirmed PostHog 2xx, so failures retry instead of silently dropping; added a single-flight guard against overlapping ticks; removed the now-redundant person_identified event.d4e467b6, ddcb6212) — follow-up to the macOS 26 sck-rs double-free/abort fix, extending the disable to every macOS version rather than gating it to 26+; bumps the screenpipe MIT-pin guard's expected hash accordingly (two Meridiona-authored commits, no upstream merge past the MIT cutoff).This cycle also carried substantial work on the release pipeline itself — the reason the conflict section above matters:
pre-main push without a commit-message marker (#511, [#512]), fixed the staging build not actually firing / not compiling / notarizing with blank creds (#513, [#516]), warmed the release cache and skipped staging notarization for speed (#514), migrated production onto the same Silicon-only two-workflow pipeline (#515), fixed the tag-triggered push losing its token binding + a template-injection finding from CodeRabbit review (#518), and stopped re-running the full CI suite on pre-main → main release PRs since main holds nothing pre-main lacks except version bumps (#521).main, this exact PR is where that guard needs to survive — see the conflict note above).pre-main, and again on the push to pre-main.pre-main has been running on the staging DMG auto-update channel.release-build.yml actually fires off the tag main's release-prepare.yml cuts (the exact failure mode [#513]/#518 exist to prevent).
Tickets: #512
Tickets: #513
Tickets: #514
Tickets: #516
Tickets: #517
Tickets: #522
Tickets: #524
Tickets: #530
Tickets: #533
Originally posted by: coderabbitai[bot]
📝 Walkthrough
## Walkthrough The PR restructures CI and release automation, adds target-aware updater packaging, introduces proposed-worklog provider selection and local task statuses, revises GitHub connection flows, gates tray and dashboard features behind sign-in, improves analytics and health reconciliation, and updates timeline and composer behavior. ### Changes **Release automation** |Layer / File(s)|Summary| |---|---| |**Workflow orchestration**`.github/workflows/*`, `.releaserc*`, `Cargo.toml`|Adds cache warming, gated CI, tag preparation, draft release builds, publishing, and explicit release profile settings.| |**Release artifacts**
`scripts/*`|Adds manifest composition and target-aware packaging, signing, verification, notarization, and updater-channel mirroring.| **Application behavior** |Layer / File(s)|Summary| |---|---| |**Worklog provider selection**
`meridian-core/...`, `tray/src-tauri/src/commands/*`, `ui/components/timeline/*`, `ui/__tests__/*`|Allows drafted proposals to switch connected providers through guarded backend and frontend flows.| |**Integrations and GitHub flow**
`tray/src-tauri/src/commands/integrations.rs`, `ui/components/IntegrationConnect.tsx`, `ui/lib/integrations.ts`|Centralizes provider detection and adds guided GitHub device authorization, project selection, and retry handling.| |**Tray state and sign-in**
`tray/src-tauri/src/analytics.rs`, `tray/src-tauri/src/poll/*`, `tray/src/app.js`, `ui/app/setup/signin/*`|Adds retryable single-flight analytics, stale health-notice reconciliation, and sign-in gates for tray and dashboard content.| |**Personal task statuses**
`meridian-core/src/readers/task_create.rs`, `tray/src-tauri/src/commands/statuses.rs`, `ui/components/timeline/*`|Adds database-backed local status listing and updates while preserving CLI handling for tracker-owned tasks.| |**Composer and timeline UI**
`ui/components/plan/*`, `ui/components/timeline/*`, `ui/__tests__/*`|Supports board-provider state, multiple connected-provider indicators, plan refresh, measured task summaries, and pixel-aligned timeline positions.| |**Build and product support**
`tray/src-tauri/Cargo.toml`, `README.md`, `ui/app/layout.tsx`, `ui/app/page.tsx`|Updates desktop crate linkage, pinned capture dependencies, test database support, and product-facing descriptions and sign-in entry points.| **Estimated code review effort:** 5 (Critical) | ~120 minutes **Possibly related issues** - [Meridiona/meridian#376](https://github.com/Meridiona/meridian/issues/376) — Adds proposal-provider selection behavior aligned with the issue’s provider/posting concern. **Possibly related PRs** - [[Meridiona/meridian#522](https://github.com/Meridiona/meridian/issues/522)](https://github.com/Meridiona/meridian/pull/522) — Directly overlaps the release pipeline and worklog provider-selection changes. - [[Meridiona/meridian#517](https://github.com/Meridiona/meridian/issues/517)](https://github.com/Meridiona/meridian/pull/517) — Shares the release workflow split and provider-selection plumbing. - [[Meridiona/meridian#393](https://github.com/Meridiona/meridian/issues/393)](https://github.com/Meridiona/meridian/pull/393) — Shares the GitHub OAuth device-flow implementation and UI wiring. **Suggested reviewers:** `adityaharishch` **Poem** > A rabbit hops through tags and builds, > While drafts choose boards with careful thrills. > GitHub’s little steps now shine, > Health notices clear in time. > The timeline settles pixel-right.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
| Check name | Status | Explanation | | :------------------------: | :------- | :------------------------------------------------------------------------------------------------------------------------ | | Title check | ✅ Passed | The title is concise and accurately summarizes the release promotion and major areas changed. | | Description check | ✅ Passed | The description covers the PR purpose, changes, and test plan, but it does not follow the repo template sections exactly. | | Docstring Coverage | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. | | Linked Issues check | ✅ Passed | Check skipped because no linked issues were found for this pull request. | | Out of Scope Changes check | ✅ Passed | Check skipped because no linked issues were found for this pull request. |✨ Finishing Touches
🧪 Generate unit tests (beta)
- [ ] Create PR with unit tests - [ ] Commit unit tests in branch `pre-main`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
- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)Comment
@coderabbitai helpto get the list of available commands.Related
Commit: [107b20]
Originally posted by: Akarsh-Hegde
Status update
CodeRabbit review — resolved
Went through all 9 actionable findings against the current tip of
pre-main:[skip ci]in.releaserc.json) — no action needed, thread auto-resolved.pre-main, per the no-direct-push-to-pre-main/main rule): thecache-warm.ymlstaging-vs-stable Tauri config mismatch, therelease-prepare.ymlSummary step's unbound${{ steps.*.outputs }}interpolation, andnotarize-dmg.shmissingMERIDIAN_TARGETvalidation.ci.ymlaggregate-gate suggestion (moot — neithermainnorpre-mainhas branch protection configured, so nothing can currently get stuck on a skipped check), themirror-updater-channel.sh/mirror-staging-release.shde-dup (heavy lift refactor of two release-critical scripts, not worth the risk here), the README hyphen→em-dash nit (docs are exempt from the plain-hyphen rule per CLAUDE.md — declining, not a defect), and the fragile char-offset test window (trivial/low-value, left as-is).All 8 open threads replied to and resolved; the 9th was already resolved by CodeRabbit itself.
Merge conflict — down to 1, and it's a merge-time resolution, not a pre-main fix
Since this PR opened, [#526]/#527 landed on
pre-mainand cleared 2 of the original 3 conflicting files (release-prepare.yml,.releaserc.json). One remains:.github/workflows/ci.yml, and it's two small hunks:[skip ci]marker —pre-main's wording ("used to carry") is already the corrected version;main's is stale.expectedhash —pre-mainhas the newer064c44cc…(from [#524]);mainstill has the older825b038d….Keep
pre-main's side on both hunks when merging. This can't be resolved by pushing anything topre-mainfirst — I checked, and both ways of doing that have a real downside:git merge origin/mainintopre-mainresolves the conflict, but also dragsmain's version-bump bookkeeping (Cargo.toml,CHANGELOG.md,package.jsons) ontopre-main— exactly what [#526] deliberately avoided doing, per its own description.pre-main's content, discardmain's) fixes the conflict without that pollution, but is worse: it makesmain's current tip the new merge-base, and sincepre-main'sCargo.tomlstill reads1.71.0, the next real merge would then look likepre-mainunilaterally downgradingmain's version from1.74.xback to1.71.0— a silent regression on the one branch that must never regress.So: please resolve this locally at merge time (
git checkout main && git merge --no-ff pre-main, keeppre-main's side on bothci.ymlhunks, push) rather than via GitHub's web "Resolve conflicts" button — that button back-mergesmainintopre-mainfirst, which reintroduces the exact pollution [#526] avoided.Before merging
pre-mainfirst (the 3 CodeRabbit fixes above)afb5e631/release-prepare.yml's own guard against exactly this)ci.ymlconflict locally, keepingpre-main's side on both hunksrelease-build.ymlactually fires off the tagrelease-prepare.ymlcuts after mergeRelated
Tickets:
#524Tickets:
#526Originally posted by: Akarsh-Hegde
Conflict resolved
Opened Meridiona/meridian#533 (
pre-main) — a real merge ofmainintopre-mainthat resolves the last remaining conflict here (the two smallci.ymlhunks), keepingpre-main's side on both (corrected comment wording + the newer screenpipe pin hash). Verified clean: no stray conflict markers,ci.ymldiffed againstmainshows only the two intended hunks, full pre-push suite green.Once [#533] is merged into
pre-main, this PR should flip fromCONFLICTINGtoMERGEABLE.Ready-to-merge checklist
pre-main(clears the conflict)afb5e631/release-prepare.yml's own guard against exactly that failure mode)release-build.ymlactually fires off the tagrelease-prepare.ymlcuts after mergeRelated
Tickets:
#533Originally posted by: Akarsh-Hegde
Update
New CodeRabbit finding fixed: as
pre-mainhas grown with more merged feature work, CodeRabbit's re-review caught a real bug inTaskDetailDialog.tsx(StatusBanner's Undo/dismiss clicks weren't stopping propagation, so they bubbled up and closed the whole dialog). Fixed in Meridiona/meridian#534 →pre-main. Thread replied to and resolved.All 10 review conversation threads on this PR are now resolved.
On the merge conflict: it's still showing because Meridiona/meridian#533 (the fix from my last update) hasn't been merged into
pre-mainyet — that's expected, not a new conflict. To recap the path to green:pre-main(resolves theci.ymlconflict)pre-main(the StatusBanner fix above)MERGEABLEI'll keep triaging new CodeRabbit findings as
pre-mainpicks up more merged work in the meantime, but the conflict itself needs [#533] merged — that's the one step only you can do.Related
Tickets:
#533Tickets:
#534Ticket changed by: Akarsh-Hegde