Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
4566c6d
fix(clerk): retry sign-in init on a network failure instead of a dead…
Akarsh-Hegde Aug 25, 2026
8dff611
Merge pull request #892 from Meridiona/fix/clerk-init-network-retry
Akarsh-Hegde Aug 25, 2026
8bc11cd
Merge remote-tracking branch 'origin/main' into chore/backmerge-v1.90.0
github-actions[bot] Aug 25, 2026
e672424
Merge pull request #896 from Meridiona/chore/backmerge-v1.90.0
Akarsh-Hegde Aug 25, 2026
23b4a66
fix(ui): cut What's New down to a title and one sentence per entry
adityaharishch Aug 25, 2026
790954a
fix(tray): repaint the offline banner as soon as the daemon+DB are ready
Akarsh-Hegde Aug 25, 2026
94f7982
fix(llm): show an actionable message when a sign-in CLI crashes at No…
Akarsh-Hegde Aug 25, 2026
d92131e
fix(llm): shell-quote resolved paths in the installer command builder
Akarsh-Hegde Aug 25, 2026
31730fb
fix(coding-agent): move the summariser's codex/claude prompt off argv…
Akarsh-Hegde Aug 25, 2026
a212ccf
chore: revert copilot.rs comment, leave file untouched
Akarsh-Hegde Aug 25, 2026
3710d13
Merge remote-tracking branch 'origin/pre-main' into fix/whats-new-bre…
adityaharishch Aug 26, 2026
6230666
fix(infra): assert the gateway's 401 instead of printing a reminder a…
Akarsh-Hegde Aug 26, 2026
a4715fa
fix(daemon): make single-instance acquisition atomic with an OS lock
Akarsh-Hegde Aug 26, 2026
345e944
Merge pull request #898 from Meridiona/fix/whats-new-brevity
adityaharishch Aug 26, 2026
807a795
Merge pull request #900 from Meridiona/fix/tray-offline-startup-lag
Akarsh-Hegde Aug 26, 2026
d5b089d
Merge pull request #901 from Meridiona/fix/codex-signin-node-esm-crash
Akarsh-Hegde Aug 26, 2026
02657c3
fix(llm): make the health-gate exemption's outcome visible in shipped…
Akarsh-Hegde Aug 26, 2026
1f46407
feat(observability): make a daemon generation identifiable and its qu…
Akarsh-Hegde Aug 26, 2026
215f99a
fix(coding-agent): move the summariser's cursor-agent prompt off argv…
Akarsh-Hegde Aug 26, 2026
bd048b5
fix(daemon): put a pid on the three stand-down WARNs
Akarsh-Hegde Aug 26, 2026
a1d63b6
Merge pull request #902 from Meridiona/fix/deploy-gateway-verify-401
Akarsh-Hegde Aug 26, 2026
6aacdee
Merge pull request #903 from Meridiona/fix/daemon-single-instance-lock
Akarsh-Hegde Aug 26, 2026
cbe03e0
Merge pull request #906 from Meridiona/fix/codex-signin-node-esm-crash
Akarsh-Hegde Aug 26, 2026
2915410
Merge pull request #907 from Meridiona/feat/daemon-lifecycle-instrume…
Akarsh-Hegde Aug 26, 2026
cd296a9
fix(infra): stop an unknown argument from triggering a production deploy
Akarsh-Hegde Aug 26, 2026
888de37
Merge pull request #908 from Meridiona/fix/deploy-gateway-unknown-flag
Akarsh-Hegde Aug 26, 2026
e4e8e59
fix(sync): make the daemon the sole owner of the rotating Jira OAuth …
adityaharishch Aug 26, 2026
9b5057f
fix(sync): explain the update window instead of leaking a SQL error
adityaharishch Aug 26, 2026
a6ee296
Merge pull request #909 from Meridiona/fix/single-owner-pm-sync
adityaharishch Aug 26, 2026
d6eec94
fix(sync): report sync outcomes by sequence and stop caching db pools
adityaharishch Aug 26, 2026
6bfa9fb
Merge branch 'pre-main' into fix/pm-sync-outcome-and-pool-lifetime
adityaharishch Aug 26, 2026
d6befe4
Merge pull request #910 from Meridiona/fix/pm-sync-outcome-and-pool-l…
adityaharishch Aug 26, 2026
7b13f6d
Revert "Merge pull request #910 from Meridiona/fix/pm-sync-outcome-an…
adityaharishch Aug 26, 2026
fd0db1e
Revert "Merge pull request #909 from Meridiona/fix/single-owner-pm-sync"
adityaharishch Aug 26, 2026
99799af
revert: keep migrations 082 and 083 after backing out the outbox
adityaharishch Aug 26, 2026
8e8cb06
Merge pull request #912 from Meridiona/revert/pm-sync-outbox
adityaharishch Aug 26, 2026
0e4c505
fix(release): a revert must be able to cut a release
adityaharishch Aug 26, 2026
e8c4245
fix: the CodeRabbit findings on #899, all of them in code I wrote
Akarsh-Hegde Aug 27, 2026
099e9b3
Merge pull request #913 from Meridiona/fix/release-reverts-can-ship
adityaharishch Aug 27, 2026
41f8a60
ci(release): pin the Windows runner and make a cold build loud
adityaharishch Aug 27, 2026
c0605cd
Merge pull request #915 from Meridiona/ci/windows-runner-pin-and-cold…
adityaharishch Aug 27, 2026
b4f33de
fix(telemetry): stop subprocess stderr reaching central OO through th…
Akarsh-Hegde Aug 27, 2026
e5dc92f
fix(telemetry): close three coverage holes in the log-body lint
Akarsh-Hegde Aug 27, 2026
97284c3
fix(intelligence): sync PM tasks on demand instead of on a timer
adityaharishch Aug 27, 2026
4a0a2fc
fix(oauth): make the Jira refresh-token exchange crash- and suspend-safe
adityaharishch Aug 28, 2026
6c05411
Merge pull request #914 from Meridiona/fix/coderabbit-899-findings
Akarsh-Hegde Aug 28, 2026
7a8aa53
Merge pull request #917 from Meridiona/fix/pm-sync-on-demand
adityaharishch Aug 28, 2026
f8ef28c
fix(daemon): bound background-task shutdown and stop dev tray false-i…
adityaharishch Aug 31, 2026
7cce8c1
Merge pull request #918 from Meridiona/fix/daemon-shutdown-db-hold-an…
adityaharishch Aug 31, 2026
0dc9bf4
fix(cli): reject unrecognised flags instead of running the command bare
adityaharishch Sep 1, 2026
8eb4205
fix(etl): recover from the corruption latch instead of stopping forever
adityaharishch Sep 1, 2026
3fe39c4
fix(summariser): bound rate-limited retries and pace a failing queue
adityaharishch Sep 1, 2026
b64b780
fix(cli): add the restart subcommand five remedies already recommend
adityaharishch Sep 1, 2026
1c39edf
fix(telemetry): batch the spool and bound sent/ and quarantine/
adityaharishch Sep 1, 2026
b30e789
feat(llm): connect any OpenAI-compatible endpoint, local or cloud
Akarsh-Hegde Sep 1, 2026
fca4f08
fix(llm): never overwrite a typed model id when listing models
Akarsh-Hegde Sep 1, 2026
b0ba1d6
fix(llm): drop "Optional" from the API key placeholder
Akarsh-Hegde Sep 1, 2026
473654f
feat(llm): warn that a custom endpoint's usage is billed to the user
Akarsh-Hegde Sep 1, 2026
9394293
fix(llm): say plainly that the key never reaches Meridian
Akarsh-Hegde Sep 1, 2026
cea459b
fix(install): scope the staging stop to the daemon binary, not the da…
adityaharishch Sep 1, 2026
ae17201
Merge branch 'pre-main' into fix/cli-reject-unknown-flags
adityaharishch Sep 1, 2026
28d9108
Merge branch 'pre-main' into fix/etl-corruption-latch-recovery
adityaharishch Sep 1, 2026
8afed53
Merge branch 'pre-main' into fix/telemetry-spool-volume
adityaharishch Sep 1, 2026
aaabffa
fix(cli): a flag's value that begins with a hyphen is not an unknown …
adityaharishch Sep 1, 2026
5e755bc
fix(telemetry): widen the batch queue to match the 30s export delay
adityaharishch Sep 1, 2026
e3dc9ac
fix(summariser): merge pre-main, and fix a vacuous test and an invert…
adityaharishch Sep 1, 2026
0fe4684
Merge pull request #920 from Meridiona/fix/cli-reject-unknown-flags
adityaharishch Sep 1, 2026
85c9057
Merge branch 'pre-main' into fix/etl-corruption-latch-recovery
adityaharishch Sep 1, 2026
ecd3ad9
Merge branch 'pre-main' into fix/telemetry-spool-volume
adityaharishch Sep 1, 2026
7a31deb
Merge branch 'pre-main' into feat/custom-openai-endpoint
adityaharishch Sep 1, 2026
65d6492
Merge branch 'pre-main' into fix/staging-daemon-scope-not-db-scope
adityaharishch Sep 1, 2026
d1baab3
fix(test): the recheck-throttle test must not underflow Instant on Wi…
adityaharishch Sep 1, 2026
0fdc411
Merge branch 'pre-main' into fix/summariser-immortal-rows-and-fork-storm
adityaharishch Sep 1, 2026
c77f0ba
Merge pull request #921 from Meridiona/fix/etl-corruption-latch-recovery
adityaharishch Sep 1, 2026
41911b5
fix(test): stop the sent-cap tests exporting an env var into their si…
adityaharishch Sep 1, 2026
5bfd5da
Merge pull request #922 from Meridiona/fix/summariser-immortal-rows-a…
adityaharishch Sep 1, 2026
aab76fc
Merge pull request #923 from Meridiona/fix/daemon-restart-subcommand
adityaharishch Sep 1, 2026
b4a5704
Merge branch 'pre-main' into fix/telemetry-spool-volume
adityaharishch Sep 1, 2026
69179bb
Merge branch 'pre-main' into fix/staging-daemon-scope-not-db-scope
adityaharishch Sep 1, 2026
996c73a
Merge branch 'pre-main' into feat/custom-openai-endpoint
adityaharishch Sep 1, 2026
48d0584
Merge pull request #924 from Meridiona/fix/telemetry-spool-volume
adityaharishch Sep 1, 2026
761233e
Merge pull request #925 from Meridiona/feat/custom-openai-endpoint
adityaharishch Sep 1, 2026
32f8b60
Merge pull request #926 from Meridiona/fix/staging-daemon-scope-not-d…
adityaharishch Sep 1, 2026
01550c1
feat(auth): add the OTP Cloudflare Worker (send/verify email codes vi…
Akarsh-Hegde Sep 3, 2026
c9f1559
fix(auth): replace Clerk with a one-time email+OTP capture
Akarsh-Hegde Sep 3, 2026
20b4385
fix(analytics): stop disabling GeoIP on PostHog events
adityaharishch Sep 3, 2026
15cb0b0
Merge pull request #928 from Meridiona/fix/posthog-enable-geoip
adityaharishch Sep 5, 2026
486c98f
feat(otp-worker): styled HTML verification email, and a daily-cap alert
Akarsh-Hegde Sep 5, 2026
665d2a9
Merge pull request #916 from Meridiona/fix/telemetry-log-body-user-data
Akarsh-Hegde Sep 5, 2026
23dd3dd
Merge pull request #929 from Meridiona/feat/otp-email-capture
Akarsh-Hegde Sep 5, 2026
01bdc17
fix(review): resolve the still-valid review findings on the v1.91.0 r…
Akarsh-Hegde Sep 5, 2026
dfbc63f
Merge pull request #933 from Meridiona/fix/pr899-review-followups
Akarsh-Hegde Sep 5, 2026
a9255c1
feat(otp-worker): notify company@meridiona.com on sign-up or email ch…
Akarsh-Hegde Sep 5, 2026
824d954
chore(release): back-merge main into pre-main, dropping the dead Cler…
Akarsh-Hegde Sep 5, 2026
3284db0
Merge pull request #935 from Meridiona/chore/backmerge-main-into-pre-…
adityaharishch Sep 5, 2026
c3c25c1
fix(tray): quiesce the database pool across a daemon restage
adityaharishch Sep 5, 2026
50a62ed
refactor(otp-worker): send the sign-up notification via Resend, not SES
Akarsh-Hegde Sep 5, 2026
89d6b5c
Merge pull request #936 from Meridiona/fix/tray-pool-quiesce-across-r…
adityaharishch Sep 5, 2026
65654a5
fix(otp-worker): point staging's sign-up notification at the engineer
Akarsh-Hegde Sep 5, 2026
61602c3
chore(otp-worker): route both the alert and the notification to adithya
Akarsh-Hegde Sep 5, 2026
38ea0d0
Merge pull request #934 from Meridiona/feat/otp-account-event-notify
Akarsh-Hegde Sep 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
# Optional - a release bakes this in, a source checkout runs without it.
# Connect trackers in the setup wizard; tuning knobs are in CLAUDE.md.

# Optional. Blank means a dev build skips sign-in entirely, so a fresh clone
# just runs. Set a Clerk dev instance key (pk_test_...) to exercise the real
# sign-in path locally. Packaged builds always require sign-in regardless.
CLERK_PUBLISHABLE_KEY=
# Optional. Blank means the OTP sign-in flow is disabled - the wizard's Email
# step reports "not configured" on the first attempt and lets you continue
# without signing in (the same dev-bypass shape the old Clerk key had). Set
# these to a deployed infra/otp-worker instance (staging or your own) to
# exercise the real send/verify path locally.
OTP_API_URL=
OTP_CLIENT_TOKEN=


156 changes: 151 additions & 5 deletions .github/workflows/release-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,6 @@ jobs:
MERIDIAN_GITHUB_OAUTH_CLIENT_ID: ${{ secrets.GH_OAUTH_CLIENT_ID }}
MERIDIAN_POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
MERIDIAN_COUNTER_API_KEY: ${{ secrets.COUNTER_API_KEY }}
MERIDIAN_CLERK_PUBLISHABLE_KEY: ${{ secrets.CLERK_PUBLISHABLE_KEY_PROD }}
MERIDIAN_OTP_API_URL: ${{ vars.MERIDIAN_OTP_API_URL }}
MERIDIAN_OTP_CLIENT_TOKEN: ${{ secrets.MERIDIAN_OTP_CLIENT_TOKEN }}
MERIDIAN_CHANNEL: ${{ needs.prepare.outputs.channel }}
Expand Down Expand Up @@ -521,6 +520,7 @@ jobs:
# for v0-rust-macos-release-aarch64-apple-darwin" — so stale entries
# stopped being reaped too, feeding the same eviction.
- uses: Swatinem/rust-cache@v2
id: rust-cache
with:
# shared-key REPLACES rust-cache's automatic job-based key. That
# matters: by default `add-job-id-key` is true, so ci.yml's
Expand Down Expand Up @@ -563,6 +563,70 @@ jobs:
# nothing can restore from — which is exactly how the repo's 10 GiB
# quota filled up and began evicting caches other jobs needed.
save-if: ${{ github.ref == 'refs/heads/main' }}
# SAVE THE CACHE EVEN WHEN THE JOB FAILS.
#
# Defaults to false, so a run that compiles for 30 minutes and then
# dies in bundling, signing, notarization or upload throws that whole
# compile away, and the retry starts cold again - paying twice for one
# release. The compile is the expensive half and it SUCCEEDED; a later
# step failing says nothing about the artifacts it produced. A partial
# `target/` is not a hazard either: cargo fingerprints it correctly,
# which is the same property every incremental build already relies on.
cache-on-failure: true

# A COLD BUILD MUST NOT BE SILENT. This is the release pipeline's oldest
# and most expensive failure mode, and it has never once announced itself.
#
# The shape every time: the cache key drifts or the entry is evicted,
# `No cache found.` is written into a COLLAPSED log group, the build takes
# 20-30 extra minutes, and every check goes green with correct binaries at
# the end. It has only ever been caught by someone happening to watch the
# clock - most recently 2026-08-27, when the Windows job compiled for 36
# minutes while the cache it wanted sat unread on `main` (see the
# `runs-on` note in the windows job). The same silence let cache-warm.yml
# write an unreadable key for this pipeline's entire history.
#
# Deliberately an `::error::` ANNOTATION that does NOT fail the step. The
# asymmetry matters: a cache miss must never block shipping a release -
# the build is slow, not wrong, and failing here would turn a GitHub image
# roll into a release outage. But it must be impossible to overlook, so it
# lands as a red annotation on the run page and as a section in
# `$GITHUB_STEP_SUMMARY`, both of which sit ABOVE the logs rather than
# inside a collapsed group.
#
# The env dump is the other half, and it is what makes the NEXT occurrence
# cheap. rust-cache hashes the NAMES AND VALUES of every
# CARGO_*/CC*/CFLAGS/CXX/CMAKE*/RUST* variable into the key component that
# drifts, and nothing has ever recorded what those were on a run that
# missed - so each time the cause has to be re-derived from the cache API
# and guesswork. Printing them on a miss turns that into a diff between
# two runs. Values that look like credentials are dropped rather than
# printed; none of the hashed prefixes should carry one, and a build log
# is not the place to find out otherwise.
- name: Report the rust-cache outcome
run: |
if [ "${{ steps.rust-cache.outputs.cache-hit }}" = "true" ]; then
echo "rust-cache: HIT - this build starts warm."
exit 0
fi
msg="rust-cache MISSED on ${{ runner.os }}: this build compiles from scratch (~35 min on Windows, ~20 min on macOS). The key drifted or the entry was evicted - compare the environment below against a run that hit."
echo "::error title=Cold Rust build (${{ runner.os }})::${msg}"
{
echo "### rust-cache miss - ${{ runner.os }}"
echo
echo "${msg}"
echo
echo "<details><summary>Cache-key environment (rust-cache hashes these names and values)</summary>"
echo
echo '```'
env \
| grep -E '^(CARGO|CC|CFLAGS|CXX|CMAKE|RUST)' \
| grep -viE '(TOKEN|SECRET|PASSWORD|CREDENTIAL|_KEY)' \
| sort || true
echo '```'
echo
echo "</details>"
} >> "$GITHUB_STEP_SUMMARY"

- uses: actions/setup-node@v7
with:
Expand Down Expand Up @@ -838,7 +902,25 @@ jobs:
windows:
name: Windows x86_64
needs: prepare
runs-on: windows-latest
# PINNED, not `windows-latest`. The macOS job is pinned to `macos-26` and
# this one was not, and that asymmetry is not cosmetic: on 2026-08-27 the
# release's Windows job asked for
# `...-Windows_NT-x64-cd9df261-fb0b6063` while a 1305 MiB entry sat on
# `main` under `...-Windows_NT-x64-581b1cd0-fb0b6063`, so it compiled for
# 36 minutes with the cache it needed one API call away. The same day's
# ci.yml Windows jobs asked for `581b1cd0` and missed a `cd9df261` entry -
# the two workflows had SWAPPED hashes overnight. Nothing in the repo
# changed (identical Cargo.lock, rust-toolchain, workflow file and env
# block), so the drift came from the runner image: the fleet was serving
# more than one Windows environment (`windows-2025-vs2026` observed), and
# rust-cache hashes the CARGO_*/CC*/CFLAGS/CXX/CMAKE*/RUST* vars, so which
# runner you land on decides whether you start warm.
#
# Pinning the label removes the 2022 -> 2025 major roll as a variable. It
# does NOT freeze the weekly image refresh, and it cannot fix a fleet that
# is heterogeneous within one label - which is exactly why this line is not
# treated as the fix. The cache-outcome report below is.
runs-on: windows-2025
timeout-minutes: 60 # same cap as macos — bound a hung build instead of falling back to GitHub's 360-minute default
permissions:
contents: write # uploads assets into the draft
Expand All @@ -852,13 +934,12 @@ jobs:
# comment) — these are cross-platform values (OAuth client ids, public
# analytics keys), not macOS-specific ones, so skipping them here would
# silently ship a Windows build with Jira sign-in, GitHub device flow,
# analytics, or Clerk sign-in missing. Keep this list in sync with the
# macOS job's, minus the Apple-only signing/notarization secrets.
# analytics, or email sign-in (the OTP Worker) missing. Keep this list in
# sync with the macOS job's, minus the Apple-only signing/notarization secrets.
MERIDIAN_JIRA_OAUTH_CLIENT_SECRET: ${{ secrets.JIRA_OAUTH_CLIENT_SECRET }}
MERIDIAN_GITHUB_OAUTH_CLIENT_ID: ${{ secrets.GH_OAUTH_CLIENT_ID }}
MERIDIAN_POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
MERIDIAN_COUNTER_API_KEY: ${{ secrets.COUNTER_API_KEY }}
MERIDIAN_CLERK_PUBLISHABLE_KEY: ${{ secrets.CLERK_PUBLISHABLE_KEY_PROD }}
MERIDIAN_OTP_API_URL: ${{ vars.MERIDIAN_OTP_API_URL }}
MERIDIAN_OTP_CLIENT_TOKEN: ${{ secrets.MERIDIAN_OTP_CLIENT_TOKEN }}
MERIDIAN_CHANNEL: ${{ needs.prepare.outputs.channel }}
Expand Down Expand Up @@ -933,6 +1014,7 @@ jobs:
# equivalent step for the measurement (5288 cache entries evicting the
# tarball that actually matters, for a 0.00% Rust hit rate).
- uses: Swatinem/rust-cache@v2
id: rust-cache
with:
# Keyed by triple only, same reasoning as the macOS job — one warm
# cache shared across every workflow that compiles this target.
Expand All @@ -945,6 +1027,70 @@ jobs:
# compiled OpenSSL-from-source + SQLCipher + the daemon and tray from
# a stone-cold cache, 35.7 min of a 37 min job, every single time.
save-if: ${{ github.ref == 'refs/heads/main' }}
# SAVE THE CACHE EVEN WHEN THE JOB FAILS.
#
# Defaults to false, so a run that compiles for 30 minutes and then
# dies in bundling, signing, notarization or upload throws that whole
# compile away, and the retry starts cold again - paying twice for one
# release. The compile is the expensive half and it SUCCEEDED; a later
# step failing says nothing about the artifacts it produced. A partial
# `target/` is not a hazard either: cargo fingerprints it correctly,
# which is the same property every incremental build already relies on.
cache-on-failure: true

# A COLD BUILD MUST NOT BE SILENT. This is the release pipeline's oldest
# and most expensive failure mode, and it has never once announced itself.
#
# The shape every time: the cache key drifts or the entry is evicted,
# `No cache found.` is written into a COLLAPSED log group, the build takes
# 20-30 extra minutes, and every check goes green with correct binaries at
# the end. It has only ever been caught by someone happening to watch the
# clock - most recently 2026-08-27, when the Windows job compiled for 36
# minutes while the cache it wanted sat unread on `main` (see the
# `runs-on` note in the windows job). The same silence let cache-warm.yml
# write an unreadable key for this pipeline's entire history.
#
# Deliberately an `::error::` ANNOTATION that does NOT fail the step. The
# asymmetry matters: a cache miss must never block shipping a release -
# the build is slow, not wrong, and failing here would turn a GitHub image
# roll into a release outage. But it must be impossible to overlook, so it
# lands as a red annotation on the run page and as a section in
# `$GITHUB_STEP_SUMMARY`, both of which sit ABOVE the logs rather than
# inside a collapsed group.
#
# The env dump is the other half, and it is what makes the NEXT occurrence
# cheap. rust-cache hashes the NAMES AND VALUES of every
# CARGO_*/CC*/CFLAGS/CXX/CMAKE*/RUST* variable into the key component that
# drifts, and nothing has ever recorded what those were on a run that
# missed - so each time the cause has to be re-derived from the cache API
# and guesswork. Printing them on a miss turns that into a diff between
# two runs. Values that look like credentials are dropped rather than
# printed; none of the hashed prefixes should carry one, and a build log
# is not the place to find out otherwise.
- name: Report the rust-cache outcome
run: |
if [ "${{ steps.rust-cache.outputs.cache-hit }}" = "true" ]; then
echo "rust-cache: HIT - this build starts warm."
exit 0
fi
msg="rust-cache MISSED on ${{ runner.os }}: this build compiles from scratch (~35 min on Windows, ~20 min on macOS). The key drifted or the entry was evicted - compare the environment below against a run that hit."
echo "::error title=Cold Rust build (${{ runner.os }})::${msg}"
{
echo "### rust-cache miss - ${{ runner.os }}"
echo
echo "${msg}"
echo
echo "<details><summary>Cache-key environment (rust-cache hashes these names and values)</summary>"
echo
echo '```'
env \
| grep -E '^(CARGO|CC|CFLAGS|CXX|CMAKE|RUST)' \
| grep -viE '(TOKEN|SECRET|PASSWORD|CREDENTIAL|_KEY)' \
| sort || true
echo '```'
echo
echo "</details>"
} >> "$GITHUB_STEP_SUMMARY"

- uses: actions/setup-node@v7
with:
Expand Down
8 changes: 7 additions & 1 deletion .releaserc.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@
[
"@semantic-release/commit-analyzer",
{
"preset": "conventionalcommits"
"preset": "conventionalcommits",
"releaseRules": [
{
"type": "revert",
"release": "patch"
}
]
}
],
[
Expand Down
8 changes: 7 additions & 1 deletion .releaserc.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,13 @@
[
"@semantic-release/commit-analyzer",
{
"preset": "conventionalcommits"
"preset": "conventionalcommits",
"releaseRules": [
{
"type": "revert",
"release": "patch"
}
]
}
],
[
Expand Down
5 changes: 1 addition & 4 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,7 @@ listens on no port.
| **MCP server** | `packages/meridian-mcp/` | TypeScript. Exposes the same data to AI clients over the Model Context Protocol. |
| **OAuth** | `meridian-oauth/` | Browser-based OAuth flows for Jira and Trello. |

The Rust workspace is `[".", "meridian-core", "meridian-oauth", "tray/src-tauri",
"tray/src-tauri/vendor/tauri-plugin-clerk"]`. That last one is a patched copy of a
third-party crate, and it is a member rather than excluded precisely so its regression
tests run - see `tray/src-tauri/vendor/tauri-plugin-clerk/README.md`.
The Rust workspace is `[".", "meridian-core", "meridian-oauth", "tray/src-tauri"]`.

Because the repo root is itself a package, **`cargo test` and `cargo clippy` must be
run with `--workspace`** or they silently test only the daemon. This is the single
Expand Down
Loading
Loading