Skip to content

fix(migration): preserve task creator/comments/reactions/resolution and replay incident state on 2.0 upgrade#30213

Open
sonika-shah wants to merge 2 commits into
open-metadata:mainfrom
sonika-shah:fix/migrated-task-field-fidelity
Open

fix(migration): preserve task creator/comments/reactions/resolution and replay incident state on 2.0 upgrade#30213
sonika-shah wants to merge 2 commits into
open-metadata:mainfrom
sonika-shah:fix/migrated-task-field-fidelity

Conversation

@sonika-shah

@sonika-shah sonika-shah commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator

Problem

On a 1.12.1 → 2.0 upgrade, the thread→task migration preserves the task rows and their type/status mapping, but drops several fields and resets incident state. On migrated (pre-existing) data:

  • Created By is blank — the migration never carries the original requester onto the task.
  • Completed tasks lose their resolverresolution.resolvedBy is empty and the comment is a generic "Migrated from thread-based task system".
  • Task comments are dropped — the thread's posts (replies + resolve/close records) don't reach task_entity.comments.
  • Task reactions are dropped.
  • Migrated incidents reset to New / No Owners — the incident workflow restarts at NewStage and never replays the recorded test_case_resolution_status lifecycle, so a pre-upgrade Ack/Assigned incident loses its stage and assignee (and the stale state then makes the "Update Status" resolve fail).

New tasks/incidents created in 2.0 are unaffected — this is migration-only.

Fix

v200/MigrationUtil.java — in the thread→task migration:

  • set createdBy (entityReference) in addition to createdById;
  • set resolution.resolvedBy from the legacy closedBy (the original close note now survives as a migrated comment, so the placeholder is dropped);
  • migrate the thread's posts[] into task comments[] (+ commentCount);
  • carry thread-level reactions[] onto the task.

For incidents, after backfillOpenTasksToWorkflowInstances starts the workflow, replay the test case's latest resolution status onto the instance, reusing the existing runtime bridge (resolveLegacyTransitionId / buildLegacyResolvedPayload) so migration and runtime stay consistent. New public entry point: TestCaseResolutionStatusRepository.backfillMigratedIncidentTaskStage. Idempotent — no-ops when the task is already at the recorded stage.

Complementary to #29978 (which restores the ASSIGNED_TO / MENTIONED_IN relationships on Postgres); this PR restores the field- and incident-state fidelity that #29978 does not cover.

Testing

  • openmetadata-service compiles; spotless applied.
  • Reviewers: please verify the incident replay end-to-end on a migrated instance — a test case that was Ack/Assigned before upgrade should come back at the same stage with its assignee, and "Update Status" should transition without error. (This path touches Flowable workflow state and warrants a live migration check.)

Greptile Summary

This migration fix preserves thread-to-task field fidelity and incident stage on 1.12.1 → 2.0 upgrades. Previously, migrated tasks lost their creator, resolver identity, comments, reactions, and incident workflow state — causing incidents to reset to New / No Owners and "Update Status" to fail on pre-upgrade incidents.

  • Field preservation (MigrationUtil.java): adds createdBy entity reference, migrates thread posts[] to task comments[], carries thread-level reactions[], and resolves the actual closer into resolution.resolvedBy (dropping the generic placeholder comment).
  • Incident state replay (TestCaseResolutionStatusRepository.java): introduces backfillMigratedIncidentTaskStage, called after triggerByKey for each incident task, which looks up the latest TestCaseResolutionStatus record and replays it via the existing applyLegacyStatusToIncidentTask bridge so pre-upgrade Ack/Assigned incidents recover their stage and assignee.

Confidence Score: 4/5

Safe to merge for the field-preservation changes; the incident state replay path warrants a live migration check before deploying to production because the workflow trigger and replay call are not synchronized.

The thread-to-task field migration (creator, comments, reactions, resolver) is straightforward and well-guarded. The incident replay path is the higher-risk addition: replayMigratedIncidentState is called immediately after workflowHandler.triggerByKey, but Flowable's job executor may process the start event asynchronously. If the workflow has not yet reached NewStage when resolveTaskWithWorkflow runs, the transition silently fails (caught as WARN), and the incident stays at New — exactly the regression this PR is trying to prevent. Verifying on a live migrated instance is essential before this is considered fully resolved.

The incident state replay logic in MigrationUtil.java (replayMigratedIncidentState and its call site) deserves a live migration smoke test to confirm the workflow is in a stable state before the transition is attempted.

Important Files Changed

