Skip to content

OSAC-2553: Design: Catalog Items — UI Management - #128

Merged
openshift-merge-bot[bot] merged 28 commits into
osac-project:mainfrom
ElayAharoni:design/catalog-items-ui
Jul 22, 2026
Merged

openshift-merge-bot[bot] merged 28 commits into
osac-project:mainfrom
ElayAharoni:design/catalog-items-ui

Conversation

@ElayAharoni

@ElayAharoni ElayAharoni commented Jul 19, 2026 •

Copy link
Copy Markdown
Contributor

Design: Catalog Items — UI Management

EP: enhancements/catalog-items

Summary

This design adds admin management screens to osac-ui for catalog items across all three resource types (Cluster, ComputeInstance, BareMetalInstance). It introduces role-gated navigation, a FieldDefinitionsEditor component with structured validation constraints, and role-differentiated pages for Cloud Provider Admins and Tenant Admins. The design uses a single polymorphic component set for all three types via a CatalogItemKindConfig abstraction.

Requesting Review On

  • Open Question 1 — Scope visibility: How does the CSP Admin determine global vs. tenant scope when the public API strips the tenant field? The design assumes scope is derivable from API responses.
  • Open Question 2 — Template parameter enumeration: Do template GET endpoints return structured parameter definitions for the field path picker dropdown, or must admins type dot-notation paths manually?
  • Open Question 3 — Resource filtering by catalog item: Can resource list endpoints be filtered by this.spec.catalog_item == "<id>" for the detail page's "Provisioned Resources" tab?
  • Validation constraint tightening direction: The Tenant Admin restriction flow enforces that validation constraints can only be tightened (min increases, max decreases, enum values only removed). Review whether the proposed enforcement mechanism (input min/max attributes, checkbox-only enum removal) is sufficient.
  • NFR-UI-3 assumption: The design assumes the existing CatalogProvisionWizard already handles catalog item field definitions (pre-set as read-only, editable as form inputs). This needs verification.

How to Review

  • Comment inline on specific sections
  • Approve when the design accurately reflects a viable implementation approach

Summary by CodeRabbit

  • Documentation
    • Added a new design document for administering catalog items across Cluster, ComputeInstance, and BareMetalInstance.
    • Specified role-gated admin navigation with an admin route guard and an Administration → Catalog Management area (list, create, edit, detail) with kebab actions controlled by role/scope.
    • Defined create/edit payload and PATCH update_mask semantics, including publish/unpublish behavior.
    • Documented Field Definitions and Validation Constraints editors (Basic vs Advanced behavior, tighten-only rules) plus E2E/unit/component test expectations.

@coderabbitai

coderabbitai Bot commented Jul 19, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a design proposal for administering Cluster, ComputeInstance, and BareMetalInstance catalog items through role-gated admin pages, shared kind-aware API hooks, reusable field and validation editors, and documented security, testing, and operational requirements.

Changes

Catalog Items UI Management

Layer / File(s) Summary
Scope and role workflows
enhancements/catalog-items/ui-design.md
Defines supported catalog item kinds, provider-admin and tenant-admin workflows, feature boundaries, and private versus public API usage.
Navigation, API hooks, and list management
enhancements/catalog-items/ui-design.md
Specifies guarded administration routes, kind mapping, aggregated API hooks, list filtering, scope display, and role-specific actions.
Create, edit, and detail editors
enhancements/catalog-items/ui-design.md
Describes page behavior and reusable FieldDefinitionsEditor and ValidationConstraintsEditor components, including tenant restrictions and structured validation rules.
Security, testing, and operations
enhancements/catalog-items/ui-design.md
Documents authorization boundaries, failure handling, test coverage, graduation criteria, and upgrade, version-skew, infrastructure, and support procedures.

Estimated code review effort: 2 (Simple) | ~15 minutes

Possibly related PRs

Suggested reviewers: batzionb, avishayt

🚥 Pre-merge checks | ✅ 11
✅ Passed checks (11 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
No-Hardcoded-Secrets ✅ Passed The PR is a design-doc-only change; scans found no hardcoded secrets, credentials, embedded creds, or private key material in the added file.
No-Weak-Crypto ✅ Passed Only a design-doc changed; no MD5/SHA1/DES/RC4/3DES/Blowfish/ECB, custom crypto, or secret comparisons were introduced.
No-Injection-Vectors ✅ Passed Only a markdown design doc changed; scans found no SQL/shell/eval/pickle/yaml/os.system/dangerouslySetInnerHTML injection vectors.
Container-Privileges ✅ Passed PR only changes a Markdown design doc; no container/K8s manifests or privilege settings (privileged, hostPID, hostNetwork, hostIPC, allowPrivilegeEscalation) are present.
No-Sensitive-Data-In-Logs ✅ Passed No logging of passwords/tokens/PII is added; the doc only logs status codes/request IDs and says response bodies are redacted.
Ai-Attribution ✅ Passed PR commits use Assisted-by: Claude Code trailers, and no AI Co-Authored-By trailers appear in the PR range.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the new design document for Catalog Items UI Management.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 6/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Exceptionally detailed implementation: names files, shows TypeScript interfaces and Yup schemas, specifies component hierarchy, provides code snippets for navigation and type abstraction. All CRUD lifecycle operations are covered with concrete error handling (failure mode table with specific error codes like Z0003). Risks are specific (Formik FieldArray stale values, parallel API call latency) with concrete mitigations. Open questions are well-framed with owners and impact. Drawbacks section ste
Testability 1/2 E2E test plan is strong with 10 specific Cypress scenarios covering role gating, CRUD flows, type filtering, and tenant admin restrictions. Component-level testing mentions FieldDefinitionsEditor and ValidationConstraintsEditor scenarios. However, no unit test strategy is described (e.g., for Yup validation schemas, CatalogItemKindConfig mapping, FieldMask construction in the update hook). Integration tests are absent. Graduation criteria are implementation completion conditions ('all four page
Scope 1/2 Summary is concise and clear. Non-goals are specific (drag-and-drop, full JSON Schema editor, private API access). Alternatives section is excellent with 4 real approaches and clear rationale. All relevant personas are covered in workflow descriptions (Cloud Provider Admin, Tenant Admin, Tenant User). However, the design is missing a formal User Stories subsection with 'As a [role], I want...' format stories — the template requires this section. Goals mix user-visible outcomes with implementatio
Architecture 2/2 Sound UI architecture that correctly consumes existing fulfillment-service APIs without introducing new API extensions. The CatalogItemKindConfig polymorphic abstraction is well-designed and avoids code triplication. Role-gated navigation pattern is clearly described with concrete code showing the navRowsForRole() extension and AdminRoute guard. Security model correctly identifies the server as the enforcement boundary with UI as a convenience layer. RBAC/tenancy section properly describes all t

Verdict: A strong UI-focused design with excellent implementation detail and architecture, held back slightly by missing formal user stories and an incomplete test strategy that lacks unit test coverage.

Feedback: Add a User Stories subsection under Motivation with formal 'As a [role], I want to [action] so that I can [goal]' stories for each persona workflow — the detailed workflows are already there, they just need the structured format the template requires. Strengthen the test plan by adding a unit test section covering Yup validation schemas, CatalogItemKindConfig mapping logic, and FieldMask construction in the update hook; remove the 'if adopted' hedge on component-level testing. Address the Documentation dimension explicitly, even if just to defer it (e.g., 'Admin documentation for catalog management deferred to docs follow-up task').

Critical (0)

None.

Important (5)

  1. Missing User Stories subsection: The template requires a '### User Stories' section with formal 'As a [role], I want to [action] so that I can [goal]' format. The Workflow Description covers the same content in detail but doesn't satisfy the template's structural requirement. Add stories for Cloud Provider Admin (create/manage global catalog items), Tenant Admin (restrict global items for their org), and Tenant User (no change, but worth stating explicitly).
  2. Goals are implementation-focused: Two of four goals are implementation strategies ('Reuse existing osac-ui patterns', 'Use a single polymorphic component set') rather than user-visible outcomes. Reframe as user-observable results, e.g., 'Enable Cloud Provider Admins and Tenant Admins to manage catalog items through the web console' and 'Provide a consistent management experience across all three catalog item types'.
  3. Test plan lacks unit test strategy: No unit tests are described for Yup validation schemas (e.g., path regex, conditional default requirement), CatalogItemKindConfig mapping, FieldMask construction in useUpdateCatalogItem, or the scope display heuristic. These are non-trivial logic paths that should be unit tested.
  4. Documentation dimension not addressed: The osac-dimensions.md cross-cutting dimension for Documentation is neither covered nor explicitly deferred. State whether admin documentation for catalog management is in scope or deferred.
  5. Component-level testing hedged with 'if adopted': The phrase 'Component-level testing (if adopted)' suggests uncertainty about whether these tests will be written. This weakens the test plan — commit to component tests for the FieldDefinitionsEditor and ValidationConstraintsEditor, which are the most complex new components.

Suggestions (3)

  1. Graduation criteria would be stronger as measurable conditions: e.g., 'All 10 E2E scenarios pass in CI', 'No regressions in existing Cypress test suite', 'Field definitions editor handles 20+ field definitions without render performance degradation'.
  2. Consider noting accessibility requirements for the admin pages — PatternFly components provide baseline accessibility, but the custom FieldDefinitionsEditor (FieldArray with dynamic inputs, move-up/move-down reordering) may need explicit keyboard navigation and ARIA label attention.
  3. The scope display heuristic in section 4 relies on assumptions about API response content. Consider documenting a concrete fallback if Open Question 1 is resolved negatively (e.g., hide the Scope column entirely for CSP Admin until a backend change lands, rather than showing incorrect scope).

Review cost

Model: claude-opus-4-6
Cost: $0.6579
Tokens: 5.3k in / 4.1k out
Cache: 168.5k read
Active time: 1m 38s
API calls: 0

@github-actions github-actions Bot added the rfe-creator-auto-reviewed EP was reviewed by AI label Jul 19, 2026
@ElayAharoni
ElayAharoni marked this pull request as ready for review July 19, 2026 09:26

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@enhancements/catalog-items/ui-design.md`:
- Around line 541-545: Update the “Failure detection” support procedure to
prohibit logging full API response bodies. In the Go proxy API failure logging,
retain status codes but log the request ID and a sanitized error code instead,
with response bodies redacted by default.
- Around line 196-205: The useAllCatalogItems hook currently loads every catalog
item from all three endpoints without bounds. Update useAllCatalogItems and the
underlying per-kind queries to use pagination or bounded infinite queries with
server-side search and status filters, while preserving the unified
CatalogItemWithKind results and kind discriminator.
- Around line 336-337: The path validation regex in the Yup schema must reject
empty segments and trailing dots while preserving valid dot-notation paths.
Update the path rule to validate each segment independently, or reuse the
server’s canonical path validator, so values like “a..b” and “a.” fail
client-side validation.
- Around line 149-151: Update the AdminRoute guard to allow access only for
providerAdmin and tenantAdmin roles. Redirect tenantUser and any other
authenticated or unexpected roles to /catalog, and explicitly handle
unauthenticated users according to the existing authentication flow before
rendering admin pages.
- Around line 42-43: Align the catalog UI design with the tenancy contract: at
enhancements/catalog-items/ui-design.md lines 42-43, remove the blanket
private-API prohibition; at lines 97-104, route CRUD through role-appropriate
private or public endpoints; at lines 243-246, replace heuristic scope detection
with an explicit authoritative scope field or API; and at lines 404-409,
document provider-admin/private-API versus tenant-admin/public-API authorization
boundaries.
- Around line 270-280: Update the create payload documentation near the payload
construction to include the selected provider-admin scope as an explicit tenant
field. Ensure tenant-scoped submissions send the selected tenant identifier and
Global selections use the API’s designated global representation, preserving the
existing POST endpoint behavior.
- Around line 294-296: Clarify the PATCH contract for the repeated
field_definitions field in the form submission description: specify whether
updates replace the entire list or support item-level changes, including reorder
and removal behavior. Ensure the documented update_mask semantics match that
choice rather than implying diff-based field updates cover all list edits.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 502dab04-52c8-4903-8041-8ff813910a5b

📥 Commits

Reviewing files that changed from the base of the PR and between c251d3e and a3bb32f.

📒 Files selected for processing (1)
  • enhancements/catalog-items/ui-design.md

Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md
Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 6/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Highly specific implementation details with actual TypeScript interfaces, Yup validation schemas, component file structure, API hook signatures, and routing definitions. All lifecycle operations (create, edit, publish/unpublish, delete, list, detail) are covered with explicit failure handling table. Risks are specific and technical (FieldArray stale values after remove, scope visibility gap, template parameter enumeration), each with concrete mitigations. The drawbacks section steel-mans three s
Testability 1/2 E2E test plan lists 10 specific Cypress scenarios covering role gating, route guards, CSP Admin create flow, publish/unpublish, edit, delete (both success and blocked), Tenant Admin create and visibility restrictions, and type filtering. However, component-level testing is hedged with 'if adopted' — inadequate commitment for the FieldDefinitionsEditor and ValidationConstraintsEditor, which are the most complex new components. No unit test strategy for CatalogItemKindConfig, API hooks, or Yup val
Scope 1/2 Summary is clear and right-sized (3 sentences). Goals describe user-visible outcomes (reuse patterns, role-gated navigation, polymorphic components, tenant admin restriction flow). Non-goals are specific (drag-and-drop reordering, raw JSON Schema editor, CatalogProvisionWizard changes, private API access). Four substantive alternatives evaluated with clear rejection rationale. However, the User Stories subsection required by the template is entirely missing — the workflow descriptions cover simi
Architecture 2/2 Sound architectural decisions for a UI-only design. The polymorphic CatalogItemKindConfig pattern avoids tripling code for three resource types. Role-gated navigation via navRowsForRole() with AdminRoute guard establishes a reusable pattern. Correctly consumes existing fulfillment-service public API with no new API surface — server is the enforcement boundary for RBAC. Security considerations address XSS prevention for Markdown rendering, server-side validation as the authority, and tenant field

Verdict: A well-detailed UI design with strong architecture and feasibility, held back by a missing User Stories section required by the template, unaddressed cross-cutting dimensions, and an uncertain component-level testing commitment for the most complex new components.

Feedback: Add a User Stories subsection under Motivation with stories for Cloud Provider Admin, Tenant Admin, and Tenant User (the workflow descriptions already contain the content — just reformat). Explicitly address or defer the tenant onboarding, documentation, and installation dimensions from osac-dimensions.md. Commit to component-level tests for FieldDefinitionsEditor and ValidationConstraintsEditor — remove the 'if adopted' hedge and specify what unit tests cover (e.g., add/remove/reorder field definitions, Yup validation for non-editable fields without defaults, JSON Schema construction from structured inputs).

Critical (0)

None.

Important (3)

  1. Missing User Stories subsection: The template requires a 'User Stories' section under Motivation with 'As a [role], I want [action] so that [goal]' format. The workflow descriptions cover the same ground but the template section is absent. This matters because user stories are the primary input for test scenario derivation and reviewer alignment on scope.
  2. Component-level testing hedged with 'if adopted': The FieldDefinitionsEditor and ValidationConstraintsEditor are the most complex new components (recursive nesting, Formik FieldArray, dynamic type-aware inputs). The test plan says 'Component-level testing (if adopted)' — this should be a concrete commitment, not a conditional. Without component tests, regressions in these components will only surface in slow E2E runs.
  3. Several cross-cutting dimensions from osac-dimensions.md are unaddressed: Tenant Onboarding (how do new tenants discover catalog items?), Documentation (user-facing docs for admin screens), Installation (Go proxy configuration for catalog item API paths). These should be addressed or explicitly deferred with rationale.

Suggestions (3)

  1. The recursive ValidationConstraintsEditor for nested properties (Section 9) should specify a maximum nesting depth to prevent UI usability issues and potential performance problems with deeply nested Formik state.
  2. Consider mentioning the Cloud Infrastructure Admin persona explicitly — even if just to state it is not affected by this design — to show all personas were evaluated.
  3. The scope display heuristic for distinguishing global vs tenant-scoped items (Section 4) is described vaguely ('lightweight approach'). Consider documenting the exact field or annotation that will be checked, or marking it as blocked on Open Question 1 resolution.

Review cost

Model: claude-opus-4-6
Cost: $0.4113
Tokens: 5.3k in / 4.0k out
Cache: 213.0k read
Active time: 1m 32s
API calls: 0

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@enhancements/catalog-items/ui-design.md`:
- Around line 553-555: Make ValidationConstraintsEditor component testing
mandatory rather than conditional, and require coverage for serialization,
nested constraints, empty schemas, and resource-reference enforcement, including
its recursive schema and custom resourceRef behavior.
- Around line 362-365: Define a single wire format for validationSchema across
the editor and form/API contract, explicitly choosing the serialized
representation at the boundary. Specify how structured validation data is
serialized for create/update requests and parsed back for editing, ensuring
persisted values and submitted payloads use the same type consistently.
- Around line 375-382: Update the resourceRef constraint design in the
surrounding validation/provisioning flow to require server-side enforcement by
the fulfillment service. Define a validation and rejection path for unsupported
or violated resourceRef constraints, ensuring provisioning cannot silently
ignore resource-type restrictions while preserving the existing UI
resource-selection behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 3b3b37d2-574c-4318-a4b7-14aacb003c6e

📥 Commits

Reviewing files that changed from the base of the PR and between a3bb32f and 5a783eb.

📒 Files selected for processing (1)
  • enhancements/catalog-items/ui-design.md

Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md Outdated
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 6/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Exceptionally detailed implementation. Names exact files, provides TypeScript code samples (navigation, type abstraction, Yup schemas), specifies API routes for both private/public tiers, includes a full failure handling table with 6 failure modes and recovery paths, and 4 specific risks with concrete mitigations (e.g., Formik FieldArray stale values after remove, progressive rendering for parallel API calls). All lifecycle operations (create, edit, delete, publish/unpublish, list, detail) are c
Testability 1/2 E2E test plan is strong: 10 specific Cypress scenarios covering role gating, route guards, CSP Admin and Tenant Admin create/edit/delete/publish flows, and type filtering. However, component-level testing is qualified with 'if adopted' — a hedge, not a plan. No unit test strategy is described despite introducing complex logic: Yup validation schemas, FieldMask construction from diffs, JSON Schema assembly in ValidationConstraintsEditor, and CatalogItemKindConfig routing. Graduation criteria list
Scope 1/2 Boundaries are well-defined with 4 specific non-goals and 4 real alternatives with rejection rationale. The document correctly identifies all three relevant personas (Cloud Provider Admin, Tenant Admin, Tenant User) and scopes Cloud Infrastructure Admin out implicitly (catalog management is not infrastructure management). However, the template-required 'User Stories' subsection under Motivation is missing entirely — the workflow descriptions compensate functionally but don't follow the 'As a [ro
Architecture 2/2 Sound architectural decisions throughout. The polymorphic CatalogItemKindConfig pattern avoids tripling UI code while maintaining extensibility. The private/public API routing via Go proxy is correctly described with role-based endpoint selection. Security considerations are thoughtful — server-side enforcement as the boundary, client-side validation as convenience, sanitizing Markdown rendering against stored XSS. The RBAC/Tenancy section correctly describes the three-tier access model. Cross-r

Verdict: A thorough, implementation-ready UI design with strong architecture and feasibility, held back by a missing User Stories section and a hedged testing strategy for the most complex new components.

Feedback: Add the template-required User Stories subsection under Motivation with formal 'As a [role]...' stories for each persona workflow — the workflow descriptions are excellent but the structured format helps reviewers confirm persona coverage. Commit to a concrete component/unit test plan for FieldDefinitionsEditor and ValidationConstraintsEditor instead of qualifying it with 'if adopted' — these are the riskiest new components and need specified test scenarios (e.g., add/remove/reorder field definitions, JSON Schema construction from structured inputs, Yup validation for dot-notation paths). Address the Documentation dimension from osac-dimensions.md explicitly, even if deferred.

Critical (0)

None.

Important (4)

  1. Missing User Stories section under Motivation — the template requires a 'User Stories' subsection with 'As a [role], I want to [action] so that I can [goal]' format. The workflow descriptions in the Proposal section partially compensate but are not a substitute for the structured user stories that reviewers use to confirm persona coverage.
  2. Goals are implementation tasks, not user-visible outcomes — 'Reuse existing osac-ui patterns' and 'Use a single polymorphic component set' describe engineering approach. Reframe as user outcomes, e.g., 'Enable Cloud Provider Admins and Tenant Admins to create, edit, publish, and delete catalog items through the web console' and 'Provide a consistent catalog management experience across all three resource types (Cluster, VM, Bare Metal)'.
  3. Component and unit testing strategy is hedged — 'Component-level testing (if adopted)' signals uncertainty about testing the most complex new components (FieldDefinitionsEditor, ValidationConstraintsEditor). These components combine Formik FieldArray, dynamic type-aware inputs, recursive constraint forms, and Tenant Admin restriction logic — they need concrete test scenarios, not conditional coverage.
  4. Documentation dimension not addressed — osac-dimensions.md requires each relevant dimension to be addressed or explicitly deferred. No mention of whether user-facing documentation (admin guides, help text, UI documentation) is needed for the new catalog management pages.

Suggestions (3)

  1. Add a Terminology section defining shorthand used in the document — 'CSP Admin' appears throughout but is never formally defined as shorthand for 'Cloud Provider Admin'. Consistent with review-patterns.md feedback on inconsistent terminology.
  2. Make graduation criteria more measurable — replace 'CSP Admin and Tenant Admin workflows are tested end-to-end' with 'all 10 Cypress E2E scenarios pass' and add unit/component test coverage targets for FieldDefinitionsEditor and ValidationConstraintsEditor.
  3. Specify unit tests for the logic-heavy pieces: Yup validation schema for dot-notation paths, FieldMask construction from original-vs-modified diff, JSON Schema assembly from structured constraint inputs, and CatalogItemKindConfig API route resolution.

Review cost

Model: claude-opus-4-6
Cost: $0.7106
Tokens: 5.3k in / 5.5k out
Cache: 171.1k read
Active time: 2m 4s
API calls: 0

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 6/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Exceptionally detailed implementation: TypeScript code samples, file paths, component names, Yup validation schemas, Formik FieldArray patterns, failure handling table with 6 failure modes and recovery steps. All lifecycle operations covered (create, edit, delete, publish/unpublish, list, detail). Risks are specific (scope visibility in public API, FieldArray stale values, three parallel API calls) with concrete mitigations. Open questions are flagged with ownership. Drawbacks section steel-mans
Testability 1/2 E2E test plan lists 10 specific Cypress scenarios covering role gating, route guards, CSP Admin and Tenant Admin create flows, publish/unpublish, edit, delete (success and blocked), and type filtering. However, component-level tests are conditional ('if adopted') rather than committed — for a complex component like FieldDefinitionsEditor, this is a significant hedge. No unit test strategy is mentioned. Graduation criteria list 5 conditions but mix concrete ('role-gated navigation is working for
Scope 1/2 Non-goals are specific and well-justified (drag-and-drop reordering, JSON Schema editor, CatalogProvisionWizard changes, direct private API access). Alternatives section is strong with 4 real alternatives and detailed rejection rationale. However, the design is missing a formal User Stories section — the template requires 'As a [role], I want to [action] so that I can [goal]' format under Motivation. Workflows describe actor flows but don't substitute for user stories. Goals are implementation-f
Architecture 2/2 Sound UI architecture that properly consumes existing OSAC patterns. The Go proxy routing (private vs public API) is clearly described with role-based endpoint selection. The polymorphic CatalogItemKindConfig abstraction is well-designed to avoid tripling code. Tenant isolation is correctly delegated to the API layer with the UI providing UX-convenience disabling of actions. Security considerations are thorough: server-side enforcement boundary, XSS sanitization for Markdown rendering, JSON Sche

Verdict: A well-crafted UI design document with exceptional implementation detail and sound architectural choices, held back by a missing User Stories section and a conditional (rather than committed) component test strategy.

Feedback: Add a User Stories subsection under Motivation with formal 'As a [role], I want to [action] so that I can [goal]' stories for Cloud Provider Admin, Tenant Admin, and Tenant User — the workflow descriptions are excellent but don't replace structured user stories per the template. Commit to component-level tests for FieldDefinitionsEditor and ValidationConstraintsEditor rather than hedging with 'if adopted' — these are the most complex new components and need dedicated test coverage. Address or explicitly defer the Tenant Onboarding, Installation (Go proxy route configuration), and Documentation cross-cutting dimensions from osac-dimensions.md.

Critical (0)

None.

Important (5)

  1. Missing User Stories section: The template requires a 'User Stories' subsection under Motivation with stories in 'As a [role], I want to [action] so that I can [goal]' format. The workflows describe actor flows in detail but don't include formal user stories. All three relevant personas (Cloud Provider Admin, Tenant Admin, Tenant User) need stories.
  2. Goals are implementation-focused rather than user-visible: 'Reuse existing osac-ui patterns' and 'Use a single polymorphic component set' are implementation decisions. Reframe as user-visible outcomes, e.g., 'Enable Cloud Provider Admins to create and manage catalog items across all resource types through the web console' and 'Provide Tenant Admins a guided flow to customize global catalog items for their organization.'
  3. Component-level tests are conditional: The component test section says 'if adopted' rather than committing to test coverage for FieldDefinitionsEditor and ValidationConstraintsEditor. These are the most complex new components (Formik FieldArray with dynamic type-aware inputs, recursive nested constraint forms) and need dedicated tests.
  4. Cross-cutting dimensions not addressed: Tenant Onboarding (are catalog items auto-provisioned during tenant creation?), Installation (does the Go proxy need new route configuration?), and Documentation (user-facing docs for admin screens) are not addressed or explicitly deferred per osac-dimensions.md.
  5. Graduation criteria mix concrete and vague conditions: 'All four page types are implemented and functional' and 'Role-gated navigation is working' are not measurable. Specify observable conditions, e.g., 'All E2E test scenarios in the test plan pass' or 'CSP Admin can create, publish, edit, and delete a catalog item through the UI.'

Suggestions (3)

  1. Add a Terminology section or brief definitions for domain terms used throughout (scope badge, field definition, validation constraint, CatalogItemKind) — the review-patterns.md reference library shows successful EPs define terminology upfront.
  2. Explicitly note that Cloud Infrastructure Admin persona is not relevant to catalog management with a one-line justification, so reviewers don't flag the omission.
  3. Expand the Summary from 2 sentences to the recommended 3-5 sentences to better capture the role-gated navigation precedent and the polymorphic component approach as key design decisions.

Review cost

Model: claude-opus-4-6
Cost: $0.4467
Tokens: 5.3k in / 5.0k out
Cache: 214.1k read
Active time: 1m 50s
API calls: 0

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
enhancements/catalog-items/ui-design.md (1)

201-219: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Expose pagination state in the aggregate hook contract.

useAllCatalogItems(): UseQueryResult<CatalogItemWithKind[]> describes a flat query, but the design requires three independently paginated streams plus Load more/infinite-scroll behavior. Define an aggregate return type exposing per-kind continuation state, hasNextPage, fetch actions, and deterministic merge ordering; otherwise later pages can be omitted or duplicated.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@enhancements/catalog-items/ui-design.md` around lines 201 - 219, Update the
useAllCatalogItems contract in catalog-item-admin.ts to return an aggregate
result rather than a flat UseQueryResult. Expose independently tracked
pagination state for each CatalogItemKind, aggregate hasNextPage status,
fetch-more actions, and deterministic merged ordering so Load
more/infinite-scroll requests append each stream exactly once without omissions
or duplicates.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@enhancements/catalog-items/ui-design.md`:
- Around line 282-292: Update the create-payload documentation section around
the nested JSON code fence by adding a blank line immediately before the opening
fence and after the closing fence, without changing the payload content.
- Around line 362-368: Define an explicit, enforceable subset of JSON Schema
constraints for Tenant Admin tighten-only validation, including patterns, enums,
bounds, nested schemas, and resourceRef. Specify canonical normalization and
comparison rules for determining equality or stricter constraints, and require
the server to reject unsupported or unprovably tighter schemas rather than
accepting them. Ensure the UI and fulfillment service use the same contract.

---

Outside diff comments:
In `@enhancements/catalog-items/ui-design.md`:
- Around line 201-219: Update the useAllCatalogItems contract in
catalog-item-admin.ts to return an aggregate result rather than a flat
UseQueryResult. Expose independently tracked pagination state for each
CatalogItemKind, aggregate hasNextPage status, fetch-more actions, and
deterministic merged ordering so Load more/infinite-scroll requests append each
stream exactly once without omissions or duplicates.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 92161c3f-85f8-4527-b7fa-e4c58db7a495

📥 Commits

Reviewing files that changed from the base of the PR and between 5a783eb and e225853.

📒 Files selected for processing (1)
  • enhancements/catalog-items/ui-design.md

Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md Outdated
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 6/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Deeply detailed implementation: TypeScript code examples, file paths, Formik/Yup schemas, CatalogItemKindConfig type map, detailed failure handling table with 6 failure modes and recovery strategies, specific error codes (INVALID_ARGUMENT, PERMISSION_DENIED, Z0003). All lifecycle operations covered (create, edit, delete, publish/unpublish, list, detail). Open questions are properly flagged with owners and impact statements rather than hand-waved. Risks are specific (scope visibility, FieldArray
Testability 1/2 E2E test plan is strong with 10 specific Cypress scenarios covering role gating, route guards, CSP Admin create flow, publish/unpublish, edit, delete (success and blocked), Tenant Admin create with restrictions, Tenant Admin visibility, and type filtering. However, unit tests are completely absent — no mention of testing catalogItemKinds.ts config, API hooks, FieldMask construction logic, or Yup schema validation. Integration tests are not mentioned. Component-level testing is conditional ('if a
Scope 1/2 Boundaries are well-defined with 4 specific non-goals (drag-and-drop, JSON schema editor, wizard changes, direct private API access). Alternatives section is excellent with 4 real alternatives and clear rejection rationale. However, the template-required User Stories section is entirely missing — workflows describe persona interactions but not in 'As a [role], I want [action] so that [goal]' format, losing the user motivation dimension. Goal 1 ('Reuse existing osac-ui patterns') is an implementa
Architecture 2/2 Sound architectural decisions for a UI-only design. Polymorphic CatalogItemKindConfig abstraction avoids tripling maintenance burden. Proxy routing pattern for private/public API separation is clearly described. Tenant isolation correctly delegated to server-side enforcement with UI as convenience layer. Security considerations address XSS (sanitizing Markdown renderer), input validation (client-side for UX, server-side for enforcement), and JSON Schema treated as data not code. RBAC section pro

Verdict: A well-structured UI design with deep implementation detail and sound architecture, held back by missing user stories, incomplete test strategy (no unit/integration test plan), and gaps in cross-cutting dimension coverage (documentation, installation).

Feedback: Add a User Stories subsection under Motivation with 'As a [persona], I want to [action] so that [goal]' stories for Cloud Provider Admin, Tenant Admin, and Tenant User — the workflows describe HOW but not the user motivation WHY. Expand the test plan to include unit tests (catalogItemKinds config, FieldMask construction, Yup schema validation) and commit to component-level tests for FieldDefinitionsEditor and ValidationConstraintsEditor rather than making them conditional. Address the documentation and installation dimensions explicitly — even if deferred, state that admin guides and Go proxy configuration changes are out of scope for this design.

Critical (0)

None.

Important (4)

  1. Missing User Stories section: The template requires user stories under Motivation in 'As a [role], I want [action] so that [goal]' format. The design has detailed workflows but no user stories capturing user motivation. This affects the Scope score.
  2. Test plan omits unit and integration levels: Only E2E (Cypress) and conditional component tests are described. No unit tests for catalogItemKinds.ts, API hooks, FieldMask construction, or Yup validation schemas. No integration test strategy. Component testing is 'if adopted' rather than committed.
  3. Documentation dimension not addressed: No mention of admin guides, user documentation, or API reference updates needed for the new catalog management UI. This is a relevant cross-cutting dimension from osac-dimensions.md that should be addressed or explicitly deferred.
  4. Goal 1 is an implementation constraint, not a user-visible outcome: 'Reuse existing osac-ui patterns (ListPage, OsacForm, Formik + Yup...)' describes an implementation approach. Goals should be user-observable outcomes per the template guidelines.

Suggestions (5)

  1. Standardize persona terminology: Use 'Cloud Provider Admin' consistently (per osac-dimensions.md) instead of mixing with 'CSP Admin'. Similarly, pick one term for the Tenant Admin scope concept — 'organization-scoped', 'org-scoped', and 'tenant-scoped' are used interchangeably.
  2. Clarify Tenant Admin scope determination: Section 4 says scope is derived from 'server-authored capability metadata or the item's creators/tenants fields' — specify which mechanism is actually used. This ambiguity could cause implementation confusion.
  3. Open Question Bump actions/setup-python from 5 to 6 #1 appears partially self-answered: The Scope Display section states CSP Admin uses the private API (which returns the tenant field), but the open question asks how CSP Admin determines scope 'when the public API strips the tenant field'. Consider resolving or clarifying the remaining uncertainty.
  4. Explicitly exclude Cloud Infrastructure Admin persona: osac-dimensions.md lists 4 personas. Cloud Infrastructure Admin is not relevant for catalog item management but should be noted as N/A to show the design considered all personas.
  5. Make graduation criteria measurable: Replace implementation checklists ('all four page types implemented') with quality conditions (e.g., 'all E2E scenarios pass, no regressions in existing catalog browsing tests, field definitions editor handles all constraint types').

Review cost

Model: claude-opus-4-6
Cost: $0.4738
Tokens: 5.3k in / 5.8k out
Cache: 214.4k read
Active time: 2m 17s
API calls: 0

@ElayAharoni
ElayAharoni requested review from batzionb and rawagner July 19, 2026 14:14
Comment thread enhancements/catalog-items/ui-design.md Outdated

- Reuse existing osac-ui patterns (ListPage, OsacForm, Formik + Yup, TanStack React Query hooks, PatternFly table/kebab actions) wherever possible. [Codebase: libs/ui-components/]
- Establish a role-gated navigation pattern using the existing `navRowsForRole()` function and `useSession()` hook that future admin features can follow.
- Use a single polymorphic component set for all three catalog item types (Cluster, ComputeInstance, BareMetalInstance) rather than separate implementations per type.

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.

Even though we used this pattern for catalog item provisioning wizard, it was just a short-term solution.

Lets not do this for the new stuff.
Instead use more React-idiomatic approach using JSX composition which is easier to read and handles future per-kind divergence naturally.

So instead of one big component, lets create multiple shared ones - like common Wizard pages/Form fields where each kind-specific wizard uses these pages to build the full Wizard.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@enhancements/catalog-items/ui-design.md`:
- Line 432: Update the test plan and graduation criteria in the design document
to make fulfillment-service backend enforcement a release gate: require
implementation of the resourceRef validator or pre-validation step and an
integration test demonstrating that CLI/API provisioning rejects invalid
resource references before the feature graduates.
- Around line 67-73: Update the provider-admin flow’s template-detail population
references and row typing to use fields and types derived from the selected
resource spec, not template parameter definitions or parameter types. Keep
templates limited to supplying compatible defaults or metadata, and ensure the
design consistently preserves the resource-spec-driven field set.
- Around line 223-228: Update UseAllCatalogItemsResult and its hook
implementation to expose pagination state for each resource kind, including
per-kind hasNextPage and fetchNextPage behavior, so callers can advance only the
relevant paginated query. Alternatively, explicitly define aggregate semantics
for the existing fields and add coverage confirming no items are missed or
requests duplicated.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 0fb8e22a-9eec-4b4e-850f-4a2fea8e93f1

📥 Commits

Reviewing files that changed from the base of the PR and between e225853 and d7ea46a.

📒 Files selected for processing (1)
  • enhancements/catalog-items/ui-design.md

Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md
Comment thread enhancements/catalog-items/ui-design.md Outdated

For fields with a `resourceRef` constraint, the UI fetches available resources from the corresponding API endpoint and presents them as selectable options. `resourceRef` is an OSAC-specific custom keyword within the JSON Schema `validation_schema`; standard JSON Schema validators ignore it.

**Dependency: server-side enforcement.** The `resourceRef` keyword is only enforced by the UI dropdown today. For the feature to be safe to ship, fulfillment-service must register a custom JSON Schema keyword validator (or a dedicated pre-validation step) that resolves `resourceRef` against the actual resource type inventory during provisioning. Without this backend enforcement, resource-type restrictions set through the UI are cosmetic — they constrain the dropdown in the browser but are not enforced when users submit via CLI or API directly. The UI work can proceed in parallel, but the feature must not ship without the backend `resourceRef` validator landing first.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Make backend resourceRef enforcement a release gate.

The design correctly says the feature must not ship without fulfillment-service enforcement, but the test plan and graduation criteria do not require the validator or an integration test proving that CLI/API provisioning rejects invalid resource references. Add both before this feature can graduate.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@enhancements/catalog-items/ui-design.md` at line 432, Update the test plan
and graduation criteria in the design document to make fulfillment-service
backend enforcement a release gate: require implementation of the resourceRef
validator or pre-validation step and an integration test demonstrating that
CLI/API provisioning rejects invalid resource references before the feature
graduates.

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 8/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Exceptionally detailed implementation — names specific files, TypeScript interfaces, React components, Formik/Yup integration, route paths, and includes code snippets. All lifecycle operations covered (create, edit, publish/unpublish, delete, list, detail). Comprehensive failure handling table with 6 specific modes. Risks are specific with concrete mitigations. Open questions are honest, owned, and have impact analysis. The resourceRef backend enforcement dependency is correctly flagged as a shi
Testability 2/2 Test plan specifies concrete scenarios at three levels: 10 specific Cypress E2E scenarios (role gating, route guard, CRUD flows, tenant restrictions, type filter), 5 unit test categories (Yup schemas, FieldMask construction, JSON Schema assembly, route mapping, tighten-only comparison), and required component-level tests for FieldDefinitionsEditor and ValidationConstraintsEditor. Graduation criteria are measurable conditions with specific pass criteria.
Scope 2/2 Clear boundaries with specific non-goals (drag-and-drop, raw JSON editor, CatalogProvisionWizard changes, direct private API access — each with rationale). User stories cover all relevant personas: Cloud Provider Admin (2), Tenant Admin (2), Tenant User (1). Cloud Infrastructure Admin correctly excluded. Four real alternatives with trade-off analysis. Cross-cutting dimensions addressed: Services (BMaaS/CaaS/VMaaS), E2E Testing, Documentation, UI, Installation (in Version Skew).
Architecture 2/2 UI-only design correctly identifies that tenant isolation annotations are handled by the existing API layer. Cross-component dependencies well-identified: Go proxy routing, fulfillment-service API, resourceRef backend enforcement. Integration with existing services clearly described (private vs public API routing, template APIs, CEL filters). Terminology consistent throughout. No new CRDs or backend resources — architecture checks are appropriately scoped to UI patterns (PatternFly, React, Formi

Verdict: A thorough, well-structured UI design document (662 lines) that provides deep implementation detail, concrete test plans, and honest open questions — one of the stronger designs in the OSAC enhancement-proposals corpus.

Feedback: Two items worth tracking before implementation: (1) Open Question #1 on scope visibility in public API responses should be resolved with the API team early, since it affects the CSP Admin list page's Scope column — the design may need revision depending on the answer. (2) Consider enumerating the initial spec fields per resource type (at least top-level fields from ComputeInstanceSpec, ClusterSpec, BareMetalInstanceSpec) in the design or a linked reference to reduce implementation ambiguity — currently the specFields.ts file is mentioned but its contents are undefined. Also, the prd frontmatter references 'README.md' which is a generic filename — update to the actual PRD path in enhancement-proposals.

Critical (0)

None.

Important (2)

  1. Open Question Bump actions/setup-python from 5 to 6 #1 (scope visibility in public API responses) is a design dependency that could require revision of the CSP Admin list page. The Scope column implementation for Tenant Admin view is described as 'derives scope from server-authored capability metadata or the item's creators/tenants fields' which is uncertain. Resolve with API team before implementation begins.
  2. The resourceRef backend enforcement is correctly flagged as a ship-blocker but should be tracked as a formal cross-team dependency with a linked Jira ticket. Without it, resource-type restrictions are cosmetic (UI-only enforcement).

Suggestions (4)

  1. Enumerate the initial spec fields per resource type in the design document or a linked reference file — specFields.ts is mentioned in the file structure but its contents are undefined, leaving implementation ambiguity.
  2. The prd frontmatter field references 'README.md' — update to the actual PRD path in the catalog-items directory.
  3. Briefly address the Tenant Onboarding dimension from osac-dimensions.md — even if N/A, stating that catalog items are automatically visible to new tenants via existing API scoping would close the dimension gap.
  4. State the Cloud Infrastructure Admin persona exclusion in the User Stories or Non-Goals section rather than only in the Documentation section.

Review cost

Model: claude-opus-4-6
Cost: $0.5445
Tokens: 5.3k in / 7.8k out
Cache: 217.7k read
Active time: 2m 44s
API calls: 0

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 8/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Exceptionally detailed implementation. Names specific files, TypeScript interfaces, Formik field paths, Yup validation schemas, API hook signatures, and PatternFly component choices. All lifecycle operations (create, list, edit, detail, publish/unpublish, delete) are fully described with role-differentiated workflows. Failure handling table covers six concrete failure modes with user experience and recovery. Risks are specific (scope visibility in public API, constraint editor complexity, parall
Testability 2/2 Test plan covers three levels: E2E (10 specific Cypress scenarios including role gating, route guards, CRUD flows, tenant admin restrictions, and type filtering), unit tests (7 specific areas: Yup schemas, FieldMask construction, JSON Schema assembly, route mapping, tighten-only comparison, mode auto-detection, JSON parsing), and component-level tests (FieldDefinitionsEditor and ValidationConstraintsEditor with specific scenarios for mode switching, constraint serialization, and Formik state man
Scope 2/2 Well-bounded scope with clear boundaries. Summary is concise and explains what, why, and key capabilities. Four specific non-goals with reasons (drag-and-drop reordering, full JSON Schema editor, CatalogProvisionWizard changes, direct private API access). User stories cover all three relevant personas (Cloud Provider Admin, Tenant Admin, Tenant User) with the Cloud Infrastructure Admin correctly identified as not applicable. Four real alternatives considered with detailed rationale (wizard, raw
Architecture 2/2 Sound UI architecture following React/PatternFly patterns. JSX composition approach is well-justified over config-driven polymorphism. Role-gated navigation with AdminRoute guard follows defense-in-depth (UI hides + server enforces). Go proxy routing for private/public API separation is clearly described. No new CRDs or annotations are introduced, which is correct for a UI-only design. Cross-component dependencies identified: fulfillment-service API (already implemented), Go proxy routing, and r

Verdict: A thorough, implementation-ready UI design that covers all CRUD workflows for three resource types across three personas, with detailed component specifications, comprehensive error handling, and a concrete test strategy — the strongest areas are the FieldDefinitionsEditor specification and the four well-reasoned alternatives.

Feedback: Two open questions need resolution before implementation begins: (1) how CSP Admin derives scope from public API responses (Open Question 1 — the Tenant Admin scope derivation via 'server-authored capability metadata or creators/tenants fields' is vague and needs a concrete answer from the API team), and (2) whether CEL filter support exists for the Provisioned Resources tab (Open Question 3 — define a fallback or degrade gracefully if unsupported). Additionally, the tighten-only enforcement being UI-only in 0.2 is a security gap worth tracking — until server-side enforcement lands in 0.3, CLI/API users can bypass constraint restrictions entirely, so consider adding a Jira ticket for the 0.3 server-side work as a hard dependency.

Critical (0)

None.

Important (3)

  1. Open Question 1 (scope visibility) is unresolved and could require design revision. The CSP Admin path is clear (private API returns tenant field), but the Tenant Admin scope derivation is vague: 'server-authored capability metadata or the item's creators/tenants fields' — this needs a concrete answer from the API team before implementation.
  2. The resourceRef server-side enforcement is correctly identified as a shipping blocker (section 9), but has no tracking ticket referenced. This backend dependency should be tracked with a specific Jira ticket linked in the design to prevent the UI from shipping without backend enforcement.
  3. Tighten-only constraint enforcement is UI-only in 0.2 (section 8). CLI/API users can bypass constraint restrictions entirely until server-side enforcement lands in 0.3. The design acknowledges this but doesn't quantify the risk — consider whether this gap is acceptable for the 0.2 milestone or if it should block shipping.

Suggestions (3)

  1. Consider adding a brief accessibility (WCAG/a11y) note for the FieldDefinitionsEditor and ValidationConstraintsEditor — these are complex interactive components with nested forms, toggles, and expandable sections that may need keyboard navigation and screen reader testing.
  2. The parallel 3-query approach for useAllCatalogItems could note that when a specific type filter is selected, only one query fires instead of three — this optimization is implied but not stated.
  3. The graduation criteria conditionally includes the Provisioned Resources tab ('dependent on Open Question 3'). Consider defining a concrete fallback (e.g., hide the tab or show a message) so that the feature can graduate even if CEL filter support is delayed.

Review cost

Model: claude-opus-4-6
Cost: $0.4575
Tokens: 5.3k in / 4.8k out
Cache: 218.8k read
Active time: 1m 54s
API calls: 0

coderabbitai[bot]
coderabbitai Bot previously requested changes Jul 20, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@enhancements/catalog-items/ui-design.md`:
- Around line 397-406: Update the Advanced mode flow for tenant-derived items so
Tenant Admins cannot bypass tighten-only restrictions: either disable Advanced
editing for these items or validate the submitted schema against the base schema
before submission. Ensure empty, removed, or weakened constraints are rejected
while preserving Advanced mode for items not derived from a tenant base.
- Line 464: Update Advanced mode JSON validation to require a non-null object
root, rejecting arrays and scalar values before form submission serialization.
Preserve acceptance of empty content as no validation and keep the existing
inline error behavior for invalid input, ensuring the parsed value passed as
validationSchema is always compatible with google.protobuf.Struct.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 5ae529bc-cfb7-4c7c-b6eb-630f75ec7ad8

📥 Commits

Reviewing files that changed from the base of the PR and between d7ea46a and 1c2fb0e.

📒 Files selected for processing (1)
  • enhancements/catalog-items/ui-design.md

Comment thread enhancements/catalog-items/ui-design.md Outdated
Comment thread enhancements/catalog-items/ui-design.md Outdated
@ElayAharoni
ElayAharoni requested a review from rawagner July 20, 2026 13:57
rawagner

This comment was marked as outdated.

rawagner

This comment was marked as outdated.

@rawagner

Copy link
Copy Markdown
Contributor

This comment supersedes my two review comments above — merging them into one.

Feedback: CatalogItemForm is still too monolithic — decompose into JSX composition

Section §2 ("Catalog Item Type Abstraction — Shared Components via JSX Composition") says it uses JSX composition, but the actual example still delegates everything to a single polymorphic CatalogItemForm:

export const ClusterCatalogItemCreatePage = () => (
  <CatalogItemForm
    kind="cluster"
    apiRoute="v1/cluster_catalog_items"
    templateSelector={<TemplateSelector apiRoute="v1/cluster_templates" />}
    specFields={CLUSTER_SPEC_FIELDS}
  />
);

This is config-driven polymorphism with JSX syntax — the kind prop, specFields, and apiRoute are still driving behavior inside a single component. The form layout, Formik wiring, validation, and submission are all hidden behind CatalogItemForm.

What I expect instead: each kind-specific page explicitly composes the form structure, making Formik, sections, and per-kind differences visible at the page level. Each page also owns its data fetching — shared components like TemplateSelector receive data as props, they don't fetch it themselves:

// ClusterCatalogItemCreatePage.tsx
const ClusterCatalogItemCreatePage = () => {
  const { data: templates, isLoading } = useClusterTemplates();
  const { mutateAsync: createClusterCatalogItem } = useCreateClusterCatalogItem();

  return (
    <Formik
      initialValues={clusterCatalogItemInitialValues}
      validationSchema={clusterCatalogItemSchema}
      onSubmit={(values) => createClusterCatalogItem(buildClusterPayload(values))}
    >
      <CatalogItemGeneralFields />
      <TemplateSelector templates={templates} isLoading={isLoading} />
      <FieldDefinitionsEditor fields={CLUSTER_SPEC_FIELDS} />
    </Formik>
  );
};

// BareMetalCatalogItemCreatePage.tsx
const BareMetalCatalogItemCreatePage = () => {
  const { data: templates, isLoading } = useBareMetalInstanceTemplates();
  const { mutateAsync: createBmCatalogItem } = useCreateBareMetalCatalogItem();

  return (
    <Formik
      initialValues={bareMetalCatalogItemInitialValues}
      validationSchema={bareMetalCatalogItemSchema}
      onSubmit={(values) => createBmCatalogItem(buildBareMetalPayload(values))}
    >
      <CatalogItemGeneralFields />
      <TemplateSelector templates={templates} isLoading={isLoading} />
      <FieldDefinitionsEditor fields={BARE_METAL_SPEC_FIELDS} />
      <BareMetalSpecificSection />
    </Formik>
  );
};

The shared building blocks (CatalogItemGeneralFields, TemplateSelector, FieldDefinitionsEditor) are the same — but Formik wiring, initial values, validation schema, submission, data fetching, and per-kind sections are composed explicitly at the page level, not hidden inside a CatalogItemForm abstraction.

Why this matters:

  • Each page reads top-to-bottom — you see the form structure without jumping into CatalogItemForm
  • Per-kind differences (extra sections, different validation, different submission) are natural JSX additions, not config flags
  • No kind prop threading through a shared component to switch behavior
  • Data fetching lives in the page, shared components are pure presentation
  • Matches the pattern we agreed on previously

Action: remove CatalogItemForm from the shared components list and update the kind-specific page examples to show explicit Formik + section composition. The shared section components stay — it's the wrapping form component that should go.

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 8/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Exceptionally detailed implementation — TypeScript code examples, Yup validation schemas, component hierarchy, file structure, API hook interfaces. All CRUD lifecycle operations covered with specific error handling (failure modes table). The hardest components (FieldDefinitionsEditor, ValidationConstraintsEditor, tighten-only enforcement) receive thorough treatment with constraint comparison rules enumerated. Risks are specific (scope visibility, parallel API calls, constraint editor complexity)
Testability 2/2 Test plan covers three levels: E2E (10 specific Cypress scenarios including role gating, route guard, CSP/Tenant Admin create flows, publish/unpublish, edit, delete blocked), unit tests (7 areas: Yup schemas, FieldMask construction, JSON Schema assembly, route mapping, tighten-only comparison, mode auto-detection, JSON parsing), and component-level tests (FieldDefinitionsEditor state management, ValidationConstraintsEditor mode switching). Graduation criteria are measurable conditions tied to sp
Scope 2/2 Clear boundaries with 3-sentence summary, 5 user stories covering 3 relevant personas (CSP Admin, Tenant Admin, Tenant User). Cloud Infrastructure Admin correctly excluded. 4 specific non-goals (drag-and-drop, full JSON Schema editor, CatalogProvisionWizard changes, direct private API access). 4 real alternatives with trade-off analysis (wizard, raw JSON, config-driven component, modal). Cross-cutting dimensions addressed or correctly identified as N/A.
Architecture 2/2 UI-only design correctly defers tenant isolation and RBAC to the server. JSX composition pattern is React-idiomatic, avoiding config-driven monolith. Private/public API split through Go proxy is well-described. No new CRDs or controllers needed; the design explains why. Component routing clear with CatalogItemKind type and route mapping. Dependencies identified (fulfillment-service API, Go proxy). Consistent terminology throughout.

Verdict: A strong, implementation-ready UI design document with exceptional detail across all criteria — specific component architecture, thorough lifecycle coverage, concrete test scenarios, and clear scope boundaries with real alternatives analyzed.

Feedback: Resolve Open Question 1 (scope visibility in public API) before implementation begins — the CSP Admin list page's Scope column depends on this and could require architectural changes to the Go proxy if scope isn't derivable from public responses. Consider elevating the tighten-only UI-only enforcement (deferred server-side to 0.3) into the Risks table, since a Tenant Admin could bypass restrictions via direct API calls — this is a security-relevant gap worth highlighting for reviewers. Goal #4 about JSX composition is implementation-focused rather than user-visible; reframe as an outcome like 'Ensure consistent behavior across all three resource types.'

Critical (0)

None.

Important (2)

  1. Open Question 1 (scope visibility in public API responses) is a blocking dependency for the CSP Admin list page Scope column — if scope is not derivable from existing fields, the Go proxy or API needs changes before the UI can be implemented as designed. This should be resolved before implementation begins to avoid rework.
  2. Tighten-only constraint enforcement is UI-only in 0.2 (section 8), with server-side deferred to 0.3. A Tenant Admin who uses the API directly (curl/grpcurl) can bypass the tighten-only restriction and create catalog items with loosened constraints. This security-relevant gap is mentioned in the implementation details but should also appear in the Risks and Mitigations table with explicit acknowledgment of the exposure window.

Suggestions (3)

  1. Goal Create bare metal fulfillment proposal #4 ('Reuse existing osac-ui patterns and share common UI components across all three catalog item types using JSX composition') is implementation-focused. Reframe as a user-visible outcome like 'Ensure consistent management experience across all three resource types.'
  2. Explicitly mention Cloud Infrastructure Admin persona in the User Stories section as not applicable, rather than only in the Documentation section near the end — reviewers checking persona coverage will look there first.
  3. Consider adding an accessibility note for the FieldDefinitionsEditor and ValidationConstraintsEditor — these are complex interactive components with dynamic forms, expandable sections, and nested inputs that may need ARIA attributes for screen reader support.

Review cost

Model: claude-opus-4-6
Cost: $0.7068
Tokens: 5.3k in / 4.9k out
Cache: 175.9k read
Active time: 1m 46s
API calls: 0

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 8/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Exceptionally detailed implementation — names specific files, TypeScript interfaces, Formik/Yup schemas, PatternFly components, routes, and API payload shapes with code examples. All CRUD lifecycle operations are covered (create, list, detail, edit, delete, publish/unpublish). Error handling is described in a concrete failure mode table with specific error codes (INVALID_ARGUMENT, Z0003, PERMISSION_DENIED). Risks identify real concerns (scope visibility in public API, per-kind divergence, parall
Testability 2/2 Test plan covers three levels: E2E tests with 12+ specific scenarios (role gating, route guard, create/edit/delete flows, scope behavior per role, tab switching), unit tests for Yup schemas/FieldMask construction/JSON Schema assembly/route mapping/scope logic/network attachments auto-inclusion, and component-level tests for per-kind steps and field definition primitives. Graduation criteria are concrete and measurable (all page types functional, all E2E/unit/component tests passing, admin user g
Scope 2/2 Clear boundaries — UI-only design consuming existing API endpoints with no backend changes. Non-goals are specific (drag-and-drop reordering, full JSON Schema editor, CatalogProvisionWizard changes, direct private API access). Five real alternatives are discussed with rationale for rejection. PRD is referenced via frontmatter (though pointing to README.md rather than prd.md). Relevant cross-cutting dimensions (networking, documentation, E2E testing, UI) are addressed; irrelevant dimensions (inve
Architecture 2/2 Follows osac-ui patterns throughout — JSX composition over config-driven monolith, Formik+Yup validation, PatternFly Wizard/Gallery/Cards, typed React Query hooks, role-gated navigation via AdminRoute guard. The Go proxy routing for private vs public API is correctly described with role-based endpoint selection. Tenant isolation is handled at the API layer (no new annotations needed for a UI-only design). Component reuse strategy (shared field definition primitives composed into per-kind step co

Verdict: A thorough, well-structured UI design document (830 lines) with deep implementation detail, comprehensive test coverage, and clear scope boundaries — one of the stronger designs in the reference library calibration range.

Feedback: Two items to clean up before merge: (1) The prd: frontmatter references README.md rather than a conventional prd.md file — clarify whether this is intentional or should point to the actual PRD document. (2) The Motivation section contains user stories (Cloud Provider Admin, Tenant Admin, Tenant User) which belong in the PRD per OSAC review conventions — consider removing them from the design or cross-referencing the PRD instead. Minor: the Summary is a single (long) sentence; the rubric recommends 3-5 sentences covering what's added, why it's valuable, and key capabilities.

Critical (0)

None.

Important (3)

  1. prd: frontmatter field references 'README.md' instead of the conventional 'prd.md' — unclear whether this is the correct PRD reference or a placeholder
  2. User stories appear in the Motivation section (lines 42-47 of the design). Per OSAC review conventions (review-patterns.md), user stories belong in the PRD, not the design document. The design should reference the PRD for persona coverage rather than restating user stories.
  3. Open Question Bump actions/setup-python from 5 to 6 #1 (scope visibility in public API responses) is a real dependency that could require a backend change. If the public API cannot expose scope information, the Tenant Admin list page cannot display scope badges — a core UI element described throughout the design. This should be resolved before implementation begins.

Suggestions (3)

  1. Summary is a single sentence — consider expanding to 3-5 sentences covering what's added, why it's valuable, and key capabilities for easier scanning.
  2. The directory path 'enhancements/catalog-items/ui-design.md' does not follow the OSAC convention of 'enhancements/-/design.md' — no Jira key prefix and uses 'ui-design.md' instead of 'design.md'.
  3. Consider adding a brief Terminology section defining 'field definition', 'scope level', 'field definition primitive', and 'step component' — these domain terms are used heavily and a Terminology section is cited as a best practice in the EP reference library (networking EP).

Review cost

Model: claude-opus-4-6
Cost: $0.8013
Tokens: 9 in / 4.9k out
Cache: 405.8k read
Active time: 2m 2s
API calls: 0

Default values for pod_cidr, service_cidr, ssh_public_key, and
pull_secret come only from the template or admin input — the UI
only pre-populates validation schemas when the template does not
provide them.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Elay Aharoni <elayaha@gmail.com>
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-128

Score: 8/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Exceptionally detailed implementation — names specific file paths, TypeScript interfaces, Formik state shapes, Yup validation schemas, JSON Schema output, and API payloads. All lifecycle operations (create, edit, publish/unpublish, delete) are fully described with error handling. Failure handling table covers six modes with specific error codes (INVALID_ARGUMENT, Z0003), user experience, and recovery. Risks are specific ('Scope not visible in public API responses', 'Three parallel API calls for
Testability 2/2 Three-level test strategy with concrete scenarios: 13 E2E tests covering role gating, route guards, CRUD flows, scope handling, and cross-role visibility; unit tests for Yup schemas, FieldMask construction, JSON Schema assembly, scope selector, and network attachments auto-inclusion; component-level tests for per-kind step rendering, field definition primitives, NodeSetsFieldEditor, and unsupported schema handling. Graduation criteria are measurable conditions: all four page types functional for
Scope 2/2 Clear boundaries — tightly scoped to admin management UI for existing catalog item API. Non-goals are specific and well-justified (no drag-and-drop reordering, no full JSON Schema editor, no changes to CatalogProvisionWizard, no direct private API access). Five real alternatives with rationale (full-page form, raw JSON editor, config-driven component, reuse CatalogPage, modal). PRD referenced via frontmatter (prd: 'README.md') though unconventionally named. Relevant cross-cutting dimensions from
Architecture 2/2 Follows OSAC UI patterns — Go proxy routing (private API for CSP Admin, public API for Tenant Admin/User), PatternFly 6 components (Gallery, Wizard, Tabs, Switch), Formik+Yup form management. Component architecture uses JSX composition over config-driven polymorphism, matching existing osac-ui patterns. Role-gated navigation via navRowsForRole() establishes a clean precedent for future admin features. AdminRoute guard handles authorization with redirect. Dependencies clearly identified (osac-ui

Verdict: A thorough, well-structured UI design document with exceptional implementation detail — specific file paths, component hierarchies, TypeScript interfaces, validation schemas, and error handling for all six failure modes — covering all lifecycle operations across three resource types with concrete test plans at three levels.

Feedback: Two structural improvements: the PRD frontmatter reference points to 'README.md' instead of the OSAC-conventional 'prd.md', and user stories appear in the design's Motivation section when they should live in the PRD per OSAC conventions (the design should reference the PRD for persona coverage). Consider making the run_strategy enum casing consistent — VM uses 'Always'/'Halted' while Bare Metal uses 'ALWAYS'/'HALTED', which may reflect actual API values but should be verified and documented if intentional.

Critical (0)

None.

Important (3)

  1. PRD frontmatter field references 'README.md' instead of 'prd.md' — breaks OSAC file path conventions (expected: enhancements//prd.md). If README.md is the actual PRD, rename it to prd.md for consistency.
  2. User stories are included in the design's Motivation section (lines 42-46 of the design). Per OSAC conventions and the review rubric, user stories and persona coverage belong in the PRD, not the design. The design should reference the PRD for these and keep Motivation focused on the technical gap being addressed.
  3. Two open questions remain unresolved: (1) scope visibility in public API responses — Tenant Admin may not be able to distinguish general vs. organization-scoped items without a backend change; (2) CEL filter support for querying provisioned resources by catalog_item reference — without this, the detail page's Provisioned Resources tab cannot be implemented efficiently. Both have owners and impact analysis, which is appropriate, but they represent potential blockers for full feature delivery.

Suggestions (3)

  1. VM run_strategy enum uses 'Always'/'Halted' while Bare Metal uses 'ALWAYS'/'HALTED' — verify this matches the actual API enum values and document the casing difference if intentional to avoid implementation confusion.
  2. The unsupported JSON Schema handling (section 9) gracefully falls back to a read-only CLI message — consider documenting the exact set of supported JSON Schema keywords (pattern, minimum, maximum) in the admin user guide so CLI-using admins know which constraints will be editable in the UI.
  3. The list page fires three parallel queries (one per kind) but only the active tab's query is enabled. Consider mentioning prefetch strategy — whether inactive tabs should prefetch on hover or mount to improve perceived tab-switch performance.

Review cost

Model: claude-opus-4-6
Cost: $0.6963
Tokens: 6 in / 5.2k out
Cache: 182.5k read
Active time: 2m 4s
API calls: 0

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Elay Aharoni <elayaha@gmail.com>
@openshift-ci openshift-ci Bot removed the lgtm label Jul 22, 2026
@github-actions

Copy link
Copy Markdown

AI EP Review: EP-128

Score: 10/10 | Verdict: PASS

Criterion Score Notes
What 2/2 Clear user-facing need with 5 user stories covering 3 personas (Cloud Provider Admin, Tenant Admin, Tenant User). Detailed per-persona workflows describe exactly what each role can see and do. Affected services (CaaS, VMaaS, BMaaS) are covered through the three catalog item types. Each affected persona has concrete user stories grouped under persona context.
Why 2/2 Concrete justification: the catalog items API is fully implemented but there is no admin UI, so admins cannot create, edit, publish, or delete catalog items through the console. Additionally, osac-ui has never implemented role-gated navigation. Both gaps are clearly stated with specific consequences — the catalog items feature is not usable end-to-end without this UI.
How 2/2 Extremely specific and measurable approach. Component architecture with file paths, TypeScript interfaces, code examples, Yup/JSON Schema validation, wizard step specifications, API hooks, routing patterns, RBAC behavior per role, failure handling table, and a comprehensive test plan with specific E2E, unit, and component-level test scenarios. As a design document (not a PRD), this level of implementation detail is expected and well-executed.
Task 2/2 Genuine product feature enhancement: admin management screens for catalog items (list, create wizard, edit wizard, detail page) across three resource types, plus the first role-gated navigation in osac-ui. This is a new platform capability, not a task, bug, or documentation-only change.
Size 2/2 Well-scoped to one coherent feature. The four page types (list, create, edit, detail) and three resource types are tightly coupled — a create wizard without a list page is incomplete, and catalog management requires role-gated navigation. Non-goals are clearly stated (no drag-and-drop, no visual JSON Schema editor, no changes to existing CatalogProvisionWizard). The 830-line document reflects scope complexity, not scope sprawl.

Verdict: A strong, comprehensive UI design document that clearly describes catalog item admin management across three resource types with well-defined persona workflows, concrete motivation, and an extremely detailed implementation approach including component architecture, validation schemas, and thorough test plans.

Feedback: The PR includes an unrelated deletion of enhancements/storage-control-plane-osac-2872/prd.md — this should be in a separate PR or explained in the PR description to avoid confusion. Open Questions 1 (scope visibility in public API) and 3 (CEL filter for provisioned resources) are API team dependencies that could block core UX features (scope badges and the Provisioned Resources tab); consider resolving these before or in parallel with implementation. Minor inconsistency: run_strategy enum values differ between VM ('Always'/'Halted') and BareMetalInstance ('ALWAYS'/'HALTED') — verify this matches the proto definitions.

Critical (0)

None.

Important (3)

  1. PR deletes enhancements/storage-control-plane-osac-2872/prd.md which is unrelated to the catalog items UI design. Unrelated file changes should be in a separate PR to keep review scope clean.
  2. Open Question 1 (scope visibility in public API responses) directly affects a core UX feature — scope badges on the list page for Tenant Admins. If the public API cannot expose scope, the design needs revision. This should be resolved before implementation begins.
  3. Open Question 3 (CEL filter for provisioned resources) blocks the detail page's Provisioned Resources tab. Without server-side filtering, the fallback is client-side filtering of all resources, which the document correctly identifies as a performance concern at scale.

Suggestions (3)

  1. Consider adding explicit milestone/release targeting (e.g., v0.2, v0.3) to align with OSAC milestone scoping conventions from osac-dimensions.md.
  2. The run_strategy enum values differ between VM ('Always'/'Halted') and BareMetalInstance ('ALWAYS'/'HALTED') — verify this matches the actual proto enum definitions to avoid payload mismatches.
  3. Consider adding accessibility testing to the test plan — keyboard navigation through wizard steps, screen reader support for scope badges and publish toggles, and focus management on modal open/close.

Review cost

Model: claude-opus-4-6
Cost: $0.5774
Tokens: 6 in / 6.0k out
Cache: 219.9k read
Active time: 2m 5s
API calls: 0

Reverts the directory rename from commit 15533a3 so this branch
only contains catalog-items changes.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Elay Aharoni <elayaha@gmail.com>
@openshift-ci openshift-ci Bot added the lgtm label Jul 22, 2026
@github-actions

Copy link
Copy Markdown

AI EP Review: EP-128

Score: 9/10 | Verdict: PASS

Criterion Score Notes
What 2/2 The document clearly describes admin management screens for catalog items across three resource types with specific user stories for Cloud Provider Admin, Tenant Admin, and Tenant User. Each persona has concrete stories describing what they can do (e.g., create/manage catalog items, see scope badges, have admin screens hidden). Affected services (fulfillment-service API, osac-ui) and personas are explicitly identified. Workflow descriptions trace each user journey step by step.
Why 1/2 The motivation identifies a real gap — the catalog items API exists but admins have no UI to manage items, and osac-ui lacks role-gated navigation entirely. However, the justification is essentially 'we need this because we don't have it.' There's no quantified impact (e.g., how many admins are blocked, time wasted on CLI-only management) or tie to a strategic goal beyond 'usable end-to-end through the UI.' The justification is plausible but generic.
How 2/2 Exceptionally specific and measurable. The design specifies exact component hierarchies, file paths, API hooks, routing patterns, Formik/Yup validation schemas, PatternFly component choices, role-permission matrices, failure handling tables, and serialization formats. Every wizard step, field definition primitive, and edge case (unsupported schemas, delete-blocked items, stale data) is addressed with concrete implementation details.
Task 2/2 This is a genuine product feature enhancement — adding role-gated admin navigation, CRUD wizards for catalog item management, field definition editing, and scope-aware list/detail pages. It introduces new platform capabilities (admin management screens, role-gated routing) that did not previously exist. Not documentation, not a bug fix, not content-only.
Size 2/2 Well-scoped to a single coherent feature: catalog item admin management. The capabilities (role-gated nav, list page, create/edit wizards, detail page) are tightly coupled — you cannot ship create without list, or either without role-gated navigation. Supporting all three resource types (Cluster, VM, Bare Metal) is inherent to the feature, not scope creep, since they share components and the existing API already supports all three.

Verdict: A thorough and well-structured UI design document with clear user outcomes, detailed implementation guidance, and strong testability. The only weakness is a generic business justification that describes the gap without quantifying the impact.

Feedback: Strengthen the Motivation section by quantifying the admin pain: how many catalog item operations are performed today via CLI, what errors or friction does CLI-only management cause, and how does this block broader catalog adoption? Even a sentence like 'CSP Admins currently manage N catalog items via grpcurl, which requires proto expertise and offers no validation feedback' would elevate the WHY from 'gap exists' to 'gap hurts.' The technical design itself is exemplary — the per-kind composition pattern, field definition primitives, and failure handling table are exactly the right level of detail.

Critical (0)

None.

Important (2)

  1. The Motivation section relies on circular reasoning ('no admin interface exists, so we need one') without naming specific user pain, frequency of CLI-based catalog management, or strategic consequences of the gap. Adding concrete evidence would strengthen the business case.
  2. Open Question 1 (scope visibility in public API responses) is unresolved and could require design revision — the Tenant Admin list page's scope badge rendering depends on this. The document acknowledges this but the risk mitigation is vague ('will need revision if it is not').

Suggestions (2)

  1. Consider documenting the expected interaction between this design and the existing CatalogProvisionWizard more explicitly — the Non-Goals section says 'any alignment changes are tracked separately' but doesn't link to where.
  2. The test plan is comprehensive but could benefit from a negative test for the AdminRoute guard when an authenticated user has an unexpected or missing role claim.

Review cost

Model: claude-opus-4-6
Cost: $0.3135
Tokens: 5 in / 2.7k out
Cache: 155.8k read
Active time: 1m 5s
API calls: 0

@ElayAharoni ElayAharoni changed the title Design: Catalog Items — UI Management OSAC-2553: Design: Catalog Items — UI Management Jul 22, 2026
@openshift-ci-robot

openshift-ci-robot commented Jul 22, 2026 •

Copy link
Copy Markdown

@ElayAharoni: This pull request references OSAC-2553 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Design: Catalog Items — UI Management

EP: enhancements/catalog-items

Summary

This design adds admin management screens to osac-ui for catalog items across all three resource types (Cluster, ComputeInstance, BareMetalInstance). It introduces role-gated navigation, a FieldDefinitionsEditor component with structured validation constraints, and role-differentiated pages for Cloud Provider Admins and Tenant Admins. The design uses a single polymorphic component set for all three types via a CatalogItemKindConfig abstraction.

Requesting Review On

  • Open Question 1 — Scope visibility: How does the CSP Admin determine global vs. tenant scope when the public API strips the tenant field? The design assumes scope is derivable from API responses.
  • Open Question 2 — Template parameter enumeration: Do template GET endpoints return structured parameter definitions for the field path picker dropdown, or must admins type dot-notation paths manually?
  • Open Question 3 — Resource filtering by catalog item: Can resource list endpoints be filtered by this.spec.catalog_item == "<id>" for the detail page's "Provisioned Resources" tab?
  • Validation constraint tightening direction: The Tenant Admin restriction flow enforces that validation constraints can only be tightened (min increases, max decreases, enum values only removed). Review whether the proposed enforcement mechanism (input min/max attributes, checkbox-only enum removal) is sufficient.
  • NFR-UI-3 assumption: The design assumes the existing CatalogProvisionWizard already handles catalog item field definitions (pre-set as read-only, editable as form inputs). This needs verification.

How to Review

  • Comment inline on specific sections
  • Approve when the design accurately reflects a viable implementation approach

Summary by CodeRabbit

  • Documentation
  • Added a new design document for administering catalog items across Cluster, ComputeInstance, and BareMetalInstance.
  • Specified role-gated admin navigation with an admin route guard and an Administration → Catalog Management area (list, create, edit, detail) with kebab actions controlled by role/scope.
  • Defined create/edit payload and PATCH update_mask semantics, including publish/unpublish behavior.
  • Documented Field Definitions and Validation Constraints editors (Basic vs Advanced behavior, tighten-only rules) plus E2E/unit/component test expectations.

Instructions 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 openshift-eng/jira-lifecycle-plugin repository.

@rawagner

Copy link
Copy Markdown
Contributor

/approve
/lgtm

@openshift-ci

openshift-ci Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: batzionb, ElayAharoni, rawagner

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-merge-bot
openshift-merge-bot Bot merged commit 3c59d55 into osac-project:main Jul 22, 2026
5 checks passed
tchughesiv added a commit to tchughesiv/enhancement-proposals that referenced this pull request Jul 22, 2026
…sac-project#128)

catalog-items/ui-design.md (merged via osac-project#128 after our earlier passes) still
linked to the pre-rename '/enhancements/cluster-and-vm-provisioning-wizard'
path. Caught by a full-repo sweep (all file types, not just .md) across
every retired directory name from the whole OSAC-2870 effort.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
slintes pushed a commit to slintes/enhancement-proposals that referenced this pull request Jul 27, 2026
…sac-project#128)

catalog-items/ui-design.md (merged via osac-project#128 after our earlier passes) still
linked to the pre-rename '/enhancements/cluster-and-vm-provisioning-wizard'
path. Caught by a full-repo sweep (all file types, not just .md) across
every retired directory name from the whole OSAC-2870 effort.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 2, 2026
…sac-project#128)

catalog-items/ui-design.md (merged via osac-project#128 after our earlier passes) still
linked to the pre-rename '/enhancements/cluster-and-vm-provisioning-wizard'
path. Caught by a full-repo sweep (all file types, not just .md) across
every retired directory name from the whole OSAC-2870 effort.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants