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:

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 in tools/list (!252370 (merged)), no tool aliases or unlisted-tool option, no client info. The handlers get only the context: wiring and the render_mcp_result hook; tools/list is unchanged; orbit joins the 19.4 opt-in toolsets. On 19.4, GitLab Duo and /api/v4/orbit/mcp reach Orbit as on 19.5. The main /api/v4/mcp server can call the Orbit tools but does not list them.
  • Mcp::Tools::Orbit::CommandTool: 19.4 Mcp::Tools::Base::Response has no Reason and no rate_limited_error. The tool uses Response.error(message, details); the rate limit error keeps the structuredContent of master.
  • !261813 (merged): adds the bearer_challenge_scopes override and the insufficient_scope guard. A disabled MCP server still answers 404 on 19.4 (no mcp_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, ProductTrialResponse and the cdot_* 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, not SystemDefined::AddOn. orbit_promo: 10 goes in its enum, as on master.
  • !260080 (merged): the billing events client stays as on 19.4; only CloudConnector::Tokens.cloud_connector_instance_uid and the Orbit JWT change come in.
  • !258545 (merged), !261394 (merged), !261894 (merged): the group permission type gets only the Orbit ability fields.
  • !262325 (merged): Route gets only namespace_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.mod keeps the 19.4 gitaly v18, labkit and gopb modules and takes only the orbitpb versions; !263077 (merged) then removes orbitpb. Build, vet and go mod tidy -diff are clean.
  • !263077 (merged): duoworkflow/mcp.go removes the 19.4 serverName field.

Frontend:

  • 19.4 has no @gitlab/frontend-utils and uses eslint-plugin-import: Orbit files use parseBoolean from ~/lib/utils/common_utils and import/ rules.
  • orbit_tools_spec.rb: no tools/list examples 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, duoworkflow and upstream tests pass (one test needs Redis, not run locally).

Points for reviewers

  • Migrations: knowledge_graph_excluded_namespaces, orbit_namespace_enrollments and its beta backfill, and repository_storage on p_knowledge_graph_code_indexing_tasks. They keep their master timestamps, so an upgrade to 19.5 skips them.
  • GKG: gitlab-orbit-proto goes 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-Authenticate with the accepted scopes to every 403 insufficient_scope.
  • Commits: the squashed backport, and the prepare-as-if-foss-branch clone depth fix of the 19.5 backport (14335ad4). Danger reads only 20 commits, so the 99 per-MR commits stay on orbit-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
  • This MR has been approved by a maintainer (only one approval is required).
  • Ensure the e2e:test-on-omnibus-ee job 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:

Edited by Jean-Gabriel Doyon

Merge request reports

Loading
Loading