Organizations Feature Parity: Create – Import
## Overview This epic tracks the work required to make **Import** features fully compatible with Organizations feature parity. ## Context - [Self-assessment](https://gitlab.com/gitlab-com/gl-infra/tenant-scale/organizations/organizations-feature-parity/-/work_items/14) - [Feature parity epic](https://gitlab.com/groups/gitlab-com/gl-infra/-/work_items/1871) ## Components - Direct Transfer - GitHub Importer - Bitbucket Cloud - Bitbucket Server - Import by URL - FogBugz - Gitea - Manifest - File-based Import/Export - Webhooks ## Issues | Priority | Status | Issue | Milestone | Latest update | |----------|--------|-------|-----------|---------------| | 1 | :white_check_mark: Closed | [Scope DB uniqueness constraints (Direct Transfer) #595675](https://gitlab.com/gitlab-org/gitlab/-/issues/595675) | Completed in %19.1 | Closed 2026-06-03. `bulk_import_batch_trackers` org-scoped index shipped via [!237014](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/237014) + [!237069](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/237069). `bulk_import_trackers` resolved as not-needed (already cell-safe via the cluster-unique sequence FK). Third index split out to [#600457](https://gitlab.com/gitlab-org/gitlab/-/issues/600457). | | 2 | :white_check_mark: Closed | [Scope stale import queries (Direct Transfer) #595673](https://gitlab.com/gitlab-org/gitlab/-/issues/595673) | Completed in %19.1 | Closed 2026-06-10. Transformers + `GroupLoader` lookups scoped to the import organization via [!238772](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/238772) (MR-C). Earlier resolver MR [!238181](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/238181) closed by design (made the `isolated?` gate dead code; reverted to the [!236603](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/236603) baseline). Cron-worker portion is a no-op per the cell-wide cron decision. | | 3 | :white_check_mark: Closed | [Cross-org entity validation (Direct Transfer) #595674](https://gitlab.com/gitlab-org/gitlab/-/issues/595674) | Completed in %19.1 | Closed 2026-05-21 via [!236603](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/236603). Rejects Direct Transfer imports crossing org boundaries when either side is `isolated?`; mirrors `Members::CreatorService#commit_member`, no-op for non-isolated orgs. | | 4 | :white_check_mark: Closed | [Update organization_transfer_support YAMLs #595676](https://gitlab.com/gitlab-org/gitlab/-/issues/595676) | Completed in %19.0 | Closed 2026-05-12. Marked import-related tables (`bulk_import_*`, `web_hooks`, `integrations`, `web_hook_logs_daily`) as `no_work_needed`. Shipped via [!233779](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/233779) + [!234790](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/234790). | | 5 | :white_check_mark: Closed | [Add org scoping to import routes (GitHub, Gitea, BulkImports API) #595677](https://gitlab.com/gitlab-org/gitlab/-/issues/595677) | Missed %19.1; tracker still shows %19.2 | Closed 2026-06-15. [!237093](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/237093) merged 2026-06-15 and deployed 2026-06-16: scopes GitHub controller params + service `target_namespace`, adds GitHub API `set_current_organization`, moves BulkImports API org-setting to a top-level `before`; Gitea fixed through controller inheritance. File-based + admin Webhooks split out to [#600458](https://gitlab.com/gitlab-org/gitlab/-/issues/600458). Labels include `missed-deliverable` / `missed:19.1`; tracker still shows milestone %19.2. | | 6 | :white_check_mark: Closed | [Scope prune_expired_export_jobs (File-based) #595681](https://gitlab.com/gitlab-org/gitlab/-/issues/595681) | Completed in %19.0 | Closed 2026-05-13 as no-op. Cell-wide cleanup crons don't need per-org iteration; the sharding key already scopes per cell ([decision](https://gitlab.com/gitlab-com/gl-infra/tenant-scale/organizations/organizations-feature-parity/-/work_items/14#note_3338397127)). [!234874](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/234874) closed without merging. | | 7 | :white_check_mark: Closed | [Propagate org context in Webhook workers #595678](https://gitlab.com/gitlab-org/gitlab/-/issues/595678) | Completed in %19.1 | Closed 2026-05-21. Derives `organization_id` from the hook record in `web_hook_worker.rb` and `log_execution_worker.rb` (approach confirmed by [@rutgerwessels](https://gitlab.com/rutgerwessels); `GroupHook` is EE-only, so the fix has a FOSS/EE split). | | 8 | :white_check_mark: Closed | [Add organization_id to logs/audit/usage (Direct Transfer + GitHub) #595679](https://gitlab.com/gitlab-org/gitlab/-/issues/595679) | Completed in %19.1 | Closed 2026-06-15 via [!239120](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/239120). Adds `organization_id` to structured logs for Direct Transfer + GitHub. Remaining 8 components split out to [#600459](https://gitlab.com/gitlab-org/gitlab/-/issues/600459). | | 9 | :white_check_mark: Closed | [Add org context to RSpec/QA tests (Direct Transfer + GitHub) #595680](https://gitlab.com/gitlab-org/gitlab/-/issues/595680) | Completed in %19.2 | Closed 2026-06-22. [!241798](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/241798) merged 2026-06-22 and deployed the same day: asserts organization context in Direct Transfer and GitHub import specs. Deliverable completed for %19.2. | | 10 | :white_circle: Ready | [Spike: Investigate org-level CRUD for Integrations and System Hooks #598315](https://gitlab.com/gitlab-org/gitlab/-/issues/598315) | Milestone **%19.2** | Ready for development, no MR, no assignee. Investigation/scoping only; related to [#599597](https://gitlab.com/gitlab-org/gitlab/-/issues/599597) for Generic Integrations Framework ownership. Not tagged Deliverable. **The only open issue left in the epic.** | | 11 | :white_check_mark: Closed | [Resolve `BulkImport.organization_id` decoupling #598525](https://gitlab.com/gitlab-org/gitlab/-/issues/598525) | Completed in %19.1 | Closed 2026-05-20. Resolution: both tables `no_work_needed` (follow parent `BulkImport`, which isn't group-transferred). | | 12 | :white_check_mark: Closed | [[1/3] Add organization_id to bulk_import_exports (parent table) #600457](https://gitlab.com/gitlab-org/gitlab/-/issues/600457) | Completed in %19.2 | Closed 2026-06-26. Step 1 of 3 complete. [!241088](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/241088) (nullable column/index/FK) merged 2026-06-23 and deployed to production same day; stacked [!241089](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/241089) (sharding-key trigger + BBM backfill) merged 2026-06-26 and deployed to production 2026-06-26 12:55 UTC. Backfill verified fully finished on production 2026-07-02. Deliverable completed for %19.2. | | 13 | :white_check_mark: Closed | [Add org scoping to File-based controllers + admin Webhooks #600458](https://gitlab.com/gitlab-org/gitlab/-/issues/600458) | Completed in %19.2 | Closed 2026-07-02. Community MR [!237441](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/237441) by [@DhairyaMajmudar](https://gitlab.com/DhairyaMajmudar) merged, scoping File-based `projects/imports_controller.rb`, `groups/imports_controller.rb`, and `admin/hooks_controller.rb` to `Current.organization`. Deliverable completed for %19.2. | | 14 | :white_check_mark: Closed | [Add `organization_id` to remaining 8 Import component loggers #600459](https://gitlab.com/gitlab-org/gitlab/-/issues/600459) | Completed in %19.2 | Closed 2026-06-24. [!240877](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/240877) merged 2026-06-24: adds `organization_id` to structured logging/error tracking for the remaining 8 components (Bitbucket Cloud/Server, URL/manifest, FogBugz, Gitea, File-based, webhook logs). Deliverable completed for %19.2. | | 15 | :white_check_mark: Closed | [Add organization context to remaining 8 Import component specs #600460](https://gitlab.com/gitlab-org/gitlab/-/issues/600460) | Completed in %19.2 | Closed 2026-06-25. [!242053](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/242053) merged 2026-06-26 and deployed to production same day: adds persisted-`organization_id` assertions to specs (Bitbucket Cloud project_creator + service, FogBugz project_creator, Manifest project_creator); the log-payload side was covered by [#600459](https://gitlab.com/gitlab-org/gitlab/-/issues/600459)/[!240877](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/240877), other component specs already asserted org on master. Reviewer [@jnutt](https://gitlab.com/jnutt)'s suggestions applied. Deliverable completed for %19.2. | | 16 | :white_check_mark: Closed | [Cross-org validation (Offline Transfer) #600608](https://gitlab.com/gitlab-org/gitlab/-/issues/600608) | Completed in %19.1 | Closed 2026-06-15 via [!239611](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/239611). Applies the same `isolated?`-gated cross-org check from [#595674](https://gitlab.com/gitlab-org/gitlab/-/issues/595674) to `Import::Offline::Imports::CreateService`. | | 17 | :white_check_mark: Closed | [[2/3] Add organization_id to bulk_import_export_batches (child table) #603592](https://gitlab.com/gitlab-org/gitlab/-/issues/603592) | Closed as not needed | Closed 2026-07-06 as **Won't do**. Parent backfill ([#600457](https://gitlab.com/gitlab-org/gitlab/-/issues/600457)) was verified finished on production 2026-07-02, and implementation started via [!243557](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/243557) (add column) + [!243559](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/243559) (trigger + backfill), both draft. [@rutgerwessels flagged](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/243557#note_3521457339) that `organization_id` serves no purpose here: `(export_id, batch_number)` is already cell-safe since `export_id` comes from a cluster-unique sequence. Both MRs closed without merging; issue closed as not needed. | | 18 | :white_check_mark: Closed | [[3/3] Org-scoped unique index + NOT NULL on bulk_import_export_batches #603593](https://gitlab.com/gitlab-org/gitlab/-/issues/603593) | Closed as not needed | Closed 2026-07-06 as **Won't do**, same reasoning as [#603592](https://gitlab.com/gitlab-org/gitlab/-/issues/603592): the sharding-key work on `bulk_import_export_batches` isn't needed since the existing `(export_id, batch_number)` uniqueness is already cell-safe via `export_id`'s cluster-unique sequence. | **Priority rationale**: - [DB index changes #595675](https://gitlab.com/gitlab-org/gitlab/-/issues/595675) went first since they required longer review cycles. - Core data scoping issues ([stale queries #595673](https://gitlab.com/gitlab-org/gitlab/-/issues/595673), [cross-org validation #595674](https://gitlab.com/gitlab-org/gitlab/-/issues/595674)) are complete. - [YAML updates #595676](https://gitlab.com/gitlab-org/gitlab/-/issues/595676) were mechanical `no_work_needed` flips; the blocked subset was split out into [#598525](https://gitlab.com/gitlab-org/gitlab/-/issues/598525). - [Route scoping #595677](https://gitlab.com/gitlab-org/gitlab/-/issues/595677) is done; remaining route/controller scope moved to [#600458](https://gitlab.com/gitlab-org/gitlab/-/issues/600458), now also done. - Low-hanging infra fixes ([prune jobs #595681](https://gitlab.com/gitlab-org/gitlab/-/issues/595681), [webhook workers #595678](https://gitlab.com/gitlab-org/gitlab/-/issues/595678)) are done. - [Observability #595679](https://gitlab.com/gitlab-org/gitlab/-/issues/595679) split into done Direct Transfer/GitHub work plus remaining-component logger work [#600459](https://gitlab.com/gitlab-org/gitlab/-/issues/600459), now also done. - Tests are split into completed Direct Transfer/GitHub [#595680](https://gitlab.com/gitlab-org/gitlab/-/issues/595680) and remaining components [#600460](https://gitlab.com/gitlab-org/gitlab/-/issues/600460); both done. - [Spike #598315](https://gitlab.com/gitlab-org/gitlab/-/issues/598315) runs independently and produces a scoping doc. Still the only open issue. - The `bulk_import_export_batches` sharding-key work was split into 3 milestone-scoped issues ([#600457](https://gitlab.com/gitlab-org/gitlab/-/issues/600457) → [#603592](https://gitlab.com/gitlab-org/gitlab/-/issues/603592) → [#603593](https://gitlab.com/gitlab-org/gitlab/-/issues/603593)). After [#600457](https://gitlab.com/gitlab-org/gitlab/-/issues/600457)'s backfill completed on production, [#603592](https://gitlab.com/gitlab-org/gitlab/-/issues/603592) and [#603593](https://gitlab.com/gitlab-org/gitlab/-/issues/603593) were closed as **not needed**: `(export_id, batch_number)` is already cell-safe via `export_id`'s cluster-unique sequence, so no `organization_id` sharding key was required on the child table. **Status**: 17 of 18 issues closed. The `bulk_import_export_batches` sharding-key chain ([#600457](https://gitlab.com/gitlab-org/gitlab/-/issues/600457) → [#603592](https://gitlab.com/gitlab-org/gitlab/-/issues/603592) → [#603593](https://gitlab.com/gitlab-org/gitlab/-/issues/603593)) is fully resolved: [#600457](https://gitlab.com/gitlab-org/gitlab/-/issues/600457) shipped the parent backfill, but [#603592](https://gitlab.com/gitlab-org/gitlab/-/issues/603592) and [#603593](https://gitlab.com/gitlab-org/gitlab/-/issues/603593) were closed as not needed on 2026-07-06 after [@rutgerwessels](https://gitlab.com/rutgerwessels) confirmed `(export_id, batch_number)` is already cell-safe via `export_id`'s cluster-unique sequence. The only remaining open issue is the [Spike #598315](https://gitlab.com/gitlab-org/gitlab/-/issues/598315) (investigation only, not tagged Deliverable, no MR). ## People - DRI: [@reza-marandi](https://gitlab.com/reza-marandi) - Engineering Manager: [@thiagocsf](https://gitlab.com/thiagocsf)
epic