Filename Overview
openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v200/MigrationUtil.java Adds createdBy entity reference, comment/reaction migration, and resolvedBy population for closed tasks; also drives incident state replay after triggerByKey — timing between triggerByKey and the replay call is the main risk.
openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseResolutionStatusRepository.java New public entry point backfillMigratedIncidentTaskStage delegates cleanly to the existing applyLegacyStatusToIncidentTask bridge; null guards and idempotent no-op path are correct.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant M as MigrationUtil
    participant TR as TaskRepository
    participant WH as WorkflowHandler
    participant TCSR as TestCaseResolutionStatusRepository
    participant FE as Flowable Engine

    M->>TR: listAll(open tasks without workflowInstanceId)
    loop for each open incident task
        M->>WH: triggerByKey(workflowDefinitionFQN, taskId, variables)
        WH-->>FE: start workflow (async job executor)
        Note over FE: may not reach NewStage yet
        M->>M: replayMigratedIncidentState(task)
        M->>TCSR: backfillMigratedIncidentTaskStage(task)
        TCSR->>TCSR: getLatestRecord(testCaseFQN)
        TCSR->>TCSR: applyLegacyStatusToIncidentTask(latest, fqn)
        TCSR->>TR: get(taskId, full fields incl. workflowStageId)
        TCSR->>TCSR: resolveLegacyTransitionId(task, latest)
        TCSR->>TR: resolveTaskWithWorkflow(task, transitionId, ...)
        TR-->>FE: apply transition (needs stable NewStage)
    end

    Note over M: Thread-to-Task field migration
    M->>M: lookupUserId(createdByName) [DB query 1]
    M->>M: buildUserRef(createdByName) [DB query 2 same user]
    M->>M: migrateThreadPostsToComments(threadJson, taskJson)
    M->>M: set reactions, resolvedBy, resolution
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant M as MigrationUtil
    participant TR as TaskRepository
    participant WH as WorkflowHandler
    participant TCSR as TestCaseResolutionStatusRepository
    participant FE as Flowable Engine

    M->>TR: listAll(open tasks without workflowInstanceId)
    loop for each open incident task
        M->>WH: triggerByKey(workflowDefinitionFQN, taskId, variables)
        WH-->>FE: start workflow (async job executor)
        Note over FE: may not reach NewStage yet
        M->>M: replayMigratedIncidentState(task)
        M->>TCSR: backfillMigratedIncidentTaskStage(task)
        TCSR->>TCSR: getLatestRecord(testCaseFQN)
        TCSR->>TCSR: applyLegacyStatusToIncidentTask(latest, fqn)
        TCSR->>TR: get(taskId, full fields incl. workflowStageId)
        TCSR->>TCSR: resolveLegacyTransitionId(task, latest)
        TCSR->>TR: resolveTaskWithWorkflow(task, transitionId, ...)
        TR-->>FE: apply transition (needs stable NewStage)
    end

    Note over M: Thread-to-Task field migration
    M->>M: lookupUserId(createdByName) [DB query 1]
    M->>M: buildUserRef(createdByName) [DB query 2 same user]
    M->>M: migrateThreadPostsToComments(threadJson, taskJson)
    M->>M: set reactions, resolvedBy, resolution
Loading

Comments Outside Diff (1)

  1. openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v200/MigrationUtil.java, line 1959-1970 (link)

    P1 Replay fires before workflow instance is stable

    replayMigratedIncidentState is called synchronously right after workflowHandler.triggerByKey. If the Flowable job executor processes the "start" event asynchronously, the workflow process may not yet have transitioned into NewStage when resolveTaskWithWorkflow runs, causing the transition call to fail. The failure is caught and downgraded to a WARN, so the incident stays at New with no visible error — exactly the regression this PR is meant to fix. A brief Flowable-state check or retry before the transition (or moving the replay into an afterCommit hook where the workflow is guaranteed to be in a stable state) would close this gap.

Reviews (2): Last reviewed commit: "fix(migration): replay pre-upgrade incid..." | Re-trigger Greptile

Copilot AI review requested due to automatic review settings July 19, 2026 12:20

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

Copy link
Copy Markdown
Contributor

