Skip to content

Fixes 31756: return parent glossary terms on child fields; stop delete cascade stripping manual labels - #31834

Open
mohityadav766 wants to merge 3 commits into
mainfrom
glossary-derived-tag-propagation-bugs
Open

Fixes 31756: return parent glossary terms on child fields; stop delete cascade stripping manual labels#31834
mohityadav766 wants to merge 3 commits into
mainfrom
glossary-derived-tag-propagation-bugs

Conversation

@mohityadav766

@mohityadav766 mohityadav766 commented Aug 20, 2026

Copy link
Copy Markdown
Member

Describe your changes:

Fixes #31756

I worked on Bug B of #31756 — a glossary term applied to a table was only ever visible on its columns in the search index. The entity API returned each column's own tags, so the column tag panel showed nothing while Explore and the glossary Assets tab showed the term.

Entity.populateEntityFieldTags now projects the parent's glossary terms onto every field on read. This is the single funnel for field tag hydration, so table columns, dashboard-data-model columns and API-endpoint schema fields are all covered, and getFlattenedEntityField already recurses — nested columns are covered by construction. The parent's own tag_usage row now arrives in the existing getTagsByPrefix call ("%" instead of ".%"), so this costs no extra query. A field that carries the term itself keeps MANUAL: tagLabelMatch compares tagFQN+source and ignores labelType, so mergeTags gives the field's own label precedence.

TagLabelUtil.isSystemGenerated — projections must never be persisted. All seven never-persist filters on the write path previously tested only for DERIVED, so a projected PROPAGATED label could be written into tag_usage on a round trip: GET a table (columns now carrying projected labels) → PUT it back unchanged → the projection becomes a stored row that outlives the parent's term. That is exactly the phantom tag this PR exists to remove, reintroduced through the new label. Found by writing the IT. The read path in addDerivedTags is deliberately untouched — the projection depends on PROPAGATED surviving there.

SearchRepository — propagation sites stamp the same label as the entity API, and the child delete script no longer matches on tagFQN alone (which stripped the term from a column that had it applied manually). The delete block duplicated between the delete and update scripts is factored out.

⚠️ Deliberate deviation: PROPAGATED, not DERIVED

The issue's acceptance criteria ask for labelType=DERIVED. That cannot work. DERIVED already means "recomputed on read from the glossary term's own classification tags":

  • Write strips it: EntityRepository.applyTags:5907, applyTagsAdd:5948, applyTagsAddInFlushAndDeferRdf:9469, CollectionDAO.applyTagsBatchMultiTarget:7676
  • Read strips and regenerates it: TagLabelUtil.addDerivedTags:289 / addDerivedTagsWithPreFetched:375, fed by getDerivedTagsBatch (CollectionDAO:7033)

A DERIVED label cannot survive a round trip, and relaxing the filter is not an option — it could not distinguish a stale label from a term whose classification tags changed (must drop) from a projected parent label (must keep). LabelType.PROPAGATED is the schema's own marker, had zero write usages, and is already wired to label.propagated in AdvancedSearch.constants.ts. User-visible: the chip on an inherited column tag reads "Propagated". @yan-3005 — this changes your acceptance criteria; flagging for your call.

Projection on read, not stored rows

Deliberate: columns ingested after the table was tagged inherit automatically, no backfill migration, and no ~1 row per column per term of write amplification.

Type of change:

  • Bug fix

High-level design:

Two defects, fixed at shared choke points rather than per-caller.

  1. Child fields missing inherited terms — fixed in Entity.populateEntityFieldTags, the one function every field-tag hydration path routes through (~10 call sites across TableRepository, DashboardDataModelRepository, APIEndpointRepository, TestCaseRepository), rather than patching TableRepository.setFields alone.
  2. Delete cascade over-reaching — the Painless delete block was copy-pasted between generateDeleteTagLabelListScript and generateUpdateTagLabelListScript. Extracted to deleteTagLabelListBlock() and given a labelType guard once, so both scripts get the fix.

