Skip to content

Fixes 33165: Unify onboarding and intake forms - #33166

Draft
harshach wants to merge 5 commits into
mainfrom
harshach/onboarding-intake
Draft

Fixes 33165: Unify onboarding and intake forms#33166
harshach wants to merge 5 commits into
mainfrom
harshach/onboarding-intake

Conversation

@harshach

@harshach harshach commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

Describe your changes:

Fixes #33165

Unifies Intake Forms and staged onboarding for Data Products, Domains, Glossary Terms, and Metrics, including configuration, guided creation and completion, delegated work, workflow approvals, and progress monitoring.

Type of change:

  • New feature

High-level design:

Extends the existing IntakeForm schema and repositories with shared gate enforcement, indexed JDBI progress storage, Task V2/Flowable approval bindings, version-pinned configurations, and resumable enrollment; native MySQL/PostgreSQL migrations target 2.1.0, preserving legacy intake payloads and existing In Review/Approved processes.

  • One source for field requirements; schema-required fields fixed at Creation
  • Workflow evidence, approval invalidation after revisions, thresholds, and idempotent concurrent submissions
  • Combined builder and isolated preview, shared checklist, paginated board, permissions, dirty-state protection, and conflict/failure recovery
  • Existing intake and workflow infrastructure reused to preserve enforcement and authorization
  • Board batches current assets, responsibilities, tasks, and workflow evidence; each request scans at most 1,000 candidates, returning a scan-limit marker and continuation cursor for sparse filters, with a translated prompt to continue
  • Architecture, API contract, compatibility, and rollout

Tests:

Board scan review validation — September 11

  • 101 integration tests passed on each database; scan boundaries, sparse domain/assignee filters, denied candidates, bounded queries, continuation without lost matches, and final exhaustion
  • 5 new component cases and 3 board browser journeys passed; empty/partial/full scans, next/previous, reload, retry after a failed continuation, filter reset, and links to real tasks/assets
  • Browser budget cases use small real fixtures with an injected scan-limit response and 503, then follow the real API; integration tests verify the actual 1,000-candidate ceiling
  • Java/TypeScript/Python model generation, backend build, Spotless, exact UI checkstyle, licenses, translations/app-docs, full Playwright lint, and 115 CI planning tests passed
  • TypeScript: existing 619 application / 165 Playwright diagnostics; no added file/error-code counts versus main

Main merge validation — September 11

  • Merged origin/main at 95847bcb85; resolved the two native 2.1.0 migrations and Data Product/Metric detail imports
  • 170 UI tests across 17 suites, 77 Java tests, and 96 integration tests on each of MySQL and PostgreSQL passed
  • 115 CI planning tests passed after regenerating the Playwright impact map
  • Backend/core UI builds, exact UI checkstyle, Java Spotless, translation/app-doc generation, and commit hooks passed
  • TypeScript still reports 619 application / 165 Playwright errors; no added file/error-code counts compared with main
  • Playwright browser journeys were not rerun for this merge

Use cases covered

  • All four entity types: configure → UI create → delegate → save/reload → workflow approval → Approved board
  • Creation requirements, conditions, custom properties, granular permissions, keyboard navigation, dirty edits, failed requests, and conflicting updates
  • Multiple approvals, rejection/resubmission, changed review inputs, thresholds, concurrency, suspended/deleted/unassigned workflows
  • Configuration pinning, backfill exclusions and recovery, board filters/pagination, and preview isolation
  • Sparse catalogs with matches beyond 1,000 rows, exact-size final pages, denied/deleted assets, deleted assignees, SQL query budgets, and board/detail parity across all four types

Unit tests

  • Prior implementation validation: 198 Jest tests passed across 16 focused suites; selected onboarding UI line coverage 62.15% (844/1,358), below the 90% target
  • Co-located Onboarding*.test.tsx, onboarding utility tests, IntakeFormDesignerModal.test.tsx, creation-form and task-panel regressions
  • Latest focused Java regression run: 77 passed, covering onboarding, workflow graphs, certification, patch handling, and data retention
  • Earlier broader Java run: 131/132 passed; TaskWorkflowLifecycleResolverTest.workflowStartVariablesTolerateNullOptionalFields expects Medium but receives null, also reproduced with the unchanged origin/main resolver
  • Latest database integration coverage: 95.38% for OnboardingBoardService; prior coverage 97.41% for OnboardingBoardContext and 100% for OnboardingReadContext; the broader changed-class 90% target remains unmet

