Repository navigation
Ontology Studio: complete the v7 prototype flows - #36868
Conversation
…he decision notices
…erver's reason beside the field (G13)
… the inline property form (G13)
…IRI placeholder (G13)
…IRI fallback (G13)
…picker and the inspector form (G13)
…e all, and the quick rule form in the safety spec (G13)
…rrors in G13 files
…and the datatype picker offers only OWL 2 datatypes (R15)
🔄 Playwright impact map auto-refreshedThis PR touched specs or UI source that changed the source→spec routing map. I regenerated What is this file? It is the auto-generated half of Playwright's PR planner. It routes "if source X changes, run specs Y" by walking spec imports and cross-referencing What if I want to regenerate locally instead? Run this before pushing your next change to skip the bot commit: python3 .github/scripts/generate_playwright_impact_map.py
git add .github/playwright/impact-map.generated.json
git commit --amend --no-edit # or a separate commit |
|
| Count | Rule |
|---|---|
| 11 | react-hooks/exhaustive-deps |
| 9 | openmetadata-imports/no-api-calls-in-iteration |
| 7 | openmetadata-imports/review-sequential-api-calls |
| 1 | openmetadata-imports/no-cross-page-imports |
All findings
| Location | Rule | Message | |
|---|---|---|---|
| 🟡 | src/components/OntologyExplorer/OntologyGraphG6.tsx:300:7 |
react-hooks/exhaustive-deps |
React Hook useImperativeHandle has an unnecessary dependency: 'explorationMode'. Either exclude it or remove the dependency array. |
| 🟡 | src/components/OntologyExplorer/hooks/useOntologyGraph.ts:1728:5 |
react-hooks/exhaustive-deps |
React Hook useMemo has a missing dependency: 'DATA_MODE_ASSET_TYPES'. Either include it or remove the dependency array. |
| 🟡 | src/components/OntologyExplorer/hooks/useOntologyGraph.ts:2341:6 |
react-hooks/exhaustive-deps |
React Hook useEffect has missing dependencies: 'containerRef', 'glossaryColorMap', 'graphData', 'inputNodes.length', 'positionAssetNodes', 'positionCircularNode |
| 🟡 | src/components/OntologyExplorer/hooks/useOntologyGraph.ts:2604:6 |
react-hooks/exhaustive-deps |
React Hook useEffect has missing dependencies: 'containerRef' and 'suppressEdgeCheck'. Either include them or remove the dependency array. |
| 🟡 | src/components/governance/ontology/OntologyAuthoringWorkspace/OntologyConceptDeleteDialog.tsx:85:13 |
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/ontology/OntologyAuthoringWorkspace/OntologyConceptDeleteDialog.tsx:88:5 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/components/governance/ontology/OntologyAuthoringWorkspace/OntologyConceptDeleteDialog.tsx:91:27 |
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/ontology/OntologyAuthoringWorkspace/OntologyConceptDeleteDialog.tsx:100:7 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/components/governance/ontology/OntologyAuthoringWorkspace/OntologyConceptDeleteDialog.tsx:100:13 |
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/ontology/OntologyConceptEditor/useReadableConceptOptions.ts:47:32 |
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/ontology/OntologyGraphView/OntologyGraphView.tsx:804:9 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/components/governance/ontology/OntologyNewClassPanel/OntologyNewClassPanel.tsx:461:19 |
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/ontology/OntologyReleaseExportModal/OntologyNativeImportPanel.utils.ts:520:21 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/components/governance/ontology/OntologyTasksDrawer/OntologyTasksDrawer.tsx:131:22 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/hooks/governance/ontology/useOntologyChangeSetApply.ts:205:30 |
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/hooks/governance/ontology/useOntologyChangeSetApply.ts:379:9 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/hooks/governance/ontology/useOntologyPublication.ts:515:22 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/hooks/governance/ontology/useOntologyPublication.utils.ts:461: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/TableDetailsPageV1/TableDetailsPageV1.tsx:120:1 |
openmetadata-imports/no-cross-page-imports |
Page features must not import another page feature. Move shared code to components, hooks, interfaces, or pure utilities. |
| 🟡 | src/pages/TableDetailsPageV1/TableDetailsPageV1.tsx:210:6 |
react-hooks/exhaustive-deps |
React Hook useEffect has a missing dependency: 't'. Either include it or remove the dependency array. |
| 🟡 | src/pages/TableDetailsPageV1/TableDetailsPageV1.tsx:434:6 |
react-hooks/exhaustive-deps |
React Hook useMemo has an unnecessary dependency: 'tableDetails.tags'. Either exclude it or remove the dependency array. |
| 🟡 | src/pages/TableDetailsPageV1/TableDetailsPageV1.tsx:448:6 |
react-hooks/exhaustive-deps |
React Hook useEffect has a missing dependency: 'setDqLineageData'. Either include it or remove the dependency array. |
| 🟡 | src/pages/TableDetailsPageV1/TableDetailsPageV1.tsx:602:6 |
react-hooks/exhaustive-deps |
React Hook useMemo has missing dependencies: 'customizedPage?.tabs' and 'feedCount'. Either include them or remove the dependency array. |
| 🟡 | src/pages/TableDetailsPageV1/TableDetailsPageV1.tsx:813:6 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 'navigate'. Either include it or remove the dependency array. |
| 🟡 | src/pages/TableDetailsPageV1/TableDetailsPageV1.tsx:828:5 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 'navigate'. Either include it or remove the dependency array. |
| 🟡 | src/pages/TableDetailsPageV1/TableDetailsPageV1.tsx:895:6 |
react-hooks/exhaustive-deps |
React Hook useEffect has missing dependencies: 'fetchActivityCount' and 'fetchTaskCounts'. Either include them or remove the dependency array. |
| 🟡 | src/rest/ontologyAPI.ts:139: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/utils/governance/ontology/OntologyRelationClash.utils.ts:50: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. |
Fix locally (fast - only checks files changed in this branch):
make ui-checkstyle-changed… current Studio surface
Code Review ✅ Approved 10 closed / 10 findings🔴 High risk · New ontology edit-right and review/publish controls govern draft access and activation; a permission error could expose drafts or publish changes without intended approval. Completes the Ontology Studio v7 prototype flows, including direct publish without reviewers, review requests with edit-rights gating, seeded OntologyAuthor and OntologyReviewer roles with a v210 migration, and the graph, create, release, query, data-mode, and import/export updates. Ten resolved findings this session covered the move/copy EditAll bypass, missing decision records, the DataSteward role conflict, partial-import preflight gaps, a duplicate UI note, and an N+1 change-set fetch. No open findings remain. ✅ 10 closed✅ Bug: Create failures other than name errors now show a generic toast
✅ Security: Content-patch guard ignores
|
| Compact |
|
Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source
|