Backward compatibility. Deployed indices carry labelType: "Derived" from earlier releases, so the new delete block accepts both PROPAGATED and legacy DERIVED as system-applied — existing labels are still cleaned up without a reindex. Writes going forward are PROPAGATED only. No schema change: LabelType.PROPAGATED already exists in tagLabel.json and the generated enums, so no make generate and no migration.

Alternatives rejected. (a) Persisting one tag_usage row per child per term — needs a backfill, a second write path for children created later, and heavy write amplification on wide tables. (b) Relaxing the DERIVED filter — conflates two meanings on one enum value.

Tests:

Use cases covered

  • A term on a table is returned on its columns, including nested columns, via GET /tables/{id}?fields=columns,tags
  • A column carrying the same term explicitly keeps MANUAL, is not duplicated, and survives the table's term being removed
  • Classification tags and read-time DERIVED labels on the parent are not projected
  • A projected label is not persistable, so a read/write round trip cannot pin it

Unit tests

  • openmetadata-service/src/test/java/org/openmetadata/service/EntityPropagatedTagsTest.java7 tests, Tests run: 7, Failures: 0, Errors: 0
  • Covers: projection as PROPAGATED; the parent's own label is not mutated (defensive copy — without it the table's own tags flip to PROPAGATED); classification + DERIVED not projected; null/empty; a field's own MANUAL wins; and that PROPAGATED/DERIVED are non-persistable while MANUAL/AUTOMATED remain persistable.
  • Coverage caveat: targeted tests on the projection helper and the predicate. I have not measured 90% line coverage on Entity.java / SearchRepository.java — both are very large and this PR touches a small slice of each. The 90%-on-changed-class target is not demonstrated.

Backend integration tests

  • openmetadata-integration-tests/src/test/java/org/openmetadata/it/tests/GlossaryTagChildPropagationIT.javaTests run: 3, Failures: 0, Errors: 0, Skipped: 1, BUILD SUCCESS against a Testcontainers stack (MySQL + Elasticsearch + server).
  • Passing: term on table returned on top-level and nested columns as PROPAGATED then gone after removal; a column's own MANUAL label wins, is not duplicated, and survives the table's term being removed.
  • Skipped: see the finding below.

Ingestion integration tests

  • Not applicable — no ingestion changes.

Playwright (UI) tests

  • Not applicable to this diff (no UI files changed). Bug C of the issue is unaddressed — playwright/e2e/Pages/Glossary.spec.ts:1197 asserts an asset count now inflated by propagated column entries.

Manual testing performed

  • mvn install -pl openmetadata-serviceBUILD SUCCESS; mvn test -Dtest=EntityPropagatedTagsTest → 7/7
  • mvn test -pl openmetadata-integration-tests -Dtest=GlossaryTagChildPropagationITBUILD SUCCESS, 2 passed / 1 skipped
  • mvn spotless:apply → clean, only files in this PR touched

UI screen recording / screenshots:

Not applicable — no UI files changed.

🔍 New finding: the cascade never reaches child search docs on the add path

The issue describes delete as the broken direction. Writing the IT showed add is broken too, which is why the third test is @Disabled rather than deleted — the repro is worth keeping.

Observed on a real stack: after the term is applied to the table, SearchRepository logs Search index update with propagation - type: table (propagate: 7ms), so requiresPropagation opened the gate and propagateInheritedFieldsToChildren ran — yet the column doc, present in column_search_index and resolvable by fqnParts, still has tags: []. Removal is never even reached.

Leading hypothesis, explicitly not proven: EntityIndexCapabilityRegistry is populated from Entity.registerEntity, and tableColumn is a pseudo-type with no repository, so it has no registered capability. IndexMappingValidator already warns that a child alias in that state is skipped by soft-delete propagation; the descriptor-driven cascade may be missing it the same way.

Also noticed while reading that log line: IndexMappingValidator emits its warning with unsubstituted %s placeholders (Parent '%s' declares child alias '%s' ...), so it never says which parent or alias. Trivial, unrelated, worth a separate fix.

Correction to my earlier claim

An earlier revision of this description asserted that removing a table's tag already cleared descendant column ES docs "via the column doc rebuild". That was inference from code and the IT disproves it. A tags-only change takes updateTableColumnsInheritedFields — a script update-by-query that never touches tags — so there is no rebuild to ride on. Status table below is corrected.