Backend integration tests

  • OnboardingBoardResourceIT, OnboardingResourceIT, and IntakeFormResourceIT: 101 passed on MySQL and 101 on PostgreSQL, with zero failures or skips, including native 2.1.0 startup and real Flowable approvals
  • Board states checked against individual asset progress through delegated work, changing domain ownership, multiple approvals, rejection/resubmission, metadata revisions, workflow failures, and completion

Ingestion integration tests

  • Not applicable: no ingestion connector changes
  • Java, TypeScript, and Python models regenerated and Python models validated during implementation

Playwright (UI) tests

  • Prior UI validation: 63 passed on Chromium/MySQL/Elasticsearch with real Flowable workflows; 0 skipped, failed, or flaky results
  • Latest board validation: 3 passed, including two new scan-continuation and failure-recovery cases; no retries, skips, or flaky results
  • IntakeForm.spec.ts plus eight Onboarding*.spec.ts files; 41 additional tests
  • CI impact mappings and observed timing data; one serial configuration lane; 115 CI planner tests passed

Manual testing performed

  • Inspected actual browser screenshots for the builder, producer preview, narrow guided journey, and board
  • Automated reproduction: Settings → Onboarding & Intake Forms → configure each type → create asset → complete delegated checks → approve task → reload asset and board
  • Exact UI checkstyle, license, i18n, and application-documentation generation checks passed
  • Commit-time JSON, Java Spotless, UI formatting/license, Tailwind/deprecation, and core i18n checks passed
  • Earlier implementation baselines: 590 application / 165 Playwright TypeScript errors, with no added file/error-code counts; token audit 117 errors / 84 warnings in unchanged CSS/LESS

UI screen recording / screenshots:

Builder Producer preview
Data Product onboarding builder Glossary Term producer preview
Narrow journey Progress board
Metric guided journey Board with Approved assets of all four types
  • TODO: attach an end-to-end screen recording before marking ready for review

Checklist:

  • Read CONTRIBUTING.md and repository guidance
  • PR title follows Fixes <issue-number>: <short explanation>
  • Linked issue via Fixes #33165
  • Comments for non-obvious logic
  • JSON Schemas, generated models, and native 2.1.0 migrations
  • UI screenshots included
  • Unit, backend integration, and Playwright tests added
  • Feature motivation, scope, and acceptance described in the issue
  • Implementation and rollout documentation updated
  • 90% changed-class coverage target: board implementation exceeds 90%, but UI and broader shared backend classes remain below target; draft follow-up
  • End-to-end recording: draft follow-up

Share staged field requirements and workflow approvals across data products,
domains, glossary terms, and metrics, with persisted progress, pinned
configurations, resumable enrollment, and native 2.1.0 migrations.

Add the combined builder, guided creation and detail checklists, progress
board, recovery controls, and browser coverage for all four entity types.
@github-actions github-actions Bot added backend safe to test Add this label to run secure Github workflows on PRs labels Sep 10, 2026
@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

❌ UI Checkstyle Failed

❌ Playwright - Guardrails + ESLint + Prettier + Organise Imports

Either a Playwright test file has linting/formatting issues, or a guardrail check failed: ESLint rule unit tests, a new guardrail violation, a stale suppression entry (its violation was fixed but the baseline was not pruned), a blanket eslint-disable, or a stale generated rule table. For the guardrail cases run yarn lint:playwright:suppressions in openmetadata-ui/src/main/resources/ui and commit the pruned eslint-suppressions.json, then yarn test:eslint-rules && node scripts/generate-playwright-rule-table.mjs --check.

Affected files

