> For the complete documentation index, see [llms.txt](https://docs.flxbl.io/flxbl/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.flxbl.io/flxbl/codev/changelog.md).

# Changelog

codev is delivered through sfp server releases. Cloud tenants receive updates automatically. Self-hosted deployments update through the [sfp server](https://docs.flxbl.io/sfp-server) lifecycle commands. The desktop app updates itself; a release that requires a new desktop build says so in its entry.

## August 2026

### v52.10.0 — August 19, 2026

* The Source Control **Commits & PRs** section runs the two pull-request pre-flight checks — **Validation** and **Code Analysis** — locally against any org before a pull request is opened, using the same configuration the server-side `pr-validate` worker derives (branch rules matched against the target branch, the checksum-skip switch, and the DevHub-dependent unlocked-package test optimisation). (Desktop.)
* Rerunning a failed release offers three retry modes. **Incremental** (default) skips already-installed package versions and keeps component checksum skip enabled, so the failed package benefits from checksum pruning; **Full** honours the original release definition; **Force** reinstalls everything and disables checksum skip. Available from both the task-detail and child-log rerun surfaces, including cascade release definitions. (Web and desktop.)
* Every org-selection surface in the desktop app uses one shared, searchable picker with fixed tiers — Dev Sandbox, Review Sandbox, Scratch, DevHub, Sandbox — so assigned dev and review environments always sort to the top. (Desktop.)
* The footer branch selector gains a refresh control that runs `git fetch --all --prune` and refreshes the list, so a branch a teammate just pushed can be surfaced. The Fetch controls elsewhere now also refresh the selector. A fetch failure still returns the locally known branches, keeping the picker usable offline. (Desktop.)
* On large repositories, version computation is scoped to the auto-versioned impacted packages and their direct dependents instead of the whole manifest — a single impacted package on a 204-package build previously drove hundreds of redundant `git` calls across every package.
* Running any `sfp` command from your home directory no longer deletes the global `~/.sfp` store of credentials and auth. The startup scratch-directory cleanup resolved a cwd-relative `.sfp` that collided with the global store; it now refuses to run when it resolves onto the global store, comparing real paths so a symlinked home still matches. (CLI, ships in cli v52.6.0.)

### v52.9.0 — August 18, 2026

* Release candidate generation defaults the promotion environment when `promotePackagesBeforeDeploymentToOrg` is not set explicitly. Server-backed generation reads the repository and branch's active `release` environment order and sets its first environment on the candidate, so an omitted property no longer produces a release candidate that skips promoting unlocked packages before deployment.
* The **Runs** and **Scheduled Runs** pages add a free-text search box alongside the existing filters, matching across flow path, triggered-by, task type (raw id and resolved label), category, status, and run id over the loaded window.
* Diff views and code and YAML editors follow the app's light or dark theme instead of the operating system's.

### v52.8.0 — August 18, 2026

* Email sign-in and mandatory two-factor for password sessions are now on by default. Every server offers **Sign in with email** and requires an authenticator-app (TOTP) code for password sessions.
* **Run build** on the Builds toolbar creates a build for an exact commit — for the case where a push was missed while the server was updating. It opens a single-step dialog with the configured branch pre-selected and a searchable commit list, and resolves the workflow, build targets, and existing-build state before you confirm.
* **Local Operations** (preview) records the desktop's local worker runs — push, pull, apex test, validation, sync-to-org, package create and install, and data-package operations (Desktop.)
* A replayed or duplicate pull-request webhook no longer cancels a healthy in-flight validation of the same commit.
* A task failure carrying a very large error payload — for example a release that failed on thousands of component errors — always reaches the engine.
* Environment drift shows the most recently started run.
* An abandoned AI analysis attempt no longer reports a false failure.

### v52.7.0 — August 17, 2026

* Email and password sign-in is available on codev web and desktop as an alternative to GitHub or Azure DevOps sign-in.
* The remote MCP endpoint at `/sfp/api/mcp` gains `flows` and `approvals` tools. A connected MCP client can list and inspect flow and CI/CD runs, dispatch and rerun flows, and list, approve, or reject pending approvals.
* The ServiceNow **Configure change request** dialog validates merge fields before saving, so a misspelled field — `{{release.candidat}}` — is caught in the dialog instead of failing silently when a release runs.

### v52.6.0 — August 15, 2026

* ServiceNow change requests get a **Configure change request** dialog in **Settings → Integrations → ServiceNow** — set which values populate a change request through field templates, with merge-field tokens, a payload preview, and per-project defaults.
* Cascade AI-assisted merge thresholds are documented in the cascade config template on each edge (`skipAiMergeAboveConflictedFiles`, `skipAiMergeAboveConflictedLines`), and their defaults are raised to 100 conflicted files / 10,000 conflicted lines, so ordinary release cascades reach the merge assistant instead of falling through to a manual conflict pull request.
* Change Analysis rows no longer stay on **Running** forever when a PR analysis completes without publishing a result — for example a pull request whose diff against its target is empty. The empty run now publishes a completed result, and a summary still pending when its run completes is reconciled to **Completed**.
* A validation run started with `--skipTesting` no longer logs a misleading "no impacted test classes — skipping tests" warning that blamed the wrong cause and named a flag that does not exist.

### v52.5.3 — August 13, 2026

* Cascade merges refresh their push credentials before the final push, so a run whose clone-to-push time exceeds the GitHub App installation token's \~1-hour lifetime no longer fails authentication after the merge analysis has already succeeded.
* Re-running a failed child attempt from the run page no longer fails with "Only the latest attempt in a job lineage can be retried".

### v52.5.2 — August 13, 2026

* The CI/CD Performance dashboard's validation cards report one consistent population. **Validation outcomes** and **Validation success rate** are now counted per validation run;

### v52.5.1 — August 12, 2026

* Package creation no longer fails when a file read from a commit is larger than 128 KiB.
* Scratch org pools honour `daysToKeepUnassignedAvailable`. Assigned orgs keep their own expiry.
* The Work Items board moves to the shared facet-filter toolbar — filter by state, conflicts, package, component, and label with counts, coloured pills, clear-all, and search in one row, with selections persisted. Open pull requests render first and closed ones collapse behind a **Closed (N)** separator, and the conflict accent is reserved for open pull requests. (Web and desktop.)

### v52.5.0 — August 12, 2026

* The remote MCP endpoint gains a read-only `insights` tool that exposes the **Insights → Performance** dashboard to a connected MCP client.

### v52.4.0 — August 11, 2026

* Each tenant server is a remote MCP endpoint at `/sfp/api/mcp` that an MCP client — Claude Code, claude.ai connectors, Cursor and more
* Error Monitoring carries the selected timeframe into the org drill-down. Changing the overview range — to 30 days, say — and then opening an org's error detail showed the default 24 hours; the detail view now opens on the range chosen in the overview and starts at the first page. (Web and desktop.)
* A release run cancelled mid-approval reports **Cancelled**, instead of a contradictory **Partial** or a permanent **Running** with a stranded pending approval. Cancelling a flow cascades to its child runs and settles their pending approvals, including one held by a child that had already stopped.

### v52.3.0 — August 10, 2026

* While a flow run is streaming, completed log groups collapse automatically — only the group still executing stays open, and an explicit collapse always sticks. Benign wording in a running group (`Promotion failed: … already promoted .. skipping`, `Errors: 0`, `Roll Back on Error: true`) no longer pins it open, and a run that finishes successfully leaves its groups collapsed instead of re-expanding every fold. A failed run keeps the post-mortem behaviour — failure groups auto-expand so the error stays visible.
* `sfp sync` honours a project's stage forceignore files (`plugins.sfp.ignoreFiles`, for example `.buildignore`). Every sync mode — org-to-branch, diff-deploy, and `--from-org` — previously diffed and built against the root `.forceignore` only, so components the build pipeline excludes were counted as changes and deployed to the target org. The deploy stage now inherits the quickbuild ignore file, falling back to the build one, so ignored components no longer sync.

### v52.2.1 — August 10, 2026

* The Push Source dialog's **Source Tracking** option reads the same local changes as Source Control. It could show "No local changes in your working tree" with **Deploy** disabled while Source Control listed changes — the dialog gated on a metadata index that lags behind git after a fresh worktree, a change made outside the app, or opening the dialog from the command palette. The gate and the "Will push N changed component(s)" preview now derive from the same git file changes the push itself uses. Components already deployed successfully drop out of the list; a failed deploy stays, since it still needs pushing. (Desktop.)
* Opening a pool sandbox — a dev or review environment — in the browser resolves across tenants. It could fail with "Cannot generate frontdoor URL … all resolution strategies exhausted" on some tenants while Connect-to-IDE worked for the same sandbox: the open actions on the pools, environments, and activity views did not pass the repository, so the resolver skipped its pool-scoped lookup and fell back to strategies that held on some tenants and not others. Every sandbox-open action now passes the repository.

### v52.2.0 — August 10, 2026

* Deploying a change to a decomposed object (`CustomObject` and its children — fields, list views, record types, validation rules) now sends only the child components that changed.
* A package with apex but no detectable test classes now deploys at `RunRelevantTests` instead of `RunLocalTests`, on every org type including production.
* The `release.deployed` webhook payload gains `data.artifactSourceCommits`
* The pool overview's **Pool config** action opens the same schema-assisted YAML editor

### v52.1.2 — August 8, 2026

* Release builds no longer build packages a domain includes only through `dependencyOn`

### v52.1.1 — August 7, 2026

* A pool sandbox force-deleted from codev is no longer dropped from the pool when Salesforce refuses the delete.
* The Work Items board drops pull requests closed without merging instead of showing them as **Open**, so it reflects open and recently merged pull requests only.
* `sync-org-to-branch` waits up to six hours for a Salesforce deployment — the `sfp sync org` command it runs no longer caps at the CLI's 120-minute wait. Other sync commands and the global CLI default are unchanged.
* The Environments overview keeps all three categories visible — the Release column is no longer pushed off-canvas at normal desktop widths, and horizontal scrolling appears only when the viewport is genuinely narrower than the board.

### v52.1.0 — August 6, 2026

* Releases run through codev now fire the outbound **Release Deployed** webhook, and every `release.deployed` payload carries the deployed `commitSha` and `version`. Previously only the external build flow emitted the event.
* GitHub webhook deliveries missed while the server was down — during an update or outage — are replayed automatically within a two-hour window, once each. Set `WEBHOOK_REPLAY_DISABLED=true` to turn it off. (Self-hosted.)
* `sfp server stop`, `status`, `logs`, and `scale` accept `--base-dir`, matching `start`, `init`, and `update`, so a deployment rooted outside `./sfp-server` can be managed. (Self-hosted.)
* macOS desktop builds are notarized again — bundled Java native libraries are signed with a Developer ID before the app is sealed. Every v52 build since v52.0.0 was blocked by Gatekeeper. (Desktop, macOS.)

### v52.0.2 — August 6, 2026

* Release candidates on GitHub projects show their work items, including the bare `#N` and `(#N)` references a squash merge writes. GitHub and Azure Boards work items are no longer dropped, and each links to its own tracker rather than a Jira-shaped URL.
* The Request Release dialog's **Linked Releases** section always renders, so cross-domain linking is visible on a candidate with no detected work items; it explains where work items are read from and links to the docs.
* The Code Analyzer run page's severity panels agree — the summary bar, Issues by Class, and Issues by Rule read from one severity rollup, and the rule list carries every rule that fired instead of the ten most frequent. A severe but rare rule is no longer dropped from the list.
* PR Analysis no longer fails when the AI architecture check stalls — the AI turn is time-bounded and degrades to an advisory skip, so the deterministic linters still publish. The pr-analyze step limit is raised from 30 to 45 minutes.

### v52.0.1 — August 5, 2026

* The Jira integration defaults to **OAuth Client Credentials**, marked **Preferred** because it writes deployment and build status back to Jira where Basic Auth is read-only. Basic Auth remains available. Integration **View Documentation** links are repointed to the live `/codev/integrations/*` pages.
* The Code Analyzer run page shows each finding's severity — a **Severity** column and facet filter on both tabs, per-class badges, and a whole-run distribution across Critical, High, Moderate, Low, and Info. An unrecognized severity shows as **Unknown**.
* Release builds on long-running domains no longer fail the post-build step with a git authentication error — the git credential is refreshed before each git step that runs after the build.

### v52.0.0 — August 5, 2026

* Outbound webhooks deliver **Release Deployed**, **Release Finalized**, **Build Completed**, and **Build Failed** events; a subscription that previously stayed active but never sent now fires. An optional JSON body template reshapes the payload to a destination's schema, and each webhook has a delivery-history panel showing every attempt's body and response.
* **Push to Org** returns, with a **Soft sync** (committed branch state) versus **Full sync** (committed plus uncommitted local changes) choice and a pre-deploy preview of what would deploy. Available from the command palette (⇧⌘P) and the Workspace sync section; scope can be narrowed to one domain.
* **Org Tracking** is available from the command palette as a compact dialog — search, filter, multi-select, and retrieve pending org changes into a chosen package without opening the full Org Tracker. (Desktop.)
* PR Analysis states why a check passed or failed: every Code Analyzer finding shows its severity and whether it blocks, and the check names the threshold in effect. AI architecture analysis distinguishes blocking concerns from advisory warnings and now gates when a project lists `architecture` in `--fail-on`. The `release/*` branch rule excludes architecture, so this stays opt-in.
* A failed validation shows the real build error on the GitHub check instead of "Failed to create packages". A StaticResource whose content lives in a folder no longer loses its content file during a diff-package build, and `sfp analyze` and diff-package validation resolve their bundled Java libraries on all builds.
* Release builds no longer time out on long-running domains — the build step limit is raised from 60 minutes to 4 hours.

### v51.51.1 — August 4, 2026

* Org drift analysis stops reporting components as missing that are present in the org — retrieved files are matched by their metadata type directory, so nested folders and non-`main` package roots resolve. This removed most drift findings on the measured tenant as false positives.
* Org drift analysis no longer misclassifies large text files as binary — each side is sampled to a character boundary, so a multi-byte character in a comment no longer disables difference detection or surfaces trailing-newline differences as drift.
* **Compare** no longer reports "Component … not found" for metadata whose name contains special characters, such as a layout named `Case-Case (Marketing) Layout`. The lookup falls back to a normalized comparison scoped to the org and metadata type.
* **Push** reports what it deployed — a push that resolves no deployable components errors instead of reporting success, and a successful push reports the component count.
* Non-owner developers can list a repository's pull requests; the list endpoint no longer requires the owner role.

### v51.51.0 — August 4, 2026

* The compliance check gates a pull request on finding severity: a `complianceSeverityThreshold` of `error`, `warning`, or `info` sets the cut-off, settable in `config/analyze.yaml`, project settings, or a branch rule. All findings are still reported; only the gate narrows. **Behaviour change:** the default is `error`, so a rule authored as a warning now advises instead of failing the check. A project that relied on warnings failing the check must set `complianceSeverityThreshold: warning` (or `info`) under `failOn: [compliance]`.
* An approval-gated developer access grant resolves its developer configuration when the grant runs, so an elevation approved later applies the current configuration. De-elevation retries a transient failure with backoff.

### v51.50.0 — August 4, 2026

* Onboarding preflight runs against every branch a project tracks, not only the repository default branch. Configuring a project for sfp clones, runs preflight, and opens the configuration pull request for each tracked branch, with baselines registered on the branch the project actually tracks. Wildcard branches are skipped, and when none resolve it falls back to the default branch. The configuration pull request is idempotent per branch — a re-run updates the existing one instead of opening a duplicate — and a per-branch failure is isolated and recorded in the preflight status. `sfp project preflight` accepts a `--branch` override.
* A pull request validation that fails on a pool-backed target reports the exact reason — for example, a missing pool — as a comment on the pull request with a link to the run, and keeps that reason in the check summary. Pool-backed review targets are verified before the first validation is dispatched.
* `config/analyze.yml`, `config/ai-assist.yml`, and `config/ai-architecture.yml` are detected with either the `.yml` or `.yaml` extension. Previously only the `.yaml` spelling was read and a `.yml` file was silently ignored; `.yaml` still takes precedence when both exist.
* The **Review environments** page shows a pull request's author and avatar instead of the CI application token (`app:…`) that created the environment. The author filter and search use the same value.
* The environment deploy panel distinguishes a release candidate from a release. On test and snapshot environments it presents as a **Release candidate** with the candidate's full deployed-to progression and an **N / M stages** indicator, and opens a detail dialog.
* Server logs distinguish a workflow disabled in **Workflow Configuration** from a branch exclusion, and include the matched branch pattern, so a missing build is easier to diagnose.

### v51.49.2 — August 4, 2026

* On the **Change Analysis** page, a row for a pull request whose analysis is still running links to the analysis run itself rather than the validation run. In-flight analyses show a **Running** state and an **Analysis Pending** status, and homepage analysis chips read **Analyzing…** instead of **Clean** until the run finishes. An analysis that fails or is cancelled without publishing results is marked failed or cancelled instead of staying pending.
* PR Analysis no longer times out on large, multi-file pull requests. Version assist now runs under a bounded time limit and degrades to an advisory skip when it exceeds it, so the linters and architecture checks still run and the pull request receives its checks.
* Cascade merges on large, heavily conflicted branches (100+ files) no longer fail with a timeout. AI-assisted conflict resolution is allowed up to two hours to complete.
* The **Code Analyzer** run page is rebuilt on web and desktop, with summary cards for errors, warnings, and trend; a filter toolbar for rule, class, and severity with clear-all; and search that filters the results — including by rule id in the class view — and persists across navigation.

### v51.49.1 — August 4, 2026

* PR Analysis on Azure DevOps now analyzes the files a pull request changed. Changed-file paths from Azure DevOps are normalized correctly; previously Code Analyzer received no files and reported a clean pass without checking anything.
* Pull requests that delete or rename files no longer fail Code Analyzer with a "path must be of type string" error. Deleted and renamed entries are handled, folder entries are ignored, and empty paths are filtered out.
* `config/duplicates.yml` and compliance configs are detected with either the `.yml` or `.yaml` extension. Each analysis run states which config file it used — or where it looked when none was found — and warns when an explicitly supplied config path does not exist.

### v51.49.0 — August 3, 2026

* Package and domain AI reports are branch-aware end to end — a report, its status check, and its share link stay tied to the branch they were generated against. Completed reports can be printed, opened in a standalone view, downloaded as HTML, and shared with a branch-qualified link. **Regenerate** forces a fresh analysis, and a report refreshes automatically when its run finishes.
* The alias chosen when fetching a pool sandbox is saved and shown as the primary label in **Assigned to me** on web and desktop. Aliases are cleared when a sandbox returns to the pool or expires.
* Validation no longer fails with "Cannot delete managed object" when a packaged custom-metadata (`__mdt`) picklist has had values renamed or removed. Locked, installed fields are skipped with a warning naming the leftover values; records, sibling fields, and regular picklists deploy normally.
* **Average PR Turnaround** on the CI/CD Performance dashboard counts pull requests opened in the selected period and is reported in hours. Past time ranges are anchored to their calendar window.

### v51.48.1 — August 2, 2026

* Error Monitoring parses standard Salesforce Flow failure emails — including sandbox notifications — extracting the flow name, failing element, error detail, and affected user. Flow emails without an org id are matched to the org by their Lightning domain.
* Selecting a time range with no errors shows a "No errors found" state. The setup screen appears only when monitoring has never received error data.
* Desktop: cloning a project on a machine with no stored git credentials fails with a clear authentication message and a ready-to-copy `git clone` command, instead of a `/dev/tty` crash. Credentials embedded in a URL are redacted from error messages.
* Desktop: **Sync → Deploy** works for projects containing unlocked packages. The deploy step receives the target Dev Hub, selected through a new dialog with a live connection check.
* A failing PR analysis check names the linter that gated it. A check that cannot be created is no longer recorded as a success, and transient network errors are retried.

## July 2026

### v51.48.0 — July 31, 2026

* GitHub's native **Re-run** button works on every codev check — per-domain validation checks, PR Analysis, and project analysis checks all dispatch the right run. Re-running a child check re-runs its parent validation, and a skipped rerun logs its reason.
* Validation reruns on merge-based checkouts anchor the diff baseline on the merge commit's own base, so a rerun only re-checks what the pull request touched.
* Pushing new commits to a pull request cancels the in-flight validation, its child runs, and any pending approvals before the new validation starts, instead of queueing behind them.
* Collapsed groups in flow logs show how long each step took — final duration for completed groups, live elapsed time for running ones.
* Projects that gated on Code Analyzer before severity thresholds existed had an empty threshold that fell back to the strictest setting. The intended **Critical** threshold is backfilled, and the settings UI persists the value on save.
* The **Conflicts** button on **Dev › Review › Pull Requests** toggles a "with conflicts" filter on the table instead of navigating to a route that did not exist.
* Tenants that do not use the platform AI integration can turn it off with `PLATFORM_AI_PROVIDER=none`. Credentials are retained so it can be re-enabled later.

### v51.47.0 — July 31, 2026

* Pull requests are branch-based end to end on desktop and web. Create one from the command palette or the Source Control header; the dialog shows source and target branch, warns about unpublished branches and unpushed commits, and lets you push from there. If a pull request already exists the action opens it. Azure DevOps repositories can now create pull requests.
* Org Changes attributes each changed component to its real package instead of labelling everything `src-temp`. Retrieving from Org Changes matches Org Explorer: cancellable bulk retrieve, a `main/default` layout pre-flight with one-click migration, and a completion toast.
* A `code-analyzer.yml` at the repository root is discovered and applied. A severity threshold controls when the analysis check fails — settable in `config/analyze.yaml` or project settings — and a run that analyzed nothing can no longer pass green.
* When a GitHub or Azure DevOps token has expired, creating a work item guides you through reconnecting. Permission denials name the missing permission, and an expired server-side integration credential no longer signs you out of codev.
* Impact analysis for release configs runs package checks in parallel — roughly 6–7× faster on a \~200-package repository, with identical output.
* Desktop: macOS updates apply a \~2 MB delta instead of re-downloading the full app (one final full download is needed to reach this build). A regression that broke desktop Apex test execution and PR validation since 1.23.0 — runtime code in folders named `tests` was pruned from packaged builds — is fixed, and every bundled worker is now boot-tested before a release ships.

### v51.46.0 — July 30, 2026

* For cloud tenants, the platform-managed AI fallback can route through Anthropic directly in addition to the existing gateway. Keys you configure yourself always take precedence. Decrypted integration secrets are returned only to application tokens, never to interactive users.
* The Module Explorer in Workspace Explorer resolves domains and packages for the selected branch instead of always showing the default branch.
* Desktop: **Create Package** runs against the selected project, appears in the footer with a clear title, and reports the real outcome instead of success before the work finishes. The Sync to Org deploy step reports package-level failures instead of showing "Deployed".
* Windows: filesystem moves and deletes during diff-package builds retry with backoff when antivirus or indexers hold file locks, and stale staging directories from failed builds are cleaned up.

### v51.45.0 — July 28, 2026

* Every sync entry point accepts a domain name, not just a release-config file path — `/codev sync <env> --domain <name>`, the CLI, and UI-dispatched syncs. Names are matched on the release name declared inside the config, and an unknown name fails fast listing the available domains. On `/codev sync-review-env`, `--domain` chooses what to sync while the pull request's active assignment chooses where, and a requested domain fans out to every review environment assigned to the pull request.
* Desktop: the remaining pages — Org Changes, Tag Manager, Domains, Packages, Package Versions, Validation Reports, Pull Requests, Run Apex Tests, Local Test Results, and Settings → Orgs — use the unified header row with the command palette (⇧⌘P).
* The Domains YAML editor saves. The Save button previously cleared the "Unsaved" badge without writing anything; it now persists through the same path as the Edit dialog, ⌘S saves, and invalid YAML surfaces inline.
* On Change Validation, long domain names truncate cleanly and the table fits \~1270px viewports.

### v51.44.0 — July 28, 2026

* Developer Config stores one named configuration per developer-config file instead of merging every file into a single block. De-elevation restores a user to the correct configuration's own default access level, and access-level names are no longer renamed on collision. The editor is a master-detail view with YAML autocomplete — schema keys with inline docs, profiles, and permission sets suggested from branch and org. The **Elevate** and **Add Users** dialogs gain a configuration selector. Existing configurations keep working as `default`.
* Desktop: a background worker that exits abnormally marks its task failed and releases its review environment, instead of ticking "running" forever. The validation worker reports the fatal error, and `skipTesting: false` is honored.
* Desktop fixes: **Create Package** lists every authenticated Dev Hub with the default preselected; the Org Changes refresh spinner clears reliably with a 60-second timeout on org round-trips; the Settings shortcut is ⌘, (Ctrl+, on Windows/Linux); the package-creation folder picker refreshes on open; renaming a package updates every domain release-config that referenced the old name.

### v51.43.2 — July 27, 2026

* The Run Apex Tests dialog in Ops no longer offers Coverage Validation and Results Storage options that were invalid for the test levels this action runs and made runs fail immediately.
* Importing a developer configuration is additive — existing access levels are preserved, and an imported level whose name already exists is kept under a suffixed name instead of overwriting. When a branch holds several configurations, a picker shows each file and its levels, and the import result lists what was added and renamed.

### v51.43.1 — July 27, 2026

* Desktop: the packaged app no longer crashes on startup of its sync-to-org worker with a "Cannot find module" error — a runtime dependency had been stripped during packaging. Ships in a new desktop build; server and CLI are unaffected.

### v51.43.0 — July 27, 2026

* Error Monitoring spans every registered Salesforce org in the tenant, with paginated loading and a guided setup screen. Error emails — including asynchronous Apex exceptions — are ingested through an unguessable, rotatable per-tenant address with signature validation, duplicate protection, and automatic retries.
* On cloud tenants the server decides which AI provider is used, so AI features keep working when a repository pins a specific provider. When no provider resolves, the feature skips with a clear message instead of failing with an authentication error. Self-hosted deployments managing their own keys are unaffected.
* Fetching a sandbox from a pool reports what happened — "no sandbox available" or "N sandboxes are currently being provisioned" instead of `Error: 200` — and reused assignments authenticate correctly. Desktop, web, and CLI behave identically.

### v51.42.0 — July 27, 2026

* Pool users can be provisioned individually, each with their own access level and password-reset choice. The **Add Users** dialog looks up existing codev users or accepts an email. Access levels are resolved on the server from the project's developer configuration — the client only sends the level name, closing a privilege-escalation gap where a forged policy block could grant more than the named level.
* New owner-only **Ops → Developer Config** page for defining a project's developer access levels on the server, with a schema-assisted editor, versioned saves, and an import from the repository. The same named levels drive pool provisioning and privilege elevation.
* Desktop: the activity lock lives in the database instead of UI state, so triggering the same action twice against the same target — from another window, or after a project switch — returns an "already running" message. Actions against different targets still run in parallel.
* Background tasks are tracked with heartbeats: tasks left behind by a crashed or force-quit app are recovered at next launch, and stalled tasks are reclaimed automatically.

### v51.41.0 — July 26, 2026

* Pending Approvals gains an **Approved · Last 30 days** tab scoped to the active repository — task type, scope, requester, approver, timestamps, response time, and work-item context. Tab selection is URL-addressable.
* Org Insights reports are shareable — **Share** copies a URL carrying the selected org. Opening Insights without an org picks the newest registered org that has a report.
* The Performance and Domain Evolution dashboards live under **Insights → Dashboards**. Existing dashboard URLs keep working.
* A pool tag reused across a sandbox pool and a scratch-org pool could make one pool unreachable by tag. New cross-type collisions are blocked at creation, and the Pools overview flags pre-existing ones.
* Cloud tenants route AI features through a platform-managed gateway with no keys to configure. A new **Settings → AI** page shows gateway status, model selection, and monthly usage. An AI integration you configure yourself takes precedence.
* Data-package org actions (Pull, Push, Simulate, Preview) run in the background with the outcome delivered as a toast with a logs link. Analysis and Validation tabs are URL-addressable.
* Desktop: auto-update completes its relaunch cleanly, and the app bundle is \~56 MB lighter.

### v51.40.3 — July 25, 2026

* Publishing artifacts to external npm registries (JFrog Artifactory, npmjs, GitLab) authenticates correctly for both token-based and basic-auth configurations. Previously no credentials were sent to any registry other than GitHub Packages.
* Artifacts published to external registries receive the intended branch dist-tag instead of always landing on `latest`.

### v51.40.2 — July 25, 2026

* Desktop: **My Activity** no longer crashes when switching to a tenant whose Project Pulse dashboard was cached from an older server build. Tiles with missing values show a "—" placeholder until fresh data loads.

### v51.40.1 — July 24, 2026

* Azure DevOps identity linking through Microsoft Entra device sign-in no longer loops for guest users whose Microsoft account lives in a different tenant than the Azure DevOps organization. The correct tenant is determined automatically; a genuine mismatch produces a message naming both tenants. Affected connections self-heal on their next token refresh.

### v51.40.0 — July 24, 2026

* The Release Dry Run Results comment links to the release candidate's detail page in codev — work items, packages, and commits since the production baseline — so approvers can review what a release carries before approving it.
* Release KPIs on the CI/CD Performance dashboard are scoped to environments in the `release` category. New cards break out snapshot and test release outcomes and flag release failures outside release environments.
* Log section timers stop when a run reaches a terminal state, instead of counting past the run's real end.
* Auth sessions show distinct **active**, **refresh available**, and **expired** states, and an expired token is never returned for scripting — you are pointed to refresh instead.

### v51.39.0 — July 23, 2026

* Retrieving metadata into a package that does not use the `main/default` layout warns before the retrieve and offers a one-click migration to the convention, so retrieves merge instead of creating a duplicate folder tree. Applies to bulk retrieves in Org Explorer and profile retrieves.
* Terminal runs record end timestamps, so Elapsed and Duration reflect the run's real length — a failed run no longer shows hours of phantom elapsed time.
* Validation concurrency is scoped per pull request, so different pull requests validate the same domain in parallel on their own pooled orgs. Same-PR safety is preserved.
* Pools using `installAll` resolve the artifact scope and registry from the repository's npm integration instead of falling back to the public registry.
* An inactive review-pool assignment rule no longer blocks creating a rule on the same branch pattern.

### v51.38.0 — July 23, 2026

* **Org Insights** introduced under **Observe → Org Insights**: an on-demand report for any registered org, covering twelve sections — an executive summary plus Apex, users, permissions, fields, field utilization, connected apps, object automation, packages, flows, logins, and content usage. Captures run in the background, keep a history, and download as a self-contained HTML file.
* Editing a pool offers schema-aware assistance — inline suggestions and validation as you type.
* Running an Apex test suite no longer trips over the `.cls` extension, and a rejected run shows the underlying Salesforce error.
* The **Open Org** frontdoor shortcut is disabled for production orgs.
* Work Items refresh runs as a background workflow instead of on the API request path, eliminating timeouts on larger boards.
* Run rows are clickable through to the run's details.

### v51.37.0 — July 22, 2026

* The log viewer shows elapsed time for each section of a run, and long transcripts are folded into collapsible phases — successful phases collapsed, failing phases expanded.
* The Runs and Scheduled Runs views add a sortable **Work Item** column and a searchable multi-select work-item filter. Filter and search selections persist between views.
* The Work Items board's **Refresh** forces a live status fetch, so merged pull requests no longer stay stuck showing "in progress". The cards gain an Open / Closed / All filter and hover details.
* Pool reconciliation interprets localized Salesforce sandbox statuses (German, French, Italian, Japanese, and others), so an in-progress sandbox on a non-English Dev Hub is not marked failed. Unrecognized statuses are held for retry.

### v51.36.0 — July 21, 2026

* codev's AI features — architecture and domain insights, validation-error analysis, AI reviews, version assist — can run on Claude through Google Cloud Vertex AI, for organizations that license Claude through their own Google Cloud project.
* Repository workspaces are cached: a persistent, token-free git mirror with a fresh isolated clone per run, instead of cloning from scratch every time. This speeds up builds on merge, PR validation and analysis, releases, sync, package creation, changesets, and repository visualization — most noticeably on large repositories.
* The pool editor's advanced configuration step discovers and inserts supported fields with schema-derived defaults, with formatting, copy, and reset. Field definitions come from the server.

### v51.35.4 — July 20, 2026

* Stopping the server waits for active runs — builds, releases, sandbox provisioning — to finish before shutting down, with options to force an immediate stop or bound the wait. An update aborts if work is still running when the drain times out, instead of interrupting it.
* In a release targeting several environments, one environment's failure no longer cancels the others. A mix of success and failure ends as **Partial**, a release with no successes shows **Failed**, and a rejected approval is recorded as cancelled for that environment only.
* Filters on the Runs page apply server-side, so pagination and the total count reflect the filtered set. A **Status** filter is added.

### v51.35.3 — July 16, 2026

* **Sync → Deploy to org** works from git worktree project layouts. A linked worktree's `.git` pointer file is recognized and a self-contained repository is rebuilt in the temporary deploy location, instead of failing with "fatal: not a git repository".

### v51.35.2 — July 16, 2026

* A self-hosted server update no longer silently disables SAML SSO. The update backfills the SAML setting when missing, while always preserving an explicit choice.
* Completes the passkey fix from v51.35.1: formatting escape codes leaking into machine-readable output made successful passkey preparations read as failures. Color output is disabled for these steps, so a success is reported as a success.

### v51.35.1 — July 16, 2026

* Passkey enrollment during PR validation is confirmed directly from the virtual authenticator, so gated runs no longer log false "Passkey preparation attempt failed" warnings. A genuine failure carries a secret-redacted reason.

### v51.35.0 — July 15, 2026

* **Cherry-to** introduced — delivers a pull request's net change onto a divergent target branch as a draft delivery pull request, for the exception cases where artifact promotion does not fit. Triggered from a pull request with `/codev cherry-to <target>`. A deterministic native apply is tried first, with bounded AI analysis and semantic file resolution as fallback when histories have diverged. The delivery pull request surfaces the AI's confidence, dependency findings, warnings, and resolved or unresolved conflicts, and preserves each original commit's author, date, and message. It is always a draft. Works on GitHub and Azure DevOps; requires per-project configuration, a target allow-list, and an active AI provider.
* PR validation prepares a virtual passkey after authentication, so UI automation on MFA- or passkey-enrolled review orgs runs without enrollment prompts. The credential exists only for the life of the job.
* Approval gating is resolved centrally: builds on merge and cascade releases (and their retries) stay ungated by default, adding a human gate applies to both, and changing a retry's environment or target re-applies the current gate.
* Retrying a failed build continues downstream releases by default, instead of leaving the rebuilt release candidate stranded.
* Version allocation is floored on the Dev Hub's promoted version, so a build can no longer produce a version Salesforce rejects after the artifact is built.
* The Releases "changes from previous" view compares all four version segments, so rollbacks show their real removed content instead of a placeholder.
* Package content diffs use a real diff algorithm — a one-line change shows as one line changed, not a rewritten file.

### v51.34.0 — July 11, 2026

* The Change Analysis and Change Validation tables link each result to the run that produced it — server runs open in place, external CI runs open in a new tab.
* Retrying a failed build resumes the release: failed and impacted packages are rebuilt under the same release-candidate version, and the release continues from where it left off. The retry dialog gains controls to force specific domains or packages and a **Continue releases after successful build** toggle.
* The flow-run detail page separates rerunning a whole flow from retrying a single job — **Rerun entire flow** in the header links to the new run, which carries a persistent rerun marker; **Retry job** groups attempts into job lineages and is allowed only from the latest attempt.
* Retrying a release re-resolves the environment's configured approver list instead of falling back to all project owners, and the latest-attempt rule is enforced at the server boundary.

### v51.33.4 — July 10, 2026

* Release requests apply **Exclude Packages** and **Override Package Versions** to the release candidate before the dry run, approval, and deployment — previously both were silently dropped.
* The build version sweep starts from each package's most recent published or tagged point instead of scanning most of the repository history, so builds on large repositories no longer stall at "Computing package versions".
* Build logs are organized into collapsible nested phases; failed phases stay expanded.

### v51.33.3 — July 10, 2026

* Review-environment assignment rules can be ranked, and when the winning pool has no free org the request falls through to the next ranked pool — including across pool types, such as a scratch-org tier falling back to a sandbox tier. Only capacity exhaustion triggers fallback; authentication and configuration errors surface immediately. The rule editor gains pool type and an integer priority.
* Priority acts as a tie-breaker between equally specific rules; a more specific rule always wins.
* Simultaneous requests for the same review environment settle on a single winner, and a losing speculative claim returns to its pool.

### v51.33.2 — July 10, 2026

* Replacing a registered org's stale SFDX auth URL now persists. Previously the new value validated but could not be saved, so expired credentials could not be rotated in place.

### v51.33.1 — July 9, 2026

* Web: registering an org with **This is a DevHub org** unchecked no longer validates it as a Dev Hub, so sandboxes, scratch orgs, and production orgs can be registered from the web app. A sandbox mistakenly marked as a Dev Hub is rejected with a message saying so, and genuine connection problems surface instead of reading as "not a Dev Hub".
* Review environments spanning multiple domains resolve correctly when opened without naming a domain, instead of reporting "not found".

### v51.33.0 — July 9, 2026

* A production release can be gated on a ServiceNow change request: one change request is opened (or reused) per release, carrying the release's changelog — package deltas and linked work items — and the deployment holds until it is approved. Environments without the gate deploy independently. Poll cadence and timeout are configurable per project. See [ServiceNow release gating](/flxbl/codev/governance/servicenow/gating.md).
* Owners can define exactly who approves — for releases and for operational actions (sandbox requests, freeze and unfreeze, installs, elevate, rollback, unbundle, sync). Approver lists can include non-owners, and the configured list is authoritative for both approve and reject across the UI, the API, and the `/codev approve` comment. See [Configuring approval gates](/flxbl/codev/governance/approval-gates.md).
* With segregation of duties enabled, the requester of an action cannot approve it — enforced uniformly across release and operational gates. A self-approval bypass was closed: caller-supplied approver lists and skip flags are stripped at the boundary.
* When checksum skip prunes unchanged Apex from a validation with tests, tests are selected from what is actually deployed and coverage is evaluated against the deployed Apex only.
* Behaviour change: the default approval timeout is 60 hours (previously 24), configurable per project. Projects that configure none of the new approval settings keep their previous behaviour.

### v51.32.0 — July 8, 2026

* A pool sandbox's stored login can be refreshed in place with a **Regenerate auth URL** action in **My Dev Orgs** and the pool detail instances table. Pool owners can refresh any sandbox in the pool; members can refresh their assigned sandbox.
* Fixed false "GitHub App not installed" errors that blocked git operations and the onboarding **Verify Installation** step for organizations with many app installations.
* Transient network errors between the server and its database on read-heavy pages retry automatically. Writes are never retried.
* On Azure DevOps, the version-assist `/version` comment edits its existing comment on each run instead of leaving stale information.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.flxbl.io/flxbl/codev/changelog.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