Status against #31756's acceptance criteria

Criterion Status
GET /tables/{fqn} returns columns with the parent's term ✅ done (as PROPAGATED), IT-verified incl. nested
A column's own MANUAL term is not clobbered ✅ done, IT-verified (not in the original criteria; found while fixing)
Removing a table's tag clears descendant column ES docs not done — and the add path does not populate them either (see finding above)
Removing a table's tag clears testSuite / testCase ES docs ❌ not done — they are entities, not fields, so they do not route through populateEntityFieldTags, and the cascade never fires from the bulk APIs because updateEntity(ref) nulls the ChangeDescription (SearchRepository:1879)
CSV export includes inherited tags ❌ not done — CsvUtil.java:295 / CSV.utils.tsx:121 filter on DERIVED only, so PROPAGATED needs adding or export/re-import turns it into MANUAL
Playwright asset-count assertion (Bug C) ❌ not done
IT coverage 🟡 partial — entity-API half covered and green; search half is a disabled repro
One-time cleanup of orphan labels in child indices ❌ not done

Also outstanding, found while tracing: EntityUtil.populateEntityReferences's return value is discarded at all four bulk call sites (GlossaryTermRepository:1106,1403, TagRepository:517,677) — it prunes orphans from a copy while the loop iterates the original. And the UI keys "non-removable tag" on Derived only (AsyncSelectList.tsx:239, TreeAsyncSelectList.tsx:262), so a user can hand-delete a propagated tag that then reappears.

Checklist:

  • I have read the CONTRIBUTING document.
  • My PR title is Fixes <issue-number>: <short explanation>
  • My PR is linked to a GitHub issue via Fixes #<issue-number> above.
  • I have commented on my code, particularly in hard-to-understand areas.
  • For JSON Schema changes: N/A — no schema changed, no migration needed.
  • For UI changes: N/A.
  • I have added tests (unit + backend integration) and listed them above.

Scope note: this was opened as a draft and has since been marked ready by a maintainer. Three of the issue's acceptance criteria remain unaddressed and the search-side cascade is a known-failing repro rather than a fix, so please review it as a partial fix for Bug B rather than a close-out of #31756. Happy to split the remainder into a follow-up.

🤖 Generated with Claude Code

Greptile Summary

This PR projects parent glossary terms onto entity fields as propagated labels, prevents projected labels from being persisted, and preserves manually applied child labels during search propagation.

  • Adds read-time parent-to-field glossary-tag projection.
  • Treats derived and propagated labels as system-generated across persistence paths.
  • Updates search propagation scripts to preserve manual labels and support legacy derived labels.
  • Adds focused unit and integration-test scaffolding.

Confidence Score: 5/5

The PR appears safe to merge because no blocking failure remains.

No blocking failure remains.

Important Files Changed

Filename Overview
openmetadata-service/src/main/java/org/openmetadata/service/Entity.java Adds defensive read-time projection of parent glossary terms onto fields while preserving explicit field labels.
openmetadata-service/src/main/java/org/openmetadata/service/resources/tags/TagLabelUtil.java Centralizes classification of derived and propagated labels as system-generated.
openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java Applies the shared system-generated-label predicate across persistence and RDF paths.
openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java Prevents projected labels from being persisted by batch tag writes.
openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java Stamps inherited search labels as propagated and limits cascade deletion to system-applied labels.
openmetadata-service/src/test/java/org/openmetadata/service/EntityPropagatedTagsTest.java Covers projection, defensive copying, deduplication, and system-generated-label classification.
openmetadata-integration-tests/src/test/java/org/openmetadata/it/tests/GlossaryTagChildPropagationIT.java Adds end-to-end entity API scenarios for inherited and manually applied glossary terms.

Sequence Diagram

sequenceDiagram
  participant Client
  participant Repository as EntityRepository
  participant Entity
  participant Search as SearchRepository
  participant Index as Column Search Index
  Client->>Repository: Apply/remove table glossary term
  Repository->>Search: Dispatch entity change
  Search->>Index: Propagate PROPAGATED label update
  Client->>Entity: Read table with columns and tags
  Entity->>Repository: Fetch parent and field tag rows
  Entity->>Entity: Merge projected parent terms with field labels
  Entity-->>Client: Return MANUAL field labels before PROPAGATED labels