Subtest: const a = 'server.entity-fetch-error';\n const b = 'server.entity-fetch-error';\n const c = 'server.entity-fetch-error';

    ok 2 - const a = 'server.entity-fetch-error';\\n             const b = 'server.entity-fetch-error';\\n             const c = 'server.entity-fetch-error';

not ok 28 - the suppressions baseline matches its recorded state exactly
failureType: 'testCodeFailure'
error: |-
name: 'AssertionError'

fail 1

error Command failed with exit code 1.

🔍 ESLint findings in this PR's files — 0 error(s), 50 warning(s)

Errors block the build. Warnings do not yet — they are rules whose backlog is still
being worked down, listed so this PR does not add to it. See docs/ui-code-quality-gate.md.

0 error(s), 50 warning(s) across 18 changed file(s).

Count Rule
32 react-hooks/exhaustive-deps
7 openmetadata-imports/no-internal-barrel-imports
5 openmetadata-imports/no-api-calls-in-iteration
4 openmetadata-ui-patterns/no-raw-title-attribute
2 openmetadata-imports/no-lower-layer-page-imports
All findings
Location Rule Message
🟡 src/AppRoot.tsx:69:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchApplicationConfig' and 'initializeAuthState'. Either include them or remove the dependency array.
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:121:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:122:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:907:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'getEntityFeedCount', 'isVersionsView', and 'openAssetDrawer'. Either include them or remove the dependency array.
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:945:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchActiveAnnouncement', 'fetchActivityCount', 'fetchDataProductAssets', 'fetchDataProductContract', and 'fetch
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:958:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'tabs'. Either include it or remove the dependency array.
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:958:6 react-hooks/exhaustive-deps React Hook useMemo has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked.
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:991:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'handleTabChange' and 't'. Either include them or remove the dependency array.
🟡 src/components/Domain/AddDomainForm/AddDomainForm.component.tsx:88:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/components/Domain/AddDomainForm/AddDomainForm.component.tsx:90:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/components/Domain/AddDomainForm/AddDomainForm.component.tsx:350:5 react-hooks/exhaustive-deps React Hook useMemo has an unnecessary dependency: 'onboardingWatchedValues'. Either exclude it or remove the dependency array.
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:112:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:348:6 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'domain.fullyQualifiedName' and 't'. Either include them or remove the dependency array.
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:350:9 react-hooks/exhaustive-deps The 'handleTabChange' function makes the dependencies of useCallback Hook (at line 459) change on every render. To fix this, wrap the definition of 'handleTabCh
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:350:9 react-hooks/exhaustive-deps The 'handleTabChange' function makes the dependencies of useCallback Hook (at line 632) change on every render. To fix this, wrap the definition of 'handleTabCh
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:742:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'closeSubDomainDrawer' and 't'. Either include them or remove the dependency array.
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:941:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'activeTab', 'addSubDomain', 'getEntityFeedCount', 'isVersionsView', 'onAddDataProduct', 'onDeleteSubDomain', and '
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:971:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchActiveAnnouncement', 'fetchActivityCount', 'fetchDataProducts', 'fetchDomainAssets', and 'fetchTaskCounts'.
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:984:6 react-hooks/exhaustive-deps React Hook useMemo has an unnecessary dependency: 'isSubDomain'. Either exclude it or remove the dependency array.
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:992:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'tabs'. Either include it or remove the dependency array.
🟡 src/components/Domain/DomainDetails/DomainDetails.component.tsx:992:6 react-hooks/exhaustive-deps React Hook useMemo has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked.
🟡 src/components/Glossary/GlossaryHeader/GlossaryHeader.component.tsx:633:6 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'isGlossary', 'onAddGlossaryTerm', and 'selectedData'. Either include them or remove the dependency array. If '
🟡 src/components/Glossary/GlossaryHeader/GlossaryHeader.component.tsx:713:6 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'showModal'. Either include it or remove the dependency array.
🟡 src/components/Glossary/GlossaryHeader/GlossaryHeader.component.tsx:775:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'handleAddGlossaryTermClick' and 't'. Either include them or remove the dependency array.
🟡 src/components/Glossary/GlossaryHeader/GlossaryHeader.component.tsx:817:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'handleBreadcrumb'. Either include it or remove the dependency array.
🟡 src/components/Glossary/GlossaryHeader/GlossaryHeader.component.tsx:823:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchCurrentGlossaryInfo' and 'isVersionView'. Either include them or remove the dependency array.
🟡 src/components/Metric/MetricDetails/MetricDetails.tsx:175:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'metricDetails' and 'onMetricUpdate'. Either include them or remove the dependency array. If 'onMetricUpdate' c
🟡 src/components/Metric/MetricDetails/MetricDetails.tsx:213:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'navigate'. Either include it or remove the dependency array.
🟡 src/components/Metric/MetricDetails/MetricDetails.tsx:240:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchActivityCount' and 'fetchTaskCounts'. Either include them or remove the dependency array.
🟡 src/components/Metric/MetricDetails/MetricDetails.tsx:263:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'customizedPage?.tabs' and 'feedCount'. Either include them or remove the dependency array.
🟡 src/components/Metric/MetricDetails/MetricDetails.tsx:285:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'tabs'. Either include it or remove the dependency array.
🟡 src/components/Metric/MetricDetails/MetricDetails.tsx:285:6 react-hooks/exhaustive-deps React Hook useMemo has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked.
🟡 src/components/discovery/personal-space/InboxPage/components/TaskDetailPanel.tsx:54:1 openmetadata-imports/no-lower-layer-page-imports Pages are route-level composition modules. Move the shared implementation/type to a lower layer instead of importing a page from here.
🟡 src/components/discovery/personal-space/InboxPage/components/TaskDetailPanel.tsx:742:41 openmetadata-imports/no-api-calls-in-iteration Avoid issuing one API request per item. Fetch at the data owner, use a bulk endpoint, or use useQueries with an intentional concurrency policy.
🟡 src/components/governance/onboarding/OnboardingAssignees.tsx:102:16 react-hooks/exhaustive-deps The ref value 'sequence.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 's
🟡 src/components/governance/onboarding/OnboardingBuilderCheck.tsx:127:9 openmetadata-ui-patterns/no-raw-title-attribute Use from @openmetadata/ui-core-components instead of raw title="" attributes for consistent tooltip behavior.
🟡 src/components/governance/onboarding/OnboardingChecklist.tsx:117:15 react-hooks/exhaustive-deps The ref value 'request.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 're
🟡 src/components/governance/onboarding/OnboardingChecklist.tsx:210:9 openmetadata-ui-patterns/no-raw-title-attribute Use from @openmetadata/ui-core-components instead of raw title="" attributes for consistent tooltip behavior.
🟡 src/components/governance/onboarding/OnboardingJourney.tsx:154:9 openmetadata-ui-patterns/no-raw-title-attribute Use from @openmetadata/ui-core-components instead of raw title="" attributes for consistent tooltip behavior.
🟡 src/components/governance/onboarding/OnboardingJourney.tsx:757:13 openmetadata-ui-patterns/no-raw-title-attribute Use from @openmetadata/ui-core-components instead of raw title="" attributes for consistent tooltip behavior.
🟡 src/components/governance/onboarding/OnboardingPreview.tsx:122:15 openmetadata-imports/no-api-calls-in-iteration Avoid issuing one API request per item. Fetch at the data owner, use a bulk endpoint, or use useQueries with an intentional concurrency policy.
🟡 src/components/governance/onboarding/OnboardingPreview.tsx:195:17 openmetadata-imports/no-api-calls-in-iteration Avoid issuing one API request per item. Fetch at the data owner, use a bulk endpoint, or use useQueries with an intentional concurrency policy.
🟡 src/pages/IntakeForms/IntakeFormDesignerModal.tsx:97:28 openmetadata-imports/no-api-calls-in-iteration Avoid issuing one API request per item. Fetch at the data owner, use a bulk endpoint, or use useQueries with an intentional concurrency policy.
🟡 src/pages/IntakeForms/IntakeFormDesignerModal.tsx:104:12 openmetadata-imports/no-api-calls-in-iteration Avoid issuing one API request per item. Fetch at the data owner, use a bulk endpoint, or use useQueries with an intentional concurrency policy.
🟡 src/pages/MetricsPage/AddMetricPage/AddMetricPage.tsx:124:6 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/pages/MetricsPage/AddMetricPage/AddMetricPage.tsx:244:6 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/pages/governance/onboarding/OnboardingBoardPage.tsx:215:15 react-hooks/exhaustive-deps The ref value 'request.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 're
🟡 src/rest/governance/onboarding/Onboarding.api.ts:26:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/rest/workflowDefinitionsAPI.ts:20:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/utils/TaskNavigationUtils.ts:21:1 openmetadata-imports/no-lower-layer-page-imports Pages are route-level composition modules. Move the shared implementation/type to a lower layer instead of importing a page from here.

