Skip to content

fix(boost): polish AI Catalog UX and entity details - #4710

Open
rohitkrai03 wants to merge 2 commits into
redhat-developer:mainfrom
rohitkrai03:codex/ai-catalog-polish
Open

fix(boost): polish AI Catalog UX and entity details#4710
rohitkrai03 wants to merge 2 commits into
redhat-developer:mainfrom
rohitkrai03:codex/ai-catalog-polish

Conversation

@rohitkrai03

@rohitkrai03 rohitkrai03 commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Polishes the existing AI Catalog experience to align with the latest UX direction and resolve layout, responsive, metadata, and interaction issues.

What changed

  • Refined catalog browsing across grid and table views, including search, filters, pagination, mobile behavior, loading/empty/error states, and view controls.
  • Improved AI asset entity pages with clearer type-aware details, owner/provider presentation, usage guidance, model information, agent instructions and handoffs, source actions, and TechDocs.
  • Aligned OGX entities and fixtures with the supported AI asset metadata contract, and strengthened shared validation.
  • Removed obsolete paths and unused helpers while simplifying the affected components and adding focused unit/E2E coverage.
  • Added the required changesets.

Related work

Commit structure

  • 6b5465c45 — OGX provider, backend-facing contracts, shared taxonomy, fixtures, reports, and OGX/common changeset.
  • 03c3213fe — Frontend catalog/entity polish, E2E/UI tests, and Boost changeset.

Validation

  • Boost: 19 suites / 161 tests
  • Boost Common: 61 tests
  • OGX provider: 49 tests
  • Playwright E2E: 8 tests passed
  • TypeScript, lint, formatting, and full build passed

The build retains the existing node:https external-dependency warning from boost-connector-utils.

@rhdh-gh-app

rhdh-gh-app Bot commented Sep 11, 2026

Copy link
Copy Markdown

Important

This PR includes changes that affect public-facing API. Please ensure you are adding/updating documentation for new features or behavior.

Changed Packages

Package Name Package Path Changeset Bump Current Version
@red-hat-developer-hub/backstage-plugin-boost-common workspaces/boost/plugins/boost-common patch v0.4.2
@red-hat-developer-hub/backstage-plugin-boost workspaces/boost/plugins/boost minor v0.5.4
@red-hat-developer-hub/backstage-plugin-ogx-entity-provider workspaces/boost/plugins/ogx-entity-provider minor v0.5.0

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 11, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 3:05 PM UTC · Ended 3:08 PM UTC

Commit: 882d2ad · View workflow run →

@rhdh-qodo-merge

Copy link
Copy Markdown

PR Summary by Qodo

Finalize responsive AI Catalog and type-aware entity experience

✨ Enhancement 🐞 Bug fix 🧪 Tests 📝 Documentation ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

AI Description

• Polishes responsive catalog browsing, dynamic filters, URL state, and accessible loading states.
• Reorganizes entity overviews into type-aware details, instructions, inventories, and usage
 actions.
• Aligns OGX metadata contracts, fixtures, tests, generated APIs, and theme behavior.
Diagram

graph TD
  User["Catalog user"] --> Page["Catalog page"] --> Filters["URL filters"]
  Page --> Browse["Browse views"] --> Catalog["Catalog entities"]
  Provider["OGX provider"] --> Catalog --> Details["Entity cards"] --> Actions["Usage actions"]
Loading
High-Level Assessment

The chosen approach fits the bounded taxonomy: reuse Backstage UI and extension blueprints, derive presentation from canonical catalog entities, isolate security-sensitive usage resolution, and keep large inventories in focused dialogs. Retaining the obsolete Usage tab or introducing a generic renderer framework would add duplication or speculative abstraction.

Files changed (62) +3981 / -1018

Enhancement (25) +1744 / -231
AiAssetCard.module.cssRefine AI asset card metadata layout +8/-7

Refine AI asset card metadata layout

• Adds a themed border and dedicated owner/provider sizing so footer metadata aligns correctly.

workspaces/boost/plugins/boost/src/components/catalog/AiAssetCard.module.css

AiAssetCard.tsxStandardize card badges, owners, and providers +39/-35

Standardize card badges, owners, and providers

• Uses the shared type badge, links valid owners, suppresses unknown owners, and displays canonical provider metadata.

workspaces/boost/plugins/boost/src/components/catalog/AiAssetCard.tsx

AiCatalogPage.module.cssBuild the responsive catalog page surface +186/-6

Build the responsive catalog page surface

• Introduces a viewport-aware layout with sticky filters, compact composition, scrolling results, pinned pagination, and responsive skeletons.

workspaces/boost/plugins/boost/src/components/catalog/AiCatalogPage.module.css

AiCatalogPage.tsxRecompose responsive catalog browsing +156/-92

Recompose responsive catalog browsing

• Unifies page states inside the catalog surface and adds mobile filters, contextual clearing, accessible result labeling, and page repair.

workspaces/boost/plugins/boost/src/components/catalog/AiCatalogPage.tsx

AiCatalogTable.module.cssMake catalog tables horizontally responsive +10/-7

Make catalog tables horizontally responsive

• Adds a constrained horizontal viewport and stable mobile table width.

workspaces/boost/plugins/boost/src/components/catalog/AiCatalogTable.module.css

AiCatalogTable.tsxAlign table metadata and navigation +31/-16

Align table metadata and navigation

• Uses shared badges and provider extraction, reorders columns, supports compact viewports, and removes redundant row navigation.

workspaces/boost/plugins/boost/src/components/catalog/AiCatalogTable.tsx

AssetTypeBadge.module.cssStyle outlined asset type badges +22/-0

Style outlined asset type badges

• Defines the transparent, current-color border treatment for reusable type badges.

workspaces/boost/plugins/boost/src/components/catalog/AssetTypeBadge.module.css

AssetTypeBadge.tsxAdd reusable accessible asset type badge +40/-0

