Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
153 commits
Select commit Hold shift + click to select a range
54bb500
chore(deps): replace deprecated OpenTelemetry trace SDK packages with…
waleedlatif1 Oct 28, 2026
5b49429
fix(library): merge duplicate sections and FAQs in the ecommerce and …
waleedlatif1 Oct 28, 2026
94de080
chore(ci): authenticate Trigger.dev deploys with per-environment API …
waleedlatif1 Oct 28, 2026
f2401ac
perf(db): cut hot-path database work and close copilot cleanup gaps (…
waleedlatif1 Oct 28, 2026
17f35ef
feat(db): seal account tokens by default and backfill them during mig…
waleedlatif1 Oct 29, 2026
e05cf89
fix(files): cap how long a room delivery waits for its refetches (#9427)
waleedlatif1 Oct 29, 2026
a34e2e7
fix(ci): fail the promote wait on a digest lookup error instead of re…
waleedlatif1 Oct 29, 2026
336ed5a
chore(deps): drop the stray bun tag hunk from the zod patch (#9432)
waleedlatif1 Oct 29, 2026
77dfe17
fix(billing): serialize Gmail inbox allowance decisions so racing ali…
waleedlatif1 Oct 29, 2026
31f7529
fix(scim): harden directory lifecycle and clarify group mappings (#9429)
waleedlatif1 Oct 29, 2026
70724d0
perf(db): index a workspace's live files in upload order (#9434)
waleedlatif1 Oct 29, 2026
19b8d53
fix(cleanup): keep shared chat files, sweep inline images by prefix, …
waleedlatif1 Oct 29, 2026
fffa150
feat(files): page, search, look up and roll up workspace files over t…
waleedlatif1 Oct 29, 2026
70c8231
perf(files): page the Files browser and resolve files without listing…
waleedlatif1 Oct 29, 2026
59bbfd5
perf(audit-logs): index organization-level rows and read them as two …
waleedlatif1 Oct 29, 2026
8a14967
fix(audit-logs): list an organization's audit log through its single …
waleedlatif1 Oct 29, 2026
929021d
feat(search): unify organization search and reviewed assistant action…
waleedlatif1 Oct 29, 2026
b6122f0
docs(library): update ai-agent-vs-chatbot (#9441)
waleedlatif1 Oct 29, 2026
2c9fc53
feat(library): Best AI Agents for Meeting Notes and Follow-Ups: 6 Opt…
waleedlatif1 Oct 29, 2026
28dcc76
feat(library): Best AI Agent Builders for Automated Daily Email Diges…
waleedlatif1 Oct 29, 2026
467236e
chore(deps): bump re2js to 2.8.7 (#9444)
waleedlatif1 Oct 29, 2026
8948b54
perf(file-search): probe each backfill page's revisions by primary ke…
waleedlatif1 Oct 29, 2026
94b33d2
perf(outbox): resume each retention batch where the previous run's ba…
waleedlatif1 Oct 29, 2026
d59a275
perf(audit-logs): read a listing narrowed only by time through per-wo…
waleedlatif1 Oct 29, 2026
20ec175
perf(db): serve workspace usage drill-downs index-only on usage_log (…
waleedlatif1 Oct 29, 2026
6a269f9
perf(admin): read dashboard ledger usage one bounded scan per entity …
waleedlatif1 Oct 29, 2026
99d034a
perf(knowledge): reconcile a completed listing in one pass over its w…
waleedlatif1 Oct 29, 2026
322abb2
improvement(sandbox): pause idle chat workbenches instead of keeping …
waleedlatif1 Oct 29, 2026
01b2363
fix(billing): price Pi sandboxes at their build resources (#9453)
waleedlatif1 Oct 29, 2026
9c571fb
fix(billing): correct the Pi sizing note on E2B's resource maximums (…
waleedlatif1 Oct 29, 2026
d444d58
fix(workflows): refuse new placements of sunset blocks in workflow ed…
waleedlatif1 Oct 29, 2026
a0f47b1
fix(search): inline action review and unify account menus (#9451)
waleedlatif1 Oct 29, 2026
2698438
fix(integrations): one integration-access verdict across the catalog,…
waleedlatif1 Oct 30, 2026
584848a
improvement(comparisons): lead the OpenAI AgentKit page with the Agen…
waleedlatif1 Oct 30, 2026
9e2afe0
fix(billing): hold free plans to their allowance mid-run (#9462)
waleedlatif1 Oct 30, 2026
dff74b6
fix(search): unify navigation and preserve action review history (#9467)
waleedlatif1 Oct 30, 2026
b127bf4
fix(executor): bound condition loops and reject unnamed variable assi…
waleedlatif1 Oct 30, 2026
075c4ff
feat(workflows): let a synchronous run continue in the background aft…
waleedlatif1 Oct 30, 2026
465ea3c
feat(mcp): type mcp block replies from declared output schemas (#9466)
waleedlatif1 Oct 30, 2026
9f3d3e1
fix(search): remove the extra assistant tools gate (#9468)
waleedlatif1 Oct 30, 2026
5facc5f
feat(extension): bring Sim chat and page context to Chrome (#9454)
waleedlatif1 Oct 30, 2026
1782a22
fix(mothership): settle a sim_cli wait that outlasted --wait-timeout …
waleedlatif1 Oct 30, 2026
1e6b594
docs(library): update 6-best-ai-observability-tools-for-production-ag…
waleedlatif1 Oct 30, 2026
c4282f1
feat(library): Best AI Agents for Internal Knowledge Search Across Do…
waleedlatif1 Oct 30, 2026
1bed04e
feat(library): Best AI Agent Platforms for Slack and Discord: 4 Cross…
waleedlatif1 Oct 30, 2026
d2f09ff
feat(library): Best AI Agents for Automated Data Reports in 2026: 4 T…
waleedlatif1 Oct 30, 2026
06faa07
improvement(auth): unify sign-in and access pages (#9461)
emir-karabeg Oct 30, 2026
875f40a
test(mothership): drive a draft run past a wait slice through the rea…
waleedlatif1 Oct 30, 2026
c17cb55
fix(extension): isolate embedded pages from tracking (#9480)
waleedlatif1 Oct 30, 2026
0b26514
fix(sandbox): correct the E2B build default in the Pi sizing doc (#9477)
waleedlatif1 Oct 30, 2026
13a782b
docs(billing): scope the usage_log workspace index note to created_at…
waleedlatif1 Oct 30, 2026
3175daa
fix(search): harden assistant review and account discovery (#9478)
waleedlatif1 Oct 30, 2026
9fffbcc
fix(mcp): honor json schema openness in mcp output shapes (#9476)
waleedlatif1 Oct 30, 2026
397ea37
chore(trigger): run tasks on the bun-1.4 runtime (#9481)
waleedlatif1 Oct 30, 2026
5f2b8cd
fix(search): trace live provider latency and partial failures (#9482)
waleedlatif1 Oct 30, 2026
e9ac764
fix(integrations): align connection header actions (#9487)
waleedlatif1 Oct 30, 2026
00e25a4
feat(sim-links): organization Sim links (go links) with sim/<name> re…
waleedlatif1 Oct 30, 2026
91479e6
feat(extension): open typed sim/ links through the Sim link resolver …
waleedlatif1 Oct 30, 2026
7860fbe
feat(docs): rebuild documentation with the shared Sim design system (…
emir-karabeg Oct 31, 2026
08bdbea
chore(search): diagnose unsupported Fireflies response shapes (#9488)
waleedlatif1 Oct 31, 2026
854e095
feat(access-control): govern access requests per permission item (#9483)
waleedlatif1 Oct 31, 2026
c63e93e
improvement(sim-links): show each link's destination favicon (#9489)
waleedlatif1 Oct 31, 2026
3a39177
fix(search): accept Fireflies data-array responses (#9490)
waleedlatif1 Oct 31, 2026
051b223
improvement(sim-links): use the shared resource table layout (#9491)
waleedlatif1 Oct 31, 2026
7027fd5
improvement(sim-links): cleanup and simplify pass on the resource lay…
waleedlatif1 Oct 31, 2026
873489c
fix(docs): simplify selection and verify media interactions (#9493)
waleedlatif1 Oct 31, 2026
17389db
feat(favicons): one server route for every site icon, with parent-dom…
waleedlatif1 Oct 31, 2026
e56bf3d
fix(knowledge): keep a bundle's document token totals on import (#9495)
waleedlatif1 Oct 31, 2026
26ba3a9
improvement(docs): simplify workflow lightbox and retire migration ar…
waleedlatif1 Oct 31, 2026
79a7aa1
improvement(favicons): resolve platform tenants no provider can see, …
waleedlatif1 Oct 31, 2026
a5fba63
fix(favicons): let a mounted icon retry once its failure ages out (#9…
waleedlatif1 Oct 31, 2026
b3f9298
fix(docs): restore container expansion and verify canvas interactions…
waleedlatif1 Oct 31, 2026
09ed990
feat(mothership): erase private memory when a member leaves or an org…
waleedlatif1 Oct 31, 2026
3dfcaa0
fix(files): accept files/ VFS paths in v2 file describe, rename and d…
waleedlatif1 Oct 31, 2026
03b80f4
fix(desktop): keep sign-in popups working in the agent browser (#9506)
waleedlatif1 Oct 31, 2026
c2cb498
improvement(sim-links): pass queries through, trim pasted punctuation…
waleedlatif1 Oct 31, 2026
922b667
improvement(oauth): serve still-valid tokens while refreshing ahead o…
waleedlatif1 Oct 31, 2026
621e4ef
improvement(extension): document browser data handling and limited us…
waleedlatif1 Oct 31, 2026
4a7ba87
improvement(desktop): bring agent browser menus, keys and fullscreen …
waleedlatif1 Oct 31, 2026
e985d51
fix(auth): refuse account creation from disposable email domains for …
waleedlatif1 Oct 31, 2026
e0b3427
improvement(cli): files batch-delete takes file ids as arguments (#9518)
waleedlatif1 Oct 31, 2026
2db94a5
fix(mothership): say why a workflow copilot chat cannot read other ch…
waleedlatif1 Oct 31, 2026
d3f4739
improvement(desktop): install updates on one click, asking only about…
waleedlatif1 Oct 31, 2026
a4519ea
improvement(cli): sim credentials providers lists providers (#9522)
waleedlatif1 Oct 31, 2026
5f00f19
feat(desktop): continue a passkey sign-in in your browser and bring t…
waleedlatif1 Oct 31, 2026
c56d83e
fix(extension): keep site access compatible with strict CSP (#9524)
waleedlatif1 Oct 31, 2026
4dd5ef3
feat(people): organization People page with profiles, reporting lines…
waleedlatif1 Oct 31, 2026
d3a81eb
improvement(desktop): sign-in prompts for the agent browser — site pa…
waleedlatif1 Oct 31, 2026
22bf85a
fix(execution): name the signal exit code of a failed sandbox process…
waleedlatif1 Oct 31, 2026
09627c5
improvement(search): overlap live search stages and report every unse…
waleedlatif1 Oct 31, 2026
3e23d39
feat(mothership): answer a long workflow tool run still running, and …
waleedlatif1 Oct 31, 2026
1559a18
fix(people): keep a suspended manager link on edit and never fail the…
waleedlatif1 Oct 31, 2026
d30a1ad
feat(library): Best AI Agents for Jira Triage and Datadog Incident Re…
waleedlatif1 Oct 31, 2026
2dfdc37
docs(library): update best-multi-agent-frameworks-2026 (#9534)
waleedlatif1 Oct 31, 2026
962526f
fix(auth): block only curated disposable domains, and never gate SSO …
waleedlatif1 Oct 31, 2026
28bacdf
feat(library): AI Agent Output Controls Compared: Guardrails, Structu…
waleedlatif1 Oct 31, 2026
6a35cb4
fix(files): authorize the workspace before resolving a files/ path (#…
waleedlatif1 Oct 31, 2026
914f92f
fix(desktop): ask before an update restart from the menu, count uploa…
waleedlatif1 Oct 31, 2026
8c7bd74
fix(mothership): Stop only cancels detached runs still running, and a…
waleedlatif1 Oct 31, 2026
0954143
chore(auth): correct where the short disposable list runs (#9535)
waleedlatif1 Oct 31, 2026
20fb744
chore(search): retire legacy search knowledge base projection rows in…
waleedlatif1 Oct 31, 2026
82cf74d
fix(oauth): keep a five-minute floor on served tokens and refresh ahe…
waleedlatif1 Oct 31, 2026
1515ce2
improvement(release): harden favicons, sim links, and the extension f…
waleedlatif1 Oct 31, 2026
04b66d4
improvement(docs): collect reader feedback inline (#9538)
waleedlatif1 Oct 31, 2026
f16b71a
fix(auth): check a workspace's personal-key switch after membership (…
waleedlatif1 Oct 31, 2026
a502fb2
fix(oauth): take over a lapsed refresh lease, share overlapping servi…
waleedlatif1 Oct 31, 2026
7ca3f1a
fix(files): resolve v2 file paths only on the v2 surface, through the…
waleedlatif1 Oct 31, 2026
30d6f67
chore(ci): reach the database over the tailnet when CI_DB_TAILNET is …
waleedlatif1 Oct 31, 2026
5815964
fix(files): stream served files with byte ranges instead of buffering…
waleedlatif1 Oct 31, 2026
53a2caa
fix(ci): drop the duplicate --accept-routes the Tailscale action alre…
waleedlatif1 Nov 1, 2026
aa60ac2
fix(desktop): address release review — count app downloads and unchec…
waleedlatif1 Nov 1, 2026
425f9a4
fix(oauth): default a leader-lock follower's wait to the lease so its…
waleedlatif1 Nov 1, 2026
e407f28
fix(release): read Excel start dates, refuse impossible times and rep…
waleedlatif1 Nov 1, 2026
ac604b7
fix(files): share one served-bytes predicate between the serve route …
waleedlatif1 Nov 1, 2026
cdff0e5
fix(sandbox): initialize workbench history before honoring a stop dur…
waleedlatif1 Nov 1, 2026
1defff3
fix(public-shares): stream shared files with byte ranges instead of b…
waleedlatif1 Nov 1, 2026
9491d3f
feat(billing): require a paid plan or prepaid credits for Chat (#9551)
waleedlatif1 Nov 1, 2026
f8a561d
fix(billing): fail closed on legacy Chat payer reads and cover the Ch…
waleedlatif1 Nov 1, 2026
2da47b9
improvement(ci): check lint and types before pushing (#9555)
waleedlatif1 Nov 2, 2026
974dd6c
improvement(ci): shorten the acceptance critical path (#9556)
waleedlatif1 Nov 2, 2026
b6677c3
improvement(billing): show the Chat plan card above the composer inst…
waleedlatif1 Nov 2, 2026
5216fd4
improvement(ci): overlap independent acceptance and recovery checks
waleedlatif1 Nov 2, 2026
e3ce679
fix(mcp): answer workflow MCP JSON-RPC errors over HTTP 200 instead o…
waleedlatif1 Nov 2, 2026
2e6bbb1
fix(extension): attach Sim pages and streamline composer controls (#9…
waleedlatif1 Nov 2, 2026
1a0856a
improvement(landing): comparison social cards and links to cloud mode…
waleedlatif1 Nov 2, 2026
d5c14e0
improvement(library): correct stale facts, merge duplicate FAQs, and …
waleedlatif1 Nov 2, 2026
e4627fb
chore(extension): bring the main extension hotfix into staging (#9568)
waleedlatif1 Nov 2, 2026
738cce1
improvement(comparisons): re-verify competitor pricing, integration c…
waleedlatif1 Nov 2, 2026
0ea1f09
feat(library): How Do You Connect the Serper Search API to an AI Agen…
waleedlatif1 Nov 2, 2026
e1214d1
feat(library): What Are the Best AI Agents for Competitor Website Cha…
waleedlatif1 Nov 2, 2026
af6c9de
feat(library): Best AI Agent Platforms for Webhook, Schedule, and Eve…
waleedlatif1 Nov 2, 2026
e3b1410
feat(library): Best AI Agent Platforms for DocuSign Contract Approval…
waleedlatif1 Nov 2, 2026
a041519
fix(copilot): require approval for run_block and run_from_block (#9573)
waleedlatif1 Nov 2, 2026
3b6be5c
fix(mcp): require workspace admin to change workflow MCP server visib…
waleedlatif1 Nov 2, 2026
aa84330
fix(file-viewer): upgrade docx-preview to 0.4.1 to close w:sym innerH…
waleedlatif1 Nov 2, 2026
868f201
fix(copilot): require approval for terminal input, which can submit a…
waleedlatif1 Nov 2, 2026
c19575a
fix(realtime): enforce the Files capability on workspace document roo…
waleedlatif1 Nov 2, 2026
29dd567
fix(media): restrict ffmpeg inputs to media demuxers (#9577)
waleedlatif1 Nov 2, 2026
70be4b7
fix(pii): bound custom-pattern matching time per request (#9584)
waleedlatif1 Nov 2, 2026
ebf29c0
fix(mothership): require approval before browser tools act on a page …
waleedlatif1 Nov 2, 2026
1a14c87
improvement(ci): target acceptance and reuse validated build caches (…
waleedlatif1 Nov 2, 2026
478d9ec
feat(trigger): reach AWS from trigger.dev runs through workload ident…
waleedlatif1 Nov 2, 2026
fbf5c5e
fix(copilot): hold sim_cli commands that perform approval-gated capab…
waleedlatif1 Nov 2, 2026
6eac47d
fix(compare): keep Cowork, Make, and Langflow facts consistent within…
waleedlatif1 Nov 2, 2026
eb6bcdb
fix(sso): mark email verified on sign-in through a verified-domain pr…
waleedlatif1 Nov 2, 2026
2b77ade
improvement(sandbox): log per-phase timing for each sandbox execution…
waleedlatif1 Nov 3, 2026
e53bf39
improvement(search): page Slack Real-time Search to fill a Slack-scop…
waleedlatif1 Nov 3, 2026
c735ded
improvement(cli): accept the file references, list shapes and multi-f…
waleedlatif1 Nov 3, 2026
78cd332
improvement(mothership): let a code call run for up to fifteen minute…
waleedlatif1 Nov 3, 2026
395a394
fix(test): assert recovery backoff on the claims, not worker request …
waleedlatif1 Nov 3, 2026
86ad456
docs(library): update best-ai-agent-evaluation-platforms-2026 (#9594)
waleedlatif1 Nov 3, 2026
260de05
improvement(media): record a hosted-key auth failure when fal refuses…
waleedlatif1 Nov 3, 2026
bd0ec1f
Merge remote-tracking branch 'origin/staging' into chore/sync-dev-wit…
waleedlatif1 Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
30 changes: 27 additions & 3 deletions .github/CI.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ The `changes` job runs Turborepo 2.9.14's `affectedTasks` query before installin

A PR compares its merge base with the checked-out merge commit. Main/staging pushes execute all checks; the parent `ci` workflow skips checks on `dev` pushes, while PRs targeting `dev` still run checks. A manual `checks` run executes all checks unless supplied a full base commit SHA to reproduce a scoped plan. Missing history, an empty diff, unknown files outside the workspace graph, root script/CI changes, or a planner error run every check. Missing selection outputs fail the aggregate gate. The gate also rejects an omitted dependency, any failed/cancelled job, and any skip that its explicit selection flag did not authorize.

Dedicated docs verification uses the same planner, comparing pushes with their previous commit and PRs with their merge base. Site acceptance follows `docs#build` and its transitive package dependencies. The app's docs-consumer task depends on server runtime and that docs build: backend-only changes run the platform consumer against the docs app, while site changes also run corpus and browser checks. Independent SDK and unit-only edits skip those production jobs. The required `docs HTTP` gate verifies explicit site/platform selections before accepting any skip.

Docs production builds run once and publish an artifact to isolated HTTP, corpus, Chromium, and WebKit jobs. Source checks keep their own checkout because generator verification mutates inputs. Content caches use separate lint/source/build namespaces; generation validates every restore, repairs missing declarations, and removes obsolete modules. The Next build cache keeps its supported incremental behavior. Content and Next caches have size limits, and Next cache files expire after seven days; successful content eviction happens after all consumers finish.

| Change | Expensive checks selected |
| --- | --- |
| Independent SDK | That workspace's tests and type-check; no app build, services, or browsers |
Expand All @@ -24,12 +28,28 @@ SEO depends on workspace UI and server code: landing pages reuse workspace prici

Affected type-checks follow the package graph too; repository audits and lint run whenever the checks workflow runs. Workspace-only unit jobs use a free GitHub runner and do not start the app test shards.

Database integration and lightweight HTTP suites run on free standard GitHub runners with matching GitHub cache setup. A same-source integration comparison of 16 jobs per provider (32 total) had a slowest shard of 6m 04s on 2-vCPU Blacksmith versus 6m 55s on free GitHub, with identical coverage. GitHub trades the observed 51 seconds for zero runner compute cost. This is one paired sample, not a long-run percentile estimate. These explicitly selected GitHub jobs do not follow `CI_PROVIDER`.
Database integration uses 4-vCPU Blacksmith runners with sticky dependency disks, following `CI_PROVIDER` and falling back to standard GitHub runners with matching setup. A prior same-source comparison of 16 jobs per provider (32 total) had a slowest shard of 6m 04s on 2-vCPU Blacksmith versus 6m 55s on GitHub, with identical coverage. This is one paired sample, not a long-run percentile estimate. Evaluate runner changes against complete coverage and the overall CI gate, since a faster shard does not shorten a run when another job finishes later. Lightweight HTTP suites retain free standard GitHub runners and do not follow `CI_PROVIDER`.

GitHub runners install dependencies directly rather than transferring Bun and `node_modules` archives. In a same-source paired comparison, those restores took 26.2 seconds before an 82-millisecond install, while a clean install took 12.42 seconds. This is one paired observation; retain the policy only while repeated CI timings support it. Blacksmith keeps its sticky dependency disks. GitHub Turbo output caches remain enabled for jobs that request them, with a commit-specific key and a task/event/fork-scoped restore prefix, so a rerun can reuse an exact entry without creating another archive. Push jobs never restore pull-request entries.

Closing a same-repository pull request deletes only its GitHub merge-ref caches after verifying that it remains closed or merged. The regular `pull_request` workflow skips forks and Dependabot because their tokens cannot delete caches; those entries retain GitHub's normal cache eviction. Cleanup checks out no code and never selects a branch-wide or default-branch cache. Blacksmith sticky disks retain their separate lifecycle.

Memory-heavy builds and browser jobs retain appropriately sized Blacksmith runners. Electron uses 4-vCPU Blacksmith: both shards passed within 14 seconds of the 8-vCPU control; the free GitHub rest shard was slower and its lease run stalled.

Every HTTP and browser group consumes the same production build in an isolated job/database. Electron also uses that build and skips its development-route warm-up. Local HTTP and Electron development runs retain their dev-server behavior. Build inputs exclude test-only files so a harness edit can reuse an unchanged production build.

Desktop inbox protocol, assistant actions UI, and organization search UI run as three parallel HTTP jobs with isolated databases, apps, and reports. Each harness owns its acceptance task, so an edit selects its own job. The inbox protocol task depends on server and realtime code; the browser tasks also depend on workspace UI. Desktop inbox needs no browser. The UI jobs and browser extension install Chromium while their app starts, waiting for both before executing assertions; browser-install failures still fail the job and preserve the install log. No acceptance assertions are removed by the split.

Live Electron acceptance tracks its live-app suite, fixtures, and Playwright configuration separately from shell-only smoke tests. Changing a shell-only smoke case runs the dedicated desktop workflow without starting the app's production build and live lease checks.

Desktop smoke weights also stay outside the desktop runtime task. Editing weights reruns desktop partition coverage without selecting live-app acceptance.

Browser extension acceptance runs native interaction and access-revalidation groups in parallel jobs with isolated databases, apps, browser profiles, and reports. Both retain the same task boundary, so an affected extension harness selects both groups. Native streaming and first-open capture checks retain real timers. Access checks install Playwright's clock before the app mounts: advancing production polling timers preserves real HTTP and database authorization checks without waiting through each polling interval. Capture timestamps originate in Chromium's isolated world, so the harness restores wall time after each advance. The local `browser-extension` group still runs the complete suite; live-provider runs require this complete mode and retain native timing throughout.

Integration shard weights come from successful reports for both push and migration provisioning paths. Refresh them with `scripts/update-integration-durations.ts`, then check the new partition against a separate complete run before adopting it. Weights only change scheduling; discovery still owns coverage. The current refresh uses runs [41348786822](https://github.com/simstudioai/sim/actions/runs/41348786822) and [41377145857](https://github.com/simstudioai/sim/actions/runs/41377145857), with [41377810718](https://github.com/simstudioai/sim/actions/runs/41377810718) held out for validation.

Desktop pickup checks overlap their real grace periods using distinct calls and waiters under fixed authorization and parent-run fixtures. Recovery exhaustion checks keep worker responses, injected faults, and observed requests scoped to each stream before overlapping their real backoff schedules. Their immediate-takeover checks remain serial. File isolation and serial execution between integration files remain unchanged; these suites still verify actual timeout, lease, retry-floor, and late-claim behavior against PostgreSQL and Redis.

SCIM's production app uses a `sim.ai` fixture hostname mapped to loopback, since `NEXT_PUBLIC_FORCE_HOSTED` is ignored in production. Readiness, HTTP tests, and internal API requests still connect to loopback. The SCIM suite verifies that ending an Enterprise subscription rejects both owner administration and an existing bearer token, and that restoring it restores access.

## Coverage removed or consolidated
Expand All @@ -43,8 +63,12 @@ The long-import and lease-expiration checks remain: they prove distinct survival

Local planner validation is `bun run test:scripts scripts/ci-changes.test.ts scripts/ci-gate.test.ts`. It executes real Turbo queries in small Git fixtures; no application build or database is required. Full builds, services, browser suites, and Electron checks run on hosted CI.

The separate `desktop-e2e` workflow retains its desktop-specific path filters. Its macOS shell smoke suite runs whole files across three isolated runners, with one worker per runner. `scripts/desktop-e2e.ts` asks Playwright to discover the complete suite, then assigns longer files first to the currently lightest shard using `apps/desktop/e2e-durations.json`. Exact escaped file filters preserve serial fixtures. Unmeasured files receive the median measured weight, deleted files cannot select tests, and invalid or empty selections fail. Normal local runs, packaging smoke and the weekly Electron canary keep their existing commands.
The separate `desktop-e2e` workflow retains its desktop-specific path filters. Its macOS shell smoke suite runs whole files across four isolated runners, with one worker per runner. The matrix owns the partition count; job names and runner arguments use `strategy.job-total`. `scripts/desktop-e2e.ts` asks Playwright to discover the complete suite, then assigns longer files first to the currently lightest shard using `apps/desktop/e2e-durations.json`. Exact escaped file filters preserve serial fixtures. Unmeasured files receive the median measured weight, deleted files cannot select tests, and invalid or empty selections fail. Normal local runs, packaging smoke and the weekly Electron canary keep their existing commands.

The current weights are median test durations in seconds from runs [41496623284](https://github.com/simstudioai/sim/actions/runs/41496623284), [41497346251](https://github.com/simstudioai/sim/actions/runs/41497346251), and [41502340540](https://github.com/simstudioai/sim/actions/runs/41502340540). Refresh them from complete `desktop-smoke-reports-*` artifacts when the workload changes: sum `tests[].results[].duration` by `spec.file` in each run, take the median across runs, and divide milliseconds by 1,000. The weights steer scheduling only; Playwright discovery owns coverage. Before adopting new weights, compare repeated paired runs and the complete case/status multiset, including skipped cases and retries.

The initial weights are median test durations in seconds from runs [39734295953](https://github.com/simstudioai/sim/actions/runs/39734295953), [39833640524](https://github.com/simstudioai/sim/actions/runs/39833640524), and [39836596108](https://github.com/simstudioai/sim/actions/runs/39836596108). Refresh them from complete `desktop-smoke-reports-*` artifacts when the workload changes: sum `tests[].results[].duration` by `spec.file` in each run, take the median across runs, and divide milliseconds by 1,000. The weights steer scheduling only; Playwright discovery owns coverage. Before adopting new weights, compare repeated paired runs and the complete case/status multiset, including skipped cases and retries.
Desktop native outputs are keyed by source, build recipes, compiler, SDK, OS, architecture, and Node header bytes. Every build still validates restored checksums, executable modes, universal architectures, and the helper signature; invalid or incomplete outputs rebuild. Native-input pushes to main/staging seed trusted Node 22 and 24 caches without repeating the PR smoke suite. PR cache entries never populate trusted branch caches.

Each shard uploads its coverage/timing report, the complete discovery report, and its deterministic shard plan. `bun run test:scripts scripts/duration-shards.test.ts scripts/desktop-e2e.test.ts` checks partition coverage, unknown files, deterministic ordering, and balancing. The CLI regression executes tiny browser-free Playwright fixtures to prove that imported test factories and paths containing regex characters are selected correctly; it launches no Electron or browser.

Local pushes run `lint:check` and `type-check` through Husky before Git sends commits. These gates reuse Turborepo's task cache; a failure stops the push. The pre-commit hook still formats staged files, and hosted CI owns tests, audits, builds, and acceptance checks.
16 changes: 16 additions & 0 deletions .github/actions/desktop-native-cache/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: Cache desktop native outputs
description: Reuse validated native outputs only for matching source and toolchain inputs
runs:
using: composite
steps:
- name: Identify native build inputs
id: inputs
shell: bash
working-directory: apps/desktop
run: echo "key=$(bun run scripts/native-build-cache.ts)" >> "$GITHUB_OUTPUT"
- name: Restore native compilation outputs
continue-on-error: true
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v5
with:
path: apps/desktop/dist/native
key: desktop-native-v1-${{ runner.os }}-${{ steps.inputs.outputs.key }}
68 changes: 68 additions & 0 deletions .github/actions/docs-content-cache/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: Docs content cache
description: Reuse validated incremental documentation compilation without sharing concurrent writer snapshots.
inputs:
provider:
description: The CI_PROVIDER repo variable.
required: false
default: ''
namespace:
description: A distinct name for each concurrently writing job.
required: true
generate:
description: Generate and validate content after restoring it. Set false only when the following build already runs content:generate.
required: false
default: 'true'
next-cache:
description: Also restore the incremental Next build cache.
required: false
default: 'false'
runs:
using: composite
steps:
- name: Identify the compiler runtime
id: runtime
shell: bash
env:
CACHE_NAMESPACE: ${{ inputs.namespace }}
GENERATE: ${{ inputs.generate }}
NEXT_CACHE: ${{ inputs.next-cache }}
run: |
[[ "$CACHE_NAMESPACE" =~ ^[a-z0-9][a-z0-9-]*$ ]]
[[ "$GENERATE" == true || "$GENERATE" == false ]]
[[ "$NEXT_CACHE" == true || "$NEXT_CACHE" == false ]]
toolchain=$(node --version)
toolchain="$toolchain-$(bun --version)"
echo "toolchain=$toolchain" >> "$GITHUB_OUTPUT"
compiler=$(git ls-files -s -- bun.lock package.json patches apps/docs/package.json apps/docs/scripts/compile-content.ts apps/docs/lib apps/docs/components/workflow-preview packages | sha256sum | awk '{ print $1 }')
echo "compiler=$compiler" >> "$GITHUB_OUTPUT"
- name: Restore incremental content
continue-on-error: true
uses: ./.github/actions/cache
with:
provider: ${{ inputs.provider }}
key: ${{ github.repository }}-docs-content-v1-${{ inputs.namespace }}-${{ runner.os }}-${{ runner.arch }}-${{ steps.runtime.outputs.toolchain }}-${{ github.event_name }}${{ github.event.pull_request.head.repo.fork && format('-fork-{0}', github.event.pull_request.number) || '' }}-${{ steps.runtime.outputs.compiler }}
path: ./apps/docs/.content
- name: Bound restored content
shell: bash
run: bash .github/actions/docs-content-cache/prune.sh content
- name: Restore incremental Next build
if: inputs.next-cache == 'true'
continue-on-error: true
uses: ./.github/actions/cache
with:
provider: ${{ inputs.provider }}
key: ${{ github.repository }}-docs-next-v1-${{ inputs.namespace }}-${{ runner.os }}-${{ runner.arch }}-${{ steps.runtime.outputs.toolchain }}-${{ github.event_name }}${{ github.event.pull_request.head.repo.fork && format('-fork-{0}', github.event.pull_request.number) || '' }}-${{ hashFiles('bun.lock') }}
path: ./apps/docs/.next/cache
- name: Bound the incremental build cache
if: inputs.next-cache == 'true'
shell: bash
run: bash .github/actions/docs-content-cache/prune.sh next
- name: Generate and validate documentation modules
id: generate
if: inputs.generate == 'true'
shell: bash
run: bun run --cwd apps/docs content:generate --prune
- name: Bound content after an unsuccessful generation
if: always() && inputs.generate == 'true' && steps.generate.outcome != 'success'
shell: bash
run: bash .github/actions/docs-content-cache/prune.sh content
20 changes: 20 additions & 0 deletions .github/actions/docs-content-cache/prune.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -euo pipefail

case ${1:-} in
content)
cache=apps/docs/.content
maximum_kilobytes=524288
;;
next)
cache=apps/docs/.next/cache
maximum_kilobytes=2097152
;;
*) echo 'Usage: prune.sh <content|next>' >&2; exit 2 ;;
esac
if [ ! -d "$cache" ]; then exit 0; fi
if [ "$1" = next ]; then find "$cache" -type f -mtime +7 -delete; fi
kilobytes=$(du -sk "$cache" | awk '{ print $1 }')
if [ "$kilobytes" -gt "$maximum_kilobytes" ]; then
find "$cache" -mindepth 1 -delete
fi
Loading
Loading