Fix locally (fast - only checks files changed in this branch):

make ui-checkstyle-changed

Preserve onboarding status handling alongside creation-time certification
validation, retain both sets of 2.1.0 migration statements and translations,
and regenerate the combined Playwright impact map.
"move": "Mover",
"move-anyway": "همچنان جابجا کن",
"move-down": "انتقال به پایین",
"move-entity-to-root": "Mover {{entity}} para a raiz",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Quality: pr-pr.json: new key translated into Portuguese, not Persian

In the Persian (pr-pr) locale file, the new key move-entity-to-root is given the value "Mover {{entity}} para a raiz", which is Portuguese. The surrounding entries in the same file (e.g. move-anyway: "همچنان جابجا کن", and the other three new keys asset-count, output-port-count, filter-no-matching-terms) are all Persian, so this line will render Portuguese text to Persian users. Replace it with the Persian translation, e.g. "انتقال {{entity}} به ریشه".

Use the Persian translation instead of Portuguese:

"move-entity-to-root": "انتقال {{entity}} به ریشه",
  • Apply fix

Check the box to apply the fix or reply for a change | Was this helpful? React with 👍 / 👎

Reuse pinned instances and batch current entities, responsibilities, tasks,
workflow definitions, and execution evidence without per-row cache clears.
Authorize against the loaded assets and scan bounded batches until a filtered
page is full, returning a cursor only when another matching row exists.