Add reusable accessible asset type badge

• Renders each asset category with its canonical label, color, and icon using a static BUI Badge.

workspaces/boost/plugins/boost/src/components/catalog/AssetTypeBadge.tsx

FilterDrawer.module.cssStyle the compact filter drawer +39/-0

Style the compact filter drawer

• Presents the BUI dialog as a full-height, left-aligned drawer with responsive sizing.

workspaces/boost/plugins/boost/src/components/catalog/FilterDrawer.module.css

FilterDrawer.tsxAdd mobile catalog filter drawer +71/-0

Add mobile catalog filter drawer

• Introduces a compact Filters trigger and full-height dialog that applies sidebar changes immediately.

workspaces/boost/plugins/boost/src/components/catalog/FilterDrawer.tsx

FilterSidebar.module.cssExpand and polish filter controls +15/-2

Expand and polish filter controls

• Makes the filter rail full-width with larger spacing and consistent bordered select triggers.

workspaces/boost/plugins/boost/src/components/catalog/FilterSidebar.module.css

FilterSidebar.tsxAdd explicit collision-safe All options +36/-4

Add explicit collision-safe All options

• Adds a UI-only All selection that clears filters without entering the URL while preserving reserved-looking identifiers.

workspaces/boost/plugins/boost/src/components/catalog/FilterSidebar.tsx

LoadingState.tsxDerive responsive loading skeletons +22/-10

Derive responsive loading skeletons

• Sizes filter and card placeholders from registered filters and current page size.

workspaces/boost/plugins/boost/src/components/catalog/LoadingState.tsx

AgentInstructionsCard.tsxPresent distinct agent instructions +12/-16

Present distinct agent instructions

• Replaces the former version-card implementation with an agent-only Markdown instructions card.

workspaces/boost/plugins/boost/src/components/catalog/entity/AgentInstructionsCard.tsx

AssetDetailsCard.tsxAdd consolidated AI asset details card +69/-0

Add consolidated AI asset details card

• Combines rationale, version, and type-specific metadata into one conditional overview card.

workspaces/boost/plugins/boost/src/components/catalog/entity/AssetDetailsCard.tsx

AssetTypeDetails.tsxRender details by AI asset type +376/-0

Render details by AI asset type

• Adds renderers for agents, skills, rules, MCP servers, and model servers, including references, definitions, and inventories.

workspaces/boost/plugins/boost/src/components/catalog/entity/AssetTypeDetails.tsx

AvailableModelsDialog.tsxAdd searchable available-model dialog +105/-0

Add searchable available-model dialog

• Displays model inventories in a paginated BUI table with case-insensitive search and an empty state.

workspaces/boost/plugins/boost/src/components/catalog/entity/AvailableModelsDialog.tsx

HandoffTargets.tsxResolve agent handoff references +66/-0

Resolve agent handoff references

• Loads handoff entities in one catalog request and renders resolved links with safe unresolved fallbacks.

workspaces/boost/plugins/boost/src/components/catalog/entity/HandoffTargets.tsx

UsageCard.module.cssStyle accessible usage commands +54/-0

Style accessible usage commands

• Adds responsive command blocks with themed borders, monospace wrapping, and compact mobile actions.

workspaces/boost/plugins/boost/src/components/catalog/entity/UsageCard.module.css

UsageCard.tsxAdd conditional overview Usage card +158/-0

Add conditional overview Usage card

• Renders validated commands, endpoints, downloads, or source links with accessible feedback and lifecycle-safe timers.

workspaces/boost/plugins/boost/src/components/catalog/entity/UsageCard.tsx

builtInFilterDefinitions.tsDerive dynamic type and provider facets +17/-11

Derive dynamic type and provider facets

• Builds Type options from visible entities and reads providers from the canonical source annotation.

workspaces/boost/plugins/boost/src/filters/builtInFilterDefinitions.ts

ref.tsRevise catalog browse and entity copy +34/-21

Revise catalog browse and entity copy

• Adds browse and type-specific entity labels while removing obsolete Summary and Usage-tab messages.

workspaces/boost/plugins/boost/src/translations/ref.ts

usageActions.tsIsolate secure usage action resolution +174/-0

Isolate secure usage action resolution

• Resolves type-specific actions while validating command tokens, OCI references, HTTP endpoints, and Git archive eligibility.

workspaces/boost/plugins/boost/src/utils/usageActions.ts

module.tsRead optional OGX agent versions +1/-0

Read optional OGX agent versions

• Includes the configured agent version when constructing provider input.

workspaces/boost/plugins/ogx-entity-provider/src/module.ts

OgxModelEntityProvider.tsAlign OGX model-server metadata +3/-4

Align OGX model-server metadata

• Adds an API link, omits missing owners, and removes the redundant provider label.

workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxModelEntityProvider.ts

Bug fix (5) +102 / -51
aiAssetTaxonomy.tsHarden AI asset type validation +2/-3

Harden AI asset type validation

• Requires spec.type to be a non-empty string before testing it against the shared taxonomy.

workspaces/boost/plugins/boost-common/src/aiAssetTaxonomy.ts

ErrorState.tsxFit API errors into the catalog surface +1/-1

Fit API errors into the catalog surface

• Uses dedicated error-state sizing rather than the full catalog grid layout.

workspaces/boost/plugins/boost/src/components/catalog/ErrorState.tsx

useUrlFilters.tsStrictly parse and repair catalog URL state +83/-33

Strictly parse and repair catalog URL state

• Validates URL state, repairs malformed values without adding history, preserves unrelated parameters, and stabilizes filter values.

workspaces/boost/plugins/boost/src/hooks/useUrlFilters.ts

entityHelpers.tsOmit unavailable catalog owners +7/-5

Omit unavailable catalog owners

• Returns undefined instead of a synthetic unknown owner when OGX provides no creator.

