Test PR - master#1094
Conversation
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: anwesha-palit-redhat The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
@anwesha-palit-redhat: The following test failed, say
Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
|
/agentic_review |
Code Review by Qodo
1. Installed version lost
|
|
/config |
🛠️ Wiki configuration file settings:🛠️ Local configuration file settings:
🛠️ Global configuration file settings:[config]
command_prefix = "/q"
[github_app]
pr_commands = [ "/review", "/generate_labels" ]
[pr_reviewer]
enable_review_labels_security = true
enable_review_labels_effort = false
enable_chat_in_code_suggestions=false
🛠️ PR-Agent final configurations:==================== CONFIG ====================
config.organization_id = 'codium.ai'
config.qodo_llm_gateway_metadata_tags = True
config.second_model_for_exhaustive_mode = 'openai/openai/o4-mini'
config.model = 'openai/openai/gpt-5.2'
config.model_turbo = 'openai/openai/gpt-5.4-mini'
config.fetch_github_apps_from_platform = True
config.model_reasoning = 'openai/vertex_ai/gemini-3.1-pro-preview'
config.fallback_models = ['openai/anthropic/claude-sonnet-4-6', 'openai/openai/gpt-5.2']
config.pr_compliance = {'ENABLE_RULES_PLATFORM': True}
config.git_provider = 'github'
config.publish_output = True
config.publish_output_no_suggestions = True
config.publish_output_progress = True
config.enable_v1_deprecation_banner = True
config.verbosity_level = 0
config.publish_logs = False
config.debug_mode = False
config.use_wiki_settings_file = True
config.use_repo_settings_file = True
config.use_global_settings_file = True
config.use_global_wiki_settings_file = False
config.disable_auto_feedback = False
config.ai_timeout = 300
config.response_language = 'en-US'
config.clone_repo_instead_of_fetch = True
config.always_clone = False
config.add_repo_metadata = True
config.add_repo_metadata_resolve_references = False
config.clone_repo_time_limit = 300
config.publish_inline_comments_fallback_batch_size = 5
config.publish_inline_comments_fallback_sleep_time = 2
config.max_model_tokens = 32000
config.custom_model_max_tokens = -1
config.patch_extension_skip_types = ['.md', '.txt']
config.extra_allowed_extensions = []
config.allow_dynamic_context = True
config.allow_forward_dynamic_context = True
config.max_extra_lines_before_dynamic_context = 12
config.patch_extra_lines_before = 5
config.patch_extra_lines_after = 1
config.ai_handler = 'litellm'
config.cli_mode = False
config.trial_git_org_max_invokes_per_month = 30
config.trial_ratio_close_to_limit = 0.8
config.quota_just_exceeded_message = '### Qodo reviews are paused for this user.\n\nTroubleshooting steps vary by plan [Learn more →](https://docs.qodo.ai/subscription-plans#what-you%E2%80%99ll-see-when-reviews-are-paused)\n\n\n**On a Teams plan?**\nReviews resume once this user has a paid seat *and* their Git account is linked in Qodo.\n[Link Git account →](https://docs.qodo.ai/subscription-plans#linking-a-git-account)\n\n**Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?**\nThese require an Enterprise plan - Contact us\n[Contact us →](https://docs.qodo.ai/qodo-support#support)\n'
config.invite_only_mode = False
config.enable_request_access_msg_on_new_pr = False
config.check_also_invites_field = False
config.allowed_users = []
config.disable_checkboxes = False
config.output_relevant_configurations = False
config.large_patch_policy = 'clip'
config.seed = -1
config.temperature = 0.2
config.allow_dynamic_context_ab_testing = False
config.choose_dynamic_context_ab_testing_ratio = 0.5
config.ignore_pr_title = ['^\\[Auto\\]', '^Auto']
config.ignore_pr_target_branches = []
config.ignore_pr_source_branches = []
config.ignore_pr_labels = []
config.ignore_ticket_labels = []
config.allow_only_specific_folders = []
config.ignore_pr_authors = 'REDACTED'
config.ignore_repositories = []
config.ignore_language_framework = []
config.is_auto_command = False
config.is_new_pr = False
config.enable_ai_metadata = True
config.max_tickets = 10
config.max_tickets_chars = 8000
config.extract_tickets_from_pr_title = False
config.max_tickets_from_title = 1
config.title_extraction_skip_patterns = ['^revert\\b', '^merge\\b', '^release\\b', '^backport\\b', '^bump\\b']
config.prevent_any_approval = False
config.enable_comment_approval = False
config.enable_auto_approval = False
config.auto_approve_for_low_review_effort = -1
config.auto_approve_for_no_suggestions = False
config.ensure_ticket_compliance = False
config.new_diff_format = True
config.new_diff_format_add_external_references = True
config.tasks_queue_ttl_from_dequeue_in_seconds = 1200
config.enable_custom_labels = False
config.custom_labels_discovery_prefixes = ['pr_agent:', 'qodo:']
config.command_prefix = '/q'
==================== PR_REVIEWER ====================
pr_reviewer.require_score_review = False
pr_reviewer.require_tests_review = True
pr_reviewer.require_estimate_effort_to_review = True
pr_reviewer.require_can_be_split_review = False
pr_reviewer.require_security_review = True
pr_reviewer.require_todo_scan = False
pr_reviewer.require_ticket_analysis_review = True
pr_reviewer.require_ticket_labels = False
pr_reviewer.require_no_ticket_labels = False
pr_reviewer.check_pr_additional_content = False
pr_reviewer.persistent_comment = True
pr_reviewer.extra_instructions = ''
pr_reviewer.final_update_message = True
pr_reviewer.enable_review_labels_security = True
pr_reviewer.enable_review_labels_effort = False
pr_reviewer.enable_help_text = False
pr_reviewer.enable_chat_in_code_suggestions = False
==================== PR_COMPLIANCE ====================
pr_compliance.enabled = True
pr_compliance.enable_rules_platform = True
pr_compliance.rule_providers = []
pr_compliance.rule_providers_max_rules = 300
pr_compliance.assign_skill_rules_to_skill_findings = False
pr_compliance.enable_security_section = True
pr_compliance.enable_ticket_section = True
pr_compliance.enable_codebase_duplication_section = True
pr_compliance.enable_custom_compliance_section = True
pr_compliance.require_ticket_analysis_review = True
pr_compliance.allow_repo_pr_compliance = True
pr_compliance.enable_global_pr_compliance = True
pr_compliance.local_wiki_compliance_str = ''
pr_compliance.global_wiki_pr_compliance = ''
pr_compliance.local_repo_compliance_str = ''
pr_compliance.global_repo_pr_compliance_str = ''
pr_compliance.global_compliance_str = ''
pr_compliance.enable_generic_custom_compliance_checklist = True
pr_compliance.persist_generic_custom_compliance_checklist = False
pr_compliance.display_no_compliance_only = False
pr_compliance.enable_security_compliance = True
pr_compliance.enable_update_pr_compliance_checkbox = True
pr_compliance.enable_todo_scan = False
pr_compliance.enable_ticket_labels = False
pr_compliance.enable_no_ticket_labels = False
pr_compliance.check_pr_additional_content = False
pr_compliance.enable_compliance_labels_security = True
pr_compliance.enable_user_defined_compliance_labels = True
pr_compliance.enable_estimate_effort_to_review = True
pr_compliance.max_rag_components_to_analyze = 5
pr_compliance.min_component_size = 5
pr_compliance.persistent_comment = True
pr_compliance.enable_help_text = False
pr_compliance.extra_instructions = ''
==================== PR_DESCRIPTION ====================
pr_description.publish_labels = False
pr_description.add_original_user_description = True
pr_description.generate_ai_title = False
pr_description.extra_instructions = ''
pr_description.enable_pr_type = True
pr_description.final_update_message = True
pr_description.enable_help_text = False
pr_description.enable_help_comment = False
pr_description.bring_latest_tag = False
pr_description.enable_pr_diagram = True
pr_description.pr_diagram_direction = 'LR'
pr_description.publish_description_as_comment = False
pr_description.publish_description_as_comment_persistent = True
pr_description.enable_semantic_files_types = True
pr_description.collapsible_file_list = 'adaptive'
pr_description.collapsible_file_list_threshold = 8
pr_description.inline_file_summary = False
pr_description.use_description_markers = False
pr_description.include_generated_by_header = True
pr_description.enable_large_pr_handling = True
pr_description.max_ai_calls = 4
pr_description.auto_create_ticket = False
==================== PR_AGENTIC_DESCRIPTION ====================
pr_agentic_description.enable_file_changes_section = True
pr_agentic_description.file_listing_style = 'cards'
pr_agentic_description.publish_as_comment = True
==================== PR_QUESTIONS ====================
pr_questions.aware_ai_handler = False
pr_questions.enable_help_text = False
==================== PR_CODE_SUGGESTIONS ====================
pr_code_suggestions.suggestions_depth = 'exhaustive'
pr_code_suggestions.commitable_code_suggestions = False
pr_code_suggestions.decouple_hunks = False
pr_code_suggestions.dual_publishing_score_threshold = -1
pr_code_suggestions.focus_only_on_problems = True
pr_code_suggestions.allow_thumbs_up_down = False
pr_code_suggestions.enable_suggestion_type_reuse = False
pr_code_suggestions.enable_more_suggestions_checkbox = True
pr_code_suggestions.high_level_suggestions_enabled = True
pr_code_suggestions.extra_instructions = ''
pr_code_suggestions.enable_help_text = False
pr_code_suggestions.show_extra_context = False
pr_code_suggestions.persistent_comment = True
pr_code_suggestions.max_history_len = 5
pr_code_suggestions.apply_suggestions_checkbox = True
pr_code_suggestions.enable_chat_in_code_suggestions = True
pr_code_suggestions.apply_limit_scope = True
pr_code_suggestions.suggestions_score_threshold = 0
pr_code_suggestions.new_score_mechanism = True
pr_code_suggestions.new_score_mechanism_th_high = 9
pr_code_suggestions.new_score_mechanism_th_medium = 7
pr_code_suggestions.discard_unappliable_suggestions = False
pr_code_suggestions.num_code_suggestions_per_chunk = 3
pr_code_suggestions.num_best_practice_suggestions = 2
pr_code_suggestions.max_number_of_calls = 3
pr_code_suggestions.demand_code_suggestions_self_review = False
pr_code_suggestions.code_suggestions_self_review_text = '**Author self-review**: I have reviewed the PR code suggestions, and addressed the relevant ones.'
pr_code_suggestions.approve_pr_on_self_review = False
pr_code_suggestions.fold_suggestions_on_self_review = True
pr_code_suggestions.publish_post_process_suggestion_impact = True
pr_code_suggestions.wiki_page_accepted_suggestions = True
pr_code_suggestions.simplify_response = True
==================== PR_CUSTOM_PROMPT ====================
pr_custom_prompt.prompt = 'The code suggestions should focus only on the following:\n- ...\n- ...\n...\n'
pr_custom_prompt.suggestions_score_threshold = 0
pr_custom_prompt.num_code_suggestions_per_chunk = 4
pr_custom_prompt.self_reflect_on_custom_suggestions = True
pr_custom_prompt.enable_help_text = False
==================== PR_ADD_DOCS ====================
pr_add_docs.extra_instructions = ''
pr_add_docs.docs_style = 'Sphinx'
pr_add_docs.file = ''
pr_add_docs.class_name = ''
==================== PR_UPDATE_CHANGELOG ====================
pr_update_changelog.push_changelog_changes = False
pr_update_changelog.extra_instructions = ''
pr_update_changelog.add_pr_link = True
pr_update_changelog.skip_ci_on_push = True
==================== PR_ANALYZE ====================
pr_analyze.enable_help_text = False
==================== PR_TEST ====================
pr_test.enable = True
pr_test.extra_instructions = ''
pr_test.testing_framework = ''
pr_test.num_tests = 3
pr_test.avoid_mocks = True
pr_test.file = ''
pr_test.class_name = ''
pr_test.enable_help_text = False
==================== PR_IMPROVE_COMPONENT ====================
pr_improve_component.num_code_suggestions = 4
pr_improve_component.extra_instructions = ''
pr_improve_component.file = ''
pr_improve_component.class_name = ''
==================== REVIEW_AGENT ====================
review_agent.llm_model = 'openai/openai/gpt-5.2_thinking'
review_agent.enable_database_persistence = True
review_agent.conversion_llm_model = 'openai/openai/gpt-5.2'
review_agent.enabled = True
review_agent.ensemble_models = ['openai/openai/gpt-5.2_thinking', 'openai/anthropic/claude-opus-4-6_thinking']
review_agent.publish_output = True
review_agent.enable_extended_mode = False
review_agent.enable_context_collector = False
review_agent.enable_issues_agent = True
review_agent.enable_ticket_context = True
review_agent.enable_compliance_agent = True
review_agent.enable_spec_agent = True
review_agent.enable_ui_agent = True
review_agent.enable_persona_agent = False
review_agent.persona_identifier = ''
review_agent.persona_auto_select = True
review_agent.persona_max_count = 2
review_agent.persona_portal_base_url = ''
review_agent.enable_deduplication = True
review_agent.enable_conversion_agent = True
review_agent.apply_conversion = True
review_agent.enable_precision_agent = False
review_agent.enable_cross_repo_agent = True
review_agent.enable_qodo_review_skill = False
review_agent.enable_past_bugs_collector = True
review_agent.enable_skills_agent = False
review_agent.enable_sandbox_usage = False
review_agent.sandbox_configs_repo_name = 'qodo-sandbox-configs'
review_agent.persistent_comment = True
review_agent.persistent_comment_notification = True
review_agent.enable_incremental_review = True
review_agent.enable_a2a_auto_fix = False
review_agent.enable_review_on_fix_pr = False
review_agent.rules_enabled = True
review_agent.requirements_gap_enabled = True
review_agent.llm_call_timeout = 180
review_agent.context_collector_llm_model = 'turbo'
review_agent.feedback_tool_llm_model = 'turbo'
review_agent.spec_llm_model = ''
review_agent.persona_llm_model = ''
review_agent.persona_selector_llm_model = ''
review_agent.conversion_batching_mode = 'batch'
review_agent.conversion_batch_size = 10
review_agent.cross_repo_llm_model = ''
review_agent.precision_llm_model = ''
review_agent.precision_max_llm_calls = 45
review_agent.precision_batching_mode = 'batch'
review_agent.precision_batch_size = 50
review_agent.precision_agent_vote_strategy = 'unanimous_discard'
review_agent.langsmith_project_name = 'review-agent'
review_agent.max_tokens_for_file = 'REDACTED'
review_agent.single_unified_diff_tokens_limit = 'REDACTED'
review_agent.max_llm_calls = 100
review_agent.max_llm_calls_limit = 100
review_agent.warn_when_remaining = 3
review_agent.context_collector_max_llm_calls = 6
review_agent.compliance_batch_size = 0
review_agent.past_bugs_max_results = 10
review_agent.past_bugs_llm_model = 'openai/gpt-5.4-mini'
review_agent.skills_agent_dirs = ['.qodo/skills', '.claude/skills', '.cursor/skills', '.agents/skills', 'skills']
review_agent.pass_previous_findings_to_agents = True
review_agent.deduplication_llm_max_tokens = 'REDACTED'
review_agent.publishing_action_level_rank_threshold = 0
review_agent.comments_location_policy = 'both'
review_agent.publish_inline_acknowledgment = False
review_agent.inline_comments_severity_threshold = 3
review_agent.enable_commitable_suggestions = False
review_agent.commitable_suggestions_max_lines = 5
review_agent.commitable_suggestions_max_concurrency = 5
review_agent.prefer_single_line_comments = False
review_agent.issues_user_guidelines = ''
review_agent.compliance_user_guidelines = ''
review_agent.additional_repos = []
review_agent.demand_self_review = False
review_agent.self_review_text = '**Author self-review**: I have reviewed the code review findings, and addressed the relevant ones.'
review_agent.approve_pr_on_self_review = False
==================== REVIEW_AGENT_UX ====================
review_agent_ux.finding_overflow_count = 3
review_agent_ux.resolved_overflow_count = 3
review_agent_ux.expand_description = True
review_agent_ux.expand_code = True
review_agent_ux.expand_evidence = False
review_agent_ux.expand_recommendation = True
review_agent_ux.expand_prompt = False
review_agent_ux.show_prompt = True
review_agent_ux.sub_categories_display = 'verbose'
review_agent_ux.resolved_badge_display = 'both'
review_agent_ux.display_mode = 'default'
review_agent_ux.trial_banner_style = 'pre'
review_agent_ux.trial_banner_position = 'footer'
==================== PR_HELP ====================
pr_help.force_local_db = False
pr_help.num_retrieved_snippets = 5
==================== PR_NEW_ISSUE ====================
pr_new_issue.label_to_prompt_part = {'general': 'general question', 'feature': 'feature request (may already be addressed in the documentation)', 'bug': 'possible bug report (may be a by design behavior)'}
pr_new_issue.supported_repos = ['qodo-ai/pr-agent']
==================== PR_HELP_DOCS ====================
pr_help_docs.repo_url = ''
pr_help_docs.repo_default_branch = 'main'
pr_help_docs.docs_path = 'docs'
pr_help_docs.exclude_root_readme = False
pr_help_docs.supported_doc_exts = ['.md', '.mdx', '.rst']
pr_help_docs.enable_help_text = False
==================== PR_SIMILAR_ISSUE ====================
pr_similar_issue.skip_comments = False
pr_similar_issue.force_update_dataset = False
pr_similar_issue.max_issues_to_scan = 500
pr_similar_issue.vectordb = 'pinecone'
==================== PR_FIND_SIMILAR_COMPONENT ====================
pr_find_similar_component.class_name = ''
pr_find_similar_component.file = ''
pr_find_similar_component.search_from_org = False
pr_find_similar_component.allow_fallback_less_words = True
pr_find_similar_component.number_of_keywords = 5
pr_find_similar_component.number_of_results = 5
==================== BEST_PRACTICES ====================
best_practices.auto_best_practices_str = ''
best_practices.wiki_best_practices_str = ''
best_practices.global_wiki_best_practices = ''
best_practices.local_repo_best_practices_str = ''
best_practices.global_repo_best_practices_str = ''
best_practices.global_best_practices_str = ''
best_practices.organization_name = ''
best_practices.max_lines_allowed = 2000
best_practices.enable_global_best_practices = True
best_practices.allow_repo_best_practices = True
best_practices.enabled = True
==================== AUTO_BEST_PRACTICES ====================
auto_best_practices.enable_auto_best_practices = True
auto_best_practices.utilize_auto_best_practices = True
auto_best_practices.extra_instructions = ''
auto_best_practices.min_suggestions_to_auto_best_practices = 10
auto_best_practices.number_of_days_to_update = 30
auto_best_practices.max_patterns = 5
auto_best_practices.minimal_date_to_update = '2025-01-26'
==================== JIRA ====================
jira.jira_client_id = 'REDACTED'
jira.jira_app_secret = 'REDACTED'
==================== LINEAR ====================
linear.linear_client_id = 'REDACTED'
==================== PR_TO_TICKET ====================
pr_to_ticket.default_base_url = ''
pr_to_ticket.default_project_key = 'REDACTED'
pr_to_ticket.fallback_to_git_provider_issues = True
pr_to_ticket.direct_update_compliance = False
==================== github_app ====================
github_app.bot_user = 'github-actions[bot]'
github_app.override_deployment_type = True
github_app.handle_pr_actions = ['opened', 'reopened', 'ready_for_review']
github_app.pr_commands = ['/review', '/generate_labels']
github_app.feedback_on_draft_pr = False
github_app.handle_push_trigger = False
github_app.push_commands = ['/agentic_review']
github_app.ignore_pr_title = []
github_app.ignore_bot_pr = True |
| const devconsoleIntegrationEnabled = config.spec?.hub?.params?.find( | ||
| (p) => p.name === TEKTON_HUB_INTEGRATION_KEY, | ||
| (p) => p.name === 'enable-devconsole-integration', | ||
| ); | ||
| return devconsoleIntegrationEnabled?.value?.toLowerCase() !== 'false'; |
There was a problem hiding this comment.
1. usetektonhubintegration still reads spec.hub 📎 Requirement gap ≡ Correctness
The code still contains TektonHub-specific integration logic by querying config.spec?.hub?.params for enable-devconsole-integration. This indicates a remaining functional dependency on TektonHub configuration/behavior, violating the requirement to remove all TektonHub usages from the plugin.
Agent Prompt
## Issue description
`useTektonHubIntegration()` still references TektonHub-specific configuration via `config.spec.hub.params` and the `enable-devconsole-integration` key, leaving a residual TektonHub dependency.
## Issue Context
TektonHub has been removed/deprecated; the plugin should not rely on TektonHub-related APIs, types, or configuration paths.
## Fix Focus Areas
- src/components/catalog/catalog-utils.ts[154-168]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| export const getSelectedVersionUrl = ( | ||
| item: CatalogItem, |
There was a problem hiding this comment.
2. Artifacthub url/version mismatch 🐞 Bug ≡ Correctness
getSelectedVersionUrl ignores its version argument and can return null until details populate attributes.versions, but PipelineQuickSearch passes that value into createArtifactHubTask/updateArtifactHubTask which call url.startsWith(...) and annotate the task with the provided version. This can (a) throw at runtime when the CTA is clicked before details load, and/or (b) install YAML for one version while recording a different openshift.io/sem-version value.
Agent Prompt
### Issue description
`getSelectedVersionUrl()` currently (1) returns `null` when `attributes.versions` is not present and (2) ignores the `version` parameter, returning only `attributes.selectedVersionContentUrl`. Callers then pass this potentially-null URL into `createArtifactHubTask`/`updateArtifactHubTask`, which assume a non-null string and also use the (possibly different) `selectedVersion` to set/update the semVersion annotation.
### Issue Context
This can lead to a crash when the user clicks the CTA before details fetching finishes, and it can produce mismatched “installed version” metadata if the URL reflects one version while the `version` argument reflects another.
### Fix Focus Areas
- src/components/task-quicksearch/pipeline-quicksearch-utils.ts[103-111]
- src/components/task-quicksearch/PipelineQuickSearch.tsx[112-174]
- src/components/catalog/apis/artifactHub.ts[100-167]
- src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[61-118]
- src/components/quick-search/utils/quick-search-utils.tsx[10-27]
### What to change
- Update `getSelectedVersionUrl(item, version)` to:
- Prefer `item.attributes.selectedVersionContentUrl` when it is a non-empty string.
- If absent, return `null` without depending on `attributes.versions` existing.
- Optionally (if `attributes.versions` contains URLs) select the correct URL by matching the `version` argument.
- In `PipelineQuickSearch.tsx`, guard against null/empty `selectedVersionUrl` before calling create/update; if missing, fail fast (and/or disable CTA until details are loaded).
- Ensure the version used for semVersion annotation matches the content URL’s version. If the UI allows selecting a version, make sure the selected version is actually passed through (i.e., don’t overwrite it in `handleCta`, or have `handleCta` respect `callbackProps.selectedVersion` when provided).
- In `PipelineQuickSearchDetails.tsx`, disable the CTA button for ArtifactHub items until `selectedItem.attributes.selectedVersionContentUrl` is available (details loaded).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
|
/agentic_review |
|
Code review by qodo was updated up to the latest commit 7267ec1 |
| item.provider === TaskProviders.artifactHub && | ||
| item.type !== TaskProviders.redhat | ||
| ) { | ||
| item.attributes.installed = ''; |
There was a problem hiding this comment.
1. Installed version lost 🐞 Bug ≡ Correctness
PipelineQuickSearch sets an ArtifactHub item's attributes.installed from installedTask.attributes.versions[0], but useTasksProvider can produce versions: [] while still setting attributes.installed from the openshift.io/sem-version annotation. This makes already-installed ArtifactHub tasks appear uninstalled (wrong CTA state) and can trigger unnecessary updates/installs.
Agent Prompt
### Issue description
`PipelineQuickSearch` derives `item.attributes.installed` from `installedTask.attributes.versions[0]`, but for ArtifactHub-installed tasks `useTasksProvider` may not populate `versions` (it depends on `app.kubernetes.io/version` label). This causes installed tasks to be treated as uninstalled.
### Issue Context
- `useTasksProvider` sets `attributes.installed` from the `openshift.io/sem-version` annotation for ArtifactHub tasks even when `attributes.versions` is empty.
- `createArtifactHubTask` sets the sem-version annotation but does not ensure the version label exists.
### Fix Focus Areas
- src/components/task-quicksearch/PipelineQuickSearch.tsx[112-124]
- src/components/catalog/providers/useTasksProvider.tsx[38-78]
- src/components/catalog/apis/artifactHub.ts[123-133]
### Implementation guidance
- In `PipelineQuickSearch.tsx`, when `installedTask` exists, set `item.attributes.installed` from `installedTask.attributes?.installed` (or directly from `installedTask.data.metadata.annotations[openshift.io/sem-version]`) instead of `installedTask.attributes.versions[0]`.
- Optionally harden `useTasksProvider` so ArtifactHub-installed tasks always produce `attributes.versions = [{ version: semVersion, id: semVersion }]` even when the `app.kubernetes.io/version` label is missing, to keep downstream UI logic consistent.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
No description provided.