Add database regressions for sparse catalogs, cursors, permissions, query
counts, current domain owners, and board/detail parity across all four asset
types and approval, rejection, revision, and workflow failure states.
Preserve the onboarding tables alongside main's 2.1.0 workflow-retention
index migrations, and retain onboarding checklists with the updated entity
permission and tag components.

Use the shared permission derivation for onboarding transitions, cover
allowed and denied user actions, and regenerate the Playwright impact map.
Limit each board request to 1,000 candidates, including authorization and
lookahead. Return an explicit scan-limit marker and the reached cursor so
sparse filters can resume without losing matching assets. Explain incomplete
searches in the board and retain pagination, refresh, and filter recovery.

Add database regressions for sparse filters, scan boundaries, denied assets,
and query bounds, plus component and browser continuation/error journeys.
Regenerate the schema models and translate the continuation message.
@gitar-bot

gitar-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Code Review 👍 Approved with suggestions 3 resolved / 4 findings

Unifies onboarding and intake forms for Data Products, Domains, Glossary Terms, and Metrics with configuration, guided creation, delegated work, workflow approvals, and progress monitoring. Comprehensive test coverage (101 integration tests per database, 63 UI tests, 77 Java tests) and documentation validate the implementation. One minor issue: the new move-entity-to-root key in pr-pr.json is translated to Portuguese instead of Persian and should be corrected to match the surrounding Persian entries.

💡 Quality: pr-pr.json: new key translated into Portuguese, not Persian

📄 openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json:1760

In the Persian (pr-pr) locale file, the new key move-entity-to-root is given the value "Mover {{entity}} para a raiz", which is Portuguese. The surrounding entries in the same file (e.g. move-anyway: "همچنان جابجا کن", and the other three new keys asset-count, output-port-count, filter-no-matching-terms) are all Persian, so this line will render Portuguese text to Persian users. Replace it with the Persian translation, e.g. "انتقال {{entity}} به ریشه".