Describe your changes:
Ontology Studio gains the flows in the v7 clickable prototype. With no reviewers, an editor publishes directly. With reviewers, the author requests review from the publish dialog, stays in Studio, and sees the decision. Ontology writes require edit rights, and seeded roles grant authoring and reviewing.
The PR lands as units. Each unit is one merge commit with its own unit tests and Playwright cases, so the history reads unit by unit.
Landed units:
G19. The RDF projection is built once on first start instead of waiting for the weekly run.
G1. Ontology writes, release capture, and activation require edit rights on the ontology. Listed reviewers vote on their assigned review.
G14. Large ontologies render: the layout folds crowded ranks to the viewport's shape and fits on load, so 400 concepts show at once. Above 500 concepts the graph shows the neighbourhood of the selected concept. The graph, Find, and Tree work from the keyboard.
G9. The create ontology dialog follows the prototype: owners, reviewers at creation, and a collapsed Advanced section with ID, IRI, namespace, and layer. It validates before submit, and names that differ only in digits get distinct prefixes. Picker rows offer Settings and Delete, with search and concept counts.
G2. Two built-in roles,
OntologyAuthorandOntologyReviewer. DataSteward gets both policies on new installs, and an idempotent v210 data migration attaches them on upgrade without touching the admin's other DataSteward policies.G4. Saving a release with no changes returns the existing Draft instead of minting another, an ontology has at most one open review (a second request gets 409 naming the open one), and the suggested version is computed from the active release. The Releases tab hides older Drafts that never went to review.
G3. Studio shows only the actions the user's rights allow. Edit, Publish, and Connect are hidden without edit rights, both modes share one empty state, a user without Create reads which role to ask for, and disabled release controls say why. When the catalog has more ontologies than All ontologies can draw as one graph, it shows one message pointing to the ontology menu instead of a list of buttons.
G10. One New concept drawer serves the toolbar, the canvas, the empty state, and the Term tab. It validates the name, label, and IRI before any write, supports Create & add another, and shows Undo on create and delete. In All ontologies, Add Concept opens the drawer with a required Ontology field instead of doing nothing until a separate selector is used.
G5. With no reviewers configured, activating a sealed Draft publishes it directly for a caller with edit rights. In one transaction under the ontology lock, the release becomes Approved with
approvalBasisofNO_REVIEWERS_CONFIGURED, gets anAPPROVEDevent with no voters, and activates. With reviewers, activation still returns 409. Release events now include the review request.G12. The server detects disjointness clashes.
POST /ontologyAxioms/validatereturns aDISJOINT_CLASHwarning that names both concepts, and release capture refuses a draft whose subclass closure puts a concept under two disjoint classes.G15. Users without edit rights read the active release, not the working draft. A Draft/Published switch on the version chip lets an author compare the two, and Edit is offered only on Draft. Mode, view, and version live in the URL, so reload, Back, and shared links reopen the same view. A user who owns one concept can enter Edit from that concept. Graph, Tree, and Ontology views work in View and Edit, and a read-only Overview tab shows counts, owners, reviewers, version, and namespace. The health card can be minimized per user.
G11. In Edit mode, a double-click on empty canvas opens the New concept drawer and places the node at the click. Relationships connect by click or by a drag from the node's handle, and self-loops, duplicates, and subclass cycles are refused before any write. Relationship rows have edit and delete, and an edge click opens its detail. Deleting a concept lists its children, relationships, rules, and bindings from a new
GET /v1/ontologyConcepts/{id}/deleteImpact, removes the references with it, and offers Undo. In All ontologies, changing the drawer's Ontology field keeps the typed fields and clears only the parents. When a new concept's name belongs to a deleted concept, the drawer says so and offers Restore instead of failing with a bare 409.G20. Two recursive hard deletes of large ontologies no longer deadlock.
EntityDAO.deleteByIdspins the primary-key range with a MySQL index hint, so a delete locks only its own rows even when table statistics are stale. PostgreSQL reads the hint as a comment. The scope menu gives each row an accessible name that separates the label from its count. A link to a concept with no ontology in it opens that concept's inspector even when the catalog has too many ontologies to draw as one graph.G6. The publish dialog offers one primary action per state. With no reviewers it is Publish vX.Y.Z, and adding a reviewer flips it to Request review without a reload. Capture release is now Save as release draft. After a request the author stays in Studio and sees who was asked, can withdraw the request, and reads the approval or rejection in the dialog, the Studio banner, and the Inbox. Rollback is labelled with both versions and asks for confirmation. The release in force shows no activation actions.
G1b and G1c. Creating and submitting a glossary-scope change set, requesting an AI domain draft for a glossary, and moving a deleted term's children each require
EditAll, the same right as the other ontology write paths.G16. The query results header names the scope,
<ontology> · v1.0.0or<ontology> · draft. Editors can query the working draft withPOST /v1/ontologies/{id}/sparql?scope=draft, which requires edit rights. Errors read as a title and a hint, ASK showstrueorfalse, and results show a row count, the run time, Copy, and CSV. All ontologies explains the query choice with counts, saved queries gain Find and Duplicate, and the builder shows its SPARQL on request.G13. Rules open in a quick form that reads as a sentence: a subject that must have, can never also be, or is the same as another concept, with counts and properties, a live preview, and the server's reasons. The advanced form is one switch away, and the switch refuses in one sentence when it would lose detail. Pickers search concepts by label and accept a pasted IRI. A mapping can point to a concept in any ontology the user can read.
GET /v1/ontologies/{id}/working/validationvalidates the whole draft, the graph marks clashing concepts and edges, a panel lists the conflicts to resolve, and the relationship picker warns before it adds a disjointness clash.G7, part 1. The Changes tab names each concept by its label, not its IRI tail, and filters All, Added, Changed, and Removed with counts and a search. The dialog suggests the version and says why: a removal suggests a major version, an addition a minor one, and a first release v0.1.0. Opening the dialog validates the working draft, so errors show before a release is saved. Logical consistency reads Not applicable when the server has no materialized inference. Counts read per kind, such as
4 changes · 2 concepts · 1 property, and the version chip shows Draft once.G17. Data mode shows one concept at a time, picked from a searchable list, with its assets and their bound columns. An asset opens a panel inside Studio, with Open asset as a separate button. A concept with no assets says so and offers Link Asset to editors. The link picker filters by type and service and suggests assets with reasons. Unlink names what becomes unbound, asks to confirm, and offers Undo. A table page lists the concepts the table and its columns are bound to, from a new
GET /v1/ontologyConcepts/boundTo/{assetType}/{assetId}that leaves out concepts the reader cannot view.G7b. The review shows each changed field with its before and after value instead of a JSON block. Review tasks are titled
Review <ontology> v<version>. The Studio banner names the ontology, the version, and who the review waits on, and All ontologies lists one line per open review. When a draft has more than 1,000 changes, the change list says its counts cover the first 1,000.G18. The import preview lists each concept, property, relationship, and rule as New, Update, Already exists, Duplicate, or Skipped, grouped with checkboxes, and imports only the ticked items. Preview and apply run the same datatype check, so an unsupported range fails the preview with its reason. SKOS exports import again. The export dialog exports the current draft or any release, and the Releases row adds SKOS and CSV. Installed and imported ontologies get readable names and
httpsIRIs, and a clash the import would create shows on its item with both concepts named.G18c. A partial import stays consistent. Unticking a new concept also unticks the relationships and rules that use it and says so, and the server refuses an apply whose operations need a concept the change set leaves out, naming both. CSV exports label a concept by its name when it has no display name.
G7d.
GET /v1/ontologies/reviewstakes anontologyIdfilter, so the Studio banner finds the selected ontology's review however many reviews are open. A review whose only reviewer was removed readsno reviewer assignedinstead ofready to publish.G8. Each Releases row shows the version, its status, the author, the date, per-kind counts such as
2 concepts · 1 property, andPublished without reviewor who approved or rejected it, with search, status filters, and paging. Compare versions lists the concepts added, changed, and removed between two releases. Release events read one per line, with the reason for a rejection.P1a and P1d. One rule for reading the working draft. Every read of draft content needs
EditAllon the ontology, and release reads keep view access. The rule covers draft SPARQL, the working diff, validation, export, references, the concept, property, and axiom lists, and change sets. The change-set list takesontologyorontologyId, and a viewer's memory review panel shows an empty queue instead of an error. Reading a single definition by id or name stays open to any viewer, for deep links and the concept panel, asdocs/decisions/2026-11-03-ontology-working-draft-reads-require-edit-rights.mdrecords.P1e. A concept owner without ontology rights edits their concept's draft wording, read by id, while the graph shows the release.
P1f. A second selection in the tree opens that concept.
P1g. When the concept panel resizes the canvas, the graph republishes its node positions, so the connection handles stay on their nodes.
P1b.
OntologyStudioFlows.spec.tsdrives every Studio interaction in the prototype, in AI and classic mode where both offer it.R1. Server fixes from the PR review. Patches that move or copy a field run the same content check as other patches, and axiom patches run it too. A table page lists every visible concept binding, however many hidden ones come first. Activation refuses a version that a published release already holds (409), and capture skips published versions when it suggests one.
R2. UI fixes from the PR review. A display name that yields no ID asks for one. A failed pack review shows an error with Retry and holds Install. Clash highlights follow the subclass path to each disjoint ancestor. A change list cut off at its first page suggests no version and asks the author to pick one. The review compares structured values and shows ids when two values read the same. The scope menu and the query picker show 20 ontologies at a time with Show more, request counts only for the rows on screen, and fall back to the active release's counts when the draft is not readable.
R3 and R4. Decision records for the first RDF index run and the graph limits, and amendments that bring the onto-IRI, reviewers, imports, and roles records in line with the code. Flow 2 asserts exact prefixes, and an IT shows that a DataSteward edits ontology content but not glossary scope.
R5 and R6. The approval-notice IT asserts the exact summary. The review-filter IT requests its oldest and newest reviews alone, so the result no longer depends on thread order. The table-page Data mode case waits for the column drawer before it closes it.
R7. When a reviewer rejects with no reason and the reason comes from their latest task comment, that reason now reaches the recorded decision, the vote, the release event, and the author's notice.
R8. The RDF ontology declares the release's
approvalBasisas a stored predicate, soRdfOntologyContractTestaccepts what the release writer emits.R9 and R9b. Draft apply reads the classes an imported axiom or property names from the operation itself, not from the optional
requiresConceptIris. It checks them with the importer's own class rule (OntologyClassHierarchy.classPositions). A client that drops a dependency from a partial import gets 400, while SKOS classes, annotation-property domains and assertion individuals pass as they do at preview. The asset concept links response has no cap onlinks.R10 and R10b. Linked concepts on a table page open the Studio with that concept selected. Concept live data tells a loading or failed bindings read apart from an unbound concept, and a failed read offers Retry.
R11. Draft apply also checks every concept an operation declares in
requiresConceptIris, so a partial import cannot keep a restriction or an assertion on an individual it dropped.R12. The new-class panel shows an error and keeps Create disabled when a SKOS concept has parents, equivalent or disjoint classes, or properties, whichever was chosen first. The class pickers offer only OWL classes. The asset picker shows "already linked" once.
R14 and R16. Playwright picks an ontology by typing its name, so a pick works when the list holds more than 100 ontologies and only the rows in view are rendered. A form sign-in in Playwright returns only after the app has used its post-login redirect, so a page opened right after sign-in is not sent to the home page.
R15. A list of concepts, properties, axioms or change sets that names no ontology also checks
EditAllon the ontology of every row it returns, and refuses the whole page on one refusal (ADR v3). R18 checks each distinct glossary scope of an unscoped change-set list once, from the rows already loaded. The datatype picker offers only OWL 2 datatypes.R17.
parseSchemas.jstakes the named$RefParserexport of@apidevtools/json-schema-ref-parser14, which main's chore(deps): bump @apidevtools/json-schema-ref-parser from 9.1.2 to 14.1.1 in /openmetadata-ui/src/main/resources/ui #37063 bumped, so the TypeScript Type Generation job runs again. The regenerated ingestion schemas differ only in shorter$refpointers, and each one resolves to the same schema as before.The branch also carries UI checkstyle fixes for every file it touches (C1), and five merges of current main (M1, which moves the UI to Vite 8.3.5, M2, M3, which adopts main's
ButtonUtilityicon buttons and its id-based reviewer match inDefaultAuthorizer, M4, which adopts main'sautoComplete="off"on the Studio search inputs, and M5, which orders main's task field-path migration beforeOntologyRolesMigrationin v210).Type of change:
High-level design:
OntologyAuthorandOntologyReviewer, are attached to DataSteward on new installs and by an idempotent migration on upgrade.docs/decisions/cover each durable choice.Tests:
Tests are grouped by kind, then by area. A count in parentheses is the number of cases at this head. Java classes carry a count only when this PR adds them.
Java unit tests.
DefaultAuthorizerTest,OntologyResourceAccessTest(6),OntologyEditLockResourceTest,OntologyAiResourceTest,OntologyImpactServiceTest, andOntologyOwnerInheritanceTest(4).OntologyReleaseReuseTest(7),OntologyReleasePublicationTest,OntologyReleaseComparisonTest,OntologyReleaseRepositoryTest, andOntologyDecisionNoticeTest(4).OntologyReleaseCaptureTest,OntologyReleaseActivationTest,OntologyPublicationStorageTest,OntologyActiveGraphStorageTest,OntologyDerivedStatusStorageTest,OntologyReleaseComparisonStorageTest, andOntologyReleaseReviewListTestrun each case for MySQL and PostgreSQL.OntologyStructureValidatorTestcovers clashes through the subclass closure, the clash count, and deletion impact.OntologyReleaseValidationTestandOntologyChangePreflightTestcover capture and partial imports.NativeOntologyImportItemsTest(15),NativeOntologyCsvCodecTest,NativeOntologyRdfImporterTest, andRdfGraphSerializerTest.OntologyDraftQueryTest(4),RdfInitialIndexRunTest(5), andRdfProjectionStateResolverTest.Java integration tests.
IndependentOntologyAuthorizationITholds the role, operation, and status matrix, including the draft paths, working-draft validation, and a DataSteward who edits ontology content but not glossary scope.IndependentOntologyDraftReadIT(2) andOntologyChangeSetITcover the working-draft read rule, change sets included.OntologyImpactITcovers moving a deleted term's children, and its new case fails on the old check.OntologyEditLockResourceIT,OntologyRolesIT(7), andOntologyRolesMigrationIT(1, the step run twice).IndependentOntologyApprovalIT,IndependentOntologyActivationIT,IndependentOntologyReleaseIT,IndependentOntologyPublicationIT,IndependentOntologyStatusIT,IndependentOntologyReleaseDiffIT,IndependentOntologyReviewNoticeIT(6),IndependentOntologyReviewFilterIT(3), andIndependentOntologyReleaseKindCountsIT(2).IndependentOntologyAxiomITandIndependentOntologyReleaseValidationIT.IndependentOntologyConceptDeleteImpactIT(2) andOntologyConceptBindingsIT, which lists every visible link of an asset whose hidden bindings fill the first 100 rows.OntologyConcurrentHardDeleteIT(1) purges two 400-concept ontologies at once for three rounds and asserts that the InnoDB deadlock counter does not move. It passed three runs in a row. With the shared delete change,TableResourceITpassed on MySQL andOntologyConceptResourceITon MySQL and PostgreSQL.NativeOntologyImportReviewIT(8),NativeOntologyPartialImportIT(4, one dropsrequiresConceptIrisand gets 400),NativeOntologyPartialImportPropertyIT(2),IndependentOntologyReleaseExportFormatsIT(a SKOS export imports again), andIndependentOntologyUrnIriExportIT(2).OntologyDraftQueryIT(4) andRdfFirstIndexRunIT(2).OntologyConcurrentHardDeleteIT, which asserts on the global deadlock counter. CI runs it alone in the global-state lane, and it passes there. The other wasIndependentOntologyReviewNoticeIT, whose approval case still expected the release slug. A sequential rerun also found a race in howIndependentOntologyReviewFilterITpicked its oldest review. R5 fixed both tests. ThenIndependentOntologyReviewNoticeITpassed 5 of 5, andIndependentOntologyReviewFilterITpassed three runs in a row and once in the global-state lane.Jest.
OntologyEmptyState,OntologyHealthPanel, andOntologyExplorerPage, which covers the role matrix, the over-limit message, and glossary Edit only for users the lease accepts.OntologyCreateDialog,OntologyCreateForm,OntologyCreateForm.utils,OntologyStudioScopeMenu, andOntologyStudioScopeMenu.counts(3), which runs the real count hook over 45 ontologies.OntologyMemoryReviewPanelanduseOntologyChangeSetApply.studioGraphLayout,studioFocusedGraph,studioViewport,conceptSearch,OntologyStudio.utils,OntologyGraphView, anduseOntologyGraph.studio.OntologyNewClassPanel,OntologyNewClassPanel.utils,OntologyConceptEditor,OntologyConceptInspector,OntologyConceptDeleteDialog,OntologyConceptLiveData,OntologyAuthoringWorkspace,OntologyAllOntologiesConceptDrawer,OntologyRelationCheck.utils,PortOverlay,useOntologyGraphEdit,useOntologyEditLease, andOntologyNativeChangeSet.utils.OntologyStudioUrlState.utils,OntologyVersionChip,useOntologyStudioModel, andOntologyExplorerPage.integration.OntologyAxiomEditor,OntologyAxiomQuickRule.utils,OntologyIriInput,OntologyPropertyEditor,OntologyRelationClash.utils,RelationshipTypePicker,OntologyStudioModel.utils, andconflictHighlight.OntologyStudioQueryConsole,OntologyQueryResults,OntologyQueryResults.utils,OntologyQueryError.utils,OntologyQueryPicker,OntologyQueryPicker.counts(3), andOntologyVisualQueryBuilder.OntologyNativeDataMode,OntologyDataGraph,OntologyDataAssetPicker,OntologyDataConceptPick.utils,OntologyBindingSuggestion.utils,OntologyAssetSuggestion.utils,OntologyConceptAssets,OntologyColumnBindingEditor,TableLinkedConcepts, andTableDetailsPageV1.OntologyPublicationModal,OntologyReleasePanel,OntologyReleasePanel.stages,OntologyReleasePanel.utils,OntologyExplorerPage.publication,useOntologyPublication,useOntologyPublication.utils,OntologyReleaseChanges.utils,OntologyReleaseHistory,OntologyReleaseCompare,OntologyReleaseReviewers,OntologyReviewPanel,OntologyReviewBanner,OntologyReviewRelease.utils,OntologyTasksDrawer, andOntologyTaskDetail.OntologyNativeImportPanel,useOntologyIdentitySource,OntologyReleaseExportModal,OntologyNativePackReview, andOntologyLibrary.native.Playwright.
OntologyStudioPermissions.spec.ts(12),OntologyRoles.spec.ts(1), andOntologyRbacRdf.spec.ts(7), which includes a steward withoutEditAllwho is offered no glossary Edit tab.OntologyStudioFlows.spec.ts(20) runs ten flows in AI and classic mode: create from the picker and the empty state, name and prefix rules, adding concepts three ways, the unsaved-edit guard, direct publish, review and approval, rejection and withdrawal, per-role actions, rollback and compare, and keyboard reach in the tree and the graph.OntologyNativeStudio.spec.ts(18),OntologyFirstRun.spec.ts(5), andOntologyNativeTreeShell.spec.ts(2).OntologyLargeGraph.spec.ts(19) covers 400 visible nodes, Find, Tab order, Tree arrow keys, 1024 px, and dark mode.OntologyConceptDrawer.spec.ts(20, in AI and classic mode),OntologyNativeRelations.spec.ts(9),OntologyNativeAuthoring.spec.ts(2), andOntologyNativeOperations.spec.ts(4).OntologyRules.spec.ts(14) covers quick rules, the advanced form, clashes on the graph, Validate all, and mappings across ontologies.OntologyAuthoringSafety.spec.ts(3).OntologyPublishedView.spec.ts(10).OntologyQueryScope.spec.ts(11) covers draft and published scope, errors, ASK, Copy and CSV, saved queries, and the builder.OntologyQueryRdf.spec.ts(5) andOntologyDataExploreRdf.spec.ts(1).OntologyNativeDataMode.spec.ts(11), which follows a table's linked concept back into the Studio, andOntologyNativeLiveData.spec.ts(2), which fails the bindings read and recovers with Retry.OntologyReview.spec.ts(26) covers each publish dialog state, the author's Inbox, and release history and compare.OntologyReviewChanges.spec.ts(13) covers the change list, the suggested version, field-level changes, task names, and the banner.OntologyNativeImportReview.spec.ts(23),OntologyNativeImport.spec.ts(5), andOntologyNativeExport.spec.ts(2, including RDF/XML for a bareurnIRI).9d0e83f1354), every non-RDF Ontology spec ran on chromium with 2 workers, and all 287 tests passed. TheOntology RDFproject passed 39 of 42, and the other 3 aretest.fixmecases for tabs the Studio removed. Earlier runs on this branch hit two test-only races, both fixed: an ontology picker with more than 100 entries renders only the rows in view (R14), and a page opened within a second of a form sign-in was sent to the home page (R16).Python.
test_ontology_iris.pyasserts that a structure violation round-tripsconceptIdsand defaults it to an empty list. The file passes 23 cases.Checklist:
Fixes <issue-number>: <short explanation>