Backport the Orbit GA changes to 19.4
What does this MR do and why?
Backports to 19.4 the Orbit MRs merged to master after the 19.4 cutoff (2026-09-14): 45 MRs from the 19.4 to 19.5 window, the 46 MRs of the 19.5 backport (!263724 (merged)), and 3 dependencies. Replayed as one cherry-pick per MR, in merge order, then 5 commits that adapt Orbit to 19.4 (listed below), and squashed into one commit. The per-MR commits are on the reference branch orbit-backport-19-4-replay. Most MRs are features: needs a release manager exception.
Only what Orbit needs comes in. Non-Orbit changes that a pick depends on are adapted to 19.4 instead of backported (for example, no @gitlab/ui 138, no MCP toolset filter, no SystemDefined::AddOn).
MRs
| # | MR | Change | Author | Merged |
|---|---|---|---|---|
| 1 | !254789 (merged) | Trigger Orbit auto-index on settings update | dgruzd | 2026-09-15 |
| 2 | !255071 (merged) | Rename read_admin_knowledge_graph_settings to read_knowledge_graph_setting | dlrussel | 2026-09-15 |
| 3 | !254160 (merged) | Add excluded namespaces for Orbit auto-indexing | dgruzd | 2026-09-17 |
| 4 | !256092 (merged) | Add Orbit excluded groups administration | dgruzd | 2026-09-21 |
| 5 | !245640 (merged) | Update UI copy to use "GitLab Orbit" instead of standalone "Orbit" | fneill | 2026-09-21 |
| 6 | !257255 (merged) | Attribute Orbit indexer service traffic without a user identity | dgruzd | 2026-09-24 |
| 7 | !256627 (merged) | Add an instance setting to enable Orbit in DAP by default | dgruzd | 2026-09-24 |
| 8 | !253105 (merged) | Include Orbit REST API endpoints in OpenAPI spec | cfeick | 2026-09-16 |
| 9 | !256556 (merged) | Make Orbit: Read the one fine-grained token permission for GitLab Orbit | michaelangeloio | 2026-09-24 |
| 10 | !257602 (merged) | Keep the DAP session open when a Workhorse MCP tool call fails | jgdoyon1 | 2026-09-24 |
| 11 | !257295 (merged) | Add license checksum claim to the Orbit JWT | snachnolkar | 2026-09-24 |
| 12 | !253400 (merged) | feat(orbit): add internal cloud connector token endpoint | snachnolkar | 2026-09-24 |
| 13 | !254743 (merged) | Reduce Orbit API page to a pointer at the generated reference | abignotti | 2026-09-16 |
| 14 | !256465 (merged) | Add GQL query transport to Orbit | aalgutifan | 2026-09-25 |
| 15 | !256543 (merged) | Add deployed Orbit skills API | dgruzd | 2026-09-25 |
| 16 | !257946 (merged) | Memoize policy class maps during Orbit redaction batches | michaelangeloio | 2026-09-26 |
| 17 | !258297 (merged) | Add generic CustomersDot product trial client methods | jgdoyon1 | 2026-09-29 |
| 18 | !258545 (merged) | Add Orbit trial state to the group GraphQL API | jgdoyon1 | 2026-09-30 |
| 19 | !258502 (merged) | Add Orbit indexing status and item counts GraphQL fields | jgdoyon1 | 2026-10-01 |
| 20 | !258774 (merged) | Remove orbit_user_preference feature flag | dgruzd | 2026-10-01 |
| 21 | !258586 (merged) | Record Orbit beta and trial enrollments | jgdoyon1 | 2026-10-01 |
| 22 | !259040 (merged) | Remove orbit_enroll_namespace feature flag | dgruzd | 2026-10-01 |
| 23 | !258828 (merged) | Add the Orbit start-trial mutation | jgdoyon1 | 2026-10-02 |
| 24 | !259430 (merged) | Show all top-level groups in Orbit admin settings | michaelangeloio | 2026-10-05 |
| 25 | !259634 (merged) | Return 404 from Orbit skills routes when GKG is not configured | dgruzd | 2026-10-05 |
| 26 | !247458 (merged) | Advertise required scope in MCP WWW-Authenticate challenge | jessieay | 2026-09-15 |
| 27 | !259054 (merged) | Remove knowledge_graph and knowledge_graph_infra feature flags | dgruzd | 2026-10-05 |
| 28 | !259182 (merged) | Turn off Orbit when its trial ends | jgdoyon1 | 2026-10-05 |
| 29 | !259162 (merged) | Select Orbit skills using the caller's query language | aalgutifan | 2026-10-05 |
| 30 | !258504 (merged) | Add GQL response format to Orbit queries | aalgutifan | 2026-10-06 |
| 31 | !259637 (merged) | Add orbit_promo subscription add-on | qzhaogitlab | 2026-10-06 |
| 32 | !259950 (merged) | Return 404 from Orbit skills routes for users without enabled namespaces | dgruzd | 2026-10-06 |
| 33 | !260080 (merged) | Send the Cloud Connector instance uid in the Orbit JWT | snachnolkar | 2026-10-06 |
| 34 | !255042 (merged) | Add governing namespace error contract and Rails pre-check guard | snachnolkar | 2026-10-07 |
| 35 | !259971 (merged) | Remove orbit_foundational_agent feature flag | dgruzd | 2026-10-07 |
| 36 | !259638 (merged) | Provision orbit_promo add-on from the license | qzhaogitlab | 2026-10-08 |
| 37 | !260830 (merged) | Gate Orbit on the orbit_promo add-on on GitLab.com | jgdoyon1 | 2026-10-08 |
| 38 | !260907 (merged) | Rate-limit the Orbit graph status API per namespace | jgdoyon1 | 2026-10-09 |
| 39 | !261196 (merged) | Forward Orbit SDLC and code indexing phases in graph_status | jgdoyon1 | 2026-10-09 |
| 40 | !260183 (merged) | Show the Orbit trial on the group Orbit settings page | jgdoyon1 | 2026-10-09 |
| 41 | !261195 (merged) | Rebuild the Orbit Schema tab around a map and neighbors | jgdoyon1 | 2026-10-10 |
| 42 | !261279 (merged) | Move the Orbit query editor into its own tab | jgdoyon1 | 2026-10-10 |
| 43 | !261313 (merged) | Return Orbit MCP client errors as tool results | michaelangeloio | 2026-10-10 |
| 44 | !260936 (merged) | Replace the Orbit dashboard with the new shell and Overview tab | jgdoyon1 | 2026-10-11 |
| 45 | !261318 (merged) | Run Orbit query streams in Rails without holding Puma threads | michaelangeloio | 2026-10-11 |
| 46 | !261333 (merged) | Redesign the Admin area Orbit page | jgdoyon1 | 2026-10-11 |
| 47 | !261362 (merged) | Expose the Orbit trial offer on OrbitTrial | jgdoyon1 | 2026-10-11 |
| 48 | !261361 (merged) | Turn on Orbit in GitLab Duo by default | jgdoyon1 | 2026-10-11 |
| 49 | !260940 (merged) | Use the Orbit promo gate for billing namespace candidates | jgdoyon1 | 2026-10-12 |
| 50 | !261364 (merged) | Replace the Orbit empty state with the Off page | jgdoyon1 | 2026-10-12 |
| 51 | !260668 (merged) | Add a WWW-Authenticate challenge to insufficient scope errors | jmrp | 2026-10-12 |
| 52 | !261396 (merged) | Report unsupported resource types in Orbit redaction | michaelangeloio | 2026-10-12 |
| 53 | !255038 (merged) | Block Orbit queries when no billing namespace can be resolved | snachnolkar | 2026-10-12 |
| 54 | !261557 (merged) | List only Orbit groups the user can query on the dashboard | jgdoyon1 | 2026-10-12 |
| 55 | !261394 (merged) | Add the Group status tab to the Orbit dashboard | jgdoyon1 | 2026-10-12 |
| 56 | !261635 (merged) | Resolve the Orbit access state for 10 groups and check the admin turn on | jgdoyon1 | 2026-10-12 |
| 57 | !261783 (merged) | Change orbit_promo_access_gate flag type to gitlab_com_derisk | dgruzd | 2026-10-13 |
| 58 | !261883 (merged) | Stop the Orbit Overview waiting on groups that never index | jgdoyon1 | 2026-10-13 |
| 59 | !261892 (merged) | Show the Orbit counts of the groups that answer | jgdoyon1 | 2026-10-13 |
| 60 | !261894 (merged) | Move the Orbit GraphQL API under one orbit object | jgdoyon1 | 2026-10-14 |
| 61 | !261927 (merged) | Update dependency gitlab-orbit-proto to v0.137.1 | gitlab-dependency-update-bot | 2026-10-14 |
| 62 | !262136 (merged) | Add the Orbit billing account for top-level groups | jgdoyon1 | 2026-10-14 |
| 63 | !262214 (merged) | Keep the Orbit overview globe while new projects index | jgdoyon1 | 2026-10-14 |
| 64 | !262193 (merged) | Point Orbit "Leave feedback" link to open master feedback epic | mvanremmerden | 2026-10-14 |
| 65 | !262267 (merged) | Update the Orbit Quickstart, overview card, and group status billing link | jgdoyon1 | 2026-10-14 |
| 66 | !261207 (merged) | Register Orbit tools in the main MCP server | michaelangeloio | 2026-10-15 |
| 67 | !261155 (merged) | Disable beta Orbit enrollments on GitLab.com at GA | dgruzd | 2026-10-15 |
| 68 | !262469 (merged) | Cover non-object JSON query string in Orbit command tool spec | dgruzd | 2026-10-15 |
| 69 | !260931 (merged) | Answer Orbit MCP notifications with 202 Accepted | jmrp | 2026-10-15 |
| 70 | !261678 (merged) | Add the self-managed Orbit instance trial | jgdoyon1 | 2026-10-15 |
| 71 | !262502 (merged) | Show the Orbit node sidebar below the indexing button | jgdoyon1 | 2026-10-15 |
| 72 | !262545 (merged) | Declare the external dependency of the Orbit trial cron | jgdoyon1 | 2026-10-15 |
| 73 | !262544 (merged) | Remove Beta badges from the Orbit UI | jgdoyon1 | 2026-10-15 |
| 74 | !262603 (merged) | Allow Orbit indexing without a trial on GitLab Self-Managed | jgdoyon1 | 2026-10-15 |
| 75 | !262325 (merged) | List the groups of the Orbit token on the Orbit dashboard | jgdoyon1 | 2026-10-16 |
| 76 | !262749 (merged) | Record direct Orbit enrollments on self-managed | dgruzd | 2026-10-16 |
| 77 | !262337 (merged) | Show the Orbit access rule on every Orbit page and index instances without a trial | jgdoyon1 | 2026-10-16 |
| 78 | !262992 (merged) | Remove the unused Orbit schema type validators | jgdoyon1 | 2026-10-17 |
| 79 | !261813 (merged) | Answer refused tokens on the MCP endpoints with their challenge | jmrp | 2026-10-17 |
| 80 | !263010 (merged) | Redesign the Orbit Schema tab as a clustered graph | jgdoyon1 | 2026-10-17 |
| 81 | !263038 (merged) | Stream Orbit query results through Rails in chunks | michaelangeloio | 2026-10-18 |
| 82 | !263080 (merged) | Apply the Orbit GA indexing billing rules | jgdoyon1 | 2026-10-18 |
| 83 | !263091 (merged) | Ask CustomersDot-ineligible groups to purchase Orbit | jgdoyon1 | 2026-10-19 |
| 84 | !263083 (merged) | Serve the Orbit schema through GraphQL | michaelangeloio | 2026-10-19 |
| 85 | !263099 (merged) | Move the Orbit trial end to the group billing account | jgdoyon1 | 2026-10-19 |
| 86 | !263063 (merged) | Change orbit_trial flag type to beta | dgruzd | 2026-10-19 |
| 87 | !263232 (merged) | Enable orbit_query_in_rails by default | dgruzd | 2026-10-19 |
| 88 | !262486 (merged) | Point Duo Chat Orbit "Leave feedback" link to master epic | mvanremmerden | 2026-10-19 |
| 89 | !262737 (merged) | Add repository_storage to Knowledge Graph code indexing tasks | dgruzd | 2026-10-19 |
| 90 | !263077 (merged) | Remove the orbit_query_in_rails feature flag | michaelangeloio | 2026-10-19 |
| 91 | !263371 (merged) | Fix Orbit settings and dashboard issues from the monetization E2E run | jgdoyon1 | 2026-10-20 |
| 92 | !263719 (merged) | Add SKIP and OFFSET to the Orbit query editor | aalgutifan | 2026-10-20 |
| 93 | !263611 (merged) | Make the Orbit UI copy correct and consistent before GA | jgdoyon1 | 2026-10-21 |
| 94 | !263777 (merged) | Say that indexing continues on the Orbit settings after the trial | jgdoyon1 | 2026-10-21 |
Partial picks, in the 19.4 adaptation commits:
- !258241 (merged): the Orbit API docs query examples.
- !260969 (merged): only the
RESOURCE_ACCESS_ERRORfrontend constant. - !259565 (merged): only the 3 socket errors in
CdotResponseError(thegitlab-httppart is already on 19.4).
Selection
MRs merged to master between the 19.4 base (2026-09-14) and the 19.5 base (2026-10-12), any author, found by: label groupcontext-systems, Orbit authors, and files or diff lines that mention orbit or knowledge_graph. All into 'master' merges count, not only the first-parent chain. Then the 46 MRs of !263724 (merged).
Already on 19-4-stable-ee: !257045 (merged), !258460 (merged), !262140 (merged), !262513 (merged).
Excluded: docs-only MRs and translations, non-Orbit MRs by the same authors, frontend and spec cleanups that touch an Orbit file only by chance, MCP and Duo changes that Orbit does not need (!257035 (merged), !259607 (merged), !260063 (merged), !261080 (merged)), security merges.
19.4 adaptations
Shared code (review closely):
- !261207 (merged),
lib/api/mcp: 19.4 MCP has no toolset filter intools/list(!252370 (merged)), no tool aliases or unlisted-tool option, no client info. The handlers get only thecontext:wiring and therender_mcp_resulthook;tools/listis unchanged;orbitjoins the 19.4 opt-in toolsets. On 19.4, GitLab Duo and/api/v4/orbit/mcpreach Orbit as on 19.5. The main/api/v4/mcpserver can call the Orbit tools but does not list them. Mcp::Tools::Orbit::CommandTool: 19.4Mcp::Tools::Base::Responsehas noReasonand norate_limited_error. The tool usesResponse.error(message, details); the rate limit error keeps thestructuredContentof master.- !261813 (merged): adds the
bearer_challenge_scopesoverride and theinsufficient_scopeguard. A disabled MCP server still answers 404 on 19.4 (nomcp_denial_message, !255480 (merged)). - !260668 (merged): the spec adds only
#applicable_scopes; the granular OAuth token cases need code that is not on 19.4. - !258297 (merged):
CdotResponseError,ProductTrialResponseand thecdot_*helpers as on master. The Secrets Manager errors and methods stay as on 19.4 (!256144 (merged) is not backported). - !259637 (merged): 19.4 has the database
GitlabSubscriptions::AddOn, notSystemDefined::AddOn.orbit_promo: 10goes in its enum, as on master. - !260080 (merged): the billing events client stays as on 19.4; only
CloudConnector::Tokens.cloud_connector_instance_uidand the Orbit JWT change come in. - !258545 (merged), !261394 (merged), !261894 (merged): the group permission type gets only the Orbit ability fields.
- !262325 (merged):
Routegets onlynamespace_ids_matching. - !261361 (merged): the preferences bundle removes
initOrbitSubsettings;initIntegrations(!257858 (merged)) is not added. ee/config/schedule.yml,1_settings_spec.rb: keep the 19.4 AI events count cron next to the new Orbit trial cron.
Workhorse:
go.modkeeps the 19.4 gitaly v18, labkit and gopb modules and takes only theorbitpbversions; !263077 (merged) then removesorbitpb. Build, vet andgo mod tidy -diffare clean.- !263077 (merged):
duoworkflow/mcp.goremoves the 19.4serverNamefield.
Frontend:
- 19.4 has no
@gitlab/frontend-utilsand useseslint-plugin-import: Orbit files useparseBooleanfrom~/lib/utils/common_utilsandimport/rules. orbit_tools_spec.rb: notools/listexamples that need toolset selection.
Siphon: no siphon_ai_governance_sessions table on 19.4. The GKG indexer completes the AgentSession and CREATED_MR plans when their source table does not exist (gitlab-org/orbit/knowledge-graph!3005 (merged), GKG v0.154.1).
Generated files: kept at 19.4 during the replay, regenerated in one commit (GraphQL docs and introspection, OpenAPI v3, gitlab.pot).
Verification
- This pipeline.
- Orbit
e2e-gitlab-stable: [19-4]against the CNG images of this revision.
Local tests
On the 19.4 dependencies (19.4 bundle, yarn install of the 19.4 lockfile, test databases built from this structure.sql):
- 587 of 611 Orbit-named files are identical to !263724 (merged). The other files differ only by the adaptations above. The 3 Orbit PostgreSQL tables are identical to 19.5.
- RSpec, 150 changed spec files: 17,331 examples. The 19 Orbit failures of the first run pass after the adaptations. 11 Elasticsearch indexing examples need a running Elasticsearch (not run locally).
- Jest, 75 changed spec files: 1,354 tests pass. One suite needs the frontend islands build (not built locally).
- ESLint on 174 files, RuboCop on added lines,
zeitwerk:check: clean. - Workhorse: build, vet,
duoworkflowandupstreamtests pass (one test needs Redis, not run locally).
Points for reviewers
- Migrations:
knowledge_graph_excluded_namespaces,orbit_namespace_enrollmentsand its beta backfill, andrepository_storageonp_knowledge_graph_code_indexing_tasks. They keep theirmastertimestamps, so an upgrade to 19.5 skips them. - GKG:
gitlab-orbit-protogoes from 0.105 to 0.147. 19.4 needs GKG v0.154.1 or later (proto support and missing siphon tables). - Puma: Orbit queries move from Workhorse to Puma (!263038 (merged), !263232 (merged), !263077 (merged)). No rollback flag.
- REST API: !260668 (merged) adds
WWW-Authenticatewith the accepted scopes to every 403insufficient_scope. - Commits: the squashed backport, and the
prepare-as-if-foss-branchclone depth fix of the 19.5 backport (14335ad4). Danger reads only 20 commits, so the 99 per-MR commits stay onorbit-backport-19-4-replay. Turn off "Squash commits" before merge.
MR acceptance checklist
- This MR is backporting a bug fix, documentation update, or spec fix, previously merged in the default branch. Not the case for most MRs: release manager exception requested.
- The MRs on the default branch have been deployed to GitLab.com.
- The MR title is descriptive.
- Required labels have been applied to this merge request
- severity label and bug subtype labels (if applicable)
- If this MR fixes a bug that affects customers, the customer label has been applied.
- This MR has been approved by a maintainer (only one approval is required).
- Ensure the
e2e:test-on-omnibus-eejob has succeeded, or if it has failed, investigate the failures.
Note to the merge request author and maintainer
If you have questions about the patch release process, please:
- Refer to the patch release runbook for engineers and maintainers for guidance.
- Ask questions on the
#releasesSlack channel (internal only). - Once the backport has been merged, the commit changes will be automatically deployed to a release environment that can be used for manual validation. See after merging runbook for details.