Use the Persian translation instead of Portuguese
"move-entity-to-root": "انتقال {{entity}} به ریشه",
✅ 3 resolved
Performance: Onboarding board does N fresh, cache-bypassing reads per page

📄 openmetadata-service/src/main/java/org/openmetadata/service/governance/onboarding/OnboardingBoardService.java:22-36 📄 openmetadata-service/src/main/java/org/openmetadata/service/governance/onboarding/OnboardingService.java:35-41 📄 openmetadata-service/src/main/java/org/openmetadata/service/governance/onboarding/OnboardingService.java:195-203
OnboardingBoardService.list() calls OnboardingService.get() once per scanned instance (up to 1000 per request), and get() re-reads the instance JSON from the DB again (OnboardingStore.find) plus calls OnboardingService.entity(), which invokes RequestEntityCache.clear() and a FreshReadScope-wrapped Entity.getEntity for every row. It then fully re-evaluates every gate and hydrates every step (findCommittedTask / workflow-instance lookups per step). For a board with many enrolled assets this is a heavy N+1 pattern that defeats the request cache for the whole request. Consider batching the entity reads, evaluating once against the already-loaded instance JSON, and avoiding the per-row global cache clear on the read path.

Edge Case: Board assignee/domain filters applied post-query can return short pages

📄 openmetadata-service/src/main/java/org/openmetadata/service/governance/onboarding/OnboardingBoardService.java:22-36 📄 openmetadata-service/src/main/java/org/openmetadata/service/governance/onboarding/OnboardingBoardService.java:48-60
The onboarding_instance query in OnboardingBoardService.list only filters by entityType and stage in SQL; domain and assignee are applied in matches() after loading. Because limit is computed as Math.min(100, limit - results.size()) and the scan is capped at 1000, a heavily filtered board can return far fewer than limit rows (or exhaust the 1000 scan budget) while more matching rows exist, and the returned after cursor points at the last scanned (possibly non-matching) instance. This is functionally correct with client-side continuation but yields confusing partial pages; consider pushing domain/assignee filters into the query or documenting the cap.

Performance: Board scan is now unbounded for selective filters

📄 openmetadata-service/src/main/java/org/openmetadata/service/governance/onboarding/OnboardingBoardService.java:40-54
This commit replaces the previous scanned < 1000 cap with while (true), so a single board request now scans the entire eligible catalog until the requested page fills. With a highly selective domain/assignee filter over a large draft catalog, one GET issues O(catalog/100) batched queries plus per-asset authorization, which can make the endpoint slow or a DoS surface even though reads are batched. The behavior is intentional and documented, but consider a hard scan ceiling (e.g. cap total scanned rows and return the reached cursor) to bound worst-case request cost.

🤖 Prompt for agents
Code Review: Unifies onboarding and intake forms for Data Products, Domains, Glossary Terms, and Metrics with configuration, guided creation, delegated work, workflow approvals, and progress monitoring. Comprehensive test coverage (101 integration tests per database, 63 UI tests, 77 Java tests) and documentation validate the implementation. One minor issue: the new `move-entity-to-root` key in `pr-pr.json` is translated to Portuguese instead of Persian and should be corrected to match the surrounding Persian entries.

1. 💡 Quality: pr-pr.json: new key translated into Portuguese, not Persian
   Files: openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json:1760

   In the Persian (pr-pr) locale file, the new key `move-entity-to-root` is given the value "Mover {{entity}} para a raiz", which is Portuguese. The surrounding entries in the same file (e.g. `move-anyway`: "همچنان جابجا کن", and the other three new keys `asset-count`, `output-port-count`, `filter-no-matching-terms`) are all Persian, so this line will render Portuguese text to Persian users. Replace it with the Persian translation, e.g. "انتقال {{entity}} به ریشه".

   Fix (Use the Persian translation instead of Portuguese):
   "move-entity-to-root": "انتقال {{entity}} به ریشه",

Options

Display: compact → Counting what did not apply, without listing it.

Comment with these commands to change the behavior for this request:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend safe to test Add this label to run secure Github workflows on PRs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unify onboarding and intake forms for governance assets

1 participant