Loading

Reviews (2): Last reviewed commit: "test(tags): cover the child glossary ter..." | Re-trigger Greptile

Context used:

…delete cascade stripping manual labels

Bug B of #31756: a glossary term on a table was visible on its columns only in
the search index. The entity API returned each column's own tags, so the column
panel and Explore disagreed.

populateEntityFieldTags now projects the parent's glossary terms onto every
field on read. It is the single funnel for field tag hydration, so table
columns, dashboard data model columns and API endpoint schema fields are all
covered, and getFlattenedEntityField already recurses into nested columns. The
parent's own tag_usage row now arrives in the existing getTagsByPrefix call
("%" instead of ".%"), so this costs no extra query. A field carrying the term
itself keeps MANUAL, because tagLabelMatch ignores labelType and mergeTags
gives the field's own label precedence.

The projected label is PROPAGATED, not DERIVED as the issue proposed. DERIVED
means "recomputed on read from the glossary term's own classification tags":
applyTags, applyTagsAdd and applyTagsBatchMultiTarget strip it on write and
addDerivedTags strips and regenerates it on read, so a DERIVED label cannot
survive a round trip. PROPAGATED is the schema's own marker for a propagated
label and is untouched by both paths. The search propagation sites are switched
to match so the index and the entity API agree.

Also fixes the child delete script matching on tagFQN alone, which stripped the
term from a column that had it applied manually. It now only removes labels the
system propagated, accepting legacy DERIVED alongside PROPAGATED so labels
written by earlier releases are still cleaned up without a reindex. The block
was duplicated between the delete and update scripts; it is now shared.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added backend safe to test Add this label to run secure Github workflows on PRs labels Aug 20, 2026
Comment on lines +3248 to +3262
private String deleteTagLabelListBlock() {
return String.format(
"""
if (ctx._source.tags != null && params.tagDeleted != null) {
for (int i = ctx._source.tags.size() - 1; i >= 0; i--) {
for (int j = 0; j < params.tagDeleted.size(); j++) {
if (ctx._source.tags[i].tagFQN.equalsIgnoreCase(params.tagDeleted[j].tagFQN)) {
ctx._source.tags.remove(i);
break;
def existingTag = ctx._source.tags[i];
boolean systemApplied = existingTag.labelType == null
|| existingTag.labelType.equalsIgnoreCase('%s')
|| existingTag.labelType.equalsIgnoreCase('%s');
if (systemApplied) {
for (int j = 0; j < params.tagDeleted.size(); j++) {
if (existingTag.tagFQN.equalsIgnoreCase(params.tagDeleted[j].tagFQN)) {
ctx._source.tags.remove(i);
break;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Edge Case: Delete script treats null labelType as system-applied

deleteTagLabelListBlock marks a tag systemApplied when existingTag.labelType == null. Any indexed tag whose labelType field is absent/null will be removed by the cascade even if it was a manually applied label, re-introducing the very stripping bug this PR fixes for legacy/edge documents that lack an explicit labelType. Consider requiring an explicit PROPAGATED/DERIVED match instead of treating null as system-applied, or confirm all indexed tags always carry a labelType.

Was this helpful? React with 👍 / 👎

@mohityadav766
mohityadav766 marked this pull request as ready for review August 20, 2026 13:03
@mohityadav766
mohityadav766 requested a review from a team as a code owner August 20, 2026 13:03
Copilot AI lite review requested due to automatic review settings August 20, 2026 13:03
@github-actions

Copy link
Copy Markdown
Contributor

❌ PR checklist incomplete

This PR cannot be merged until the following are addressed on its linked issue:

The fields live on the linked issue in the Shipping project (open the issue → right sidebar → Projects). After you set them, re-run this check (or push a commit) — issue/project changes do not re-trigger it automatically.

Maintainers can bypass this check by adding the skip-pr-checks label.

chirag-madlani
chirag-madlani previously approved these changes Aug 20, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR addresses parts of #31756 by making inherited glossary terms visible on child fields in the entity API response (so API and search index agree), and by tightening the search-index tag delete/update scripts to avoid stripping manually-applied labels during cascades.

Changes:

  • Project a parent entity’s glossary term tags onto all descendant fields at read time via Entity.populateEntityFieldTags, using LabelType.PROPAGATED.
  • Update SearchRepository TAG_LABEL_LIST propagation scripts to stamp PROPAGATED and to only delete system-applied labels (accepting legacy DERIVED for cleanup).
  • Add unit tests for the parent→field tag projection helper.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
openmetadata-service/src/main/java/org/openmetadata/service/Entity.java Fetches parent + descendant tag_usage rows in one query and merges parent glossary terms into each field’s tags on read.
openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java Switches propagated labelType to PROPAGATED and refactors/guards the delete block to preserve manual labels.
openmetadata-service/src/test/java/org/openmetadata/service/EntityPropagatedTagsTest.java Adds targeted unit tests validating read-time projection behavior and merge precedence.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +3253 to +3256
def existingTag = ctx._source.tags[i];
boolean systemApplied = existingTag.labelType == null
|| existingTag.labelType.equalsIgnoreCase('%s')
|| existingTag.labelType.equalsIgnoreCase('%s');
Comment on lines +1001 to +1004
// Fetch All tags belonging to Prefix. "%" rather than ".%" so the parent's own row arrives in
// the same query — its glossary terms are projected onto every field below. The DAO returns
// null
// for an entity type that does not support tags.
Comment on lines +3241 to 3273
/**
* Removes a parent's tags from a child doc, but only the labels the system itself propagated. A
* child that carries the same term MANUAL (a column explicitly tagged with the term the table also
* carries) keeps it — matching on tagFQN alone used to strip it. DERIVED is accepted alongside
* PROPAGATED so labels written by earlier releases, which stamped DERIVED, are still cleaned up
* without requiring a reindex first.
*/
private String deleteTagLabelListBlock() {
return String.format(
"""
if (ctx._source.tags != null && params.tagDeleted != null) {
for (int i = ctx._source.tags.size() - 1; i >= 0; i--) {
for (int j = 0; j < params.tagDeleted.size(); j++) {
if (ctx._source.tags[i].tagFQN.equalsIgnoreCase(params.tagDeleted[j].tagFQN)) {
ctx._source.tags.remove(i);
break;
def existingTag = ctx._source.tags[i];
boolean systemApplied = existingTag.labelType == null
|| existingTag.labelType.equalsIgnoreCase('%s')
|| existingTag.labelType.equalsIgnoreCase('%s');
if (systemApplied) {
for (int j = 0; j < params.tagDeleted.size(); j++) {
if (existingTag.tagFQN.equalsIgnoreCase(params.tagDeleted[j].tagFQN)) {
ctx._source.tags.remove(i);
break;
}
}
}
}
}
"""
+ SearchClient.TAG_RESEPARATION_SCRIPT;
""",
TagLabel.LabelType.PROPAGATED.value(), TagLabel.LabelType.DERIVED.value());
}

private String generateDeleteTagLabelListScript() {
return deleteTagLabelListBlock() + SearchClient.TAG_RESEPARATION_SCRIPT;
}
…ected label being persisted

Adds GlossaryTagChildPropagationIT for #31756 and fixes a defect it found in the
previous commit.

The defect: every never-persist filter on the write path tested only for
DERIVED, so a projected PROPAGATED label could be written into tag_usage on a
round trip. A client that GETs a table — whose columns now carry projected
labels — and PUTs it back unchanged would pin the label in place, and it would
then survive the parent's term being removed. That is the phantom tag this
change set exists to remove, reintroduced through the new label. All seven
write-path sites now route through TagLabelUtil.isSystemGenerated, which covers
DERIVED and PROPAGATED together. The read path in addDerivedTags is deliberately
left alone: the projection depends on PROPAGATED surviving there.

The IT verifies against a real stack that a term on a table is returned on its
top-level and nested columns as PROPAGATED and disappears when the table's term
is removed, and that a column carrying the term itself keeps MANUAL, is not
duplicated, and survives the table's term being removed.

Its third case is @disabled because it reproduces an open half of #31756 that
this change set does not fix. SearchRepository logs "update with propagation -
type: table", so the gate opens and propagateInheritedFieldsToChildren runs, yet
the column doc — present in column_search_index and resolvable by fqnParts —
still has tags: []. The label never reaches child search docs on the add path,
so removal is never reached. The javadoc records the evidence and a labelled,
unproven hypothesis. It is disabled rather than deleted so the repro survives.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gitar-bot

gitar-bot Bot commented Aug 20, 2026

Copy link
Copy Markdown
Code Review 👍 Approved with suggestions 1 resolved / 2 findings

Projects parent glossary terms onto entity fields as propagated labels and updates search deletion scripts to preserve manual child labels. Consider tightening the delete script's null labelType handling to avoid accidentally removing unannotated records.

💡 Edge Case: Delete script treats null labelType as system-applied

📄 openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java:3248-3262

deleteTagLabelListBlock marks a tag systemApplied when existingTag.labelType == null. Any indexed tag whose labelType field is absent/null will be removed by the cascade even if it was a manually applied label, re-introducing the very stripping bug this PR fixes for legacy/edge documents that lack an explicit labelType. Consider requiring an explicit PROPAGATED/DERIVED match instead of treating null as system-applied, or confirm all indexed tags always carry a labelType.

✅ 1 resolved
Bug: PROPAGATED column tags can be persisted on table write

📄 openmetadata-service/src/main/java/org/openmetadata/service/Entity.java:1029-1043
populateEntityFieldTags now injects the parent's glossary terms onto every column at read time with labelType=PROPAGATED. But the write path (applyTags/applyTagsAdd/applyColumnTags) only strips LabelType.DERIVED, not PROPAGATED. TableRepository.storeEntity/prepare call applyColumnTags(table.getColumns()) over ALL columns, so any PUT/PATCH that round-trips a previously-read table (columns already carrying PROPAGATED labels) will persist one real tag_usage row per column per term — the exact write amplification the PR set out to avoid, and these stored rows will not be cleared when the term is removed from the table. Strip PROPAGATED alongside DERIVED in the write filters (e.g. applyTags, applyTagsAdd, applyTagsBatch and collectColumnTags), or ensure projected tags are removed before store, so propagated labels never reach tag_usage.

🤖 Prompt for agents
Code Review: Projects parent glossary terms onto entity fields as propagated labels and updates search deletion scripts to preserve manual child labels. Consider tightening the delete script's null labelType handling to avoid accidentally removing unannotated records.

1. 💡 Edge Case: Delete script treats null labelType as system-applied
   Files: openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java:3248-3262

   `deleteTagLabelListBlock` marks a tag `systemApplied` when `existingTag.labelType == null`. Any indexed tag whose `labelType` field is absent/null will be removed by the cascade even if it was a manually applied label, re-introducing the very stripping bug this PR fixes for legacy/edge documents that lack an explicit labelType. Consider requiring an explicit PROPAGATED/DERIVED match instead of treating null as system-applied, or confirm all indexed tags always carry a labelType.

Options

Display: compact → Showing less information.

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.

Comment on lines 3003 to 3008
case TAG_LABEL_LIST -> {
List<TagLabel> tagLabels =
JsonUtils.readOrConvertValues(field.getNewValue(), TagLabel.class);
tagLabels.forEach(t -> t.setLabelType(TagLabel.LabelType.DERIVED));
tagLabels.forEach(t -> t.setLabelType(TagLabel.LabelType.PROPAGATED));
data.put("tagAdded", tagLabels);
script.append(generateAddTagLabelListScript());
@sonarqubecloud

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown
Contributor

🔴 Playwright Results — workflow failed

Validated commit 5223341b4443f0605ba4b97e6df9c7d9c756875a in Playwright run 32375070922, attempt 1.

✅ 1278 passed · ❌ 2 failed · 🟡 1 flaky · ⏭️ 0 skipped · 🧰 0 lifecycle flaky

Performance

Blocking targets: ✅ met · Optimization targets: 🟡 in progress

Shard-job maxima below are not the full workflow wall time; the linked run includes build, fixture, planning, and reporting.

🕒 Full workflow signal wall (to summary) 1h 4m 21s

⏱️ Max setup 6m 28s · max shard execution 19m 30s · max shard-job elapsed before upload 25m 51s · reporting 8s

🌐 200.88 requests/attempt · 2.12 app boots/UI scenario · 22.48% common-shard skew

Optimization targets still in progress:

  • Common shard skew was 22.48% (convergence target: at most 15%).
  • Browser traffic was 200.88 requests per attempt (convergence target: fewer than 200).
  • Application boot ratio was 2.12 per UI scenario (2770 boots / 1307 scenarios; convergence target: at most 1).
Shard Passed Failed Flaky Skipped Lifecycle failed Lifecycle flaky
✅ Shard chromium-01 140 0 0 0 0 0
✅ Shard chromium-02 141 0 0 0 0 0
✅ Shard chromium-03 140 0 0 0 0 0
🟡 Shard chromium-04 125 0 1 0 0 0
🔴 Shard chromium-05 123 1 0 0 0 0
✅ Shard chromium-06 124 0 0 0 0 0
✅ Shard chromium-07 155 0 0 0 0 0
✅ Shard chromium-08 144 0 0 0 0 0
🔴 Shard data-asset-rules-01 60 1 0 0 0 0
✅ Shard domain-isolation-01 14 0 0 0 0 0
✅ Shard global-state-01 34 0 0 0 0 0
✅ Shard import-export-01 7 0 0 0 0 0
✅ Shard ingestion-01 2 0 0 0 0 0
✅ Shard reindex-01 16 0 0 0 0 0
✅ Shard reindex-02 12 0 0 0 0 0
✅ Shard search-01 12 0 0 0 0 0
✅ Shard search-rbac-01 29 0 0 0 0 0

Genuine Failures (failed on all attempts)

Pages/Glossary.spec.tsRename Glossary Term and verify assets (shard chromium-05)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed  Locator: getByTestId('assets').getByTestId('filter-count') Expected substring: �[32m"5"�[39m Received string:    �[31m"14"�[39m Timeout: 15000ms  Call log: �[2m  - Expect "toContainText" with timeout 15000ms�[22m �[2m  - waiting for getByTestId('assets').getByTestId('filter-count')�[22m �[2m    18 × locator resolved to <span title="14" class="text-xs" data-testid="filter-count">14</span>�[22m �[2m       - unexpected value "14"�[22m 
Features/DataAssetRulesDisabled.spec.tsDatabase Schema (shard data-asset-rules-01)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoBeVisible�[2m(�[22m�[2m)�[22m failed  Locator: getByRole('link', { name: 'PW f9eba1dc%Eagleffd754e4' }) Expected: visible Error: strict mode violation: getByRole('link', { name: 'PW f9eba1dc%Eagleffd754e4' }) resolved to 8 elements:     1) <a tabindex="0" data-discover="true" data-testid="tag-redirect-link" class="no-underline h-full w-max-stretch" href="/glossary/%22PW%25'6665e9a4.Dark0f0436ac%22.%22PW.24d56015%25Eagleffd754e4%22">…</a> aka getByRole('row', { name: 'created_at4e67cb9b timestamp' }).getByTestId('tag-redirect-link')     2) <a tabindex="0" data-discover="true" data-testid="tag-redirect-link" class="no-underline h-full w-max-stretch" href="/glossary/%22PW%25'6665e9a4.Dark0f0436ac%22.%22PW.24d56015%25Eagleffd754e4%22">…</a> aka getByRole('row', { name: 'email7204ed10 varchar Email' }).getByTestId('tag-redirect-link')     3) <a tabindex="0" data-discover="true" data-testid="tag-redirect-link" class="no-underline h-full w-
🟡 1 flaky test(s) (passed on retry)
  • Pages/Glossary.spec.tsGlossary & terms creation for reviewer as user (shard chromium-04, 1 retry)

📦 Download artifacts

How to debug locally
# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip    # view trace

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.

Tag propagation cascade: delete not symmetric with add; column list/get API missing inherited Derived tags

3 participants