workspaces/boost/plugins/ogx-entity-provider/src/providers/entityHelpers.ts

createComponents.tsAllow long BUI entity pages to grow +9/-9

Allow long BUI entity pages to grow

• Targets BUI container pages and replaces height constraints with a viewport minimum to prevent clipped details.

workspaces/theme/plugins/theme/src/utils/createComponents.ts

Refactor (4) +127 / -224
plugin.tsxRewire AI asset overview extensions +23/-36

Rewire AI asset overview extensions

• Registers details, instructions, and Usage cards while removing obsolete summary, adoption, version, and Usage-content extensions.

workspaces/boost/plugins/boost/src/plugin.tsx

categoryMeta.tsRemove static category enumeration +0/-7

Remove static category enumeration

• Deletes the unused getAllCategories helper now that options derive from visible entities.

workspaces/boost/plugins/boost/src/utils/categoryMeta.ts

entityHelpers.tsHarden and focus shared entity helpers +99/-161

Harden and focus shared entity helpers

• Adds runtime-safe metadata accessors and moves usage-action resolution out of the general helper module.

workspaces/boost/plugins/boost/src/utils/entityHelpers.ts

OgxAgentEntityProvider.tsEmit canonical OGX agent entities +5/-20

Emit canonical OGX agent entities

• Moves models and tools into typed spec fields, omits unavailable owners, and removes duplicated legacy metadata.

workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxAgentEntityProvider.ts

Tests (22) +1393 / -392
boost.AiCatalogPage.test.tsCover filter reset and mobile drawer workflows +44/-4

Cover filter reset and mobile drawer workflows

• Updates accessible selectors and verifies All/Clear all behavior, immediate mobile filtering, drawer closure, and focus restoration.

workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts

CatalogAssetLoader.test.tsUse canonical model-server category fixture +1/-1

Use canonical model-server category fixture

• Corrects the loader test annotation to the shared model-server category value.

workspaces/boost/plugins/boost-backend/src/ai-catalog/CatalogAssetLoader.test.ts

aiAssetTaxonomy.test.tsTest malformed AI asset spec types +12/-0

Test malformed AI asset spec types

• Verifies that null, numeric, and object spec.type values are rejected safely.

workspaces/boost/plugins/boost-common/src/aiAssetTaxonomy.test.ts

AiAssetCard.test.tsxVerify static types and owner navigation +26/-3

Verify static types and owner navigation

• Covers the static type badge, linked owner styling, omitted unknown owners, and provider tags.

workspaces/boost/plugins/boost/src/components/catalog/AiAssetCard.test.tsx

AiCatalogPage.test.tsxTest out-of-range page recovery +10/-0

Test out-of-range page recovery

• Verifies that an excessive page index is repaired and the first result page renders.

workspaces/boost/plugins/boost/src/components/catalog/AiCatalogPage.test.tsx

AiCatalogTable.test.tsxAssert catalog table column order +10/-0

Assert catalog table column order

• Locks the table layout to Name, Type, Provider, Owner, and Description.

workspaces/boost/plugins/boost/src/components/catalog/AiCatalogTable.test.tsx

FilterDrawer.test.tsxTest mobile filter drawer content +54/-0

Test mobile filter drawer content

• Verifies that the trigger opens a dialog containing registered filters.

workspaces/boost/plugins/boost/src/components/catalog/FilterDrawer.test.tsx

FilterSidebar.test.tsxTest All filter semantics +37/-1

Test All filter semantics

• Covers the default All option, collision-safe reserved values, and accessible navigation labeling.

workspaces/boost/plugins/boost/src/components/catalog/FilterSidebar.test.tsx

AgentInstructionsCard.test.tsxTest dedicated Markdown agent instructions +31/-23

Test dedicated Markdown agent instructions

• Verifies Markdown rendering and suppresses instructions that duplicate the entity description.

workspaces/boost/plugins/boost/src/components/catalog/entity/AgentInstructionsCard.test.tsx

AssetDetailsCard.test.tsxCover type-aware asset details +288/-0

Cover type-aware asset details

• Exercises supported asset fields, safe remotes, model dialogs, duplicate suppression, and conditional output.

workspaces/boost/plugins/boost/src/components/catalog/entity/AssetDetailsCard.test.tsx

AvailableModelsDialog.test.tsxTest searchable model inventory pagination +44/-0

Test searchable model inventory pagination

• Verifies that large model lists stay out of the overview and can be found through dialog search.

workspaces/boost/plugins/boost/src/components/catalog/entity/AvailableModelsDialog.test.tsx

HandoffTargets.test.tsxTest resolved and missing handoff targets +101/-0

Test resolved and missing handoff targets

• Covers linked catalog targets and unlinked fallback references when resolution fails.

workspaces/boost/plugins/boost/src/components/catalog/entity/HandoffTargets.test.tsx

UsageCard.test.tsxTest entity usage actions and feedback +107/-24

Test entity usage actions and feedback

• Covers clipboard behavior, endpoints, MCP remotes, Git downloads, source fallbacks, secure opening, and empty output.

workspaces/boost/plugins/boost/src/components/catalog/entity/UsageCard.test.tsx

builtInFilterDefinitions.test.tsTest entity-derived type options +10/-4

Test entity-derived type options

• Verifies that Type filters expose only categories represented by current catalog entities.

workspaces/boost/plugins/boost/src/filters/builtInFilterDefinitions.test.ts

useUrlFilters.test.tsExpand URL-state normalization coverage +106/-5

Expand URL-state normalization coverage

• Tests stable dynamic filters, allowed page sizes, invalid state repair, query preservation, and replacement navigation.

workspaces/boost/plugins/boost/src/hooks/useUrlFilters.test.ts

categoryMeta.test.tsRemove obsolete category-list tests +1/-15

Remove obsolete category-list tests

• Drops coverage for the removed all-categories helper while preserving category metadata tests.