❌ PR checklist incomplete

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

  • No GitHub issue is linked. Link an issue in the Development section of the PR (or add Fixes #12345 to the description). For a same-org cross-repo issue, add Fixes open-metadata/<repo>#123 to the description.

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.

@github-actions github-actions Bot added backend safe to test Add this label to run secure Github workflows on PRs labels Jul 19, 2026
Comment on lines +1526 to +1533
ObjectNode author = buildUserRef(handle, post.path("from").asText(null));
if (author == null) {
author = JsonUtils.getObjectNode();
author.put("id", UUID.nameUUIDFromBytes("system".getBytes()).toString());
author.put("type", Entity.USER);
author.put("name", "system");
}
comment.set("author", author);

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: Comment fallback fabricates a non-existent "system" user reference

When a post's author cannot be resolved, the comment's author entityReference is set to a fabricated id UUID.nameUUIDFromBytes("system") with name system. No such row exists in user_entity, so this is a dangling reference — the same class of blank/unresolvable actor this PR sets out to fix; the UI will fail to resolve the author. Consider falling back to a real actor (e.g. resolve the thread's createdBy, or the ingestionBot/admin user id) or omitting the author rather than writing a synthetic user id.

Fall back to the task's already-resolved creator instead of a synthetic id:

ObjectNode author = buildUserRef(handle, post.path("from").asText(null));
if (author == null && taskJson.has("createdBy")) {
  author = (ObjectNode) taskJson.get("createdBy").deepCopy();
}
if (author != null) {
  comment.set("author", author);
}
  • Apply fix

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

Comment on lines 748 to 755
String createdByUserId = lookupUserId(handle, createdByName);
if (createdByUserId != null) {
taskJson.put("createdById", createdByUserId);
ObjectNode createdByRef = buildUserRef(handle, createdByName);
if (createdByRef != null) {
taskJson.set("createdBy", createdByRef);
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Performance: Redundant user_entity lookup for createdBy reference

createdByUserId is already resolved via lookupUserId, then buildUserRef immediately re-runs the identical lookupUserId query for the same createdByName. lookupUserId is uncached and hits user_entity each call, so every migrated task issues one redundant query. Build the reference from the id already in hand rather than querying again.

Reuse the already-resolved id:

if (createdByUserId != null) {
  taskJson.put("createdById", createdByUserId);
  ObjectNode createdByRef = JsonUtils.getObjectNode();
  createdByRef.put("id", createdByUserId);
  createdByRef.put("type", Entity.USER);
  createdByRef.put("name", createdByName);
  taskJson.set("createdBy", createdByRef);
}
  • Apply fix

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

Comment on lines 748 to 755
String createdByUserId = lookupUserId(handle, createdByName);
if (createdByUserId != null) {
taskJson.put("createdById", createdByUserId);
ObjectNode createdByRef = buildUserRef(handle, createdByName);
if (createdByRef != null) {
taskJson.set("createdBy", createdByRef);
}
}

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.

P2 buildUserRef already calls lookupUserId internally, so this block runs two SQL queries against user_entity for the same name. For a migration that may process thousands of tasks, this silently doubles DB round-trips for the createdBy field. Either restructure buildUserRef to accept an already-resolved id, or build the ref directly here using the id you already hold.

Suggested change
String createdByUserId = lookupUserId(handle, createdByName);
if (createdByUserId != null) {
taskJson.put("createdById", createdByUserId);
ObjectNode createdByRef = buildUserRef(handle, createdByName);
if (createdByRef != null) {
taskJson.set("createdBy", createdByRef);
}
}
String createdByUserId = lookupUserId(handle, createdByName);
if (createdByUserId != null) {
taskJson.put("createdById", createdByUserId);
ObjectNode createdByRef = JsonUtils.getObjectNode();
createdByRef.put("id", createdByUserId);
createdByRef.put("type", Entity.USER);
createdByRef.put("name", createdByName);
taskJson.set("createdBy", createdByRef);
}

…eactions

The v200 thread→task migration dropped several fields, leaving migrated
tasks with a blank "Created By", no resolver on completed tasks, empty
comment history, and no reactions. Map them onto task_entity:

- createdBy: set the entityReference (not just createdById) from the
  legacy thread creator so the task drawer's "Created By" resolves.
- resolution.resolvedBy: set from the legacy closedBy; drop the generic
  "Migrated from thread-based task system" placeholder comment — the real
  close note now survives as a migrated comment.
- comments: migrate the thread's posts[] (replies + resolve/close records)
  into task comments[] and set commentCount.
- reactions: carry thread-level reactions onto the task.

Adds buildUserRef and migrateThreadPostsToComments helpers.
…ent tasks

The v200 cutover starts every incident (TestCaseResolution) workflow at
NewStage and never replays the recorded test_case_resolution_status lifecycle,
so an incident that was Ack/Assigned before the upgrade comes back as
New / No Owners — and that stale state also makes the "Update Status" resolve
transition fail.

After backfillOpenTasksToWorkflowInstances starts an incident workflow, replay
the test case's latest resolution status onto it, reusing the existing runtime
bridge (resolveLegacyTransitionId / buildLegacyResolvedPayload) so migration and
runtime stay consistent. Adds TestCaseResolutionStatusRepository
.backfillMigratedIncidentTaskStage as the public entry point. Idempotent:
no-ops when the task is already at the recorded stage.
@sonika-shah
sonika-shah force-pushed the fix/migrated-task-field-fidelity branch from e4a11ac to 8fe7d61 Compare July 19, 2026 13:28
Copilot AI review requested due to automatic review settings July 19, 2026 13:28

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@gitar-bot

gitar-bot Bot commented Jul 19, 2026

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

Restores field and incident state fidelity during the 1.12.1 to 2.0 migration, ensuring task metadata and workflow status are preserved. Consider refactoring the redundant user lookup and handling the fabricated 'system' author reference for unresolved users.

💡 Quality: Comment fallback fabricates a non-existent "system" user reference

📄 openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v200/MigrationUtil.java:1526-1533

When a post's author cannot be resolved, the comment's author entityReference is set to a fabricated id UUID.nameUUIDFromBytes("system") with name system. No such row exists in user_entity, so this is a dangling reference — the same class of blank/unresolvable actor this PR sets out to fix; the UI will fail to resolve the author. Consider falling back to a real actor (e.g. resolve the thread's createdBy, or the ingestionBot/admin user id) or omitting the author rather than writing a synthetic user id.

Fall back to the task's already-resolved creator instead of a synthetic id
ObjectNode author = buildUserRef(handle, post.path("from").asText(null));
if (author == null && taskJson.has("createdBy")) {
  author = (ObjectNode) taskJson.get("createdBy").deepCopy();
}
if (author != null) {
  comment.set("author", author);
}
💡 Performance: Redundant user_entity lookup for createdBy reference

📄 openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v200/MigrationUtil.java:748-755 📄 openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v200/MigrationUtil.java:1495-1505

createdByUserId is already resolved via lookupUserId, then buildUserRef immediately re-runs the identical lookupUserId query for the same createdByName. lookupUserId is uncached and hits user_entity each call, so every migrated task issues one redundant query. Build the reference from the id already in hand rather than querying again.

Reuse the already-resolved id
if (createdByUserId != null) {
  taskJson.put("createdById", createdByUserId);
  ObjectNode createdByRef = JsonUtils.getObjectNode();
  createdByRef.put("id", createdByUserId);
  createdByRef.put("type", Entity.USER);
  createdByRef.put("name", createdByName);
  taskJson.set("createdBy", createdByRef);
}
🤖 Prompt for agents
Code Review: Restores field and incident state fidelity during the 1.12.1 to 2.0 migration, ensuring task metadata and workflow status are preserved. Consider refactoring the redundant user lookup and handling the fabricated 'system' author reference for unresolved users.

1. 💡 Quality: Comment fallback fabricates a non-existent "system" user reference
   Files: openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v200/MigrationUtil.java:1526-1533

   When a post's author cannot be resolved, the comment's `author` entityReference is set to a fabricated id `UUID.nameUUIDFromBytes("system")` with name `system`. No such row exists in `user_entity`, so this is a dangling reference — the same class of blank/unresolvable actor this PR sets out to fix; the UI will fail to resolve the author. Consider falling back to a real actor (e.g. resolve the thread's `createdBy`, or the `ingestionBot`/`admin` user id) or omitting the author rather than writing a synthetic user id.

   Fix (Fall back to the task's already-resolved creator instead of a synthetic id):
   ObjectNode author = buildUserRef(handle, post.path("from").asText(null));
   if (author == null && taskJson.has("createdBy")) {
     author = (ObjectNode) taskJson.get("createdBy").deepCopy();
   }
   if (author != null) {
     comment.set("author", author);
   }

2. 💡 Performance: Redundant user_entity lookup for createdBy reference
   Files: openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v200/MigrationUtil.java:748-755, openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v200/MigrationUtil.java:1495-1505

   `createdByUserId` is already resolved via `lookupUserId`, then `buildUserRef` immediately re-runs the identical `lookupUserId` query for the same `createdByName`. `lookupUserId` is uncached and hits `user_entity` each call, so every migrated task issues one redundant query. Build the reference from the id already in hand rather than querying again.

   Fix (Reuse the already-resolved id):
   if (createdByUserId != null) {
     taskJson.put("createdById", createdByUserId);
     ObjectNode createdByRef = JsonUtils.getObjectNode();
     createdByRef.put("id", createdByUserId);
     createdByRef.put("type", Entity.USER);
     createdByRef.put("name", createdByName);
     taskJson.set("createdBy", createdByRef);
   }

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 👍 / 👎 | Gitar

@sonarqubecloud

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown
Contributor

🟡 Playwright Results — all passed (27 flaky)

✅ 4544 passed · ❌ 0 failed · 🟡 27 flaky · ⏭️ 95 skipped

Shard Passed Failed Flaky Skipped
🟡 Shard 1 436 0 4 16
✅ Shard 2 11 0 0 0
🟡 Shard 3 825 0 7 8
🟡 Shard 4 819 0 4 18
🟡 Shard 5 839 0 2 5
🟡 Shard 6 787 0 1 46
🟡 Shard 7 827 0 9 2
🟡 27 flaky test(s) (passed on retry)
  • Features/TeamsDragAndDrop.spec.ts › Add teams in hierarchy (shard 1, 1 retry)
  • Flow/TestConnectionModal.spec.ts › failure state shows remediation card with error content (shard 1, 1 retry)
  • Pages/SearchSettings.spec.ts › Latest preview config wins when a superseded request resolves late (shard 1, 1 retry)
  • Flow/SearchRBAC.spec.ts › a fully denied user sees neither asset type when browsing (shard 1, 1 retry)
  • Features/BulkEditEntity.spec.ts › Glossary Term (Nested) (shard 3, 1 retry)
  • Features/BulkImportWithDotInName.spec.ts › Column with dot in name under service with dot (shard 3, 1 retry)
  • Features/ContextCenterArchive.spec.ts › archive page lazy-loads more rows on scroll within its own scroll container (shard 3, 1 retry)
  • Features/ContextCenterArticles.spec.ts › Article listing search filters, clears, and shows empty state (shard 3, 1 retry)
  • Features/ContextCenterArticles.spec.ts › description: switching articles does not bleed unsaved content into next article (shard 3, 1 retry)
  • Features/ContextCenterMemories.spec.ts › Shared memory shows the shared-with-specific-people description (shard 3, 1 retry)
  • Features/ContextCenterPermission.spec.ts › user with view-only permission cannot see restore or delete actions on an archived document (shard 3, 1 retry)
  • Features/Glossary/GlossaryTermRelationsGraphNested.spec.ts › viewing a child term: parent appears as a 1-hop neighbour via parentOf edge (shard 4, 1 retry)
  • Features/Glossary/GlossaryTermRelationsGraphNested.spec.ts › viewing a child term: parentOf edge is rendered between parent and child (shard 4, 1 retry)
  • Features/Permissions/ServiceEntityPermissions.spec.ts › Pipeline Service allow common operations permissions (shard 4, 1 retry)
  • Features/SearchExport.spec.ts › Export queues a background job and downloads from the jobs tray (shard 4, 1 retry)
  • Flow/AddRoleAndAssignToUser.spec.ts › Verify assigned role to new user (shard 5, 1 retry)
  • Pages/CustomProperties.spec.ts › Should display custom properties for apiCollection in right panel (shard 5, 1 retry)
  • Pages/ExplorePageRightPanel_KnowledgeCenter.spec.ts › Should remove user owner for knowledgeCenter (shard 6, 1 retry)
  • Pages/ExplorePageRightPanel.spec.ts › Should allow Data Steward to edit tier for dashboardDataModel (shard 7, 1 retry)
  • Pages/ExplorePageRightPanel.spec.ts › Should NOT show restricted edit buttons for Data Steward for searchIndex (shard 7, 1 retry)
  • Pages/Glossary.spec.ts › Drag and Drop Glossary Term (shard 7, 1 retry)
  • Pages/GlossaryImportExport.spec.ts › Import partial success - some terms pass, some fail (shard 7, 1 retry)
  • Pages/GlossaryImportExport.spec.ts › Glossary CSV import preserves typed relations (shard 7, 1 retry)
  • Pages/Lineage/LineageFilters.spec.ts › Verify Impact Analysis service filter selection (shard 7, 1 retry)
  • Pages/Lineage/LineageRightPanel.spec.ts › Verify custom properties tab is NOT visible for pipelineService in platform lineage (shard 7, 1 retry)
  • Pages/Lineage/LineageRightPanel.spec.ts › Verify custom properties tab is NOT visible for apiService in platform lineage (shard 7, 1 retry)
  • Pages/TestSuite.spec.ts › Logical TestSuite (shard 7, 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.

2 participants