workspaces/boost/plugins/boost/src/utils/categoryMeta.test.ts

entityHelpers.test.tsTest hardened entity metadata accessors +138/-302

Test hardened entity metadata accessors

• Adds tests for typed fields, distinct text, deduplicated arrays, handoffs, providers, models, and remotes.

workspaces/boost/plugins/boost/src/utils/entityHelpers.test.ts

usageActions.test.tsComprehensively test usage action resolution +352/-0

Comprehensively test usage action resolution

• Covers precedence, safe commands, OCI injection rejection, protocols, Git validation, archives, and source fallbacks.

workspaces/boost/plugins/boost/src/utils/usageActions.test.ts

OgxAgentEntityProvider.test.tsTest canonical OGX agent metadata +10/-5

Test canonical OGX agent metadata

• Verifies version, typed model and tools fields, optional ownership, and removal of legacy metadata.

workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxAgentEntityProvider.test.ts

OgxModelEntityProvider.test.tsTest OGX model-server API links +4/-0

Test OGX model-server API links

• Verifies the emitted API metadata link and removal of duplicate provider labels.

workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxModelEntityProvider.test.ts

entityHelpers.test.tsTest absent OGX owners +2/-2

Test absent OGX owners

• Updates ownership expectations so missing source ownership yields no catalog owner.

workspaces/boost/plugins/ogx-entity-provider/src/providers/entityHelpers.test.ts

createComponents.test.tsTest expandable BUI entity-page layout +5/-3

Test expandable BUI entity-page layout

• Updates theme assertions for targeted BUI container pages that can grow beyond the viewport.

workspaces/theme/plugins/theme/src/utils/createComponents.test.ts

Documentation (4) +573 / -117
report.api.mdRefresh backend API report ordering +1/-1

Refresh backend API report ordering

• Regenerates the documented security-mode enum ordering without changing its values.

workspaces/boost/plugins/boost-backend/report.api.md

report.api.mdRefresh provider SDK API report +2/-2

Refresh provider SDK API report

• Regenerates schema property ordering for skill bundle metadata.

workspaces/boost/plugins/boost-entity-provider-sdk/report.api.md

report.api.mdPublish revised catalog extension API +51/-114

Publish revised catalog extension API

• Replaces obsolete entity extensions with details, instructions, and Usage cards and records the expanded translation contract.

workspaces/boost/plugins/boost/report.api.md

ai-catalog-frontend-agent-handoff.mdDocument AI Catalog implementation handoff +519/-0

Document AI Catalog implementation handoff

• Records design decisions, implementation phases, simplifications, metadata contracts, validation, and taxonomy deferrals.

workspaces/boost/specifications/ai-catalog-frontend-agent-handoff.md

Other (2) +42 / -3
app-config.yamlRegister fixture users and agent ownership +17/-1

Register fixture users and agent ownership

• Allows User entities in local catalog sources and assigns the development admin as creator of configured OGX agents.

workspaces/boost/app-config.yaml

ai-catalog-fixtures.yamlExpand representative AI catalog fixtures +25/-2

Expand representative AI catalog fixtures

• Adds the development admin and enriches agent and model-server fixtures with models, handoffs, RAG, API links, authentication, and defaults.

workspaces/boost/fixtures/ai-catalog-fixtures.yaml

@rhdh-qodo-merge

rhdh-qodo-merge Bot commented Sep 11, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (6) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Table rows no longer open assets 🐞 Bug ≡ Correctness
Description
AiCatalogTable still computes an href for every row but no longer passes rowConfig.getHref to
Table, leaving the URL connected only to the name cell. In table view, clicking the type,
provider, owner, description, or empty row space does nothing instead of navigating to the asset.
Code

workspaces/boost/plugins/boost/src/components/catalog/AiCatalogTable.tsx[R112-118]

+      <Table
+        data={rows}
+        columnConfig={columns}
+        pagination={{ type: 'none' }}
+        sort={sort}
+        className={styles.table}
+      />
Relevance

●●● Strong

The omitted row href causes a concrete navigation regression affecting multiple table interaction
targets.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Rows continue to populate href using the computed entityHref, but the rendered Table no longer
consumes that property through row configuration. The title cell receives the URL separately, while
the removed implementation supplied getHref for every row, showing why navigation now works only
through the name cell.

workspaces/boost/plugins/boost/src/components/catalog/AiCatalogTable.tsx[48-58]
workspaces/boost/plugins/boost/src/components/catalog/AiCatalogTable.tsx[70-118]
workspaces/boost/plugins/boost/src/components/catalog/AiCatalogTable.tsx[70-78]
workspaces/boost/plugins/boost/src/components/catalog/AiCatalogTable.tsx[110-118]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The table calculates a destination for every asset but no longer supplies that URL through the table's row configuration, so most of each row has lost its prior navigation behavior.

## Fix Focus Areas
- workspaces/boost/plugins/boost/src/components/catalog/AiCatalogTable.tsx[110-118]

## Recommended Fix
Restore `rowConfig={{ getHref: item => item.href }}` on `Table` alongside the existing data, column, pagination, and sort props while retaining the viewport wrapper and styling. Keep the title-cell link if desired, and add a test that activates a non-name portion of a row and verifies navigation to the entity URL.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Mobile catalog lacks accessibility scan 📘 Rule violation ☑ Accessibility
Description
The new mobile filter-drawer end-to-end test exercises the responsive dialog without running
AxeBuilder or accepting TestInfo to attach scan results. The newly introduced viewport, dialog
navigation, focus restoration, and dismissal behavior therefore complete without any WCAG-tagged
accessibility analysis or recorded violations.
Code

workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts[R218-220]

+  test('uses a mobile filter drawer on smaller screens', async ({ page }) => {
+    await page.setViewportSize({ width: 768, height: 900 });
+    await loadTwoAssetCatalog(page);
Relevance

●●● Strong

Accessibility scans are explicitly required, and recent Boost E2E feedback was accepted in this
file.

PR-#4501

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Rule 2654 requires axe-core checks with WCAG tags and attached results. The complete added mobile
scenario contains interactions and assertions but no accessibility scan or TestInfo attachment.

Rule 2654: E2E accessibility checks must use axe-core with WCAG tags and attach results to TestInfo
workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts[218-244]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new mobile catalog scenario does not perform the required axe-core accessibility scan or attach its results.

## Fix Focus Areas
- workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts[218-244]

## Recommended Fix
Accept Playwright `TestInfo`, run `@axe-core/playwright` with the required WCAG tags after opening the populated drawer, attach the JSON results, filter documented false positives, and fail on remaining violations.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Ownerless model servers fail ingestion 📘 Rule violation ≡ Correctness
Description
buildModelServerEntity conditionally spreads owner into spec after selecting the first
optional owned_by value. When the model response supplies no owner, the provider emits an
AiModelServerAPI entity without the schema-required spec.owner and catalog validation rejects
that refresh.
Code

workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxModelEntityProvider.ts[240]

+        ...(owner && { owner }),
Relevance

●●● Strong

Optional upstream ownership cannot omit the schema-required entity owner field during refresh.

PR-#3574

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Rule 2386 requires entity-provider output to conform to its registered schema. owned_by is
optional, but the changed conditional spread removes spec.owner even though the AiModelServerAPI
schema requires it.

Rule 2386: Backstage entity providers must emit standard catalog entity kinds and shapes
workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxModelEntityProvider.ts[213-240]
workspaces/ai-integrations/plugins/catalog-model-ai-model-server/src/API.v1alpha1.ai-model-server.schema.json[43-46]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
OGX model servers are emitted without the required `spec.owner` when all model records omit `owned_by`.

## Fix Focus Areas
- workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxModelEntityProvider.ts[213-240]
- workspaces/boost/plugins/ogx-entity-provider/src/providers/entityHelpers.ts[58-70]

## Recommended Fix
Provide a configured, valid catalog owner when no model has `owned_by`, and add a schema-validation test covering an ownerless model response.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View medium (4)
4. Ownerless agents fail catalog ingestion 📘 Rule violation ≡ Correctness
Description
toEntity conditionally spreads owner into spec, while mapOwner now returns undefined when
createdBy is absent. Because agent configuration permits a missing createdBy but the registered
agent schema requires spec.owner, a refresh containing such an agent reaches schema validation
with an invalid entity.
Code

workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxAgentEntityProvider.ts[150]

+        ...(owner && { owner }),
Relevance

●●● Strong

Conditional omission of required entity fields is a concrete provider schema violation.

PR-#3574

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Rule 2386 requires provider output to satisfy the registered entity shape. The provider now omits
spec.owner when createdBy is absent, although the registered AiResource agent schema marks
that field as required.

Rule 2386: Backstage entity providers must emit standard catalog entity kinds and shapes
workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxAgentEntityProvider.ts[136-152]
workspaces/boost/plugins/ogx-entity-provider/src/providers/entityHelpers.ts[58-70]
workspaces/ai-integrations/plugins/catalog-model-ai-resource-agent/src/AiResource.v1alpha1.agent.schema.json[35-38]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
OGX agents without `createdBy` are emitted without the schema-required `spec.owner` field.

## Fix Focus Areas
- workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxAgentEntityProvider.ts[136-150]
- workspaces/boost/plugins/ogx-entity-provider/src/providers/entityHelpers.ts[58-70]

## Recommended Fix
Resolve a valid catalog owner for every emitted agent, using an explicitly configured fallback when `createdBy` is absent, and add a schema-validation test for that case.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Usage links bypass access checks 📘 Rule violation ≡ Correctness
Description
usageCard registers an EntityCardBlueprint filtered only by isAiAsset, while UsageCard
derives commands, connection endpoints, and source, download, copy, or link actions from entity
metadata without checking aiCatalogAssetAccessUsageDocsPermission. Any user who can open an AI
asset with actionable metadata reaches these controls even when the resource-scoped permission
denies or conditionally restricts access, bypassing the required loading and denied-user response,
including the owner contact path, as well as the allowed-user behavior.
Code

workspaces/boost/plugins/boost/src/plugin.tsx[R125-128]

+const usageCard = EntityCardBlueprint.make({
  name: 'usage',
  params: {
-    path: '/usage',
-    title: 'Usage',
    filter: isAiAsset,
Relevance

●●● Strong

Usage actions expose sensitive metadata without the required resource-scoped permission check.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Rule 2224 requires the implementation and tests to match applicable OpenSpec scenarios, and the
archived entity-extension specification requires permission-aware Usage behavior. The permission
contract classifies usage documentation, connection endpoints, and configuration as sensitive, while
the backend returns those fields only after an explicit allow decision; however, the new card is
registered for every AI asset and renders actions returned by getUsageAction based only on entity
metadata, with no corresponding authorization branch.

Rule 2224: Match behavior to OpenSpec Given/When/Then scenarios
openspec/changes/archive/2026-09-07-ai-catalog-frontend/specs/ai-catalog-entity-extensions/spec.md[57-77]
workspaces/boost/plugins/boost/src/plugin.tsx[125-134]
workspaces/boost/plugins/boost/src/components/catalog/entity/UsageCard.tsx[120-153]
workspaces/boost/plugins/boost/src/components/catalog/entity/UsageCard.tsx[120-158]
workspaces/boost/plugins/boost-common/src/permissions.ts[370-385]
workspaces/boost/plugins/boost/src/utils/usageActions.ts[125-173]
workspaces/boost/plugins/boost-backend/src/ai-catalog/routes.ts[317-335]
workspaces/boost/plugins/boost/src/plugin.tsx[125-133]
workspaces/boost/plugins/boost/src/utils/usageActions.ts[125-170]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The replacement usage card exposes sensitive usage commands, endpoints, and source, download, copy, or link actions without enforcing the resource-scoped authorization check or implementing the permission-loading, denied, and allowed OpenSpec scenarios.

## Fix Focus Areas
- workspaces/boost/plugins/boost/src/plugin.tsx[125-134]
- workspaces/boost/plugins/boost/src/components/catalog/entity/UsageCard.tsx[120-158]

## Recommended Fix
Call `usePermission` with `aiCatalogAssetAccessUsageDocsPermission` and the current entity reference before deriving or rendering the usage action. Preserve an appropriate loading state while authorization is pending, render the denied state without exposing sensitive actions and include the owner contact path, and render copy or link actions only after permission is explicitly allowed. Add tests covering both denied and allowed users.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


6. Catalog tests ignore active locale 📘 Rule violation ⚙ Maintainability
Description
The new mobile drawer flow selects controls through literal English names such as Filters, `All
Type, Skills, and Close` rather than values loaded from the Boost translation messages. Running
the same test against a non-English locale leaves each role query looking for text that the
interface no longer renders, affecting the drawer scenario from opening through dismissal.
Code

workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts[R222-226]

+    const filterButton = page.getByRole('button', { name: 'Filters' });
+    await expect(filterButton).toBeVisible();
+    await filterButton.click();
+
+    const dialog = page.getByRole('dialog', { name: 'Filters' });
Relevance

●●● Strong

Recent Boost feedback accepted replacing hardcoded user-facing text with translations, including
catalog components.

PR-#4260
PR-#4501

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Rule 2596 prohibits hardcoded user-facing strings in end-to-end selectors. The changed test directly
embeds English labels in role queries throughout the filter and mobile drawer flows.

Rule 2596: E2E tests must use translation keys instead of hardcoded UI strings
workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts[218-243]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The changed catalog end-to-end test uses hardcoded English UI strings instead of translation keys.

## Fix Focus Areas
- workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts[174-243]

## Recommended Fix
Load the Boost English messages through the shared translation utility and replace every literal user-facing selector name in the changed flow with the corresponding translated value.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


7. Entity pages scroll unnecessarily beneath headers ✓ Resolved 🐞 Bug ≡ Correctness
Description
The new entity-main rule sets flex: '1 0 auto' and a viewport-based minimum height, preventing the
main area from shrinking within its page shell. When the global header is present, its parent is
capped below the viewport and the non-flexing plugin header is a sibling, so even short entity pages
overflow and create unnecessary scrolling.
Code

workspaces/theme/plugins/theme/src/utils/createComponents.ts[R825-828]

+              flex: '1 0 auto',
+              minHeight: `calc(100vh - 2 * ${general.pageInset})`,
+              height: 'auto',
+              maxHeight: 'none !important',
Relevance

●● Moderate

The overflow diagnosis is plausible, but historical evidence does not closely establish this
specific layout regression.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The themed sidebar page is a flex column whose desktop child mains already receive a
viewport-derived minimum and maximum height. The changed nested rule overrides that maximum and
makes the main non-shrinking, while the global-header layout caps the containing shell below the
viewport.

workspaces/theme/plugins/theme/src/utils/createComponents.ts[780-828]
workspaces/global-header/packages/app-legacy/src/components/Root/Root.tsx[76-103]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The entity-page main has a non-shrinking flex basis and a viewport-sized minimum height despite sharing a header-capped shell with a plugin-header sibling. This makes short pages exceed the available area.

## Fix Focus Areas
- workspaces/theme/plugins/theme/src/utils/createComponents.ts[822-828]

## Recommended Fix
Use a shrinkable flex value for the matching entity main and size its minimum height relative to the available shell rather than a full viewport. Retain the ability for long content to grow, but do not override the shell's height constraint with `flex-shrink: 0` plus a viewport minimum.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

8. New filter drawer avoids PatternFly 📘 Rule violation ⚙ Maintainability
Description
FilterDrawer imports its interactive Button and Dialog controls from @backstage/ui rather
than PatternFly React or an approved Red Hat design-system wrapper. This establishes the newly added
mobile filter surface on a second component system, so later styling and accessibility changes must
account for controls outside the mandated PatternFly implementation.
Code

workspaces/boost/plugins/boost/src/components/catalog/FilterDrawer.tsx[R19-22]

+  Button,
+  Dialog,
+  DialogBody,
+  DialogHeader,
Relevance

● Weak

Boost precedent accepts @backstage/ui controls for catalog cards, contradicting an absolute
PatternFly-only requirement.

PR-#3747

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Rule 2481 requires visible controls to use PatternFly or an approved Red Hat wrapper. The new
component imports and renders its button and dialog primitives directly from @backstage/ui.

Rule 2481: Use only allowed PatternFly components for frontend UI
workspaces/boost/plugins/boost/src/components/catalog/FilterDrawer.tsx[18-24]
workspaces/boost/plugins/boost/src/components/catalog/FilterDrawer.tsx[49-68]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The newly added mobile filter drawer uses Backstage UI controls instead of the required PatternFly component set.

## Fix Focus Areas
- workspaces/boost/plugins/boost/src/components/catalog/FilterDrawer.tsx[18-24]

## Recommended Fix
Replace the drawer trigger, modal, header, and body with their PatternFly React equivalents while preserving translated labels, focus restoration, responsive sizing, and existing tests.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 37 rules
✅ Cross-repo context — repo relationships
  Explored: repo: redhat-developer/rhdh (sha: 6694e009)
Review mode: 🧠 Deep: This is a high-density cross-cutting UI, URL-filter, entity-detail, provider-contract, fixture, and test change spanning 67 files and 132 independent hunks, making multiple subtle defects across independent paths likely.

Grey Divider

Tip of the day
💡 Did you know, you can switch off images and animations for a plain-text comment

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

@rhdh-qodo-merge rhdh-qodo-merge Bot added documentation Improvements or additions to documentation enhancement New feature or request Tests Bug fix labels Sep 11, 2026
@rhdh-qodo-merge

Copy link
Copy Markdown

Important

The /generate_labels command by Qodo is sunsetting on the 1st of October 2026 and will no longer be available. We recommend switching to the latest Qodo review capabilities. Learn more

@rohitkrai03
rohitkrai03 force-pushed the codex/ai-catalog-polish branch from 882d2ad to da973cd Compare September 11, 2026 15:08
@codecov

codecov Bot commented Sep 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 61.41%. Comparing base (079dd92) to head (6f0cca7).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #4710      +/-   ##
==========================================
- Coverage   61.43%   61.41%   -0.02%     
==========================================
  Files        2634     2634              
  Lines      105354   105218     -136     
  Branches    29501    29456      -45     
==========================================
- Hits        64728    64624     -104     
+ Misses      40086    40055      -31     
+ Partials      540      539       -1     
Flag Coverage Δ *Carryforward flag
adoption-insights 84.77% <ø> (ø) Carriedforward from 079dd92
ai-integrations 78.80% <ø> (ø) Carriedforward from 079dd92
app-defaults 53.07% <ø> (ø) Carriedforward from 079dd92
augment 46.67% <ø> (ø) Carriedforward from 079dd92
boost 83.69% <ø> (+0.23%) ⬆️ Carriedforward from 079dd92
bulk-import 73.12% <ø> (ø) Carriedforward from 079dd92
cost-management 13.35% <ø> (ø) Carriedforward from 079dd92
dcm 73.47% <ø> (ø) Carriedforward from 079dd92
e2e-adoption-insights 60.00% <ø> (ø) Carriedforward from 079dd92
e2e-extensions 62.31% <ø> (ø) Carriedforward from 079dd92
e2e-global-header 49.71% <ø> (ø) Carriedforward from 079dd92
e2e-homepage 61.11% <ø> (ø) Carriedforward from 079dd92
e2e-intelligent-assistant 46.09% <ø> (ø) Carriedforward from 079dd92
e2e-orchestrator 49.52% <ø> (ø) Carriedforward from 079dd92
e2e-orchestrator-plugin 49.51% <ø> (ø) Carriedforward from 079dd92
e2e-quickstart 55.21% <ø> (ø) Carriedforward from 079dd92
e2e-scorecard 50.05% <ø> (ø) Carriedforward from 079dd92
e2e-theme 16.36% <ø> (ø) Carriedforward from 079dd92
extensions 57.37% <ø> (ø) Carriedforward from 079dd92
global-floating-action-button 71.18% <ø> (ø) Carriedforward from 079dd92
global-header 67.88% <ø> (ø) Carriedforward from 079dd92
homepage 48.39% <ø> (ø) Carriedforward from 079dd92
install-dynamic-plugins 71.94% <ø> (ø) Carriedforward from 079dd92
intelligent-assistant 77.26% <ø> (ø) Carriedforward from 079dd92
konflux 91.98% <ø> (ø) Carriedforward from 079dd92
lightspeed 69.02% <ø> (ø) Carriedforward from 079dd92
mcp-integrations 84.46% <ø> (ø) Carriedforward from 079dd92
orchestrator 72.02% <ø> (ø) Carriedforward from 079dd92
quickstart 63.74% <ø> (ø) Carriedforward from 079dd92
sandbox 79.56% <ø> (ø) Carriedforward from 079dd92
scorecard 88.20% <ø> (ø) Carriedforward from 079dd92
theme 87.91% <ø> (ø)
translations 5.12% <ø> (ø) Carriedforward from 079dd92
x2a 52.32% <ø> (ø) Carriedforward from 079dd92

*This pull request uses carry forward flags. Click here to find out more.


Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 079dd92...6f0cca7. Read the comment docs.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 11, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 3:09 PM UTC · Ended 3:11 PM UTC

Commit: da973cd · View workflow run →

Keep AI asset provenance, shared taxonomy, fixtures, and provider output consistent across the OGX entity provider and backend-facing packages.
@rohitkrai03
rohitkrai03 force-pushed the codex/ai-catalog-polish branch 2 times, most recently from 14c16dc to 6f0cca7 Compare September 11, 2026 15:11
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 11, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 3:12 PM UTC · Ended 3:13 PM UTC

Commit: 14c16dc · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 11, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 3:14 PM UTC · Ended 3:17 PM UTC

Commit: 6f0cca7 · View workflow run →

@rohitkrai03
rohitkrai03 force-pushed the codex/ai-catalog-polish branch from 6f0cca7 to e78c0a9 Compare September 11, 2026 15:16
Improve responsive catalog browsing, entity details, usage guidance, source actions, accessibility coverage, and maintainability of the frontend experience.
@rohitkrai03
rohitkrai03 force-pushed the codex/ai-catalog-polish branch from e78c0a9 to 03c3213 Compare September 11, 2026 15:17
@sonarqubecloud

Copy link
Copy Markdown

@rohitkrai03 rohitkrai03 changed the title feat(boost): finalize AI catalog browse and entity UX feat(boost): deliver AI Catalog browse and entity experience Sep 11, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 11, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:19 PM UTC · Completed 3:39 PM UTC

Commit: 03c3213 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Cost: $13.25

@rohitkrai03 rohitkrai03 changed the title feat(boost): deliver AI Catalog browse and entity experience fix(boost): polish AI Catalog UX and entity details Sep 11, 2026
@gabemontero

Copy link
Copy Markdown
Contributor

hey @rohitkrai03 - took a quick peek at the minor "non-frontend" changes and they look OK to me. I'll circle back and do a cross-ref wrt archived openspecs and promoted openspec/specs contents either later today or the start of next week. I'll refrain from openspec/changes review given our upcoming reset (which I have started on btw but am not ready yet for a PR)

But wrt review of the frontend code, I'm going to defer to you processing fullsend review comments and getting review from others on the frontend/ui team

just let me know when you think that has sufficiently occurred when the time comes for you needing an owner review approval for merge

thanks

@fullsend-ai-review

Copy link
Copy Markdown

Review

Verdict: Comment — well-implemented feature delivery with several medium-severity findings around migration documentation and stale specs that are worth addressing but do not block.

This is a large, well-structured PR that delivers the AI Catalog browse and entity experience across 66 files. The code quality is high, with thorough test coverage (161 + 61 + 49 + 8 tests), careful input validation improvements (e.g., isSafeCommandToken, strict hostname matching), and good accessibility patterns (ARIA labels, keyboard navigation, mobile filter drawer). The security posture is improved over the prior code.

Findings

1. Extension ID renames need migration documentation · medium · cross-repo-contracts

Files: workspaces/boost/plugins/boost/report.api.md, workspaces/boost/plugins/boost/src/plugin.tsx

Four public extension IDs are renamed or removed:

Old ID New ID
entity-card:boost/summary entity-card:boost/ai-asset-details
entity-card:boost/adoption entity-card:boost/agent-instructions
entity-card:boost/version-list entity-card:boost/usage
entity-content:boost/usage (removed — replaced by entity-card above)

Backstage extension IDs are part of the public plugin contract. Downstream deployments referencing the old IDs in app-config.yaml (to override, disable, reorder, or configure extensions) will silently lose those customizations. The minor changeset bump is semver-legal for pre-1.0 packages (0.5.x), but the changeset description should include a BREAKING migration note with the rename mapping so consumers can update their configurations.

2. Translation key removals need migration documentation · medium · cross-repo-contracts

File: workspaces/boost/plugins/boost/src/translations/ref.ts

The public boostTranslationRef removes 14+ translation keys (the entire catalog.tab.* namespace, catalog.card.summaryTitle, catalog.card.adoptionTitle, catalog.card.versionTitle, catalog.card.versionCurrent, catalog.card.copyAriaLabel, catalog.card.adoptionDownloadZip, catalog.page.subtitle) and renames several others. Consumers providing a custom TranslationResource targeting these keys will get TypeScript compilation errors (if typed) or silently lose overrides (if untyped). The changeset should list the removed/renamed keys.

3. OGX entity shape changes alter the provider output contract · medium · cross-repo-contracts

Files: workspaces/boost/plugins/ogx-entity-provider/src/providers/OgxAgentEntityProvider.ts, OgxModelEntityProvider.ts, entityHelpers.ts

Three contract-visible changes to emitted entities:

  • ai-catalog.rhdh.com/model annotation removed → model now lives at spec.model
  • ai-catalog.rhdh.com/provider label removed from all OGX entities
  • spec.owner is now conditionally omitted (was always 'unknown' when createdBy absent)

Downstream catalog queries, permission policies, or dashboards filtering on the removed annotation/label will silently stop matching. The minor bump is semver-appropriate for 0.x, but the changeset should document the entity shape migration.

4. Multiple in-repo specification documents are stale · medium · docs-currency

Files: workspaces/boost/openspec/specs/ai-catalog-entity-extensions/spec.md, workspaces/boost/openspec/specs/ai-catalog-dynamic-plugin/spec.md, workspaces/boost/plugins/boost/README.md, workspaces/boost/specifications/boost-frontend-architecture.md, workspaces/boost/specifications/CURRENT.md, workspaces/boost/openspec/specs/ogx-entity-provider/spec.md

At least six specification/documentation files still reference old extension IDs (entity-card:boost/summary, entity-card:boost/adoption, entity-card:boost/version-list, entity-content:boost/usage), old component names (SummaryCard, AdoptionCard, VersionListCard, UsageTab), and describe the removed RBAC-gated Usage tab as current architecture. These files are marked as "source of truth" for the current release and should be updated to reflect the new extension IDs, component names, and architectural patterns.

5. RBAC-gated UsageTab replaced with ungated UsageCard · low · authorization-change

Files: workspaces/boost/plugins/boost/src/components/catalog/entity/UsageTab.tsx (deleted), UsageCard.tsx (added)

The old UsageTab gated TechDocs and external link access behind aiCatalogAssetAccessUsageDocsPermission. The new UsageCard shows fundamentally different content (usage commands, archive downloads, server endpoints) with no permission check. Since the new card's data comes from entity spec fields already visible to catalog readers, the risk is limited. However, the aiCatalogAssetAccessUsageDocsPermission export in boost-common is now dead code with no consumers. The permission removal should be noted in the changeset.

6. workspace/theme label is incorrect · low · label-mismatch

File: N/A

The PR carries the workspace/theme label but contains no theme changes. The theme fix is explicitly separated into PR #4713. This label should be removed to avoid confusing triage.

7. HandoffTargets silently swallows catalog API errors · low · error-handling

File: workspaces/boost/plugins/boost/src/components/catalog/entity/HandoffTargets.tsx

The .catch() handler maps all refs to undefined without logging or user feedback. The codebase's convention (seen in the new UsageCard) is to surface failure state to users. Consider adding a console.warn or a visual fallback indicator.

Summary

The implementation is solid — input validation is improved, test coverage is comprehensive, and the architectural refactoring (extracting usageActions.ts, consolidating entity detail cards, dynamic entity-derived filters) is well-executed. The main action item is adding migration documentation to the changesets for the extension ID renames, translation key removals, and OGX entity shape changes so downstream consumers can adapt. The stale specification documents should also be updated to match the new architecture.


Labels: PR carries workspace/theme label but theme changes are in separate PR #4713; no theme code is modified here

@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment and removed workspace/theme labels Sep 11, 2026
@logonoff
logonoff removed their request for review September 11, 2026 15:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Bug fix documentation Improvements or additions to documentation enhancement New feature or request requires-manual-review Review requires human judgment Tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants